diff --git a/crates/ironrdp-rdpsnd/src/server.rs b/crates/ironrdp-rdpsnd/src/server.rs index 8671cafac..61e168422 100644 --- a/crates/ironrdp-rdpsnd/src/server.rs +++ b/crates/ironrdp-rdpsnd/src/server.rs @@ -17,6 +17,10 @@ impl RdpsndError for T where T: std::error::Error + Send + Sync + 'static {} pub enum RdpsndServerMessage { /// Wave data, with timestamp Wave(Vec, u32), + SetVolume { + left: u16, + right: u16, + }, Close, /// Failure received from the OS event loop. /// @@ -70,11 +74,20 @@ impl RdpsndServer { let client_format = self .client_format .as_ref() - .ok_or_else(|| pdu_other_err!("invalid state - no version"))?; + .ok_or_else(|| pdu_other_err!("invalid state, client format not yet received"))?; Ok(client_format.version) } + pub fn flags(&self) -> PduResult { + let client_format = self + .client_format + .as_ref() + .ok_or_else(|| pdu_other_err!("invalid state, client format not yet received"))?; + + Ok(client_format.flags) + } + pub fn training_pdu(&mut self) -> PduResult { let pdu = pdu::TrainingPdu { timestamp: 4231, // a random number @@ -116,6 +129,19 @@ impl RdpsndServer { Ok(msg) } + pub fn set_volume(&mut self, volume_left: u16, volume_right: u16) -> PduResult { + if !self.flags()?.contains(pdu::AudioFormatFlags::VOLUME) { + return Err(pdu_other_err!("client doesn't support volume")); + } + let pdu = pdu::VolumePdu { + volume_left, + volume_right, + }; + Ok(RdpsndSvcMessages::new(vec![ + pdu::ServerAudioOutputPdu::Volume(pdu).into() + ])) + } + pub fn close(&mut self) -> PduResult { Ok(RdpsndSvcMessages::new(vec![pdu::ServerAudioOutputPdu::Close.into()])) } diff --git a/crates/ironrdp-server/src/server.rs b/crates/ironrdp-server/src/server.rs index 69f72fb41..d20d9bf44 100644 --- a/crates/ironrdp-server/src/server.rs +++ b/crates/ironrdp-server/src/server.rs @@ -496,6 +496,7 @@ impl RdpServer { wave_limit -= 1; rdpsnd.wave(data, ts) } + RdpsndServerMessage::SetVolume { left, right } => rdpsnd.set_volume(left, right), RdpsndServerMessage::Close => rdpsnd.close(), RdpsndServerMessage::Error(error) => { error!(?error, "Handling rdpsnd event");