Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1213)

Unified Diff: media/audio/virtual_audio_input_stream_unittest.cc

Issue 11298006: Browser-wide audio mirroring for TabCapture API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Adress nits Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/audio/virtual_audio_input_stream_unittest.cc
diff --git a/media/audio/virtual_audio_input_stream_unittest.cc b/media/audio/virtual_audio_input_stream_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..dfcbc1b83a9129a6b95410b9c737ee26608d2166
--- /dev/null
+++ b/media/audio/virtual_audio_input_stream_unittest.cc
@@ -0,0 +1,178 @@
+// Copyright (c) 2012 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/message_loop.h"
+#include "base/synchronization/waitable_event.h"
+#include "media/audio/audio_manager.h"
+#include "media/audio/simple_sources.h"
+#include "media/audio/virtual_audio_input_stream.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace media {
+
+class MockInputCallback : public AudioInputStream::AudioInputCallback {
+ public:
+ MockInputCallback() {}
+ virtual void OnData(AudioInputStream* stream, const uint8* data,
+ uint32 size, uint32 hardware_delay_bytes,
+ double volume) {}
+ virtual void OnClose(AudioInputStream* stream) {}
+ virtual void OnError(AudioInputStream* stream, int code) {}
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MockInputCallback);
+};
+
+class VirtualAudioInputStreamTest : public testing::Test {
+ public:
+ VirtualAudioInputStreamTest()
+ : audio_manager_(AudioManager::Create()),
+ params_(AudioParameters::AUDIO_MIRROR_BROWSER,
+ CHANNEL_LAYOUT_MONO, 8000, 8, 128),
+ output_params_(AudioParameters::AUDIO_PCM_LINEAR,
+ CHANNEL_LAYOUT_MONO, 8000, 8, 128),
+ stream_(NULL),
+ source_(CHANNEL_LAYOUT_STEREO, 200.0, 128),
+ done_(false, false) {
+ }
+
+ void StartStreamAndRunTestsOnAudioThread(int num_output_streams,
DaleCurtis 2012/11/28 23:43:18 How about an Open()/Close() test w/o Start()/Stop(
justinlin 2012/11/29 10:08:33 OK
+ int num_callback_iterations,
+ int num_streams_removed_per_round,
+ int num_expected_source_callbacks) {
+ ASSERT_TRUE(audio_manager_->GetMessageLoop()->BelongsToCurrentThread());
+ stream_->Open();
+ stream_->Start(&input_callback_);
+ AddStreamsAndDoCallbacks(num_output_streams,
+ num_callback_iterations,
+ num_streams_removed_per_round,
+ num_expected_source_callbacks);
+ }
+
+ void AddStreamsAndDoCallbacks(int num_output_streams,
+ int num_callback_iterations,
+ int num_streams_removed_per_round,
+ int num_expected_source_callbacks) {
+ ASSERT_TRUE(audio_manager_->GetMessageLoop()->BelongsToCurrentThread());
+
+ for (int i = 0; i < num_output_streams; ++i) {
+ AudioOutputStream* output_stream =
+ audio_manager_->MakeAudioOutputStream(output_params_);
+ DCHECK(output_stream);
+ output_streams_.push_back(output_stream);
+
+ output_stream->Open();
+ output_stream->Start(&source_);
+ }
+
+ if (num_streams_removed_per_round > 0) {
+ AudioOutputStream* output_stream = output_streams_.back();
+ output_streams_.pop_back();
+ output_stream->Stop();
+ output_stream->Close();
+ }
+
+ if (num_callback_iterations > 0) {
+ // Force the next callback to be immediate.
+ stream_->next_read_time_ -= base::TimeDelta::FromMilliseconds(10000);
+ audio_manager_->GetMessageLoop()->PostTask(FROM_HERE,
+ base::Bind(&VirtualAudioInputStreamTest::AddStreamsAndDoCallbacks,
+ base::Unretained(this),
+ 0,
+ --num_callback_iterations,
+ num_streams_removed_per_round,
+ num_expected_source_callbacks));
+ } else {
+ // Finish the test.
+ for (std::vector<AudioOutputStream*>::iterator it =
+ output_streams_.begin(); it != output_streams_.end(); ++it) {
+ (*it)->Stop();
+ (*it)->Close();
+ }
+
+ stream_->Stop();
+ stream_->Close();
+
+ EXPECT_EQ(num_expected_source_callbacks, source_.callbacks());
+ EXPECT_EQ(0, source_.errors());
+
+ done_.Signal();
+ }
+ }
+
+ protected:
+ scoped_ptr<AudioManager> audio_manager_;
+ AudioParameters params_;
+ AudioParameters output_params_;
+ VirtualAudioInputStream* stream_;
+ MockInputCallback input_callback_;
+ std::vector<AudioOutputStream*> output_streams_;
+ SineWaveAudioSource source_;
+ base::WaitableEvent done_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(VirtualAudioInputStreamTest);
+};
+
+TEST_F(VirtualAudioInputStreamTest, AttachAndDriveSingleStream) {
+ stream_ = static_cast<VirtualAudioInputStream*>(
+ audio_manager_->MakeAudioInputStream(params_, "1"));
+ DCHECK(stream_);
+
+ int num_output_streams = 1;
DaleCurtis 2012/11/28 23:43:18 These should be const
justinlin 2012/11/29 10:08:33 Done.
+ int num_callback_iterations = 1;
+ int num_streams_removed_per_round = 0;
+ int num_expected_source_callbacks = 1;
+
+ audio_manager_->GetMessageLoop()->PostTask(FROM_HERE, base::Bind(
+ &VirtualAudioInputStreamTest::StartStreamAndRunTestsOnAudioThread,
+ base::Unretained(this),
+ num_output_streams, num_callback_iterations,
+ num_streams_removed_per_round,
+ num_expected_source_callbacks));
+
+ done_.Wait();
+}
+
+TEST_F(VirtualAudioInputStreamTest, AttachAndDriveMultipleStreams) {
+ stream_ = static_cast<VirtualAudioInputStream*>(
+ audio_manager_->MakeAudioInputStream(params_, "1"));
+ DCHECK(stream_);
+
+ int num_output_streams = 5;
+ int num_callback_iterations = 5;
+ int num_streams_removed_per_round = 0;
+ int num_expected_source_callbacks = 25;
+
+ audio_manager_->GetMessageLoop()->PostTask(FROM_HERE, base::Bind(
+ &VirtualAudioInputStreamTest::StartStreamAndRunTestsOnAudioThread,
+ base::Unretained(this),
+ num_output_streams, num_callback_iterations,
+ num_streams_removed_per_round,
+ num_expected_source_callbacks));
+
+ done_.Wait();
+}
+
+TEST_F(VirtualAudioInputStreamTest, RemoveStreams) {
+ stream_ = static_cast<VirtualAudioInputStream*>(
+ audio_manager_->MakeAudioInputStream(params_, "1"));
+ DCHECK(stream_);
+
+ int num_output_streams = 8;
+ int num_callback_iterations = 5;
+ int num_streams_removed_per_round = 1;
+ int num_expected_source_callbacks = 7 + 6 + 5 + 4 + 3;
+
+ audio_manager_->GetMessageLoop()->PostTask(FROM_HERE, base::Bind(
+ &VirtualAudioInputStreamTest::StartStreamAndRunTestsOnAudioThread,
+ base::Unretained(this),
+ num_output_streams, num_callback_iterations,
+ num_streams_removed_per_round,
+ num_expected_source_callbacks));
+
+ done_.Wait();
+}
+
+} // namespace media

Powered by Google App Engine
This is Rietveld 408576698