summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
Diffstat (limited to 'media')
-rw-r--r--media/audio/audio_manager.cc10
-rw-r--r--media/audio/audio_manager.h3
-rw-r--r--media/audio/audio_manager_base.cc8
-rw-r--r--media/audio/audio_manager_base.h1
-rw-r--r--media/audio/audio_output_controller.cc9
-rw-r--r--media/audio/audio_output_proxy_unittest.cc1
6 files changed, 30 insertions, 2 deletions
diff --git a/media/audio/audio_manager.cc b/media/audio/audio_manager.cc
index 3abd010..bc91c63 100644
--- a/media/audio/audio_manager.cc
+++ b/media/audio/audio_manager.cc
@@ -9,6 +9,7 @@
namespace {
+bool g_destroy_called = false;
AudioManager* g_audio_manager = NULL;
// NullAudioManager is the audio manager used on the systems that have no
@@ -40,13 +41,18 @@ class NullAudioManager : public AudioManager {
// static
void AudioManager::Destroy(void* not_used) {
- delete g_audio_manager;
+ g_destroy_called = true;
+
+ g_audio_manager->Cleanup();
+
+ AudioManager* audio_manager = g_audio_manager;
g_audio_manager = NULL;
+ delete audio_manager;
}
// static
AudioManager* AudioManager::GetAudioManager() {
- if (!g_audio_manager) {
+ if (!g_audio_manager && !g_destroy_called) {
g_audio_manager = CreateAudioManager();
g_audio_manager->Init();
base::AtExitManager::RegisterCallback(&AudioManager::Destroy, NULL);
diff --git a/media/audio/audio_manager.h b/media/audio/audio_manager.h
index aa7f018..2afc789 100644
--- a/media/audio/audio_manager.h
+++ b/media/audio/audio_manager.h
@@ -93,6 +93,9 @@ class AudioManager {
// Called from GetAudioManager() to initialiaze the instance.
virtual void Init() = 0;
+ // Called by Destroy() to cleanup the instance before destruction.
+ virtual void Cleanup() = 0;
+
private:
static void Destroy(void*);
diff --git a/media/audio/audio_manager_base.cc b/media/audio/audio_manager_base.cc
index e522240..73a97ba 100644
--- a/media/audio/audio_manager_base.cc
+++ b/media/audio/audio_manager_base.cc
@@ -16,12 +16,20 @@ AudioManagerBase::AudioManagerBase()
}
AudioManagerBase::~AudioManagerBase() {
+ DCHECK(!audio_thread_.IsRunning());
}
void AudioManagerBase::Init() {
initialized_ = audio_thread_.Start();
}
+void AudioManagerBase::Cleanup() {
+ if (initialized_) {
+ initialized_ = false;
+ audio_thread_.Stop();
+ }
+}
+
string16 AudioManagerBase::GetAudioInputDeviceModel() {
return string16();
}
diff --git a/media/audio/audio_manager_base.h b/media/audio/audio_manager_base.h
index aa664f4..370a20c 100644
--- a/media/audio/audio_manager_base.h
+++ b/media/audio/audio_manager_base.h
@@ -18,6 +18,7 @@ class AudioManagerBase : public AudioManager {
AudioManagerBase();
virtual void Init();
+ virtual void Cleanup();
virtual MessageLoop* GetMessageLoop();
diff --git a/media/audio/audio_output_controller.cc b/media/audio/audio_output_controller.cc
index ee2614e..1d84638 100644
--- a/media/audio/audio_output_controller.cc
+++ b/media/audio/audio_output_controller.cc
@@ -48,6 +48,9 @@ scoped_refptr<AudioOutputController> AudioOutputController::Create(
if (!CheckParameters(params))
return NULL;
+ if (!AudioManager::GetAudioManager())
+ return NULL;
+
// Starts the audio controller thread.
scoped_refptr<AudioOutputController> controller(new AudioOutputController(
event_handler, buffer_capacity, NULL));
@@ -72,6 +75,9 @@ scoped_refptr<AudioOutputController> AudioOutputController::CreateLowLatency(
if (!CheckParameters(params))
return NULL;
+ if (!AudioManager::GetAudioManager())
+ return NULL;
+
// Starts the audio controller thread.
scoped_refptr<AudioOutputController> controller(new AudioOutputController(
event_handler, 0, sync_reader));
@@ -142,6 +148,9 @@ void AudioOutputController::DoCreate(AudioParameters params) {
return;
DCHECK(state_ == kEmpty);
+ if (!AudioManager::GetAudioManager())
+ return;
+
stream_ = AudioManager::GetAudioManager()->MakeAudioOutputStreamProxy(params);
if (!stream_) {
// TODO(hclam): Define error types.
diff --git a/media/audio/audio_output_proxy_unittest.cc b/media/audio/audio_output_proxy_unittest.cc
index efc164c..0e531dd 100644
--- a/media/audio/audio_output_proxy_unittest.cc
+++ b/media/audio/audio_output_proxy_unittest.cc
@@ -38,6 +38,7 @@ class MockAudioManager : public AudioManager {
MockAudioManager() { };
MOCK_METHOD0(Init, void());
+ MOCK_METHOD0(Cleanup, void());
MOCK_METHOD0(HasAudioOutputDevices, bool());
MOCK_METHOD0(HasAudioInputDevices, bool());
MOCK_METHOD0(GetAudioInputDeviceModel, string16());