Allow user to decide how often events are polled. This helps reduce resource consumption while still providing smooth playback and user decides which one they prefer.
···147147 frame_rx: Receiver<minimp3::Frame>,
148148 /// [`OsMediaControls`].
149149 os_media_controls: Option<OsMediaControls>,
150150+ /// Poll for events every specified [`Duration`].
151151+ ///
152152+ /// Allows user to decide the trade off between computational
153153+ /// resource comsumption, animation smoothness and how responsive
154154+ /// the application. Smaller durations lead to more resource
155155+ /// consumption but smoother animations and better responsiveness.
156156+ poll_events_every: Duration,
157157+ /// [`Self::poll_events_every`] but when player is paused.
158158+ ///
159159+ /// This should generally be larger than
160160+ /// [`Self::poll_events_every`].
161161+ poll_events_every_while_paused: Duration,
150162}
151163152164impl App {
···156168 frame_rx: Receiver<minimp3::Frame>,
157169 mode: CurrentDisplayMode,
158170 os_media_controls: Option<OsMediaControls>,
171171+ poll_events_every: Duration,
172172+ poll_events_every_while_paused: Duration,
159173 ) -> Self {
160174 let graph = GraphConfig {
161175 axis_color: Color::DarkGray,
···189203 channels: source.channels as u8,
190204 frame_rx,
191205 os_media_controls,
206206+ poll_events_every,
207207+ poll_events_every_while_paused,
192208 }
193209 }
194210}
···439455 }
440456441457 let timeout_duration = if self.graph.pause {
442442- // reduce checks to only every 100 milliseconds (~10
443443- // times a second). This helps reduce spinning of the
444444- // thread and thus consuming a lot of resources while
445445- // allowing for event handling at a decent rate.
446446- Duration::from_millis(100)
458458+ self.poll_events_every_while_paused
447459 } else {
448448- Duration::from_millis(0)
460460+ self.poll_events_every
449461 };
450462451463 while event::poll(timeout_duration).unwrap() {
+15-1
src/main.rs
···11+use std::time::Duration;
22+13use anyhow::Error;
24use app::CurrentDisplayMode;
35use clap::{arg, builder::ValueParser, Command};
···4951 .arg(arg!(<station> "The station to play"))
5052 .arg(arg!(--volume "Set the initial volume (as a percent)").default_value("100"))
5153 .arg(clap::Arg::new("display-mode").long("display-mode").help("Set the display mode to start with").default_value("Spectroscope"))
5252- .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())),
5454+ .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()))
5555+ .arg(clap::Arg::new("poll-events-every").long("poll-events-every").help("Poll for events every specified milliseconds.").default_value("16"))
5656+ .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")),
5357 )
5458 .subcommand(
5559 Command::new("browse")
···101105 .parse::<CurrentDisplayMode>()
102106 .unwrap();
103107 let enable_os_media_controls = args.get_one("enable-os-media-controls").unwrap();
108108+ let poll_events_every =
109109+ Duration::from_millis(args.value_of("poll-events-every").unwrap().parse().unwrap());
110110+ let poll_events_every_while_paused = Duration::from_millis(
111111+ args.value_of("poll-events-every-while-paused")
112112+ .unwrap()
113113+ .parse()
114114+ .unwrap(),
115115+ );
104116 play::exec(
105117 station,
106118 provider,
107119 volume,
108120 display_mode,
109121 *enable_os_media_controls,
122122+ poll_events_every,
123123+ poll_events_every_while_paused,
110124 )
111125 .await?;
112126 }