| Index: media/audio/audio_output_dispatcher_impl.cc
|
| diff --git a/media/audio/audio_output_dispatcher_impl.cc b/media/audio/audio_output_dispatcher_impl.cc
|
| index b538acde82cdb67b8a9117f0ba4b530091a2ddcc..8630c6f7f45156a86e6f612de53afeae44891261 100644
|
| --- a/media/audio/audio_output_dispatcher_impl.cc
|
| +++ b/media/audio/audio_output_dispatcher_impl.cc
|
| @@ -19,9 +19,7 @@ AudioOutputDispatcherImpl::AudioOutputDispatcherImpl(
|
| const AudioParameters& params,
|
| const std::string& output_device_id,
|
| const base::TimeDelta& close_delay)
|
| - : AudioOutputDispatcher(audio_manager,
|
| - params,
|
| - output_device_id),
|
| + : AudioOutputDispatcher(audio_manager, params, output_device_id),
|
| idle_proxies_(0),
|
| close_timer_(FROM_HERE,
|
| close_delay,
|
| @@ -29,25 +27,30 @@ AudioOutputDispatcherImpl::AudioOutputDispatcherImpl(
|
| &AudioOutputDispatcherImpl::CloseAllIdleStreams),
|
| audio_log_(
|
| audio_manager->CreateAudioLog(AudioLogFactory::AUDIO_OUTPUT_STREAM)),
|
| - audio_stream_id_(0) {}
|
| + audio_stream_id_(0),
|
| + weak_factory_(this) {}
|
|
|
| AudioOutputDispatcherImpl::~AudioOutputDispatcherImpl() {
|
| CHECK(task_runner_->BelongsToCurrentThread());
|
|
|
| + // Stop all active streams.
|
| + for (auto& iter : proxy_to_physical_map_) {
|
| + StopPhysicalStream(iter.second);
|
| + }
|
| +
|
| // Close all idle streams immediately. The |close_timer_| will handle
|
| // invalidating any outstanding tasks upon its destruction.
|
| CloseAllIdleStreams();
|
|
|
| - // There must be no idle proxy streams.
|
| - CHECK_EQ(idle_proxies_, 0u);
|
| -
|
| - // There must be no active proxy streams.
|
| - CHECK(proxy_to_physical_map_.empty());
|
| -
|
| // All idle physical streams must have been closed during shutdown.
|
| CHECK(idle_streams_.empty());
|
| }
|
|
|
| +AudioOutputProxy* AudioOutputDispatcherImpl::CreateStreamProxy() {
|
| + DCHECK(task_runner_->BelongsToCurrentThread());
|
| + return new AudioOutputProxy(weak_factory_.GetWeakPtr());
|
| +}
|
| +
|
| bool AudioOutputDispatcherImpl::OpenStream() {
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
|
|
| @@ -94,15 +97,9 @@ void AudioOutputDispatcherImpl::StopStream(AudioOutputProxy* stream_proxy) {
|
|
|
| AudioStreamMap::iterator it = proxy_to_physical_map_.find(stream_proxy);
|
| DCHECK(it != proxy_to_physical_map_.end());
|
| - AudioOutputStream* physical_stream = it->second;
|
| + StopPhysicalStream(it->second);
|
| proxy_to_physical_map_.erase(it);
|
| -
|
| - physical_stream->Stop();
|
| - audio_log_->OnStopped(audio_stream_ids_[physical_stream]);
|
| ++idle_proxies_;
|
| - idle_streams_.push_back(physical_stream);
|
| -
|
| - close_timer_.Reset();
|
| }
|
|
|
| void AudioOutputDispatcherImpl::StreamVolumeSet(AudioOutputProxy* stream_proxy,
|
| @@ -177,4 +174,12 @@ void AudioOutputDispatcherImpl::CloseIdleStreams(size_t keep_alive) {
|
| idle_streams_.erase(idle_streams_.begin() + keep_alive, idle_streams_.end());
|
| }
|
|
|
| +void AudioOutputDispatcherImpl::StopPhysicalStream(AudioOutputStream* stream) {
|
| + DCHECK(task_runner_->BelongsToCurrentThread());
|
| + stream->Stop();
|
| + audio_log_->OnStopped(audio_stream_ids_[stream]);
|
| + idle_streams_.push_back(stream);
|
| + close_timer_.Reset();
|
| +}
|
| +
|
| } // namespace media
|
|
|