diff --git a/vhost-device-sound/src/audio_backends/pipewire.rs b/vhost-device-sound/src/audio_backends/pipewire.rs index a8b495a..b07e529 100644 --- a/vhost-device-sound/src/audio_backends/pipewire.rs +++ b/vhost-device-sound/src/audio_backends/pipewire.rs @@ -36,7 +36,7 @@ use spa::{ use super::AudioBackend; use crate::{ - stream::PCMState, + stream::{Error as StreamError, PCMState}, virtio_sound::{ VirtioSndPcmSetParams, VIRTIO_SND_PCM_FMT_A_LAW, VIRTIO_SND_PCM_FMT_FLOAT, VIRTIO_SND_PCM_FMT_FLOAT64, VIRTIO_SND_PCM_FMT_MU_LAW, VIRTIO_SND_PCM_FMT_S16, @@ -208,6 +208,14 @@ impl AudioBackend for PwBackend { let params = &stream_params[stream_id as usize].params; + if let Some(stream) = stream_hash.remove(&stream_id) { + stream_listener.remove(&stream_id); + if let Err(err) = stream.disconnect() { + log::error!("Stream {} disconnect {}", stream_id, err); + return Err(Error::Stream(StreamError::CouldNotDisconnectStream)); + } + } + let mut pos: [u32; 64] = [SPA_AUDIO_CHANNEL_UNKNOWN; 64]; match params.channels { diff --git a/vhost-device-sound/src/stream.rs b/vhost-device-sound/src/stream.rs index 479364d..30480c2 100644 --- a/vhost-device-sound/src/stream.rs +++ b/vhost-device-sound/src/stream.rs @@ -21,6 +21,8 @@ pub enum Error { DescriptorReadFailed, #[error("Descriptor write failed")] DescriptorWriteFailed, + #[error("Could not disconnect stream")] + CouldNotDisconnectStream, } type Result = std::result::Result;