channel count correction
This commit is contained in:
+47
-8
@@ -54,12 +54,12 @@ async fn main() {
|
|||||||
Arc::new(Mutex::new(HashMap::new()));
|
Arc::new(Mutex::new(HashMap::new()));
|
||||||
let active_input_audio_streams_consumers: InputAudioStreamsConsumers =
|
let active_input_audio_streams_consumers: InputAudioStreamsConsumers =
|
||||||
Arc::new(Mutex::new(HashMap::new()));
|
Arc::new(Mutex::new(HashMap::new()));
|
||||||
let active_input_sudio_streams_info: InputAudioStreamsInfo =
|
let active_input_audio_streams_info: InputAudioStreamsInfo =
|
||||||
Arc::new(RwLock::new(HashMap::new()));
|
Arc::new(RwLock::new(HashMap::new()));
|
||||||
|
|
||||||
let active_input_audio_streams_producers_tcp = active_input_audio_streams_producers.clone();
|
let active_input_audio_streams_producers_tcp = active_input_audio_streams_producers.clone();
|
||||||
let active_input_audio_streams_consumers_tcp = active_input_audio_streams_consumers.clone();
|
let active_input_audio_streams_consumers_tcp = active_input_audio_streams_consumers.clone();
|
||||||
let active_input_sudio_streams_info_tcp = active_input_sudio_streams_info.clone();
|
let active_input_audio_streams_info_tcp = active_input_audio_streams_info.clone();
|
||||||
|
|
||||||
let server_address = {
|
let server_address = {
|
||||||
let info = client_info.read().unwrap();
|
let info = client_info.read().unwrap();
|
||||||
@@ -115,7 +115,7 @@ async fn main() {
|
|||||||
let mut consumer_map = active_input_audio_streams_consumers_tcp.lock().unwrap();
|
let mut consumer_map = active_input_audio_streams_consumers_tcp.lock().unwrap();
|
||||||
consumer_map.clear();
|
consumer_map.clear();
|
||||||
|
|
||||||
let mut info_map = active_input_sudio_streams_info_tcp.write().unwrap();
|
let mut info_map = active_input_audio_streams_info_tcp.write().unwrap();
|
||||||
info_map.clear();
|
info_map.clear();
|
||||||
|
|
||||||
|
|
||||||
@@ -218,12 +218,12 @@ async fn main() {
|
|||||||
println!("input device: {}", input_device);
|
println!("input device: {}", input_device);
|
||||||
println!("output device: {}", output_device);
|
println!("output device: {}", output_device);
|
||||||
|
|
||||||
let config: cpal::StreamConfig = input_device
|
let speaker_config: cpal::StreamConfig = output_device
|
||||||
.default_input_config()
|
.default_output_config()
|
||||||
.expect("stream config init failed")
|
.expect("stream config init failed")
|
||||||
.into();
|
.into();
|
||||||
|
|
||||||
println!("stream config: {:?}", config);
|
println!("speaker config: {:?}", speaker_config);
|
||||||
|
|
||||||
let active_input_audio_streams_consumer_cpal = active_input_audio_streams_consumers.clone();
|
let active_input_audio_streams_consumer_cpal = active_input_audio_streams_consumers.clone();
|
||||||
|
|
||||||
@@ -245,12 +245,14 @@ async fn main() {
|
|||||||
|
|
||||||
let err_fn = |err| eprintln!("stream error: {}", err);
|
let err_fn = |err| eprintln!("stream error: {}", err);
|
||||||
let output_stream = output_device
|
let output_stream = output_device
|
||||||
.build_output_stream(config, output_data_fn, err_fn, None)
|
.build_output_stream(speaker_config, output_data_fn, err_fn, None)
|
||||||
.expect("building output stream failed");
|
.expect("building output stream failed");
|
||||||
|
|
||||||
output_stream.play().expect("failed to play output stream");
|
output_stream.play().expect("failed to play output stream");
|
||||||
|
|
||||||
let active_input_audio_streams_producers_udp = active_input_audio_streams_producers.clone();
|
let active_input_audio_streams_producers_udp = active_input_audio_streams_producers.clone();
|
||||||
|
let active_input_audio_streams_info_udp = active_input_audio_streams_info.clone();
|
||||||
|
let speaker_config_clone = speaker_config.clone();
|
||||||
|
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
let mut receive_buffer = vec![0u8; 4096];
|
let mut receive_buffer = vec![0u8; 4096];
|
||||||
@@ -282,7 +284,44 @@ async fn main() {
|
|||||||
active_input_audio_streams_producers_udp.lock().unwrap();
|
active_input_audio_streams_producers_udp.lock().unwrap();
|
||||||
|
|
||||||
if let Some(producer) = active_streams_map.get_mut(&(client_id, stream_id)) {
|
if let Some(producer) = active_streams_map.get_mut(&(client_id, stream_id)) {
|
||||||
producer.push_slice(&decoded_samples);
|
if let Some(&stream_info) = active_input_audio_streams_info_udp
|
||||||
|
.read()
|
||||||
|
.unwrap()
|
||||||
|
.get(&(client_id, stream_id))
|
||||||
|
{
|
||||||
|
if stream_info.channels == speaker_config_clone.channels {
|
||||||
|
producer.push_slice(&decoded_samples);
|
||||||
|
} else {
|
||||||
|
let n = stream_info.channels;
|
||||||
|
let mut step = 0;
|
||||||
|
decoded_samples.retain(|_| {
|
||||||
|
if step == 0 {
|
||||||
|
step = n - 1;
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
step -= 1;
|
||||||
|
false
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if speaker_config_clone.channels == 1 {
|
||||||
|
producer.push_slice(&decoded_samples);
|
||||||
|
} else {
|
||||||
|
let mut out = vec![
|
||||||
|
0f32;
|
||||||
|
decoded_samples.len()
|
||||||
|
* speaker_config_clone.channels as usize
|
||||||
|
];
|
||||||
|
for (item, chunk) in
|
||||||
|
decoded_samples.iter().zip(out.chunks_exact_mut(
|
||||||
|
speaker_config_clone.channels as usize,
|
||||||
|
))
|
||||||
|
{
|
||||||
|
chunk.fill(*item);
|
||||||
|
}
|
||||||
|
producer.push_slice(&out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// speaker_producer.push_slice(&decoded_samples);
|
// speaker_producer.push_slice(&decoded_samples);
|
||||||
|
|||||||
Reference in New Issue
Block a user