summaryrefslogtreecommitdiffstats
path: root/src/pa_eq/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/pa_eq/mod.rs')
-rw-r--r--src/pa_eq/mod.rs115
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 @@
1mod dbus_api;
2
3use crate::cli::pa_eq::*;
4use crate::utils::*;
5use crate::Filter;
6
7use self::dbus_api::equalizing_manager::OrgPulseAudioExtEqualizing1Manager;
8use self::dbus_api::server_lookup::OrgPulseAudioServerLookup1;
9use self::dbus_api::sink::OrgPulseAudioExtEqualizing1Equalizer;
10
11use dbus::{BusType, ConnPath, Connection};
12
13use failure::{Error, ResultExt};
14
15#[derive(Fail, Debug)]
16#[fail(display = "No equalized sink found")]
17struct NoEqualizedSink;
18
19pub 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
30pub 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
46pub 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
58fn 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
64fn 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
72fn 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
78fn 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
91fn 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
108fn 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}