]> sigrok.org Git - libsigrok.git/blobdiff - src/input/binary.c
Removal of sdi->index, step 3: sr_dev_inst_new() calls for input mods
[libsigrok.git] / src / input / binary.c
index 859d253cdb46458aef5915e9572918fd4bb4ceb5..9ad988e38f55e5fc3147cb13fad58ebbd13bcd2b 100644 (file)
@@ -50,7 +50,7 @@ static int init(struct sr_input *in, GHashTable *options)
                return SR_ERR_ARG;
        }
 
-       in->sdi = sr_dev_inst_new(0, SR_ST_ACTIVE, NULL, NULL, NULL);
+       in->sdi = sr_dev_inst_new(SR_ST_ACTIVE, NULL, NULL, NULL);
        in->priv = inc = g_malloc0(sizeof(struct context));
 
        inc->samplerate = g_variant_get_uint64(g_hash_table_lookup(options, "samplerate"));
@@ -80,33 +80,33 @@ static int receive(const struct sr_input *in, GString *buf)
 
        num_channels = g_slist_length(in->sdi->channels);
 
-       std_session_send_df_header(in->sdi, LOG_PREFIX);
-       inc->started = TRUE;
+       if (!inc->started) {
+               std_session_send_df_header(in->sdi, LOG_PREFIX);
+               inc->started = TRUE;
 
-       packet.type = SR_DF_META;
-       packet.payload = &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);
-       sr_config_free(src);
+               packet.type = SR_DF_META;
+               packet.payload = &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);
+               sr_config_free(src);
+       }
 
        packet.type = SR_DF_LOGIC;
        packet.payload = &logic;
        logic.unitsize = (num_channels + 7) / 8;
-       logic.data = in->buf->str;
 
        /* Cut off at multiple of unitsize. */
        chunk_size = in->buf->len / logic.unitsize * logic.unitsize;
 
        chunk = 0;
        for (i = 0; i < chunk_size; i += chunk) {
-               chunk = MAX(MAX_CHUNK_SIZE, chunk_size - i);
+               logic.data = in->buf->str + i;
+               chunk = MIN(MAX_CHUNK_SIZE, chunk_size - i);
                logic.length = chunk;
                sr_session_send(in->sdi, &packet);
        }
-
-       if (in->buf->len > chunk_size)
-               g_string_erase(in->buf, 0, in->buf->len - chunk_size);
+       g_string_erase(in->buf, 0, chunk_size);
 
        return SR_OK;
 }