aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mumd/src/audio.rs78
-rw-r--r--mumd/src/network/tcp.rs2
-rw-r--r--mumd/src/network/udp.rs2
-rw-r--r--mumd/src/state.rs8
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);