summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMinijackson <minijackson@riseup.net>2018-09-02 18:17:31 +0200
committerMinijackson <minijackson@riseup.net>2018-09-02 18:17:31 +0200
commita903881e79f30f73d0008f88c4b245defbe5b5c1 (patch)
treeac9562bc5bf3474c9e840be57443efd036ddb2a7 /src
parentd575adf63b7e87196b636ee91061692a685b605f (diff)
downloadset_eq-a903881e79f30f73d0008f88c4b245defbe5b5c1.tar.gz
set_eq-a903881e79f30f73d0008f88c4b245defbe5b5c1.zip
Better command-line
Diffstat (limited to 'src')
-rw-r--r--src/main.rs96
-rw-r--r--src/utils.rs26
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]
6extern crate failure; 6extern crate failure;
7 7
8#[macro_use]
8extern crate clap; 9extern crate clap;
9extern crate clap_log_flag; 10extern crate clap_log_flag;
10extern crate clap_verbosity_flag; 11extern crate clap_verbosity_flag;
11extern crate structopt; 12extern crate structopt;
12 13
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; 14mod dbus_api;
23mod parsing; 15mod parsing;
24mod utils; 16mod utils;
25 17
26use utils::*; 18use utils::*;
27 19
20use dbus_api::sink::OrgPulseAudioExtEqualizing1Equalizer;
21use failure::Error;
22use structopt::StructOpt;
23
24use std::fs::File;
25use std::io;
26
27#[derive(StructOpt, Debug)]
28#[structopt(raw(setting = "structopt::clap::AppSettings::ColoredHelp"))]
29/// Hello World! How are you doing?
30struct 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)]
29enum Command { 45enum 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)]
37struct LoadCli { 55struct 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)] 73arg_enum! {
41struct ResetCli { 74 #[derive(Debug)]
75 enum EqualizerConfFormat {
76 EqualizerAPO
77 }
42} 78}
43 79
44#[derive(StructOpt, Debug)] 80#[derive(StructOpt, Debug)]
45struct Cli { 81struct 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> {
110fn load(args: LoadCli) -> Result<(), Error> { 139fn 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/*
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*/
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;
9use dbus::{BusType, Connection, ConnPath}; 9use dbus::{BusType, Connection, ConnPath};
10use failure::{Error, ResultExt}; 10use failure::{Error, ResultExt};
11 11
12use std::io::{self, Read}; 12use std::io;
13 13
14pub fn connect() -> Result<Connection, Error> { 14pub 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
36pub fn send_filter(conn_sink: &ConnPath<&Connection>, filter: Filter) -> Result<(), Error> { 36pub 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
49pub fn read_filter() -> Result<Filter, Error> { 49pub 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/*
72fn 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*/