From 8a8c21bdcaeeec5e9c0204d34c5ee51db54d33db Mon Sep 17 00:00:00 2001 From: Aron Heinecke Date: Mon, 10 May 2021 22:44:15 +0200 Subject: [PATCH] some more timing measurements Signed-off-by: Aron Heinecke --- src/discord.rs | 5 +++++ src/main.rs | 48 +++++++++++++++++++++++++++++++----------------- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/discord.rs b/src/discord.rs index 73a3a76..2260902 100644 --- a/src/discord.rs +++ b/src/discord.rs @@ -391,7 +391,12 @@ impl VoiceEventHandler for Receiver { // } if let Some(audio) = audio { { + let time = std::time::Instant::now(); let mut lock = self.sink.lock().await; + let dur = time.elapsed(); + if dur > Duration::from_nanos(500) { + eprintln!("Akquiring lock took {}ms",dur.as_millis()); + } if let Some(buffer) = lock.get_mut(&packet.ssrc) { buffer.extend(audio); } else { diff --git a/src/main.rs b/src/main.rs index 77cf642..81c62b0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -65,6 +65,10 @@ impl TypeMapKey for ListenerHolder { type Value = AudioBufferDiscord; } +const TICK_TIME: u64 = 20; +const FRAME_SIZE_MS: usize = 20; +const STEREO_20MS: usize = 48000 * 2 * FRAME_SIZE_MS / 1000; + #[tokio::main] async fn main() -> Result<()> { tracing_subscriber::fmt::init(); @@ -149,8 +153,8 @@ async fn main() -> Result<()> { // a2t.set_volume(config.volume); // a2t.set_playing(true); // } - - let mut interval = tokio::time::interval(Duration::from_millis(20)); + + let mut interval = tokio::time::interval(Duration::from_millis(TICK_TIME)); // tokio::spawn(async { // loop { @@ -160,24 +164,24 @@ async fn main() -> Result<()> { // } // } // }); - + loop { let t2a = audiodata.ts2a.clone(); let events = con.events().try_for_each(|e| async { - if let StreamItem::Audio(packet) = e { - let from = ClientId(match packet.data().data() { - AudioData::S2C { from, .. } => *from, - AudioData::S2CWhisper { from, .. } => *from, - _ => panic!("Can only handle S2C packets but got a C2S packet"), - }); - let mut t2a = t2a.lock().unwrap(); - if let Err(e) = t2a.play_packet((con_id, from), packet) { - debug!(logger, "Failed to play packet"; "error" => %e); - } - } + // if let StreamItem::Audio(packet) = e { + // let from = ClientId(match packet.data().data() { + // AudioData::S2C { from, .. } => *from, + // AudioData::S2CWhisper { from, .. } => *from, + // _ => panic!("Can only handle S2C packets but got a C2S packet"), + // }); + // let mut t2a = t2a.lock().unwrap(); + // if let Err(e) = t2a.play_packet((con_id, from), packet) { + // debug!(logger, "Failed to play packet"; "error" => %e); + // } + // } Ok(()) }); - + let start = std::time::Instant::now(); // Wait for ctrl + c tokio::select! { // send_audio = recv.recv() => { @@ -198,9 +202,19 @@ async fn main() -> Result<()> { // } // } _send = interval.tick() => { + let dur = start.elapsed(); + if dur.as_millis() > TICK_TIME as u128 { + //eprintln!("Tick took {}ms",dur.as_millis()); + } + let start = std::time::Instant::now(); if let Some(processed) = process_audio(&voice_buffer).await { con.send_audio(processed)?; + let dur = start.elapsed(); + if dur >= Duration::from_millis(1) { + eprintln!("Audio pipeline took {}ms",dur.as_millis()); + } } + } _ = tokio::signal::ctrl_c() => { break; } r = events => { @@ -217,7 +231,7 @@ async fn main() -> Result<()> { Ok(()) } -const STEREO_20MS: usize = 48000 * 2 * 20 / 1000; + async fn process_audio(voice_buffer: &AudioBufferDiscord) -> Option { let mut buffer_map; @@ -254,7 +268,7 @@ async fn process_audio(voice_buffer: &AudioBufferDiscord) -> Option { Err(e) => {eprintln!("Failed to encode voice: {}",e); return None;}, Ok(size) => size, }; - println!("Data size: {}/{} enc-length: {}",data.len(),STEREO_20MS,length); + //println!("Data size: {}/{} enc-length: {}",data.len(),STEREO_20MS,length); //println!("length size: {}",length); let duration = start.elapsed().as_millis(); if duration > 15 {