diff --git a/.cargo/config.toml.in b/.cargo/config.toml.in index eb4f83a78f8d..5e8df9b990bc 100644 --- a/.cargo/config.toml.in +++ b/.cargo/config.toml.in @@ -70,9 +70,9 @@ git = "https://github.com/mozilla/audioipc" rev = "3495905752a4263827f5d43737f9ca3ed0243ce0" replace-with = "vendored-sources" -[source."git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=f8a4ec05e5d6200b193eff0b7a5b98e462008c5d"] +[source."git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=9ea3d3455d599178af64f6ef1d2832b82ba95638"] git = "https://github.com/mozilla/cubeb-coreaudio-rs" -rev = "f8a4ec05e5d6200b193eff0b7a5b98e462008c5d" +rev = "9ea3d3455d599178af64f6ef1d2832b82ba95638" replace-with = "vendored-sources" [source."git+https://github.com/mozilla/cubeb-pulse-rs?rev=8678dcab1c287de79c4c184ccc2e065bc62b70e2"] diff --git a/Cargo.lock b/Cargo.lock index d96105dbf129..55993b1b14da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -934,7 +934,7 @@ dependencies = [ [[package]] name = "coreaudio-sys-utils" version = "0.1.0" -source = "git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=f8a4ec05e5d6200b193eff0b7a5b98e462008c5d#f8a4ec05e5d6200b193eff0b7a5b98e462008c5d" +source = "git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=9ea3d3455d599178af64f6ef1d2832b82ba95638#9ea3d3455d599178af64f6ef1d2832b82ba95638" dependencies = [ "core-foundation-sys", "coreaudio-sys", @@ -1182,7 +1182,7 @@ dependencies = [ [[package]] name = "cubeb-coreaudio" version = "0.1.0" -source = "git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=f8a4ec05e5d6200b193eff0b7a5b98e462008c5d#f8a4ec05e5d6200b193eff0b7a5b98e462008c5d" +source = "git+https://github.com/mozilla/cubeb-coreaudio-rs?rev=9ea3d3455d599178af64f6ef1d2832b82ba95638#9ea3d3455d599178af64f6ef1d2832b82ba95638" dependencies = [ "atomic", "audio-mixer", diff --git a/third_party/rust/cubeb-coreaudio/.cargo-checksum.json b/third_party/rust/cubeb-coreaudio/.cargo-checksum.json index cd964a163a7c..90f1a602e380 100644 --- a/third_party/rust/cubeb-coreaudio/.cargo-checksum.json +++ b/third_party/rust/cubeb-coreaudio/.cargo-checksum.json @@ -1 +1 @@ -{"files":{".circleci/config.yml":"7f3dc865105ca8f33965a7958b1fe2e627ae2d5a703f3b2a4ab6e2e796018597",".editorconfig":"4e53b182bcc78b83d7e1b5c03efa14d22d4955c4ed2514d1ba4e99c1eb1a50ba",".githooks/pre-push":"8b8b26544cd56f54c0c33812551f786bb25cb08c86dbfeb6bf3daad881c826a1",".github/workflows/test.yml":"cf6ebe6d41b022897360866b526d19ba8843aa82ae99a1d28393985576b6a782",".travis.yml":"dc07bac53f70f16c9bdf52264bdc58500ae6018c1b4c567bc7642f6b4ca3cc35","Cargo.toml":"2698cf87581d8d551ed3ac5875564720ed23d7b788e8d145d4281c8026203cd2","LICENSE":"6e6f56aff5bbf3cbc60747e152fb1a719bd0716aaf6d711c554f57d92e96297c","README.md":"0007782a05a5330f739ad789c19c82562c82e32386b0447000fc72c0d48405bc","build-audiounit-rust-in-cubeb.sh":"d228a05985dcd02ec1ecac66a2b64dae5a530804a25a7054ccc95905aedfb7ef","install_git_hook.sh":"d38c8e51e636f6b90b489621ac34ccd1d1b1f40dccce3d178ed1da1c5068f16d","install_rustfmt_clippy.sh":"4ae90d8dcb9757cb3ae4ae142ef80e5377c0dde61c63f4a3c32418646e80ca7b","run_device_tests.sh":"1403232694fabeae004179be8399d1fe2a1b100d60cd90db37d8860eddbaf2ae","run_sanitizers.sh":"84e93a0da137803018f37403511e8c92760be730426bf6cea34419d93d1a7ff8","run_tests.sh":"bae82f66dd47a060b6fdcc238520084aec1079d5b1b1d66d103baa1ffaa8773d","src/backend/aggregate_device.rs":"a910b9d596b1971cb4fee34f5030809ade584f41eb5cbad73a09abe7352ebd15","src/backend/auto_release.rs":"050fdcee74cf46b9a8a85a877e166d72a853d33220f59cf734cbb6ea09daa441","src/backend/buffer_manager.rs":"e9bcf964347daa8952f98caa2746e34a31ea8908375204896593f56e4b6147ca","src/backend/device_property.rs":"30ceeceee4fc1f6f872c6c61765e41d582ccd91d2d1ac3ca9b1e5ac18dd11a71","src/backend/mixer.rs":"c4d09291598cbffb2217b551770ec590f34b6dd6b461dd99b019d5bb70f0eef3","src/backend/mod.rs":"c13d293223402bdb53451e6587a3de8a22be36d6e944baba88bda3977d2cebd9","src/backend/resampler.rs":"48bf8f56ae8d60dbabca6417b768000619abee8731ac3902164b45651ac08a4d","src/backend/tests/aggregate_device.rs":"afbdf1da1fcaddcad2986bd3146bf93ca75c24b3362f5f23a09517a926290ca2","src/backend/tests/api.rs":"3b0936810b3afa84cb80428c471e1097701fd790460d00c0a5715fd8026d0a4d","src/backend/tests/backlog.rs":"3b189a7e036543c467cc242af0ed3332721179ee2b1c8847a6db563546f1ac52","src/backend/tests/device_change.rs":"babf50326fb38db24fe80f24f546e1b6ad04319ae8835bb372d893fc9b3038a2","src/backend/tests/device_property.rs":"4ef3ab625809fe95e944c19cc5dc1cc79f473520a4314d123b1f80c6b7e11411","src/backend/tests/interfaces.rs":"cd58614435574444d8a1f039dc201cf371cccacd58efbae8ed8fbff919550d0a","src/backend/tests/manual.rs":"f72625c05110534775c4608ccc45472ea108286657ffc1f029844a13d0b883bf","src/backend/tests/mod.rs":"8dba770023d7f9c4228f0e11915347f0e07da5fd818e3ee4478c4b197af9aa2a","src/backend/tests/parallel.rs":"a7ebd579339c40ca64c0757cc9da6baec641e670f226e1b2ec5049894700bd7a","src/backend/tests/tone.rs":"b028c67777b6453a26190b6a49785dfe28556adcbe179cb10862ce0d47ee8509","src/backend/tests/utils.rs":"3e435569798b883db8342137098832b88837a387008852005363f74e5e6ff18e","src/backend/utils.rs":"6c3ffbcd602e6cc9f56deb9ecb07b2eef2e6f074ef924178e466f380aae5c595","src/capi.rs":"21b66b70545bf04ec719928004d1d9adb45b24ced51288f5b2993d79aaf78f5f","src/lib.rs":"5e586d45cd6b3722f0a6736d9252593299269817a153eef1930a5fb9bfbb56f5","todo.md":"efc1f012eb9a331a040cad4ac03aa79307f25885f71b6fb38f3ad7af8d7d515c"},"package":null} \ No newline at end of file +{"files":{".circleci/config.yml":"7f3dc865105ca8f33965a7958b1fe2e627ae2d5a703f3b2a4ab6e2e796018597",".editorconfig":"4e53b182bcc78b83d7e1b5c03efa14d22d4955c4ed2514d1ba4e99c1eb1a50ba",".githooks/pre-push":"8b8b26544cd56f54c0c33812551f786bb25cb08c86dbfeb6bf3daad881c826a1",".github/workflows/test.yml":"cf6ebe6d41b022897360866b526d19ba8843aa82ae99a1d28393985576b6a782",".travis.yml":"dc07bac53f70f16c9bdf52264bdc58500ae6018c1b4c567bc7642f6b4ca3cc35","Cargo.toml":"2698cf87581d8d551ed3ac5875564720ed23d7b788e8d145d4281c8026203cd2","LICENSE":"6e6f56aff5bbf3cbc60747e152fb1a719bd0716aaf6d711c554f57d92e96297c","README.md":"0007782a05a5330f739ad789c19c82562c82e32386b0447000fc72c0d48405bc","build-audiounit-rust-in-cubeb.sh":"d228a05985dcd02ec1ecac66a2b64dae5a530804a25a7054ccc95905aedfb7ef","install_git_hook.sh":"d38c8e51e636f6b90b489621ac34ccd1d1b1f40dccce3d178ed1da1c5068f16d","install_rustfmt_clippy.sh":"4ae90d8dcb9757cb3ae4ae142ef80e5377c0dde61c63f4a3c32418646e80ca7b","run_device_tests.sh":"1403232694fabeae004179be8399d1fe2a1b100d60cd90db37d8860eddbaf2ae","run_sanitizers.sh":"84e93a0da137803018f37403511e8c92760be730426bf6cea34419d93d1a7ff8","run_tests.sh":"bae82f66dd47a060b6fdcc238520084aec1079d5b1b1d66d103baa1ffaa8773d","src/backend/aggregate_device.rs":"a910b9d596b1971cb4fee34f5030809ade584f41eb5cbad73a09abe7352ebd15","src/backend/auto_release.rs":"050fdcee74cf46b9a8a85a877e166d72a853d33220f59cf734cbb6ea09daa441","src/backend/buffer_manager.rs":"e9bcf964347daa8952f98caa2746e34a31ea8908375204896593f56e4b6147ca","src/backend/device_property.rs":"30ceeceee4fc1f6f872c6c61765e41d582ccd91d2d1ac3ca9b1e5ac18dd11a71","src/backend/mixer.rs":"c4d09291598cbffb2217b551770ec590f34b6dd6b461dd99b019d5bb70f0eef3","src/backend/mod.rs":"5d52e031306ffd9002701e3715168ecf965543eae460502293cf62939dd3a814","src/backend/resampler.rs":"48bf8f56ae8d60dbabca6417b768000619abee8731ac3902164b45651ac08a4d","src/backend/tests/aggregate_device.rs":"afbdf1da1fcaddcad2986bd3146bf93ca75c24b3362f5f23a09517a926290ca2","src/backend/tests/api.rs":"3b0936810b3afa84cb80428c471e1097701fd790460d00c0a5715fd8026d0a4d","src/backend/tests/backlog.rs":"3b189a7e036543c467cc242af0ed3332721179ee2b1c8847a6db563546f1ac52","src/backend/tests/device_change.rs":"babf50326fb38db24fe80f24f546e1b6ad04319ae8835bb372d893fc9b3038a2","src/backend/tests/device_property.rs":"4ef3ab625809fe95e944c19cc5dc1cc79f473520a4314d123b1f80c6b7e11411","src/backend/tests/interfaces.rs":"a96d1432afd381bf74dcbe73e892dfc4ddc68721a956606c94fd4128c6589adc","src/backend/tests/manual.rs":"f72625c05110534775c4608ccc45472ea108286657ffc1f029844a13d0b883bf","src/backend/tests/mod.rs":"8dba770023d7f9c4228f0e11915347f0e07da5fd818e3ee4478c4b197af9aa2a","src/backend/tests/parallel.rs":"a7ebd579339c40ca64c0757cc9da6baec641e670f226e1b2ec5049894700bd7a","src/backend/tests/tone.rs":"b028c67777b6453a26190b6a49785dfe28556adcbe179cb10862ce0d47ee8509","src/backend/tests/utils.rs":"3e435569798b883db8342137098832b88837a387008852005363f74e5e6ff18e","src/backend/utils.rs":"6c3ffbcd602e6cc9f56deb9ecb07b2eef2e6f074ef924178e466f380aae5c595","src/capi.rs":"21b66b70545bf04ec719928004d1d9adb45b24ced51288f5b2993d79aaf78f5f","src/lib.rs":"5e586d45cd6b3722f0a6736d9252593299269817a153eef1930a5fb9bfbb56f5","todo.md":"efc1f012eb9a331a040cad4ac03aa79307f25885f71b6fb38f3ad7af8d7d515c"},"package":null} \ No newline at end of file diff --git a/third_party/rust/cubeb-coreaudio/src/backend/mod.rs b/third_party/rust/cubeb-coreaudio/src/backend/mod.rs index b66398f593b2..c8171e9b30a1 100644 --- a/third_party/rust/cubeb-coreaudio/src/backend/mod.rs +++ b/third_party/rust/cubeb-coreaudio/src/backend/mod.rs @@ -377,13 +377,7 @@ fn set_input_processing_params(unit: AudioUnit, params: InputProcessingParams) - let aec = params.contains(InputProcessingParams::ECHO_CANCELLATION); let ns = params.contains(InputProcessingParams::NOISE_SUPPRESSION); let agc = params.contains(InputProcessingParams::AUTOMATIC_GAIN_CONTROL); - - // AEC and NS are active as soon as VPIO is not bypassed, therefore the only combinations - // of those we can explicitly support are {} and {aec, ns}. - if aec != ns { - // No control to turn on AEC without NS or vice versa. - return Err(Error::error()); - } + assert_eq!(aec, ns); let mut old_agc: u32 = 0; let r = audio_unit_get_property( @@ -419,6 +413,11 @@ fn set_input_processing_params(unit: AudioUnit, params: InputProcessingParams) - ); return Err(Error::error()); } + cubeb_log!( + "set_input_processing_params on unit {:p} - set agc: {}", + unit, + agc + ); } let mut old_bypass: u32 = 0; @@ -455,6 +454,11 @@ fn set_input_processing_params(unit: AudioUnit, params: InputProcessingParams) - ); return Err(Error::error()); } + cubeb_log!( + "set_input_processing_params on unit {:p} - set bypass: {}", + unit, + bypass + ); } Ok(()) @@ -3015,6 +3019,7 @@ struct CoreStreamData<'ctx> { input_processing_params: InputProcessingParams, input_mute: bool, input_buffer_manager: Option, + units_running: bool, // Listeners indicating what system events are monitored. default_input_listener: Option, default_output_listener: Option, @@ -3064,6 +3069,7 @@ impl<'ctx> Default for CoreStreamData<'ctx> { input_processing_params: InputProcessingParams::NONE, input_mute: false, input_buffer_manager: None, + units_running: false, default_input_listener: None, default_output_listener: None, input_alive_listener: None, @@ -3119,6 +3125,7 @@ impl<'ctx> CoreStreamData<'ctx> { input_processing_params: InputProcessingParams::NONE, input_mute: false, input_buffer_manager: None, + units_running: false, default_input_listener: None, default_output_listener: None, input_alive_listener: None, @@ -3145,7 +3152,7 @@ impl<'ctx> CoreStreamData<'ctx> { stm.queue.debug_assert_is_current(); } - fn start_audiounits(&self) -> Result<()> { + fn start_audiounits(&mut self) -> Result<()> { self.debug_assert_is_on_stream_queue(); // Only allowed to be called after the stream is initialized // and before the stream is destroyed. @@ -3156,22 +3163,50 @@ impl<'ctx> CoreStreamData<'ctx> { } if self.using_voice_processing_unit() { // Handle the VoiceProcessIO case where there is a single unit. + + // Always try to remember the applied input processing params. If they cannot + // be applied in the new device pair, we notify the client of an error and it + // will have to open a new stream. + if let Err(r) = + set_input_processing_params(self.input_unit, self.input_processing_params) + { + cubeb_log!( + "({:p}) Failed to set params of voiceprocessing. Error: {}", + self.stm_ptr, + r + ); + return Err(r); + } return Ok(()); } if !self.output_unit.is_null() { start_audiounit(self.output_unit)?; } + self.units_running = true; Ok(()) } - fn stop_audiounits(&self) { + fn stop_audiounits(&mut self) { self.debug_assert_is_on_stream_queue(); + self.units_running = false; if !self.input_unit.is_null() { let r = stop_audiounit(self.input_unit); assert!(r.is_ok()); } if self.using_voice_processing_unit() { // Handle the VoiceProcessIO case where there is a single unit. + + // Always reset input processing params to VPIO defaults in case VPIO is reused later. + let vpio_defaults = InputProcessingParams::ECHO_CANCELLATION + | InputProcessingParams::AUTOMATIC_GAIN_CONTROL + | InputProcessingParams::NOISE_SUPPRESSION; + if let Err(r) = set_input_processing_params(self.input_unit, vpio_defaults) { + cubeb_log!( + "({:p}) Failed to reset params of voiceprocessing. Error: {}", + self.stm_ptr, + r + ); + } return; } if !self.output_unit.is_null() { @@ -4095,20 +4130,6 @@ impl<'ctx> CoreStreamData<'ctx> { ); return Err(r); } - - // Always try to remember the applied input processing params. If they cannot - // be applied in the new device pair, we notify the client of an error and it - // will have to open a new stream. - if let Err(r) = - set_input_processing_params(self.input_unit, self.input_processing_params) - { - cubeb_log!( - "({:p}) Failed to set params of voiceprocessing. Error: {}", - self.stm_ptr, - r - ); - return Err(r); - } } if let Err(r) = self.install_system_changed_callback() { @@ -4838,6 +4859,7 @@ impl<'ctx> StreamOps for AudioUnitStream<'ctx> { // Execute start in serial queue to avoid racing with destroy or reinit. let result = self .queue + .clone() .run_sync(|| self.core_stream_data.start_audiounits()) .unwrap(); @@ -4855,6 +4877,7 @@ impl<'ctx> StreamOps for AudioUnitStream<'ctx> { if !self.stopped.swap(true, Ordering::SeqCst) { // Execute stop in serial queue to avoid racing with destroy or reinit. self.queue + .clone() .run_sync(|| self.core_stream_data.stop_audiounits()); self.notify_state_changed(State::Stopped); @@ -4997,6 +5020,20 @@ impl<'ctx> StreamOps for AudioUnitStream<'ctx> { return Err(Error::invalid_parameter()); } + // AEC and NS are active as soon as VPIO is not bypassed, therefore the only combinations + // of those we can explicitly support are {} and {aec, ns}. + let aec = params.contains(InputProcessingParams::ECHO_CANCELLATION); + let ns = params.contains(InputProcessingParams::NOISE_SUPPRESSION); + if aec != ns { + // No control to turn on AEC without NS or vice versa. + cubeb_log!( + "Cubeb stream ({:p}) couldn't set input processing params {:?}. AEC != NS.", + self as *const AudioUnitStream, + params + ); + return Err(Error::error()); + } + // CUBEB_ERROR if params could not be applied // note: only works with VoiceProcessingIO if !self.core_stream_data.using_voice_processing_unit() { @@ -5005,17 +5042,26 @@ impl<'ctx> StreamOps for AudioUnitStream<'ctx> { // Execute set_input_processing_params in serial queue to avoid racing with destroy or reinit. let mut result = Err(Error::error()); - let set = &mut result; + let result_ = &mut result; + let mut deferred = false; + let deferred_ = &mut deferred; let stream = &self; self.queue.run_sync(move || { - *set = set_input_processing_params(stream.core_stream_data.input_unit, params); + if stream.core_stream_data.units_running { + *deferred_ = true; + *result_ = Ok(()); + } else { + *deferred_ = false; + *result_ = set_input_processing_params(stream.core_stream_data.input_unit, params); + } }); result?; cubeb_log!( - "Cubeb stream ({:p}) set input processing params to {:?}.", + "Cubeb stream ({:p}) {} input processing params {:?}.", self as *const AudioUnitStream, + if deferred { "deferred" } else { "set" }, params ); self.core_stream_data.input_processing_params = params; diff --git a/third_party/rust/cubeb-coreaudio/src/backend/tests/interfaces.rs b/third_party/rust/cubeb-coreaudio/src/backend/tests/interfaces.rs index c3f4a388cd19..3da50cc262a7 100644 --- a/third_party/rust/cubeb-coreaudio/src/backend/tests/interfaces.rs +++ b/third_party/rust/cubeb-coreaudio/src/backend/tests/interfaces.rs @@ -1623,6 +1623,7 @@ fn test_ops_timing_sensitive_multiple_duplex_voice_stream_params() { |stream| { let stm = unsafe { &mut *(stream as *mut AudioUnitStream) }; assert!(stm.core_stream_data.using_voice_processing_unit()); + assert_eq!(unsafe { OPS.stream_start.unwrap()(stream) }, ffi::CUBEB_OK); let queue = stm.queue.clone(); // Test that input processing params does not carry over when reusing vpio. let mut bypass: u32 = 0; diff --git a/toolkit/library/rust/shared/Cargo.toml b/toolkit/library/rust/shared/Cargo.toml index 732df42abca0..80e282aac451 100644 --- a/toolkit/library/rust/shared/Cargo.toml +++ b/toolkit/library/rust/shared/Cargo.toml @@ -22,7 +22,7 @@ static_prefs = { path = "../../../../modules/libpref/init/static_prefs" } profiler_helper = { path = "../../../../tools/profiler/rust-helper", optional = true } mozurl = { path = "../../../../netwerk/base/mozurl" } webrender_bindings = { path = "../../../../gfx/webrender_bindings" } -cubeb-coreaudio = { git = "https://github.com/mozilla/cubeb-coreaudio-rs", rev = "f8a4ec05e5d6200b193eff0b7a5b98e462008c5d", optional = true } +cubeb-coreaudio = { git = "https://github.com/mozilla/cubeb-coreaudio-rs", rev = "9ea3d3455d599178af64f6ef1d2832b82ba95638", optional = true } cubeb-pulse = { git = "https://github.com/mozilla/cubeb-pulse-rs", rev="8678dcab1c287de79c4c184ccc2e065bc62b70e2", optional = true, features=["pulse-dlopen"] } cubeb-sys = { version = "0.13", optional = true, features=["gecko-in-tree"] } audioipc2-client = { git = "https://github.com/mozilla/audioipc", rev = "3495905752a4263827f5d43737f9ca3ed0243ce0", optional = true }