diff options
author | Jocelyn Turcotte <jocelyn.turcotte@digia.com> | 2014-08-08 14:30:41 +0200 |
---|---|---|
committer | Jocelyn Turcotte <jocelyn.turcotte@digia.com> | 2014-08-12 13:49:54 +0200 |
commit | ab0a50979b9eb4dfa3320eff7e187e41efedf7a9 (patch) | |
tree | 498dfb8a97ff3361a9f7486863a52bb4e26bb898 /chromium/media/audio/cras | |
parent | 4ce69f7403811819800e7c5ae1318b2647e778d1 (diff) |
Update Chromium to beta version 37.0.2062.68
Change-Id: I188e3b5aff1bec75566014291b654eb19f5bc8ca
Reviewed-by: Andras Becsi <andras.becsi@digia.com>
Diffstat (limited to 'chromium/media/audio/cras')
-rw-r--r-- | chromium/media/audio/cras/audio_manager_cras.cc | 47 | ||||
-rw-r--r-- | chromium/media/audio/cras/audio_manager_cras.h | 7 | ||||
-rw-r--r-- | chromium/media/audio/cras/cras_input.cc | 23 | ||||
-rw-r--r-- | chromium/media/audio/cras/cras_input.h | 8 | ||||
-rw-r--r-- | chromium/media/audio/cras/cras_input_unittest.cc | 29 | ||||
-rw-r--r-- | chromium/media/audio/cras/cras_unified.cc | 11 | ||||
-rw-r--r-- | chromium/media/audio/cras/cras_unified.h | 10 | ||||
-rw-r--r-- | chromium/media/audio/cras/cras_unified_unittest.cc | 29 |
8 files changed, 96 insertions, 68 deletions
diff --git a/chromium/media/audio/cras/audio_manager_cras.cc b/chromium/media/audio/cras/audio_manager_cras.cc index 876d6ce8136..abc78dd4b78 100644 --- a/chromium/media/audio/cras/audio_manager_cras.cc +++ b/chromium/media/audio/cras/audio_manager_cras.cc @@ -4,6 +4,8 @@ #include "media/audio/cras/audio_manager_cras.h" +#include <algorithm> + #include "base/command_line.h" #include "base/environment.h" #include "base/logging.h" @@ -13,6 +15,11 @@ #include "media/audio/cras/cras_unified.h" #include "media/base/channel_layout.h" +// cras_util.h headers pull in min/max macros... +// TODO(dgreid): Fix headers such that these aren't imported. +#undef min +#undef max + namespace media { static void AddDefaultDevice(AudioDeviceNames* device_names) { @@ -30,6 +37,13 @@ static const int kMaxOutputStreams = 50; // Default sample rate for input and output streams. static const int kDefaultSampleRate = 48000; +// Define bounds for the output buffer size. +static const int kMinimumOutputBufferSize = 512; +static const int kMaximumOutputBufferSize = 8192; + +// Default input buffer size. +static const int kDefaultInputBufferSize = 1024; + bool AudioManagerCras::HasAudioOutputDevices() { return true; } @@ -63,12 +77,15 @@ void AudioManagerCras::GetAudioOutputDeviceNames( AudioParameters AudioManagerCras::GetInputStreamParameters( const std::string& device_id) { - static const int kDefaultInputBufferSize = 1024; + int user_buffer_size = GetUserBufferSize(); + int buffer_size = user_buffer_size ? + user_buffer_size : kDefaultInputBufferSize; + // TODO(hshi): Fine-tune audio parameters based on |device_id|. The optimal // parameters for the loopback stream may differ from the default. return AudioParameters( AudioParameters::AUDIO_PCM_LOW_LATENCY, CHANNEL_LAYOUT_STEREO, - kDefaultSampleRate, 16, kDefaultInputBufferSize); + kDefaultSampleRate, 16, buffer_size); } AudioOutputStream* AudioManagerCras::MakeLinearOutputStream( @@ -79,8 +96,7 @@ AudioOutputStream* AudioManagerCras::MakeLinearOutputStream( AudioOutputStream* AudioManagerCras::MakeLowLatencyOutputStream( const AudioParameters& params, - const std::string& device_id, - const std::string& input_device_id) { + const std::string& device_id) { DLOG_IF(ERROR, !device_id.empty()) << "Not implemented!"; DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format()); // TODO(dgreid): Open the correct input device for unified IO. @@ -104,11 +120,9 @@ AudioParameters AudioManagerCras::GetPreferredOutputStreamParameters( const AudioParameters& input_params) { // TODO(tommi): Support |output_device_id|. DLOG_IF(ERROR, !output_device_id.empty()) << "Not implemented!"; - static const int kDefaultOutputBufferSize = 512; - ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; int sample_rate = kDefaultSampleRate; - int buffer_size = kDefaultOutputBufferSize; + int buffer_size = kMinimumOutputBufferSize; int bits_per_sample = 16; int input_channels = 0; if (input_params.IsValid()) { @@ -116,7 +130,9 @@ AudioParameters AudioManagerCras::GetPreferredOutputStreamParameters( bits_per_sample = input_params.bits_per_sample(); channel_layout = input_params.channel_layout(); input_channels = input_params.input_channels(); - buffer_size = input_params.frames_per_buffer(); + buffer_size = + std::min(kMaximumOutputBufferSize, + std::max(buffer_size, input_params.frames_per_buffer())); } int user_buffer_size = GetUserBufferSize(); @@ -138,4 +154,19 @@ AudioInputStream* AudioManagerCras::MakeInputStream( return new CrasInputStream(params, this, device_id); } +snd_pcm_format_t AudioManagerCras::BitsToFormat(int bits_per_sample) { + switch (bits_per_sample) { + case 8: + return SND_PCM_FORMAT_U8; + case 16: + return SND_PCM_FORMAT_S16; + case 24: + return SND_PCM_FORMAT_S24; + case 32: + return SND_PCM_FORMAT_S32; + default: + return SND_PCM_FORMAT_UNKNOWN; + } +} + } // namespace media diff --git a/chromium/media/audio/cras/audio_manager_cras.h b/chromium/media/audio/cras/audio_manager_cras.h index 589374ae0b9..a9abd6c2deb 100644 --- a/chromium/media/audio/cras/audio_manager_cras.h +++ b/chromium/media/audio/cras/audio_manager_cras.h @@ -5,6 +5,8 @@ #ifndef MEDIA_AUDIO_CRAS_AUDIO_MANAGER_CRAS_H_ #define MEDIA_AUDIO_CRAS_AUDIO_MANAGER_CRAS_H_ +#include <cras_types.h> + #include <string> #include "base/compiler_specific.h" @@ -33,13 +35,14 @@ class MEDIA_EXPORT AudioManagerCras : public AudioManagerBase { const AudioParameters& params) OVERRIDE; virtual AudioOutputStream* MakeLowLatencyOutputStream( const AudioParameters& params, - const std::string& device_id, - const std::string& input_device_id) OVERRIDE; + const std::string& device_id) 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; + static snd_pcm_format_t BitsToFormat(int bits_per_sample); + protected: virtual ~AudioManagerCras(); diff --git a/chromium/media/audio/cras/cras_input.cc b/chromium/media/audio/cras/cras_input.cc index c41f3645efd..afdabb21d1f 100644 --- a/chromium/media/audio/cras/cras_input.cc +++ b/chromium/media/audio/cras/cras_input.cc @@ -7,10 +7,8 @@ #include <math.h> #include "base/basictypes.h" -#include "base/bind.h" #include "base/logging.h" #include "base/time/time.h" -#include "media/audio/alsa/alsa_util.h" #include "media/audio/audio_manager.h" #include "media/audio/cras/audio_manager_cras.h" @@ -29,6 +27,7 @@ CrasInputStream::CrasInputStream(const AudioParameters& params, stream_direction_(device_id == AudioManagerBase::kLoopbackInputDeviceId ? CRAS_STREAM_POST_MIX_PRE_DSP : CRAS_STREAM_INPUT) { DCHECK(audio_manager_); + audio_bus_ = AudioBus::Create(params_); } CrasInputStream::~CrasInputStream() { @@ -54,7 +53,7 @@ bool CrasInputStream::Open() { } snd_pcm_format_t pcm_format = - alsa_util::BitsToFormat(params_.bits_per_sample()); + AudioManagerCras::BitsToFormat(params_.bits_per_sample()); if (pcm_format == SND_PCM_FORMAT_UNKNOWN) { DLOG(WARNING) << "Unsupported bits/sample: " << params_.bits_per_sample(); return false; @@ -86,17 +85,14 @@ bool CrasInputStream::Open() { } void CrasInputStream::Close() { + Stop(); + if (client_) { cras_client_stop(client_); cras_client_destroy(client_); client_ = NULL; } - if (callback_) { - callback_->OnClose(this); - callback_ = NULL; - } - // Signal to the manager that we're closed and can be removed. // Should be last call in the method as it deletes "this". audio_manager_->ReleaseInputStream(this); @@ -117,7 +113,7 @@ void CrasInputStream::Start(AudioInputCallback* callback) { // Prepare |audio_format| and |stream_params| for the stream we // will create. cras_audio_format* audio_format = cras_audio_format_create( - alsa_util::BitsToFormat(params_.bits_per_sample()), + AudioManagerCras::BitsToFormat(params_.bits_per_sample()), params_.sample_rate(), params_.channels()); if (!audio_format) { @@ -177,6 +173,7 @@ void CrasInputStream::Stop() { cras_client_rm_stream(client_, stream_id_); started_ = false; + callback_ = NULL; } // Static callback asking for samples. Run on high priority thread. @@ -226,11 +223,9 @@ void CrasInputStream::ReadAudio(size_t frames, double normalized_volume = 0.0; GetAgcVolume(&normalized_volume); - callback_->OnData(this, - buffer, - frames * bytes_per_frame_, - bytes_latency, - normalized_volume); + audio_bus_->FromInterleaved( + buffer, audio_bus_->frames(), params_.bits_per_sample() / 8); + callback_->OnData(this, audio_bus_.get(), bytes_latency, normalized_volume); } void CrasInputStream::NotifyStreamError(int err) { diff --git a/chromium/media/audio/cras/cras_input.h b/chromium/media/audio/cras/cras_input.h index dd2cb5474a4..1919224d9a9 100644 --- a/chromium/media/audio/cras/cras_input.h +++ b/chromium/media/audio/cras/cras_input.h @@ -10,8 +10,6 @@ #include <string> #include "base/compiler_specific.h" -#include "base/memory/scoped_ptr.h" -#include "base/memory/weak_ptr.h" #include "media/audio/agc_audio_stream.h" #include "media/audio/audio_io.h" #include "media/audio/audio_parameters.h" @@ -53,7 +51,7 @@ class CrasInputStream : public AgcAudioStream<AudioInputStream> { const timespec* sample_ts, void* arg); - // Handles notificaiton that there was an error with the playback stream. + // Handles notification that there was an error with the playback stream. static int StreamError(cras_client* client, cras_stream_id_t stream_id, int err, @@ -100,9 +98,11 @@ class CrasInputStream : public AgcAudioStream<AudioInputStream> { // Direction of the stream. const CRAS_STREAM_DIRECTION stream_direction_; + scoped_ptr<AudioBus> audio_bus_; + DISALLOW_COPY_AND_ASSIGN(CrasInputStream); }; } // namespace media -#endif // MEDIA_AUDIO_CRAS_ALSA_INPUT_H_ +#endif // MEDIA_AUDIO_CRAS_CRAS_INPUT_H_ diff --git a/chromium/media/audio/cras/cras_input_unittest.cc b/chromium/media/audio/cras/cras_input_unittest.cc index 27ea9858ba1..7081a98e907 100644 --- a/chromium/media/audio/cras/cras_input_unittest.cc +++ b/chromium/media/audio/cras/cras_input_unittest.cc @@ -2,18 +2,22 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include <unistd.h> - #include <string> #include "base/synchronization/waitable_event.h" #include "base/test/test_timeouts.h" #include "base/time/time.h" #include "media/audio/cras/audio_manager_cras.h" -#include "media/audio/cras/cras_input.h" +#include "media/audio/fake_audio_log_factory.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +// cras_util.h defines custom min/max macros which break compilation, so ensure +// it's not included until last. #if avoids presubmit errors. +#if defined(USE_CRAS) +#include "media/audio/cras/cras_input.h" +#endif + using testing::_; using testing::AtLeast; using testing::Ge; @@ -24,14 +28,15 @@ namespace media { class MockAudioInputCallback : public AudioInputStream::AudioInputCallback { public: - MOCK_METHOD5(OnData, void( - AudioInputStream*, const uint8*, uint32, uint32, double)); + MOCK_METHOD4(OnData, + void(AudioInputStream*, const AudioBus*, uint32, double)); MOCK_METHOD1(OnError, void(AudioInputStream*)); - MOCK_METHOD1(OnClose, void(AudioInputStream*)); }; class MockAudioManagerCrasInput : public AudioManagerCras { public: + MockAudioManagerCrasInput() : AudioManagerCras(&fake_audio_log_factory_) {} + // 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 // is managed inside MakeAudioInputStream, and we don't use @@ -40,6 +45,9 @@ class MockAudioManagerCrasInput : public AudioManagerCras { DCHECK(stream); delete stream; } + + private: + FakeAudioLogFactory fake_audio_log_factory_; }; class CrasInputStreamTest : public testing::Test { @@ -77,14 +85,9 @@ class CrasInputStreamTest : public testing::Test { // samples can be provided when doing non-integer SRC. For example // converting from 192k to 44.1k is a ratio of 4.35 to 1. MockAudioInputCallback mock_callback; - unsigned int expected_size = (kTestFramesPerPacket - 8) * - params.channels() * - params.bits_per_sample() / 8; - base::WaitableEvent event(false, false); - EXPECT_CALL(mock_callback, - OnData(test_stream, _, Ge(expected_size), _, _)) + EXPECT_CALL(mock_callback, OnData(test_stream, _, _, _)) .WillOnce(InvokeWithoutArgs(&event, &base::WaitableEvent::Signal)); test_stream->Start(&mock_callback); @@ -93,8 +96,6 @@ class CrasInputStreamTest : public testing::Test { EXPECT_TRUE(event.TimedWait(TestTimeouts::action_timeout())); test_stream->Stop(); - - EXPECT_CALL(mock_callback, OnClose(test_stream)).Times(1); test_stream->Close(); } diff --git a/chromium/media/audio/cras/cras_unified.cc b/chromium/media/audio/cras/cras_unified.cc index c85cf59dd5f..25af3837ad6 100644 --- a/chromium/media/audio/cras/cras_unified.cc +++ b/chromium/media/audio/cras/cras_unified.cc @@ -4,11 +4,7 @@ #include "media/audio/cras/cras_unified.h" -#include <cras_client.h> - -#include "base/command_line.h" #include "base/logging.h" -#include "media/audio/alsa/alsa_util.h" #include "media/audio/cras/audio_manager_cras.h" namespace media { @@ -116,7 +112,7 @@ bool CrasUnifiedStream::Open() { return false; } - if (alsa_util::BitsToFormat(params_.bits_per_sample()) == + if (AudioManagerCras::BitsToFormat(params_.bits_per_sample()) == SND_PCM_FORMAT_UNKNOWN) { LOG(WARNING) << "Unsupported pcm format"; return false; @@ -187,7 +183,7 @@ void CrasUnifiedStream::Start(AudioSourceCallback* callback) { // Prepare |audio_format| and |stream_params| for the stream we // will create. cras_audio_format* audio_format = cras_audio_format_create( - alsa_util::BitsToFormat(params_.bits_per_sample()), + AudioManagerCras::BitsToFormat(params_.bits_per_sample()), params_.sample_rate(), params_.channels()); if (!audio_format) { @@ -361,8 +357,7 @@ uint32 CrasUnifiedStream::ReadWriteAudio(size_t frames, cras_client_calc_playback_latency(output_ts, &latency_ts); total_delay_bytes += GetBytesLatency(latency_ts); - int frames_filled = source_callback_->OnMoreIOData( - input_bus_.get(), + int frames_filled = source_callback_->OnMoreData( output_bus_.get(), AudioBuffersState(0, total_delay_bytes)); diff --git a/chromium/media/audio/cras/cras_unified.h b/chromium/media/audio/cras/cras_unified.h index 818763efb49..db1d9feb648 100644 --- a/chromium/media/audio/cras/cras_unified.h +++ b/chromium/media/audio/cras/cras_unified.h @@ -10,21 +10,21 @@ #ifndef MEDIA_AUDIO_LINUX_CRAS_UNIFIED_H_ #define MEDIA_AUDIO_LINUX_CRAS_UNIFIED_H_ -#include <alsa/asoundlib.h> #include <cras_client.h> #include "base/compiler_specific.h" -#include "base/gtest_prod_util.h" #include "media/audio/audio_io.h" #include "media/audio/audio_parameters.h" namespace media { class AudioManagerCras; -class AudioParameters; // Implementation of AudioOuputStream for Chrome OS using the Chrome OS audio // server. +// TODO(dgreid): This class is used for only output, either remove all the +// relevant input code and change the class to CrasOutputStream or merge +// cras_input.cc into this unified implementation. class MEDIA_EXPORT CrasUnifiedStream : public AudioOutputStream { public: // The ctor takes all the usual parameters, plus |manager| which is the @@ -57,7 +57,7 @@ class MEDIA_EXPORT CrasUnifiedStream : public AudioOutputStream { const timespec* output_ts, void* arg); - // Handles notificaiton that there was an error with the playback stream. + // Handles notification that there was an error with the playback stream. static int StreamError(cras_client* client, cras_stream_id_t stream_id, int err, @@ -107,7 +107,7 @@ class MEDIA_EXPORT CrasUnifiedStream : public AudioOutputStream { // Callback to get audio samples. AudioSourceCallback* source_callback_; - // Container for exchanging data with AudioSourceCallback::OnMoreIOData(). + // Container for exchanging data with AudioSourceCallback::OnMoreData(). scoped_ptr<AudioBus> input_bus_; scoped_ptr<AudioBus> output_bus_; diff --git a/chromium/media/audio/cras/cras_unified_unittest.cc b/chromium/media/audio/cras/cras_unified_unittest.cc index 7083eca427e..9d282bb7505 100644 --- a/chromium/media/audio/cras/cras_unified_unittest.cc +++ b/chromium/media/audio/cras/cras_unified_unittest.cc @@ -8,10 +8,17 @@ #include "base/test/test_timeouts.h" #include "base/time/time.h" #include "media/audio/cras/audio_manager_cras.h" -#include "media/audio/cras/cras_unified.h" +#include "media/audio/fake_audio_log_factory.h" +#include "media/audio/mock_audio_source_callback.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +// cras_util.h defines custom min/max macros which break compilation, so ensure +// it's not included until last. #if avoids presubmit errors. +#if defined(USE_CRAS) +#include "media/audio/cras/cras_unified.h" +#endif + using testing::_; using testing::DoAll; using testing::InvokeWithoutArgs; @@ -21,25 +28,18 @@ using testing::StrictMock; namespace media { -class MockAudioSourceCallback : public AudioOutputStream::AudioSourceCallback { - public: - MOCK_METHOD2(OnMoreData, int(AudioBus* audio_bus, - AudioBuffersState buffers_state)); - MOCK_METHOD3(OnMoreIOData, int(AudioBus* source, - AudioBus* dest, - AudioBuffersState buffers_state)); - MOCK_METHOD1(OnError, void(AudioOutputStream* stream)); -}; - class MockAudioManagerCras : public AudioManagerCras { public: + MockAudioManagerCras() : AudioManagerCras(&fake_audio_log_factory_) {} + MOCK_METHOD0(Init, void()); MOCK_METHOD0(HasAudioOutputDevices, bool()); MOCK_METHOD0(HasAudioInputDevices, bool()); MOCK_METHOD1(MakeLinearOutputStream, AudioOutputStream*( const AudioParameters& params)); - MOCK_METHOD1(MakeLowLatencyOutputStream, AudioOutputStream*( - const AudioParameters& params)); + MOCK_METHOD2(MakeLowLatencyOutputStream, + AudioOutputStream*(const AudioParameters& params, + const std::string& device_id)); MOCK_METHOD2(MakeLinearOutputStream, AudioInputStream*( const AudioParameters& params, const std::string& device_id)); MOCK_METHOD2(MakeLowLatencyInputStream, AudioInputStream*( @@ -53,6 +53,9 @@ class MockAudioManagerCras : public AudioManagerCras { DCHECK(stream); delete stream; } + + private: + FakeAudioLogFactory fake_audio_log_factory_; }; class CrasUnifiedStreamTest : public testing::Test { |