diff options
author | xians@chromium.org <xians@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-18 21:06:12 +0000 |
---|---|---|
committer | xians@chromium.org <xians@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-18 21:06:12 +0000 |
commit | 31c0e51315a22462860909c286a8db2324c7b6b9 (patch) | |
tree | 02ab61bbbc45398373c364cb26561f0ec531b2d9 /media/audio | |
parent | c534204df06b02679552f360dafb32854388348f (diff) | |
download | chromium_src-31c0e51315a22462860909c286a8db2324c7b6b9.zip chromium_src-31c0e51315a22462860909c286a8db2324c7b6b9.tar.gz chromium_src-31c0e51315a22462860909c286a8db2324c7b6b9.tar.bz2 |
Break down AudioManagerLinux cras code to AudioManagerCras to remove the if-statements and if-def checks.
BUG=148661
TEST=compile
Review URL: https://chromiumcodereview.appspot.com/12226111
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@183140 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/audio')
-rw-r--r-- | media/audio/cras/audio_manager_cras.cc | 106 | ||||
-rw-r--r-- | media/audio/cras/audio_manager_cras.h | 59 | ||||
-rw-r--r-- | media/audio/cras/cras_input.cc (renamed from media/audio/linux/cras_input.cc) | 6 | ||||
-rw-r--r-- | media/audio/cras/cras_input.h (renamed from media/audio/linux/cras_input.h) | 12 | ||||
-rw-r--r-- | media/audio/cras/cras_input_unittest.cc (renamed from media/audio/linux/cras_input_unittest.cc) | 10 | ||||
-rw-r--r-- | media/audio/cras/cras_output.cc (renamed from media/audio/linux/cras_output.cc) | 6 | ||||
-rw-r--r-- | media/audio/cras/cras_output.h (renamed from media/audio/linux/cras_output.h) | 12 | ||||
-rw-r--r-- | media/audio/cras/cras_output_unittest.cc (renamed from media/audio/linux/cras_output_unittest.cc) | 13 | ||||
-rw-r--r-- | media/audio/linux/audio_manager_linux.cc | 55 | ||||
-rw-r--r-- | media/audio/linux/audio_manager_linux.h | 6 |
10 files changed, 204 insertions, 81 deletions
diff --git a/media/audio/cras/audio_manager_cras.cc b/media/audio/cras/audio_manager_cras.cc new file mode 100644 index 0000000..2d0d9cf --- /dev/null +++ b/media/audio/cras/audio_manager_cras.cc @@ -0,0 +1,106 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/audio/cras/audio_manager_cras.h" + +#include "base/command_line.h" +#include "base/environment.h" +#include "base/logging.h" +#include "base/nix/xdg_util.h" +#include "base/process_util.h" +#include "base/stl_util.h" +#include "media/audio/audio_util.h" +#include "media/audio/cras/cras_input.h" +#include "media/audio/cras/cras_output.h" + +namespace media { + +// Maximum number of output streams that can be open simultaneously. +static const int kMaxOutputStreams = 50; + +static const char kCrasAutomaticDeviceName[] = "Automatic"; +static const char kCrasAutomaticDeviceId[] = "automatic"; + +bool AudioManagerCras::HasAudioOutputDevices() { + return true; +} + +bool AudioManagerCras::HasAudioInputDevices() { + return true; +} + +AudioManagerCras::AudioManagerCras() { + SetMaxOutputStreamsAllowed(kMaxOutputStreams); +} + +AudioManagerCras::~AudioManagerCras() { + Shutdown(); +} + +bool AudioManagerCras::CanShowAudioInputSettings() { + return false; +} + +void AudioManagerCras::ShowAudioInputSettings() { + NOTIMPLEMENTED(); +} + +void AudioManagerCras::GetAudioInputDeviceNames( + media::AudioDeviceNames* device_names) { + DCHECK(device_names->empty()); + GetCrasAudioInputDevices(device_names); + return; +} + +void AudioManagerCras::GetCrasAudioInputDevices( + media::AudioDeviceNames* device_names) { + // Cras will route audio from a proper physical device automatically. + device_names->push_back(media::AudioDeviceName( + kCrasAutomaticDeviceName, kCrasAutomaticDeviceId)); +} + +AudioOutputStream* AudioManagerCras::MakeLinearOutputStream( + const AudioParameters& params) { + DCHECK_EQ(AudioParameters::AUDIO_PCM_LINEAR, params.format()); + return MakeOutputStream(params); +} + +AudioOutputStream* AudioManagerCras::MakeLowLatencyOutputStream( + const AudioParameters& params) { + DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format()); + return MakeOutputStream(params); +} + +AudioInputStream* AudioManagerCras::MakeLinearInputStream( + const AudioParameters& params, const std::string& device_id) { + DCHECK_EQ(AudioParameters::AUDIO_PCM_LINEAR, params.format()); + return MakeInputStream(params, device_id); +} + +AudioInputStream* AudioManagerCras::MakeLowLatencyInputStream( + const AudioParameters& params, const std::string& device_id) { + DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format()); + return MakeInputStream(params, device_id); +} + +AudioOutputStream* AudioManagerCras::MakeOutputStream( + const AudioParameters& params) { + return new CrasOutputStream(params, this); +} + +AudioInputStream* AudioManagerCras::MakeInputStream( + const AudioParameters& params, const std::string& device_id) { + return new CrasInputStream(params, this); +} + +AudioParameters AudioManagerCras::GetPreferredLowLatencyOutputStreamParameters( + const AudioParameters& input_params) { + // TODO(dalecurtis): This should include bits per channel and channel layout + // eventually. + return AudioParameters( + AudioParameters::AUDIO_PCM_LOW_LATENCY, input_params.channel_layout(), + input_params.sample_rate(), 16, input_params.frames_per_buffer()); +} + +} // namespace media diff --git a/media/audio/cras/audio_manager_cras.h b/media/audio/cras/audio_manager_cras.h new file mode 100644 index 0000000..7ff7ba4 --- /dev/null +++ b/media/audio/cras/audio_manager_cras.h @@ -0,0 +1,59 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_AUDIO_CRAS_AUDIO_MANAGER_CRAS_H_ +#define MEDIA_AUDIO_CRAS_AUDIO_MANAGER_CRAS_H_ + +#include <string> + +#include "base/compiler_specific.h" +#include "base/memory/ref_counted.h" +#include "media/audio/audio_manager_base.h" + +namespace media { + +class MEDIA_EXPORT AudioManagerCras : public AudioManagerBase { + public: + AudioManagerCras(); + + // AudioManager implementation. + virtual bool HasAudioOutputDevices() OVERRIDE; + virtual bool HasAudioInputDevices() OVERRIDE; + virtual bool CanShowAudioInputSettings() OVERRIDE; + virtual void ShowAudioInputSettings() OVERRIDE; + virtual void GetAudioInputDeviceNames(media::AudioDeviceNames* device_names) + OVERRIDE; + + // AudioManagerBase implementation. + virtual AudioOutputStream* MakeLinearOutputStream( + const AudioParameters& params) OVERRIDE; + virtual AudioOutputStream* MakeLowLatencyOutputStream( + const AudioParameters& params) OVERRIDE; + virtual AudioInputStream* MakeLinearInputStream( + const AudioParameters& params, const std::string& device_id) OVERRIDE; + virtual AudioInputStream* MakeLowLatencyInputStream( + const AudioParameters& params, const std::string& device_id) OVERRIDE; + virtual AudioParameters GetPreferredLowLatencyOutputStreamParameters( + const AudioParameters& input_params) OVERRIDE; + + protected: + virtual ~AudioManagerCras(); + + private: + // Gets a list of available cras input devices. + void GetCrasAudioInputDevices(media::AudioDeviceNames* device_names); + + // Called by MakeLinearOutputStream and MakeLowLatencyOutputStream. + AudioOutputStream* MakeOutputStream(const AudioParameters& params); + + // Called by MakeLinearInputStream and MakeLowLatencyInputStream. + AudioInputStream* MakeInputStream(const AudioParameters& params, + const std::string& device_id); + + DISALLOW_COPY_AND_ASSIGN(AudioManagerCras); +}; + +} // namespace media + +#endif // MEDIA_AUDIO_CRAS_AUDIO_MANAGER_CRAS_H_ diff --git a/media/audio/linux/cras_input.cc b/media/audio/cras/cras_input.cc index 6de405e..d93b695 100644 --- a/media/audio/linux/cras_input.cc +++ b/media/audio/cras/cras_input.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "media/audio/linux/cras_input.h" +#include "media/audio/cras/cras_input.h" #include <math.h> @@ -11,13 +11,13 @@ #include "base/logging.h" #include "base/time.h" #include "media/audio/audio_manager.h" +#include "media/audio/cras/audio_manager_cras.h" #include "media/audio/linux/alsa_util.h" -#include "media/audio/linux/audio_manager_linux.h" namespace media { CrasInputStream::CrasInputStream(const AudioParameters& params, - AudioManagerLinux* manager) + AudioManagerCras* manager) : audio_manager_(manager), bytes_per_frame_(0), callback_(NULL), diff --git a/media/audio/linux/cras_input.h b/media/audio/cras/cras_input.h index 87891da..37772bf 100644 --- a/media/audio/linux/cras_input.h +++ b/media/audio/cras/cras_input.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MEDIA_AUDIO_LINUX_CRAS_INPUT_H_ -#define MEDIA_AUDIO_LINUX_CRAS_INPUT_H_ +#ifndef MEDIA_AUDIO_CRAS_CRAS_INPUT_H_ +#define MEDIA_AUDIO_CRAS_CRAS_INPUT_H_ #include <cras_client.h> @@ -18,7 +18,7 @@ namespace media { -class AudioManagerLinux; +class AudioManagerCras; // Provides an input stream for audio capture based on CRAS, the ChromeOS Audio // Server. This object is not thread safe and all methods should be invoked in @@ -27,7 +27,7 @@ class CrasInputStream : public AudioInputStreamImpl { public: // The ctor takes all the usual parameters, plus |manager| which is the // audio manager who is creating this object. - CrasInputStream(const AudioParameters& params, AudioManagerLinux* manager); + CrasInputStream(const AudioParameters& params, AudioManagerCras* manager); // The dtor is typically called by the AudioManager only and it is usually // triggered by calling AudioOutputStream::Close(). @@ -76,7 +76,7 @@ class CrasInputStream : public AudioInputStreamImpl { // want circular references. Additionally, stream objects live on the audio // thread, which is owned by the audio manager and we don't want to addref // the manager from that thread. - AudioManagerLinux* audio_manager_; + AudioManagerCras* audio_manager_; // Size of frame in bytes. uint32 bytes_per_frame_; @@ -101,4 +101,4 @@ class CrasInputStream : public AudioInputStreamImpl { } // namespace media -#endif // MEDIA_AUDIO_LINUX_ALSA_INPUT_H_ +#endif // MEDIA_AUDIO_CRAS_ALSA_INPUT_H_ diff --git a/media/audio/linux/cras_input_unittest.cc b/media/audio/cras/cras_input_unittest.cc index 5d9a1c8..352beb1 100644 --- a/media/audio/linux/cras_input_unittest.cc +++ b/media/audio/cras/cras_input_unittest.cc @@ -9,8 +9,8 @@ #include "base/synchronization/waitable_event.h" #include "base/test/test_timeouts.h" #include "base/time.h" -#include "media/audio/linux/audio_manager_linux.h" -#include "media/audio/linux/cras_input.h" +#include "media/audio/cras/audio_manager_cras.h" +#include "media/audio/cras/cras_input.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -30,7 +30,7 @@ class MockAudioInputCallback : public AudioInputStream::AudioInputCallback { MOCK_METHOD1(OnClose, void(AudioInputStream*)); }; -class MockAudioManagerLinuxInput : public AudioManagerLinux { +class MockAudioManagerCrasInput : public AudioManagerCras { public: // We need to override this function in order to skip checking the number // of active output streams. It is because the number of active streams @@ -45,7 +45,7 @@ class MockAudioManagerLinuxInput : public AudioManagerLinux { class CrasInputStreamTest : public testing::Test { protected: CrasInputStreamTest() { - mock_manager_.reset(new StrictMock<MockAudioManagerLinuxInput>()); + mock_manager_.reset(new StrictMock<MockAudioManagerCrasInput>()); } virtual ~CrasInputStreamTest() { @@ -104,7 +104,7 @@ class CrasInputStreamTest : public testing::Test { static const uint32 kTestFramesPerPacket; static const int kTestSampleRate; - scoped_ptr<StrictMock<MockAudioManagerLinuxInput> > mock_manager_; + scoped_ptr<StrictMock<MockAudioManagerCrasInput> > mock_manager_; private: DISALLOW_COPY_AND_ASSIGN(CrasInputStreamTest); diff --git a/media/audio/linux/cras_output.cc b/media/audio/cras/cras_output.cc index 429ffc2..1995d96 100644 --- a/media/audio/linux/cras_output.cc +++ b/media/audio/cras/cras_output.cc @@ -8,14 +8,14 @@ // the exception of Close(). Even if an error state has been entered, if Open() // has previously returned successfully, Close() must be called. -#include "media/audio/linux/cras_output.h" +#include "media/audio/cras/cras_output.h" #include <cras_client.h> #include "base/logging.h" #include "media/audio/audio_util.h" +#include "media/audio/cras/audio_manager_cras.h" #include "media/audio/linux/alsa_util.h" -#include "media/audio/linux/audio_manager_linux.h" namespace media { @@ -61,7 +61,7 @@ std::ostream& operator<<(std::ostream& os, // which likely will destroy this object. CrasOutputStream::CrasOutputStream(const AudioParameters& params, - AudioManagerLinux* manager) + AudioManagerCras* manager) : client_(NULL), stream_id_(0), samples_per_packet_(params.frames_per_buffer()), diff --git a/media/audio/linux/cras_output.h b/media/audio/cras/cras_output.h index 8dffbce..dca7923 100644 --- a/media/audio/linux/cras_output.h +++ b/media/audio/cras/cras_output.h @@ -7,8 +7,8 @@ // CrasOutputStream object is *not* thread-safe and should only be used // from the audio thread. -#ifndef MEDIA_AUDIO_LINUX_CRAS_OUTPUT_H_ -#define MEDIA_AUDIO_LINUX_CRAS_OUTPUT_H_ +#ifndef MEDIA_AUDIO_CRAS_CRAS_OUTPUT_H_ +#define MEDIA_AUDIO_CRAS_CRAS_OUTPUT_H_ #include <alsa/asoundlib.h> #include <cras_client.h> @@ -20,7 +20,7 @@ namespace media { -class AudioManagerLinux; +class AudioManagerCras; class AudioParameters; // Implementation of AudioOuputStream for Chrome OS using the Chrome OS audio @@ -29,7 +29,7 @@ class MEDIA_EXPORT CrasOutputStream : public AudioOutputStream { public: // The ctor takes all the usual parameters, plus |manager| which is the // audio manager who is creating this object. - CrasOutputStream(const AudioParameters& params, AudioManagerLinux* manager); + CrasOutputStream(const AudioParameters& params, AudioManagerCras* manager); // The dtor is typically called by the AudioManager only and it is usually // triggered by calling AudioOutputStream::Close(). @@ -111,7 +111,7 @@ class MEDIA_EXPORT CrasOutputStream : public AudioOutputStream { float volume_; // Audio manager that created us. Used to report that we've been closed. - AudioManagerLinux* manager_; + AudioManagerCras* manager_; // Callback to get audio samples. AudioSourceCallback* source_callback_; @@ -124,4 +124,4 @@ class MEDIA_EXPORT CrasOutputStream : public AudioOutputStream { } // namespace media -#endif // MEDIA_AUDIO_LINUX_CRAS_OUTPUT_H_ +#endif // MEDIA_AUDIO_CRAS_CRAS_OUTPUT_H_ diff --git a/media/audio/linux/cras_output_unittest.cc b/media/audio/cras/cras_output_unittest.cc index f9e2b24..cbae6fe 100644 --- a/media/audio/linux/cras_output_unittest.cc +++ b/media/audio/cras/cras_output_unittest.cc @@ -4,8 +4,9 @@ #include <string> -#include "media/audio/linux/audio_manager_linux.h" -#include "media/audio/linux/cras_output.h" +#include "base/threading/thread.h" +#include "media/audio/cras/audio_manager_cras.h" +#include "media/audio/cras/cras_output.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -27,7 +28,7 @@ class MockAudioSourceCallback : public AudioOutputStream::AudioSourceCallback { MOCK_METHOD2(OnError, void(AudioOutputStream* stream, int code)); }; -class MockAudioManagerLinux : public AudioManagerLinux { +class MockAudioManagerCras : public AudioManagerCras { public: MOCK_METHOD0(Init, void()); MOCK_METHOD0(HasAudioOutputDevices, bool()); @@ -60,7 +61,7 @@ class MockAudioManagerLinux : public AudioManagerLinux { class CrasOutputStreamTest : public testing::Test { protected: CrasOutputStreamTest() { - mock_manager_.reset(new StrictMock<MockAudioManagerLinux>()); + mock_manager_.reset(new StrictMock<MockAudioManagerCras>()); } virtual ~CrasOutputStreamTest() { @@ -78,7 +79,7 @@ class CrasOutputStreamTest : public testing::Test { mock_manager_.get()); } - MockAudioManagerLinux& mock_manager() { + MockAudioManagerCras& mock_manager() { return *(mock_manager_.get()); } @@ -93,7 +94,7 @@ class CrasOutputStreamTest : public testing::Test { static struct cras_stream_params* const kFakeStreamParams; static struct cras_client* const kFakeClient; - scoped_ptr<StrictMock<MockAudioManagerLinux> > mock_manager_; + scoped_ptr<StrictMock<MockAudioManagerCras> > mock_manager_; private: DISALLOW_COPY_AND_ASSIGN(CrasOutputStreamTest); diff --git a/media/audio/linux/audio_manager_linux.cc b/media/audio/linux/audio_manager_linux.cc index 3387d56..90543d7 100644 --- a/media/audio/linux/audio_manager_linux.cc +++ b/media/audio/linux/audio_manager_linux.cc @@ -12,16 +12,15 @@ #include "base/stl_util.h" #include "media/audio/audio_output_dispatcher.h" #include "media/audio/audio_util.h" +#if defined(USE_CRAS) +#include "media/audio/cras/audio_manager_cras.h" +#endif #include "media/audio/linux/alsa_input.h" #include "media/audio/linux/alsa_output.h" #include "media/audio/linux/alsa_wrapper.h" #if defined(USE_PULSEAUDIO) #include "media/audio/pulse/pulse_output.h" #endif -#if defined(USE_CRAS) -#include "media/audio/linux/cras_input.h" -#include "media/audio/linux/cras_output.h" -#endif #include "media/base/limits.h" #include "media/base/media_switches.h" @@ -42,21 +41,12 @@ static const char* kInvalidAudioInputDevices[] = { "surround", }; -static const char kCrasAutomaticDeviceName[] = "Automatic"; -static const char kCrasAutomaticDeviceId[] = "automatic"; - // Implementation of AudioManager. bool AudioManagerLinux::HasAudioOutputDevices() { - if (UseCras()) - return true; - return HasAnyAlsaAudioDevice(kStreamPlayback); } bool AudioManagerLinux::HasAudioInputDevices() { - if (UseCras()) - return true; - return HasAnyAlsaAudioDevice(kStreamCapture); } @@ -96,30 +86,9 @@ void AudioManagerLinux::ShowAudioInputSettings() { void AudioManagerLinux::GetAudioInputDeviceNames( media::AudioDeviceNames* device_names) { DCHECK(device_names->empty()); - if (UseCras()) { - GetCrasAudioInputDevices(device_names); - return; - } - GetAlsaAudioInputDevices(device_names); } -bool AudioManagerLinux::UseCras() { -#if defined(USE_CRAS) - if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kUseCras)) { - return true; - } -#endif - return false; -} - -void AudioManagerLinux::GetCrasAudioInputDevices( - media::AudioDeviceNames* device_names) { - // Cras will route audio from a proper physical device automatically. - device_names->push_back(media::AudioDeviceName( - kCrasAutomaticDeviceName, kCrasAutomaticDeviceId)); -} - void AudioManagerLinux::GetAlsaAudioInputDevices( media::AudioDeviceNames* device_names) { // Constants specified by the ALSA API for device hints. @@ -279,12 +248,6 @@ AudioInputStream* AudioManagerLinux::MakeLowLatencyInputStream( AudioOutputStream* AudioManagerLinux::MakeOutputStream( const AudioParameters& params) { -#if defined(USE_CRAS) - if (UseCras()) { - return new CrasOutputStream(params, this); - } -#endif - #if defined(USE_PULSEAUDIO) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kUsePulseAudio)) { return new PulseAudioOutputStream(params, this); @@ -302,12 +265,6 @@ AudioOutputStream* AudioManagerLinux::MakeOutputStream( AudioInputStream* AudioManagerLinux::MakeInputStream( const AudioParameters& params, const std::string& device_id) { -#if defined(USE_CRAS) - if (UseCras()) { - return new CrasInputStream(params, this); - } -#endif - std::string device_name = (device_id == AudioManagerBase::kDefaultDeviceId) ? AlsaPcmInputStream::kAutoSelectDevice : device_id; if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAlsaInputDevice)) { @@ -319,6 +276,12 @@ AudioInputStream* AudioManagerLinux::MakeInputStream( } AudioManager* CreateAudioManager() { +#if defined(USE_CRAS) + if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kUseCras)) { + return new AudioManagerCras(); + } +#endif + return new AudioManagerLinux(); } diff --git a/media/audio/linux/audio_manager_linux.h b/media/audio/linux/audio_manager_linux.h index cbcfe62..4d1695b 100644 --- a/media/audio/linux/audio_manager_linux.h +++ b/media/audio/linux/audio_manager_linux.h @@ -47,12 +47,6 @@ class MEDIA_EXPORT AudioManagerLinux : public AudioManagerBase { kStreamCapture, }; - // Returns true if cras should be used for input/output. - bool UseCras(); - - // Gets a list of available cras input devices. - void GetCrasAudioInputDevices(media::AudioDeviceNames* device_names); - // Gets a list of available ALSA input devices. void GetAlsaAudioInputDevices(media::AudioDeviceNames* device_names); |