]> sigrok.org Git - libsigrok.git/blobdiff - src/input/wav.c
Build: Set local include directories in Makefile.am
[libsigrok.git] / src / input / wav.c
index 1c0d4fd18082da643d6b2b0d083e277f1d7ff597..f2d5db0dfcc21075293c3d9350573aff820410e8 100644 (file)
@@ -24,7 +24,7 @@
 #include <ctype.h>
 #include <string.h>
 #include <stdint.h>
-#include "libsigrok.h"
+#include <libsigrok/libsigrok.h>
 #include "libsigrok-internal.h"
 
 #define LOG_PREFIX "input/wav"
@@ -38,9 +38,9 @@
 /* Expect to find the "data" chunk within this offset from the start. */
 #define MAX_DATA_CHUNK_OFFSET    256
 
-#define WAVE_FORMAT_PCM          0x0001
-#define WAVE_FORMAT_IEEE_FLOAT   0x0003
-#define WAVE_FORMAT_EXTENSIBLE   0xfffe
+#define WAVE_FORMAT_PCM_         0x0001
+#define WAVE_FORMAT_IEEE_FLOAT_  0x0003
+#define WAVE_FORMAT_EXTENSIBLE_  0xfffe
 
 struct context {
        gboolean started;
@@ -73,14 +73,13 @@ static int parse_wav_header(GString *buf, struct context *inc)
                return SR_ERR_DATA;
        }
 
-
-       if (fmt_code == WAVE_FORMAT_PCM) {
-       } else if (fmt_code == WAVE_FORMAT_IEEE_FLOAT) {
+       if (fmt_code == WAVE_FORMAT_PCM_) {
+       } else if (fmt_code == WAVE_FORMAT_IEEE_FLOAT_) {
                if (unitsize != 4) {
                        sr_err("only 32-bit floats supported.");
                        return SR_ERR_DATA;
                }
-       } else if (fmt_code == WAVE_FORMAT_EXTENSIBLE) {
+       } else if (fmt_code == WAVE_FORMAT_EXTENSIBLE_) {
                if (buf->len < 70)
                        /* Not enough for extensible header and next chunk. */
                        return SR_ERR_NA;
@@ -99,11 +98,11 @@ static int parse_wav_header(GString *buf, struct context *inc)
                }
                /* Real format code is the first two bytes of the GUID. */
                fmt_code = RL16(buf->str + 44);
-               if (fmt_code != WAVE_FORMAT_PCM && fmt_code != WAVE_FORMAT_IEEE_FLOAT) {
+               if (fmt_code != WAVE_FORMAT_PCM_ && fmt_code != WAVE_FORMAT_IEEE_FLOAT_) {
                        sr_err("Only PCM and floating point samples are supported.");
                        return SR_ERR_DATA;
                }
-               if (fmt_code == WAVE_FORMAT_IEEE_FLOAT && unitsize != 4) {
+               if (fmt_code == WAVE_FORMAT_IEEE_FLOAT_ && unitsize != 4) {
                        sr_err("only 32-bit floats supported.");
                        return SR_ERR_DATA;
                }
@@ -150,7 +149,7 @@ static int init(struct sr_input *in, GHashTable *options)
 {
        (void)options;
 
-       in->sdi = sr_dev_inst_new(SR_ST_ACTIVE, NULL, NULL, NULL);
+       in->sdi = g_malloc0(sizeof(struct sr_dev_inst));
        in->priv = g_malloc0(sizeof(struct context));
 
        return SR_OK;
@@ -161,13 +160,12 @@ static int find_data_chunk(GString *buf, int initial_offset)
        unsigned int offset, i;
 
        offset = initial_offset;
-       while(offset < MIN(MAX_DATA_CHUNK_OFFSET, buf->len)) {
+       while (offset < MIN(MAX_DATA_CHUNK_OFFSET, buf->len)) {
                if (!memcmp(buf->str + offset, "data", 4))
                        /* Skip into the samples. */
                        return offset + 8;
                for (i = 0; i < 4; i++) {
-                       if (!isalpha(buf->str[offset + i])
-                                       && !isascii(buf->str[offset + i])
+                       if (!isalnum(buf->str[offset + i])
                                        && !isblank(buf->str[offset + i]))
                                /* Doesn't look like a chunk ID. */
                                return -1;
@@ -196,7 +194,7 @@ static void send_chunk(const struct sr_input *in, int offset, int num_samples)
        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) {
+               if (inc->fmt_code == WAVE_FORMAT_PCM_) {
                        sample = 0;
                        memcpy(&sample, s, inc->unitsize);
                        switch (inc->samplesize) {
@@ -240,7 +238,6 @@ static int process_buffer(struct sr_input *in)
        struct context *inc;
        struct sr_datafeed_packet packet;
        struct sr_datafeed_meta meta;
-       struct sr_channel *ch;
        struct sr_config *src;
        int offset, chunk_samples, total_samples, processed, max_chunk_samples;
        int num_samples, i;
@@ -250,8 +247,7 @@ static int process_buffer(struct sr_input *in)
        if (!inc->started) {
                for (i = 0; i < inc->num_channels; i++) {
                        snprintf(channelname, 8, "CH%d", i + 1);
-                       ch = sr_channel_new(i, SR_CHANNEL_ANALOG, TRUE, channelname);
-                       in->sdi->channels = g_slist_append(in->sdi->channels, ch);
+                       sr_channel_new(in->sdi, i, SR_CHANNEL_ANALOG, TRUE, channelname);
                }
 
                std_session_send_df_header(in->sdi, LOG_PREFIX);
@@ -365,10 +361,10 @@ SR_PRIV struct sr_input_module input_wav = {
        .id = "wav",
        .name = "WAV",
        .desc = "WAV file",
+       .exts = (const char*[]){"wav", NULL},
        .metadata = { SR_INPUT_META_HEADER | SR_INPUT_META_REQUIRED },
        .format_match = format_match,
        .init = init,
        .receive = receive,
        .end = end,
 };
-