loopback: Fix sink latency calculation if source is alsa source with fixed latency 68/262768/3 accepted/tizen/unified/20210903.083034 submit/tizen/20210902.050429
authorGeorg Chini <georg@chini.tk>
Mon, 4 Jan 2021 20:08:05 +0000 (21:08 +0100)
committerjungsup lee <jungsup4.lee@samsung.com>
Thu, 19 Aug 2021 09:05:38 +0000 (18:05 +0900)
When an alsa source with fixed latency is used, the actual latency of the source
will only be one fragment size. This is not taken into account when the required
sink latency is calculated.

This patch fixes the issue.

[jungsup4.lee: backport mainline commit 0efae0]

[Version] 13.0-33
[Issue Type] Bug fix

Change-Id: If8b7aa3735c1a2456fa50f55b267180fa2efd1a1
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/451>

packaging/pulseaudio.spec
src/modules/module-loopback.c

index d9bdb34..82e5f76 100644 (file)
@@ -3,7 +3,7 @@
 Name:             pulseaudio
 Summary:          Improved Linux sound server
 Version:          13.0
-Release:          32
+Release:          33
 Group:            Multimedia/Audio
 License:          LGPL-2.1
 URL:              http://pulseaudio.org
index 4d2a7c8..adf150f 100644 (file)
@@ -1063,6 +1063,14 @@ static void set_sink_input_latency(struct userdata *u, pa_sink *sink) {
     if (u->min_source_latency > requested_latency) {
         latency = PA_MAX(u->latency, u->minimum_latency);
         requested_latency = (latency - u->min_source_latency) / 2;
+        /* In the case of a fixed alsa source, u->minimum_latency is calculated from
+         * the default fragment size while u->min_source_latency is the reported minimum
+         * of the source latency (nr_of_fragments * fragment_size). This can lead to a
+         * situation where u->minimum_latency < u->min_source_latency. We only fall
+         * back to use the fragment size instead of min_source_latency if the calculation
+         * above does not deliver a usable result. */
+        if (u->fixed_alsa_source && u->min_source_latency >= latency)
+            requested_latency = (latency - u->core->default_fragment_size_msec * PA_USEC_PER_MSEC) / 2;
     }
 
     latency = PA_CLAMP(requested_latency , u->min_sink_latency, u->max_sink_latency);