diff options
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 132 |
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 @@ | |||
1 | extern crate dbus; | ||
2 | |||
3 | #[macro_use] | ||
4 | extern crate log; | ||
5 | #[macro_use] | ||
6 | extern crate failure; | ||
7 | |||
8 | extern crate clap; | ||
9 | extern crate clap_log_flag; | ||
10 | extern crate clap_verbosity_flag; | ||
11 | extern crate structopt; | ||
12 | |||
13 | use structopt::StructOpt; | ||
14 | |||
15 | use failure::Error; | ||
16 | |||
17 | //use dbus::stdintf::org_freedesktop_dbus::Properties; | ||
18 | use dbus::Connection; | ||
19 | |||
20 | use dbus_api::sink::OrgPulseAudioExtEqualizing1Equalizer; | ||
21 | |||
22 | mod dbus_api; | ||
23 | mod parsing; | ||
24 | mod utils; | ||
25 | |||
26 | use utils::*; | ||
27 | |||
28 | #[derive(StructOpt, Debug)] | ||
29 | enum Command { | ||
30 | #[structopt(name = "load")] | ||
31 | Load(LoadCli), | ||
32 | #[structopt(name = "reset")] | ||
33 | Reset(ResetCli), | ||
34 | } | ||
35 | |||
36 | #[derive(StructOpt, Debug)] | ||
37 | struct LoadCli { | ||
38 | } | ||
39 | |||
40 | #[derive(StructOpt, Debug)] | ||
41 | struct ResetCli { | ||
42 | } | ||
43 | |||
44 | #[derive(StructOpt, Debug)] | ||
45 | struct 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")] | ||
56 | struct NoEqualizedSink; | ||
57 | |||
58 | #[derive(Debug)] | ||
59 | pub struct Filter { | ||
60 | preamp: f64, | ||
61 | frequencies: Vec<u32>, | ||
62 | coefficients: Vec<f64>, | ||
63 | } | ||
64 | |||
65 | impl 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 | |||
83 | fn 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 | |||
95 | fn 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 | |||
110 | fn 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 | /* | ||
121 | fn 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 | */ | ||