audio: reimplement port reconnections using slices and less repeated code
This commit is contained in:
+19
-30
@@ -113,8 +113,8 @@ pub async fn start_audio_input() -> (AudioInputControl, MicStream, TtsOutStream,
|
|||||||
let config = AudioConfig::load();
|
let config = AudioConfig::load();
|
||||||
|
|
||||||
let (mic_audio_sink, mic_audio_src) = mpsc::channel(32);
|
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 (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 (volume_sink, volume_src) = watch::channel(0.);
|
||||||
|
|
||||||
let (client, _status) = jack::Client::new("Eva-Cohost", ClientOptions::default() | ClientOptions::SESSION_ID).unwrap();
|
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 mut sfx_port = client.register_port("sfx-out", AudioOut::default()).unwrap();
|
||||||
let rate = client.sample_rate();
|
let rate = client.sample_rate();
|
||||||
|
|
||||||
let mic_name = mic_port.name().unwrap();
|
for (port, connections) in [
|
||||||
let tts_name = tts_port.name().unwrap();
|
(&tts_port, &config.tts_out_connections),
|
||||||
|
(&sfx_port, &config.sfx_out_connections),
|
||||||
for port in &config.mic_in_connections {
|
] {
|
||||||
if let Ok(_) = client.connect_ports_by_name(&port, &mic_name) {
|
for peer_name in connections {
|
||||||
log::info!("Connected mic to {}", port);
|
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 {
|
} else {
|
||||||
log::warn!("Failed to reconnect mic to {}.", port);
|
log::info!("Reconnected {} to {}", port.name().unwrap(), peer_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for port in &config.tts_out_connections {
|
for (port, connections) in [
|
||||||
if let Ok(_) = client.connect_ports_by_name(&tts_name, &port) {
|
(&mic_port, &config.mic_in_connections)
|
||||||
log::info!("Connected TTS output to {}", port);
|
] {
|
||||||
} else {
|
for peer_name in connections {
|
||||||
log::warn!("Failed to reconnect TTS output to {}.", port);
|
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
|
jack::Control::Continue
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user