diff options
-rw-r--r-- | src/main.rs | 96 | ||||
-rw-r--r-- | src/utils.rs | 26 |
2 files changed, 79 insertions, 43 deletions
diff --git a/src/main.rs b/src/main.rs index 10c9434..171fe3c 100644 --- a/src/main.rs +++ b/src/main.rs | |||
@@ -5,51 +5,80 @@ extern crate log; | |||
5 | #[macro_use] | 5 | #[macro_use] |
6 | extern crate failure; | 6 | extern crate failure; |
7 | 7 | ||
8 | #[macro_use] | ||
8 | extern crate clap; | 9 | extern crate clap; |
9 | extern crate clap_log_flag; | 10 | extern crate clap_log_flag; |
10 | extern crate clap_verbosity_flag; | 11 | extern crate clap_verbosity_flag; |
11 | extern crate structopt; | 12 | extern crate structopt; |
12 | 13 | ||
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; | 14 | mod dbus_api; |
23 | mod parsing; | 15 | mod parsing; |
24 | mod utils; | 16 | mod utils; |
25 | 17 | ||
26 | use utils::*; | 18 | use utils::*; |
27 | 19 | ||
20 | use dbus_api::sink::OrgPulseAudioExtEqualizing1Equalizer; | ||
21 | use failure::Error; | ||
22 | use structopt::StructOpt; | ||
23 | |||
24 | use std::fs::File; | ||
25 | use std::io; | ||
26 | |||
27 | #[derive(StructOpt, Debug)] | ||
28 | #[structopt(raw(setting = "structopt::clap::AppSettings::ColoredHelp"))] | ||
29 | /// Hello World! How are you doing? | ||
30 | struct Cli { | ||
31 | #[structopt(flatten)] | ||
32 | verbose: clap_verbosity_flag::Verbosity, | ||
33 | #[structopt(flatten)] | ||
34 | log: clap_log_flag::Log, | ||
35 | #[structopt(short = "s")] | ||
36 | /// Use the given sink. | ||
37 | /// | ||
38 | /// By default it will use the last equalized sink it finds | ||
39 | sink: Option<String>, | ||
40 | #[structopt(subcommand)] | ||
41 | cmd: Command, | ||
42 | } | ||
43 | |||
28 | #[derive(StructOpt, Debug)] | 44 | #[derive(StructOpt, Debug)] |
29 | enum Command { | 45 | enum Command { |
30 | #[structopt(name = "load")] | 46 | #[structopt(name = "load",)] |
47 | /// Load and switch to a given equalizer configuration | ||
31 | Load(LoadCli), | 48 | Load(LoadCli), |
32 | #[structopt(name = "reset")] | 49 | #[structopt(name = "reset")] |
50 | /// Switch to a neutral equalizer | ||
33 | Reset(ResetCli), | 51 | Reset(ResetCli), |
34 | } | 52 | } |
35 | 53 | ||
36 | #[derive(StructOpt, Debug)] | 54 | #[derive(StructOpt, Debug)] |
37 | struct LoadCli { | 55 | struct LoadCli { |
56 | #[structopt(default_value = "-")] | ||
57 | /// The file from which to load the equalizer configuration | ||
58 | /// | ||
59 | /// If "-" is given, read the configuration from the command-line. | ||
60 | file: String, | ||
61 | #[structopt( | ||
62 | short = "f", | ||
63 | raw( | ||
64 | possible_values = "&EqualizerConfFormat::variants()", | ||
65 | case_insensitive = "true" | ||
66 | ), | ||
67 | default_value = "EqualizerAPO" | ||
68 | )] | ||
69 | /// The file format of the equalizer configuration | ||
70 | format: EqualizerConfFormat, | ||
38 | } | 71 | } |
39 | 72 | ||
40 | #[derive(StructOpt, Debug)] | 73 | arg_enum! { |
41 | struct ResetCli { | 74 | #[derive(Debug)] |
75 | enum EqualizerConfFormat { | ||
76 | EqualizerAPO | ||
77 | } | ||
42 | } | 78 | } |
43 | 79 | ||
44 | #[derive(StructOpt, Debug)] | 80 | #[derive(StructOpt, Debug)] |
45 | struct Cli { | 81 | struct ResetCli {} |
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 | 82 | ||
54 | #[derive(Fail, Debug)] | 83 | #[derive(Fail, Debug)] |
55 | #[fail(display = "No equalized sink found")] | 84 | #[fail(display = "No equalized sink found")] |
@@ -88,7 +117,7 @@ fn main() -> Result<(), Error> { | |||
88 | 117 | ||
89 | match args.cmd { | 118 | match args.cmd { |
90 | Load(args) => load(args), | 119 | Load(args) => load(args), |
91 | Reset(args)=> reset(args), | 120 | Reset(args) => reset(args), |
92 | } | 121 | } |
93 | } | 122 | } |
94 | 123 | ||
@@ -110,23 +139,18 @@ fn reset(args: ResetCli) -> Result<(), Error> { | |||
110 | fn load(args: LoadCli) -> Result<(), Error> { | 139 | fn load(args: LoadCli) -> Result<(), Error> { |
111 | let conn = connect()?; | 140 | let conn = connect()?; |
112 | let conn_sink = get_equalized_sink(&conn)?; | 141 | let conn_sink = get_equalized_sink(&conn)?; |
113 | let filter = read_filter()?; | 142 | |
143 | let filter = if args.file == "-" { | ||
144 | let stdin = io::stdin(); | ||
145 | let mut lock = stdin.lock(); | ||
146 | read_filter(&mut lock)? | ||
147 | } else { | ||
148 | let mut file = File::open(args.file)?; | ||
149 | read_filter(&mut file)? | ||
150 | }; | ||
151 | |||
114 | let filter_rate = conn_sink.get_filter_sample_rate()?; | 152 | let filter_rate = conn_sink.get_filter_sample_rate()?; |
115 | send_filter(&conn_sink, filter.pad(filter_rate))?; | 153 | send_filter(&conn_sink, filter.pad(filter_rate))?; |
116 | 154 | ||
117 | Ok(()) | 155 | Ok(()) |
118 | } | 156 | } |
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 | */ | ||
diff --git a/src/utils.rs b/src/utils.rs index 5aae29d..6d7ae58 100644 --- a/src/utils.rs +++ b/src/utils.rs | |||
@@ -9,7 +9,7 @@ use ::dbus_api::sink::OrgPulseAudioExtEqualizing1Equalizer; | |||
9 | use dbus::{BusType, Connection, ConnPath}; | 9 | use dbus::{BusType, Connection, ConnPath}; |
10 | use failure::{Error, ResultExt}; | 10 | use failure::{Error, ResultExt}; |
11 | 11 | ||
12 | use std::io::{self, Read}; | 12 | use std::io; |
13 | 13 | ||
14 | pub fn connect() -> Result<Connection, Error> { | 14 | pub fn connect() -> Result<Connection, Error> { |
15 | let pulse_sock_path = | 15 | let pulse_sock_path = |
@@ -36,7 +36,7 @@ pub fn get_equalized_sink<'a>(conn: &'a Connection) -> Result<ConnPath<'a, &'a C | |||
36 | pub fn send_filter(conn_sink: &ConnPath<&Connection>, filter: Filter) -> Result<(), Error> { | 36 | pub fn send_filter(conn_sink: &ConnPath<&Connection>, filter: Filter) -> Result<(), Error> { |
37 | let channel = conn_sink.get_nchannels()?; | 37 | let channel = conn_sink.get_nchannels()?; |
38 | info!("Using channel: {}", channel); | 38 | info!("Using channel: {}", channel); |
39 | trace!("Sending filter"); | 39 | trace!("Sending filter: {:?}", filter); |
40 | conn_sink.seed_filter( | 40 | conn_sink.seed_filter( |
41 | channel, | 41 | channel, |
42 | filter.frequencies, | 42 | filter.frequencies, |
@@ -46,17 +46,15 @@ pub fn send_filter(conn_sink: &ConnPath<&Connection>, filter: Filter) -> Result< | |||
46 | Ok(()) | 46 | Ok(()) |
47 | } | 47 | } |
48 | 48 | ||
49 | pub fn read_filter() -> Result<Filter, Error> { | 49 | pub fn read_filter(file: &mut impl io::Read) -> Result<Filter, Error> { |
50 | let mut buffer = String::new(); | 50 | let mut buffer = String::new(); |
51 | let stdin = io::stdin(); | ||
52 | let mut handle = stdin.lock(); | ||
53 | 51 | ||
54 | info!("Reading filter in GraphicEQ format from the command line"); | 52 | info!("Reading filter in GraphicEQ format from the command line"); |
55 | handle.read_to_string(&mut buffer)?; | 53 | file.read_to_string(&mut buffer)?; |
56 | 54 | ||
57 | // TODO: lifetime issue when "throwing" parse error | 55 | // TODO: lifetime issue when "throwing" parse error |
58 | let filter = EqualizerApoParser::new().parse(&buffer).unwrap(); | 56 | let filter = EqualizerApoParser::new().parse(&buffer).unwrap(); |
59 | info!("Parsed filter: {:?}", filter); | 57 | trace!("Parsed filter: {:?}", filter); |
60 | 58 | ||
61 | Ok(filter) | 59 | Ok(filter) |
62 | } | 60 | } |
@@ -69,3 +67,17 @@ fn get_pulse_dbus_sock() -> Result<String, Error> { | |||
69 | trace!("Checking PulseAudio's D-Bus socket path"); | 67 | trace!("Checking PulseAudio's D-Bus socket path"); |
70 | Ok(conn.get_address()?) | 68 | Ok(conn.get_address()?) |
71 | } | 69 | } |
70 | |||
71 | /* | ||
72 | fn introspect(conn: &dbus::ConnPath<&Connection>) { | ||
73 | let mut thing = conn | ||
74 | .method_call_with_args( | ||
75 | &"org.freedesktop.DBus.Introspectable".into(), | ||
76 | &"Introspect".into(), | ||
77 | |_| {}, | ||
78 | ).unwrap(); | ||
79 | thing.as_result().unwrap(); | ||
80 | |||
81 | println!("{}", thing.iter_init().read::<String>().unwrap()); | ||
82 | } | ||
83 | */ | ||