summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-01 22:54:46 +0000
committerdalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-01 22:54:46 +0000
commit2ce8ebf7dc12ffe8fa614804038778573472d269 (patch)
tree4b8f39e271d6ee27d525d894aab751355d7091df
parentfb621791cf046c846380f514dea1724845f31f9f (diff)
downloadchromium_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.cc7
-rw-r--r--media/audio/audio_manager.h3
-rw-r--r--media/audio/audio_manager_base.cc4
-rw-r--r--media/audio/audio_manager_base.h3
-rw-r--r--media/audio/mock_audio_manager.cc3
-rw-r--r--media/audio/mock_audio_manager.h3
-rw-r--r--media/audio/win/audio_manager_win.cc11
-rw-r--r--media/audio/win/audio_manager_win.h9
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_;