Browse and listen to thousands of radio stations across the globe right from your terminal ๐ŸŒŽ ๐Ÿ“ป ๐ŸŽตโœจ
radio rust tokio web-radio command-line-tool tui

main: cli: play: --poll-events-every & --poll-events-every-while-paused

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.

Changed files
+44 -8
src
+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
··· 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
··· 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 || {