diff --git a/webrtc/modules/audio_coding/neteq/sync_buffer.cc b/webrtc/modules/audio_coding/neteq/sync_buffer.cc index 29630b631f..49f80132a1 100644 --- a/webrtc/modules/audio_coding/neteq/sync_buffer.cc +++ b/webrtc/modules/audio_coding/neteq/sync_buffer.cc @@ -74,7 +74,7 @@ void SyncBuffer::GetNextAudioInterleaved(size_t requested_len, AudioFrame* output) { RTC_DCHECK(output); const size_t samples_to_read = std::min(FutureLength(), requested_len); - output->Reset(); + output->ResetWithoutMuting(); const size_t tot_samples_read = ReadInterleavedFromIndex(next_index_, samples_to_read, output->mutable_data()); diff --git a/webrtc/modules/include/module_common_types.h b/webrtc/modules/include/module_common_types.h index 36024f6108..23ed8f40bf 100644 --- a/webrtc/modules/include/module_common_types.h +++ b/webrtc/modules/include/module_common_types.h @@ -307,6 +307,11 @@ class AudioFrame { // Resets all members to their default state. void Reset(); + // Same as Reset(), but leaves mute state unchanged. Muting a frame requires + // the buffer to be zeroed on the next call to mutable_data(). Callers + // intending to write to the buffer immediately after Reset() can instead use + // ResetWithoutMuting() to skip this wasteful zeroing. + void ResetWithoutMuting(); void UpdateFrame(int id, uint32_t timestamp, const int16_t* data, size_t samples_per_channel, int sample_rate_hz, @@ -370,13 +375,17 @@ inline AudioFrame::AudioFrame() { } inline void AudioFrame::Reset() { + ResetWithoutMuting(); + muted_ = true; +} + +inline void AudioFrame::ResetWithoutMuting() { id_ = -1; // TODO(wu): Zero is a valid value for |timestamp_|. We should initialize // to an invalid value, or add a new member to indicate invalidity. timestamp_ = 0; elapsed_time_ms_ = -1; ntp_time_ms_ = -1; - muted_ = true; samples_per_channel_ = 0; sample_rate_hz_ = 0; num_channels_ = 0;