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;
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.
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)) {
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;