| Index: media/audio/audio_manager_base.cc
|
| diff --git a/media/audio/audio_manager_base.cc b/media/audio/audio_manager_base.cc
|
| index 8a6acc2e7bc89afafedffcb1e857f3c653063028..8845585f6a468ae781e0f8fa1cb837bccd91be74 100644
|
| --- a/media/audio/audio_manager_base.cc
|
| +++ b/media/audio/audio_manager_base.cc
|
| @@ -89,8 +89,12 @@ bool AudioManagerBase::UseSessionIdToSelectDevice(
|
| return session_id && device_id.empty();
|
| }
|
|
|
| -AudioManagerBase::AudioManagerBase(AudioLogFactory* audio_log_factory)
|
| - : max_num_output_streams_(kDefaultMaxOutputStreams),
|
| +AudioManagerBase::AudioManagerBase(
|
| + scoped_refptr<base::SingleThreadTaskRunner> task_runner,
|
| + scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner,
|
| + AudioLogFactory* audio_log_factory)
|
| + : AudioManager(std::move(task_runner), std::move(worker_task_runner)),
|
| + max_num_output_streams_(kDefaultMaxOutputStreams),
|
| max_num_input_streams_(kDefaultMaxInputStreams),
|
| num_output_streams_(0),
|
| num_input_streams_(0),
|
| @@ -99,42 +103,21 @@ AudioManagerBase::AudioManagerBase(AudioLogFactory* audio_log_factory)
|
| // block the UI thread when swapping devices.
|
| output_listeners_(
|
| base::ObserverList<AudioDeviceListener>::NOTIFY_EXISTING_ONLY),
|
| - audio_log_factory_(audio_log_factory) {
|
| -}
|
| + audio_log_factory_(audio_log_factory) {}
|
|
|
| AudioManagerBase::~AudioManagerBase() {
|
| - // The platform specific AudioManager implementation must have already
|
| - // stopped the audio thread. Otherwise, we may destroy audio streams before
|
| - // stopping the thread, resulting an unexpected behavior.
|
| - // This way we make sure activities of the audio streams are all stopped
|
| - // before we destroy them.
|
| - CHECK(!audio_thread_);
|
| + DCHECK(GetTaskRunner()->BelongsToCurrentThread());
|
| +
|
| // All the output streams should have been deleted.
|
| - DCHECK_EQ(0, num_output_streams_);
|
| + CHECK_EQ(0, num_output_streams_);
|
| // All the input streams should have been deleted.
|
| - DCHECK_EQ(0, num_input_streams_);
|
| + CHECK_EQ(0, num_input_streams_);
|
| }
|
|
|
| base::string16 AudioManagerBase::GetAudioInputDeviceModel() {
|
| return base::string16();
|
| }
|
|
|
| -scoped_refptr<base::SingleThreadTaskRunner> AudioManagerBase::GetTaskRunner() {
|
| - if (!audio_thread_) {
|
| - audio_thread_.reset(new base::Thread("AudioThread"));
|
| -#if defined(OS_WIN)
|
| - audio_thread_->init_com_with_mta(true);
|
| -#endif
|
| - CHECK(audio_thread_->Start());
|
| - }
|
| - return audio_thread_->task_runner();
|
| -}
|
| -
|
| -scoped_refptr<base::SingleThreadTaskRunner>
|
| -AudioManagerBase::GetWorkerTaskRunner() {
|
| - return GetTaskRunner();
|
| -}
|
| -
|
| AudioOutputStream* AudioManagerBase::MakeAudioOutputStream(
|
| const AudioParameters& params,
|
| const std::string& device_id) {
|
| @@ -329,26 +312,8 @@ void AudioManagerBase::ReleaseInputStream(AudioInputStream* stream) {
|
| }
|
|
|
| void AudioManagerBase::Shutdown() {
|
| - // Only true when we're sharing the UI message loop with the browser. The UI
|
| - // loop is no longer running at this time and browser destruction is imminent.
|
| - auto task_runner = GetTaskRunner();
|
| - if (task_runner->BelongsToCurrentThread()) {
|
| - ShutdownOnAudioThread();
|
| - } else {
|
| - task_runner->PostTask(FROM_HERE,
|
| - base::Bind(&AudioManagerBase::ShutdownOnAudioThread,
|
| - base::Unretained(this)));
|
| - }
|
| -
|
| - // Stop() will wait for any posted messages to be processed first.
|
| - if (audio_thread_) {
|
| - audio_thread_->Stop();
|
| - audio_thread_.reset();
|
| - }
|
| -}
|
| -
|
| -void AudioManagerBase::ShutdownOnAudioThread() {
|
| DCHECK(GetTaskRunner()->BelongsToCurrentThread());
|
| + // Close all output streams.
|
| while (!output_dispatchers_.empty()) {
|
| output_dispatchers_.back()->dispatcher->Shutdown();
|
| output_dispatchers_.pop_back();
|
|
|