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

play: SinkCommand: SetVolume

Allow user to set volume.

Changed files
+70 -9
src
+63 -8
src/app.rs
··· 30 pub genre: String, 31 pub description: String, 32 pub br: String, 33 } 34 35 /// Volume of the player. ··· 52 if self.is_muted { 53 0.0 54 } else { 55 - 1.0 56 } 57 } 58 ··· 229 }, 230 frame, 231 ); 232 } 233 234 fn render_line(label: &str, value: &str, area: Rect, frame: &mut Frame) { ··· 327 let event = event::read().unwrap(); 328 329 if self 330 - .process_events(event.clone(), &mut sink_cmd_tx) 331 .unwrap() 332 { 333 return; ··· 356 fn process_events( 357 &mut self, 358 event: Event, 359 sink_cmd_tx: &mut UnboundedSender<SinkCommand>, 360 ) -> Result<bool, io::Error> { 361 let mut quit = false; 362 if let Event::Key(key) = event { 363 if let KeyModifiers::CONTROL = key.modifiers { 364 match key.code { ··· 374 _ => 1.0, 375 }; 376 match key.code { 377 - KeyCode::Up => update_value_f(&mut self.graph.scale, 0.01, magnitude, 0.0..10.0), // inverted to act as zoom 378 - KeyCode::Down => update_value_f(&mut self.graph.scale, -0.01, magnitude, 0.0..10.0), // inverted to act as zoom 379 KeyCode::Right => update_value_i( 380 &mut self.graph.samples, 381 true, ··· 403 KeyCode::Char('s') => self.graph.scatter = !self.graph.scatter, 404 KeyCode::Char('h') => self.graph.show_ui = !self.graph.show_ui, 405 KeyCode::Char('r') => self.graph.references = !self.graph.references, 406 KeyCode::Esc => { 407 self.graph.samples = self.graph.width; 408 self.graph.scale = 1.; ··· 449 MediaKeyCode::Stop => { 450 quit = true; 451 } 452 - MediaKeyCode::LowerVolume 453 - | MediaKeyCode::RaiseVolume 454 - | MediaKeyCode::MuteVolume 455 - | MediaKeyCode::TrackNext 456 | MediaKeyCode::TrackPrevious 457 | MediaKeyCode::Reverse 458 | MediaKeyCode::FastForward
··· 30 pub genre: String, 31 pub description: String, 32 pub br: String, 33 + /// [`Volume`]. 34 + pub volume: Volume, 35 } 36 37 /// Volume of the player. ··· 54 if self.is_muted { 55 0.0 56 } else { 57 + self.volume 58 } 59 } 60 ··· 231 }, 232 frame, 233 ); 234 + render_line( 235 + "Volume ", 236 + &if state.volume.is_muted() { 237 + format!("{} muted", state.volume.volume()) 238 + } else { 239 + format!("{}", state.volume.volume()) 240 + }, 241 + Rect { 242 + x: size.x, 243 + y: match state.now_playing.is_empty() { 244 + true => size.y + 5, 245 + false => size.y + 6, 246 + }, 247 + width: size.width, 248 + height: 1, 249 + }, 250 + frame, 251 + ) 252 } 253 254 fn render_line(label: &str, value: &str, area: Rect, frame: &mut Frame) { ··· 347 let event = event::read().unwrap(); 348 349 if self 350 + .process_events(event.clone(), new_state.clone(), &mut sink_cmd_tx) 351 .unwrap() 352 { 353 return; ··· 376 fn process_events( 377 &mut self, 378 event: Event, 379 + state: Arc<Mutex<State>>, 380 sink_cmd_tx: &mut UnboundedSender<SinkCommand>, 381 ) -> Result<bool, io::Error> { 382 let mut quit = false; 383 + 384 + let lower_volume = || { 385 + let mut state = state.lock().unwrap(); 386 + state.volume.change_volume(-0.01); 387 + sink_cmd_tx 388 + .send(SinkCommand::SetVolume(state.volume.volume())) 389 + .expect("receiver never dropped"); 390 + }; 391 + 392 + let raise_volume = || { 393 + let mut state = state.lock().unwrap(); 394 + state.volume.change_volume(0.01); 395 + sink_cmd_tx 396 + .send(SinkCommand::SetVolume(state.volume.volume())) 397 + .expect("receiver never dropped"); 398 + }; 399 + 400 + let mute_volume = || { 401 + let mut state = state.lock().unwrap(); 402 + state.volume.toggle_mute(); 403 + sink_cmd_tx 404 + .send(SinkCommand::SetVolume(state.volume.volume())) 405 + .expect("receiver never dropped"); 406 + }; 407 + 408 if let Event::Key(key) = event { 409 if let KeyModifiers::CONTROL = key.modifiers { 410 match key.code { ··· 420 _ => 1.0, 421 }; 422 match key.code { 423 + KeyCode::Up => { 424 + // inverted to act as zoom 425 + update_value_f(&mut self.graph.scale, 0.01, magnitude, 0.0..10.0); 426 + raise_volume(); 427 + } 428 + KeyCode::Down => { 429 + // inverted to act as zoom 430 + update_value_f(&mut self.graph.scale, -0.01, magnitude, 0.0..10.0); 431 + lower_volume(); 432 + } 433 KeyCode::Right => update_value_i( 434 &mut self.graph.samples, 435 true, ··· 457 KeyCode::Char('s') => self.graph.scatter = !self.graph.scatter, 458 KeyCode::Char('h') => self.graph.show_ui = !self.graph.show_ui, 459 KeyCode::Char('r') => self.graph.references = !self.graph.references, 460 + KeyCode::Char('m') => mute_volume(), 461 KeyCode::Esc => { 462 self.graph.samples = self.graph.width; 463 self.graph.scale = 1.; ··· 504 MediaKeyCode::Stop => { 505 quit = true; 506 } 507 + MediaKeyCode::LowerVolume => lower_volume(), 508 + MediaKeyCode::RaiseVolume => raise_volume(), 509 + MediaKeyCode::MuteVolume => mute_volume(), 510 + MediaKeyCode::TrackNext 511 | MediaKeyCode::TrackPrevious 512 | MediaKeyCode::Reverse 513 | MediaKeyCode::FastForward
+7 -1
src/play.rs
··· 4 use hyper::header::HeaderValue; 5 6 use crate::{ 7 - app::{App, State}, 8 cfg::{SourceOptions, UiOptions}, 9 decoder::Mp3Decoder, 10 provider::{radiobrowser::Radiobrowser, tunein::Tunein, Provider}, ··· 91 .to_str() 92 .unwrap() 93 .to_string(), 94 }) 95 .unwrap(); 96 let location = response.headers().get("location"); ··· 121 SinkCommand::Pause => { 122 sink.pause(); 123 } 124 } 125 } 126 std::thread::sleep(Duration::from_millis(10)); ··· 140 Play, 141 /// Pause. 142 Pause, 143 }
··· 4 use hyper::header::HeaderValue; 5 6 use crate::{ 7 + app::{App, State, Volume}, 8 cfg::{SourceOptions, UiOptions}, 9 decoder::Mp3Decoder, 10 provider::{radiobrowser::Radiobrowser, tunein::Tunein, Provider}, ··· 91 .to_str() 92 .unwrap() 93 .to_string(), 94 + volume: Volume::default(), 95 }) 96 .unwrap(); 97 let location = response.headers().get("location"); ··· 122 SinkCommand::Pause => { 123 sink.pause(); 124 } 125 + SinkCommand::SetVolume(volume) => { 126 + sink.set_volume(volume); 127 + } 128 } 129 } 130 std::thread::sleep(Duration::from_millis(10)); ··· 144 Play, 145 /// Pause. 146 Pause, 147 + /// Set the volume. 148 + SetVolume(f32), 149 }