demo: Properly handle low samplerates
A "low samplerate" in this case means anything where samples_todo is less than SAMPLES_PER_FRAME. This case wasn't handled properly before, resulting in wrong amounts of data being sent out.
This commit is contained in:
parent
e0b6855bd4
commit
767ca13532
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue