diff options
Diffstat (limited to 'mumd/src')
| -rw-r--r-- | mumd/src/audio.rs | 78 | ||||
| -rw-r--r-- | mumd/src/network/tcp.rs | 2 | ||||
| -rw-r--r-- | mumd/src/network/udp.rs | 2 | ||||
| -rw-r--r-- | mumd/src/state.rs | 8 |
4 files changed, 48 insertions, 42 deletions
diff --git a/mumd/src/audio.rs b/mumd/src/audio.rs index 0aac68c..facca9c 100644 --- a/mumd/src/audio.rs +++ b/mumd/src/audio.rs @@ -68,10 +68,10 @@ impl TryFrom<&str> for NotificationEvents { } pub struct AudioInput { - _input_stream: cpal::Stream, + _stream: cpal::Stream, - input_channel_receiver: Arc<tokio::sync::Mutex<Box<dyn Stream<Item = VoicePacket<Serverbound>> + Unpin>>>, - input_volume_sender: watch::Sender<f32>, + channel_receiver: Arc<tokio::sync::Mutex<Box<dyn Stream<Item = VoicePacket<Serverbound>> + Unpin>>>, + volume_sender: watch::Sender<f32>, } impl AudioInput { @@ -136,45 +136,50 @@ impl AudioInput { .map_err(|e| AudioError::InvalidStream(AudioStream::Input, e))?; let opus_stream = OpusEncoder::new( - 4, - input_config.sample_rate.0, - input_config.channels as usize, - StreamingSignalExt::into_interleaved_samples( - StreamingNoiseGate::new( - from_interleaved_samples_stream::<_, f32>(sample_receiver), //TODO group frames correctly - 10_000))).enumerate().map(|(i, e)| VoicePacket::Audio { - _dst: std::marker::PhantomData, - target: 0, // normal speech - session_id: (), // unused for server-bound packets - seq_num: i as u64, - payload: VoicePacketPayload::Opus(e.into(), false), - position_info: None, - }); + 4, + input_config.sample_rate.0, + input_config.channels as usize, + StreamingSignalExt::into_interleaved_samples( + StreamingNoiseGate::new( + from_interleaved_samples_stream::<_, f32>(sample_receiver), //TODO group frames correctly + 10_000 + ) + ) + ).enumerate() + .map(|(i, e)| VoicePacket::Audio { + _dst: std::marker::PhantomData, + target: 0, // normal speech + session_id: (), // unused for server-bound packets + seq_num: i as u64, + payload: VoicePacketPayload::Opus(e.into(), false), + position_info: None, + } + ); input_stream.play().map_err(|e| AudioError::OutputPlayError(e))?; let res = Self { - _input_stream: input_stream, - input_volume_sender, - input_channel_receiver: Arc::new(tokio::sync::Mutex::new(Box::new(opus_stream))), + _stream: input_stream, + volume_sender: input_volume_sender, + channel_receiver: Arc::new(tokio::sync::Mutex::new(Box::new(opus_stream))), }; Ok(res) } - pub fn input_receiver(&self) -> Arc<tokio::sync::Mutex<Box<dyn Stream<Item = VoicePacket<Serverbound>> + Unpin>>> { - Arc::clone(&self.input_channel_receiver) + pub fn receiver(&self) -> Arc<tokio::sync::Mutex<Box<dyn Stream<Item = VoicePacket<Serverbound>> + Unpin>>> { + Arc::clone(&self.channel_receiver) } - pub fn set_input_volume(&self, input_volume: f32) { - self.input_volume_sender.send(input_volume).unwrap(); + pub fn set_volume(&self, input_volume: f32) { + self.volume_sender.send(input_volume).unwrap(); } } pub struct AudioOutput { - output_config: StreamConfig, - _output_stream: cpal::Stream, + config: StreamConfig, + _stream: cpal::Stream, - output_volume_sender: watch::Sender<f32>, + volume_sender: watch::Sender<f32>, user_volumes: Arc<Mutex<HashMap<u32, (f32, bool)>>>, @@ -247,13 +252,14 @@ impl AudioOutput { ), } .map_err(|e| AudioError::InvalidStream(AudioStream::Output, e))?; + output_stream.play().map_err(|e| AudioError::OutputPlayError(e))?; let mut res = Self { - output_config, - _output_stream: output_stream, + config: output_config, + _stream: output_stream, client_streams, sounds: HashMap::new(), - output_volume_sender, + volume_sender: output_volume_sender, user_volumes, play_sounds, }; @@ -303,7 +309,7 @@ impl AudioOutput { .until_exhausted() // if the source audio is stereo and is being played as mono, discard the right audio .flat_map( - |e| if self.output_config.channels == 1 { + |e| if self.config.channels == 1 { vec![e[0]] } else { e.to_vec() @@ -320,7 +326,7 @@ impl AudioOutput { Entry::Occupied(mut entry) => { entry .get_mut() - .decode_packet(payload, self.output_config.channels as usize); + .decode_packet(payload, self.config.channels as usize); } Entry::Vacant(_) => { warn!("Can't find session id {}", session_id); @@ -336,8 +342,8 @@ impl AudioOutput { } Entry::Vacant(entry) => { entry.insert(output::ClientStream::new( - self.output_config.sample_rate.0, - self.output_config.channels, + self.config.sample_rate.0, + self.config.channels, )); } } @@ -364,8 +370,8 @@ impl AudioOutput { self.client_streams.lock().unwrap().clear(); } - pub fn set_output_volume(&self, output_volume: f32) { - self.output_volume_sender.send(output_volume).unwrap(); + pub fn set_volume(&self, output_volume: f32) { + self.volume_sender.send(output_volume).unwrap(); } pub fn set_user_volume(&self, id: u32, volume: f32) { diff --git a/mumd/src/network/tcp.rs b/mumd/src/network/tcp.rs index d2f0b41..1414318 100644 --- a/mumd/src/network/tcp.rs +++ b/mumd/src/network/tcp.rs @@ -108,7 +108,7 @@ pub async fn handle( let password = state_lock.password().map(|x| x.to_string()); authenticate(&mut sink, username, password).await?; let phase_watcher = state_lock.phase_receiver(); - let input_receiver = state_lock.audio_input().input_receiver(); + let input_receiver = state_lock.audio_input().receiver(); drop(state_lock); let event_queue = TcpEventQueue::new(); diff --git a/mumd/src/network/udp.rs b/mumd/src/network/udp.rs index a8e190d..8614358 100644 --- a/mumd/src/network/udp.rs +++ b/mumd/src/network/udp.rs @@ -33,7 +33,7 @@ pub async fn handle( mut connection_info_receiver: watch::Receiver<Option<ConnectionInfo>>, mut crypt_state_receiver: mpsc::Receiver<ClientCryptState>, ) -> Result<(), UdpError> { - let receiver = state.lock().await.audio_input().input_receiver(); + let receiver = state.lock().await.audio_input().receiver(); loop { let connection_info = 'data: loop { diff --git a/mumd/src/state.rs b/mumd/src/state.rs index 84bb372..313a985 100644 --- a/mumd/src/state.rs +++ b/mumd/src/state.rs @@ -211,7 +211,7 @@ impl State { now!(Ok(new_deaf.map(|b| CommandResponse::DeafenStatus { is_deafened: b }))) } Command::InputVolumeSet(volume) => { - self.audio_input.set_input_volume(volume); + self.audio_input.set_volume(volume); now!(Ok(None)) } Command::MuteOther(string, toggle) => { @@ -305,7 +305,7 @@ impl State { now!(Ok(new_mute.map(|b| CommandResponse::MuteStatus { is_muted: b }))) } Command::OutputVolumeSet(volume) => { - self.audio_output.set_output_volume(volume); + self.audio_output.set_volume(volume); now!(Ok(None)) } Command::Ping => { @@ -585,10 +585,10 @@ impl State { Err(e) => error!("Couldn't read config: {}", e), } if let Some(input_volume) = self.config.audio.input_volume { - self.audio_input.set_input_volume(input_volume); + self.audio_input.set_volume(input_volume); } if let Some(output_volume) = self.config.audio.output_volume { - self.audio_output.set_output_volume(output_volume); + self.audio_output.set_volume(output_volume); } if let Some(sound_effects) = &self.config.audio.sound_effects { self.audio_output.load_sound_effects(sound_effects); |
