summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/browser/renderer_host/media/audio_input_device_manager.cc52
-rw-r--r--content/browser/renderer_host/media/audio_input_device_manager.h5
-rw-r--r--content/browser/renderer_host/media/audio_input_device_manager_unittest.cc21
-rw-r--r--content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc4
-rw-r--r--media/audio/fake_audio_input_stream.cc47
-rw-r--r--media/audio/fake_audio_input_stream.h1
-rw-r--r--media/audio/mock_audio_manager.cc7
7 files changed, 69 insertions, 68 deletions
diff --git a/content/browser/renderer_host/media/audio_input_device_manager.cc b/content/browser/renderer_host/media/audio_input_device_manager.cc
index 8d0377d..5fd5f88 100644
--- a/content/browser/renderer_host/media/audio_input_device_manager.cc
+++ b/content/browser/renderer_host/media/audio_input_device_manager.cc
@@ -8,7 +8,6 @@
#include "base/memory/scoped_ptr.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/common/media_stream_request.h"
-#include "media/audio/audio_device_name.h"
#include "media/audio/audio_input_ipc.h"
#include "media/audio/audio_manager_base.h"
#include "media/audio/audio_parameters.h"
@@ -30,14 +29,6 @@ AudioInputDeviceManager::AudioInputDeviceManager(
next_capture_session_id_(kFirstSessionId),
use_fake_device_(false),
audio_manager_(audio_manager) {
- // TODO(xians): Remove this fake_device after the unittests do not need it.
- StreamDeviceInfo fake_device(MEDIA_DEVICE_AUDIO_CAPTURE,
- media::AudioManagerBase::kDefaultDeviceName,
- media::AudioManagerBase::kDefaultDeviceId,
- 44100, media::CHANNEL_LAYOUT_STEREO,
- 0);
- fake_device.session_id = kFakeOpenSessionId;
- devices_.push_back(fake_device);
}
AudioInputDeviceManager::~AudioInputDeviceManager() {
@@ -123,19 +114,18 @@ void AudioInputDeviceManager::EnumerateOnDeviceThread(
SCOPED_UMA_HISTOGRAM_TIMER(
"Media.AudioInputDeviceManager.EnumerateOnDeviceThreadTime");
DCHECK(IsOnDeviceThread());
+ DCHECK_EQ(MEDIA_DEVICE_AUDIO_CAPTURE, stream_type);
media::AudioDeviceNames device_names;
-
- switch (stream_type) {
- case MEDIA_DEVICE_AUDIO_CAPTURE:
- // AudioManager is guaranteed to outlive MediaStreamManager in
- // BrowserMainloop.
- audio_manager_->GetAudioInputDeviceNames(&device_names);
- break;
-
- default:
- NOTREACHED();
- break;
+ if (use_fake_device_) {
+ // Use the fake devices.
+ GetFakeDeviceNames(&device_names);
+ } else {
+ // Enumerate the devices on the OS.
+ // AudioManager is guaranteed to outlive MediaStreamManager in
+ // BrowserMainloop.
+ media::AudioDeviceNames device_names;
+ audio_manager_->GetAudioInputDeviceNames(&device_names);
}
scoped_ptr<StreamDeviceInfoArray> devices(new StreamDeviceInfoArray());
@@ -146,14 +136,6 @@ void AudioInputDeviceManager::EnumerateOnDeviceThread(
stream_type, it->device_name, it->unique_id));
}
- // If the |use_fake_device_| flag is on, inject the fake device if there is
- // no available device on the OS.
- if (use_fake_device_ && devices->empty()) {
- devices->push_back(StreamDeviceInfo(
- stream_type, media::AudioManagerBase::kDefaultDeviceName,
- media::AudioManagerBase::kDefaultDeviceId));
- }
-
// Return the device list through the listener by posting a task on
// IO thread since MediaStreamManager handles the callback asynchronously.
BrowserThread::PostTask(
@@ -255,4 +237,18 @@ AudioInputDeviceManager::GetDevice(int session_id) {
return devices_.end();
}
+void AudioInputDeviceManager::GetFakeDeviceNames(
+ media::AudioDeviceNames* device_names) {
+ static const char kFakeDeviceName1[] = "Fake Audio 1";
+ static const char kFakeDeviceId1[] = "fake_audio_1";
+ static const char kFakeDeviceName2[] = "Fake Audio 2";
+ static const char kFakeDeviceId2[] = "fake_audio_2";
+ DCHECK(device_names->empty());
+ DCHECK(use_fake_device_);
+ device_names->push_back(media::AudioDeviceName(kFakeDeviceName1,
+ kFakeDeviceId1));
+ device_names->push_back(media::AudioDeviceName(kFakeDeviceName2,
+ kFakeDeviceId2));
+}
+
} // namespace content
diff --git a/content/browser/renderer_host/media/audio_input_device_manager.h b/content/browser/renderer_host/media/audio_input_device_manager.h
index 231f30b..e8d44cb 100644
--- a/content/browser/renderer_host/media/audio_input_device_manager.h
+++ b/content/browser/renderer_host/media/audio_input_device_manager.h
@@ -22,6 +22,7 @@
#include "content/common/content_export.h"
#include "content/common/media/media_stream_options.h"
#include "content/public/common/media_stream_request.h"
+#include "media/audio/audio_device_name.h"
namespace media {
class AudioManager;
@@ -56,6 +57,10 @@ class CONTENT_EXPORT AudioInputDeviceManager : public MediaStreamProvider {
bool ShouldUseFakeDevice() const;
private:
+ // Used by the unittests to get a list of fake devices.
+ friend class MediaStreamDispatcherHostTest;
+ void GetFakeDeviceNames(media::AudioDeviceNames* device_names);
+
typedef std::vector<StreamDeviceInfo> StreamDeviceList;
virtual ~AudioInputDeviceManager();
diff --git a/content/browser/renderer_host/media/audio_input_device_manager_unittest.cc b/content/browser/renderer_host/media/audio_input_device_manager_unittest.cc
index 4b9e80e..c2963ee 100644
--- a/content/browser/renderer_host/media/audio_input_device_manager_unittest.cc
+++ b/content/browser/renderer_host/media/audio_input_device_manager_unittest.cc
@@ -54,11 +54,6 @@ class MAYBE_AudioInputDeviceManagerTest : public testing::Test {
public:
MAYBE_AudioInputDeviceManagerTest() {}
- // Returns true iff machine has an audio input device.
- bool CanRunAudioInputDeviceTests() {
- return audio_manager_->HasAudioInputDevices();
- }
-
protected:
virtual void SetUp() OVERRIDE {
// The test must run on Browser::IO.
@@ -73,6 +68,7 @@ class MAYBE_AudioInputDeviceManagerTest : public testing::Test {
&base::WaitableEvent::Signal, base::Unretained(&event)));
event.Wait();
manager_ = new AudioInputDeviceManager(audio_manager_.get());
+ manager_->UseFakeDevice();
audio_input_listener_.reset(new MockAudioInputDeviceManagerListener());
manager_->Register(audio_input_listener_.get(),
message_loop_->message_loop_proxy().get());
@@ -106,8 +102,6 @@ class MAYBE_AudioInputDeviceManagerTest : public testing::Test {
// Opens and closes the devices.
TEST_F(MAYBE_AudioInputDeviceManagerTest, OpenAndCloseDevice) {
- if (!CanRunAudioInputDeviceTests())
- return;
ASSERT_FALSE(devices_.empty());
@@ -137,9 +131,6 @@ TEST_F(MAYBE_AudioInputDeviceManagerTest, OpenAndCloseDevice) {
// Opens multiple devices at one time and closes them later.
TEST_F(MAYBE_AudioInputDeviceManagerTest, OpenMultipleDevices) {
- if (!CanRunAudioInputDeviceTests())
- return;
-
ASSERT_FALSE(devices_.empty());
InSequence s;
@@ -183,8 +174,6 @@ TEST_F(MAYBE_AudioInputDeviceManagerTest, OpenMultipleDevices) {
// Opens a non-existing device.
TEST_F(MAYBE_AudioInputDeviceManagerTest, OpenNotExistingDevice) {
- if (!CanRunAudioInputDeviceTests())
- return;
InSequence s;
MediaStreamType stream_type = MEDIA_DEVICE_AUDIO_CAPTURE;
@@ -206,9 +195,6 @@ TEST_F(MAYBE_AudioInputDeviceManagerTest, OpenNotExistingDevice) {
// Opens default device twice.
TEST_F(MAYBE_AudioInputDeviceManagerTest, OpenDeviceTwice) {
- if (!CanRunAudioInputDeviceTests())
- return;
-
ASSERT_FALSE(devices_.empty());
InSequence s;
@@ -242,9 +228,6 @@ TEST_F(MAYBE_AudioInputDeviceManagerTest, OpenDeviceTwice) {
// Accesses then closes the sessions after opening the devices.
TEST_F(MAYBE_AudioInputDeviceManagerTest, AccessAndCloseSession) {
- if (!CanRunAudioInputDeviceTests())
- return;
-
ASSERT_FALSE(devices_.empty());
InSequence s;
@@ -278,8 +261,6 @@ TEST_F(MAYBE_AudioInputDeviceManagerTest, AccessAndCloseSession) {
// Access an invalid session.
TEST_F(MAYBE_AudioInputDeviceManagerTest, AccessInvalidSession) {
- if (!CanRunAudioInputDeviceTests())
- return;
InSequence s;
// Opens the first device.
diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc
index a181899..6f83544 100644
--- a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc
+++ b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc
@@ -11,6 +11,7 @@
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "content/browser/browser_thread_impl.h"
+#include "content/browser/renderer_host/media/audio_input_device_manager.h"
#include "content/browser/renderer_host/media/media_stream_dispatcher_host.h"
#include "content/browser/renderer_host/media/media_stream_manager.h"
#include "content/browser/renderer_host/media/media_stream_ui_proxy.h"
@@ -248,7 +249,8 @@ class MediaStreamDispatcherHostTest : public testing::Test {
video_capture_device_factory_->GetDeviceNames(&physical_video_devices_);
ASSERT_GT(physical_video_devices_.size(), 0u);
- audio_manager_->GetAudioInputDeviceNames(&physical_audio_devices_);
+ media_stream_manager_->audio_input_device_manager()->GetFakeDeviceNames(
+ &physical_audio_devices_);
ASSERT_GT(physical_audio_devices_.size(), 0u);
}
diff --git a/media/audio/fake_audio_input_stream.cc b/media/audio/fake_audio_input_stream.cc
index 5ec09a4..e05b257 100644
--- a/media/audio/fake_audio_input_stream.cc
+++ b/media/audio/fake_audio_input_stream.cc
@@ -20,10 +20,16 @@ namespace {
const int kBeepDurationMilliseconds = 20;
const int kBeepFrequency = 400;
+// Intervals between two automatic beeps.
+const int kAutomaticBeepIntervalInMs = 500;
+
+// Automatic beep will be triggered every |kAutomaticBeepIntervalInMs| unless
+// users explicitly call BeepOnce(), which will disable the automatic beep.
struct BeepContext {
- BeepContext() : beep_once(false) {}
+ BeepContext() : beep_once(false), automatic(true) {}
base::Lock beep_lock;
bool beep_once;
+ bool automatic;
};
static base::LazyInstance<BeepContext> g_beep_context =
@@ -78,14 +84,37 @@ void FakeAudioInputStream::Start(AudioInputCallback* callback) {
void FakeAudioInputStream::DoCallback() {
DCHECK(callback_);
+ const TimeTicks now = TimeTicks::Now();
+ base::TimeDelta next_callback_time =
+ last_callback_time_ + callback_interval_ * 2 - now;
+
+ // If we are falling behind, try to catch up as much as we can in the next
+ // callback.
+ if (next_callback_time < base::TimeDelta())
+ next_callback_time = base::TimeDelta();
+
+ // Accumulate the time from the last beep.
+ interval_from_last_beep_ += now - last_callback_time_;
+
+ last_callback_time_ = now;
+
memset(buffer_.get(), 0, buffer_size_);
bool should_beep = false;
{
BeepContext* beep_context = g_beep_context.Pointer();
base::AutoLock auto_lock(beep_context->beep_lock);
- should_beep = beep_context->beep_once;
- beep_context->beep_once = false;
+ if (beep_context->automatic) {
+ base::TimeDelta delta = interval_from_last_beep_ -
+ TimeDelta::FromMilliseconds(kAutomaticBeepIntervalInMs);
+ if (delta > base::TimeDelta()) {
+ should_beep = true;
+ interval_from_last_beep_ = delta;
+ }
+ } else {
+ should_beep = beep_context->beep_once;
+ beep_context->beep_once = false;
+ }
}
// If this object was instructed to generate a beep or has started to
@@ -103,7 +132,6 @@ void FakeAudioInputStream::DoCallback() {
while (position + high_bytes <= buffer_size_) {
// Write high values first.
memset(buffer_.get() + position, 128, high_bytes);
-
// Then leave low values in the buffer with |high_bytes|.
position += high_bytes * 2;
}
@@ -116,16 +144,6 @@ void FakeAudioInputStream::DoCallback() {
callback_->OnData(this, buffer_.get(), buffer_size_, buffer_size_, 1.0);
frames_elapsed_ += params_.frames_per_buffer();
- const TimeTicks now = TimeTicks::Now();
- base::TimeDelta next_callback_time =
- last_callback_time_ + callback_interval_ * 2 - now;
-
- // If we are falling behind, try to catch up as much as we can in the next
- // callback.
- if (next_callback_time < base::TimeDelta())
- next_callback_time = base::TimeDelta();
-
- last_callback_time_ = now;
thread_.message_loop()->PostDelayedTask(
FROM_HERE,
base::Bind(&FakeAudioInputStream::DoCallback, base::Unretained(this)),
@@ -163,6 +181,7 @@ void FakeAudioInputStream::BeepOnce() {
BeepContext* beep_context = g_beep_context.Pointer();
base::AutoLock auto_lock(beep_context->beep_lock);
beep_context->beep_once = true;
+ beep_context->automatic = false;
}
} // namespace media
diff --git a/media/audio/fake_audio_input_stream.h b/media/audio/fake_audio_input_stream.h
index 5879ab3..8dc2427 100644
--- a/media/audio/fake_audio_input_stream.h
+++ b/media/audio/fake_audio_input_stream.h
@@ -63,6 +63,7 @@ class MEDIA_EXPORT FakeAudioInputStream
base::Thread thread_;
base::TimeTicks last_callback_time_;
base::TimeDelta callback_interval_;
+ base::TimeDelta interval_from_last_beep_;
int beep_duration_in_buffers_;
int beep_generated_in_buffers_;
int beep_period_in_frames_;
diff --git a/media/audio/mock_audio_manager.cc b/media/audio/mock_audio_manager.cc
index e774b8c..7183405 100644
--- a/media/audio/mock_audio_manager.cc
+++ b/media/audio/mock_audio_manager.cc
@@ -34,11 +34,8 @@ void MockAudioManager::ShowAudioInputSettings() {
void MockAudioManager::GetAudioInputDeviceNames(
AudioDeviceNames* device_names) {
- DCHECK(device_names->empty());
- device_names->push_back(media::AudioDeviceName("fake_device_name_1",
- "fake_device_id_1"));
- device_names->push_back(media::AudioDeviceName("fake_device_name_2",
- "fake_device_id_2"));
+ // Do not inject fake devices here, use
+ // AudioInputDeviceManager::GetFakeDeviceNames() instead.
}
void MockAudioManager::GetAudioOutputDeviceNames(