X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Finput%2Flogicport.c;fp=src%2Finput%2Flogicport.c;h=011735302f0f4483e6425d2a0d2aafa26d8069a8;hb=4c40d096d4cde1b0538dea216e50846a14f33aaa;hp=e165cb04c21459742b60f4f0bd5d6b285460bbe3;hpb=49d9a095e8611674466d10f4e8cba9078ae2d2c0;p=libsigrok.git diff --git a/src/input/logicport.c b/src/input/logicport.c index e165cb04..01173530 100644 --- a/src/input/logicport.c +++ b/src/input/logicport.c @@ -767,8 +767,8 @@ static int parse_header(struct sr_input *in) 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; @@ -783,6 +783,9 @@ static int create_channels_groups_buffer(struct sr_input *in) 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]; @@ -814,6 +817,16 @@ static int create_channels_groups_buffer(struct sr_input *in) } } + 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; @@ -1004,7 +1017,10 @@ static int prepare_session_feed(struct sr_input *in) * 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; @@ -1149,9 +1165,21 @@ static void cleanup(struct sr_input *in) 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;