diff --git a/src/hardware/demo/api.c b/src/hardware/demo/api.c index f23cb700..c5259b28 100644 --- a/src/hardware/demo/api.c +++ b/src/hardware/demo/api.c @@ -400,6 +400,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) devc = sdi->priv; devc->sent_samples = 0; + devc->sent_frame_samples = 0; /* * Determine the numbers of logic and analog channels that are diff --git a/src/hardware/demo/protocol.c b/src/hardware/demo/protocol.c index 37417f73..46808fd6 100644 --- a/src/hardware/demo/protocol.c +++ b/src/hardware/demo/protocol.c @@ -460,9 +460,6 @@ SR_PRIV int demo_prepare_data(int fd, int revents, void *cb_data) samples_todo = (todo_us * devc->cur_samplerate + G_USEC_PER_SEC - 1) / G_USEC_PER_SEC; - if (SAMPLES_PER_FRAME > 0) - samples_todo = SAMPLES_PER_FRAME; - if (devc->limit_samples > 0) { if (devc->limit_samples < devc->sent_samples) samples_todo = 0; @@ -470,6 +467,16 @@ SR_PRIV int demo_prepare_data(int fd, int revents, void *cb_data) samples_todo = devc->limit_samples - devc->sent_samples; } + if (samples_todo == 0) + return G_SOURCE_CONTINUE; + +#if (SAMPLES_PER_FRAME > 0) /* Avoid "comparison < 0 always false" warning. */ + /* Never send more samples than a frame can fit... */ + samples_todo = MIN(samples_todo, SAMPLES_PER_FRAME); + /* ...or than we need to finish the current frame. */ + samples_todo = MIN(samples_todo, SAMPLES_PER_FRAME - devc->sent_frame_samples); +#endif + /* Calculate the actual time covered by this run back from the sample * count, rounded towards zero. This avoids getting stuck on a too-low * time delta with no samples being sent due to round-off. @@ -520,8 +527,16 @@ SR_PRIV int demo_prepare_data(int fd, int revents, void *cb_data) return G_SOURCE_REMOVE; } devc->sent_samples += samples_todo; + devc->sent_frame_samples += samples_todo; devc->spent_us += todo_us; +#if (SAMPLES_PER_FRAME > 0) /* Avoid "comparison >= 0 always true" warning. */ + if (devc->sent_frame_samples >= SAMPLES_PER_FRAME) { + std_session_send_frame_end(sdi); + devc->sent_frame_samples = 0; + } +#endif + if ((devc->limit_samples > 0 && devc->sent_samples >= devc->limit_samples) || (limit_us > 0 && devc->spent_us >= limit_us)) { @@ -540,10 +555,10 @@ SR_PRIV int demo_prepare_data(int fd, int revents, void *cb_data) sr_dbg("Requested number of samples reached."); sr_dev_acquisition_stop(sdi); } else { - if (SAMPLES_PER_FRAME > 0) { - std_session_send_frame_end(sdi); +#if (SAMPLES_PER_FRAME > 0) + if (devc->sent_frame_samples == 0) std_session_send_frame_begin(sdi); - } +#endif } return G_SOURCE_CONTINUE; diff --git a/src/hardware/demo/protocol.h b/src/hardware/demo/protocol.h index 53ad043b..f1c66711 100644 --- a/src/hardware/demo/protocol.h +++ b/src/hardware/demo/protocol.h @@ -41,6 +41,7 @@ struct dev_context { uint64_t limit_samples; uint64_t limit_msec; uint64_t sent_samples; + uint64_t sent_frame_samples; /* Number of samples that were sent for current frame. */ int64_t start_us; int64_t spent_us; uint64_t step;