audio: reimplement port reconnections using slices and less repeated code

This commit is contained in:
2026-06-16 11:30:15 +02:00
parent 0a2a09eb3c
commit 8db22b2539
+20 -31
View File
@@ -113,8 +113,8 @@ pub async fn start_audio_input() -> (AudioInputControl, MicStream, TtsOutStream,
let config = AudioConfig::load();
let (mic_audio_sink, mic_audio_src) = mpsc::channel(32);
let (tts_audio_sink, mut tts_audio_src) = mpsc::channel(32);
let (sfx_audio_sink, mut sfx_audio_src) = mpsc::channel(32);
let (tts_audio_sink, mut tts_audio_src) = mpsc::channel(32);
let (volume_sink, volume_src) = watch::channel(0.);
let (client, _status) = jack::Client::new("Eva-Cohost", ClientOptions::default() | ClientOptions::SESSION_ID).unwrap();
@@ -123,22 +123,28 @@ pub async fn start_audio_input() -> (AudioInputControl, MicStream, TtsOutStream,
let mut sfx_port = client.register_port("sfx-out", AudioOut::default()).unwrap();
let rate = client.sample_rate();
let mic_name = mic_port.name().unwrap();
let tts_name = tts_port.name().unwrap();
for port in &config.mic_in_connections {
if let Ok(_) = client.connect_ports_by_name(&port, &mic_name) {
log::info!("Connected mic to {}", port);
} else {
log::warn!("Failed to reconnect mic to {}.", port);
for (port, connections) in [
(&tts_port, &config.tts_out_connections),
(&sfx_port, &config.sfx_out_connections),
] {
for peer_name in connections {
if let Some(peer) = client.port_by_name(peer_name) {
if let Err(err) = client.connect_ports(port, &peer) {
log::error!("Failed to reconnect {} to {}", port.name().unwrap(), peer_name);
} else {
log::info!("Reconnected {} to {}", port.name().unwrap(), peer_name);
}
}
}
}
for port in &config.tts_out_connections {
if let Ok(_) = client.connect_ports_by_name(&tts_name, &port) {
log::info!("Connected TTS output to {}", port);
} else {
log::warn!("Failed to reconnect TTS output to {}.", port);
for (port, connections) in [
(&mic_port, &config.mic_in_connections)
] {
for peer_name in connections {
if let Some(peer) = client.port_by_name(peer_name) {
client.connect_ports(&peer, port).unwrap();
}
}
}
@@ -195,23 +201,6 @@ pub async fn start_audio_input() -> (AudioInputControl, MicStream, TtsOutStream,
}
}
/*if let Ok(mut next_outbuf) = tts_audio_src.try_recv() {
tts_output_buf.append(&mut next_outbuf);
}
if tts_port.connected_count().unwrap() > 0 && !tts_output_buf.is_empty() {
let outbuf = tts_port.as_mut_slice(scope);
let mut next_segment: Vec<f32> = tts_output_buf.drain(0..(outbuf.len()).min(tts_output_buf.len())).collect();
let underrun = outbuf.len() - next_segment.len();
if underrun > 0 {
for _ in 0..underrun {
next_segment.push(0.);
}
}
outbuf.copy_from_slice(&next_segment);
}*/
jack::Control::Continue
});