summaryrefslogtreecommitdiffstats
path: root/chromium/media/audio/cras
diff options
context:
space:
mode:
authorJocelyn Turcotte <jocelyn.turcotte@digia.com>2014-08-08 14:30:41 +0200
committerJocelyn Turcotte <jocelyn.turcotte@digia.com>2014-08-12 13:49:54 +0200
commitab0a50979b9eb4dfa3320eff7e187e41efedf7a9 (patch)
tree498dfb8a97ff3361a9f7486863a52bb4e26bb898 /chromium/media/audio/cras
parent4ce69f7403811819800e7c5ae1318b2647e778d1 (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.cc47
-rw-r--r--chromium/media/audio/cras/audio_manager_cras.h7
-rw-r--r--chromium/media/audio/cras/cras_input.cc23
-rw-r--r--chromium/media/audio/cras/cras_input.h8
-rw-r--r--chromium/media/audio/cras/cras_input_unittest.cc29
-rw-r--r--chromium/media/audio/cras/cras_unified.cc11
-rw-r--r--chromium/media/audio/cras/cras_unified.h10
-rw-r--r--chromium/media/audio/cras/cras_unified_unittest.cc29
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 {