X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Foutput%2Fwav.c;h=212574da5abb8fb45009d85ec29794b0dcbb0328;hb=5faebab2903dc91949edc31f0a4b118d86090a30;hp=fb809500c5e3b7b776c555c9fe7b9b3810cde104;hpb=6ec6c43b4738dbc7091f4a49a4ec80ea6102cb52;p=libsigrok.git diff --git a/src/output/wav.c b/src/output/wav.c index fb809500..212574da 100644 --- a/src/output/wav.c +++ b/src/output/wav.c @@ -236,12 +236,15 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p { struct out_context *outc; const struct sr_datafeed_meta *meta; - const struct sr_datafeed_analog *analog; + const struct sr_datafeed_analog_old *analog_old; + const struct sr_datafeed_analog2 *analog2; const struct sr_config *src; struct sr_channel *ch; GSList *l; + const GSList *channels; float f; - int num_channels, size, *chan_idx, idx, i, j; + int num_channels, num_samples, size, *chan_idx, idx, i, j, ret; + float *data; uint8_t *buf; *out = NULL; @@ -258,41 +261,58 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p outc->samplerate = g_variant_get_uint64(src->data); } break; - case SR_DF_ANALOG: + case SR_DF_ANALOG_OLD: + case SR_DF_ANALOG2: if (!outc->header_done) { *out = gen_header(o); outc->header_done = TRUE; } else *out = g_string_sized_new(512); - analog = packet->payload; - if (analog->num_samples == 0) + analog_old = packet->payload; + analog2 = packet->payload; + + if (packet->type == SR_DF_ANALOG_OLD) { + num_samples = analog_old->num_samples; + channels = analog_old->channels; + num_channels = g_slist_length(analog_old->channels); + data = analog_old->data; + } else { + num_samples = analog2->num_samples; + channels = analog2->meaning->channels; + num_channels = g_slist_length(analog2->meaning->channels); + data = g_malloc(sizeof(float) * num_samples * num_channels); + ret = sr_analog_to_float(analog2, data); + if (ret != SR_OK) + return ret; + } + + if (num_samples == 0) return SR_OK; - num_channels = g_slist_length(analog->channels); if (num_channels > outc->num_channels) { sr_err("Packet has %d channels, but only %d were enabled.", num_channels, outc->num_channels); return SR_ERR; } - if (analog->num_samples > outc->chanbuf_size) { - if (realloc_chanbufs(o, analog->num_samples) != SR_OK) + if (num_samples > outc->chanbuf_size) { + if (realloc_chanbufs(o, analog_old->num_samples) != SR_OK) return SR_ERR_MALLOC; } /* Index the channels in this packet, so we can interleave quicker. */ chan_idx = g_malloc(sizeof(int) * outc->num_channels); for (i = 0; i < num_channels; i++) { - ch = g_slist_nth_data(analog->channels, i); + ch = g_slist_nth_data((GSList *) channels, i); chan_idx[i] = g_slist_index(outc->channels, ch); } - for (i = 0; i < analog->num_samples; i++) { + for (i = 0; i < num_samples; i++) { for (j = 0; j < num_channels; j++) { idx = chan_idx[j]; buf = outc->chanbuf[idx] + outc->chanbuf_used[idx]++ * 4; - f = analog->data[i * num_channels + j]; + f = analog_old->data[i * num_channels + j]; if (outc->scale != 0.0) f /= outc->scale; float_to_le(buf, f);