diff options
author | dalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-01 22:54:46 +0000 |
---|---|---|
committer | dalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-01 22:54:46 +0000 |
commit | 2ce8ebf7dc12ffe8fa614804038778573472d269 (patch) | |
tree | 4b8f39e271d6ee27d525d894aab751355d7091df | |
parent | fb621791cf046c846380f514dea1724845f31f9f (diff) | |
download | chromium_src-2ce8ebf7dc12ffe8fa614804038778573472d269.zip chromium_src-2ce8ebf7dc12ffe8fa614804038778573472d269.tar.gz chromium_src-2ce8ebf7dc12ffe8fa614804038778573472d269.tar.bz2 |
Collapse InitializeOnAudioThread() into AudioManagerWin.
AudioManagerWin is the only one who needs this functionality and
per scherkus it's okay to pass this to another thread so long as
it's in the top level concrete class:
"If you post a task using |this| inside of a concrete ctor (e.g.,
AMLinux, AMWin) it's functionally the same as executing it
post-concrete-ctor as AudioManager::Create()."
BUG=none
TEST=none yet.
Review URL: https://chromiumcodereview.appspot.com/11367028
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@165538 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | media/audio/audio_manager.cc | 7 | ||||
-rw-r--r-- | media/audio/audio_manager.h | 3 | ||||
-rw-r--r-- | media/audio/audio_manager_base.cc | 4 | ||||
-rw-r--r-- | media/audio/audio_manager_base.h | 3 | ||||
-rw-r--r-- | media/audio/mock_audio_manager.cc | 3 | ||||
-rw-r--r-- | media/audio/mock_audio_manager.h | 3 | ||||
-rw-r--r-- | media/audio/win/audio_manager_win.cc | 11 | ||||
-rw-r--r-- | media/audio/win/audio_manager_win.h | 9 |
8 files changed, 12 insertions, 31 deletions
diff --git a/media/audio/audio_manager.cc b/media/audio/audio_manager.cc index 787750a..9372d08 100644 --- a/media/audio/audio_manager.cc +++ b/media/audio/audio_manager.cc @@ -23,12 +23,7 @@ AudioManager::~AudioManager() { // static AudioManager* AudioManager::Create() { - AudioManager* manager = CreateAudioManager(); - if (manager) { - manager->GetMessageLoop()->PostTask(FROM_HERE, base::Bind( - &AudioManager::InitializeOnAudioThread, base::Unretained(manager))); - } - return manager; + return CreateAudioManager(); } } // namespace media diff --git a/media/audio/audio_manager.h b/media/audio/audio_manager.h index 2675442..ca4c468 100644 --- a/media/audio/audio_manager.h +++ b/media/audio/audio_manager.h @@ -127,9 +127,6 @@ class MEDIA_EXPORT AudioManager { protected: AudioManager(); - // Called on the audio thread's message loop immediately after construction. - virtual void InitializeOnAudioThread() = 0; - private: DISALLOW_COPY_AND_ASSIGN(AudioManager); }; diff --git a/media/audio/audio_manager_base.cc b/media/audio/audio_manager_base.cc index 6b1fa92..0ca8cb5 100644 --- a/media/audio/audio_manager_base.cc +++ b/media/audio/audio_manager_base.cc @@ -66,10 +66,6 @@ AudioManagerBase::~AudioManagerBase() { DCHECK_EQ(0, num_input_streams_); } -void AudioManagerBase::InitializeOnAudioThread() { - DCHECK(message_loop_->BelongsToCurrentThread()); -} - string16 AudioManagerBase::GetAudioInputDeviceModel() { return string16(); } diff --git a/media/audio/audio_manager_base.h b/media/audio/audio_manager_base.h index 7372c61..57b4fe4 100644 --- a/media/audio/audio_manager_base.h +++ b/media/audio/audio_manager_base.h @@ -122,9 +122,6 @@ class MEDIA_EXPORT AudioManagerBase : public AudioManager { // thread. void NotifyAllOutputDeviceChangeListeners(); - // AudioManager implementation. - virtual void InitializeOnAudioThread() OVERRIDE; - // Map of cached AudioOutputDispatcher instances. Must only be touched // from the audio thread (no locking). AudioOutputDispatchersMap output_dispatchers_; diff --git a/media/audio/mock_audio_manager.cc b/media/audio/mock_audio_manager.cc index 09e3d29..9a40b65 100644 --- a/media/audio/mock_audio_manager.cc +++ b/media/audio/mock_audio_manager.cc @@ -74,7 +74,4 @@ void MockAudioManager::RemoveOutputDeviceChangeListener( AudioDeviceListener* listener) { } -void MockAudioManager::InitializeOnAudioThread() { -} - } // namespace media. diff --git a/media/audio/mock_audio_manager.h b/media/audio/mock_audio_manager.h index d080fe3..6a94055 100644 --- a/media/audio/mock_audio_manager.h +++ b/media/audio/mock_audio_manager.h @@ -55,9 +55,6 @@ class MockAudioManager : public media::AudioManager { virtual void RemoveOutputDeviceChangeListener( AudioDeviceListener* listener) OVERRIDE; - protected: - virtual void InitializeOnAudioThread() OVERRIDE; - private: virtual ~MockAudioManager(); diff --git a/media/audio/win/audio_manager_win.cc b/media/audio/win/audio_manager_win.cc index aa324bc..162d09f 100644 --- a/media/audio/win/audio_manager_win.cc +++ b/media/audio/win/audio_manager_win.cc @@ -113,13 +113,18 @@ AudioManagerWin::AudioManagerWin() { } SetMaxOutputStreamsAllowed(kMaxOutputStreams); + + // Task must be posted last to avoid races from handing out "this" to the + // audio thread. + GetMessageLoop()->PostTask(FROM_HERE, base::Bind( + &AudioManagerWin::CreateDeviceListener, base::Unretained(this))); } AudioManagerWin::~AudioManagerWin() { // It's safe to post a task here since Shutdown() will wait for all tasks to // complete before returning. GetMessageLoop()->PostTask(FROM_HERE, base::Bind( - &AudioManagerWin::DestructOnAudioThread, base::Unretained(this))); + &AudioManagerWin::DestroyDeviceListener, base::Unretained(this))); Shutdown(); } @@ -131,7 +136,7 @@ bool AudioManagerWin::HasAudioInputDevices() { return (::waveInGetNumDevs() != 0); } -void AudioManagerWin::InitializeOnAudioThread() { +void AudioManagerWin::CreateDeviceListener() { // AudioDeviceListenerWin must be initialized on a COM thread and should only // be used if WASAPI / Core Audio is supported. if (media::IsWASAPISupported()) { @@ -142,7 +147,7 @@ void AudioManagerWin::InitializeOnAudioThread() { } } -void AudioManagerWin::DestructOnAudioThread() { +void AudioManagerWin::DestroyDeviceListener() { output_device_listener_.reset(); } diff --git a/media/audio/win/audio_manager_win.h b/media/audio/win/audio_manager_win.h index 4046577..4ce2fbc 100644 --- a/media/audio/win/audio_manager_win.h +++ b/media/audio/win/audio_manager_win.h @@ -44,9 +44,6 @@ class MEDIA_EXPORT AudioManagerWin : public AudioManagerBase { protected: virtual ~AudioManagerWin(); - // Implementation of AudioManager. - virtual void InitializeOnAudioThread() OVERRIDE; - private: enum EnumerationType { kUninitializedEnumeration = 0, @@ -72,9 +69,9 @@ class MEDIA_EXPORT AudioManagerWin : public AudioManagerBase { const AudioParameters& params, const std::string& device_id); - // |output_device_listener_| must be destructed on the same COM thread it was - // initialized on. - void DestructOnAudioThread(); + // Helper methods for constructing AudioDeviceListenerWin on the audio thread. + void CreateDeviceListener(); + void DestroyDeviceListener(); // Listen for output device changes. scoped_ptr<AudioDeviceListenerWin> output_device_listener_; |