diff options
Diffstat (limited to 'src/pa_eq/mod.rs')
-rw-r--r-- | src/pa_eq/mod.rs | 115 |
1 files changed, 0 insertions, 115 deletions
diff --git a/src/pa_eq/mod.rs b/src/pa_eq/mod.rs deleted file mode 100644 index 09b2039..0000000 --- a/src/pa_eq/mod.rs +++ /dev/null | |||
@@ -1,115 +0,0 @@ | |||
1 | mod dbus_api; | ||
2 | |||
3 | use crate::cli::pa_eq::*; | ||
4 | use crate::utils::*; | ||
5 | use crate::Filter; | ||
6 | |||
7 | use self::dbus_api::equalizing_manager::OrgPulseAudioExtEqualizing1Manager; | ||
8 | use self::dbus_api::server_lookup::OrgPulseAudioServerLookup1; | ||
9 | use self::dbus_api::sink::OrgPulseAudioExtEqualizing1Equalizer; | ||
10 | |||
11 | use dbus::{BusType, ConnPath, Connection}; | ||
12 | |||
13 | use failure::{Error, ResultExt}; | ||
14 | |||
15 | #[derive(Fail, Debug)] | ||
16 | #[fail(display = "No equalized sink found")] | ||
17 | struct NoEqualizedSink; | ||
18 | |||
19 | pub fn main(cmd: Command) -> Result<(), Error> { | ||
20 | use crate::cli::pa_eq::Command::*; | ||
21 | |||
22 | warn!("The PulseAudio equalizer has been deprecated for a while, and is known to sometimes cause crashes, latency or audible artifacts"); | ||
23 | |||
24 | match cmd { | ||
25 | Load(args) => load(args), | ||
26 | Reset(args) => reset(args), | ||
27 | } | ||
28 | } | ||
29 | |||
30 | pub fn reset(_args: ResetCli) -> Result<(), Error> { | ||
31 | let conn = connect()?; | ||
32 | let conn_sink = get_equalized_sink(&conn)?; | ||
33 | let filter_rate = conn_sink.get_filter_sample_rate()?; | ||
34 | let filter = Filter { | ||
35 | preamp: 1f64, | ||
36 | frequencies: vec![], | ||
37 | coefficients: vec![], | ||
38 | } | ||
39 | .pad(filter_rate); | ||
40 | |||
41 | send_filter(&conn_sink, filter)?; | ||
42 | |||
43 | Ok(()) | ||
44 | } | ||
45 | |||
46 | pub fn load(args: LoadCli) -> Result<(), Error> { | ||
47 | let conn = connect()?; | ||
48 | let conn_sink = get_equalized_sink(&conn)?; | ||
49 | |||
50 | let filter = read_filter_from_arg(&args.file)?; | ||
51 | |||
52 | let filter_rate = conn_sink.get_filter_sample_rate()?; | ||
53 | send_filter(&conn_sink, filter.pad(filter_rate))?; | ||
54 | |||
55 | Ok(()) | ||
56 | } | ||
57 | |||
58 | fn connect() -> Result<Connection, Error> { | ||
59 | Ok(connect_impl().context( | ||
60 | "Could not connect to PulseAudio's D-Bus socket. Have you loaded the 'module-dbus-protocol' module?" | ||
61 | )?) | ||
62 | } | ||
63 | |||
64 | fn connect_impl() -> Result<Connection, Error> { | ||
65 | let pulse_sock_path = get_pulse_dbus_sock()?; | ||
66 | info!("PulseAudio's D-Bus socket path is: {}", pulse_sock_path); | ||
67 | |||
68 | trace!("Connecting to PulseAudio's D-Bus socket"); | ||
69 | Ok(Connection::open_private(&pulse_sock_path)?) | ||
70 | } | ||
71 | |||
72 | fn get_equalized_sink(conn: &Connection) -> Result<ConnPath<'_, &Connection>, Error> { | ||
73 | Ok(get_equalized_sink_impl(conn).context( | ||
74 | "Could not find an equalized sink. Have you loaded the 'module-equalizer-sink' module?", | ||
75 | )?) | ||
76 | } | ||
77 | |||
78 | fn get_equalized_sink_impl(conn: &Connection) -> Result<ConnPath<'_, &Connection>, Error> { | ||
79 | let conn_manager = conn.with_path("org.PulseAudio.Core1", "/org/pulseaudio/equalizing1", 2000); | ||
80 | |||
81 | // TODO: make that a command-line option | ||
82 | trace!("Getting (one of) the equalized sink(s)"); | ||
83 | let mut sinks = conn_manager.get_equalized_sinks()?; | ||
84 | let sink_path = sinks.pop().ok_or(NoEqualizedSink {})?; | ||
85 | info!("Using equalized sink: {:?}", sink_path.as_cstr()); | ||
86 | |||
87 | trace!("Connecting to equalized sink"); | ||
88 | Ok(conn.with_path("org.PulseAudio.Core1", sink_path, 2000)) | ||
89 | } | ||
90 | |||
91 | fn send_filter(conn_sink: &ConnPath<'_, &Connection>, filter: Filter) -> Result<(), Error> { | ||
92 | let channel = conn_sink.get_nchannels()?; | ||
93 | info!("Using channel: {}", channel); | ||
94 | trace!("Sending filter: {:?}", filter); | ||
95 | conn_sink.seed_filter( | ||
96 | channel, | ||
97 | filter.frequencies, | ||
98 | filter | ||
99 | .coefficients | ||
100 | .into_iter() | ||
101 | .map(decibel_to_ratio) | ||
102 | .collect(), | ||
103 | decibel_to_ratio(filter.preamp), | ||
104 | )?; | ||
105 | Ok(()) | ||
106 | } | ||
107 | |||
108 | fn get_pulse_dbus_sock() -> Result<String, Error> { | ||
109 | trace!("Connecting to the D-Bus' session bus"); | ||
110 | let conn = Connection::get_private(BusType::Session)?; | ||
111 | let conn = conn.with_path("org.PulseAudio1", "/org/pulseaudio/server_lookup1", 2000); | ||
112 | |||
113 | trace!("Checking PulseAudio's D-Bus socket path"); | ||
114 | Ok(conn.get_address()?) | ||
115 | } | ||