[pulseaudio-discuss] [PATCH 06/13] loopback: Restart the timer right away
Tanu Kaskinen
tanuk at iki.fi
Wed Nov 18 06:10:29 PST 2015
On Wed, 2015-02-25 at 19:43 +0100, Georg Chini wrote:
> Move the timer restart to the beginning of the callback function.
Please try to remember to always answer the question "why" in commit
messages.
> ---
> src/modules/module-loopback.c | 14 ++++++++------
> 1 file changed, 8 insertions(+), 6 deletions(-)
>
> diff --git a/src/modules/module-loopback.c b/src/modules/module-loopback.c
> index f9255ee..79bd106 100644
> --- a/src/modules/module-loopback.c
> +++ b/src/modules/module-loopback.c
> @@ -196,9 +196,6 @@ static void adjust_rates(struct userdata *u) {
> pa_assert(u);
> pa_assert_ctl_context();
>
> - pa_asyncmsgq_send(u->sink_input->sink->asyncmsgq, PA_MSGOBJECT(u->sink_input), SINK_INPUT_MESSAGE_LATENCY_SNAPSHOT, NULL, 0, NULL);
> - pa_asyncmsgq_send(u->source_output->source->asyncmsgq, PA_MSGOBJECT(u->source_output), SOURCE_OUTPUT_MESSAGE_LATENCY_SNAPSHOT, NULL, 0, NULL);
> -
> /* Rates and latencies*/
> old_rate = u->sink_input->sample_spec.rate;
> base_rate = u->source_output->sample_spec.rate;
> @@ -236,8 +233,6 @@ static void adjust_rates(struct userdata *u) {
> /* Set rate */
> pa_sink_input_set_rate(u->sink_input, new_rate);
> pa_log_debug("[%s] Updated sampling rate to %lu Hz.", u->sink_input->sink->name, (unsigned long) new_rate);
> -
> - pa_core_rttime_restart(u->core, u->time_event, pa_rtclock_now() + u->adjust_time);
> }
>
> /* Called from main context */
> @@ -248,6 +243,13 @@ static void time_callback(pa_mainloop_api *a, pa_time_event *e, const struct tim
> pa_assert(a);
> pa_assert(u->time_event == e);
>
> + /* Restart timer right away */
> + pa_core_rttime_restart(u->core, u->time_event, pa_rtclock_now() + u->adjust_time);
If the goal of this change is to make the wakeups happen exactly with
adjust_time intervals instead of adjust_time + time taken in servicing
the timer interrupt, wouldn't it be better to have a counter of the
timer events and use start_time + counter * adjust_time as the time
value here? That way the average interval should become exactly
adjust_time.
> +
> + /* Get sink and source latency snapshot */
> + pa_asyncmsgq_send(u->sink_input->sink->asyncmsgq, PA_MSGOBJECT(u->sink_input), SINK_INPUT_MESSAGE_LATENCY_SNAPSHOT, NULL, 0, NULL);
> + pa_asyncmsgq_send(u->source_output->source->asyncmsgq, PA_MSGOBJECT(u->source_output), SOURCE_OUTPUT_MESSAGE_LATENCY_SNAPSHOT, NULL, 0, NULL);
> +
> adjust_rates(u);
> }
>
> @@ -257,7 +259,7 @@ static void enable_adjust_timer(struct userdata *u, bool enable) {
> if (u->time_event || u->adjust_time <= 0)
> return;
>
> - u->time_event = pa_core_rttime_new(u->module->core, pa_rtclock_now() + u->adjust_time, time_callback, u);
> + u->time_event = pa_core_rttime_new(u->module->core, pa_rtclock_now() + 333 * PA_USEC_PER_MSEC, time_callback, u);
What is this about?
--
Tanu
More information about the pulseaudio-discuss
mailing list