+18
-6
src/app.rs
+18
-6
src/app.rs
···
147
147
frame_rx: Receiver<minimp3::Frame>,
148
148
/// [`OsMediaControls`].
149
149
os_media_controls: Option<OsMediaControls>,
150
+
/// Poll for events every specified [`Duration`].
151
+
///
152
+
/// Allows user to decide the trade off between computational
153
+
/// resource comsumption, animation smoothness and how responsive
154
+
/// the application. Smaller durations lead to more resource
155
+
/// consumption but smoother animations and better responsiveness.
156
+
poll_events_every: Duration,
157
+
/// [`Self::poll_events_every`] but when player is paused.
158
+
///
159
+
/// This should generally be larger than
160
+
/// [`Self::poll_events_every`].
161
+
poll_events_every_while_paused: Duration,
150
162
}
151
163
152
164
impl App {
···
156
168
frame_rx: Receiver<minimp3::Frame>,
157
169
mode: CurrentDisplayMode,
158
170
os_media_controls: Option<OsMediaControls>,
171
+
poll_events_every: Duration,
172
+
poll_events_every_while_paused: Duration,
159
173
) -> Self {
160
174
let graph = GraphConfig {
161
175
axis_color: Color::DarkGray,
···
189
203
channels: source.channels as u8,
190
204
frame_rx,
191
205
os_media_controls,
206
+
poll_events_every,
207
+
poll_events_every_while_paused,
192
208
}
193
209
}
194
210
}
···
439
455
}
440
456
441
457
let timeout_duration = if self.graph.pause {
442
-
// reduce checks to only every 100 milliseconds (~10
443
-
// times a second). This helps reduce spinning of the
444
-
// thread and thus consuming a lot of resources while
445
-
// allowing for event handling at a decent rate.
446
-
Duration::from_millis(100)
458
+
self.poll_events_every_while_paused
447
459
} else {
448
-
Duration::from_millis(0)
460
+
self.poll_events_every
449
461
};
450
462
451
463
while event::poll(timeout_duration).unwrap() {
+15
-1
src/main.rs
+15
-1
src/main.rs
···
1
+
use std::time::Duration;
2
+
1
3
use anyhow::Error;
2
4
use app::CurrentDisplayMode;
3
5
use clap::{arg, builder::ValueParser, Command};
···
49
51
.arg(arg!(<station> "The station to play"))
50
52
.arg(arg!(--volume "Set the initial volume (as a percent)").default_value("100"))
51
53
.arg(clap::Arg::new("display-mode").long("display-mode").help("Set the display mode to start with").default_value("Spectroscope"))
52
-
.arg(clap::Arg::new("enable-os-media-controls").long("enable-os-media-controls").help("Should enable OS media controls?").default_value("true").value_parser(ValueParser::bool())),
54
+
.arg(clap::Arg::new("enable-os-media-controls").long("enable-os-media-controls").help("Should enable OS media controls?").default_value("true").value_parser(ValueParser::bool()))
55
+
.arg(clap::Arg::new("poll-events-every").long("poll-events-every").help("Poll for events every specified milliseconds.").default_value("16"))
56
+
.arg(clap::Arg::new("poll-events-every-while-paused").long("poll-events-every-while-paused").help("Poll for events every specified milliseconds while player is paused.").default_value("100")),
53
57
)
54
58
.subcommand(
55
59
Command::new("browse")
···
101
105
.parse::<CurrentDisplayMode>()
102
106
.unwrap();
103
107
let enable_os_media_controls = args.get_one("enable-os-media-controls").unwrap();
108
+
let poll_events_every =
109
+
Duration::from_millis(args.value_of("poll-events-every").unwrap().parse().unwrap());
110
+
let poll_events_every_while_paused = Duration::from_millis(
111
+
args.value_of("poll-events-every-while-paused")
112
+
.unwrap()
113
+
.parse()
114
+
.unwrap(),
115
+
);
104
116
play::exec(
105
117
station,
106
118
provider,
107
119
volume,
108
120
display_mode,
109
121
*enable_os_media_controls,
122
+
poll_events_every,
123
+
poll_events_every_while_paused,
110
124
)
111
125
.await?;
112
126
}
+11
-1
src/play.rs
+11
-1
src/play.rs
···
18
18
volume: f32,
19
19
display_mode: CurrentDisplayMode,
20
20
enable_os_media_controls: bool,
21
+
poll_events_every: Duration,
22
+
poll_events_every_while_paused: Duration,
21
23
) -> Result<(), Error> {
22
24
let _provider = provider;
23
25
let provider: Box<dyn Provider> = match provider {
···
72
74
None
73
75
};
74
76
75
-
let mut app = App::new(&ui, &opts, frame_rx, display_mode, os_media_controls);
77
+
let mut app = App::new(
78
+
&ui,
79
+
&opts,
80
+
frame_rx,
81
+
display_mode,
82
+
os_media_controls,
83
+
poll_events_every,
84
+
poll_events_every_while_paused,
85
+
);
76
86
let station_name = station.name.clone();
77
87
78
88
thread::spawn(move || {