+18
-6
src/app.rs
+18
-6
src/app.rs
···
147
frame_rx: Receiver<minimp3::Frame>,
148
/// [`OsMediaControls`].
149
os_media_controls: Option<OsMediaControls>,
150
}
151
152
impl App {
···
156
frame_rx: Receiver<minimp3::Frame>,
157
mode: CurrentDisplayMode,
158
os_media_controls: Option<OsMediaControls>,
159
) -> Self {
160
let graph = GraphConfig {
161
axis_color: Color::DarkGray,
···
189
channels: source.channels as u8,
190
frame_rx,
191
os_media_controls,
192
}
193
}
194
}
···
439
}
440
441
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)
447
} else {
448
-
Duration::from_millis(0)
449
};
450
451
while event::poll(timeout_duration).unwrap() {
···
147
frame_rx: Receiver<minimp3::Frame>,
148
/// [`OsMediaControls`].
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,
162
}
163
164
impl App {
···
168
frame_rx: Receiver<minimp3::Frame>,
169
mode: CurrentDisplayMode,
170
os_media_controls: Option<OsMediaControls>,
171
+
poll_events_every: Duration,
172
+
poll_events_every_while_paused: Duration,
173
) -> Self {
174
let graph = GraphConfig {
175
axis_color: Color::DarkGray,
···
203
channels: source.channels as u8,
204
frame_rx,
205
os_media_controls,
206
+
poll_events_every,
207
+
poll_events_every_while_paused,
208
}
209
}
210
}
···
455
}
456
457
let timeout_duration = if self.graph.pause {
458
+
self.poll_events_every_while_paused
459
} else {
460
+
self.poll_events_every
461
};
462
463
while event::poll(timeout_duration).unwrap() {
+15
-1
src/main.rs
+15
-1
src/main.rs
···
1
use anyhow::Error;
2
use app::CurrentDisplayMode;
3
use clap::{arg, builder::ValueParser, Command};
···
49
.arg(arg!(<station> "The station to play"))
50
.arg(arg!(--volume "Set the initial volume (as a percent)").default_value("100"))
51
.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())),
53
)
54
.subcommand(
55
Command::new("browse")
···
101
.parse::<CurrentDisplayMode>()
102
.unwrap();
103
let enable_os_media_controls = args.get_one("enable-os-media-controls").unwrap();
104
play::exec(
105
station,
106
provider,
107
volume,
108
display_mode,
109
*enable_os_media_controls,
110
)
111
.await?;
112
}
···
1
+
use std::time::Duration;
2
+
3
use anyhow::Error;
4
use app::CurrentDisplayMode;
5
use clap::{arg, builder::ValueParser, Command};
···
51
.arg(arg!(<station> "The station to play"))
52
.arg(arg!(--volume "Set the initial volume (as a percent)").default_value("100"))
53
.arg(clap::Arg::new("display-mode").long("display-mode").help("Set the display mode to start with").default_value("Spectroscope"))
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")),
57
)
58
.subcommand(
59
Command::new("browse")
···
105
.parse::<CurrentDisplayMode>()
106
.unwrap();
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
+
);
116
play::exec(
117
station,
118
provider,
119
volume,
120
display_mode,
121
*enable_os_media_controls,
122
+
poll_events_every,
123
+
poll_events_every_while_paused,
124
)
125
.await?;
126
}
+11
-1
src/play.rs
+11
-1
src/play.rs
···
18
volume: f32,
19
display_mode: CurrentDisplayMode,
20
enable_os_media_controls: bool,
21
) -> Result<(), Error> {
22
let _provider = provider;
23
let provider: Box<dyn Provider> = match provider {
···
72
None
73
};
74
75
-
let mut app = App::new(&ui, &opts, frame_rx, display_mode, os_media_controls);
76
let station_name = station.name.clone();
77
78
thread::spawn(move || {
···
18
volume: f32,
19
display_mode: CurrentDisplayMode,
20
enable_os_media_controls: bool,
21
+
poll_events_every: Duration,
22
+
poll_events_every_while_paused: Duration,
23
) -> Result<(), Error> {
24
let _provider = provider;
25
let provider: Box<dyn Provider> = match provider {
···
74
None
75
};
76
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
+
);
86
let station_name = station.name.clone();
87
88
thread::spawn(move || {