diff --git a/src/server/audio_service.rs b/src/server/audio_service.rs index a45757ff3..6a4de338e 100644 --- a/src/server/audio_service.rs +++ b/src/server/audio_service.rs @@ -36,35 +36,31 @@ mod pa_impl { use super::*; #[tokio::main(flavor = "current_thread")] pub async fn run(sp: GenericService) -> ResultType<()> { - if let Ok(mut stream) = crate::ipc::connect(1000, "_pa").await { - let mut encoder = - Encoder::new(crate::platform::linux::PA_SAMPLE_RATE, Stereo, LowDelay)?; - allow_err!( - stream - .send(&crate::ipc::Data::Config(( - "audio-input".to_owned(), - Some(Config::get_option("audio-input")) - ))) - .await - ); - while sp.ok() { - sp.snapshot(|sps| { - sps.send(create_format_msg(crate::platform::linux::PA_SAMPLE_RATE, 2)); - Ok(()) - })?; - if let Some(data) = stream.next_timeout2(1000).await { - match data? { - Some(crate::ipc::Data::RawMessage(bytes)) => { - let data = unsafe { - std::slice::from_raw_parts::( - bytes.as_ptr() as _, - bytes.len() / 4, - ) - }; - send_f32(data, &mut encoder, &sp); - } - _ => {} + hbb_common::sleep(0.1).await; // one moment to wait for _pa ipc + let mut stream = crate::ipc::connect(1000, "_pa").await?; + let mut encoder = Encoder::new(crate::platform::linux::PA_SAMPLE_RATE, Stereo, LowDelay)?; + allow_err!( + stream + .send(&crate::ipc::Data::Config(( + "audio-input".to_owned(), + Some(Config::get_option("audio-input")) + ))) + .await + ); + while sp.ok() { + sp.snapshot(|sps| { + sps.send(create_format_msg(crate::platform::linux::PA_SAMPLE_RATE, 2)); + Ok(()) + })?; + if let Some(data) = stream.next_timeout2(1000).await { + match data? { + Some(crate::ipc::Data::RawMessage(bytes)) => { + let data = unsafe { + std::slice::from_raw_parts::(bytes.as_ptr() as _, bytes.len() / 4) + }; + send_f32(data, &mut encoder, &sp); } + _ => {} } } } diff --git a/src/ui/cm.rs b/src/ui/cm.rs index 368769a95..15583e56b 100644 --- a/src/ui/cm.rs +++ b/src/ui/cm.rs @@ -405,12 +405,13 @@ async fn start_pa() { break; } let spec = pulse::sample::Spec { - format: pulse::sample::Format::F32be, + format: pulse::sample::Format::F32le, channels: 2, rate: crate::platform::linux::PA_SAMPLE_RATE, }; log::info!("pa monitor: {:?}", device); - if let Ok(s) = psimple::Simple::new( + // systemctl --user status pulseaudio.service + match psimple::Simple::new( None, // Use the default server APP_NAME, // Our application’s name pulse::stream::Direction::Record, // We want a record stream @@ -420,7 +421,7 @@ async fn start_pa() { None, // Use default channel map None, // Use default buffering attributes ) { - loop { + Ok(s) => loop { if let Some(Err(_)) = stream.next_timeout2(1).await { break; } @@ -433,9 +434,10 @@ async fn start_pa() { allow_err!(stream.send(&Data::RawMessage(out)).await); } } + }, + Err(err) => { + log::error!("Could not create simple pulse: {}", err); } - } else { - log::error!("Could not create simple pulse"); } } Err(err) => {