summaryrefslogtreecommitdiffstats
path: root/media/audio/linux/audio_manager_linux.cc
diff options
context:
space:
mode:
authorajwong@chromium.org <ajwong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-21 05:42:08 +0000
committerajwong@chromium.org <ajwong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-21 05:42:08 +0000
commitfe24ccff145ec31f31b3504419440f1639581862 (patch)
treeaa0e8cc602324d4760949f00f3ac684b6680d551 /media/audio/linux/audio_manager_linux.cc
parent03269cf96713c7b44cf7fe1f8241d0b2e33a7ab6 (diff)
downloadchromium_src-fe24ccff145ec31f31b3504419440f1639581862.zip
chromium_src-fe24ccff145ec31f31b3504419440f1639581862.tar.gz
chromium_src-fe24ccff145ec31f31b3504419440f1639581862.tar.bz2
This iteration creates one message loop per audio output stream that is responsible for buffering data from the data source, and writing the buffers to the output device. This design blocks while waiting for data to be retrieved from the data source, which can lead to unnecessary buffer underruns in the audio device. This will be solved later after the non-blocking AudioSource interface is written.
Review URL: http://codereview.chromium.org/115276 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@16583 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/audio/linux/audio_manager_linux.cc')
-rw-r--r--media/audio/linux/audio_manager_linux.cc67
1 files changed, 64 insertions, 3 deletions
diff --git a/media/audio/linux/audio_manager_linux.cc b/media/audio/linux/audio_manager_linux.cc
index 15a13b2..afe1c3c 100644
--- a/media/audio/linux/audio_manager_linux.cc
+++ b/media/audio/linux/audio_manager_linux.cc
@@ -2,9 +2,70 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "media/audio/audio_output.h"
+#include "media/audio/linux/audio_manager_linux.h"
-// TODO(hclam): Do something more useful than returning NULL.
-AudioManager* AudioManager::GetAudioManager() {
+#include "base/at_exit.h"
+#include "base/logging.h"
+#include "media/audio/linux/alsa_output.h"
+
+namespace {
+AudioManagerLinux* g_audio_manager = NULL;
+} // namespace
+
+// Implementation of AudioManager.
+bool AudioManagerLinux::HasAudioDevices() {
+ // TODO(ajwong): Make this actually query audio devices.
+ return true;
+}
+
+AudioOutputStream* AudioManagerLinux::MakeAudioStream(Format format,
+ int channels,
+ int sample_rate,
+ char bits_per_sample) {
+ // TODO(ajwong): Do we want to be able to configure the device? plug:default
+ // should work correctly for all mono/stereo, but not surround, which needs
+ // surround40, surround51, etc.
+ //
+ // http://0pointer.de/blog/projects/guide-to-sound-apis.html
+ AlsaPCMOutputStream* stream =
+ new AlsaPCMOutputStream(AlsaPCMOutputStream::kDefaultDevice,
+ 100 /* 100ms minimal buffer */,
+ format, channels, sample_rate, bits_per_sample);
+ return stream;
+}
+
+AudioManagerLinux::AudioManagerLinux() {
+}
+
+AudioManagerLinux::~AudioManagerLinux() {
+}
+
+void AudioManagerLinux::MuteAll() {
+ // TODO(ajwong): Implement.
+ NOTIMPLEMENTED();
+}
+
+void AudioManagerLinux::UnMuteAll() {
+ // TODO(ajwong): Implement.
+ NOTIMPLEMENTED();
+}
+
+const void* AudioManagerLinux::GetLastMockBuffer() {
+ // TODO(ajwong): Implement.
+ NOTIMPLEMENTED();
return NULL;
}
+
+// 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();
+ base::AtExitManager::RegisterCallback(&DestroyAudioManagerLinux, NULL);
+ }
+ return g_audio_manager;
+}