#define MIN_DATA_CHUNK_OFFSET 45
/* Expect to find the "data" chunk within this offset from the start. */
-#define MAX_DATA_CHUNK_OFFSET 256
+#define MAX_DATA_CHUNK_OFFSET 1024
#define WAVE_FORMAT_PCM_ 0x0001
#define WAVE_FORMAT_IEEE_FLOAT_ 0x0003
offset += 8 + RL32(buf->str + offset + 4);
}
+ if (offset > MAX_DATA_CHUNK_OFFSET)
+ return -1;
+
return offset;
}
struct sr_datafeed_analog_old analog;
struct context *inc;
float fdata[CHUNK_SIZE];
- uint64_t sample;
int total_samples, samplenum;
char *s, *d;
total_samples = num_samples * inc->num_channels;
for (samplenum = 0; samplenum < total_samples; samplenum++) {
if (inc->fmt_code == WAVE_FORMAT_PCM_) {
- sample = 0;
- memcpy(&sample, s, inc->unitsize);
- switch (inc->samplesize) {
+ switch (inc->unitsize) {
case 1:
/* 8-bit PCM samples are unsigned. */
- fdata[samplenum] = (uint8_t)sample / (float)255;
+ fdata[samplenum] = *(uint8_t*)(s) / (float)255;
break;
case 2:
- fdata[samplenum] = RL16S(&sample) / (float)INT16_MAX;
+ fdata[samplenum] = RL16S(s) / (float)INT16_MAX;
break;
case 4:
- fdata[samplenum] = RL32S(&sample) / (float)INT32_MAX;
+ fdata[samplenum] = RL32S(s) / (float)INT32_MAX;
break;
}
} else {
src = sr_config_new(SR_CONF_SAMPLERATE, g_variant_new_uint64(inc->samplerate));
meta.config = g_slist_append(NULL, src);
sr_session_send(in->sdi, &packet);
+ g_slist_free(meta.config);
sr_config_free(src);
inc->started = TRUE;
offset = 0;
/* Round off up to the last channels * unitsize boundary. */
- chunk_samples = (in->buf->len - offset) / inc->num_channels / inc->unitsize;
- max_chunk_samples = CHUNK_SIZE / inc->num_channels / inc->unitsize;
+ chunk_samples = (in->buf->len - offset) / inc->samplesize;
+ max_chunk_samples = CHUNK_SIZE / inc->samplesize;
processed = 0;
total_samples = chunk_samples;
while (processed < total_samples) {
else
num_samples = chunk_samples;
send_chunk(in, offset, num_samples);
- offset += num_samples * inc->unitsize;
+ offset += num_samples * inc->samplesize;
chunk_samples -= num_samples;
processed += num_samples;
}