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

Side by Side Diff: chrome/browser/media/webrtc/webrtc_audio_quality_browsertest.cc

Issue 2753543010: WebRTC: Use the MediaStream Recording API for the audio_quality_browsertest. (Closed)
Patch Set: Removed obsolete comments. Created 3 years, 9 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stddef.h> 5 #include <stddef.h>
6 6
7 #include <ctime> 7 #include <ctime>
8 8
9 #include "base/base64.h"
9 #include "base/command_line.h" 10 #include "base/command_line.h"
10 #include "base/files/file_enumerator.h" 11 #include "base/files/file_enumerator.h"
11 #include "base/files/file_util.h" 12 #include "base/files/file_util.h"
12 #include "base/files/scoped_temp_dir.h" 13 #include "base/files/scoped_temp_dir.h"
13 #include "base/macros.h" 14 #include "base/macros.h"
14 #include "base/process/launch.h" 15 #include "base/process/launch.h"
15 #include "base/process/process.h" 16 #include "base/process/process.h"
16 #include "base/scoped_native_library.h" 17 #include "base/scoped_native_library.h"
17 #include "base/strings/string_number_conversions.h" 18 #include "base/strings/string_number_conversions.h"
18 #include "base/strings/string_util.h" 19 #include "base/strings/string_util.h"
(...skipping 24 matching lines...) Expand all
43 44
44 // The javascript will load the reference file relative to its location, 45 // The javascript will load the reference file relative to its location,
45 // which is in /webrtc on the web server. The files we are looking for are in 46 // which is in /webrtc on the web server. The files we are looking for are in
46 // webrtc/resources in the chrome/test/data folder. 47 // webrtc/resources in the chrome/test/data folder.
47 static const char kReferenceFileRelativeUrl[] = 48 static const char kReferenceFileRelativeUrl[] =
48 "resources/speech_44kHz_16bit_stereo.wav"; 49 "resources/speech_44kHz_16bit_stereo.wav";
49 50
50 static const char kWebRtcAudioTestHtmlPage[] = 51 static const char kWebRtcAudioTestHtmlPage[] =
51 "/webrtc/webrtc_audio_quality_test.html"; 52 "/webrtc/webrtc_audio_quality_test.html";
52 53
54 // How often to ask the test page whether the audio recording is completed.
55 const int kPollingIntervalInMs = 1000;
56
53 // For the AGC test, there are 6 speech segments split on silence. If one 57 // For the AGC test, there are 6 speech segments split on silence. If one
54 // segment is significantly different in length compared to the same segment in 58 // segment is significantly different in length compared to the same segment in
55 // the reference file, there's something fishy going on. 59 // the reference file, there's something fishy going on.
56 const int kMaxAgcSegmentDiffMs = 60 const int kMaxAgcSegmentDiffMs =
57 #if defined(OS_MACOSX) 61 #if defined(OS_MACOSX)
58 // Something is different on Mac; http://crbug.com/477653. 62 // Something is different on Mac; http://crbug.com/477653.
59 600; 63 600;
60 #else 64 #else
61 200; 65 200;
62 #endif 66 #endif
63 67
64 #if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MACOSX) 68 #if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MACOSX)
65 #define MAYBE_WebRtcAudioQualityBrowserTest WebRtcAudioQualityBrowserTest 69 #define MAYBE_WebRtcAudioQualityBrowserTest WebRtcAudioQualityBrowserTest
66 #else 70 #else
67 // Not implemented on Android, ChromeOS etc. 71 // Not implemented on Android, ChromeOS etc.
68 #define MAYBE_WebRtcAudioQualityBrowserTest DISABLED_WebRtcAudioQualityBrowserTe st 72 #define MAYBE_WebRtcAudioQualityBrowserTest DISABLED_WebRtcAudioQualityBrowserTe st
69 #endif 73 #endif
70 74
71 } // namespace 75 } // namespace
72 76
73 // Test we can set up a WebRTC call and play audio through it. 77 // Test we can set up a WebRTC call and play audio through it.
74 // 78 //
75 // If you're not a googler and want to run this test, you need to provide a 79 // If you're not a googler and want to run this test, you need to provide a
76 // pesq binary for your platform (and sox.exe on windows). Read more on how 80 // pesq binary for your platform (and sox.exe on windows). Read more on how
77 // resources are managed in chrome/test/data/webrtc/resources/README. 81 // resources are managed in chrome/test/data/webrtc/resources/README.
78 // 82 //
79 // This test will only work on machines that have been configured to record
80 // their own input.
81 //
82 // On Linux: 83 // On Linux:
83 // 1. # sudo apt-get install pavucontrol sox 84 // 1. # sudo apt-get install sox
84 // 2. For the user who will run the test: # pavucontrol
85 // 3. In a separate terminal, # arecord dummy
86 // 4. In pavucontrol, go to the recording tab.
87 // 5. For the ALSA plugin [aplay]: ALSA Capture from, change from <x> to
88 // <Monitor of x>, where x is whatever your primary sound device is called.
89 // 6. Try launching chrome as the target user on the target machine, try
90 // playing, say, a YouTube video, and record with # arecord -f dat tmp.dat.
91 // Verify the recording with aplay (should have recorded what you played
92 // from chrome).
93 //
94 // Note: the volume for ALL your input devices will be forced to 100% by
95 // running this test on Linux.
96 // 85 //
97 // On Mac: 86 // On Mac:
98 // TODO(phoglund): download sox from gs instead. 87 // TODO(phoglund): download sox from gs instead.
99 // 1. Get SoundFlower: http://rogueamoeba.com/freebies/soundflower/download.php 88 // 1. Get SoundFlower: http://rogueamoeba.com/freebies/soundflower/download.php
100 // 2. Install it + reboot. 89 // 2. Install it + reboot.
101 // 3. Install MacPorts (http://www.macports.org/). 90 // 3. Install MacPorts (http://www.macports.org/).
102 // 4. Install sox: sudo port install sox. 91 // 4. Install sox: sudo port install sox.
103 // 5. (For Chrome bots) Ensure sox and rec are reachable from the env the test 92 // 5. (For Chrome bots) Ensure sox is reachable from the env the test
104 // executes in (sox and rec tends to install in /opt/, which generally isn't 93 // executes in (sox tends to install in /opt/, which generally isn't in the
105 // in the Chrome bots' env). For instance, run 94 // Chrome bots' env). For instance, run
106 // sudo ln -s /opt/local/bin/rec /usr/local/bin/rec
107 // sudo ln -s /opt/local/bin/sox /usr/local/bin/sox 95 // sudo ln -s /opt/local/bin/sox /usr/local/bin/sox
108 // 6. In Sound Preferences, set both input and output to Soundflower (2ch).
109 // Note: You will no longer hear audio on this machine, and it will no
110 // longer use any built-in mics.
111 // 7. Try launching chrome as the target user on the target machine, try
112 // playing, say, a YouTube video, and record with 'rec test.wav trim 0 5'.
113 // Stop the video in chrome and try playing back the file; you should hear
114 // a recording of the video (note; if you play back on the target machine
115 // you must revert the changes in step 3 first).
116 //
117 // On Windows 7:
118 // 1. Control panel > Sound > Manage audio devices.
119 // 2. In the recording tab, right-click in an empty space in the pane with the
120 // devices. Tick 'show disabled devices'.
121 // 3. You should see a 'stereo mix' device - this is what your speakers output.
122 // If you don't have one, your driver doesn't support stereo mix devices.
123 // Some drivers use different names for the mix device though (like "Wave").
124 // Right click > Properties.
125 // 4. Ensure "listen to this device" is unchecked, otherwise you get echo.
126 // 5. Ensure the mix device is the default recording device.
127 // 6. Launch chrome and try playing a video with sound. You should see
128 // in the volume meter for the mix device. Configure the mix device to have
129 // 50 / 100 in level. Also go into the playback tab, right-click Speakers,
130 // and set that level to 50 / 100. Otherwise you will get distortion in
131 // the recording.
132 class MAYBE_WebRtcAudioQualityBrowserTest : public WebRtcTestBase { 96 class MAYBE_WebRtcAudioQualityBrowserTest : public WebRtcTestBase {
133 public: 97 public:
134 MAYBE_WebRtcAudioQualityBrowserTest() {} 98 MAYBE_WebRtcAudioQualityBrowserTest() {}
135 void SetUpInProcessBrowserTestFixture() override { 99 void SetUpInProcessBrowserTestFixture() override {
136 DetectErrorsInJavaScript(); // Look for errors in our rather complex js. 100 DetectErrorsInJavaScript(); // Look for errors in our rather complex js.
137 } 101 }
138 102
139 void SetUpCommandLine(base::CommandLine* command_line) override { 103 void SetUpCommandLine(base::CommandLine* command_line) override {
140 EXPECT_FALSE(command_line->HasSwitch( 104 EXPECT_FALSE(command_line->HasSwitch(
141 switches::kUseFakeUIForMediaStream)); 105 switches::kUseFakeUIForMediaStream));
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 ExecuteJavascript("preparePeerConnection()", tab)); 143 ExecuteJavascript("preparePeerConnection()", tab));
180 return tab; 144 return tab;
181 } 145 }
182 146
183 void MuteMediaElement(const std::string& element_id, 147 void MuteMediaElement(const std::string& element_id,
184 content::WebContents* tab_contents) { 148 content::WebContents* tab_contents) {
185 EXPECT_EQ("ok-muted", ExecuteJavascript( 149 EXPECT_EQ("ok-muted", ExecuteJavascript(
186 "setMediaElementMuted('" + element_id + "', true)", tab_contents)); 150 "setMediaElementMuted('" + element_id + "', true)", tab_contents));
187 } 151 }
188 152
153 void WriteCapturedAudio(content::WebContents* capturing_tab,
154 const base::FilePath& audio_filename);
155
189 protected: 156 protected:
190 void TestAutoGainControl(const base::FilePath::StringType& reference_filename, 157 void TestAutoGainControl(const base::FilePath::StringType& reference_filename,
191 const std::string& constraints, 158 const std::string& constraints,
192 const std::string& perf_modifier); 159 const std::string& perf_modifier);
193 void SetupAndRecordAudioCall(const base::FilePath& reference_file, 160 void SetupAndRecordAudioCall(const base::FilePath& reference_file,
194 const base::FilePath& recording, 161 const base::FilePath& recording,
mcasas 2017/03/21 16:54:22 |recording| is confusing, what about s/recording/r
195 const std::string& constraints, 162 const std::string& constraints);
196 const base::TimeDelta recording_time);
197 void TestWithFakeDeviceGetUserMedia(const std::string& constraints, 163 void TestWithFakeDeviceGetUserMedia(const std::string& constraints,
198 const std::string& perf_modifier); 164 const std::string& perf_modifier);
199 }; 165 };
200 166
201 namespace { 167 namespace {
202 168
203 class AudioRecorder {
204 public:
205 AudioRecorder() {}
206 ~AudioRecorder() {}
207
208 // Starts the recording program for the specified duration. Returns true
209 // on success. We record in 16-bit 44.1 kHz Stereo (mostly because that's
210 // what SoundRecorder.exe will give us and we can't change that).
211 bool StartRecording(base::TimeDelta recording_time,
212 const base::FilePath& output_file) {
213 EXPECT_FALSE(recording_application_.IsValid())
214 << "Tried to record, but is already recording.";
215
216 int duration_sec = static_cast<int>(recording_time.InSeconds());
217 base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
218
219 #if defined(OS_WIN)
220 // This disable is required to run SoundRecorder.exe on 64-bit Windows
221 // from a 32-bit binary. We need to load the wow64 disable function from
222 // the DLL since it doesn't exist on Windows XP.
223 base::ScopedNativeLibrary kernel32_lib(base::FilePath(L"kernel32"));
224 if (kernel32_lib.is_valid()) {
225 typedef BOOL (WINAPI* Wow64DisableWow64FSRedirection)(PVOID*);
226 Wow64DisableWow64FSRedirection wow_64_disable_wow_64_fs_redirection;
227 wow_64_disable_wow_64_fs_redirection =
228 reinterpret_cast<Wow64DisableWow64FSRedirection>(
229 kernel32_lib.GetFunctionPointer(
230 "Wow64DisableWow64FsRedirection"));
231 if (wow_64_disable_wow_64_fs_redirection != NULL) {
232 PVOID* ignored = NULL;
233 wow_64_disable_wow_64_fs_redirection(ignored);
234 }
235 }
236
237 char duration_in_hms[128] = {0};
238 struct tm duration_tm = {0};
239 duration_tm.tm_sec = duration_sec;
240 EXPECT_NE(0u, strftime(duration_in_hms, arraysize(duration_in_hms),
241 "%H:%M:%S", &duration_tm));
242
243 command_line.SetProgram(
244 base::FilePath(FILE_PATH_LITERAL("SoundRecorder.exe")));
245 command_line.AppendArg("/FILE");
246 command_line.AppendArgPath(output_file);
247 command_line.AppendArg("/DURATION");
248 command_line.AppendArg(duration_in_hms);
249 #elif defined(OS_MACOSX)
250 command_line.SetProgram(base::FilePath("rec"));
251 command_line.AppendArg("-b");
252 command_line.AppendArg("16");
253 command_line.AppendArg("-q");
254 command_line.AppendArgPath(output_file);
255 command_line.AppendArg("trim");
256 command_line.AppendArg("0");
257 command_line.AppendArg(base::IntToString(duration_sec));
258 #else
259 command_line.SetProgram(base::FilePath("arecord"));
260 command_line.AppendArg("-d");
261 command_line.AppendArg(base::IntToString(duration_sec));
262 command_line.AppendArg("-f");
263 command_line.AppendArg("cd");
264 command_line.AppendArg("-c");
265 command_line.AppendArg("2");
266 command_line.AppendArgPath(output_file);
267 #endif
268
269 DVLOG(0) << "Running " << command_line.GetCommandLineString();
270 recording_application_ =
271 base::LaunchProcess(command_line, base::LaunchOptions());
272 return recording_application_.IsValid();
273 }
274
275 // Joins the recording program. Returns true on success.
276 bool WaitForRecordingToEnd() {
277 int exit_code = -1;
278 recording_application_.WaitForExit(&exit_code);
279 return exit_code == 0;
280 }
281 private:
282 base::Process recording_application_;
283 };
284
285 bool ForceMicrophoneVolumeTo100Percent() {
286 #if defined(OS_WIN)
287 // Note: the force binary isn't in tools since it's one of our own.
288 base::CommandLine command_line(test::GetReferenceFilesDir().Append(
289 FILE_PATH_LITERAL("force_mic_volume_max.exe")));
290 DVLOG(0) << "Running " << command_line.GetCommandLineString();
291 std::string result;
292 if (!base::GetAppOutput(command_line, &result)) {
293 LOG(ERROR) << "Failed to set source volume: output was " << result;
294 return false;
295 }
296 #elif defined(OS_MACOSX)
297 base::CommandLine command_line(
298 base::FilePath(FILE_PATH_LITERAL("osascript")));
299 command_line.AppendArg("-e");
300 command_line.AppendArg("set volume input volume 100");
301 command_line.AppendArg("-e");
302 command_line.AppendArg("set volume output volume 85");
303
304 std::string result;
305 if (!base::GetAppOutput(command_line, &result)) {
306 LOG(ERROR) << "Failed to set source volume: output was " << result;
307 return false;
308 }
309 #else
310 // Just force the volume of, say the first 5 devices. A machine will rarely
311 // have more input sources than that. This is way easier than finding the
312 // input device we happen to be using.
313 for (int device_index = 0; device_index < 5; ++device_index) {
314 std::string result;
315 const std::string kHundredPercentVolume = "65536";
316 base::CommandLine command_line(base::FilePath(FILE_PATH_LITERAL("pacmd")));
317 command_line.AppendArg("set-source-volume");
318 command_line.AppendArg(base::IntToString(device_index));
319 command_line.AppendArg(kHundredPercentVolume);
320 DVLOG(0) << "Running " << command_line.GetCommandLineString();
321 if (!base::GetAppOutput(command_line, &result)) {
322 LOG(ERROR) << "Failed to set source volume: output was " << result;
323 return false;
324 }
325 }
326 #endif
327 return true;
328 }
329
330 // Sox is the "Swiss army knife" of audio processing. We mainly use it for 169 // Sox is the "Swiss army knife" of audio processing. We mainly use it for
331 // silence trimming. See http://sox.sourceforge.net. 170 // silence trimming. See http://sox.sourceforge.net.
332 base::CommandLine MakeSoxCommandLine() { 171 base::CommandLine MakeSoxCommandLine() {
333 #if defined(OS_WIN) 172 #if defined(OS_WIN)
334 base::FilePath sox_path = test::GetToolForPlatform("sox"); 173 base::FilePath sox_path = test::GetToolForPlatform("sox");
335 if (!base::PathExists(sox_path)) { 174 if (!base::PathExists(sox_path)) {
336 LOG(ERROR) << "Missing sox.exe binary in " << sox_path.value() 175 LOG(ERROR) << "Missing sox.exe binary in " << sox_path.value()
337 << "; you may have to provide this binary yourself."; 176 << "; you may have to provide this binary yourself.";
338 return base::CommandLine(base::CommandLine::NO_PROGRAM); 177 return base::CommandLine(base::CommandLine::NO_PROGRAM);
339 } 178 }
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
380 command_line.AppendArg(kTreshold); 219 command_line.AppendArg(kTreshold);
381 command_line.AppendArg("reverse"); 220 command_line.AppendArg("reverse");
382 221
383 DVLOG(0) << "Running " << command_line.GetCommandLineString(); 222 DVLOG(0) << "Running " << command_line.GetCommandLineString();
384 std::string result; 223 std::string result;
385 bool ok = base::GetAppOutput(command_line, &result); 224 bool ok = base::GetAppOutput(command_line, &result);
386 DVLOG(0) << "Output was:\n\n" << result; 225 DVLOG(0) << "Output was:\n\n" << result;
387 return ok; 226 return ok;
388 } 227 }
389 228
229 // Runs ffmpeg on the captured webm video and writes it to a .wav file.
230 bool RunWebmToWavConverter(const base::FilePath& webm_audio_filename,
231 const base::FilePath& wav_audio_filename) {
232 base::FilePath path_to_ffmpeg = test::GetToolForPlatform("ffmpeg");
mcasas 2017/03/21 16:54:22 nit: const here and in l.252, l.486, l.493, 495 et
233 if (!base::PathExists(path_to_ffmpeg)) {
234 LOG(ERROR) << "Missing ffmpeg: should be in " << path_to_ffmpeg.value();
235 return false;
236 }
237
238 // Set up ffmpeg to output at a certain bitrate (-ab). This is hopefully set
239 // high enough to avoid degrading audio quality too much.
240 base::CommandLine ffmpeg_command(path_to_ffmpeg);
241 ffmpeg_command.AppendArg("-i");
242 ffmpeg_command.AppendArgPath(webm_audio_filename);
243 ffmpeg_command.AppendArg("-ab");
244 ffmpeg_command.AppendArg("300k");
245 ffmpeg_command.AppendArg("-y");
246 ffmpeg_command.AppendArgPath(wav_audio_filename);
247
248 // We produce an output file that will later be used as an input to the
249 // barcode decoder and frame analyzer tools.
250 DVLOG(0) << "Running " << ffmpeg_command.GetCommandLineString();
251 std::string result;
252 bool ok = base::GetAppOutputAndError(ffmpeg_command, &result);
253 DVLOG(0) << "Output was:\n\n" << result;
254 return ok;
255 }
256
390 // Looks for 0.2 second audio segments surrounded by silences under 0.3% audio 257 // Looks for 0.2 second audio segments surrounded by silences under 0.3% audio
391 // power and splits the input file on those silences. Output files are written 258 // power and splits the input file on those silences. Output files are written
392 // according to the output file template (e.g. /tmp/out.wav writes 259 // according to the output file template (e.g. /tmp/out.wav writes
393 // /tmp/out001.wav, /tmp/out002.wav, etc if there are two silence-padded 260 // /tmp/out001.wav, /tmp/out002.wav, etc if there are two silence-padded
394 // regions in the file). The silences between speech segments must be at 261 // regions in the file). The silences between speech segments must be at
395 // least 500 ms for this to be reliable. 262 // least 500 ms for this to be reliable.
396 bool SplitFileOnSilence(const base::FilePath& input_file, 263 bool SplitFileOnSilence(const base::FilePath& input_file,
397 const base::FilePath& output_file_template) { 264 const base::FilePath& output_file_template) {
398 base::CommandLine command_line = MakeSoxCommandLine(); 265 base::CommandLine command_line = MakeSoxCommandLine();
399 if (command_line.GetProgram().empty()) 266 if (command_line.GetProgram().empty())
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 perf_test::PrintResult( 473 perf_test::PrintResult(
607 "audio_pesq", perf_modifier, "mos_lqo", mos_lqo, "score", true); 474 "audio_pesq", perf_modifier, "mos_lqo", mos_lqo, "score", true);
608 } 475 }
609 476
610 DeleteFileUnlessTestFailed(trimmed_reference, false); 477 DeleteFileUnlessTestFailed(trimmed_reference, false);
611 DeleteFileUnlessTestFailed(trimmed_recording, false); 478 DeleteFileUnlessTestFailed(trimmed_recording, false);
612 } 479 }
613 480
614 } // namespace 481 } // namespace
615 482
483 void MAYBE_WebRtcAudioQualityBrowserTest::WriteCapturedAudio(
484 content::WebContents* capturing_tab,
485 const base::FilePath& audio_filename) {
486 base::FilePath audio_filename_webm =
487 audio_filename.AddExtension(FILE_PATH_LITERAL(".webm"));
488
489 std::string base64_encoded_audio =
490 ExecuteJavascript("getRecordedAudioAsBase64()", capturing_tab);
491 std::string recorded_audio;
492 ASSERT_TRUE(base::Base64Decode(base64_encoded_audio, &recorded_audio));
493 base::File audio_file(audio_filename_webm,
494 base::File::FLAG_CREATE | base::File::FLAG_WRITE);
495 size_t written =
496 audio_file.Write(0, recorded_audio.c_str(), recorded_audio.length());
497 ASSERT_EQ(recorded_audio.length(), written);
498
499 RunWebmToWavConverter(audio_filename_webm, audio_filename);
500 }
501
616 // Sets up a two-way WebRTC call and records its output to |recording|, using 502 // Sets up a two-way WebRTC call and records its output to |recording|, using
617 // getUserMedia. 503 // getUserMedia.
618 // 504 //
619 // |reference_file| should have at least five seconds of silence in the 505 // |reference_file| should have at least five seconds of silence in the
620 // beginning: otherwise all the reference audio will not be picked up by the 506 // beginning: otherwise all the reference audio will not be picked up by the
621 // recording. Note that the reference file will start playing as soon as the 507 // recording. Note that the reference file will start playing as soon as the
622 // audio device is up following the getUserMedia call in the left tab. The time 508 // audio device is up following the getUserMedia call in the left tab. The time
623 // it takes to negotiate a call isn't deterministic, but five seconds should be 509 // it takes to negotiate a call isn't deterministic, but five seconds should be
624 // plenty of time. Similarly, the recording time should be enough to catch the 510 // plenty of time. Similarly, the recording time should be enough to catch the
625 // whole reference file. If you then silence-trim the reference file and actual 511 // whole reference file. If you then silence-trim the reference file and actual
626 // file, you should end up with two time-synchronized files. 512 // file, you should end up with two time-synchronized files.
627 void MAYBE_WebRtcAudioQualityBrowserTest::SetupAndRecordAudioCall( 513 void MAYBE_WebRtcAudioQualityBrowserTest::SetupAndRecordAudioCall(
628 const base::FilePath& reference_file, 514 const base::FilePath& reference_file,
629 const base::FilePath& recording, 515 const base::FilePath& recording,
630 const std::string& constraints, 516 const std::string& constraints) {
631 const base::TimeDelta recording_time) {
632 ASSERT_TRUE(embedded_test_server()->Start()); 517 ASSERT_TRUE(embedded_test_server()->Start());
633 ASSERT_TRUE(test::HasReferenceFilesInCheckout()); 518 ASSERT_TRUE(test::HasReferenceFilesInCheckout());
634 ASSERT_TRUE(ForceMicrophoneVolumeTo100Percent());
635 519
636 ConfigureFakeDeviceToPlayFile(reference_file); 520 ConfigureFakeDeviceToPlayFile(reference_file);
637 521
638 // Create a two-way call. Mute one of the receivers though; that way it will 522 // Create a two-way call. Mute one of the receivers though; that way it will
639 // be receiving audio bytes, but we will not be playing out of both elements. 523 // be receiving audio bytes, but we will not be playing out of both elements.
640 GURL test_page = embedded_test_server()->GetURL(kWebRtcAudioTestHtmlPage); 524 GURL test_page = embedded_test_server()->GetURL(kWebRtcAudioTestHtmlPage);
641 content::WebContents* left_tab = 525 content::WebContents* left_tab =
642 OpenPageAndGetUserMediaInNewTabWithConstraints(test_page, constraints); 526 OpenPageAndGetUserMediaInNewTabWithConstraints(test_page, constraints);
643 SetupPeerconnectionWithLocalStream(left_tab); 527 SetupPeerconnectionWithLocalStream(left_tab);
644 MuteMediaElement("remote-view", left_tab); 528 MuteMediaElement("remote-view", left_tab);
645 529
646 content::WebContents* right_tab = 530 content::WebContents* right_tab =
647 OpenPageAndGetUserMediaInNewTabWithConstraints(test_page, constraints); 531 OpenPageAndGetUserMediaInNewTabWithConstraints(test_page, constraints);
648 SetupPeerconnectionWithLocalStream(right_tab); 532 SetupPeerconnectionWithLocalStream(right_tab);
649 533
650 AudioRecorder recorder;
651 ASSERT_TRUE(recorder.StartRecording(recording_time, recording));
652
653 NegotiateCall(left_tab, right_tab); 534 NegotiateCall(left_tab, right_tab);
654 535
655 ASSERT_TRUE(recorder.WaitForRecordingToEnd()); 536 EXPECT_TRUE(test::PollingWaitUntil("doneCapturingAudio()", "done-capturing",
656 DVLOG(0) << "Done recording to " << recording.value() << std::endl; 537 right_tab, kPollingIntervalInMs));
657 538
658 HangUp(left_tab); 539 HangUp(left_tab);
540
541 WriteCapturedAudio(right_tab, recording);
542
543 DVLOG(0) << "Done recording to " << recording.value() << std::endl;
mcasas 2017/03/21 16:54:22 s/recording.value()/recording.MaybeAsASCII()/ and
659 } 544 }
660 545
661 void MAYBE_WebRtcAudioQualityBrowserTest::TestWithFakeDeviceGetUserMedia( 546 void MAYBE_WebRtcAudioQualityBrowserTest::TestWithFakeDeviceGetUserMedia(
662 const std::string& constraints, 547 const std::string& constraints,
663 const std::string& perf_modifier) { 548 const std::string& perf_modifier) {
664 if (OnWin8()) { 549 if (OnWin8()) {
665 // http://crbug.com/379798. 550 // http://crbug.com/379798.
666 LOG(ERROR) << "This test is not implemented for Windows XP/Win8."; 551 LOG(ERROR) << "This test is not implemented for Windows XP/Win8.";
667 return; 552 return;
668 } 553 }
669 554
670 base::FilePath reference_file = 555 base::FilePath reference_file =
671 test::GetReferenceFilesDir().Append(kReferenceFile); 556 test::GetReferenceFilesDir().Append(kReferenceFile);
672 base::FilePath recording = CreateTemporaryWaveFile(); 557 base::FilePath recording = CreateTemporaryWaveFile();
673 558
674 ASSERT_NO_FATAL_FAILURE(SetupAndRecordAudioCall( 559 ASSERT_NO_FATAL_FAILURE(
675 reference_file, recording, constraints, 560 SetupAndRecordAudioCall(reference_file, recording, constraints));
676 base::TimeDelta::FromSeconds(30)));
677 561
678 ComputeAndPrintPesqResults(reference_file, recording, perf_modifier); 562 ComputeAndPrintPesqResults(reference_file, recording, perf_modifier);
679 DeleteFileUnlessTestFailed(recording, false); 563 DeleteFileUnlessTestFailed(recording, false);
680 } 564 }
681 565
682 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcAudioQualityBrowserTest, 566 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcAudioQualityBrowserTest,
683 MANUAL_TestCallQualityWithAudioFromFakeDevice) { 567 MANUAL_TestCallQualityWithAudioFromFakeDevice) {
684 TestWithFakeDeviceGetUserMedia(kAudioOnlyCallConstraints, "_getusermedia"); 568 TestWithFakeDeviceGetUserMedia(kAudioOnlyCallConstraints, "_getusermedia");
685 } 569 }
686 570
687 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcAudioQualityBrowserTest, 571 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcAudioQualityBrowserTest,
688 MANUAL_TestCallQualityWithAudioFromWebAudio) { 572 MANUAL_TestCallQualityWithAudioFromWebAudio) {
689 if (OnWin8()) { 573 if (OnWin8()) {
690 // http://crbug.com/379798. 574 // http://crbug.com/379798.
691 LOG(ERROR) << "This test is not implemented for Windows XP/Win8."; 575 LOG(ERROR) << "This test is not implemented for Windows XP/Win8.";
692 return; 576 return;
693 } 577 }
694 ASSERT_TRUE(test::HasReferenceFilesInCheckout()); 578 ASSERT_TRUE(test::HasReferenceFilesInCheckout());
695 ASSERT_TRUE(embedded_test_server()->Start()); 579 ASSERT_TRUE(embedded_test_server()->Start());
696 580
697 ASSERT_TRUE(ForceMicrophoneVolumeTo100Percent());
698
699 content::WebContents* left_tab = 581 content::WebContents* left_tab =
700 OpenPageWithoutGetUserMedia(kWebRtcAudioTestHtmlPage); 582 OpenPageWithoutGetUserMedia(kWebRtcAudioTestHtmlPage);
701 content::WebContents* right_tab = 583 content::WebContents* right_tab =
702 OpenPageWithoutGetUserMedia(kWebRtcAudioTestHtmlPage); 584 OpenPageWithoutGetUserMedia(kWebRtcAudioTestHtmlPage);
703 585
704 AddAudioFileToWebAudio(kReferenceFileRelativeUrl, left_tab); 586 AddAudioFileToWebAudio(kReferenceFileRelativeUrl, left_tab);
705 587
706 NegotiateCall(left_tab, right_tab); 588 NegotiateCall(left_tab, right_tab);
707 589
708 base::FilePath recording = CreateTemporaryWaveFile(); 590 base::FilePath recording = CreateTemporaryWaveFile();
709 591
710 // Note: the sound clip is 21.6 seconds: record for 25 seconds to get some
711 // safety margins on each side.
712 AudioRecorder recorder;
713 ASSERT_TRUE(recorder.StartRecording(base::TimeDelta::FromSeconds(25),
714 recording));
715
716 PlayAudioFileThroughWebAudio(left_tab); 592 PlayAudioFileThroughWebAudio(left_tab);
717 593
718 ASSERT_TRUE(recorder.WaitForRecordingToEnd()); 594 EXPECT_TRUE(test::PollingWaitUntil("doneCapturingAudio()", "done-capturing",
719 DVLOG(0) << "Done recording to " << recording.value() << std::endl; 595 right_tab, kPollingIntervalInMs));
720 596
721 HangUp(left_tab); 597 HangUp(left_tab);
722 598
599 WriteCapturedAudio(right_tab, recording);
600
601 DVLOG(0) << "Done recording to " << recording.value() << std::endl;
602
723 // Compare with the reference file on disk (this is the same file we played 603 // Compare with the reference file on disk (this is the same file we played
724 // through WebAudio earlier). 604 // through WebAudio earlier).
725 base::FilePath reference_file = 605 base::FilePath reference_file =
726 test::GetReferenceFilesDir().Append(kReferenceFile); 606 test::GetReferenceFilesDir().Append(kReferenceFile);
727 ComputeAndPrintPesqResults(reference_file, recording, "_webaudio"); 607 ComputeAndPrintPesqResults(reference_file, recording, "_webaudio");
728 } 608 }
729 609
730 /** 610 /**
731 * The auto gain control test plays a file into the fake microphone. Then it 611 * The auto gain control test plays a file into the fake microphone. Then it
732 * sets up a one-way WebRTC call with audio only and records Chrome's output on 612 * sets up a one-way WebRTC call with audio only and records Chrome's output on
(...skipping 30 matching lines...) Expand all
763 const std::string& perf_modifier) { 643 const std::string& perf_modifier) {
764 if (OnWin8()) { 644 if (OnWin8()) {
765 // http://crbug.com/379798. 645 // http://crbug.com/379798.
766 LOG(ERROR) << "This test is not implemented for Windows XP/Win8."; 646 LOG(ERROR) << "This test is not implemented for Windows XP/Win8.";
767 return; 647 return;
768 } 648 }
769 base::FilePath reference_file = 649 base::FilePath reference_file =
770 test::GetReferenceFilesDir().Append(reference_filename); 650 test::GetReferenceFilesDir().Append(reference_filename);
771 base::FilePath recording = CreateTemporaryWaveFile(); 651 base::FilePath recording = CreateTemporaryWaveFile();
772 652
773 ASSERT_NO_FATAL_FAILURE(SetupAndRecordAudioCall( 653 ASSERT_NO_FATAL_FAILURE(
774 reference_file, recording, constraints, 654 SetupAndRecordAudioCall(reference_file, recording, constraints));
775 base::TimeDelta::FromSeconds(30)));
776 655
777 base::ScopedTempDir split_ref_files; 656 base::ScopedTempDir split_ref_files;
778 ASSERT_TRUE(split_ref_files.CreateUniqueTempDir()); 657 ASSERT_TRUE(split_ref_files.CreateUniqueTempDir());
779 ASSERT_NO_FATAL_FAILURE( 658 ASSERT_NO_FATAL_FAILURE(
780 SplitFileOnSilenceIntoDir(reference_file, split_ref_files.GetPath())); 659 SplitFileOnSilenceIntoDir(reference_file, split_ref_files.GetPath()));
781 std::vector<base::FilePath> ref_segments = 660 std::vector<base::FilePath> ref_segments =
782 ListWavFilesInDir(split_ref_files.GetPath()); 661 ListWavFilesInDir(split_ref_files.GetPath());
783 662
784 base::ScopedTempDir split_actual_files; 663 base::ScopedTempDir split_actual_files;
785 ASSERT_TRUE(split_actual_files.CreateUniqueTempDir()); 664 ASSERT_TRUE(split_actual_files.CreateUniqueTempDir());
(...skipping 20 matching lines...) Expand all
806 } 685 }
807 686
808 // Since the AGC is off here there should be no gain at all. 687 // Since the AGC is off here there should be no gain at all.
809 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcAudioQualityBrowserTest, 688 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcAudioQualityBrowserTest,
810 MANUAL_TestAutoGainIsOffWithAudioProcessingOff) { 689 MANUAL_TestAutoGainIsOffWithAudioProcessingOff) {
811 const char* kAudioCallWithoutAudioProcessing = 690 const char* kAudioCallWithoutAudioProcessing =
812 "{audio: { mandatory: { echoCancellation: false } } }"; 691 "{audio: { mandatory: { echoCancellation: false } } }";
813 ASSERT_NO_FATAL_FAILURE(TestAutoGainControl( 692 ASSERT_NO_FATAL_FAILURE(TestAutoGainControl(
814 kReferenceFile, kAudioCallWithoutAudioProcessing, "_no_agc")); 693 kReferenceFile, kAudioCallWithoutAudioProcessing, "_no_agc"));
815 } 694 }
OLDNEW
« no previous file with comments | « no previous file | chrome/test/data/webrtc/audio_extraction.js » ('j') | chrome/test/data/webrtc/audio_extraction.js » ('J')

Powered by Google App Engine
This is Rietveld 408576698