From d35f0c9ee105f8c789827d6f5c740154f7b9b1bc Mon Sep 17 00:00:00 2001 From: Minijackson Date: Mon, 8 Oct 2018 15:41:46 +0200 Subject: Use features to separate pa_eq and pa_effects + slightly better logging --- src/cli.rs | 24 +- src/dbus_api/equalizing_manager.rs | 291 -------- src/dbus_api/mod.rs | 3 - src/dbus_api/server_lookup.rs | 188 ----- src/dbus_api/sink.rs | 1128 ------------------------------ src/main.rs | 11 +- src/pa_effects.rs | 12 +- src/pa_eq.rs | 110 --- src/pa_eq/dbus_api/equalizing_manager.rs | 291 ++++++++ src/pa_eq/dbus_api/mod.rs | 3 + src/pa_eq/dbus_api/server_lookup.rs | 188 +++++ src/pa_eq/dbus_api/sink.rs | 1128 ++++++++++++++++++++++++++++++ src/pa_eq/mod.rs | 112 +++ src/utils.rs | 4 +- 14 files changed, 1758 insertions(+), 1735 deletions(-) delete mode 100644 src/dbus_api/equalizing_manager.rs delete mode 100644 src/dbus_api/mod.rs delete mode 100644 src/dbus_api/server_lookup.rs delete mode 100644 src/dbus_api/sink.rs delete mode 100644 src/pa_eq.rs create mode 100644 src/pa_eq/dbus_api/equalizing_manager.rs create mode 100644 src/pa_eq/dbus_api/mod.rs create mode 100644 src/pa_eq/dbus_api/server_lookup.rs create mode 100644 src/pa_eq/dbus_api/sink.rs create mode 100644 src/pa_eq/mod.rs (limited to 'src') diff --git a/src/cli.rs b/src/cli.rs index 4dee538..704c13f 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -4,23 +4,19 @@ use structopt; #[derive(StructOpt, Debug)] #[structopt(raw(setting = "structopt::clap::AppSettings::ColoredHelp"))] -/// Hello World! How are you doing? +/// A command-line tool to manipulate PulseAudio's equalizers pub struct Cli { #[structopt(flatten)] pub verbose: clap_verbosity_flag::Verbosity, #[structopt(flatten)] pub log: clap_log_flag::Log, - #[structopt(short = "s", long = "sink")] - /// Use the given sink. - /// - /// By default it will use the last equalized sink it finds - pub sink: Option, #[structopt(subcommand)] pub cmd: Command, } #[derive(StructOpt, Debug)] pub enum Command { + #[cfg(feature = "pa-eq")] #[structopt(name = "pa-eq")] /// PulseAudio equalizer related commands /// @@ -28,6 +24,7 @@ pub enum Command { /// and is known to sometimes cause crashes, latency or audible /// artifacts PaEq(pa_eq::Command), + #[cfg(feature = "pa-effects")] #[structopt(name = "pa-effects")] /// PulseEffects equalizer related commands PaEffects(pa_effects::Command), @@ -40,6 +37,7 @@ arg_enum! { } } +#[cfg(feature = "pa-eq")] pub mod pa_eq { use super::EqualizerConfFormat; @@ -71,13 +69,25 @@ pub mod pa_eq { )] /// The file format of the equalizer configuration pub format: EqualizerConfFormat, + #[structopt(short = "s", long = "sink")] + /// Use the given sink. + /// + /// By default it will use the last equalized sink it finds + pub sink: Option, } #[derive(StructOpt, Debug)] - pub struct ResetCli {} + pub struct ResetCli { + #[structopt(short = "s", long = "sink")] + /// Use the given sink. + /// + /// By default it will use the last equalized sink it finds + pub sink: Option, + } } +#[cfg(feature = "pa-effects")] pub mod pa_effects { use super::EqualizerConfFormat; diff --git a/src/dbus_api/equalizing_manager.rs b/src/dbus_api/equalizing_manager.rs deleted file mode 100644 index 5f6574f..0000000 --- a/src/dbus_api/equalizing_manager.rs +++ /dev/null @@ -1,291 +0,0 @@ -// This code was autogenerated with dbus-codegen-rust, see https://github.com/diwic/dbus-rs - -#![allow(dead_code)] -use dbus as dbus; -use dbus::arg; -use dbus::tree; - -pub trait OrgPulseAudioExtEqualizing1Manager { - type Err; - fn remove_profile(&self, name: &str) -> Result<(), Self::Err>; - fn get_interface_revision(&self) -> Result; - fn get_equalized_sinks(&self) -> Result>, Self::Err>; - fn get_profiles(&self) -> Result, Self::Err>; -} - -impl<'a, C: ::std::ops::Deref> OrgPulseAudioExtEqualizing1Manager for dbus::ConnPath<'a, C> { - type Err = dbus::Error; - - fn remove_profile(&self, name: &str) -> Result<(), Self::Err> { - let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Ext.Equalizing1.Manager".into(), &"RemoveProfile".into(), |msg| { - let mut i = arg::IterAppend::new(msg); - i.append(name); - })); - try!(m.as_result()); - Ok(()) - } - - fn get_interface_revision(&self) -> Result { - ::get(&self, "org.PulseAudio.Ext.Equalizing1.Manager", "InterfaceRevision") - } - - fn get_equalized_sinks(&self) -> Result>, Self::Err> { - ::get(&self, "org.PulseAudio.Ext.Equalizing1.Manager", "EqualizedSinks") - } - - fn get_profiles(&self) -> Result, Self::Err> { - ::get(&self, "org.PulseAudio.Ext.Equalizing1.Manager", "Profiles") - } -} - -pub fn org_pulse_audio_ext_equalizing1_manager_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> -where - D: tree::DataType, - D::Method: Default, - D::Property: Default, - T: OrgPulseAudioExtEqualizing1Manager, - F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, -{ - let i = factory.interface("org.PulseAudio.Ext.Equalizing1.Manager", data); - let f = ::std::sync::Arc::new(f); - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let mut i = minfo.msg.iter_init(); - let name: &str = try!(i.read()); - let d = fclone(minfo); - try!(d.remove_profile(name)); - let rm = minfo.msg.method_return(); - Ok(vec!(rm)) - }; - let m = factory.method("RemoveProfile", Default::default(), h); - let m = m.in_arg(("name", "s")); - let i = i.add_m(m); - - let p = factory.property::("InterfaceRevision", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_interface_revision())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::, _>("EqualizedSinks", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_equalized_sinks())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::, _>("Profiles", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_profiles())); - Ok(()) - }); - let i = i.add_p(p); - i -} - -#[derive(Debug, Default)] -pub struct OrgPulseAudioExtEqualizing1ManagerSinkAdded { - pub sink: dbus::Path<'static>, -} - -impl dbus::SignalArgs for OrgPulseAudioExtEqualizing1ManagerSinkAdded { - const NAME: &'static str = "SinkAdded"; - const INTERFACE: &'static str = "org.PulseAudio.Ext.Equalizing1.Manager"; - fn append(&self, i: &mut arg::IterAppend) { - (&self.sink as &arg::RefArg).append(i); - } - fn get(&mut self, i: &mut arg::Iter) -> Result<(), arg::TypeMismatchError> { - self.sink = try!(i.read()); - Ok(()) - } -} - -#[derive(Debug, Default)] -pub struct OrgPulseAudioExtEqualizing1ManagerSinkRemoved { - pub sink: dbus::Path<'static>, -} - -impl dbus::SignalArgs for OrgPulseAudioExtEqualizing1ManagerSinkRemoved { - const NAME: &'static str = "SinkRemoved"; - const INTERFACE: &'static str = "org.PulseAudio.Ext.Equalizing1.Manager"; - fn append(&self, i: &mut arg::IterAppend) { - (&self.sink as &arg::RefArg).append(i); - } - fn get(&mut self, i: &mut arg::Iter) -> Result<(), arg::TypeMismatchError> { - self.sink = try!(i.read()); - Ok(()) - } -} - -#[derive(Debug, Default)] -pub struct OrgPulseAudioExtEqualizing1ManagerProfilesChanged { -} - -impl dbus::SignalArgs for OrgPulseAudioExtEqualizing1ManagerProfilesChanged { - const NAME: &'static str = "ProfilesChanged"; - const INTERFACE: &'static str = "org.PulseAudio.Ext.Equalizing1.Manager"; - fn append(&self, _: &mut arg::IterAppend) { - } - fn get(&mut self, _: &mut arg::Iter) -> Result<(), arg::TypeMismatchError> { - Ok(()) - } -} - -pub trait OrgFreedesktopDBusIntrospectable { - type Err; - fn introspect(&self) -> Result; -} - -impl<'a, C: ::std::ops::Deref> OrgFreedesktopDBusIntrospectable for dbus::ConnPath<'a, C> { - type Err = dbus::Error; - - fn introspect(&self) -> Result { - let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Introspectable".into(), &"Introspect".into(), |_| { - })); - try!(m.as_result()); - let mut i = m.iter_init(); - let data: String = try!(i.read()); - Ok(data) - } -} - -pub fn org_freedesktop_dbus_introspectable_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> -where - D: tree::DataType, - D::Method: Default, - T: OrgFreedesktopDBusIntrospectable, - F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, -{ - let i = factory.interface("org.freedesktop.DBus.Introspectable", data); - let f = ::std::sync::Arc::new(f); - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let d = fclone(minfo); - let data = try!(d.introspect()); - let rm = minfo.msg.method_return(); - let rm = rm.append1(data); - Ok(vec!(rm)) - }; - let m = factory.method("Introspect", Default::default(), h); - let m = m.out_arg(("data", "s")); - let i = i.add_m(m); - i -} - -pub trait OrgFreedesktopDBusProperties { - type Err; - fn get(&self, interface_name: &str, property_name: &str) -> Result>, Self::Err>; - fn set(&self, interface_name: &str, property_name: &str, value: arg::Variant>) -> Result<(), Self::Err>; - fn get_all(&self, interface_name: &str) -> Result<::std::collections::HashMap>>, Self::Err>; -} - -impl<'a, C: ::std::ops::Deref> OrgFreedesktopDBusProperties for dbus::ConnPath<'a, C> { - type Err = dbus::Error; - - fn get(&self, interface_name: &str, property_name: &str) -> Result>, Self::Err> { - let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Properties".into(), &"Get".into(), |msg| { - let mut i = arg::IterAppend::new(msg); - i.append(interface_name); - i.append(property_name); - })); - try!(m.as_result()); - let mut i = m.iter_init(); - let value: arg::Variant> = try!(i.read()); - Ok(value) - } - - fn set(&self, interface_name: &str, property_name: &str, value: arg::Variant>) -> Result<(), Self::Err> { - let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Properties".into(), &"Set".into(), |msg| { - let mut i = arg::IterAppend::new(msg); - i.append(interface_name); - i.append(property_name); - i.append(value); - })); - try!(m.as_result()); - Ok(()) - } - - fn get_all(&self, interface_name: &str) -> Result<::std::collections::HashMap>>, Self::Err> { - let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Properties".into(), &"GetAll".into(), |msg| { - let mut i = arg::IterAppend::new(msg); - i.append(interface_name); - })); - try!(m.as_result()); - let mut i = m.iter_init(); - let props: ::std::collections::HashMap>> = try!(i.read()); - Ok(props) - } -} - -pub fn org_freedesktop_dbus_properties_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> -where - D: tree::DataType, - D::Method: Default, - T: OrgFreedesktopDBusProperties, - F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, -{ - let i = factory.interface("org.freedesktop.DBus.Properties", data); - let f = ::std::sync::Arc::new(f); - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let mut i = minfo.msg.iter_init(); - let interface_name: &str = try!(i.read()); - let property_name: &str = try!(i.read()); - let d = fclone(minfo); - let value = try!(d.get(interface_name, property_name)); - let rm = minfo.msg.method_return(); - let rm = rm.append1(value); - Ok(vec!(rm)) - }; - let m = factory.method("Get", Default::default(), h); - let m = m.in_arg(("interface_name", "s")); - let m = m.in_arg(("property_name", "s")); - let m = m.out_arg(("value", "v")); - let i = i.add_m(m); - - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let mut i = minfo.msg.iter_init(); - let interface_name: &str = try!(i.read()); - let property_name: &str = try!(i.read()); - let value: arg::Variant> = try!(i.read()); - let d = fclone(minfo); - try!(d.set(interface_name, property_name, value)); - let rm = minfo.msg.method_return(); - Ok(vec!(rm)) - }; - let m = factory.method("Set", Default::default(), h); - let m = m.in_arg(("interface_name", "s")); - let m = m.in_arg(("property_name", "s")); - let m = m.in_arg(("value", "v")); - let i = i.add_m(m); - - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let mut i = minfo.msg.iter_init(); - let interface_name: &str = try!(i.read()); - let d = fclone(minfo); - let props = try!(d.get_all(interface_name)); - let rm = minfo.msg.method_return(); - let rm = rm.append1(props); - Ok(vec!(rm)) - }; - let m = factory.method("GetAll", Default::default(), h); - let m = m.in_arg(("interface_name", "s")); - let m = m.out_arg(("props", "a{sv}")); - let i = i.add_m(m); - i -} diff --git a/src/dbus_api/mod.rs b/src/dbus_api/mod.rs deleted file mode 100644 index a184c55..0000000 --- a/src/dbus_api/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod equalizing_manager; -pub mod server_lookup; -pub mod sink; diff --git a/src/dbus_api/server_lookup.rs b/src/dbus_api/server_lookup.rs deleted file mode 100644 index 78ad4bd..0000000 --- a/src/dbus_api/server_lookup.rs +++ /dev/null @@ -1,188 +0,0 @@ -// This code was autogenerated with dbus-codegen-rust, see https://github.com/diwic/dbus-rs - -#![allow(dead_code)] -use dbus as dbus; -use dbus::arg; -use dbus::tree; - -pub trait OrgPulseAudioServerLookup1 { - type Err; - fn get_address(&self) -> Result; -} - -impl<'a, C: ::std::ops::Deref> OrgPulseAudioServerLookup1 for dbus::ConnPath<'a, C> { - type Err = dbus::Error; - - fn get_address(&self) -> Result { - ::get(&self, "org.PulseAudio.ServerLookup1", "Address") - } -} - -pub fn org_pulse_audio_server_lookup1_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> -where - D: tree::DataType, - D::Method: Default, - D::Property: Default, - T: OrgPulseAudioServerLookup1, - F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, -{ - let i = factory.interface("org.PulseAudio.ServerLookup1", data); - let f = ::std::sync::Arc::new(f); - let p = factory.property::<&str, _>("Address", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_address())); - Ok(()) - }); - let i = i.add_p(p); - i -} - -pub trait OrgFreedesktopDBusIntrospectable { - type Err; - fn introspect(&self) -> Result; -} - -impl<'a, C: ::std::ops::Deref> OrgFreedesktopDBusIntrospectable for dbus::ConnPath<'a, C> { - type Err = dbus::Error; - - fn introspect(&self) -> Result { - let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Introspectable".into(), &"Introspect".into(), |_| { - })); - try!(m.as_result()); - let mut i = m.iter_init(); - let data: String = try!(i.read()); - Ok(data) - } -} - -pub fn org_freedesktop_dbus_introspectable_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> -where - D: tree::DataType, - D::Method: Default, - T: OrgFreedesktopDBusIntrospectable, - F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, -{ - let i = factory.interface("org.freedesktop.DBus.Introspectable", data); - let f = ::std::sync::Arc::new(f); - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let d = fclone(minfo); - let data = try!(d.introspect()); - let rm = minfo.msg.method_return(); - let rm = rm.append1(data); - Ok(vec!(rm)) - }; - let m = factory.method("Introspect", Default::default(), h); - let m = m.out_arg(("data", "s")); - let i = i.add_m(m); - i -} - -pub trait OrgFreedesktopDBusProperties { - type Err; - fn get(&self, interface_name: &str, property_name: &str) -> Result>, Self::Err>; - fn set(&self, interface_name: &str, property_name: &str, value: arg::Variant>) -> Result<(), Self::Err>; - fn get_all(&self, interface_name: &str) -> Result<::std::collections::HashMap>>, Self::Err>; -} - -impl<'a, C: ::std::ops::Deref> OrgFreedesktopDBusProperties for dbus::ConnPath<'a, C> { - type Err = dbus::Error; - - fn get(&self, interface_name: &str, property_name: &str) -> Result>, Self::Err> { - let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Properties".into(), &"Get".into(), |msg| { - let mut i = arg::IterAppend::new(msg); - i.append(interface_name); - i.append(property_name); - })); - try!(m.as_result()); - let mut i = m.iter_init(); - let value: arg::Variant> = try!(i.read()); - Ok(value) - } - - fn set(&self, interface_name: &str, property_name: &str, value: arg::Variant>) -> Result<(), Self::Err> { - let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Properties".into(), &"Set".into(), |msg| { - let mut i = arg::IterAppend::new(msg); - i.append(interface_name); - i.append(property_name); - i.append(value); - })); - try!(m.as_result()); - Ok(()) - } - - fn get_all(&self, interface_name: &str) -> Result<::std::collections::HashMap>>, Self::Err> { - let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Properties".into(), &"GetAll".into(), |msg| { - let mut i = arg::IterAppend::new(msg); - i.append(interface_name); - })); - try!(m.as_result()); - let mut i = m.iter_init(); - let props: ::std::collections::HashMap>> = try!(i.read()); - Ok(props) - } -} - -pub fn org_freedesktop_dbus_properties_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> -where - D: tree::DataType, - D::Method: Default, - T: OrgFreedesktopDBusProperties, - F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, -{ - let i = factory.interface("org.freedesktop.DBus.Properties", data); - let f = ::std::sync::Arc::new(f); - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let mut i = minfo.msg.iter_init(); - let interface_name: &str = try!(i.read()); - let property_name: &str = try!(i.read()); - let d = fclone(minfo); - let value = try!(d.get(interface_name, property_name)); - let rm = minfo.msg.method_return(); - let rm = rm.append1(value); - Ok(vec!(rm)) - }; - let m = factory.method("Get", Default::default(), h); - let m = m.in_arg(("interface_name", "s")); - let m = m.in_arg(("property_name", "s")); - let m = m.out_arg(("value", "v")); - let i = i.add_m(m); - - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let mut i = minfo.msg.iter_init(); - let interface_name: &str = try!(i.read()); - let property_name: &str = try!(i.read()); - let value: arg::Variant> = try!(i.read()); - let d = fclone(minfo); - try!(d.set(interface_name, property_name, value)); - let rm = minfo.msg.method_return(); - Ok(vec!(rm)) - }; - let m = factory.method("Set", Default::default(), h); - let m = m.in_arg(("interface_name", "s")); - let m = m.in_arg(("property_name", "s")); - let m = m.in_arg(("value", "v")); - let i = i.add_m(m); - - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let mut i = minfo.msg.iter_init(); - let interface_name: &str = try!(i.read()); - let d = fclone(minfo); - let props = try!(d.get_all(interface_name)); - let rm = minfo.msg.method_return(); - let rm = rm.append1(props); - Ok(vec!(rm)) - }; - let m = factory.method("GetAll", Default::default(), h); - let m = m.in_arg(("interface_name", "s")); - let m = m.out_arg(("props", "a{sv}")); - let i = i.add_m(m); - i -} diff --git a/src/dbus_api/sink.rs b/src/dbus_api/sink.rs deleted file mode 100644 index 6bd1756..0000000 --- a/src/dbus_api/sink.rs +++ /dev/null @@ -1,1128 +0,0 @@ -// This code was autogenerated with dbus-codegen-rust, see https://github.com/diwic/dbus-rs - -#![allow(dead_code)] -use dbus as dbus; -use dbus::arg; -use dbus::tree; - -pub trait OrgPulseAudioExtEqualizing1Equalizer { - type Err; - fn filter_at_points(&self, channel: u32, xs: Vec) -> Result<(Vec, f64), Self::Err>; - fn seed_filter(&self, channel: u32, xs: Vec, ys: Vec, preamp: f64) -> Result<(), Self::Err>; - fn save_profile(&self, channel: u32, name: &str) -> Result<(), Self::Err>; - fn load_profile(&self, channel: u32, name: &str) -> Result<(), Self::Err>; - fn set_filter(&self, channel: u32, ys: Vec, preamp: f64) -> Result<(), Self::Err>; - fn get_filter(&self, channel: u32) -> Result<(Vec, f64), Self::Err>; - fn save_state(&self) -> Result<(), Self::Err>; - fn base_profile(&self, channel: u32) -> Result; - fn get_interface_revision(&self) -> Result; - fn get_sample_rate(&self) -> Result; - fn get_filter_sample_rate(&self) -> Result; - fn get_nfilter_coefficients(&self) -> Result; - fn get_nchannels(&self) -> Result; -} - -impl<'a, C: ::std::ops::Deref> OrgPulseAudioExtEqualizing1Equalizer for dbus::ConnPath<'a, C> { - type Err = dbus::Error; - - fn filter_at_points(&self, channel: u32, xs: Vec) -> Result<(Vec, f64), Self::Err> { - let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Ext.Equalizing1.Equalizer".into(), &"FilterAtPoints".into(), |msg| { - let mut i = arg::IterAppend::new(msg); - i.append(channel); - i.append(xs); - })); - try!(m.as_result()); - let mut i = m.iter_init(); - let ys: Vec = try!(i.read()); - let preamp: f64 = try!(i.read()); - Ok((ys, preamp)) - } - - fn seed_filter(&self, channel: u32, xs: Vec, ys: Vec, preamp: f64) -> Result<(), Self::Err> { - let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Ext.Equalizing1.Equalizer".into(), &"SeedFilter".into(), |msg| { - let mut i = arg::IterAppend::new(msg); - i.append(channel); - i.append(xs); - i.append(ys); - i.append(preamp); - })); - try!(m.as_result()); - Ok(()) - } - - fn save_profile(&self, channel: u32, name: &str) -> Result<(), Self::Err> { - let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Ext.Equalizing1.Equalizer".into(), &"SaveProfile".into(), |msg| { - let mut i = arg::IterAppend::new(msg); - i.append(channel); - i.append(name); - })); - try!(m.as_result()); - Ok(()) - } - - fn load_profile(&self, channel: u32, name: &str) -> Result<(), Self::Err> { - let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Ext.Equalizing1.Equalizer".into(), &"LoadProfile".into(), |msg| { - let mut i = arg::IterAppend::new(msg); - i.append(channel); - i.append(name); - })); - try!(m.as_result()); - Ok(()) - } - - fn set_filter(&self, channel: u32, ys: Vec, preamp: f64) -> Result<(), Self::Err> { - let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Ext.Equalizing1.Equalizer".into(), &"SetFilter".into(), |msg| { - let mut i = arg::IterAppend::new(msg); - i.append(channel); - i.append(ys); - i.append(preamp); - })); - try!(m.as_result()); - Ok(()) - } - - fn get_filter(&self, channel: u32) -> Result<(Vec, f64), Self::Err> { - let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Ext.Equalizing1.Equalizer".into(), &"GetFilter".into(), |msg| { - let mut i = arg::IterAppend::new(msg); - i.append(channel); - })); - try!(m.as_result()); - let mut i = m.iter_init(); - let ys: Vec = try!(i.read()); - let preamp: f64 = try!(i.read()); - Ok((ys, preamp)) - } - - fn save_state(&self) -> Result<(), Self::Err> { - let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Ext.Equalizing1.Equalizer".into(), &"SaveState".into(), |_| { - })); - try!(m.as_result()); - Ok(()) - } - - fn base_profile(&self, channel: u32) -> Result { - let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Ext.Equalizing1.Equalizer".into(), &"BaseProfile".into(), |msg| { - let mut i = arg::IterAppend::new(msg); - i.append(channel); - })); - try!(m.as_result()); - let mut i = m.iter_init(); - let name: String = try!(i.read()); - Ok(name) - } - - fn get_interface_revision(&self) -> Result { - ::get(&self, "org.PulseAudio.Ext.Equalizing1.Equalizer", "InterfaceRevision") - } - - fn get_sample_rate(&self) -> Result { - ::get(&self, "org.PulseAudio.Ext.Equalizing1.Equalizer", "SampleRate") - } - - fn get_filter_sample_rate(&self) -> Result { - ::get(&self, "org.PulseAudio.Ext.Equalizing1.Equalizer", "FilterSampleRate") - } - - fn get_nfilter_coefficients(&self) -> Result { - ::get(&self, "org.PulseAudio.Ext.Equalizing1.Equalizer", "NFilterCoefficients") - } - - fn get_nchannels(&self) -> Result { - ::get(&self, "org.PulseAudio.Ext.Equalizing1.Equalizer", "NChannels") - } -} - -pub fn org_pulse_audio_ext_equalizing1_equalizer_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> -where - D: tree::DataType, - D::Method: Default, - D::Property: Default, - T: OrgPulseAudioExtEqualizing1Equalizer, - F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, -{ - let i = factory.interface("org.PulseAudio.Ext.Equalizing1.Equalizer", data); - let f = ::std::sync::Arc::new(f); - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let mut i = minfo.msg.iter_init(); - let channel: u32 = try!(i.read()); - let xs: Vec = try!(i.read()); - let d = fclone(minfo); - let (ys, preamp) = try!(d.filter_at_points(channel, xs)); - let rm = minfo.msg.method_return(); - let rm = rm.append1(ys); - let rm = rm.append1(preamp); - Ok(vec!(rm)) - }; - let m = factory.method("FilterAtPoints", Default::default(), h); - let m = m.in_arg(("channel", "u")); - let m = m.in_arg(("xs", "au")); - let m = m.out_arg(("ys", "ad")); - let m = m.out_arg(("preamp", "d")); - let i = i.add_m(m); - - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let mut i = minfo.msg.iter_init(); - let channel: u32 = try!(i.read()); - let xs: Vec = try!(i.read()); - let ys: Vec = try!(i.read()); - let preamp: f64 = try!(i.read()); - let d = fclone(minfo); - try!(d.seed_filter(channel, xs, ys, preamp)); - let rm = minfo.msg.method_return(); - Ok(vec!(rm)) - }; - let m = factory.method("SeedFilter", Default::default(), h); - let m = m.in_arg(("channel", "u")); - let m = m.in_arg(("xs", "au")); - let m = m.in_arg(("ys", "ad")); - let m = m.in_arg(("preamp", "d")); - let i = i.add_m(m); - - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let mut i = minfo.msg.iter_init(); - let channel: u32 = try!(i.read()); - let name: &str = try!(i.read()); - let d = fclone(minfo); - try!(d.save_profile(channel, name)); - let rm = minfo.msg.method_return(); - Ok(vec!(rm)) - }; - let m = factory.method("SaveProfile", Default::default(), h); - let m = m.in_arg(("channel", "u")); - let m = m.in_arg(("name", "s")); - let i = i.add_m(m); - - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let mut i = minfo.msg.iter_init(); - let channel: u32 = try!(i.read()); - let name: &str = try!(i.read()); - let d = fclone(minfo); - try!(d.load_profile(channel, name)); - let rm = minfo.msg.method_return(); - Ok(vec!(rm)) - }; - let m = factory.method("LoadProfile", Default::default(), h); - let m = m.in_arg(("channel", "u")); - let m = m.in_arg(("name", "s")); - let i = i.add_m(m); - - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let mut i = minfo.msg.iter_init(); - let channel: u32 = try!(i.read()); - let ys: Vec = try!(i.read()); - let preamp: f64 = try!(i.read()); - let d = fclone(minfo); - try!(d.set_filter(channel, ys, preamp)); - let rm = minfo.msg.method_return(); - Ok(vec!(rm)) - }; - let m = factory.method("SetFilter", Default::default(), h); - let m = m.in_arg(("channel", "u")); - let m = m.in_arg(("ys", "ad")); - let m = m.in_arg(("preamp", "d")); - let i = i.add_m(m); - - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let mut i = minfo.msg.iter_init(); - let channel: u32 = try!(i.read()); - let d = fclone(minfo); - let (ys, preamp) = try!(d.get_filter(channel)); - let rm = minfo.msg.method_return(); - let rm = rm.append1(ys); - let rm = rm.append1(preamp); - Ok(vec!(rm)) - }; - let m = factory.method("GetFilter", Default::default(), h); - let m = m.in_arg(("channel", "u")); - let m = m.out_arg(("ys", "ad")); - let m = m.out_arg(("preamp", "d")); - let i = i.add_m(m); - - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let d = fclone(minfo); - try!(d.save_state()); - let rm = minfo.msg.method_return(); - Ok(vec!(rm)) - }; - let m = factory.method("SaveState", Default::default(), h); - let i = i.add_m(m); - - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let mut i = minfo.msg.iter_init(); - let channel: u32 = try!(i.read()); - let d = fclone(minfo); - let name = try!(d.base_profile(channel)); - let rm = minfo.msg.method_return(); - let rm = rm.append1(name); - Ok(vec!(rm)) - }; - let m = factory.method("BaseProfile", Default::default(), h); - let m = m.in_arg(("channel", "u")); - let m = m.out_arg(("name", "s")); - let i = i.add_m(m); - - let p = factory.property::("InterfaceRevision", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_interface_revision())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("SampleRate", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_sample_rate())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("FilterSampleRate", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_filter_sample_rate())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("NFilterCoefficients", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_nfilter_coefficients())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("NChannels", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_nchannels())); - Ok(()) - }); - let i = i.add_p(p); - i -} - -#[derive(Debug, Default)] -pub struct OrgPulseAudioExtEqualizing1EqualizerFilterChanged { -} - -impl dbus::SignalArgs for OrgPulseAudioExtEqualizing1EqualizerFilterChanged { - const NAME: &'static str = "FilterChanged"; - const INTERFACE: &'static str = "org.PulseAudio.Ext.Equalizing1.Equalizer"; - fn append(&self, _: &mut arg::IterAppend) { - } - fn get(&mut self, _: &mut arg::Iter) -> Result<(), arg::TypeMismatchError> { - Ok(()) - } -} - -#[derive(Debug, Default)] -pub struct OrgPulseAudioExtEqualizing1EqualizerSinkReconfigured { -} - -impl dbus::SignalArgs for OrgPulseAudioExtEqualizing1EqualizerSinkReconfigured { - const NAME: &'static str = "SinkReconfigured"; - const INTERFACE: &'static str = "org.PulseAudio.Ext.Equalizing1.Equalizer"; - fn append(&self, _: &mut arg::IterAppend) { - } - fn get(&mut self, _: &mut arg::Iter) -> Result<(), arg::TypeMismatchError> { - Ok(()) - } -} - -pub trait OrgPulseAudioCore1Device { - type Err; - fn suspend(&self, suspend: bool) -> Result<(), Self::Err>; - fn get_port_by_name(&self, name: &str) -> Result, Self::Err>; - fn get_index(&self) -> Result; - fn get_name(&self) -> Result; - fn get_driver(&self) -> Result; - fn get_owner_module(&self) -> Result, Self::Err>; - fn get_card(&self) -> Result, Self::Err>; - fn get_sample_format(&self) -> Result; - fn get_sample_rate(&self) -> Result; - fn get_channels(&self) -> Result, Self::Err>; - fn get_volume(&self) -> Result, Self::Err>; - fn set_volume(&self, value: Vec) -> Result<(), Self::Err>; - fn get_has_flat_volume(&self) -> Result; - fn get_has_convertible_to_decibel_volume(&self) -> Result; - fn get_base_volume(&self) -> Result; - fn get_volume_steps(&self) -> Result; - fn get_mute(&self) -> Result; - fn set_mute(&self, value: bool) -> Result<(), Self::Err>; - fn get_has_hardware_volume(&self) -> Result; - fn get_has_hardware_mute(&self) -> Result; - fn get_configured_latency(&self) -> Result; - fn get_has_dynamic_latency(&self) -> Result; - fn get_latency(&self) -> Result; - fn get_is_hardware_device(&self) -> Result; - fn get_is_network_device(&self) -> Result; - fn get_state(&self) -> Result; - fn get_ports(&self) -> Result>, Self::Err>; - fn get_active_port(&self) -> Result, Self::Err>; - fn set_active_port(&self, value: dbus::Path<'static>) -> Result<(), Self::Err>; - fn get_property_list(&self) -> Result<::std::collections::HashMap>, Self::Err>; -} - -impl<'a, C: ::std::ops::Deref> OrgPulseAudioCore1Device for dbus::ConnPath<'a, C> { - type Err = dbus::Error; - - fn suspend(&self, suspend: bool) -> Result<(), Self::Err> { - let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Core1.Device".into(), &"Suspend".into(), |msg| { - let mut i = arg::IterAppend::new(msg); - i.append(suspend); - })); - try!(m.as_result()); - Ok(()) - } - - fn get_port_by_name(&self, name: &str) -> Result, Self::Err> { - let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Core1.Device".into(), &"GetPortByName".into(), |msg| { - let mut i = arg::IterAppend::new(msg); - i.append(name); - })); - try!(m.as_result()); - let mut i = m.iter_init(); - let port: dbus::Path<'static> = try!(i.read()); - Ok(port) - } - - fn get_index(&self) -> Result { - ::get(&self, "org.PulseAudio.Core1.Device", "Index") - } - - fn get_name(&self) -> Result { - ::get(&self, "org.PulseAudio.Core1.Device", "Name") - } - - fn get_driver(&self) -> Result { - ::get(&self, "org.PulseAudio.Core1.Device", "Driver") - } - - fn get_owner_module(&self) -> Result, Self::Err> { - ::get(&self, "org.PulseAudio.Core1.Device", "OwnerModule") - } - - fn get_card(&self) -> Result, Self::Err> { - ::get(&self, "org.PulseAudio.Core1.Device", "Card") - } - - fn get_sample_format(&self) -> Result { - ::get(&self, "org.PulseAudio.Core1.Device", "SampleFormat") - } - - fn get_sample_rate(&self) -> Result { - ::get(&self, "org.PulseAudio.Core1.Device", "SampleRate") - } - - fn get_channels(&self) -> Result, Self::Err> { - ::get(&self, "org.PulseAudio.Core1.Device", "Channels") - } - - fn get_volume(&self) -> Result, Self::Err> { - ::get(&self, "org.PulseAudio.Core1.Device", "Volume") - } - - fn get_has_flat_volume(&self) -> Result { - ::get(&self, "org.PulseAudio.Core1.Device", "HasFlatVolume") - } - - fn get_has_convertible_to_decibel_volume(&self) -> Result { - ::get(&self, "org.PulseAudio.Core1.Device", "HasConvertibleToDecibelVolume") - } - - fn get_base_volume(&self) -> Result { - ::get(&self, "org.PulseAudio.Core1.Device", "BaseVolume") - } - - fn get_volume_steps(&self) -> Result { - ::get(&self, "org.PulseAudio.Core1.Device", "VolumeSteps") - } - - fn get_mute(&self) -> Result { - ::get(&self, "org.PulseAudio.Core1.Device", "Mute") - } - - fn get_has_hardware_volume(&self) -> Result { - ::get(&self, "org.PulseAudio.Core1.Device", "HasHardwareVolume") - } - - fn get_has_hardware_mute(&self) -> Result { - ::get(&self, "org.PulseAudio.Core1.Device", "HasHardwareMute") - } - - fn get_configured_latency(&self) -> Result { - ::get(&self, "org.PulseAudio.Core1.Device", "ConfiguredLatency") - } - - fn get_has_dynamic_latency(&self) -> Result { - ::get(&self, "org.PulseAudio.Core1.Device", "HasDynamicLatency") - } - - fn get_latency(&self) -> Result { - ::get(&self, "org.PulseAudio.Core1.Device", "Latency") - } - - fn get_is_hardware_device(&self) -> Result { - ::get(&self, "org.PulseAudio.Core1.Device", "IsHardwareDevice") - } - - fn get_is_network_device(&self) -> Result { - ::get(&self, "org.PulseAudio.Core1.Device", "IsNetworkDevice") - } - - fn get_state(&self) -> Result { - ::get(&self, "org.PulseAudio.Core1.Device", "State") - } - - fn get_ports(&self) -> Result>, Self::Err> { - ::get(&self, "org.PulseAudio.Core1.Device", "Ports") - } - - fn get_active_port(&self) -> Result, Self::Err> { - ::get(&self, "org.PulseAudio.Core1.Device", "ActivePort") - } - - fn get_property_list(&self) -> Result<::std::collections::HashMap>, Self::Err> { - ::get(&self, "org.PulseAudio.Core1.Device", "PropertyList") - } - - fn set_volume(&self, value: Vec) -> Result<(), Self::Err> { - ::set(&self, "org.PulseAudio.Core1.Device", "Volume", value) - } - - fn set_mute(&self, value: bool) -> Result<(), Self::Err> { - ::set(&self, "org.PulseAudio.Core1.Device", "Mute", value) - } - - fn set_active_port(&self, value: dbus::Path<'static>) -> Result<(), Self::Err> { - ::set(&self, "org.PulseAudio.Core1.Device", "ActivePort", value) - } -} - -pub fn org_pulse_audio_core1_device_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> -where - D: tree::DataType, - D::Method: Default, - D::Property: Default, - T: OrgPulseAudioCore1Device, - F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, -{ - let i = factory.interface("org.PulseAudio.Core1.Device", data); - let f = ::std::sync::Arc::new(f); - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let mut i = minfo.msg.iter_init(); - let suspend: bool = try!(i.read()); - let d = fclone(minfo); - try!(d.suspend(suspend)); - let rm = minfo.msg.method_return(); - Ok(vec!(rm)) - }; - let m = factory.method("Suspend", Default::default(), h); - let m = m.in_arg(("suspend", "b")); - let i = i.add_m(m); - - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let mut i = minfo.msg.iter_init(); - let name: &str = try!(i.read()); - let d = fclone(minfo); - let port = try!(d.get_port_by_name(name)); - let rm = minfo.msg.method_return(); - let rm = rm.append1(port); - Ok(vec!(rm)) - }; - let m = factory.method("GetPortByName", Default::default(), h); - let m = m.in_arg(("name", "s")); - let m = m.out_arg(("port", "o")); - let i = i.add_m(m); - - let p = factory.property::("Index", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_index())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::<&str, _>("Name", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_name())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::<&str, _>("Driver", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_driver())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("OwnerModule", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_owner_module())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("Card", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_card())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("SampleFormat", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_sample_format())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("SampleRate", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_sample_rate())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::, _>("Channels", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_channels())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::, _>("Volume", Default::default()); - let p = p.access(tree::Access::ReadWrite); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_volume())); - Ok(()) - }); - let fclone = f.clone(); - let p = p.on_set(move |iter, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - try!(d.set_volume(try!(iter.read()))); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("HasFlatVolume", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_has_flat_volume())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("HasConvertibleToDecibelVolume", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_has_convertible_to_decibel_volume())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("BaseVolume", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_base_volume())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("VolumeSteps", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_volume_steps())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("Mute", Default::default()); - let p = p.access(tree::Access::ReadWrite); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_mute())); - Ok(()) - }); - let fclone = f.clone(); - let p = p.on_set(move |iter, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - try!(d.set_mute(try!(iter.read()))); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("HasHardwareVolume", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_has_hardware_volume())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("HasHardwareMute", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_has_hardware_mute())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("ConfiguredLatency", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_configured_latency())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("HasDynamicLatency", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_has_dynamic_latency())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("Latency", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_latency())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("IsHardwareDevice", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_is_hardware_device())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("IsNetworkDevice", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_is_network_device())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("State", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_state())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::, _>("Ports", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_ports())); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::("ActivePort", Default::default()); - let p = p.access(tree::Access::ReadWrite); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_active_port())); - Ok(()) - }); - let fclone = f.clone(); - let p = p.on_set(move |iter, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - try!(d.set_active_port(try!(iter.read()))); - Ok(()) - }); - let i = i.add_p(p); - - let p = factory.property::<::std::collections::HashMap<&str, Vec>, _>("PropertyList", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_property_list())); - Ok(()) - }); - let i = i.add_p(p); - i -} - -#[derive(Debug, Default)] -pub struct OrgPulseAudioCore1DeviceVolumeUpdated { - pub volume: Vec, -} - -impl dbus::SignalArgs for OrgPulseAudioCore1DeviceVolumeUpdated { - const NAME: &'static str = "VolumeUpdated"; - const INTERFACE: &'static str = "org.PulseAudio.Core1.Device"; - fn append(&self, i: &mut arg::IterAppend) { - (&self.volume as &arg::RefArg).append(i); - } - fn get(&mut self, i: &mut arg::Iter) -> Result<(), arg::TypeMismatchError> { - self.volume = try!(i.read()); - Ok(()) - } -} - -#[derive(Debug, Default)] -pub struct OrgPulseAudioCore1DeviceMuteUpdated { - pub muted: bool, -} - -impl dbus::SignalArgs for OrgPulseAudioCore1DeviceMuteUpdated { - const NAME: &'static str = "MuteUpdated"; - const INTERFACE: &'static str = "org.PulseAudio.Core1.Device"; - fn append(&self, i: &mut arg::IterAppend) { - (&self.muted as &arg::RefArg).append(i); - } - fn get(&mut self, i: &mut arg::Iter) -> Result<(), arg::TypeMismatchError> { - self.muted = try!(i.read()); - Ok(()) - } -} - -#[derive(Debug, Default)] -pub struct OrgPulseAudioCore1DeviceStateUpdated { - pub state: u32, -} - -impl dbus::SignalArgs for OrgPulseAudioCore1DeviceStateUpdated { - const NAME: &'static str = "StateUpdated"; - const INTERFACE: &'static str = "org.PulseAudio.Core1.Device"; - fn append(&self, i: &mut arg::IterAppend) { - (&self.state as &arg::RefArg).append(i); - } - fn get(&mut self, i: &mut arg::Iter) -> Result<(), arg::TypeMismatchError> { - self.state = try!(i.read()); - Ok(()) - } -} - -#[derive(Debug, Default)] -pub struct OrgPulseAudioCore1DeviceActivePortUpdated { - pub port: dbus::Path<'static>, -} - -impl dbus::SignalArgs for OrgPulseAudioCore1DeviceActivePortUpdated { - const NAME: &'static str = "ActivePortUpdated"; - const INTERFACE: &'static str = "org.PulseAudio.Core1.Device"; - fn append(&self, i: &mut arg::IterAppend) { - (&self.port as &arg::RefArg).append(i); - } - fn get(&mut self, i: &mut arg::Iter) -> Result<(), arg::TypeMismatchError> { - self.port = try!(i.read()); - Ok(()) - } -} - -#[derive(Debug, Default)] -pub struct OrgPulseAudioCore1DevicePropertyListUpdated { - pub property_list: ::std::collections::HashMap>, -} - -impl dbus::SignalArgs for OrgPulseAudioCore1DevicePropertyListUpdated { - const NAME: &'static str = "PropertyListUpdated"; - const INTERFACE: &'static str = "org.PulseAudio.Core1.Device"; - fn append(&self, i: &mut arg::IterAppend) { - (&self.property_list as &arg::RefArg).append(i); - } - fn get(&mut self, i: &mut arg::Iter) -> Result<(), arg::TypeMismatchError> { - self.property_list = try!(i.read()); - Ok(()) - } -} - -pub trait OrgPulseAudioCore1Sink { - type Err; - fn get_monitor_source(&self) -> Result, Self::Err>; -} - -impl<'a, C: ::std::ops::Deref> OrgPulseAudioCore1Sink for dbus::ConnPath<'a, C> { - type Err = dbus::Error; - - fn get_monitor_source(&self) -> Result, Self::Err> { - ::get(&self, "org.PulseAudio.Core1.Sink", "MonitorSource") - } -} - -pub fn org_pulse_audio_core1_sink_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> -where - D: tree::DataType, - D::Method: Default, - D::Property: Default, - T: OrgPulseAudioCore1Sink, - F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, -{ - let i = factory.interface("org.PulseAudio.Core1.Sink", data); - let f = ::std::sync::Arc::new(f); - let p = factory.property::("MonitorSource", Default::default()); - let p = p.access(tree::Access::Read); - let fclone = f.clone(); - let p = p.on_get(move |a, pinfo| { - let minfo = pinfo.to_method_info(); - let d = fclone(&minfo); - a.append(try!(d.get_monitor_source())); - Ok(()) - }); - let i = i.add_p(p); - i -} - -pub trait OrgFreedesktopDBusIntrospectable { - type Err; - fn introspect(&self) -> Result; -} - -impl<'a, C: ::std::ops::Deref> OrgFreedesktopDBusIntrospectable for dbus::ConnPath<'a, C> { - type Err = dbus::Error; - - fn introspect(&self) -> Result { - let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Introspectable".into(), &"Introspect".into(), |_| { - })); - try!(m.as_result()); - let mut i = m.iter_init(); - let data: String = try!(i.read()); - Ok(data) - } -} - -pub fn org_freedesktop_dbus_introspectable_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> -where - D: tree::DataType, - D::Method: Default, - T: OrgFreedesktopDBusIntrospectable, - F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, -{ - let i = factory.interface("org.freedesktop.DBus.Introspectable", data); - let f = ::std::sync::Arc::new(f); - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let d = fclone(minfo); - let data = try!(d.introspect()); - let rm = minfo.msg.method_return(); - let rm = rm.append1(data); - Ok(vec!(rm)) - }; - let m = factory.method("Introspect", Default::default(), h); - let m = m.out_arg(("data", "s")); - let i = i.add_m(m); - i -} - -pub trait OrgFreedesktopDBusProperties { - type Err; - fn get(&self, interface_name: &str, property_name: &str) -> Result>, Self::Err>; - fn set(&self, interface_name: &str, property_name: &str, value: arg::Variant>) -> Result<(), Self::Err>; - fn get_all(&self, interface_name: &str) -> Result<::std::collections::HashMap>>, Self::Err>; -} - -impl<'a, C: ::std::ops::Deref> OrgFreedesktopDBusProperties for dbus::ConnPath<'a, C> { - type Err = dbus::Error; - - fn get(&self, interface_name: &str, property_name: &str) -> Result>, Self::Err> { - let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Properties".into(), &"Get".into(), |msg| { - let mut i = arg::IterAppend::new(msg); - i.append(interface_name); - i.append(property_name); - })); - try!(m.as_result()); - let mut i = m.iter_init(); - let value: arg::Variant> = try!(i.read()); - Ok(value) - } - - fn set(&self, interface_name: &str, property_name: &str, value: arg::Variant>) -> Result<(), Self::Err> { - let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Properties".into(), &"Set".into(), |msg| { - let mut i = arg::IterAppend::new(msg); - i.append(interface_name); - i.append(property_name); - i.append(value); - })); - try!(m.as_result()); - Ok(()) - } - - fn get_all(&self, interface_name: &str) -> Result<::std::collections::HashMap>>, Self::Err> { - let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Properties".into(), &"GetAll".into(), |msg| { - let mut i = arg::IterAppend::new(msg); - i.append(interface_name); - })); - try!(m.as_result()); - let mut i = m.iter_init(); - let props: ::std::collections::HashMap>> = try!(i.read()); - Ok(props) - } -} - -pub fn org_freedesktop_dbus_properties_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> -where - D: tree::DataType, - D::Method: Default, - T: OrgFreedesktopDBusProperties, - F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, -{ - let i = factory.interface("org.freedesktop.DBus.Properties", data); - let f = ::std::sync::Arc::new(f); - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let mut i = minfo.msg.iter_init(); - let interface_name: &str = try!(i.read()); - let property_name: &str = try!(i.read()); - let d = fclone(minfo); - let value = try!(d.get(interface_name, property_name)); - let rm = minfo.msg.method_return(); - let rm = rm.append1(value); - Ok(vec!(rm)) - }; - let m = factory.method("Get", Default::default(), h); - let m = m.in_arg(("interface_name", "s")); - let m = m.in_arg(("property_name", "s")); - let m = m.out_arg(("value", "v")); - let i = i.add_m(m); - - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let mut i = minfo.msg.iter_init(); - let interface_name: &str = try!(i.read()); - let property_name: &str = try!(i.read()); - let value: arg::Variant> = try!(i.read()); - let d = fclone(minfo); - try!(d.set(interface_name, property_name, value)); - let rm = minfo.msg.method_return(); - Ok(vec!(rm)) - }; - let m = factory.method("Set", Default::default(), h); - let m = m.in_arg(("interface_name", "s")); - let m = m.in_arg(("property_name", "s")); - let m = m.in_arg(("value", "v")); - let i = i.add_m(m); - - let fclone = f.clone(); - let h = move |minfo: &tree::MethodInfo, D>| { - let mut i = minfo.msg.iter_init(); - let interface_name: &str = try!(i.read()); - let d = fclone(minfo); - let props = try!(d.get_all(interface_name)); - let rm = minfo.msg.method_return(); - let rm = rm.append1(props); - Ok(vec!(rm)) - }; - let m = factory.method("GetAll", Default::default(), h); - let m = m.in_arg(("interface_name", "s")); - let m = m.out_arg(("props", "a{sv}")); - let i = i.add_m(m); - i -} diff --git a/src/main.rs b/src/main.rs index a23034e..df1732d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,3 @@ -extern crate dbus; - #[macro_use] extern crate log; #[macro_use] @@ -14,15 +12,20 @@ extern crate structopt; extern crate lalrpop_util; +#[cfg(feature = "pa-eq")] +extern crate dbus; + +#[cfg(feature = "pa-effects")] #[macro_use] extern crate serde_json; mod cli; -mod dbus_api; mod parsing; mod utils; +#[cfg(feature = "pa-eq")] mod pa_eq; +#[cfg(feature = "pa-effects")] mod pa_effects; use cli::*; @@ -75,7 +78,9 @@ fn start() -> Result<(), Error> { use Command::*; match args.cmd { + #[cfg(feature = "pa-eq")] PaEq(args) => pa_eq::main(args), + #[cfg(feature = "pa-effects")] PaEffects(args) => pa_effects::main(args), } } diff --git a/src/pa_effects.rs b/src/pa_effects.rs index 9ed0a1f..43d27cb 100644 --- a/src/pa_effects.rs +++ b/src/pa_effects.rs @@ -19,8 +19,14 @@ pub fn main(cmd: Command) -> Result<(), Error> { fn export_preset(args: ExportPresetCli) -> Result<(), Error> { debug!("Parsing base preset"); let mut preset: serde_json::Value = match args.base_preset { - Some(file) => serde_json::from_str(&read_filearg_to_str(&file)?), - None => serde_json::from_str(&DEFAULT_PRESET), + Some(file) => { + info!("Reading base PulseEffects preset from file '{}'", file); + serde_json::from_str(&read_filearg_to_str(&file)?) + } + None => { + info!("Using default PulseEffects preset"); + serde_json::from_str(&DEFAULT_PRESET) + } }?; let filter = read_filter_from_arg(&args.file)?; @@ -65,7 +71,7 @@ fn simplify_filter(filter: Filter) -> Filter { let mut partition_size = filter.frequencies.len() / 30; let step_error = filter.frequencies.len() as f64 % 30f64; if step_error != 0f64 { - info!("The approximation will be imperfect"); + trace!("The approximation will be imperfect"); partition_size += 1; } diff --git a/src/pa_eq.rs b/src/pa_eq.rs deleted file mode 100644 index 4086c31..0000000 --- a/src/pa_eq.rs +++ /dev/null @@ -1,110 +0,0 @@ -use Filter; -use cli::pa_eq::*; -use utils::*; - -use dbus_api::equalizing_manager::OrgPulseAudioExtEqualizing1Manager; -use dbus_api::server_lookup::OrgPulseAudioServerLookup1; -use dbus_api::sink::OrgPulseAudioExtEqualizing1Equalizer; - -use dbus::{BusType, ConnPath, Connection}; - -use failure::{Error, ResultExt}; - -#[derive(Fail, Debug)] -#[fail(display = "No equalized sink found")] -struct NoEqualizedSink; - -pub fn main(cmd: Command) -> Result<(), Error> { - use cli::pa_eq::Command::*; - - warn!("The PulseAudio equalizer has been deprecated for a while, and is known to sometimes cause crashes, latency or audible artifacts"); - - match cmd { - Load(args) => load(args), - Reset(args) => reset(args), - } -} - -pub fn reset(_args: ResetCli) -> Result<(), Error> { - let conn = connect()?; - let conn_sink = get_equalized_sink(&conn)?; - let filter_rate = conn_sink.get_filter_sample_rate()?; - let filter = Filter { - preamp: 1f64, - frequencies: vec![], - coefficients: vec![], - }.pad(filter_rate); - - send_filter(&conn_sink, filter)?; - - Ok(()) -} - -pub fn load(args: LoadCli) -> Result<(), Error> { - let conn = connect()?; - let conn_sink = get_equalized_sink(&conn)?; - - let filter = read_filter_from_arg(&args.file)?; - - let filter_rate = conn_sink.get_filter_sample_rate()?; - send_filter(&conn_sink, filter.pad(filter_rate))?; - - Ok(()) -} - -fn connect() -> Result { - Ok(connect_impl().context( - "Could not connect to PulseAudio's D-Bus socket. Have you loaded the 'module-dbus-protocol' module?" - )?) -} - -fn connect_impl() -> Result { - let pulse_sock_path = get_pulse_dbus_sock()?; - info!("PulseAudio's D-Bus socket path is: {}", pulse_sock_path); - - trace!("Connecting to PulseAudio's D-Bus socket"); - Ok(Connection::open_private(&pulse_sock_path)?) -} - -fn get_equalized_sink<'a>(conn: &'a Connection) -> Result, Error> { - Ok(get_equalized_sink_impl(conn).context( - "Could not find an equalized sink. Have you loaded the 'module-equalizer-sink' module?", - )?) -} - -fn get_equalized_sink_impl<'a>( - conn: &'a Connection, -) -> Result, Error> { - let conn_manager = conn.with_path("org.PulseAudio.Core1", "/org/pulseaudio/equalizing1", 2000); - - // TODO: make that a command-line option - trace!("Getting (one of) the equalized sink(s)"); - let mut sinks = conn_manager.get_equalized_sinks()?; - let sink_path = sinks.pop().ok_or(NoEqualizedSink {})?; - info!("Using equalized sink: {:?}", sink_path.as_cstr()); - - trace!("Connecting to equalized sink"); - Ok(conn.with_path("org.PulseAudio.Core1", sink_path, 2000)) -} - -fn send_filter(conn_sink: &ConnPath<&Connection>, filter: Filter) -> Result<(), Error> { - let channel = conn_sink.get_nchannels()?; - info!("Using channel: {}", channel); - trace!("Sending filter: {:?}", filter); - conn_sink.seed_filter( - channel, - filter.frequencies, - filter.coefficients.into_iter().map(decibel_to_ratio).collect(), - decibel_to_ratio(filter.preamp), - )?; - Ok(()) -} - -fn get_pulse_dbus_sock() -> Result { - trace!("Connecting to the D-Bus' session bus"); - let conn = Connection::get_private(BusType::Session)?; - let conn = conn.with_path("org.PulseAudio1", "/org/pulseaudio/server_lookup1", 2000); - - trace!("Checking PulseAudio's D-Bus socket path"); - Ok(conn.get_address()?) -} diff --git a/src/pa_eq/dbus_api/equalizing_manager.rs b/src/pa_eq/dbus_api/equalizing_manager.rs new file mode 100644 index 0000000..5f6574f --- /dev/null +++ b/src/pa_eq/dbus_api/equalizing_manager.rs @@ -0,0 +1,291 @@ +// This code was autogenerated with dbus-codegen-rust, see https://github.com/diwic/dbus-rs + +#![allow(dead_code)] +use dbus as dbus; +use dbus::arg; +use dbus::tree; + +pub trait OrgPulseAudioExtEqualizing1Manager { + type Err; + fn remove_profile(&self, name: &str) -> Result<(), Self::Err>; + fn get_interface_revision(&self) -> Result; + fn get_equalized_sinks(&self) -> Result>, Self::Err>; + fn get_profiles(&self) -> Result, Self::Err>; +} + +impl<'a, C: ::std::ops::Deref> OrgPulseAudioExtEqualizing1Manager for dbus::ConnPath<'a, C> { + type Err = dbus::Error; + + fn remove_profile(&self, name: &str) -> Result<(), Self::Err> { + let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Ext.Equalizing1.Manager".into(), &"RemoveProfile".into(), |msg| { + let mut i = arg::IterAppend::new(msg); + i.append(name); + })); + try!(m.as_result()); + Ok(()) + } + + fn get_interface_revision(&self) -> Result { + ::get(&self, "org.PulseAudio.Ext.Equalizing1.Manager", "InterfaceRevision") + } + + fn get_equalized_sinks(&self) -> Result>, Self::Err> { + ::get(&self, "org.PulseAudio.Ext.Equalizing1.Manager", "EqualizedSinks") + } + + fn get_profiles(&self) -> Result, Self::Err> { + ::get(&self, "org.PulseAudio.Ext.Equalizing1.Manager", "Profiles") + } +} + +pub fn org_pulse_audio_ext_equalizing1_manager_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> +where + D: tree::DataType, + D::Method: Default, + D::Property: Default, + T: OrgPulseAudioExtEqualizing1Manager, + F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, +{ + let i = factory.interface("org.PulseAudio.Ext.Equalizing1.Manager", data); + let f = ::std::sync::Arc::new(f); + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let mut i = minfo.msg.iter_init(); + let name: &str = try!(i.read()); + let d = fclone(minfo); + try!(d.remove_profile(name)); + let rm = minfo.msg.method_return(); + Ok(vec!(rm)) + }; + let m = factory.method("RemoveProfile", Default::default(), h); + let m = m.in_arg(("name", "s")); + let i = i.add_m(m); + + let p = factory.property::("InterfaceRevision", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_interface_revision())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::, _>("EqualizedSinks", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_equalized_sinks())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::, _>("Profiles", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_profiles())); + Ok(()) + }); + let i = i.add_p(p); + i +} + +#[derive(Debug, Default)] +pub struct OrgPulseAudioExtEqualizing1ManagerSinkAdded { + pub sink: dbus::Path<'static>, +} + +impl dbus::SignalArgs for OrgPulseAudioExtEqualizing1ManagerSinkAdded { + const NAME: &'static str = "SinkAdded"; + const INTERFACE: &'static str = "org.PulseAudio.Ext.Equalizing1.Manager"; + fn append(&self, i: &mut arg::IterAppend) { + (&self.sink as &arg::RefArg).append(i); + } + fn get(&mut self, i: &mut arg::Iter) -> Result<(), arg::TypeMismatchError> { + self.sink = try!(i.read()); + Ok(()) + } +} + +#[derive(Debug, Default)] +pub struct OrgPulseAudioExtEqualizing1ManagerSinkRemoved { + pub sink: dbus::Path<'static>, +} + +impl dbus::SignalArgs for OrgPulseAudioExtEqualizing1ManagerSinkRemoved { + const NAME: &'static str = "SinkRemoved"; + const INTERFACE: &'static str = "org.PulseAudio.Ext.Equalizing1.Manager"; + fn append(&self, i: &mut arg::IterAppend) { + (&self.sink as &arg::RefArg).append(i); + } + fn get(&mut self, i: &mut arg::Iter) -> Result<(), arg::TypeMismatchError> { + self.sink = try!(i.read()); + Ok(()) + } +} + +#[derive(Debug, Default)] +pub struct OrgPulseAudioExtEqualizing1ManagerProfilesChanged { +} + +impl dbus::SignalArgs for OrgPulseAudioExtEqualizing1ManagerProfilesChanged { + const NAME: &'static str = "ProfilesChanged"; + const INTERFACE: &'static str = "org.PulseAudio.Ext.Equalizing1.Manager"; + fn append(&self, _: &mut arg::IterAppend) { + } + fn get(&mut self, _: &mut arg::Iter) -> Result<(), arg::TypeMismatchError> { + Ok(()) + } +} + +pub trait OrgFreedesktopDBusIntrospectable { + type Err; + fn introspect(&self) -> Result; +} + +impl<'a, C: ::std::ops::Deref> OrgFreedesktopDBusIntrospectable for dbus::ConnPath<'a, C> { + type Err = dbus::Error; + + fn introspect(&self) -> Result { + let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Introspectable".into(), &"Introspect".into(), |_| { + })); + try!(m.as_result()); + let mut i = m.iter_init(); + let data: String = try!(i.read()); + Ok(data) + } +} + +pub fn org_freedesktop_dbus_introspectable_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> +where + D: tree::DataType, + D::Method: Default, + T: OrgFreedesktopDBusIntrospectable, + F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, +{ + let i = factory.interface("org.freedesktop.DBus.Introspectable", data); + let f = ::std::sync::Arc::new(f); + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let d = fclone(minfo); + let data = try!(d.introspect()); + let rm = minfo.msg.method_return(); + let rm = rm.append1(data); + Ok(vec!(rm)) + }; + let m = factory.method("Introspect", Default::default(), h); + let m = m.out_arg(("data", "s")); + let i = i.add_m(m); + i +} + +pub trait OrgFreedesktopDBusProperties { + type Err; + fn get(&self, interface_name: &str, property_name: &str) -> Result>, Self::Err>; + fn set(&self, interface_name: &str, property_name: &str, value: arg::Variant>) -> Result<(), Self::Err>; + fn get_all(&self, interface_name: &str) -> Result<::std::collections::HashMap>>, Self::Err>; +} + +impl<'a, C: ::std::ops::Deref> OrgFreedesktopDBusProperties for dbus::ConnPath<'a, C> { + type Err = dbus::Error; + + fn get(&self, interface_name: &str, property_name: &str) -> Result>, Self::Err> { + let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Properties".into(), &"Get".into(), |msg| { + let mut i = arg::IterAppend::new(msg); + i.append(interface_name); + i.append(property_name); + })); + try!(m.as_result()); + let mut i = m.iter_init(); + let value: arg::Variant> = try!(i.read()); + Ok(value) + } + + fn set(&self, interface_name: &str, property_name: &str, value: arg::Variant>) -> Result<(), Self::Err> { + let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Properties".into(), &"Set".into(), |msg| { + let mut i = arg::IterAppend::new(msg); + i.append(interface_name); + i.append(property_name); + i.append(value); + })); + try!(m.as_result()); + Ok(()) + } + + fn get_all(&self, interface_name: &str) -> Result<::std::collections::HashMap>>, Self::Err> { + let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Properties".into(), &"GetAll".into(), |msg| { + let mut i = arg::IterAppend::new(msg); + i.append(interface_name); + })); + try!(m.as_result()); + let mut i = m.iter_init(); + let props: ::std::collections::HashMap>> = try!(i.read()); + Ok(props) + } +} + +pub fn org_freedesktop_dbus_properties_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> +where + D: tree::DataType, + D::Method: Default, + T: OrgFreedesktopDBusProperties, + F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, +{ + let i = factory.interface("org.freedesktop.DBus.Properties", data); + let f = ::std::sync::Arc::new(f); + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let mut i = minfo.msg.iter_init(); + let interface_name: &str = try!(i.read()); + let property_name: &str = try!(i.read()); + let d = fclone(minfo); + let value = try!(d.get(interface_name, property_name)); + let rm = minfo.msg.method_return(); + let rm = rm.append1(value); + Ok(vec!(rm)) + }; + let m = factory.method("Get", Default::default(), h); + let m = m.in_arg(("interface_name", "s")); + let m = m.in_arg(("property_name", "s")); + let m = m.out_arg(("value", "v")); + let i = i.add_m(m); + + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let mut i = minfo.msg.iter_init(); + let interface_name: &str = try!(i.read()); + let property_name: &str = try!(i.read()); + let value: arg::Variant> = try!(i.read()); + let d = fclone(minfo); + try!(d.set(interface_name, property_name, value)); + let rm = minfo.msg.method_return(); + Ok(vec!(rm)) + }; + let m = factory.method("Set", Default::default(), h); + let m = m.in_arg(("interface_name", "s")); + let m = m.in_arg(("property_name", "s")); + let m = m.in_arg(("value", "v")); + let i = i.add_m(m); + + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let mut i = minfo.msg.iter_init(); + let interface_name: &str = try!(i.read()); + let d = fclone(minfo); + let props = try!(d.get_all(interface_name)); + let rm = minfo.msg.method_return(); + let rm = rm.append1(props); + Ok(vec!(rm)) + }; + let m = factory.method("GetAll", Default::default(), h); + let m = m.in_arg(("interface_name", "s")); + let m = m.out_arg(("props", "a{sv}")); + let i = i.add_m(m); + i +} diff --git a/src/pa_eq/dbus_api/mod.rs b/src/pa_eq/dbus_api/mod.rs new file mode 100644 index 0000000..a184c55 --- /dev/null +++ b/src/pa_eq/dbus_api/mod.rs @@ -0,0 +1,3 @@ +pub mod equalizing_manager; +pub mod server_lookup; +pub mod sink; diff --git a/src/pa_eq/dbus_api/server_lookup.rs b/src/pa_eq/dbus_api/server_lookup.rs new file mode 100644 index 0000000..78ad4bd --- /dev/null +++ b/src/pa_eq/dbus_api/server_lookup.rs @@ -0,0 +1,188 @@ +// This code was autogenerated with dbus-codegen-rust, see https://github.com/diwic/dbus-rs + +#![allow(dead_code)] +use dbus as dbus; +use dbus::arg; +use dbus::tree; + +pub trait OrgPulseAudioServerLookup1 { + type Err; + fn get_address(&self) -> Result; +} + +impl<'a, C: ::std::ops::Deref> OrgPulseAudioServerLookup1 for dbus::ConnPath<'a, C> { + type Err = dbus::Error; + + fn get_address(&self) -> Result { + ::get(&self, "org.PulseAudio.ServerLookup1", "Address") + } +} + +pub fn org_pulse_audio_server_lookup1_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> +where + D: tree::DataType, + D::Method: Default, + D::Property: Default, + T: OrgPulseAudioServerLookup1, + F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, +{ + let i = factory.interface("org.PulseAudio.ServerLookup1", data); + let f = ::std::sync::Arc::new(f); + let p = factory.property::<&str, _>("Address", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_address())); + Ok(()) + }); + let i = i.add_p(p); + i +} + +pub trait OrgFreedesktopDBusIntrospectable { + type Err; + fn introspect(&self) -> Result; +} + +impl<'a, C: ::std::ops::Deref> OrgFreedesktopDBusIntrospectable for dbus::ConnPath<'a, C> { + type Err = dbus::Error; + + fn introspect(&self) -> Result { + let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Introspectable".into(), &"Introspect".into(), |_| { + })); + try!(m.as_result()); + let mut i = m.iter_init(); + let data: String = try!(i.read()); + Ok(data) + } +} + +pub fn org_freedesktop_dbus_introspectable_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> +where + D: tree::DataType, + D::Method: Default, + T: OrgFreedesktopDBusIntrospectable, + F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, +{ + let i = factory.interface("org.freedesktop.DBus.Introspectable", data); + let f = ::std::sync::Arc::new(f); + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let d = fclone(minfo); + let data = try!(d.introspect()); + let rm = minfo.msg.method_return(); + let rm = rm.append1(data); + Ok(vec!(rm)) + }; + let m = factory.method("Introspect", Default::default(), h); + let m = m.out_arg(("data", "s")); + let i = i.add_m(m); + i +} + +pub trait OrgFreedesktopDBusProperties { + type Err; + fn get(&self, interface_name: &str, property_name: &str) -> Result>, Self::Err>; + fn set(&self, interface_name: &str, property_name: &str, value: arg::Variant>) -> Result<(), Self::Err>; + fn get_all(&self, interface_name: &str) -> Result<::std::collections::HashMap>>, Self::Err>; +} + +impl<'a, C: ::std::ops::Deref> OrgFreedesktopDBusProperties for dbus::ConnPath<'a, C> { + type Err = dbus::Error; + + fn get(&self, interface_name: &str, property_name: &str) -> Result>, Self::Err> { + let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Properties".into(), &"Get".into(), |msg| { + let mut i = arg::IterAppend::new(msg); + i.append(interface_name); + i.append(property_name); + })); + try!(m.as_result()); + let mut i = m.iter_init(); + let value: arg::Variant> = try!(i.read()); + Ok(value) + } + + fn set(&self, interface_name: &str, property_name: &str, value: arg::Variant>) -> Result<(), Self::Err> { + let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Properties".into(), &"Set".into(), |msg| { + let mut i = arg::IterAppend::new(msg); + i.append(interface_name); + i.append(property_name); + i.append(value); + })); + try!(m.as_result()); + Ok(()) + } + + fn get_all(&self, interface_name: &str) -> Result<::std::collections::HashMap>>, Self::Err> { + let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Properties".into(), &"GetAll".into(), |msg| { + let mut i = arg::IterAppend::new(msg); + i.append(interface_name); + })); + try!(m.as_result()); + let mut i = m.iter_init(); + let props: ::std::collections::HashMap>> = try!(i.read()); + Ok(props) + } +} + +pub fn org_freedesktop_dbus_properties_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> +where + D: tree::DataType, + D::Method: Default, + T: OrgFreedesktopDBusProperties, + F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, +{ + let i = factory.interface("org.freedesktop.DBus.Properties", data); + let f = ::std::sync::Arc::new(f); + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let mut i = minfo.msg.iter_init(); + let interface_name: &str = try!(i.read()); + let property_name: &str = try!(i.read()); + let d = fclone(minfo); + let value = try!(d.get(interface_name, property_name)); + let rm = minfo.msg.method_return(); + let rm = rm.append1(value); + Ok(vec!(rm)) + }; + let m = factory.method("Get", Default::default(), h); + let m = m.in_arg(("interface_name", "s")); + let m = m.in_arg(("property_name", "s")); + let m = m.out_arg(("value", "v")); + let i = i.add_m(m); + + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let mut i = minfo.msg.iter_init(); + let interface_name: &str = try!(i.read()); + let property_name: &str = try!(i.read()); + let value: arg::Variant> = try!(i.read()); + let d = fclone(minfo); + try!(d.set(interface_name, property_name, value)); + let rm = minfo.msg.method_return(); + Ok(vec!(rm)) + }; + let m = factory.method("Set", Default::default(), h); + let m = m.in_arg(("interface_name", "s")); + let m = m.in_arg(("property_name", "s")); + let m = m.in_arg(("value", "v")); + let i = i.add_m(m); + + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let mut i = minfo.msg.iter_init(); + let interface_name: &str = try!(i.read()); + let d = fclone(minfo); + let props = try!(d.get_all(interface_name)); + let rm = minfo.msg.method_return(); + let rm = rm.append1(props); + Ok(vec!(rm)) + }; + let m = factory.method("GetAll", Default::default(), h); + let m = m.in_arg(("interface_name", "s")); + let m = m.out_arg(("props", "a{sv}")); + let i = i.add_m(m); + i +} diff --git a/src/pa_eq/dbus_api/sink.rs b/src/pa_eq/dbus_api/sink.rs new file mode 100644 index 0000000..6bd1756 --- /dev/null +++ b/src/pa_eq/dbus_api/sink.rs @@ -0,0 +1,1128 @@ +// This code was autogenerated with dbus-codegen-rust, see https://github.com/diwic/dbus-rs + +#![allow(dead_code)] +use dbus as dbus; +use dbus::arg; +use dbus::tree; + +pub trait OrgPulseAudioExtEqualizing1Equalizer { + type Err; + fn filter_at_points(&self, channel: u32, xs: Vec) -> Result<(Vec, f64), Self::Err>; + fn seed_filter(&self, channel: u32, xs: Vec, ys: Vec, preamp: f64) -> Result<(), Self::Err>; + fn save_profile(&self, channel: u32, name: &str) -> Result<(), Self::Err>; + fn load_profile(&self, channel: u32, name: &str) -> Result<(), Self::Err>; + fn set_filter(&self, channel: u32, ys: Vec, preamp: f64) -> Result<(), Self::Err>; + fn get_filter(&self, channel: u32) -> Result<(Vec, f64), Self::Err>; + fn save_state(&self) -> Result<(), Self::Err>; + fn base_profile(&self, channel: u32) -> Result; + fn get_interface_revision(&self) -> Result; + fn get_sample_rate(&self) -> Result; + fn get_filter_sample_rate(&self) -> Result; + fn get_nfilter_coefficients(&self) -> Result; + fn get_nchannels(&self) -> Result; +} + +impl<'a, C: ::std::ops::Deref> OrgPulseAudioExtEqualizing1Equalizer for dbus::ConnPath<'a, C> { + type Err = dbus::Error; + + fn filter_at_points(&self, channel: u32, xs: Vec) -> Result<(Vec, f64), Self::Err> { + let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Ext.Equalizing1.Equalizer".into(), &"FilterAtPoints".into(), |msg| { + let mut i = arg::IterAppend::new(msg); + i.append(channel); + i.append(xs); + })); + try!(m.as_result()); + let mut i = m.iter_init(); + let ys: Vec = try!(i.read()); + let preamp: f64 = try!(i.read()); + Ok((ys, preamp)) + } + + fn seed_filter(&self, channel: u32, xs: Vec, ys: Vec, preamp: f64) -> Result<(), Self::Err> { + let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Ext.Equalizing1.Equalizer".into(), &"SeedFilter".into(), |msg| { + let mut i = arg::IterAppend::new(msg); + i.append(channel); + i.append(xs); + i.append(ys); + i.append(preamp); + })); + try!(m.as_result()); + Ok(()) + } + + fn save_profile(&self, channel: u32, name: &str) -> Result<(), Self::Err> { + let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Ext.Equalizing1.Equalizer".into(), &"SaveProfile".into(), |msg| { + let mut i = arg::IterAppend::new(msg); + i.append(channel); + i.append(name); + })); + try!(m.as_result()); + Ok(()) + } + + fn load_profile(&self, channel: u32, name: &str) -> Result<(), Self::Err> { + let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Ext.Equalizing1.Equalizer".into(), &"LoadProfile".into(), |msg| { + let mut i = arg::IterAppend::new(msg); + i.append(channel); + i.append(name); + })); + try!(m.as_result()); + Ok(()) + } + + fn set_filter(&self, channel: u32, ys: Vec, preamp: f64) -> Result<(), Self::Err> { + let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Ext.Equalizing1.Equalizer".into(), &"SetFilter".into(), |msg| { + let mut i = arg::IterAppend::new(msg); + i.append(channel); + i.append(ys); + i.append(preamp); + })); + try!(m.as_result()); + Ok(()) + } + + fn get_filter(&self, channel: u32) -> Result<(Vec, f64), Self::Err> { + let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Ext.Equalizing1.Equalizer".into(), &"GetFilter".into(), |msg| { + let mut i = arg::IterAppend::new(msg); + i.append(channel); + })); + try!(m.as_result()); + let mut i = m.iter_init(); + let ys: Vec = try!(i.read()); + let preamp: f64 = try!(i.read()); + Ok((ys, preamp)) + } + + fn save_state(&self) -> Result<(), Self::Err> { + let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Ext.Equalizing1.Equalizer".into(), &"SaveState".into(), |_| { + })); + try!(m.as_result()); + Ok(()) + } + + fn base_profile(&self, channel: u32) -> Result { + let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Ext.Equalizing1.Equalizer".into(), &"BaseProfile".into(), |msg| { + let mut i = arg::IterAppend::new(msg); + i.append(channel); + })); + try!(m.as_result()); + let mut i = m.iter_init(); + let name: String = try!(i.read()); + Ok(name) + } + + fn get_interface_revision(&self) -> Result { + ::get(&self, "org.PulseAudio.Ext.Equalizing1.Equalizer", "InterfaceRevision") + } + + fn get_sample_rate(&self) -> Result { + ::get(&self, "org.PulseAudio.Ext.Equalizing1.Equalizer", "SampleRate") + } + + fn get_filter_sample_rate(&self) -> Result { + ::get(&self, "org.PulseAudio.Ext.Equalizing1.Equalizer", "FilterSampleRate") + } + + fn get_nfilter_coefficients(&self) -> Result { + ::get(&self, "org.PulseAudio.Ext.Equalizing1.Equalizer", "NFilterCoefficients") + } + + fn get_nchannels(&self) -> Result { + ::get(&self, "org.PulseAudio.Ext.Equalizing1.Equalizer", "NChannels") + } +} + +pub fn org_pulse_audio_ext_equalizing1_equalizer_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> +where + D: tree::DataType, + D::Method: Default, + D::Property: Default, + T: OrgPulseAudioExtEqualizing1Equalizer, + F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, +{ + let i = factory.interface("org.PulseAudio.Ext.Equalizing1.Equalizer", data); + let f = ::std::sync::Arc::new(f); + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let mut i = minfo.msg.iter_init(); + let channel: u32 = try!(i.read()); + let xs: Vec = try!(i.read()); + let d = fclone(minfo); + let (ys, preamp) = try!(d.filter_at_points(channel, xs)); + let rm = minfo.msg.method_return(); + let rm = rm.append1(ys); + let rm = rm.append1(preamp); + Ok(vec!(rm)) + }; + let m = factory.method("FilterAtPoints", Default::default(), h); + let m = m.in_arg(("channel", "u")); + let m = m.in_arg(("xs", "au")); + let m = m.out_arg(("ys", "ad")); + let m = m.out_arg(("preamp", "d")); + let i = i.add_m(m); + + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let mut i = minfo.msg.iter_init(); + let channel: u32 = try!(i.read()); + let xs: Vec = try!(i.read()); + let ys: Vec = try!(i.read()); + let preamp: f64 = try!(i.read()); + let d = fclone(minfo); + try!(d.seed_filter(channel, xs, ys, preamp)); + let rm = minfo.msg.method_return(); + Ok(vec!(rm)) + }; + let m = factory.method("SeedFilter", Default::default(), h); + let m = m.in_arg(("channel", "u")); + let m = m.in_arg(("xs", "au")); + let m = m.in_arg(("ys", "ad")); + let m = m.in_arg(("preamp", "d")); + let i = i.add_m(m); + + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let mut i = minfo.msg.iter_init(); + let channel: u32 = try!(i.read()); + let name: &str = try!(i.read()); + let d = fclone(minfo); + try!(d.save_profile(channel, name)); + let rm = minfo.msg.method_return(); + Ok(vec!(rm)) + }; + let m = factory.method("SaveProfile", Default::default(), h); + let m = m.in_arg(("channel", "u")); + let m = m.in_arg(("name", "s")); + let i = i.add_m(m); + + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let mut i = minfo.msg.iter_init(); + let channel: u32 = try!(i.read()); + let name: &str = try!(i.read()); + let d = fclone(minfo); + try!(d.load_profile(channel, name)); + let rm = minfo.msg.method_return(); + Ok(vec!(rm)) + }; + let m = factory.method("LoadProfile", Default::default(), h); + let m = m.in_arg(("channel", "u")); + let m = m.in_arg(("name", "s")); + let i = i.add_m(m); + + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let mut i = minfo.msg.iter_init(); + let channel: u32 = try!(i.read()); + let ys: Vec = try!(i.read()); + let preamp: f64 = try!(i.read()); + let d = fclone(minfo); + try!(d.set_filter(channel, ys, preamp)); + let rm = minfo.msg.method_return(); + Ok(vec!(rm)) + }; + let m = factory.method("SetFilter", Default::default(), h); + let m = m.in_arg(("channel", "u")); + let m = m.in_arg(("ys", "ad")); + let m = m.in_arg(("preamp", "d")); + let i = i.add_m(m); + + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let mut i = minfo.msg.iter_init(); + let channel: u32 = try!(i.read()); + let d = fclone(minfo); + let (ys, preamp) = try!(d.get_filter(channel)); + let rm = minfo.msg.method_return(); + let rm = rm.append1(ys); + let rm = rm.append1(preamp); + Ok(vec!(rm)) + }; + let m = factory.method("GetFilter", Default::default(), h); + let m = m.in_arg(("channel", "u")); + let m = m.out_arg(("ys", "ad")); + let m = m.out_arg(("preamp", "d")); + let i = i.add_m(m); + + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let d = fclone(minfo); + try!(d.save_state()); + let rm = minfo.msg.method_return(); + Ok(vec!(rm)) + }; + let m = factory.method("SaveState", Default::default(), h); + let i = i.add_m(m); + + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let mut i = minfo.msg.iter_init(); + let channel: u32 = try!(i.read()); + let d = fclone(minfo); + let name = try!(d.base_profile(channel)); + let rm = minfo.msg.method_return(); + let rm = rm.append1(name); + Ok(vec!(rm)) + }; + let m = factory.method("BaseProfile", Default::default(), h); + let m = m.in_arg(("channel", "u")); + let m = m.out_arg(("name", "s")); + let i = i.add_m(m); + + let p = factory.property::("InterfaceRevision", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_interface_revision())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("SampleRate", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_sample_rate())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("FilterSampleRate", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_filter_sample_rate())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("NFilterCoefficients", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_nfilter_coefficients())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("NChannels", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_nchannels())); + Ok(()) + }); + let i = i.add_p(p); + i +} + +#[derive(Debug, Default)] +pub struct OrgPulseAudioExtEqualizing1EqualizerFilterChanged { +} + +impl dbus::SignalArgs for OrgPulseAudioExtEqualizing1EqualizerFilterChanged { + const NAME: &'static str = "FilterChanged"; + const INTERFACE: &'static str = "org.PulseAudio.Ext.Equalizing1.Equalizer"; + fn append(&self, _: &mut arg::IterAppend) { + } + fn get(&mut self, _: &mut arg::Iter) -> Result<(), arg::TypeMismatchError> { + Ok(()) + } +} + +#[derive(Debug, Default)] +pub struct OrgPulseAudioExtEqualizing1EqualizerSinkReconfigured { +} + +impl dbus::SignalArgs for OrgPulseAudioExtEqualizing1EqualizerSinkReconfigured { + const NAME: &'static str = "SinkReconfigured"; + const INTERFACE: &'static str = "org.PulseAudio.Ext.Equalizing1.Equalizer"; + fn append(&self, _: &mut arg::IterAppend) { + } + fn get(&mut self, _: &mut arg::Iter) -> Result<(), arg::TypeMismatchError> { + Ok(()) + } +} + +pub trait OrgPulseAudioCore1Device { + type Err; + fn suspend(&self, suspend: bool) -> Result<(), Self::Err>; + fn get_port_by_name(&self, name: &str) -> Result, Self::Err>; + fn get_index(&self) -> Result; + fn get_name(&self) -> Result; + fn get_driver(&self) -> Result; + fn get_owner_module(&self) -> Result, Self::Err>; + fn get_card(&self) -> Result, Self::Err>; + fn get_sample_format(&self) -> Result; + fn get_sample_rate(&self) -> Result; + fn get_channels(&self) -> Result, Self::Err>; + fn get_volume(&self) -> Result, Self::Err>; + fn set_volume(&self, value: Vec) -> Result<(), Self::Err>; + fn get_has_flat_volume(&self) -> Result; + fn get_has_convertible_to_decibel_volume(&self) -> Result; + fn get_base_volume(&self) -> Result; + fn get_volume_steps(&self) -> Result; + fn get_mute(&self) -> Result; + fn set_mute(&self, value: bool) -> Result<(), Self::Err>; + fn get_has_hardware_volume(&self) -> Result; + fn get_has_hardware_mute(&self) -> Result; + fn get_configured_latency(&self) -> Result; + fn get_has_dynamic_latency(&self) -> Result; + fn get_latency(&self) -> Result; + fn get_is_hardware_device(&self) -> Result; + fn get_is_network_device(&self) -> Result; + fn get_state(&self) -> Result; + fn get_ports(&self) -> Result>, Self::Err>; + fn get_active_port(&self) -> Result, Self::Err>; + fn set_active_port(&self, value: dbus::Path<'static>) -> Result<(), Self::Err>; + fn get_property_list(&self) -> Result<::std::collections::HashMap>, Self::Err>; +} + +impl<'a, C: ::std::ops::Deref> OrgPulseAudioCore1Device for dbus::ConnPath<'a, C> { + type Err = dbus::Error; + + fn suspend(&self, suspend: bool) -> Result<(), Self::Err> { + let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Core1.Device".into(), &"Suspend".into(), |msg| { + let mut i = arg::IterAppend::new(msg); + i.append(suspend); + })); + try!(m.as_result()); + Ok(()) + } + + fn get_port_by_name(&self, name: &str) -> Result, Self::Err> { + let mut m = try!(self.method_call_with_args(&"org.PulseAudio.Core1.Device".into(), &"GetPortByName".into(), |msg| { + let mut i = arg::IterAppend::new(msg); + i.append(name); + })); + try!(m.as_result()); + let mut i = m.iter_init(); + let port: dbus::Path<'static> = try!(i.read()); + Ok(port) + } + + fn get_index(&self) -> Result { + ::get(&self, "org.PulseAudio.Core1.Device", "Index") + } + + fn get_name(&self) -> Result { + ::get(&self, "org.PulseAudio.Core1.Device", "Name") + } + + fn get_driver(&self) -> Result { + ::get(&self, "org.PulseAudio.Core1.Device", "Driver") + } + + fn get_owner_module(&self) -> Result, Self::Err> { + ::get(&self, "org.PulseAudio.Core1.Device", "OwnerModule") + } + + fn get_card(&self) -> Result, Self::Err> { + ::get(&self, "org.PulseAudio.Core1.Device", "Card") + } + + fn get_sample_format(&self) -> Result { + ::get(&self, "org.PulseAudio.Core1.Device", "SampleFormat") + } + + fn get_sample_rate(&self) -> Result { + ::get(&self, "org.PulseAudio.Core1.Device", "SampleRate") + } + + fn get_channels(&self) -> Result, Self::Err> { + ::get(&self, "org.PulseAudio.Core1.Device", "Channels") + } + + fn get_volume(&self) -> Result, Self::Err> { + ::get(&self, "org.PulseAudio.Core1.Device", "Volume") + } + + fn get_has_flat_volume(&self) -> Result { + ::get(&self, "org.PulseAudio.Core1.Device", "HasFlatVolume") + } + + fn get_has_convertible_to_decibel_volume(&self) -> Result { + ::get(&self, "org.PulseAudio.Core1.Device", "HasConvertibleToDecibelVolume") + } + + fn get_base_volume(&self) -> Result { + ::get(&self, "org.PulseAudio.Core1.Device", "BaseVolume") + } + + fn get_volume_steps(&self) -> Result { + ::get(&self, "org.PulseAudio.Core1.Device", "VolumeSteps") + } + + fn get_mute(&self) -> Result { + ::get(&self, "org.PulseAudio.Core1.Device", "Mute") + } + + fn get_has_hardware_volume(&self) -> Result { + ::get(&self, "org.PulseAudio.Core1.Device", "HasHardwareVolume") + } + + fn get_has_hardware_mute(&self) -> Result { + ::get(&self, "org.PulseAudio.Core1.Device", "HasHardwareMute") + } + + fn get_configured_latency(&self) -> Result { + ::get(&self, "org.PulseAudio.Core1.Device", "ConfiguredLatency") + } + + fn get_has_dynamic_latency(&self) -> Result { + ::get(&self, "org.PulseAudio.Core1.Device", "HasDynamicLatency") + } + + fn get_latency(&self) -> Result { + ::get(&self, "org.PulseAudio.Core1.Device", "Latency") + } + + fn get_is_hardware_device(&self) -> Result { + ::get(&self, "org.PulseAudio.Core1.Device", "IsHardwareDevice") + } + + fn get_is_network_device(&self) -> Result { + ::get(&self, "org.PulseAudio.Core1.Device", "IsNetworkDevice") + } + + fn get_state(&self) -> Result { + ::get(&self, "org.PulseAudio.Core1.Device", "State") + } + + fn get_ports(&self) -> Result>, Self::Err> { + ::get(&self, "org.PulseAudio.Core1.Device", "Ports") + } + + fn get_active_port(&self) -> Result, Self::Err> { + ::get(&self, "org.PulseAudio.Core1.Device", "ActivePort") + } + + fn get_property_list(&self) -> Result<::std::collections::HashMap>, Self::Err> { + ::get(&self, "org.PulseAudio.Core1.Device", "PropertyList") + } + + fn set_volume(&self, value: Vec) -> Result<(), Self::Err> { + ::set(&self, "org.PulseAudio.Core1.Device", "Volume", value) + } + + fn set_mute(&self, value: bool) -> Result<(), Self::Err> { + ::set(&self, "org.PulseAudio.Core1.Device", "Mute", value) + } + + fn set_active_port(&self, value: dbus::Path<'static>) -> Result<(), Self::Err> { + ::set(&self, "org.PulseAudio.Core1.Device", "ActivePort", value) + } +} + +pub fn org_pulse_audio_core1_device_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> +where + D: tree::DataType, + D::Method: Default, + D::Property: Default, + T: OrgPulseAudioCore1Device, + F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, +{ + let i = factory.interface("org.PulseAudio.Core1.Device", data); + let f = ::std::sync::Arc::new(f); + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let mut i = minfo.msg.iter_init(); + let suspend: bool = try!(i.read()); + let d = fclone(minfo); + try!(d.suspend(suspend)); + let rm = minfo.msg.method_return(); + Ok(vec!(rm)) + }; + let m = factory.method("Suspend", Default::default(), h); + let m = m.in_arg(("suspend", "b")); + let i = i.add_m(m); + + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let mut i = minfo.msg.iter_init(); + let name: &str = try!(i.read()); + let d = fclone(minfo); + let port = try!(d.get_port_by_name(name)); + let rm = minfo.msg.method_return(); + let rm = rm.append1(port); + Ok(vec!(rm)) + }; + let m = factory.method("GetPortByName", Default::default(), h); + let m = m.in_arg(("name", "s")); + let m = m.out_arg(("port", "o")); + let i = i.add_m(m); + + let p = factory.property::("Index", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_index())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::<&str, _>("Name", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_name())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::<&str, _>("Driver", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_driver())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("OwnerModule", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_owner_module())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("Card", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_card())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("SampleFormat", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_sample_format())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("SampleRate", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_sample_rate())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::, _>("Channels", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_channels())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::, _>("Volume", Default::default()); + let p = p.access(tree::Access::ReadWrite); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_volume())); + Ok(()) + }); + let fclone = f.clone(); + let p = p.on_set(move |iter, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + try!(d.set_volume(try!(iter.read()))); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("HasFlatVolume", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_has_flat_volume())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("HasConvertibleToDecibelVolume", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_has_convertible_to_decibel_volume())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("BaseVolume", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_base_volume())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("VolumeSteps", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_volume_steps())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("Mute", Default::default()); + let p = p.access(tree::Access::ReadWrite); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_mute())); + Ok(()) + }); + let fclone = f.clone(); + let p = p.on_set(move |iter, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + try!(d.set_mute(try!(iter.read()))); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("HasHardwareVolume", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_has_hardware_volume())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("HasHardwareMute", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_has_hardware_mute())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("ConfiguredLatency", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_configured_latency())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("HasDynamicLatency", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_has_dynamic_latency())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("Latency", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_latency())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("IsHardwareDevice", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_is_hardware_device())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("IsNetworkDevice", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_is_network_device())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("State", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_state())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::, _>("Ports", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_ports())); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::("ActivePort", Default::default()); + let p = p.access(tree::Access::ReadWrite); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_active_port())); + Ok(()) + }); + let fclone = f.clone(); + let p = p.on_set(move |iter, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + try!(d.set_active_port(try!(iter.read()))); + Ok(()) + }); + let i = i.add_p(p); + + let p = factory.property::<::std::collections::HashMap<&str, Vec>, _>("PropertyList", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_property_list())); + Ok(()) + }); + let i = i.add_p(p); + i +} + +#[derive(Debug, Default)] +pub struct OrgPulseAudioCore1DeviceVolumeUpdated { + pub volume: Vec, +} + +impl dbus::SignalArgs for OrgPulseAudioCore1DeviceVolumeUpdated { + const NAME: &'static str = "VolumeUpdated"; + const INTERFACE: &'static str = "org.PulseAudio.Core1.Device"; + fn append(&self, i: &mut arg::IterAppend) { + (&self.volume as &arg::RefArg).append(i); + } + fn get(&mut self, i: &mut arg::Iter) -> Result<(), arg::TypeMismatchError> { + self.volume = try!(i.read()); + Ok(()) + } +} + +#[derive(Debug, Default)] +pub struct OrgPulseAudioCore1DeviceMuteUpdated { + pub muted: bool, +} + +impl dbus::SignalArgs for OrgPulseAudioCore1DeviceMuteUpdated { + const NAME: &'static str = "MuteUpdated"; + const INTERFACE: &'static str = "org.PulseAudio.Core1.Device"; + fn append(&self, i: &mut arg::IterAppend) { + (&self.muted as &arg::RefArg).append(i); + } + fn get(&mut self, i: &mut arg::Iter) -> Result<(), arg::TypeMismatchError> { + self.muted = try!(i.read()); + Ok(()) + } +} + +#[derive(Debug, Default)] +pub struct OrgPulseAudioCore1DeviceStateUpdated { + pub state: u32, +} + +impl dbus::SignalArgs for OrgPulseAudioCore1DeviceStateUpdated { + const NAME: &'static str = "StateUpdated"; + const INTERFACE: &'static str = "org.PulseAudio.Core1.Device"; + fn append(&self, i: &mut arg::IterAppend) { + (&self.state as &arg::RefArg).append(i); + } + fn get(&mut self, i: &mut arg::Iter) -> Result<(), arg::TypeMismatchError> { + self.state = try!(i.read()); + Ok(()) + } +} + +#[derive(Debug, Default)] +pub struct OrgPulseAudioCore1DeviceActivePortUpdated { + pub port: dbus::Path<'static>, +} + +impl dbus::SignalArgs for OrgPulseAudioCore1DeviceActivePortUpdated { + const NAME: &'static str = "ActivePortUpdated"; + const INTERFACE: &'static str = "org.PulseAudio.Core1.Device"; + fn append(&self, i: &mut arg::IterAppend) { + (&self.port as &arg::RefArg).append(i); + } + fn get(&mut self, i: &mut arg::Iter) -> Result<(), arg::TypeMismatchError> { + self.port = try!(i.read()); + Ok(()) + } +} + +#[derive(Debug, Default)] +pub struct OrgPulseAudioCore1DevicePropertyListUpdated { + pub property_list: ::std::collections::HashMap>, +} + +impl dbus::SignalArgs for OrgPulseAudioCore1DevicePropertyListUpdated { + const NAME: &'static str = "PropertyListUpdated"; + const INTERFACE: &'static str = "org.PulseAudio.Core1.Device"; + fn append(&self, i: &mut arg::IterAppend) { + (&self.property_list as &arg::RefArg).append(i); + } + fn get(&mut self, i: &mut arg::Iter) -> Result<(), arg::TypeMismatchError> { + self.property_list = try!(i.read()); + Ok(()) + } +} + +pub trait OrgPulseAudioCore1Sink { + type Err; + fn get_monitor_source(&self) -> Result, Self::Err>; +} + +impl<'a, C: ::std::ops::Deref> OrgPulseAudioCore1Sink for dbus::ConnPath<'a, C> { + type Err = dbus::Error; + + fn get_monitor_source(&self) -> Result, Self::Err> { + ::get(&self, "org.PulseAudio.Core1.Sink", "MonitorSource") + } +} + +pub fn org_pulse_audio_core1_sink_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> +where + D: tree::DataType, + D::Method: Default, + D::Property: Default, + T: OrgPulseAudioCore1Sink, + F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, +{ + let i = factory.interface("org.PulseAudio.Core1.Sink", data); + let f = ::std::sync::Arc::new(f); + let p = factory.property::("MonitorSource", Default::default()); + let p = p.access(tree::Access::Read); + let fclone = f.clone(); + let p = p.on_get(move |a, pinfo| { + let minfo = pinfo.to_method_info(); + let d = fclone(&minfo); + a.append(try!(d.get_monitor_source())); + Ok(()) + }); + let i = i.add_p(p); + i +} + +pub trait OrgFreedesktopDBusIntrospectable { + type Err; + fn introspect(&self) -> Result; +} + +impl<'a, C: ::std::ops::Deref> OrgFreedesktopDBusIntrospectable for dbus::ConnPath<'a, C> { + type Err = dbus::Error; + + fn introspect(&self) -> Result { + let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Introspectable".into(), &"Introspect".into(), |_| { + })); + try!(m.as_result()); + let mut i = m.iter_init(); + let data: String = try!(i.read()); + Ok(data) + } +} + +pub fn org_freedesktop_dbus_introspectable_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> +where + D: tree::DataType, + D::Method: Default, + T: OrgFreedesktopDBusIntrospectable, + F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, +{ + let i = factory.interface("org.freedesktop.DBus.Introspectable", data); + let f = ::std::sync::Arc::new(f); + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let d = fclone(minfo); + let data = try!(d.introspect()); + let rm = minfo.msg.method_return(); + let rm = rm.append1(data); + Ok(vec!(rm)) + }; + let m = factory.method("Introspect", Default::default(), h); + let m = m.out_arg(("data", "s")); + let i = i.add_m(m); + i +} + +pub trait OrgFreedesktopDBusProperties { + type Err; + fn get(&self, interface_name: &str, property_name: &str) -> Result>, Self::Err>; + fn set(&self, interface_name: &str, property_name: &str, value: arg::Variant>) -> Result<(), Self::Err>; + fn get_all(&self, interface_name: &str) -> Result<::std::collections::HashMap>>, Self::Err>; +} + +impl<'a, C: ::std::ops::Deref> OrgFreedesktopDBusProperties for dbus::ConnPath<'a, C> { + type Err = dbus::Error; + + fn get(&self, interface_name: &str, property_name: &str) -> Result>, Self::Err> { + let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Properties".into(), &"Get".into(), |msg| { + let mut i = arg::IterAppend::new(msg); + i.append(interface_name); + i.append(property_name); + })); + try!(m.as_result()); + let mut i = m.iter_init(); + let value: arg::Variant> = try!(i.read()); + Ok(value) + } + + fn set(&self, interface_name: &str, property_name: &str, value: arg::Variant>) -> Result<(), Self::Err> { + let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Properties".into(), &"Set".into(), |msg| { + let mut i = arg::IterAppend::new(msg); + i.append(interface_name); + i.append(property_name); + i.append(value); + })); + try!(m.as_result()); + Ok(()) + } + + fn get_all(&self, interface_name: &str) -> Result<::std::collections::HashMap>>, Self::Err> { + let mut m = try!(self.method_call_with_args(&"org.freedesktop.DBus.Properties".into(), &"GetAll".into(), |msg| { + let mut i = arg::IterAppend::new(msg); + i.append(interface_name); + })); + try!(m.as_result()); + let mut i = m.iter_init(); + let props: ::std::collections::HashMap>> = try!(i.read()); + Ok(props) + } +} + +pub fn org_freedesktop_dbus_properties_server(factory: &tree::Factory, D>, data: D::Interface, f: F) -> tree::Interface, D> +where + D: tree::DataType, + D::Method: Default, + T: OrgFreedesktopDBusProperties, + F: 'static + for <'z> Fn(& 'z tree::MethodInfo, D>) -> & 'z T, +{ + let i = factory.interface("org.freedesktop.DBus.Properties", data); + let f = ::std::sync::Arc::new(f); + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let mut i = minfo.msg.iter_init(); + let interface_name: &str = try!(i.read()); + let property_name: &str = try!(i.read()); + let d = fclone(minfo); + let value = try!(d.get(interface_name, property_name)); + let rm = minfo.msg.method_return(); + let rm = rm.append1(value); + Ok(vec!(rm)) + }; + let m = factory.method("Get", Default::default(), h); + let m = m.in_arg(("interface_name", "s")); + let m = m.in_arg(("property_name", "s")); + let m = m.out_arg(("value", "v")); + let i = i.add_m(m); + + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let mut i = minfo.msg.iter_init(); + let interface_name: &str = try!(i.read()); + let property_name: &str = try!(i.read()); + let value: arg::Variant> = try!(i.read()); + let d = fclone(minfo); + try!(d.set(interface_name, property_name, value)); + let rm = minfo.msg.method_return(); + Ok(vec!(rm)) + }; + let m = factory.method("Set", Default::default(), h); + let m = m.in_arg(("interface_name", "s")); + let m = m.in_arg(("property_name", "s")); + let m = m.in_arg(("value", "v")); + let i = i.add_m(m); + + let fclone = f.clone(); + let h = move |minfo: &tree::MethodInfo, D>| { + let mut i = minfo.msg.iter_init(); + let interface_name: &str = try!(i.read()); + let d = fclone(minfo); + let props = try!(d.get_all(interface_name)); + let rm = minfo.msg.method_return(); + let rm = rm.append1(props); + Ok(vec!(rm)) + }; + let m = factory.method("GetAll", Default::default(), h); + let m = m.in_arg(("interface_name", "s")); + let m = m.out_arg(("props", "a{sv}")); + let i = i.add_m(m); + i +} diff --git a/src/pa_eq/mod.rs b/src/pa_eq/mod.rs new file mode 100644 index 0000000..f7f1875 --- /dev/null +++ b/src/pa_eq/mod.rs @@ -0,0 +1,112 @@ +mod dbus_api; + +use Filter; +use cli::pa_eq::*; +use utils::*; + +use self::dbus_api::equalizing_manager::OrgPulseAudioExtEqualizing1Manager; +use self::dbus_api::server_lookup::OrgPulseAudioServerLookup1; +use self::dbus_api::sink::OrgPulseAudioExtEqualizing1Equalizer; + +use dbus::{BusType, ConnPath, Connection}; + +use failure::{Error, ResultExt}; + +#[derive(Fail, Debug)] +#[fail(display = "No equalized sink found")] +struct NoEqualizedSink; + +pub fn main(cmd: Command) -> Result<(), Error> { + use cli::pa_eq::Command::*; + + warn!("The PulseAudio equalizer has been deprecated for a while, and is known to sometimes cause crashes, latency or audible artifacts"); + + match cmd { + Load(args) => load(args), + Reset(args) => reset(args), + } +} + +pub fn reset(_args: ResetCli) -> Result<(), Error> { + let conn = connect()?; + let conn_sink = get_equalized_sink(&conn)?; + let filter_rate = conn_sink.get_filter_sample_rate()?; + let filter = Filter { + preamp: 1f64, + frequencies: vec![], + coefficients: vec![], + }.pad(filter_rate); + + send_filter(&conn_sink, filter)?; + + Ok(()) +} + +pub fn load(args: LoadCli) -> Result<(), Error> { + let conn = connect()?; + let conn_sink = get_equalized_sink(&conn)?; + + let filter = read_filter_from_arg(&args.file)?; + + let filter_rate = conn_sink.get_filter_sample_rate()?; + send_filter(&conn_sink, filter.pad(filter_rate))?; + + Ok(()) +} + +fn connect() -> Result { + Ok(connect_impl().context( + "Could not connect to PulseAudio's D-Bus socket. Have you loaded the 'module-dbus-protocol' module?" + )?) +} + +fn connect_impl() -> Result { + let pulse_sock_path = get_pulse_dbus_sock()?; + info!("PulseAudio's D-Bus socket path is: {}", pulse_sock_path); + + trace!("Connecting to PulseAudio's D-Bus socket"); + Ok(Connection::open_private(&pulse_sock_path)?) +} + +fn get_equalized_sink<'a>(conn: &'a Connection) -> Result, Error> { + Ok(get_equalized_sink_impl(conn).context( + "Could not find an equalized sink. Have you loaded the 'module-equalizer-sink' module?", + )?) +} + +fn get_equalized_sink_impl<'a>( + conn: &'a Connection, +) -> Result, Error> { + let conn_manager = conn.with_path("org.PulseAudio.Core1", "/org/pulseaudio/equalizing1", 2000); + + // TODO: make that a command-line option + trace!("Getting (one of) the equalized sink(s)"); + let mut sinks = conn_manager.get_equalized_sinks()?; + let sink_path = sinks.pop().ok_or(NoEqualizedSink {})?; + info!("Using equalized sink: {:?}", sink_path.as_cstr()); + + trace!("Connecting to equalized sink"); + Ok(conn.with_path("org.PulseAudio.Core1", sink_path, 2000)) +} + +fn send_filter(conn_sink: &ConnPath<&Connection>, filter: Filter) -> Result<(), Error> { + let channel = conn_sink.get_nchannels()?; + info!("Using channel: {}", channel); + trace!("Sending filter: {:?}", filter); + conn_sink.seed_filter( + channel, + filter.frequencies, + filter.coefficients.into_iter().map(decibel_to_ratio).collect(), + decibel_to_ratio(filter.preamp), + )?; + Ok(()) +} + +fn get_pulse_dbus_sock() -> Result { + trace!("Connecting to the D-Bus' session bus"); + let conn = Connection::get_private(BusType::Session)?; + let conn = conn.with_path("org.PulseAudio1", "/org/pulseaudio/server_lookup1", 2000); + + trace!("Checking PulseAudio's D-Bus socket path"); + Ok(conn.get_address()?) +} diff --git a/src/utils.rs b/src/utils.rs index d75971a..26facc4 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -26,7 +26,7 @@ pub fn read_filearg_to_str(file: &str) -> Result { let mut buffer = String::new(); if file == "-" { - info!("Reading file from the command line"); + debug!("Reading file from the command line"); let stdin = io::stdin(); let mut handle = stdin.lock(); handle.read_to_string(&mut buffer)?; @@ -38,7 +38,7 @@ pub fn read_filearg_to_str(file: &str) -> Result { } pub fn read_filter_from_arg(file: &str) -> Result { - debug!("Reading filter from '{}' in the EqualizerAPO format", file); + info!("Reading filter from '{}' in the EqualizerAPO format", file); let content = read_filearg_to_str(file)?; parse_filter(&content) } -- cgit v1.2.3