- int num_samples, chunk_samples, s, c, fd, l;
- char buf[CHUNK_SIZE];
+ int total_samples, samplenum;
+ char *s, *d;
+
+ inc = in->priv;
+
+ s = in->buf->str + offset;
+ d = (char *)fdata;
+ memset(fdata, 0, CHUNK_SIZE);
+ 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) {
+ case 1:
+ /* 8-bit PCM samples are unsigned. */
+ fdata[samplenum] = (uint8_t)sample / (float)255;
+ break;
+ case 2:
+ fdata[samplenum] = RL16S(&sample) / (float)INT16_MAX;
+ break;
+ case 4:
+ fdata[samplenum] = RL32S(&sample) / (float)INT32_MAX;
+ break;
+ }
+ } else {
+ /* BINARY32 float */
+#ifdef WORDS_BIGENDIAN
+ int i;
+ for (i = 0; i < inc->unitsize; i++)
+ d[i] = s[inc->unitsize - 1 - i];
+#else
+ memcpy(d, s, inc->unitsize);
+#endif
+ }
+ s += inc->unitsize;
+ d += inc->unitsize;
+ }
+ packet.type = SR_DF_ANALOG;
+ packet.payload = &analog;
+ analog.channels = in->sdi->channels;
+ analog.num_samples = num_samples;
+ analog.mq = 0;
+ analog.mqflags = 0;
+ analog.unit = 0;
+ analog.data = fdata;
+ sr_session_send(in->sdi, &packet);
+}