summaryrefslogtreecommitdiffstats
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs132
1 files changed, 132 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..10c9434
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,132 @@
1extern crate dbus;
2
3#[macro_use]
4extern crate log;
5#[macro_use]
6extern crate failure;
7
8extern crate clap;
9extern crate clap_log_flag;
10extern crate clap_verbosity_flag;
11extern crate structopt;
12
13use structopt::StructOpt;
14
15use failure::Error;
16
17//use dbus::stdintf::org_freedesktop_dbus::Properties;
18use dbus::Connection;
19
20use dbus_api::sink::OrgPulseAudioExtEqualizing1Equalizer;
21
22mod dbus_api;
23mod parsing;
24mod utils;
25
26use utils::*;
27
28#[derive(StructOpt, Debug)]
29enum Command {
30 #[structopt(name = "load")]
31 Load(LoadCli),
32 #[structopt(name = "reset")]
33 Reset(ResetCli),
34}
35
36#[derive(StructOpt, Debug)]
37struct LoadCli {
38}
39
40#[derive(StructOpt, Debug)]
41struct ResetCli {
42}
43
44#[derive(StructOpt, Debug)]
45struct Cli {
46 #[structopt(flatten)]
47 verbose: clap_verbosity_flag::Verbosity,
48 #[structopt(flatten)]
49 log: clap_log_flag::Log,
50 #[structopt(subcommand)]
51 cmd: Command,
52}
53
54#[derive(Fail, Debug)]
55#[fail(display = "No equalized sink found")]
56struct NoEqualizedSink;
57
58#[derive(Debug)]
59pub struct Filter {
60 preamp: f64,
61 frequencies: Vec<u32>,
62 coefficients: Vec<f64>,
63}
64
65impl Filter {
66 fn pad(self, filter_rate: u32) -> Self {
67 Filter {
68 preamp: self.preamp,
69 frequencies: vec![0u32]
70 .into_iter()
71 .chain(self.frequencies.into_iter())
72 .chain(vec![filter_rate / 2u32])
73 .collect(),
74 coefficients: vec![1f64]
75 .into_iter()
76 .chain(self.coefficients.into_iter())
77 .chain(vec![1f64])
78 .collect(),
79 }
80 }
81}
82
83fn main() -> Result<(), Error> {
84 let args = Cli::from_args();
85 args.log.log_all(args.verbose.log_level())?;
86
87 use Command::*;
88
89 match args.cmd {
90 Load(args) => load(args),
91 Reset(args)=> reset(args),
92 }
93}
94
95fn reset(args: ResetCli) -> Result<(), Error> {
96 let conn = connect()?;
97 let conn_sink = get_equalized_sink(&conn)?;
98 let filter_rate = conn_sink.get_filter_sample_rate()?;
99 let filter = Filter {
100 preamp: 1f64,
101 frequencies: vec![],
102 coefficients: vec![],
103 }.pad(filter_rate);
104
105 send_filter(&conn_sink, filter)?;
106
107 Ok(())
108}
109
110fn load(args: LoadCli) -> Result<(), Error> {
111 let conn = connect()?;
112 let conn_sink = get_equalized_sink(&conn)?;
113 let filter = read_filter()?;
114 let filter_rate = conn_sink.get_filter_sample_rate()?;
115 send_filter(&conn_sink, filter.pad(filter_rate))?;
116
117 Ok(())
118}
119
120/*
121fn introspect(conn: &dbus::ConnPath<&Connection>) {
122 let mut thing = conn
123 .method_call_with_args(
124 &"org.freedesktop.DBus.Introspectable".into(),
125 &"Introspect".into(),
126 |_| {},
127 ).unwrap();
128 thing.as_result().unwrap();
129
130 println!("{}", thing.iter_init().read::<String>().unwrap());
131}
132*/