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

Unified Diff: content/renderer/media/html_audio_element_capturer_source_unittest.cc

Issue 1599533003: MediaCaptureFromElement: add support for audio captureStream(). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months 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: content/renderer/media/html_audio_element_capturer_source_unittest.cc
diff --git a/content/renderer/media/html_audio_element_capturer_source_unittest.cc b/content/renderer/media/html_audio_element_capturer_source_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..e5dd1a75fda918a929602d77f8d26637556dead1
--- /dev/null
+++ b/content/renderer/media/html_audio_element_capturer_source_unittest.cc
@@ -0,0 +1,134 @@
+// Copyright 2016 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/memory/weak_ptr.h"
+#include "base/run_loop.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "content/renderer/media/html_audio_element_capturer_source.h"
+#include "media/audio/null_audio_sink.h"
+#include "media/base/audio_parameters.h"
+#include "media/blink/webaudiosourceprovider_impl.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::_;
+using ::testing::AllOf;
+using ::testing::InSequence;
+using ::testing::Mock;
+using ::testing::Property;
+
+namespace content {
+
+// These constants represent the sampling rates and samples per buffer for input
+// and output as seen by HTMLAudioElementCapturerSource. For the purpose of the
+// test, both are chunks of 10ms, which happens to be the preferred one of
+// MediaStream Audio Tracks.
+static const int kNumChannelsForTest = 1;
+static const int kBufferDurationMs = 10;
+
+// This value mimics what is provided by WebAudioSourceProviderImpl.
+static const int kPlaybackAudioTrackSamplesPerBuffer = 1024;
+
+static const int kMediaStreamAudioTrackSampleRate = 48000;
+static const int kMediaStreamAudioTrackSamplesPerBuffer =
+ kMediaStreamAudioTrackSampleRate * kBufferDurationMs / 1000;
+
+ACTION_P(RunClosure, closure) {
+ closure.Run();
+}
+
+class MockWebAudioSourceProvider : public media::WebAudioSourceProviderImpl {
+ public:
+ MockWebAudioSourceProvider()
+ : WebAudioSourceProviderImpl(
+ new media::NullAudioSink(base::ThreadTaskRunnerHandle::Get())) {}
+
+ void SetCopyAudioCallback(const CopyAudioCB& callback) override {
+ DVLOG(1) << __FUNCTION__;
+ callback_ = callback;
+
+ // We're super eager and send an AudioBus right after Start().
+ callback_.Run(media::AudioBus::Create(kNumChannelsForTest,
+ kPlaybackAudioTrackSamplesPerBuffer),
+ 0 /* delay_milliseconds */, 44100 /* sample_rate */);
+ }
+ void ClearCopyAudioCallback() override {
+ callback_.Reset();
+ }
+
+ protected:
+ ~MockWebAudioSourceProvider() override = default;
+
+ private:
+ CopyAudioCB callback_;
+};
+
+class HTMLAudioElementCapturerSourceTest
+ : public testing::Test,
+ public media::AudioCapturerSource::CaptureCallback {
+ public:
+ HTMLAudioElementCapturerSourceTest()
+ : audio_source_(new MockWebAudioSourceProvider()),
+ html_audio_capturer_(
+ new HtmlAudioElementCapturerSource(audio_source_->AsWeakPtr())) {}
+
+ // media::AudioCapturerSource::CaptureCallback implementation
+ MOCK_METHOD4(Capture,
+ void(const media::AudioBus* audio_source,
+ int audio_delay_milliseconds,
+ double volume,
+ bool key_pressed));
+ MOCK_METHOD1(OnCaptureError, void(const std::string& message));
+
+ protected:
+ // We need some kind of message loop to allow |html_audio_capturer_| to
+ // schedule capture events.
+ const base::MessageLoopForUI message_loop_;
+
+ scoped_refptr<MockWebAudioSourceProvider> audio_source_;
+ scoped_refptr<HtmlAudioElementCapturerSource> html_audio_capturer_;
+};
+
+// Constructs and destructs all objects, in particular |html_audio_capturer_|
+// and its inner object(s). This is a non trivial sequence.
+TEST_F(HTMLAudioElementCapturerSourceTest, ConstructAndDestruct) {}
+
+TEST_F(HTMLAudioElementCapturerSourceTest, InitializeStartAndStop) {
+ InSequence s;
+
+ base::RunLoop run_loop;
+ base::Closure quit_closure = run_loop.QuitClosure();
+
+ // Similar to what WebRtcAudioCapturer::SetCapturerSourceInternal() does.
+ const media::AudioParameters params(
+ media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
+ media::GuessChannelLayout(kNumChannelsForTest),
+ kMediaStreamAudioTrackSampleRate /* sample_rate */,
+ 16 /* bits_per_sample */,
+ kMediaStreamAudioTrackSamplesPerBuffer /* frames_per_buffer */);
+ html_audio_capturer_->Initialize(params, this, 0 /* session_id */);
+
+ EXPECT_CALL(
+ *this,
+ Capture(AllOf(Property(&media::AudioBus::channels, kNumChannelsForTest),
+ Property(&media::AudioBus::frames,
+ kMediaStreamAudioTrackSamplesPerBuffer)),
+ _, 1.0, false))
+ .Times(1);
+ EXPECT_CALL(
+ *this,
+ Capture(AllOf(Property(&media::AudioBus::channels, kNumChannelsForTest),
+ Property(&media::AudioBus::frames,
+ kMediaStreamAudioTrackSamplesPerBuffer)),
+ _, 1.0, false))
+ .Times(1)
+ .WillOnce(RunClosure(quit_closure));
+ html_audio_capturer_->Start();
+ run_loop.Run();
+
+ html_audio_capturer_->Stop();
+ Mock::VerifyAndClearExpectations(this);
+}
+
+} // namespace content

Powered by Google App Engine
This is Rietveld 408576698