diff --git a/livekit/src/room/utils/utf8_chunk.rs b/livekit/src/room/utils/utf8_chunk.rs index fd2ba2f0d..d13304cac 100644 --- a/livekit/src/room/utils/utf8_chunk.rs +++ b/livekit/src/room/utils/utf8_chunk.rs @@ -59,11 +59,11 @@ impl<'a> Iterator for Utf8AwareChunks<'a> { pub trait Utf8AwareChunkExt { /// Splits the bytes into chunks of the specified size, ensuring that /// UTF-8 character boundaries are respected. - fn utf8_aware_chunks(&self, chunk_size: usize) -> Utf8AwareChunks; + fn utf8_aware_chunks(&self, chunk_size: usize) -> Utf8AwareChunks<'_>; } impl Utf8AwareChunkExt for [u8] { - fn utf8_aware_chunks(&self, chunk_size: usize) -> Utf8AwareChunks { + fn utf8_aware_chunks(&self, chunk_size: usize) -> Utf8AwareChunks<'_> { Utf8AwareChunks::new(self, chunk_size) } } diff --git a/webrtc-sys/build.rs b/webrtc-sys/build.rs index a217829a8..84fa8588d 100644 --- a/webrtc-sys/build.rs +++ b/webrtc-sys/build.rs @@ -216,7 +216,8 @@ fn main() { .file("src/objc_video_factory.mm") .file("src/objc_video_frame_buffer.mm") .flag("-stdlib=libc++") - .flag("-std=c++20"); + .flag("-std=c++20") + .flag("-Wno-nullability-completeness"); } "ios" => { println!("cargo:rustc-link-lib=framework=Foundation"); diff --git a/webrtc-sys/include/livekit/audio_track.h b/webrtc-sys/include/livekit/audio_track.h index 349bb7cea..042cd44bb 100644 --- a/webrtc-sys/include/livekit/audio_track.h +++ b/webrtc-sys/include/livekit/audio_track.h @@ -17,6 +17,7 @@ #pragma once #include +#include #include "api/audio/audio_frame.h" #include "api/audio_options.h" @@ -137,7 +138,7 @@ class AudioTrackSource { void (*on_complete_)(const SourceContext*) RTC_GUARDED_BY(mutex_); int missed_frames_ RTC_GUARDED_BY(mutex_) = 0; - int16_t* silence_buffer_ = nullptr; + std::vector silence_buffer_; int sample_rate_; int num_channels_; diff --git a/webrtc-sys/src/audio_track.cpp b/webrtc-sys/src/audio_track.cpp index ea9f6986f..24d3e444b 100644 --- a/webrtc-sys/src/audio_track.cpp +++ b/webrtc-sys/src/audio_track.cpp @@ -150,7 +150,7 @@ AudioTrackSource::InternalSource::InternalSource( int samples10ms = sample_rate / 100 * num_channels; - silence_buffer_ = new int16_t[samples10ms](); + silence_buffer_.assign(samples10ms, 0); queue_size_samples_ = queue_size_ms / 10 * samples10ms; notify_threshold_samples_ = queue_size_samples_; // TODO: this is currently // using x2 the queue size @@ -164,10 +164,13 @@ AudioTrackSource::InternalSource::InternalSource( audio_queue_.get(), [this, samples10ms]() { webrtc::MutexLock lock(&mutex_); + constexpr int kBitsPerSample = sizeof(int16_t) * 8; if (buffer_.size() >= samples10ms) { + // Reset |missed_frames_| to 0 so that it won't keep sending silence to webrtc due to audio callback timing drifts. + missed_frames_ = 0; for (auto sink : sinks_) - sink->OnData(buffer_.data(), sizeof(int16_t) * 8, sample_rate_, + sink->OnData(buffer_.data(), kBitsPerSample, sample_rate_, num_channels_, samples10ms / num_channels_); buffer_.erase(buffer_.begin(), buffer_.begin() + samples10ms); @@ -175,7 +178,7 @@ AudioTrackSource::InternalSource::InternalSource( missed_frames_++; if (missed_frames_ >= silence_frames_threshold) { for (auto sink : sinks_) - sink->OnData(silence_buffer_, sizeof(int16_t) * 8, sample_rate_, + sink->OnData(silence_buffer_.data(), kBitsPerSample, sample_rate_, num_channels_, samples10ms / num_channels_); } } @@ -192,7 +195,6 @@ AudioTrackSource::InternalSource::InternalSource( } AudioTrackSource::InternalSource::~InternalSource() { - delete[] silence_buffer_; } bool AudioTrackSource::InternalSource::capture_frame(