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

Side by Side Diff: content/renderer/media/audio_track_recorder_unittest.cc

Issue 1406113002: Add AudioTrackRecorder for audio component of MediaStream recording. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: forward declaration Created 5 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/renderer/media/audio_track_recorder.h"
6
7 #include "base/run_loop.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "content/renderer/media/media_stream_audio_source.h"
10 #include "content/renderer/media/mock_media_constraint_factory.h"
11 #include "content/renderer/media/webrtc/webrtc_local_audio_track_adapter.h"
12 #include "content/renderer/media/webrtc_local_audio_track.h"
13 #include "media/audio/simple_sources.h"
14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16
17 using ::testing::_;
18 using ::testing::DoAll;
19 using ::testing::InSequence;
20 using ::testing::Mock;
21 using ::testing::Return;
22 using ::testing::SaveArg;
23
24 namespace {
25
26 // Input audio format.
27 const media::AudioParameters::Format kInputFormat =
28 media::AudioParameters::AUDIO_PCM_LOW_LATENCY;
29 const int kNumChannels = 1;
miu 2015/10/26 22:41:04 Consider testing more than one channel (e.g., to t
ajose 2015/10/27 18:41:28 Done.
30 const int kBitsPerSample = 16;
31 const int kSamplingRate = 48000;
32 const int kFramesPerBuffer = 480;
33
34 } // namespace
35
36 namespace content {
37
38 ACTION_P(RunClosure, closure) {
39 closure.Run();
40 }
41
42 class AudioTrackRecorderTest : public testing::Test {
43 public:
44 AudioTrackRecorderTest()
45 : params1_(kInputFormat,
46 media::CHANNEL_LAYOUT_MONO,
47 kSamplingRate,
48 kBitsPerSample,
49 kFramesPerBuffer),
50 params2_(kInputFormat,
51 media::CHANNEL_LAYOUT_STEREO,
52 kSamplingRate,
53 kBitsPerSample,
54 kFramesPerBuffer),
55 source_(kNumChannels, 440, kSamplingRate) {
56 PrepareBlinkTrackOfType(MEDIA_DEVICE_AUDIO_CAPTURE);
57 audio_track_recorder_.reset(new AudioTrackRecorder(
58 blink_track_, base::Bind(&AudioTrackRecorderTest::OnEncodedAudio,
59 base::Unretained(this))));
60 }
61
62 ~AudioTrackRecorderTest() {
63 audio_track_recorder_.reset();
64 blink_track_.setExtraData(nullptr);
65
66 // experiment with fixing leaks
67 delete audio_source_;
68 native_track_.reset();
69 adapter_ = nullptr;
70 capturer_ = nullptr;
71 }
72
73 scoped_ptr<media::AudioBus> NextAudioBus(const base::TimeDelta& duration) {
74 const int num_samples = static_cast<int>((kSamplingRate * duration) /
75 base::TimeDelta::FromSeconds(1));
76 scoped_ptr<media::AudioBus> bus(
77 media::AudioBus::Create(kNumChannels, num_samples));
78 source_.OnMoreData(bus.get(), 0);
79 return bus.Pass();
80 }
81
82 MOCK_METHOD3(DoOnEncodedAudio,
83 void(const media::AudioParameters& params,
84 std::string encoded_data,
85 base::TimeTicks timestamp));
86
87 void OnEncodedAudio(const media::AudioParameters& params,
88 scoped_ptr<std::string> encoded_data,
89 base::TimeTicks timestamp) {
90 EXPECT_TRUE(!encoded_data->empty());
91 DoOnEncodedAudio(params, *encoded_data, timestamp);
92 }
93
94 const base::MessageLoop message_loop_;
95
96 // ATR and WebMediaStreamTrack for fooling it.
97 scoped_ptr<AudioTrackRecorder> audio_track_recorder_;
miu 2015/10/26 22:41:04 nit: Don't need separate heap allocation here, jus
ajose 2015/10/27 18:41:28 Moving ATR to the initialization list of the tests
98 blink::WebMediaStreamTrack blink_track_;
99
100 // test
101 blink::WebMediaConstraints constraints_;
102 scoped_refptr<WebRtcAudioCapturer> capturer_;
103 scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter_;
104 scoped_ptr<WebRtcLocalAudioTrack> native_track_;
105 blink::WebMediaStreamSource blink_audio_source_;
106 MediaStreamAudioSource* audio_source_;
107 // test
108
109 // Two different sets of AudioParameters for testing re-init of ATR.
110 media::AudioParameters params1_;
111 media::AudioParameters params2_;
112
113 // AudioSource for creating AudioBuses.
114 media::SineWaveAudioSource source_;
115
116 private:
117 // Prepares a blink track of a given MediaStreamType and attaches the native
118 // track, which can be used to capture audio data and pass it to the producer.
119 // Taken from media::SpeechRecognitionAudioSinkTest
120 void PrepareBlinkTrackOfType(const MediaStreamType device_type) {
121 StreamDeviceInfo device_info(device_type, "Mock device", "mock_device_id");
122 MockMediaConstraintFactory constraint_factory;
123 //const blink::WebMediaConstraints constraints =
124 constraints_ =
125 constraint_factory.CreateWebMediaConstraints();
126 //scoped_refptr<WebRtcAudioCapturer> capturer(
127 capturer_ =
128 WebRtcAudioCapturer::CreateCapturer(-1, device_info, constraints_, NULL,
129 NULL);
130 adapter_ =
131 WebRtcLocalAudioTrackAdapter::Create(std::string(), NULL);
132 native_track_ = make_scoped_ptr(
133 new WebRtcLocalAudioTrack(adapter_.get(), capturer_, NULL));
134 //blink::WebMediaStreamSource blink_audio_source;
135 blink_audio_source_.initialize(base::UTF8ToUTF16("dummy_source_id"),
136 blink::WebMediaStreamSource::TypeAudio,
137 base::UTF8ToUTF16("dummy_source_name"),
138 false /* remote */, true /* readonly */);
139 MediaStreamSource::SourceStoppedCallback cb;
140 audio_source_ = new MediaStreamAudioSource(-1, device_info, cb, NULL);
141 blink_audio_source_.setExtraData(
142 //new MediaStreamAudioSource(-1, device_info, cb, NULL));
143 audio_source_);
144 blink_track_.initialize(blink::WebString::fromUTF8("dummy_track"),
145 blink_audio_source_);
146 blink_track_.setExtraData(native_track_.release());
147 }
148
149 DISALLOW_COPY_AND_ASSIGN(AudioTrackRecorderTest);
150 };
151
152 TEST_F(AudioTrackRecorderTest, OnData) {
153 audio_track_recorder_->OnSetFormat(params1_);
154 InSequence s;
155 base::RunLoop run_loop;
156 base::Closure quit_closure = run_loop.QuitClosure();
157
158 // TODO(ajose): consider adding WillOnce(SaveArg...) and inspecting, as done
159 // in VTR unittests.
160 // TODO(ajose): Using 10ms chunks due to hard-coded 100fps framerate.
161 // Need to figure out what to do about framerate.
162 const base::TimeTicks time1 = base::TimeTicks::Now();
163 EXPECT_CALL(*this, DoOnEncodedAudio(_, _, time1)).Times(1);
164 audio_track_recorder_->OnData(
165 *NextAudioBus(base::TimeDelta::FromMilliseconds(10)), time1);
166
167 // Send more audio.
168 const base::TimeTicks time2 = base::TimeTicks::Now();
169 EXPECT_CALL(*this, DoOnEncodedAudio(_, _, _)).Times(1);
170 audio_track_recorder_->OnData(
171 *NextAudioBus(base::TimeDelta::FromMilliseconds(10)), time2);
172
173 // Send audio with different params to force ATR to re-init.
174 const base::TimeTicks time3 = base::TimeTicks::Now();
175 EXPECT_CALL(*this, DoOnEncodedAudio(_, _, _))
176 .Times(1)
177 .WillOnce(RunClosure(quit_closure));
178 audio_track_recorder_->OnData(
179 *NextAudioBus(base::TimeDelta::FromMilliseconds(10)), time3);
180
181 run_loop.Run();
182 Mock::VerifyAndClearExpectations(this);
183 }
184
185 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698