Index: media/audio/linux/audio_manager_linux.cc |
=================================================================== |
--- media/audio/linux/audio_manager_linux.cc (revision 57255) |
+++ media/audio/linux/audio_manager_linux.cc (working copy) |
@@ -4,6 +4,7 @@ |
#include "media/audio/linux/audio_manager_linux.h" |
+#include "base/at_exit.h" |
#include "base/command_line.h" |
#include "base/logging.h" |
#include "media/audio/fake_audio_input_stream.h" |
@@ -12,6 +13,12 @@ |
#include "media/audio/linux/alsa_wrapper.h" |
#include "media/base/media_switches.h" |
+ |
+namespace { |
+ |
+AudioManagerLinux* g_audio_manager = NULL; |
+} // namespace |
+ |
// Implementation of AudioManager. |
bool AudioManagerLinux::HasAudioOutputDevices() { |
// TODO(ajwong): Make this actually query audio devices. |
@@ -49,7 +56,7 @@ |
return FakeAudioOutputStream::MakeFakeStream(); |
} |
- if (!initialized()) { |
+ if (!initialized_) { |
return NULL; |
} |
@@ -61,14 +68,16 @@ |
AlsaPcmOutputStream* stream = |
new AlsaPcmOutputStream(device_name, format, channels, sample_rate, |
bits_per_sample, wrapper_.get(), this, |
- GetMessageLoop()); |
+ audio_thread_.message_loop()); |
AutoLock l(lock_); |
active_streams_[stream] = scoped_refptr<AlsaPcmOutputStream>(stream); |
return stream; |
} |
-AudioManagerLinux::AudioManagerLinux() { |
+AudioManagerLinux::AudioManagerLinux() |
+ : audio_thread_("AudioThread"), |
+ initialized_(false) { |
} |
AudioManagerLinux::~AudioManagerLinux() { |
@@ -82,7 +91,7 @@ |
} |
void AudioManagerLinux::Init() { |
- AudioManagerBase::Init(); |
+ initialized_ = audio_thread_.Start(); |
wrapper_.reset(new AlsaWrapper()); |
} |
@@ -101,7 +110,17 @@ |
} |
} |
-// static |
-AudioManager* AudioManager::CreateAudioManager() { |
- return new AudioManagerLinux(); |
+// TODO(ajwong): Collapse this with the windows version. |
+void DestroyAudioManagerLinux(void* not_used) { |
+ delete g_audio_manager; |
+ g_audio_manager = NULL; |
} |
+ |
+AudioManager* AudioManager::GetAudioManager() { |
+ if (!g_audio_manager) { |
+ g_audio_manager = new AudioManagerLinux(); |
+ g_audio_manager->Init(); |
+ base::AtExitManager::RegisterCallback(&DestroyAudioManagerLinux, NULL); |
+ } |
+ return g_audio_manager; |
+} |