return SR_OK;
}
-/* Create sigrok channels and groups. Allocate the session feed buffer. */
-static int create_channels_groups_buffer(struct sr_input *in)
+/* Create sigrok channels and groups. */
+static int create_channels_groups(struct sr_input *in)
{
struct context *inc;
uint64_t mask;
inc = in->priv;
+ if (inc->channels)
+ return SR_OK;
+
mask = UINT64_C(1);
for (idx = 0; idx < inc->channel_count; idx++, mask <<= 1) {
name = inc->signal_names[idx];
}
}
+ return SR_OK;
+}
+
+/* Allocate the session feed buffer. */
+static int create_feed_buffer(struct sr_input *in)
+{
+ struct context *inc;
+
+ inc = in->priv;
+
inc->unitsize = (inc->channel_count + 7) / 8;
inc->samples_per_chunk = CHUNK_SIZE / inc->unitsize;
inc->samples_in_buffer = 0;
* header to the session. Optionally send the sample
* rate before sample data will be sent.
*/
- rc = create_channels_groups_buffer(in);
+ rc = create_channels_groups(in);
+ if (rc)
+ return rc;
+ rc = create_feed_buffer(in);
if (rc)
return rc;
static int reset(struct sr_input *in)
{
struct context *inc;
+ GSList *channels;
inc = in->priv;
+
+ /*
+ * The input module's .reset() routine clears the 'inc' context,
+ * but 'in' is kept which contains channel groups which reference
+ * channels. Since we cannot re-create the channels (applications
+ * don't expect us to, see bug #1215), make sure to keep the
+ * channels across the reset operation.
+ */
+ channels = inc->channels;
+ inc->channels = NULL;
cleanup(in);
+ inc->channels = channels;
inc->ch_feed_prep = FALSE;
inc->header_sent = FALSE;
inc->rate_sent = FALSE;