OLD | NEW |
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/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 DCHECK(message_loop_->BelongsToCurrentThread()); | 288 DCHECK(message_loop_->BelongsToCurrentThread()); |
289 | 289 |
290 // No AudioOutputProxy objects should hold a reference to us when we get | 290 // No AudioOutputProxy objects should hold a reference to us when we get |
291 // to this stage. | 291 // to this stage. |
292 DCHECK(HasOneRef()) << "Only the AudioManager should hold a reference"; | 292 DCHECK(HasOneRef()) << "Only the AudioManager should hold a reference"; |
293 | 293 |
294 dispatcher_->Shutdown(); | 294 dispatcher_->Shutdown(); |
295 DCHECK(callbacks_.empty()); | 295 DCHECK(callbacks_.empty()); |
296 } | 296 } |
297 | 297 |
| 298 void AudioOutputResampler::CloseStreamsForWedgeFix() { |
| 299 DCHECK(message_loop_->BelongsToCurrentThread()); |
| 300 |
| 301 // Stop and close all active streams. Once all streams across all dispatchers |
| 302 // have been closed the AudioManager will call RestartStreamsForWedgeFix(). |
| 303 for (CallbackMap::iterator it = callbacks_.begin(); it != callbacks_.end(); |
| 304 ++it) { |
| 305 dispatcher_->StopStream(it->first); |
| 306 dispatcher_->CloseStream(it->first); |
| 307 } |
| 308 |
| 309 // Close all idle streams as well. |
| 310 dispatcher_->CloseStreamsForWedgeFix(); |
| 311 } |
| 312 |
| 313 void AudioOutputResampler::RestartStreamsForWedgeFix() { |
| 314 DCHECK(message_loop_->BelongsToCurrentThread()); |
| 315 for (CallbackMap::iterator it = callbacks_.begin(); it != callbacks_.end(); |
| 316 ++it) { |
| 317 dispatcher_->OpenStream(); |
| 318 dispatcher_->StartStream(it->second, it->first); |
| 319 } |
| 320 } |
| 321 |
298 OnMoreDataConverter::OnMoreDataConverter(const AudioParameters& input_params, | 322 OnMoreDataConverter::OnMoreDataConverter(const AudioParameters& input_params, |
299 const AudioParameters& output_params) | 323 const AudioParameters& output_params) |
300 : source_callback_(NULL), | 324 : source_callback_(NULL), |
301 source_bus_(NULL), | 325 source_bus_(NULL), |
302 input_bytes_per_second_(input_params.GetBytesPerSecond()), | 326 input_bytes_per_second_(input_params.GetBytesPerSecond()), |
303 audio_converter_(input_params, output_params, false) { | 327 audio_converter_(input_params, output_params, false) { |
304 io_ratio_ = | 328 io_ratio_ = |
305 static_cast<double>(input_params.GetBytesPerSecond()) / | 329 static_cast<double>(input_params.GetBytesPerSecond()) / |
306 output_params.GetBytesPerSecond(); | 330 output_params.GetBytesPerSecond(); |
307 } | 331 } |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 return frames > 0 ? 1 : 0; | 409 return frames > 0 ? 1 : 0; |
386 } | 410 } |
387 | 411 |
388 void OnMoreDataConverter::OnError(AudioOutputStream* stream) { | 412 void OnMoreDataConverter::OnError(AudioOutputStream* stream) { |
389 base::AutoLock auto_lock(source_lock_); | 413 base::AutoLock auto_lock(source_lock_); |
390 if (source_callback_) | 414 if (source_callback_) |
391 source_callback_->OnError(stream); | 415 source_callback_->OnError(stream); |
392 } | 416 } |
393 | 417 |
394 } // namespace media | 418 } // namespace media |
OLD | NEW |