fix: 修复 master 退出环境清理流程
This commit is contained in:
@@ -12,6 +12,7 @@ use std::net::SocketAddr;
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
||||||
|
use tokio::signal::unix::{SignalKind, signal};
|
||||||
use tokio::sync::Mutex;
|
use tokio::sync::Mutex;
|
||||||
|
|
||||||
pub const SERVER_TCP_PORT: u16 = 53531;
|
pub const SERVER_TCP_PORT: u16 = 53531;
|
||||||
@@ -96,6 +97,7 @@ pub async fn run_master(master_role: ChannelRole) -> Result<()> {
|
|||||||
let mut stream_start_ts = 0;
|
let mut stream_start_ts = 0;
|
||||||
let mut stream_start_seq = 0;
|
let mut stream_start_seq = 0;
|
||||||
|
|
||||||
|
let audio_loop = async {
|
||||||
loop {
|
loop {
|
||||||
// 打开 FIFO
|
// 打开 FIFO
|
||||||
let mut fifo = match tokio::fs::File::open(AlsaRedirector::fifo_path()).await {
|
let mut fifo = match tokio::fs::File::open(AlsaRedirector::fifo_path()).await {
|
||||||
@@ -159,7 +161,6 @@ pub async fn run_master(master_role: ChannelRole) -> Result<()> {
|
|||||||
let mut remote_pcm = Vec::with_capacity(config.frame_size);
|
let mut remote_pcm = Vec::with_capacity(config.frame_size);
|
||||||
|
|
||||||
// 提取左右声道 (假设当前逻辑只处理一个从节点的情况,或所有从节点角色一致)
|
// 提取左右声道 (假设当前逻辑只处理一个从节点的情况,或所有从节点角色一致)
|
||||||
// 如果有多个从节点角色不同,这里需要更复杂的逻辑
|
|
||||||
let slave_role = active_slaves[0].role;
|
let slave_role = active_slaves[0].role;
|
||||||
|
|
||||||
for i in 0..config.frame_size {
|
for i in 0..config.frame_size {
|
||||||
@@ -212,6 +213,37 @@ pub async fn run_master(master_role: ChannelRole) -> Result<()> {
|
|||||||
// 重置流计时
|
// 重置流计时
|
||||||
stream_start_ts = 0;
|
stream_start_ts = 0;
|
||||||
}
|
}
|
||||||
|
#[allow(unreachable_code)]
|
||||||
|
Ok::<(), anyhow::Error>(())
|
||||||
|
};
|
||||||
|
|
||||||
|
tokio::select! {
|
||||||
|
res = audio_loop => {
|
||||||
|
if let Err(e) = res {
|
||||||
|
eprintln!("❌ 音频循环错误: {:?}", e);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_ = shutdown_signal() => {},
|
||||||
|
}
|
||||||
|
|
||||||
|
// 显式清理
|
||||||
|
AlsaRedirector::cleanup();
|
||||||
|
|
||||||
|
// 强制退出
|
||||||
|
std::process::exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 监听系统退出信号 (SIGINT, SIGTERM, SIGQUIT)
|
||||||
|
async fn shutdown_signal() {
|
||||||
|
let mut sigint = signal(SignalKind::interrupt()).expect("无法注册 SIGINT 处理器");
|
||||||
|
let mut sigterm = signal(SignalKind::terminate()).expect("无法注册 SIGTERM 处理器");
|
||||||
|
let mut sigquit = signal(SignalKind::quit()).expect("无法注册 SIGQUIT 处理器");
|
||||||
|
|
||||||
|
tokio::select! {
|
||||||
|
_ = sigint.recv() => {},
|
||||||
|
_ = sigterm.recv() => {},
|
||||||
|
_ = sigquit.recv() => {},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 处理主节点与从节点的会话
|
/// 处理主节点与从节点的会话
|
||||||
|
|||||||
Reference in New Issue
Block a user