From aabe882b88a97c03d226c853d650e0fdde06956f Mon Sep 17 00:00:00 2001 From: Del Wang Date: Tue, 30 Dec 2025 18:51:43 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20master=20=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E6=AD=A3=E5=B8=B8=E9=80=80=E5=87=BA=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/hello/build.sh | 1 + apps/hello/src/stereo_core/master.rs | 41 ++++++++++++++++++++++++---- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/apps/hello/build.sh b/apps/hello/build.sh index 34cfec0..400ab43 100755 --- a/apps/hello/build.sh +++ b/apps/hello/build.sh @@ -35,6 +35,7 @@ upload_to_xiaoai stereo 192.168.31.235 # right # ubus call mediaplayer player_play_url '{"url":"/data/test.wav","type":1}' +/etc/init.d/pns restart >/dev/null 2>&1 # /etc/init.d/mediaplayer restart >/dev/null 2>&1 # /etc/init.d/bluetooth restart >/dev/null 2>&1 # /etc/init.d/miio restart >/dev/null 2>&1 diff --git a/apps/hello/src/stereo_core/master.rs b/apps/hello/src/stereo_core/master.rs index dd8f21c..bf2ef9b 100644 --- a/apps/hello/src/stereo_core/master.rs +++ b/apps/hello/src/stereo_core/master.rs @@ -10,6 +10,7 @@ use crate::stereo_core::sync::now_us; use anyhow::{Result, anyhow}; use std::net::SocketAddr; use std::sync::Arc; +use std::sync::atomic::{AtomicBool, Ordering}; use std::time::Duration; use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::signal::unix::{SignalKind, signal}; @@ -38,6 +39,7 @@ pub async fn run_master(master_role: ChannelRole) -> Result<()> { println!("✅ 服务已启动,等待连接..."); + let shutdown_flag = Arc::new(AtomicBool::new(false)); let slaves = Arc::new(Mutex::new(Vec::::new())); // 3. 启动连接监听任务 @@ -93,8 +95,13 @@ pub async fn run_master(master_role: ChannelRole) -> Result<()> { let mut stream_start_ts = 0; let mut stream_start_seq = 0; - let audio_loop = async { + let shutdown_flag_clone = shutdown_flag.clone(); + let audio_loop = async move { loop { + if shutdown_flag_clone.load(Ordering::Relaxed) { + break; + } + // 打开 FIFO let mut fifo = match tokio::fs::File::open(AlsaRedirector::fifo_path()).await { Ok(f) => f, @@ -110,6 +117,10 @@ pub async fn run_master(master_role: ChannelRole) -> Result<()> { let mut right_encoder = OpusCodec::new(&encode_config)?; loop { + if shutdown_flag_clone.load(Ordering::Relaxed) { + break; + } + // 从 FIFO 读取 if let Err(_) = fifo.read_exact(&mut raw_buf).await { break; // FIFO 关闭,重新打开 @@ -211,7 +222,12 @@ pub async fn run_master(master_role: ChannelRole) -> Result<()> { } } if let Some(p) = &player { - p.write(master_pcm)?; + if let Err(_) = p.write(master_pcm) { + // 如果写入失败且正在退出,直接跳出循环 + if shutdown_flag_clone.load(Ordering::Relaxed) { + break; + } + } } } else { // 情况 2: 没有从节点,本地立体声播放 @@ -221,7 +237,12 @@ pub async fn run_master(master_role: ChannelRole) -> Result<()> { i16::from_le_bytes([raw_buf[i * 4 + 2], raw_buf[i * 4 + 3]]); } if let Some(p) = &player { - p.write(&pcm_out)?; + if let Err(_) = p.write(&pcm_out) { + // 如果写入失败且正在退出,直接跳出循环 + if shutdown_flag_clone.load(Ordering::Relaxed) { + break; + } + } } } @@ -230,8 +251,13 @@ pub async fn run_master(master_role: ChannelRole) -> Result<()> { // 重置流计时 stream_start_ts = 0; + + // 如果是因为退出信号而跳出内层循环,也要跳出外层循环 + if shutdown_flag_clone.load(Ordering::Relaxed) { + break; + } } - #[allow(unreachable_code)] + Ok::<(), anyhow::Error>(()) }; @@ -241,7 +267,12 @@ pub async fn run_master(master_role: ChannelRole) -> Result<()> { eprintln!("❌ 音频循环错误: {:?}", e); } }, - _ = shutdown_signal() => {}, + _ = shutdown_signal() => { + // 设置退出标志,通知音频循环停止 + shutdown_flag.store(true, Ordering::Relaxed); + // 等待一小段时间让音频循环有机会退出 + tokio::time::sleep(Duration::from_millis(100)).await; + }, } // 显式清理