git: 2af447c8bac1 - main - www/firefox: attempt to fix mic on pulseaudio

From: Christoph Moench-Tegeder <cmt_at_FreeBSD.org>
Date: Sun, 07 Nov 2021 23:27:14 UTC
The branch main has been updated by cmt:

URL: https://cgit.FreeBSD.org/ports/commit/?id=2af447c8bac175a02de64aad1e36ad849df2f57f

commit 2af447c8bac175a02de64aad1e36ad849df2f57f
Author:     Christoph Moench-Tegeder <cmt@FreeBSD.org>
AuthorDate: 2021-11-07 23:22:06 +0000
Commit:     Christoph Moench-Tegeder <cmt@FreeBSD.org>
CommitDate: 2021-11-07 23:22:06 +0000

    www/firefox: attempt to fix mic on pulseaudio
    
    careful testing revealed that the microphone worked "sometimes",
    with the "not working" state manifesting as follows: pulseaudio sees
    a signal from the microphone but firefox (and it's components) fails
    to show up on pulseaudio's source-outputs and firefox gets no audio
    signal.
    Applying the patch from upstream 1735905 seems to improve matters
    greatly.
    
    PR:             257639
    Reported by:    many
    Obtained from:  https://bugzilla.mozilla.org/show_bug.cgi?id=1735905
---
 www/firefox/Makefile               |   1 +
 www/firefox/files/patch-bug1735905 | 165 +++++++++++++++++++++++++++++++++++++
 2 files changed, 166 insertions(+)

diff --git a/www/firefox/Makefile b/www/firefox/Makefile
index faa1c224a034..43f16f45336d 100644
--- a/www/firefox/Makefile
+++ b/www/firefox/Makefile
@@ -2,6 +2,7 @@
 
 PORTNAME=	firefox
 DISTVERSION=	94.0.1
+PORTREVISION=	1
 PORTEPOCH=	2
 CATEGORIES=	www
 MASTER_SITES=	MOZILLA/${PORTNAME}/releases/${DISTVERSION}/source \
diff --git a/www/firefox/files/patch-bug1735905 b/www/firefox/files/patch-bug1735905
new file mode 100644
index 000000000000..93f44e30149a
--- /dev/null
+++ b/www/firefox/files/patch-bug1735905
@@ -0,0 +1,165 @@
+commit 0cc5c4b32ed3e0686b4737851fa3df542f60ab3c
+Author: Mike Hommey <mh+mozilla@glandium.org>
+Date:   Sat Oct 16 01:19:56 2021 +0000
+
+    Bug 1735905 - Upgrade cubeb-pulse to fix a race condition that can lead to shutdown deadlock. r=kinetik
+    
+    Differential Revision: https://phabricator.services.mozilla.com/D128657
+
+diff --git .cargo/config.in .cargo/config.in
+index 9f24c14e6bfa..d8164982b771 100644
+--- .cargo/config.in
++++ .cargo/config.in
+@@ -25,7 +25,7 @@ rev = "fd02134161505f978e132114cbabdac057ce3b71"
+ [source."https://github.com/mozilla/cubeb-pulse-rs"]
+ git = "https://github.com/mozilla/cubeb-pulse-rs"
+ replace-with = "vendored-sources"
+-rev = "e9e55a4529642da99e64452467ecaef9f7753531"
++rev = "9695281319fcb3e40db6a32cc0661548d6192f4d"
+ 
+ [source."https://github.com/mozilla/cubeb-coreaudio-rs"]
+ git = "https://github.com/mozilla/cubeb-coreaudio-rs"
+diff --git Cargo.lock Cargo.lock
+index 28b79434ff31..8c06309790be 100644
+--- Cargo.lock
++++ Cargo.lock
+@@ -1059,7 +1059,7 @@ dependencies = [
+ [[package]]
+ name = "cubeb-pulse"
+ version = "0.3.0"
+-source = "git+https://github.com/mozilla/cubeb-pulse-rs?rev=e9e55a4529642da99e64452467ecaef9f7753531#e9e55a4529642da99e64452467ecaef9f7753531"
++source = "git+https://github.com/mozilla/cubeb-pulse-rs?rev=9695281319fcb3e40db6a32cc0661548d6192f4d#9695281319fcb3e40db6a32cc0661548d6192f4d"
+ dependencies = [
+  "cubeb-backend",
+  "pulse",
+@@ -3935,7 +3935,7 @@ dependencies = [
+ [[package]]
+ name = "pulse"
+ version = "0.3.0"
+-source = "git+https://github.com/mozilla/cubeb-pulse-rs?rev=e9e55a4529642da99e64452467ecaef9f7753531#e9e55a4529642da99e64452467ecaef9f7753531"
++source = "git+https://github.com/mozilla/cubeb-pulse-rs?rev=9695281319fcb3e40db6a32cc0661548d6192f4d#9695281319fcb3e40db6a32cc0661548d6192f4d"
+ dependencies = [
+  "bitflags",
+  "pulse-ffi",
+@@ -3944,7 +3944,7 @@ dependencies = [
+ [[package]]
+ name = "pulse-ffi"
+ version = "0.1.0"
+-source = "git+https://github.com/mozilla/cubeb-pulse-rs?rev=e9e55a4529642da99e64452467ecaef9f7753531#e9e55a4529642da99e64452467ecaef9f7753531"
++source = "git+https://github.com/mozilla/cubeb-pulse-rs?rev=9695281319fcb3e40db6a32cc0661548d6192f4d#9695281319fcb3e40db6a32cc0661548d6192f4d"
+ dependencies = [
+  "libc",
+ ]
+diff --git third_party/rust/cubeb-pulse/.cargo-checksum.json third_party/rust/cubeb-pulse/.cargo-checksum.json
+index 1dc452bcf480..45e913931336 100644
+--- third_party/rust/cubeb-pulse/.cargo-checksum.json
++++ third_party/rust/cubeb-pulse/.cargo-checksum.json
+@@ -1 +1 @@
+-{"files":{".editorconfig":"bf047bd1da10cabb99eea666d1e57c321eba4716dccb3e4ed0e2c5fe3ca53858",".github/workflows/build.yml":"95d0d2542c04f0c932f58591b92c3051db5c95657bf5f24b6a6110f7b667568d","AUTHORS":"0e0ac930a68ce2f6b876126b195add177f0d3886facb9260f4d9b69f1988f0cc","Cargo.toml":"56e90cb82ec36ead07e551a28fc2455fa658fa8308c3d73f8d856d85bfcd2122","LICENSE":"44c6b5ae5ec3fe2fbc608b00e6f4896f4d2d5c7e525fcbaa3eaa3cf2f3d5a983","README.md":"0079450bb4b013bac065ed1750851e461a3710ebad1f323817da1cb82db0bc4f","src/backend/context.rs":"8969b300850b56ace07abe570940e2099774bf0bf20325be1d3ec0f5f408c8ce","src/backend/cork_state.rs":"4a0f1afc7d9f333dac89218cc56d7d32fbffb487cd48c1c9a4e03d79cb3b5e28","src/backend/intern.rs":"11ca424e4eb77f8eb9fd5a6717d1e791facf9743156a8534f0016fcf64d57b0f","src/backend/mod.rs":"d5da05348bf1a7f65c85b14372964a49dc4849f0aee96c75e2c18b51fb03fcaf","src/backend/stream.rs":"b17829f1b65055ada69454d0714dd7526d4d5cdeda7bba4ee03ffb6f27297e61","src/capi.rs":"fa0fa020f0d0efe55aa0f
 c3596405e8407bbe2cbe6c7a558345304e6da87994e","src/lib.rs":"b41bbdc562cbfb130ed7c1e53fe69944774f515705341d8ce48a2f82c8c0c2c5"},"package":null}
+\ No newline at end of file
++{"files":{".editorconfig":"bf047bd1da10cabb99eea666d1e57c321eba4716dccb3e4ed0e2c5fe3ca53858",".github/workflows/build.yml":"95d0d2542c04f0c932f58591b92c3051db5c95657bf5f24b6a6110f7b667568d","AUTHORS":"0e0ac930a68ce2f6b876126b195add177f0d3886facb9260f4d9b69f1988f0cc","Cargo.toml":"56e90cb82ec36ead07e551a28fc2455fa658fa8308c3d73f8d856d85bfcd2122","LICENSE":"44c6b5ae5ec3fe2fbc608b00e6f4896f4d2d5c7e525fcbaa3eaa3cf2f3d5a983","README.md":"0079450bb4b013bac065ed1750851e461a3710ebad1f323817da1cb82db0bc4f","src/backend/context.rs":"8969b300850b56ace07abe570940e2099774bf0bf20325be1d3ec0f5f408c8ce","src/backend/cork_state.rs":"4a0f1afc7d9f333dac89218cc56d7d32fbffb487cd48c1c9a4e03d79cb3b5e28","src/backend/intern.rs":"11ca424e4eb77f8eb9fd5a6717d1e791facf9743156a8534f0016fcf64d57b0f","src/backend/mod.rs":"d5da05348bf1a7f65c85b14372964a49dc4849f0aee96c75e2c18b51fb03fcaf","src/backend/stream.rs":"585b616d5487c77f6aa21a76aa6a0f7ae9de8c389bc908401a979fba8bf3450f","src/capi.rs":"fa0fa020f0d0efe55aa0f
 c3596405e8407bbe2cbe6c7a558345304e6da87994e","src/lib.rs":"b41bbdc562cbfb130ed7c1e53fe69944774f515705341d8ce48a2f82c8c0c2c5"},"package":null}
+\ No newline at end of file
+diff --git third_party/rust/cubeb-pulse/src/backend/stream.rs third_party/rust/cubeb-pulse/src/backend/stream.rs
+index 8168c813e243..df64b0f2304e 100644
+--- third_party/rust/cubeb-pulse/src/backend/stream.rs
++++ third_party/rust/cubeb-pulse/src/backend/stream.rs
+@@ -15,7 +15,7 @@ use ringbuf::RingBuffer;
+ use std::ffi::{CStr, CString};
+ use std::os::raw::{c_long, c_void};
+ use std::slice;
+-use std::sync::atomic::{AtomicUsize, Ordering};
++use std::sync::atomic::{AtomicPtr, AtomicUsize, Ordering};
+ use std::{mem, ptr};
+ 
+ use self::LinearInputBuffer::*;
+@@ -272,7 +272,7 @@ pub struct PulseStream<'ctx> {
+     input_stream: Option<pulse::Stream>,
+     data_callback: ffi::cubeb_data_callback,
+     state_callback: ffi::cubeb_state_callback,
+-    drain_timer: *mut pa_time_event,
++    drain_timer: AtomicPtr<pa_time_event>,
+     output_sample_spec: pulse::SampleSpec,
+     input_sample_spec: pulse::SampleSpec,
+     // output frames count excluding pre-buffering
+@@ -411,7 +411,7 @@ impl<'ctx> PulseStream<'ctx> {
+             data_callback,
+             state_callback,
+             user_ptr,
+-            drain_timer: ptr::null_mut(),
++            drain_timer: AtomicPtr::new(ptr::null_mut()),
+             output_sample_spec: pulse::SampleSpec::default(),
+             input_sample_spec: pulse::SampleSpec::default(),
+             output_frame_count: AtomicUsize::new(0),
+@@ -574,9 +574,10 @@ impl<'ctx> PulseStream<'ctx> {
+         self.context.mainloop.lock();
+         {
+             if let Some(stm) = self.output_stream.take() {
+-                if !self.drain_timer.is_null() {
++                let drain_timer = self.drain_timer.load(Ordering::Acquire);
++                if !drain_timer.is_null() {
+                     /* there's no pa_rttime_free, so use this instead. */
+-                    self.context.mainloop.get_api().time_free(self.drain_timer);
++                    self.context.mainloop.get_api().time_free(drain_timer);
+                 }
+                 stm.clear_state_callback();
+                 stm.clear_write_callback();
+@@ -637,7 +638,7 @@ impl<'ctx> StreamOps for PulseStream<'ctx> {
+             self.shutdown = true;
+             // If draining is taking place wait to finish
+             cubeb_log!("Stream stop: waiting for drain.");
+-            while !self.drain_timer.is_null() {
++            while !self.drain_timer.load(Ordering::Acquire).is_null() {
+                 self.context.mainloop.wait();
+             }
+             cubeb_log!("Stream stop: waited for drain.");
+@@ -988,11 +989,12 @@ impl<'ctx> PulseStream<'ctx> {
+         ) {
+             cubeb_logv!("Drain finished callback.");
+             let stm = unsafe { &mut *(u as *mut PulseStream) };
+-            debug_assert_eq!(stm.drain_timer, e);
++            let drain_timer = stm.drain_timer.load(Ordering::Acquire);
++            debug_assert_eq!(drain_timer, e);
+             stm.state_change_callback(ffi::CUBEB_STATE_DRAINED);
+             /* there's no pa_rttime_free, so use this instead. */
+-            a.time_free(stm.drain_timer);
+-            stm.drain_timer = ptr::null_mut();
++            a.time_free(drain_timer);
++            stm.drain_timer.store(ptr::null_mut(), Ordering::Release);
+             stm.context.mainloop.signal();
+         }
+ 
+@@ -1109,13 +1111,16 @@ impl<'ctx> PulseStream<'ctx> {
+ 
+                             /* pa_stream_drain is useless, see PA bug# 866. this is a workaround. */
+                             /* arbitrary safety margin: double the current latency. */
+-                            debug_assert!(self.drain_timer.is_null());
++                            debug_assert!(self.drain_timer.load(Ordering::Acquire).is_null());
+                             let stream_ptr = self as *const _ as *mut _;
+                             if let Some(ref context) = self.context.context {
+-                                self.drain_timer = context.rttime_new(
+-                                    pulse::rtclock_now() + 2 * latency,
+-                                    drained_cb,
+-                                    stream_ptr,
++                                self.drain_timer.store(
++                                    context.rttime_new(
++                                        pulse::rtclock_now() + 2 * latency,
++                                        drained_cb,
++                                        stream_ptr,
++                                    ),
++                                    Ordering::Release,
+                                 );
+                             }
+                             self.shutdown = true;
+diff --git toolkit/library/rust/shared/Cargo.toml toolkit/library/rust/shared/Cargo.toml
+index 39f309e2ad4a..cdb568aa7428 100644
+--- toolkit/library/rust/shared/Cargo.toml
++++ toolkit/library/rust/shared/Cargo.toml
+@@ -20,7 +20,7 @@ profiler_helper = { path = "../../../../tools/profiler/rust-helper", optional =
+ mozurl = { path = "../../../../netwerk/base/mozurl" }
+ webrender_bindings = { path = "../../../../gfx/webrender_bindings" }
+ cubeb-coreaudio = { git = "https://github.com/mozilla/cubeb-coreaudio-rs", rev = "4ee3b283182926f9a8bb31d603219ff2db70d2fd", optional = true }
+-cubeb-pulse = { git = "https://github.com/mozilla/cubeb-pulse-rs", rev="e9e55a4529642da99e64452467ecaef9f7753531", optional = true, features=["pulse-dlopen"] }
++cubeb-pulse = { git = "https://github.com/mozilla/cubeb-pulse-rs", rev="9695281319fcb3e40db6a32cc0661548d6192f4d", optional = true, features=["pulse-dlopen"] }
+ cubeb-sys = { version = "0.9", optional = true, features=["gecko-in-tree"] }
+ encoding_glue = { path = "../../../../intl/encoding_glue" }
+ audioipc-client = { git = "https://github.com/mozilla/audioipc-2", rev = "03868a0eaf1d46e895353fa6e1f5bcaf7e588e62", optional = true }