output/wav: Support SR_DF_ANALOG2.
This commit is contained in:
parent
0662a7d083
commit
b73cac758e
|
@ -237,11 +237,14 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p
|
||||||
struct out_context *outc;
|
struct out_context *outc;
|
||||||
const struct sr_datafeed_meta *meta;
|
const struct sr_datafeed_meta *meta;
|
||||||
const struct sr_datafeed_analog *analog;
|
const struct sr_datafeed_analog *analog;
|
||||||
|
const struct sr_datafeed_analog2 *analog2;
|
||||||
const struct sr_config *src;
|
const struct sr_config *src;
|
||||||
struct sr_channel *ch;
|
struct sr_channel *ch;
|
||||||
GSList *l;
|
GSList *l;
|
||||||
|
const GSList *channels;
|
||||||
float f;
|
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;
|
uint8_t *buf;
|
||||||
|
|
||||||
*out = NULL;
|
*out = NULL;
|
||||||
|
@ -259,6 +262,7 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SR_DF_ANALOG:
|
case SR_DF_ANALOG:
|
||||||
|
case SR_DF_ANALOG2:
|
||||||
if (!outc->header_done) {
|
if (!outc->header_done) {
|
||||||
*out = gen_header(o);
|
*out = gen_header(o);
|
||||||
outc->header_done = TRUE;
|
outc->header_done = TRUE;
|
||||||
|
@ -266,17 +270,33 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p
|
||||||
*out = g_string_sized_new(512);
|
*out = g_string_sized_new(512);
|
||||||
|
|
||||||
analog = packet->payload;
|
analog = packet->payload;
|
||||||
if (analog->num_samples == 0)
|
analog2 = packet->payload;
|
||||||
|
|
||||||
|
if (packet->type == SR_DF_ANALOG) {
|
||||||
|
num_samples = analog->num_samples;
|
||||||
|
channels = analog->channels;
|
||||||
|
num_channels = g_slist_length(analog->channels);
|
||||||
|
data = analog->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;
|
return SR_OK;
|
||||||
|
|
||||||
num_channels = g_slist_length(analog->channels);
|
|
||||||
if (num_channels > outc->num_channels) {
|
if (num_channels > outc->num_channels) {
|
||||||
sr_err("Packet has %d channels, but only %d were enabled.",
|
sr_err("Packet has %d channels, but only %d were enabled.",
|
||||||
num_channels, outc->num_channels);
|
num_channels, outc->num_channels);
|
||||||
return SR_ERR;
|
return SR_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (analog->num_samples > outc->chanbuf_size) {
|
if (num_samples > outc->chanbuf_size) {
|
||||||
if (realloc_chanbufs(o, analog->num_samples) != SR_OK)
|
if (realloc_chanbufs(o, analog->num_samples) != SR_OK)
|
||||||
return SR_ERR_MALLOC;
|
return SR_ERR_MALLOC;
|
||||||
}
|
}
|
||||||
|
@ -284,11 +304,11 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p
|
||||||
/* Index the channels in this packet, so we can interleave quicker. */
|
/* Index the channels in this packet, so we can interleave quicker. */
|
||||||
chan_idx = g_malloc(sizeof(int) * outc->num_channels);
|
chan_idx = g_malloc(sizeof(int) * outc->num_channels);
|
||||||
for (i = 0; i < num_channels; i++) {
|
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);
|
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++) {
|
for (j = 0; j < num_channels; j++) {
|
||||||
idx = chan_idx[j];
|
idx = chan_idx[j];
|
||||||
buf = outc->chanbuf[idx] + outc->chanbuf_used[idx]++ * 4;
|
buf = outc->chanbuf[idx] + outc->chanbuf_used[idx]++ * 4;
|
||||||
|
|
Loading…
Reference in New Issue