int unitsize;
gboolean found_data;
gboolean create_channels;
+ GSList *prev_sr_channels;
};
static int parse_wav_header(GString *buf, struct context *inc)
return SR_OK;
}
+/*
+ * Check the channel list for consistency across file re-import. See
+ * the VCD input module for more details and motivation.
+ */
+
+static void keep_header_for_reread(const struct sr_input *in)
+{
+ struct context *inc;
+
+ inc = in->priv;
+ g_slist_free_full(inc->prev_sr_channels, sr_channel_free_cb);
+ inc->prev_sr_channels = in->sdi->channels;
+ in->sdi->channels = NULL;
+}
+
+static int check_header_in_reread(const struct sr_input *in)
+{
+ struct context *inc;
+
+ if (!in)
+ return FALSE;
+ inc = in->priv;
+ if (!inc)
+ return FALSE;
+ if (!inc->prev_sr_channels)
+ return TRUE;
+
+ if (sr_channel_lists_differ(inc->prev_sr_channels, in->sdi->channels)) {
+ sr_err("Channel list change not supported for file re-read.");
+ return FALSE;
+ }
+ g_slist_free_full(in->sdi->channels, sr_channel_free_cb);
+ in->sdi->channels = inc->prev_sr_channels;
+ inc->prev_sr_channels = NULL;
+
+ return TRUE;
+}
+
static int receive(struct sr_input *in, GString *buf)
{
struct context *inc;
snprintf(channelname, sizeof(channelname), "CH%d", i + 1);
sr_channel_new(in->sdi, i, SR_CHANNEL_ANALOG, TRUE, channelname);
}
+ if (!check_header_in_reread(in))
+ return SR_ERR_DATA;
}
-
inc->create_channels = FALSE;
/* sdi is ready, notify frontend. */
static int reset(struct sr_input *in)
{
- memset(in->priv, 0, sizeof(struct context));
+ struct context *inc;
+
+ inc = in->priv;
+ memset(inc, 0, sizeof(*inc));
/*
- * We only want to create the sigrok channels once, so
- * inc->create_channels won't be set to TRUE this time around.
+ * Create, and re-create channels for every iteration of file
+ * import. Other logic will enforce a consistent set of channels
+ * across re-import, or an appropriate error message when file
+ * properties should change.
*/
+ keep_header_for_reread(in);
+ inc->create_channels = TRUE;
g_string_truncate(in->buf, 0);