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

Side by Side Diff: media/audio/audio_output_resampler.cc

Issue 13390010: Fix a couple bugs with OSX audio buffer size selection. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix unittests. Created 7 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/audio/audio_output_resampler.h" 5 #include "media/audio/audio_output_resampler.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 UMA_HISTOGRAM_ENUMERATION( 117 UMA_HISTOGRAM_ENUMERATION(
118 "Media.FallbackHardwareAudioSamplesPerSecond", 118 "Media.FallbackHardwareAudioSamplesPerSecond",
119 asr, kUnexpectedAudioSampleRate); 119 asr, kUnexpectedAudioSampleRate);
120 } else { 120 } else {
121 UMA_HISTOGRAM_COUNTS( 121 UMA_HISTOGRAM_COUNTS(
122 "Media.FallbackHardwareAudioSamplesPerSecondUnexpected", 122 "Media.FallbackHardwareAudioSamplesPerSecondUnexpected",
123 output_params.sample_rate()); 123 output_params.sample_rate());
124 } 124 }
125 } 125 }
126 126
127 // Only Windows has a high latency output driver that is not the same as the low
128 // latency path.
129 #if defined(OS_WIN)
127 // Converts low latency based |output_params| into high latency appropriate 130 // Converts low latency based |output_params| into high latency appropriate
128 // output parameters in error situations. 131 // output parameters in error situations.
129 static AudioParameters SetupFallbackParams( 132 static AudioParameters SetupFallbackParams(
130 const AudioParameters& input_params, const AudioParameters& output_params) { 133 const AudioParameters& input_params, const AudioParameters& output_params) {
131 // Choose AudioParameters appropriate for opening the device in high latency 134 // Choose AudioParameters appropriate for opening the device in high latency
132 // mode. |kMinLowLatencyFrameSize| is arbitrarily based on Pepper Flash's 135 // mode. |kMinLowLatencyFrameSize| is arbitrarily based on Pepper Flash's
133 // MAXIMUM frame size for low latency. 136 // MAXIMUM frame size for low latency.
134 static const int kMinLowLatencyFrameSize = 2048; 137 static const int kMinLowLatencyFrameSize = 2048;
135 int frames_per_buffer = std::min( 138 int frames_per_buffer = std::min(
136 std::max(input_params.frames_per_buffer(), kMinLowLatencyFrameSize), 139 std::max(input_params.frames_per_buffer(), kMinLowLatencyFrameSize),
137 static_cast<int>( 140 static_cast<int>(
138 GetHighLatencyOutputBufferSize(input_params.sample_rate()))); 141 GetHighLatencyOutputBufferSize(input_params.sample_rate())));
139 142
140 return AudioParameters( 143 return AudioParameters(
141 AudioParameters::AUDIO_PCM_LINEAR, input_params.channel_layout(), 144 AudioParameters::AUDIO_PCM_LINEAR, input_params.channel_layout(),
142 input_params.sample_rate(), input_params.bits_per_sample(), 145 input_params.sample_rate(), input_params.bits_per_sample(),
143 frames_per_buffer); 146 frames_per_buffer);
144 } 147 }
148 #endif
145 149
146 AudioOutputResampler::AudioOutputResampler(AudioManager* audio_manager, 150 AudioOutputResampler::AudioOutputResampler(AudioManager* audio_manager,
147 const AudioParameters& input_params, 151 const AudioParameters& input_params,
148 const AudioParameters& output_params, 152 const AudioParameters& output_params,
149 const base::TimeDelta& close_delay) 153 const base::TimeDelta& close_delay)
150 : AudioOutputDispatcher(audio_manager, input_params), 154 : AudioOutputDispatcher(audio_manager, input_params),
151 close_delay_(close_delay), 155 close_delay_(close_delay),
152 output_params_(output_params), 156 output_params_(output_params),
153 streams_opened_(false) { 157 streams_opened_(false) {
154 DCHECK(input_params.IsValid()); 158 DCHECK(input_params.IsValid());
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 199
196 DCHECK_EQ(output_params_.format(), AudioParameters::AUDIO_PCM_LOW_LATENCY); 200 DCHECK_EQ(output_params_.format(), AudioParameters::AUDIO_PCM_LOW_LATENCY);
197 201
198 if (CommandLine::ForCurrentProcess()->HasSwitch( 202 if (CommandLine::ForCurrentProcess()->HasSwitch(
199 switches::kDisableAudioFallback)) { 203 switches::kDisableAudioFallback)) {
200 LOG(ERROR) << "Open failed and automatic fallback to high latency audio " 204 LOG(ERROR) << "Open failed and automatic fallback to high latency audio "
201 << "path is disabled, aborting."; 205 << "path is disabled, aborting.";
202 return false; 206 return false;
203 } 207 }
204 208
205 DLOG(ERROR) << "Unable to open audio device in low latency mode. Falling "
206 << "back to high latency audio output.";
207
208 // Record UMA statistics about the hardware which triggered the failure so 209 // Record UMA statistics about the hardware which triggered the failure so
209 // we can debug and triage later. 210 // we can debug and triage later.
210 RecordFallbackStats(output_params_); 211 RecordFallbackStats(output_params_);
212
213 // Only Windows has a high latency output driver that is not the same as the
214 // low latency path.
215 #if defined(OS_WIN)
216 DLOG(ERROR) << "Unable to open audio device in low latency mode. Falling "
217 << "back to high latency audio output.";
218
211 output_params_ = SetupFallbackParams(params_, output_params_); 219 output_params_ = SetupFallbackParams(params_, output_params_);
212 Initialize(); 220 Initialize();
213 if (dispatcher_->OpenStream()) { 221 if (dispatcher_->OpenStream()) {
214 streams_opened_ = true; 222 streams_opened_ = true;
215 return true; 223 return true;
216 } 224 }
225 #endif
217 226
218 DLOG(ERROR) << "Unable to open audio device in high latency mode. Falling " 227 DLOG(ERROR) << "Unable to open audio device in high latency mode. Falling "
219 << "back to fake audio output."; 228 << "back to fake audio output.";
220 229
221 // Finally fall back to a fake audio output device. 230 // Finally fall back to a fake audio output device.
222 output_params_.Reset( 231 output_params_.Reset(
223 AudioParameters::AUDIO_FAKE, params_.channel_layout(), 232 AudioParameters::AUDIO_FAKE, params_.channel_layout(),
224 params_.channels(), params_.input_channels(), params_.sample_rate(), 233 params_.channels(), params_.input_channels(), params_.sample_rate(),
225 params_.bits_per_sample(), params_.frames_per_buffer()); 234 params_.bits_per_sample(), params_.frames_per_buffer());
226 Initialize(); 235 Initialize();
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 source_callback_->OnError(stream); 400 source_callback_->OnError(stream);
392 } 401 }
393 402
394 void OnMoreDataConverter::WaitTillDataReady() { 403 void OnMoreDataConverter::WaitTillDataReady() {
395 base::AutoLock auto_lock(source_lock_); 404 base::AutoLock auto_lock(source_lock_);
396 if (source_callback_) 405 if (source_callback_)
397 source_callback_->WaitTillDataReady(); 406 source_callback_->WaitTillDataReady();
398 } 407 }
399 408
400 } // namespace media 409 } // namespace media
OLDNEW
« no previous file with comments | « media/audio/audio_output_proxy_unittest.cc ('k') | media/audio/mac/audio_low_latency_output_mac.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698