]> sigrok.org Git - libsigrok.git/blobdiff - src/input/binary.c
input: Free instance-private storage at instance free.
[libsigrok.git] / src / input / binary.c
index a8aecb60145bb2cb5d5980e1fc8b1e3b266a535e..e3b2d243f080ee845c37d6cac77bb5db105048ed 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"));
@@ -64,7 +64,7 @@ static int init(struct sr_input *in, GHashTable *options)
        return SR_OK;
 }
 
-static int receive(const struct sr_input *in, GString *buf)
+static int receive(struct sr_input *in, GString *buf)
 {
        struct sr_datafeed_packet packet;
        struct sr_datafeed_meta meta;
@@ -80,16 +80,25 @@ static int receive(const struct sr_input *in, GString *buf)
 
        num_channels = g_slist_length(in->sdi->channels);
 
+       if (!in->sdi_ready) {
+               /* sdi is ready, notify frontend. */
+               in->sdi_ready = TRUE;
+               return SR_OK;
+       }
+
        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);
+               if (inc->samplerate) {
+                       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);
+               }
+
+               inc->started = TRUE;
        }
 
        packet.type = SR_DF_LOGIC;
@@ -113,17 +122,17 @@ static int receive(const struct sr_input *in, GString *buf)
 
 static int cleanup(struct sr_input *in)
 {
-       struct sr_datafeed_packet packet;
        struct context *inc;
+       struct sr_datafeed_packet packet;
 
        inc = in->priv;
+       if (!inc)
+               return SR_OK;
 
        if (inc->started) {
                packet.type = SR_DF_END;
                sr_session_send(in->sdi, &packet);
        }
-       g_free(in->priv);
-       in->priv = NULL;
 
        return SR_OK;
 }