Chromium Code Reviews| Index: media/audio/audio_output_controller.cc |
| diff --git a/media/audio/audio_output_controller.cc b/media/audio/audio_output_controller.cc |
| index fbc8efd4ef874102582d85479bbaf28a20ac2e7a..8be7b811912cce7a4036921eb261d0e659a490ca 100644 |
| --- a/media/audio/audio_output_controller.cc |
| +++ b/media/audio/audio_output_controller.cc |
| @@ -34,6 +34,7 @@ AudioOutputController::AudioOutputController( |
| output_device_id_(output_device_id), |
| stream_(NULL), |
| diverting_to_stream_(NULL), |
| + should_duplicate_(0), |
| volume_(1.0), |
| state_(kEmpty), |
| sync_reader_(sync_reader), |
| @@ -272,12 +273,7 @@ int AudioOutputController::OnMoreData(base::TimeDelta delay, |
| sync_reader_->RequestMoreData(delay, delay_timestamp, prior_frames_skipped); |
| - bool need_to_duplicate = false; |
| - { |
| - base::AutoLock lock(duplication_targets_lock_); |
| - need_to_duplicate = !duplication_targets_.empty(); |
| - } |
| - if (need_to_duplicate) { |
| + if (base::AtomicRefCountIsOne(&should_duplicate_)) { |
| const base::TimeTicks reference_time = delay_timestamp + delay; |
| std::unique_ptr<AudioBus> copy(AudioBus::Create(params_)); |
|
miu
2017/05/18 03:06:29
BTW--The call to AudioBus::Create() here could als
|
| dest->CopyTo(copy.get()); |
| @@ -443,7 +439,9 @@ void AudioOutputController::DoStartDuplicating(AudioPushSink* to_stream) { |
| if (state_ == kClosed) |
| return; |
| - base::AutoLock lock(duplication_targets_lock_); |
| + if (duplication_targets_.empty()) |
| + base::AtomicRefCountInc(&should_duplicate_); |
| + |
| duplication_targets_.insert(to_stream); |
| } |
| @@ -451,8 +449,11 @@ void AudioOutputController::DoStopDuplicating(AudioPushSink* to_stream) { |
| DCHECK(message_loop_->BelongsToCurrentThread()); |
| to_stream->Close(); |
| - base::AutoLock lock(duplication_targets_lock_); |
| duplication_targets_.erase(to_stream); |
| + if (duplication_targets_.empty()) { |
| + const bool is_nonzero = base::AtomicRefCountDec(&should_duplicate_); |
| + DCHECK(!is_nonzero); |
| + } |
| } |
| std::pair<float, bool> AudioOutputController::ReadCurrentPowerAndClip() { |