Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(24)

Unified Diff: webrtc/modules/audio_device/audio_device_buffer.cc

Issue 2324113002: Avoids crash at device switch on iOS (Closed)
Patch Set: Feedback from grunell@ Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/modules/audio_device/audio_device_buffer.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/modules/audio_device/audio_device_buffer.cc
diff --git a/webrtc/modules/audio_device/audio_device_buffer.cc b/webrtc/modules/audio_device/audio_device_buffer.cc
index d157c1cb1ae661483675e18411c0bd57d6a6d449..5a65288a62b34ab0f990e7091142910604911932 100644
--- a/webrtc/modules/audio_device/audio_device_buffer.cc
+++ b/webrtc/modules/audio_device/audio_device_buffer.cc
@@ -61,6 +61,10 @@ AudioDeviceBuffer::AudioDeviceBuffer()
last_play_samples_(0),
last_log_stat_time_(0) {
LOG(INFO) << "AudioDeviceBuffer::ctor";
+ // TODO(henrika): improve buffer handling and ensure that we don't allocate
+ // more than what is required.
+ play_buffer_.reset(new int8_t[kMaxBufferSizeBytes]);
+ rec_buffer_.reset(new int8_t[kMaxBufferSizeBytes]);
}
AudioDeviceBuffer::~AudioDeviceBuffer() {
@@ -235,8 +239,7 @@ int32_t AudioDeviceBuffer::StopOutputFileRecording() {
int32_t AudioDeviceBuffer::SetRecordedBuffer(const void* audio_buffer,
size_t num_samples) {
- AllocateRecordingBufferIfNeeded();
- RTC_CHECK(rec_buffer_);
+ UpdateRecordingParameters();
// WebRTC can only receive audio in 10ms chunks, hence we fail if the native
// audio layer tries to deliver something else.
RTC_CHECK_EQ(num_samples, rec_samples_per_10ms_);
@@ -269,7 +272,6 @@ int32_t AudioDeviceBuffer::SetRecordedBuffer(const void* audio_buffer,
}
int32_t AudioDeviceBuffer::DeliverRecordedData() {
- RTC_CHECK(rec_buffer_);
RTC_DCHECK(audio_transport_cb_);
rtc::CritScope lock(&_critSectCb);
@@ -306,8 +308,7 @@ int32_t AudioDeviceBuffer::RequestPlayoutData(size_t num_samples) {
last_playout_time_ = now_time;
playout_diff_times_[diff_time]++;
- AllocatePlayoutBufferIfNeeded();
- RTC_CHECK(play_buffer_);
+ UpdatePlayoutParameters();
// WebRTC can only provide audio in 10ms chunks, hence we fail if the native
// audio layer asks for something else.
RTC_CHECK_EQ(num_samples, play_samples_per_10ms_);
@@ -346,36 +347,22 @@ int32_t AudioDeviceBuffer::GetPlayoutData(void* audio_buffer) {
return static_cast<int32_t>(play_samples_per_10ms_);
}
-void AudioDeviceBuffer::AllocatePlayoutBufferIfNeeded() {
+void AudioDeviceBuffer::UpdatePlayoutParameters() {
RTC_CHECK(play_bytes_per_sample_);
- if (play_buffer_)
- return;
- LOG(INFO) << __FUNCTION__;
rtc::CritScope lock(&_critSect);
- // Derive the required buffer size given sample rate and number of channels.
+ // Update the required buffer size given sample rate and number of channels.
play_samples_per_10ms_ = static_cast<size_t>(play_sample_rate_ * 10 / 1000);
play_bytes_per_10ms_ = play_bytes_per_sample_ * play_samples_per_10ms_;
- LOG(INFO) << "playout samples per 10ms: " << play_samples_per_10ms_;
- LOG(INFO) << "playout bytes per 10ms: " << play_bytes_per_10ms_;
- // Allocate memory for the playout audio buffer. It will always contain audio
- // samples corresponding to 10ms of audio to be played out.
- play_buffer_.reset(new int8_t[play_bytes_per_10ms_]);
+ RTC_DCHECK_LE(play_bytes_per_10ms_, kMaxBufferSizeBytes);
Henrik Grunell WebRTC 2016/09/09 10:19:29 Nit: I think it should even be a CHECK (not DCHECK
}
-void AudioDeviceBuffer::AllocateRecordingBufferIfNeeded() {
+void AudioDeviceBuffer::UpdateRecordingParameters() {
RTC_CHECK(rec_bytes_per_sample_);
- if (rec_buffer_)
- return;
- LOG(INFO) << __FUNCTION__;
rtc::CritScope lock(&_critSect);
- // Derive the required buffer size given sample rate and number of channels.
+ // Update the required buffer size given sample rate and number of channels.
rec_samples_per_10ms_ = static_cast<size_t>(rec_sample_rate_ * 10 / 1000);
rec_bytes_per_10ms_ = rec_bytes_per_sample_ * rec_samples_per_10ms_;
- LOG(INFO) << "recorded samples per 10ms: " << rec_samples_per_10ms_;
- LOG(INFO) << "recorded bytes per 10ms: " << rec_bytes_per_10ms_;
- // Allocate memory for the recording audio buffer. It will always contain
- // audio samples corresponding to 10ms of audio.
- rec_buffer_.reset(new int8_t[rec_bytes_per_10ms_]);
+ RTC_DCHECK_LE(rec_bytes_per_10ms_, kMaxBufferSizeBytes);
}
void AudioDeviceBuffer::StartTimer() {
« no previous file with comments | « webrtc/modules/audio_device/audio_device_buffer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698