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

Unified Diff: media/audio/mac/audio_auhal_mac.cc

Issue 1903753002: Restores larger output buffer size when output stream requiring smaller size is closed (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: nit Created 4 years, 8 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
Index: media/audio/mac/audio_auhal_mac.cc
diff --git a/media/audio/mac/audio_auhal_mac.cc b/media/audio/mac/audio_auhal_mac.cc
index d71673fd12ae517dd61f0fdedabda64d2e7e4077..8bb62e809ecb08be16817bb5389d1b44d657a506 100644
--- a/media/audio/mac/audio_auhal_mac.cc
+++ b/media/audio/mac/audio_auhal_mac.cc
@@ -44,6 +44,7 @@ AUHALStream::AUHALStream(AudioManagerMac* manager,
params_(params),
output_channels_(params_.channels()),
number_of_frames_(params_.frames_per_buffer()),
+ actual_io_buffer_frame_size_(0),
number_of_frames_requested_(0),
source_(NULL),
device_(device),
@@ -115,6 +116,12 @@ bool AUHALStream::Open() {
if (configured)
hardware_latency_frames_ = GetHardwareLatency();
+#if !defined(NDEBUG)
+ // Print a list of all existing output streams and there current buffer size
+ // state (required and actual). Does nothing in Release builds.
+ manager_->PrintOutputBufferSizes();
+#endif
+
return configured;
}
@@ -175,6 +182,7 @@ void AUHALStream::Stop() {
if (stopped_)
return;
DVLOG(1) << "Stop";
+ DVLOG(2) << "number_of_frames: " << number_of_frames_;
OSStatus result = AudioOutputUnitStop(audio_unit_);
OSSTATUS_DLOG_IF(ERROR, result != noErr, result)
<< "AudioOutputUnitStop() failed.";
@@ -217,13 +225,16 @@ OSStatus AUHALStream::Render(
// any further changes will be ignored. It would be nice to have all
// changes reflected in UMA stats.
number_of_frames_requested_ = number_of_frames;
+ actual_io_buffer_frame_size_ = number_of_frames;
DVLOG(1) << "Audio frame size changed from " << number_of_frames_
- << " to " << number_of_frames
- << "; adding FIFO to compensate.";
+ << " to " << number_of_frames << " adding FIFO to compensate.";
audio_fifo_.reset(new AudioPullFifo(
output_channels_,
number_of_frames_,
base::Bind(&AUHALStream::ProvideInput, base::Unretained(this))));
+#if !defined(NDEBUG)
+ manager_->PrintOutputBufferSizes();
+#endif
}
}
@@ -512,6 +523,26 @@ bool AUHALStream::ConfigureAUHAL() {
return false;
}
+ // Get the actual number of frames in the IO buffers after the audio manager
+ // has tried to set the requested size. We could use |io_buffer_frame_size|
+ // here instead of doing these extra steps but I prefer to play it safe and
+ // to ensure that the change done by the audio manager is really active.
+ // TODO(henrika): it might be possible to remove this part.
+ UInt32 actual_io_buffer_frame_size;
+ UInt32 property_size = sizeof(actual_io_buffer_frame_size);
+ result = AudioUnitGetProperty(
+ audio_unit_, kAudioDevicePropertyBufferFrameSize, kAudioUnitScope_Global,
+ 0, &actual_io_buffer_frame_size, &property_size);
+ LOG_IF(WARNING, result != noErr)
+ << "Failed to get the actual I/O buffer size";
+ if (result == noErr) {
+ actual_io_buffer_frame_size_ = actual_io_buffer_frame_size;
+ DVLOG(1) << "actual_io_buffer_frame_size: " << actual_io_buffer_frame_size_;
+ }
+ LOG_IF(WARNING, actual_io_buffer_frame_size_ != number_of_frames_)
+ << "Failed to set the requested buffer frame size exactly";
+ DCHECK_EQ(io_buffer_frame_size, actual_io_buffer_frame_size);
+
// Setup callback.
AURenderCallbackStruct callback;
callback.inputProc = InputProc;

Powered by Google App Engine
This is Rietveld 408576698