diff --git a/.cargo/config.in b/.cargo/config.in index a036233f6acc..6a21d6a25e91 100644 --- a/.cargo/config.in +++ b/.cargo/config.in @@ -45,7 +45,7 @@ rev = "3541e3818fdc7c2a24f87e3459151a4ce955a67a" [source."https://github.com/djg/cubeb-pulse-rs"] git = "https://github.com/djg/cubeb-pulse-rs" replace-with = "vendored-sources" -rev = "8375ed3cd2fb85add5800fa2eb6ec7bfc8e6bbf5" +rev = "5eb38163103b0dae86de81cdaf46070bdeedc0d1" [source."https://github.com/bytecodealliance/wasmtime"] git = "https://github.com/bytecodealliance/wasmtime" diff --git a/Cargo.lock b/Cargo.lock index edf48a218c6d..90d173ead18e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -985,7 +985,7 @@ dependencies = [ [[package]] name = "cubeb-pulse" version = "0.3.0" -source = "git+https://github.com/djg/cubeb-pulse-rs?rev=8375ed3cd2fb85add5800fa2eb6ec7bfc8e6bbf5#8375ed3cd2fb85add5800fa2eb6ec7bfc8e6bbf5" +source = "git+https://github.com/djg/cubeb-pulse-rs?rev=5eb38163103b0dae86de81cdaf46070bdeedc0d1#5eb38163103b0dae86de81cdaf46070bdeedc0d1" dependencies = [ "cubeb-backend", "pulse", @@ -3563,7 +3563,7 @@ dependencies = [ [[package]] name = "pulse" version = "0.3.0" -source = "git+https://github.com/djg/cubeb-pulse-rs?rev=8375ed3cd2fb85add5800fa2eb6ec7bfc8e6bbf5#8375ed3cd2fb85add5800fa2eb6ec7bfc8e6bbf5" +source = "git+https://github.com/djg/cubeb-pulse-rs?rev=5eb38163103b0dae86de81cdaf46070bdeedc0d1#5eb38163103b0dae86de81cdaf46070bdeedc0d1" dependencies = [ "bitflags", "pulse-ffi", @@ -3572,7 +3572,7 @@ dependencies = [ [[package]] name = "pulse-ffi" version = "0.1.0" -source = "git+https://github.com/djg/cubeb-pulse-rs?rev=8375ed3cd2fb85add5800fa2eb6ec7bfc8e6bbf5#8375ed3cd2fb85add5800fa2eb6ec7bfc8e6bbf5" +source = "git+https://github.com/djg/cubeb-pulse-rs?rev=5eb38163103b0dae86de81cdaf46070bdeedc0d1#5eb38163103b0dae86de81cdaf46070bdeedc0d1" dependencies = [ "libc", ] diff --git a/third_party/rust/cubeb-pulse/.cargo-checksum.json b/third_party/rust/cubeb-pulse/.cargo-checksum.json index 2c87e9273dc0..f1c906bbb131 100644 --- a/third_party/rust/cubeb-pulse/.cargo-checksum.json +++ b/third_party/rust/cubeb-pulse/.cargo-checksum.json @@ -1 +1 @@ -{"files":{".editorconfig":"bf047bd1da10cabb99eea666d1e57c321eba4716dccb3e4ed0e2c5fe3ca53858",".travis.yml":"0394e2adb041175457685cde5ee05ff04bdab8885fd8a62551f2ff43d9e48872","AUTHORS":"0e0ac930a68ce2f6b876126b195add177f0d3886facb9260f4d9b69f1988f0cc","Cargo.toml":"297f0144bbebcbc2f3b5478fed750f39adb3b60f9d6c273dfa72d9736818423d","LICENSE":"44c6b5ae5ec3fe2fbc608b00e6f4896f4d2d5c7e525fcbaa3eaa3cf2f3d5a983","README.md":"e6a98ee5630b9ce1a096a2907d095454f2770e298a5b0976ab552cc53ca96cfc","src/backend/context.rs":"33d9fdf1504fe1ae43d301e288daf6eaeabeb47aa0ef86efa135c6d984425fc4","src/backend/cork_state.rs":"4a0f1afc7d9f333dac89218cc56d7d32fbffb487cd48c1c9a4e03d79cb3b5e28","src/backend/intern.rs":"374a9a3bd79fddc47739dda1dbfc5929aea5a91946794fe65fba3c8d130fbda9","src/backend/mod.rs":"06ce9250865abf0ea461f215b128470636d072a6776821efef3caf5a7b992fb9","src/backend/stream.rs":"9f29e85927b670bdb9943cea2c7dc424dad2c3129949542480992ad125c7485f","src/capi.rs":"b2c1be8128cadd36caa65c80950440f9d6f2aa0c24cc7bae6a9eaf6347ac454d","src/lib.rs":"7282560d84b134b09acfd8d6282600982e42fb3557f72454c535637cc26c7bf6"},"package":null} \ No newline at end of file +{"files":{".editorconfig":"bf047bd1da10cabb99eea666d1e57c321eba4716dccb3e4ed0e2c5fe3ca53858",".travis.yml":"0394e2adb041175457685cde5ee05ff04bdab8885fd8a62551f2ff43d9e48872","AUTHORS":"0e0ac930a68ce2f6b876126b195add177f0d3886facb9260f4d9b69f1988f0cc","Cargo.toml":"297f0144bbebcbc2f3b5478fed750f39adb3b60f9d6c273dfa72d9736818423d","LICENSE":"44c6b5ae5ec3fe2fbc608b00e6f4896f4d2d5c7e525fcbaa3eaa3cf2f3d5a983","README.md":"e6a98ee5630b9ce1a096a2907d095454f2770e298a5b0976ab552cc53ca96cfc","src/backend/context.rs":"33d9fdf1504fe1ae43d301e288daf6eaeabeb47aa0ef86efa135c6d984425fc4","src/backend/cork_state.rs":"4a0f1afc7d9f333dac89218cc56d7d32fbffb487cd48c1c9a4e03d79cb3b5e28","src/backend/intern.rs":"374a9a3bd79fddc47739dda1dbfc5929aea5a91946794fe65fba3c8d130fbda9","src/backend/mod.rs":"06ce9250865abf0ea461f215b128470636d072a6776821efef3caf5a7b992fb9","src/backend/stream.rs":"8ff67b76b8663a952fe2d2f7d370a05271f156601c929d19caa56fc892a4a4ab","src/capi.rs":"b2c1be8128cadd36caa65c80950440f9d6f2aa0c24cc7bae6a9eaf6347ac454d","src/lib.rs":"7282560d84b134b09acfd8d6282600982e42fb3557f72454c535637cc26c7bf6"},"package":null} \ No newline at end of file diff --git a/third_party/rust/cubeb-pulse/src/backend/stream.rs b/third_party/rust/cubeb-pulse/src/backend/stream.rs index 79241d5e3483..3f18adc821df 100644 --- a/third_party/rust/cubeb-pulse/src/backend/stream.rs +++ b/third_party/rust/cubeb-pulse/src/backend/stream.rs @@ -7,7 +7,7 @@ use backend::*; use backend::cork_state::CorkState; use cubeb_backend::{ffi, log_enabled, ChannelLayout, DeviceId, DeviceRef, Error, Result, SampleFormat, StreamOps, StreamParamsRef, StreamPrefs}; -use pulse::{self, ChannelMapExt, SampleSpecExt, StreamLatency, USecExt}; +use pulse::{self, CVolumeExt, ChannelMapExt, SampleSpecExt, StreamLatency, USecExt}; use pulse_ffi::*; use std::{mem, ptr}; use std::ffi::{CStr, CString}; @@ -19,6 +19,8 @@ use self::RingBufferConsumer::*; use self::RingBufferProducer::*; use self::LinearInputBuffer::*; +const PULSE_NO_GAIN: f32 = -1.0; + /// Iterator interface to `ChannelLayout`. /// /// Iterates each channel in the set represented by `ChannelLayout`. @@ -360,7 +362,7 @@ impl<'ctx> PulseStream<'ctx> { output_sample_spec: pulse::SampleSpec::default(), input_sample_spec: pulse::SampleSpec::default(), shutdown: false, - volume: 1.0, + volume: PULSE_NO_GAIN, state: ffi::CUBEB_STATE_ERROR, input_buffer_manager: None }); @@ -643,9 +645,47 @@ impl<'ctx> StreamOps for PulseStream<'ctx> { fn set_volume(&mut self, volume: f32) -> Result<()> { match self.output_stream { None => Err(Error::error()), - Some(_) => { - self.volume = volume; - Ok(()) + Some(ref stm) => { + if let Some(ref context) = self.context.context { + self.context.mainloop.lock(); + + let mut cvol: pa_cvolume = Default::default(); + + /* if the pulse daemon is configured to use flat + * volumes, apply our own gain instead of changing + * the input volume on the sink. */ + let flags = { + match self.context.default_sink_info { + Some(ref info) => info.flags, + _ => pulse::SinkFlags::empty(), + } + }; + + if flags.contains(pulse::SinkFlags::FLAT_VOLUME) { + self.volume = volume; + } else { + let channels = stm.get_sample_spec().channels; + let vol = pulse::sw_volume_from_linear(f64::from(volume)); + cvol.set(u32::from(channels), vol); + + let index = stm.get_index(); + + let context_ptr = self.context as *const _ as *mut _; + if let Ok(o) = context.set_sink_input_volume( + index, + &cvol, + context_success, + context_ptr, + ) { + self.context.operation_wait(stm, &o); + } + } + + self.context.mainloop.unlock(); + Ok(()) + } else { + Err(Error::error()) + } } } } @@ -910,7 +950,7 @@ impl<'ctx> PulseStream<'ctx> { read_offset += (size / frame_size) * in_frame_size; } - if self.volume != 1.0 { + if self.volume != PULSE_NO_GAIN { let samples = (self.output_sample_spec.channels as usize * size / frame_size) as isize; @@ -985,6 +1025,14 @@ fn stream_success(_: &pulse::Stream, success: i32, u: *mut c_void) { stm.context.mainloop.signal(); } +fn context_success(_: &pulse::Context, success: i32, u: *mut c_void) { + let ctx = unsafe { &*(u as *mut PulseContext) }; + if success != 1 { + cubeb_log!("context_success ignored failure: {}", success); + } + ctx.mainloop.signal(); +} + fn invalid_format() -> Error { unsafe { Error::from_raw(ffi::CUBEB_ERROR_INVALID_FORMAT) } }