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

Side by Side Diff: media/audio/mac/audio_auhal_mac.cc

Issue 17463009: Try not to let the AUHAL driver get stuck sending silence. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Modify comments. Created 7 years, 6 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
« no previous file with comments | « media/audio/mac/audio_auhal_mac.h ('k') | media/audio/mac/audio_manager_mac.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/mac/audio_auhal_mac.h" 5 #include "media/audio/mac/audio_auhal_mac.h"
6 6
7 #include <CoreServices/CoreServices.h> 7 #include <CoreServices/CoreServices.h>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 params_(params), 65 params_(params),
66 input_channels_(params_.input_channels()), 66 input_channels_(params_.input_channels()),
67 output_channels_(params_.channels()), 67 output_channels_(params_.channels()),
68 number_of_frames_(params_.frames_per_buffer()), 68 number_of_frames_(params_.frames_per_buffer()),
69 source_(NULL), 69 source_(NULL),
70 device_(device), 70 device_(device),
71 audio_unit_(0), 71 audio_unit_(0),
72 volume_(1), 72 volume_(1),
73 hardware_latency_frames_(0), 73 hardware_latency_frames_(0),
74 stopped_(false), 74 stopped_(false),
75 notified_for_possible_device_change_(false),
75 input_buffer_list_(NULL) { 76 input_buffer_list_(NULL) {
76 // We must have a manager. 77 // We must have a manager.
77 DCHECK(manager_); 78 DCHECK(manager_);
78 79
79 VLOG(1) << "AUHALStream::AUHALStream()"; 80 VLOG(1) << "AUHALStream::AUHALStream()";
80 VLOG(1) << "Device: " << device; 81 VLOG(1) << "Device: " << device;
81 VLOG(1) << "Input channels: " << input_channels_; 82 VLOG(1) << "Input channels: " << input_channels_;
82 VLOG(1) << "Output channels: " << output_channels_; 83 VLOG(1) << "Output channels: " << output_channels_;
83 VLOG(1) << "Sample rate: " << params_.sample_rate(); 84 VLOG(1) << "Sample rate: " << params_.sample_rate();
84 VLOG(1) << "Buffer size: " << number_of_frames_; 85 VLOG(1) << "Buffer size: " << number_of_frames_;
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 } 153 }
153 154
154 void AUHALStream::Start(AudioSourceCallback* callback) { 155 void AUHALStream::Start(AudioSourceCallback* callback) {
155 DCHECK(callback); 156 DCHECK(callback);
156 if (!audio_unit_) { 157 if (!audio_unit_) {
157 DLOG(ERROR) << "Open() has not been called successfully"; 158 DLOG(ERROR) << "Open() has not been called successfully";
158 return; 159 return;
159 } 160 }
160 161
161 stopped_ = false; 162 stopped_ = false;
163 notified_for_possible_device_change_ = false;
162 { 164 {
163 base::AutoLock auto_lock(source_lock_); 165 base::AutoLock auto_lock(source_lock_);
164 source_ = callback; 166 source_ = callback;
165 } 167 }
166 168
167 AudioOutputUnitStart(audio_unit_); 169 AudioOutputUnitStart(audio_unit_);
168 } 170 }
169 171
170 void AUHALStream::Stop() { 172 void AUHALStream::Stop() {
171 if (stopped_) 173 if (stopped_)
(...skipping 30 matching lines...) Expand all
202 // This can happen if we've suddenly changed sample-rates. 204 // This can happen if we've suddenly changed sample-rates.
203 // The stream should be stopping very soon. 205 // The stream should be stopping very soon.
204 // 206 //
205 // Unfortunately AUAudioInputStream and AUHALStream share the frame 207 // Unfortunately AUAudioInputStream and AUHALStream share the frame
206 // size set by kAudioDevicePropertyBufferFrameSize above on a per process 208 // size set by kAudioDevicePropertyBufferFrameSize above on a per process
207 // basis. What this means is that the |number_of_frames| value may be 209 // basis. What this means is that the |number_of_frames| value may be
208 // larger or smaller than the value set during ConfigureAUHAL(). 210 // larger or smaller than the value set during ConfigureAUHAL().
209 // In this case either audio input or audio output will be broken, 211 // In this case either audio input or audio output will be broken,
210 // so just output silence. 212 // so just output silence.
211 ZeroBufferList(io_data); 213 ZeroBufferList(io_data);
214
215 // In case we missed a device notification, notify the AudioManager that the
216 // device has changed. HandleDeviceChanges() will check to make sure the
217 // device has actually changed before taking any action.
218 if (!notified_for_possible_device_change_) {
219 notified_for_possible_device_change_ = true;
220 manager_->GetMessageLoop()->PostTask(FROM_HERE, base::Bind(
221 &AudioManagerMac::HandleDeviceChanges, base::Unretained(manager_)));
222 }
223
212 return noErr; 224 return noErr;
213 } 225 }
214 226
215 if (input_channels_ > 0 && input_buffer_list_) { 227 if (input_channels_ > 0 && input_buffer_list_) {
216 // Get the input data. |input_buffer_list_| is wrapped 228 // Get the input data. |input_buffer_list_| is wrapped
217 // to point to the data allocated in |input_bus_|. 229 // to point to the data allocated in |input_bus_|.
218 OSStatus result = AudioUnitRender( 230 OSStatus result = AudioUnitRender(
219 audio_unit_, 231 audio_unit_,
220 flags, 232 flags,
221 output_time_stamp, 233 output_time_stamp,
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after
521 0, 533 0,
522 &callback, 534 &callback,
523 sizeof(callback)); 535 sizeof(callback));
524 if (result != noErr) 536 if (result != noErr)
525 return false; 537 return false;
526 538
527 return true; 539 return true;
528 } 540 }
529 541
530 } // namespace media 542 } // namespace media
OLDNEW
« no previous file with comments | « media/audio/mac/audio_auhal_mac.h ('k') | media/audio/mac/audio_manager_mac.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698