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 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
··· 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
··· 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 || {