summaryrefslogtreecommitdiffstats
path: root/media/audio/audio_input_controller_unittest.cc
diff options
context:
space:
mode:
authorsatish@chromium.org <satish@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-16 05:58:04 +0000
committersatish@chromium.org <satish@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-16 05:58:04 +0000
commit41bdde54e45a13ff9c9f34b34f8e4f0395e9183b (patch)
tree5da8b35681a91144827aa8cd38f93814b6c9e8c2 /media/audio/audio_input_controller_unittest.cc
parentc60d64ec89c1a8eb5279c38c101ec710c8d931f9 (diff)
downloadchromium_src-41bdde54e45a13ff9c9f34b34f8e4f0395e9183b.zip
chromium_src-41bdde54e45a13ff9c9f34b34f8e4f0395e9183b.tar.gz
chromium_src-41bdde54e45a13ff9c9f34b34f8e4f0395e9183b.tar.bz2
Add an AudioInputController to help with audio recording.
This is similar to the existing AudioOutputController class used for playback. Also adds a unit test which uses the new fake audio input stream, so this patch is dependant on http://codereview.chromium.org/2909015 TEST=no new user visible change to test, just some backend recording additions which are unused at the moment. BUG=none Review URL: http://codereview.chromium.org/2905010 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@52617 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/audio/audio_input_controller_unittest.cc')
-rw-r--r--media/audio/audio_input_controller_unittest.cc128
1 files changed, 128 insertions, 0 deletions
diff --git a/media/audio/audio_input_controller_unittest.cc b/media/audio/audio_input_controller_unittest.cc
new file mode 100644
index 0000000..5242398
--- /dev/null
+++ b/media/audio/audio_input_controller_unittest.cc
@@ -0,0 +1,128 @@
+// Copyright (c) 2010 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 "base/env_var.h"
+#include "base/basictypes.h"
+#include "base/waitable_event.h"
+#include "media/audio/audio_input_controller.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::_;
+using ::testing::AtLeast;
+using ::testing::Exactly;
+using ::testing::InvokeWithoutArgs;
+using ::testing::NotNull;
+
+namespace {
+
+const int kSampleRate = AudioManager::kAudioCDSampleRate;
+const int kBitsPerSample = 16;
+const int kChannels = 2;
+const int kSamplesPerPacket = kSampleRate / 10;
+
+ACTION_P3(CheckCountAndSignalEvent, count, limit, event) {
+ if (++*count >= limit) {
+ event->Signal();
+ }
+}
+
+// Test AudioInputController for create and close without recording audio.
+}
+
+namespace media {
+
+class MockAudioInputControllerEventHandler
+ : public AudioInputController::EventHandler {
+ public:
+ MockAudioInputControllerEventHandler() {}
+
+ MOCK_METHOD1(OnCreated, void(AudioInputController* controller));
+ MOCK_METHOD1(OnRecording, void(AudioInputController* controller));
+ MOCK_METHOD2(OnError, void(AudioInputController* controller, int error_code));
+ MOCK_METHOD3(OnData, void(AudioInputController* controller,
+ const uint8* data, uint32 size));
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MockAudioInputControllerEventHandler);
+};
+
+TEST(AudioInputControllerTest, CreateAndClose) {
+ MockAudioInputControllerEventHandler event_handler;
+ base::WaitableEvent event(false, false);
+ // If OnCreated is called then signal the event.
+ EXPECT_CALL(event_handler, OnCreated(NotNull()))
+ .WillOnce(InvokeWithoutArgs(&event, &base::WaitableEvent::Signal));
+
+ scoped_refptr<AudioInputController> controller = AudioInputController::Create(
+ &event_handler, AudioManager::AUDIO_MOCK, kChannels,
+ kSampleRate, kBitsPerSample, kSamplesPerPacket);
+ ASSERT_TRUE(controller.get());
+
+ // Wait for OnCreated() to be called.
+ event.Wait();
+
+ controller->Close();
+}
+
+// Test a normal call sequence of create, record and close.
+TEST(AudioInputControllerTest, RecordAndClose) {
+ MockAudioInputControllerEventHandler event_handler;
+ base::WaitableEvent event(false, false);
+ int count = 0;
+
+ // If OnCreated is called then signal the event.
+ EXPECT_CALL(event_handler, OnCreated(NotNull()))
+ .WillOnce(InvokeWithoutArgs(&event, &base::WaitableEvent::Signal));
+
+ // OnRecording() will be called only once.
+ EXPECT_CALL(event_handler, OnRecording(NotNull()))
+ .Times(Exactly(1));
+
+ // If OnData is called enough then signal the event.
+ EXPECT_CALL(event_handler, OnData(NotNull(), NotNull(), _))
+ .Times(AtLeast(10))
+ .WillRepeatedly(CheckCountAndSignalEvent(&count, 10, &event));
+
+ scoped_refptr<AudioInputController> controller = AudioInputController::Create(
+ &event_handler, AudioManager::AUDIO_MOCK, kChannels,
+ kSampleRate, kBitsPerSample, kSamplesPerPacket);
+ ASSERT_TRUE(controller.get());
+
+ // Wait for OnCreated() to be called.
+ event.Wait();
+ event.Reset();
+
+ // Play and then wait for the event to be signaled.
+ controller->Record();
+ event.Wait();
+
+ controller->Close();
+}
+
+// Test that AudioInputController rejects insanely large packet sizes.
+TEST(AudioInputControllerTest, SamplesPerPacketTooLarge) {
+ // Create an audio device with a very large packet size.
+ MockAudioInputControllerEventHandler event_handler;
+
+ scoped_refptr<AudioInputController> controller = AudioInputController::Create(
+ &event_handler, AudioManager::AUDIO_MOCK, kChannels,
+ kSampleRate, kBitsPerSample, kSamplesPerPacket * 1000);
+ ASSERT_FALSE(controller);
+}
+
+// Test calling AudioInputController::Close multiple times.
+TEST(AudioInputControllerTest, CloseTwice) {
+ MockAudioInputControllerEventHandler event_handler;
+ EXPECT_CALL(event_handler, OnCreated(NotNull()));
+ scoped_refptr<AudioInputController> controller = AudioInputController::Create(
+ &event_handler, AudioManager::AUDIO_MOCK, kChannels,
+ kSampleRate, kBitsPerSample, kSamplesPerPacket);
+ ASSERT_TRUE(controller.get());
+
+ controller->Close();
+ controller->Close();
+}
+
+} // namespace media