PulseAudio Marge Bot pushed to branch master at PulseAudio / pulseaudio


Commits:
90ccfc16 by Igor V. Kovalenko at 2021-11-03T15:59:22+00:00
null-sink: Recalculate max_request and max_rewind while resuming sink

When sink is suspended for reconfiguration changing sample spec, upon resume
internal thread_info max_request and max_rewind are out of date and possibly
not aligned to frame size anymore.

Recalculate thread max_request and max_rewind before resuming sink.

Part-of: 
<https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/658>

- - - - -


1 changed file:

- src/modules/module-null-sink.c


Changes:

=====================================
src/modules/module-null-sink.c
=====================================
@@ -112,6 +112,25 @@ static int sink_process_msg(
     return pa_sink_process_msg(o, code, data, offset, chunk);
 }
 
+/* Called from the IO thread. */
+static void sink_recalculate_max_request_and_rewind(pa_sink *s) {
+    struct userdata *u;
+    size_t nbytes;
+
+    pa_sink_assert_ref(s);
+    pa_assert_se(u = s->userdata);
+
+    nbytes = pa_usec_to_bytes(u->block_usec, &s->sample_spec);
+
+    if (u->norewinds) {
+        pa_sink_set_max_rewind_within_thread(s, 0);
+    } else {
+        pa_sink_set_max_rewind_within_thread(s, nbytes);
+    }
+
+    pa_sink_set_max_request_within_thread(s, nbytes);
+}
+
 /* Called from the IO thread. */
 static int sink_set_state_in_io_thread_cb(pa_sink *s, pa_sink_state_t 
new_state, pa_suspend_cause_t new_suspend_cause) {
     struct userdata *u;
@@ -120,16 +139,23 @@ static int sink_set_state_in_io_thread_cb(pa_sink *s, 
pa_sink_state_t new_state,
     pa_assert_se(u = s->userdata);
 
     if (s->thread_info.state == PA_SINK_SUSPENDED || s->thread_info.state == 
PA_SINK_INIT) {
-        if (PA_SINK_IS_OPENED(new_state))
+        if (PA_SINK_IS_OPENED(new_state)) {
             u->timestamp = pa_rtclock_now();
+
+            /* If sink was suspended to change sample formats, both
+             * thread_info.max_request and thread_info.max_rewind
+             * must be updated before first block is rendered
+             */
+            sink_recalculate_max_request_and_rewind(s);
+        }
     }
 
     return 0;
 }
 
+/* Called from the IO thread. */
 static void sink_update_requested_latency_cb(pa_sink *s) {
     struct userdata *u;
-    size_t nbytes;
 
     pa_sink_assert_ref(s);
     pa_assert_se(u = s->userdata);
@@ -139,15 +165,7 @@ static void sink_update_requested_latency_cb(pa_sink *s) {
     if (u->block_usec == (pa_usec_t) -1)
         u->block_usec = s->thread_info.max_latency;
 
-    nbytes = pa_usec_to_bytes(u->block_usec, &s->sample_spec);
-
-    if(u->norewinds){
-        pa_sink_set_max_rewind_within_thread(s, 0);
-    } else {
-        pa_sink_set_max_rewind_within_thread(s, nbytes);
-    }
-
-    pa_sink_set_max_request_within_thread(s, nbytes);
+    sink_recalculate_max_request_and_rewind(s);
 }
 
 static void sink_reconfigure_cb(pa_sink *s, pa_sample_spec *spec, bool 
passthrough) {



View it on GitLab: 
https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/commit/90ccfc1688cdf0b80c168702c43340581674ae54

-- 
View it on GitLab: 
https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/commit/90ccfc1688cdf0b80c168702c43340581674ae54
You're receiving this email because of your account on gitlab.freedesktop.org.


Reply via email to