diff options
author | Georg Chini <georg@chini.tk> | 2022-05-26 20:24:08 +0200 |
---|---|---|
committer | PulseAudio Marge Bot <pulseaudio-maintainers@lists.freedesktop.org> | 2022-05-28 14:30:59 +0000 |
commit | 2af10cf39b1a12fb000672462ddaaf37f7d6e25e (patch) | |
tree | 6fa7aa23dba3a483231598869a223fe624aec232 | |
parent | 32710207474448294d029c3cad503edbbd7ec80a (diff) | |
download | pulseaudio-2af10cf39b1a12fb000672462ddaaf37f7d6e25e.tar.gz |
various places: Include resampler delay to latency reports and calculations
The resampler delay was not taken into account in all necessary places.
This patch adds it where required.
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/708>
-rw-r--r-- | src/modules/echo-cancel/module-echo-cancel.c | 9 | ||||
-rw-r--r-- | src/modules/module-combine-sink.c | 2 | ||||
-rw-r--r-- | src/modules/module-equalizer-sink.c | 3 | ||||
-rw-r--r-- | src/modules/module-ladspa-sink.c | 3 | ||||
-rw-r--r-- | src/modules/module-remap-sink.c | 3 | ||||
-rw-r--r-- | src/modules/module-virtual-sink.c | 3 | ||||
-rw-r--r-- | src/modules/module-virtual-surround-sink.c | 3 | ||||
-rw-r--r-- | src/modules/rtp/module-rtp-recv.c | 1 | ||||
-rw-r--r-- | src/pulsecore/protocol-native.c | 4 |
9 files changed, 31 insertions, 0 deletions
diff --git a/src/modules/echo-cancel/module-echo-cancel.c b/src/modules/echo-cancel/module-echo-cancel.c index 20fe46481..3d63ea608 100644 --- a/src/modules/echo-cancel/module-echo-cancel.c +++ b/src/modules/echo-cancel/module-echo-cancel.c @@ -460,6 +460,9 @@ static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t of /* Add the latency internal to our sink input on top */ pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->sink_input->sink->sample_spec); + /* Add resampler delay */ + *((int64_t*) data) += pa_resampler_get_delay_usec(u->sink_input->thread_info.resampler); + return 0; } @@ -1053,6 +1056,9 @@ static void source_output_snapshot_within_thread(struct userdata *u, struct snap now = pa_rtclock_now(); latency = pa_source_get_latency_within_thread(u->source_output->source, false); + /* Add resampler delay */ + latency += pa_resampler_get_delay_usec(u->source_output->thread_info.resampler); + delay = pa_memblockq_get_length(u->source_output->thread_info.delay_memblockq); delay = (u->source_output->thread_info.resampler ? pa_resampler_request(u->source_output->thread_info.resampler, delay) : delay); @@ -1132,6 +1138,9 @@ static int sink_input_process_msg_cb(pa_msgobject *obj, int code, void *data, in now = pa_rtclock_now(); latency = pa_sink_get_latency_within_thread(u->sink_input->sink, false); + /* Add resampler delay */ + latency += pa_resampler_get_delay_usec(u->sink_input->thread_info.resampler); + delay = pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq); delay = (u->sink_input->thread_info.resampler ? pa_resampler_request(u->sink_input->thread_info.resampler, delay) : delay); diff --git a/src/modules/module-combine-sink.c b/src/modules/module-combine-sink.c index 61689dac2..7289aca73 100644 --- a/src/modules/module-combine-sink.c +++ b/src/modules/module-combine-sink.c @@ -771,6 +771,8 @@ static int sink_input_process_msg(pa_msgobject *obj, int code, void *data, int64 /* Add content of memblockq's to sink latency */ o->latency_snapshot.sink_latency = pa_sink_get_latency_within_thread(o->sink, true) + pa_bytes_to_usec(length, &o->sink->sample_spec); + /* Add resampler latency */ + o->latency_snapshot.sink_latency += pa_resampler_get_delay_usec(o->sink_input->thread_info.resampler); o->latency_snapshot.timestamp = pa_rtclock_now(); diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c index f8a9e9514..fdec9d54b 100644 --- a/src/modules/module-equalizer-sink.c +++ b/src/modules/module-equalizer-sink.c @@ -265,6 +265,9 @@ static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t of pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->sink_input->sink->sample_spec); // pa_bytes_to_usec(u->samples_gathered * fs, &u->sink->sample_spec); //+ pa_bytes_to_usec(u->latency * fs, ss) + + /* Add resampler latency */ + *((int64_t*) data) += pa_resampler_get_delay_usec(u->sink_input->thread_info.resampler); return 0; } } diff --git a/src/modules/module-ladspa-sink.c b/src/modules/module-ladspa-sink.c index 5726d0818..b68300d31 100644 --- a/src/modules/module-ladspa-sink.c +++ b/src/modules/module-ladspa-sink.c @@ -361,6 +361,9 @@ static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t of /* Add the latency internal to our sink input on top */ pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->sink_input->sink->sample_spec); + /* Add resampler latency */ + *((int64_t*) data) += pa_resampler_get_delay_usec(u->sink_input->thread_info.resampler); + return 0; case LADSPA_SINK_MESSAGE_UPDATE_PARAMETERS: diff --git a/src/modules/module-remap-sink.c b/src/modules/module-remap-sink.c index 1f7997c17..4ff6cd57a 100644 --- a/src/modules/module-remap-sink.c +++ b/src/modules/module-remap-sink.c @@ -93,6 +93,9 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse /* Add the latency internal to our sink input on top */ pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->sink_input->sink->sample_spec); + /* Add resampler latency */ + *((int64_t*) data) += pa_resampler_get_delay_usec(u->sink_input->thread_info.resampler); + return 0; } diff --git a/src/modules/module-virtual-sink.c b/src/modules/module-virtual-sink.c index bc109d54c..5001ce45d 100644 --- a/src/modules/module-virtual-sink.c +++ b/src/modules/module-virtual-sink.c @@ -105,6 +105,9 @@ static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t of /* Add the latency internal to our sink input on top */ pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->sink_input->sink->sample_spec); + /* Add resampler latency */ + *((int64_t*) data) += pa_resampler_get_delay_usec(u->sink_input->thread_info.resampler); + return 0; } diff --git a/src/modules/module-virtual-surround-sink.c b/src/modules/module-virtual-surround-sink.c index 0506370e8..395146c02 100644 --- a/src/modules/module-virtual-surround-sink.c +++ b/src/modules/module-virtual-surround-sink.c @@ -280,6 +280,9 @@ static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t of /* Add the latency internal to our sink input on top */ pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->sink_input->sink->sample_spec); + /* Add resampler latency */ + *((int64_t*) data) += pa_resampler_get_delay_usec(u->sink_input->thread_info.resampler); + return 0; } diff --git a/src/modules/rtp/module-rtp-recv.c b/src/modules/rtp/module-rtp-recv.c index 6f06ada33..a67a993d1 100644 --- a/src/modules/rtp/module-rtp-recv.c +++ b/src/modules/rtp/module-rtp-recv.c @@ -285,6 +285,7 @@ static int rtpoll_work_cb(pa_rtpoll_item *i) { pa_log_debug("wi=%lu ri=%lu", (unsigned long) wi, (unsigned long) ri); sink_delay = pa_sink_get_latency_within_thread(s->sink_input->sink, false); + sink_delay += pa_resampler_get_delay_usec(s->sink_input->thread_info.resampler); render_delay = pa_bytes_to_usec(pa_memblockq_get_length(s->sink_input->thread_info.render_memblockq), &s->sink_input->sink->sample_spec); if (ri > render_delay+sink_delay) diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c index b1c898f85..672182fbc 100644 --- a/src/pulsecore/protocol-native.c +++ b/src/pulsecore/protocol-native.c @@ -1422,6 +1422,8 @@ static int sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int s->write_index = pa_memblockq_get_write_index(s->memblockq); s->render_memblockq_length = pa_memblockq_get_length(s->sink_input->thread_info.render_memblockq); s->current_sink_latency = pa_sink_get_latency_within_thread(s->sink_input->sink, false); + /* Add resampler latency */ + s->current_sink_latency += pa_resampler_get_delay_usec(i->thread_info.resampler); s->underrun_for = s->sink_input->thread_info.underrun_for; s->playing_for = s->sink_input->thread_info.playing_for; @@ -1700,6 +1702,8 @@ static int source_output_process_msg(pa_msgobject *_o, int code, void *userdata, /* Atomically get a snapshot of all timing parameters... */ s->current_monitor_latency = o->source->monitor_of ? pa_sink_get_latency_within_thread(o->source->monitor_of, false) : 0; s->current_source_latency = pa_source_get_latency_within_thread(o->source, false); + /* Add resampler latency */ + s->current_source_latency += pa_resampler_get_delay_usec(o->thread_info.resampler); s->on_the_fly_snapshot = pa_atomic_load(&s->on_the_fly); return 0; } |