* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <config.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#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;
}
static void send_chunk(const struct sr_input *in, int offset, int num_samples)
{
struct sr_datafeed_packet packet;
- struct sr_datafeed_analog analog;
+ 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 {
s += inc->unitsize;
d += inc->unitsize;
}
- packet.type = SR_DF_ANALOG;
+ packet.type = SR_DF_ANALOG_OLD;
packet.payload = &analog;
analog.channels = in->sdi->channels;
analog.num_samples = num_samples;
struct sr_config *src;
int offset, chunk_samples, total_samples, processed, max_chunk_samples;
int num_samples, i;
- char channelname[8];
inc = in->priv;
if (!inc->started) {
- for (i = 0; i < inc->num_channels; i++) {
- snprintf(channelname, 8, "CH%d", i + 1);
- sr_channel_new(in->sdi, i, SR_CHANNEL_ANALOG, TRUE, channelname);
- }
-
std_session_send_df_header(in->sdi, LOG_PREFIX);
packet.type = SR_DF_META;
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;
}
{
struct context *inc;
int ret;
+ char channelname[8];
g_string_append_len(in->buf, buf->str, buf->len);
else if (ret != SR_OK)
return ret;
+ for (int i = 0; i < inc->num_channels; i++) {
+ snprintf(channelname, 8, "CH%d", i + 1);
+ sr_channel_new(in->sdi, i, SR_CHANNEL_ANALOG, TRUE, channelname);
+ }
+
/* sdi is ready, notify frontend. */
in->sdi_ready = TRUE;
return SR_OK;