From f1cf865ef86d0f5e99b29d1475c7eda06f7c0229 Mon Sep 17 00:00:00 2001 From: 21pages Date: Fri, 21 Apr 2023 07:44:39 +0800 Subject: [PATCH] try host audio channel first to avoid no need rechannel Signed-off-by: 21pages --- src/client.rs | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/src/client.rs b/src/client.rs index 5f8659c93..bf8c48b38 100644 --- a/src/client.rs +++ b/src/client.rs @@ -827,21 +827,32 @@ impl AudioHandler { log::info!("Default output format: {:?}", config); log::info!("Remote input format: {:?}", format0); let config: StreamConfig = config.into(); - self.device_channel = config.channels; - match sample_format { - cpal::SampleFormat::I8 => self.build_output_stream::(&config, &device)?, - cpal::SampleFormat::I16 => self.build_output_stream::(&config, &device)?, - cpal::SampleFormat::I32 => self.build_output_stream::(&config, &device)?, - cpal::SampleFormat::I64 => self.build_output_stream::(&config, &device)?, - cpal::SampleFormat::U8 => self.build_output_stream::(&config, &device)?, - cpal::SampleFormat::U16 => self.build_output_stream::(&config, &device)?, - cpal::SampleFormat::U32 => self.build_output_stream::(&config, &device)?, - cpal::SampleFormat::U64 => self.build_output_stream::(&config, &device)?, - cpal::SampleFormat::F32 => self.build_output_stream::(&config, &device)?, - cpal::SampleFormat::F64 => self.build_output_stream::(&config, &device)?, - f => bail!("unsupported audio format: {:?}", f), - } self.sample_rate = (format0.sample_rate, config.sample_rate.0); + let mut build_output_stream = |config: StreamConfig| match sample_format { + cpal::SampleFormat::I8 => self.build_output_stream::(&config, &device), + cpal::SampleFormat::I16 => self.build_output_stream::(&config, &device), + cpal::SampleFormat::I32 => self.build_output_stream::(&config, &device), + cpal::SampleFormat::I64 => self.build_output_stream::(&config, &device), + cpal::SampleFormat::U8 => self.build_output_stream::(&config, &device), + cpal::SampleFormat::U16 => self.build_output_stream::(&config, &device), + cpal::SampleFormat::U32 => self.build_output_stream::(&config, &device), + cpal::SampleFormat::U64 => self.build_output_stream::(&config, &device), + cpal::SampleFormat::F32 => self.build_output_stream::(&config, &device), + cpal::SampleFormat::F64 => self.build_output_stream::(&config, &device), + f => bail!("unsupported audio format: {:?}", f), + }; + if config.channels > format0.channels as _ { + let no_rechannel_config = StreamConfig { + channels: format0.channels as _, + ..config.clone() + }; + if let Err(_) = build_output_stream(no_rechannel_config) { + build_output_stream(config)?; + } + } else { + build_output_stream(config)?; + } + Ok(()) } @@ -926,6 +937,7 @@ impl AudioHandler { config: &StreamConfig, device: &Device, ) -> ResultType<()> { + self.device_channel = config.channels; let err_fn = move |err| { // too many errors, will improve later log::trace!("an error occurred on stream: {}", err);