| OLD | NEW | 
|---|
| 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 <ctime> | 5 #include <ctime> | 
| 6 | 6 | 
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" | 
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" | 
| 9 #include "base/path_service.h" | 9 #include "base/path_service.h" | 
| 10 #include "base/process/launch.h" | 10 #include "base/process/launch.h" | 
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 80 // 5. Launch chrome and try playing a video with sound. You should see | 80 // 5. Launch chrome and try playing a video with sound. You should see | 
| 81 //    in the volume meter for the mix device. Configure the mix device to have | 81 //    in the volume meter for the mix device. Configure the mix device to have | 
| 82 //    50 / 100 in level. Also go into the playback tab, right-click Speakers, | 82 //    50 / 100 in level. Also go into the playback tab, right-click Speakers, | 
| 83 //    and set that level to 50 / 100. Otherwise you will get distortion in | 83 //    and set that level to 50 / 100. Otherwise you will get distortion in | 
| 84 //    the recording. | 84 //    the recording. | 
| 85 class WebRtcAudioQualityBrowserTest : public WebRtcTestBase, | 85 class WebRtcAudioQualityBrowserTest : public WebRtcTestBase, | 
| 86                                       public testing::WithParamInterface<bool> { | 86                                       public testing::WithParamInterface<bool> { | 
| 87  public: | 87  public: | 
| 88   WebRtcAudioQualityBrowserTest() {} | 88   WebRtcAudioQualityBrowserTest() {} | 
| 89   virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { | 89   virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { | 
| 90     test::PeerConnectionServerRunner::KillAllPeerConnectionServers(); |  | 
| 91     DetectErrorsInJavaScript();  // Look for errors in our rather complex js. | 90     DetectErrorsInJavaScript();  // Look for errors in our rather complex js. | 
| 92   } | 91   } | 
| 93 | 92 | 
| 94   virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { | 93   virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { | 
| 95     // This test expects real device handling and requires a real webcam / audio | 94     // This test expects real device handling and requires a real webcam / audio | 
| 96     // device; it will not work with fake devices. | 95     // device; it will not work with fake devices. | 
| 97     EXPECT_FALSE(command_line->HasSwitch( | 96     EXPECT_FALSE(command_line->HasSwitch( | 
| 98         switches::kUseFakeDeviceForMediaStream)); | 97         switches::kUseFakeDeviceForMediaStream)); | 
| 99     EXPECT_FALSE(command_line->HasSwitch( | 98     EXPECT_FALSE(command_line->HasSwitch( | 
| 100         switches::kUseFakeUIForMediaStream)); | 99         switches::kUseFakeUIForMediaStream)); | 
| 101 | 100 | 
| 102     bool enable_audio_track_processing = GetParam(); | 101     bool enable_audio_track_processing = GetParam(); | 
| 103     if (enable_audio_track_processing) | 102     if (enable_audio_track_processing) | 
| 104       command_line->AppendSwitch(switches::kEnableAudioTrackProcessing); | 103       command_line->AppendSwitch(switches::kEnableAudioTrackProcessing); | 
| 105   } | 104   } | 
| 106 | 105 | 
| 107   void AddAudioFile(const std::string& input_file_relative_url, | 106   void AddAudioFile(const std::string& input_file_relative_url, | 
| 108                     content::WebContents* tab_contents) { | 107                     content::WebContents* tab_contents) { | 
| 109     EXPECT_EQ("ok-added", ExecuteJavascript( | 108     EXPECT_EQ("ok-added", ExecuteJavascript( | 
| 110         "addAudioFile('" + input_file_relative_url + "')", tab_contents)); | 109         "addAudioFile('" + input_file_relative_url + "')", tab_contents)); | 
| 111   } | 110   } | 
| 112 | 111 | 
| 113   void PlayAudioFile(content::WebContents* tab_contents) { | 112   void PlayAudioFile(content::WebContents* tab_contents) { | 
| 114     EXPECT_EQ("ok-playing", ExecuteJavascript("playAudioFile()", tab_contents)); | 113     EXPECT_EQ("ok-playing", ExecuteJavascript("playAudioFile()", tab_contents)); | 
| 115   } | 114   } | 
| 116 | 115 | 
| 117   void EstablishCall(content::WebContents* from_tab, |  | 
| 118                      content::WebContents* to_tab) { |  | 
| 119     EXPECT_EQ("ok-negotiating", |  | 
| 120               ExecuteJavascript("negotiateCall()", from_tab)); |  | 
| 121 |  | 
| 122     // Ensure the call gets up on both sides. |  | 
| 123     EXPECT_TRUE(test::PollingWaitUntil("getPeerConnectionReadyState()", |  | 
| 124                                        "active", from_tab)); |  | 
| 125     EXPECT_TRUE(test::PollingWaitUntil("getPeerConnectionReadyState()", |  | 
| 126                                        "active", to_tab)); |  | 
| 127   } |  | 
| 128 |  | 
| 129   base::FilePath CreateTemporaryWaveFile() { | 116   base::FilePath CreateTemporaryWaveFile() { | 
| 130     base::FilePath filename; | 117     base::FilePath filename; | 
| 131     EXPECT_TRUE(base::CreateTemporaryFile(&filename)); | 118     EXPECT_TRUE(base::CreateTemporaryFile(&filename)); | 
| 132     base::FilePath wav_filename = | 119     base::FilePath wav_filename = | 
| 133         filename.AddExtension(FILE_PATH_LITERAL(".wav")); | 120         filename.AddExtension(FILE_PATH_LITERAL(".wav")); | 
| 134     EXPECT_TRUE(base::Move(filename, wav_filename)); | 121     EXPECT_TRUE(base::Move(filename, wav_filename)); | 
| 135     return wav_filename; | 122     return wav_filename; | 
| 136   } | 123   } | 
| 137 |  | 
| 138   test::PeerConnectionServerRunner peerconnection_server_; |  | 
| 139 }; | 124 }; | 
| 140 | 125 | 
| 141 class AudioRecorder { | 126 class AudioRecorder { | 
| 142  public: | 127  public: | 
| 143   AudioRecorder(): recording_application_(base::kNullProcessHandle) {} | 128   AudioRecorder(): recording_application_(base::kNullProcessHandle) {} | 
| 144   ~AudioRecorder() {} | 129   ~AudioRecorder() {} | 
| 145 | 130 | 
| 146   // Starts the recording program for the specified duration. Returns true | 131   // Starts the recording program for the specified duration. Returns true | 
| 147   // on success. | 132   // on success. | 
| 148   bool StartRecording(int duration_sec, const base::FilePath& output_file, | 133   bool StartRecording(int duration_sec, const base::FilePath& output_file, | 
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 366                        MAYBE_MANUAL_TestAudioQuality) { | 351                        MAYBE_MANUAL_TestAudioQuality) { | 
| 367 #if defined(OS_WIN) | 352 #if defined(OS_WIN) | 
| 368   if (base::win::GetVersion() < base::win::VERSION_VISTA) { | 353   if (base::win::GetVersion() < base::win::VERSION_VISTA) { | 
| 369     // It would take work to implement this on XP; not prioritized right now. | 354     // It would take work to implement this on XP; not prioritized right now. | 
| 370     LOG(ERROR) << "This test is not implemented for Windows XP."; | 355     LOG(ERROR) << "This test is not implemented for Windows XP."; | 
| 371     return; | 356     return; | 
| 372   } | 357   } | 
| 373 #endif | 358 #endif | 
| 374   ASSERT_TRUE(test::HasReferenceFilesInCheckout()); | 359   ASSERT_TRUE(test::HasReferenceFilesInCheckout()); | 
| 375   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | 360   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | 
| 376   ASSERT_TRUE(peerconnection_server_.Start()); |  | 
| 377 | 361 | 
| 378   ASSERT_TRUE(ForceMicrophoneVolumeTo100Percent()); | 362   ASSERT_TRUE(ForceMicrophoneVolumeTo100Percent()); | 
| 379 | 363 | 
| 380   ui_test_utils::NavigateToURL( | 364   ui_test_utils::NavigateToURL( | 
| 381       browser(), embedded_test_server()->GetURL(kMainWebrtcTestHtmlPage)); | 365       browser(), embedded_test_server()->GetURL(kMainWebrtcTestHtmlPage)); | 
| 382   content::WebContents* left_tab = | 366   content::WebContents* left_tab = | 
| 383       browser()->tab_strip_model()->GetActiveWebContents(); | 367       browser()->tab_strip_model()->GetActiveWebContents(); | 
| 384 | 368 | 
| 385   chrome::AddTabAt(browser(), GURL(), -1, true); | 369   chrome::AddTabAt(browser(), GURL(), -1, true); | 
| 386   content::WebContents* right_tab = | 370   content::WebContents* right_tab = | 
| 387       browser()->tab_strip_model()->GetActiveWebContents(); | 371       browser()->tab_strip_model()->GetActiveWebContents(); | 
| 388   ui_test_utils::NavigateToURL( | 372   ui_test_utils::NavigateToURL( | 
| 389       browser(), embedded_test_server()->GetURL(kMainWebrtcTestHtmlPage)); | 373       browser(), embedded_test_server()->GetURL(kMainWebrtcTestHtmlPage)); | 
| 390 | 374 | 
| 391   ConnectToPeerConnectionServer("peer 1", left_tab); | 375   // Prepare the peer connections manually in this test since we don't add | 
| 392   ConnectToPeerConnectionServer("peer 2", right_tab); | 376   // getUserMedia-derived media streams in this test like the other tests. | 
| 393 |  | 
| 394   EXPECT_EQ("ok-peerconnection-created", | 377   EXPECT_EQ("ok-peerconnection-created", | 
| 395             ExecuteJavascript("preparePeerConnection()", left_tab)); | 378             ExecuteJavascript("preparePeerConnection()", left_tab)); | 
|  | 379   EXPECT_EQ("ok-peerconnection-created", | 
|  | 380             ExecuteJavascript("preparePeerConnection()", right_tab)); | 
| 396 | 381 | 
| 397   AddAudioFile(kReferenceFileRelativeUrl, left_tab); | 382   AddAudioFile(kReferenceFileRelativeUrl, left_tab); | 
| 398 | 383 | 
| 399   EstablishCall(left_tab, right_tab); | 384   NegotiateCall(left_tab, right_tab); | 
| 400 | 385 | 
| 401   // Note: the media flow isn't necessarily established on the connection just | 386   // Note: the media flow isn't necessarily established on the connection just | 
| 402   // because the ready state is ok on both sides. We sleep a bit between call | 387   // because the ready state is ok on both sides. We sleep a bit between call | 
| 403   // establishment and playing to avoid cutting of the beginning of the audio | 388   // establishment and playing to avoid cutting of the beginning of the audio | 
| 404   // file. | 389   // file. | 
| 405   test::SleepInJavascript(left_tab, 2000); | 390   test::SleepInJavascript(left_tab, 2000); | 
| 406 | 391 | 
| 407   base::FilePath recording = CreateTemporaryWaveFile(); | 392   base::FilePath recording = CreateTemporaryWaveFile(); | 
| 408 | 393 | 
| 409   // Note: the sound clip is about 10 seconds: record for 15 seconds to get some | 394   // Note: the sound clip is about 10 seconds: record for 15 seconds to get some | 
| 410   // safety margins on each side. | 395   // safety margins on each side. | 
| 411   AudioRecorder recorder; | 396   AudioRecorder recorder; | 
| 412   static int kRecordingTimeSeconds = 15; | 397   static int kRecordingTimeSeconds = 15; | 
| 413   ASSERT_TRUE(recorder.StartRecording(kRecordingTimeSeconds, recording, true)); | 398   ASSERT_TRUE(recorder.StartRecording(kRecordingTimeSeconds, recording, true)); | 
| 414 | 399 | 
| 415   PlayAudioFile(left_tab); | 400   PlayAudioFile(left_tab); | 
| 416 | 401 | 
| 417   ASSERT_TRUE(recorder.WaitForRecordingToEnd()); | 402   ASSERT_TRUE(recorder.WaitForRecordingToEnd()); | 
| 418   VLOG(0) << "Done recording to " << recording.value() << std::endl; | 403   VLOG(0) << "Done recording to " << recording.value() << std::endl; | 
| 419 | 404 | 
| 420   HangUp(left_tab); | 405   HangUp(left_tab); | 
| 421   WaitUntilHangupVerified(left_tab); |  | 
| 422   WaitUntilHangupVerified(right_tab); |  | 
| 423 | 406 | 
| 424   base::FilePath trimmed_recording = CreateTemporaryWaveFile(); | 407   base::FilePath trimmed_recording = CreateTemporaryWaveFile(); | 
| 425 | 408 | 
| 426   ASSERT_TRUE(RemoveSilence(recording, trimmed_recording)); | 409   ASSERT_TRUE(RemoveSilence(recording, trimmed_recording)); | 
| 427   VLOG(0) << "Trimmed silence: " << trimmed_recording.value() << std::endl; | 410   VLOG(0) << "Trimmed silence: " << trimmed_recording.value() << std::endl; | 
| 428 | 411 | 
| 429   std::string raw_mos; | 412   std::string raw_mos; | 
| 430   std::string mos_lqo; | 413   std::string mos_lqo; | 
| 431   base::FilePath reference_file_in_test_dir = | 414   base::FilePath reference_file_in_test_dir = | 
| 432       test::GetReferenceFilesDir().Append(kReferenceFile); | 415       test::GetReferenceFilesDir().Append(kReferenceFile); | 
| 433   ASSERT_TRUE(RunPesq(reference_file_in_test_dir, trimmed_recording, 16000, | 416   ASSERT_TRUE(RunPesq(reference_file_in_test_dir, trimmed_recording, 16000, | 
| 434                       &raw_mos, &mos_lqo)); | 417                       &raw_mos, &mos_lqo)); | 
| 435 | 418 | 
| 436   perf_test::PrintResult("audio_pesq", "", "raw_mos", raw_mos, "score", true); | 419   perf_test::PrintResult("audio_pesq", "", "raw_mos", raw_mos, "score", true); | 
| 437   perf_test::PrintResult("audio_pesq", "", "mos_lqo", mos_lqo, "score", true); | 420   perf_test::PrintResult("audio_pesq", "", "mos_lqo", mos_lqo, "score", true); | 
| 438 | 421 | 
| 439   EXPECT_TRUE(base::DeleteFile(recording, false)); | 422   EXPECT_TRUE(base::DeleteFile(recording, false)); | 
| 440   EXPECT_TRUE(base::DeleteFile(trimmed_recording, false)); | 423   EXPECT_TRUE(base::DeleteFile(trimmed_recording, false)); | 
| 441 |  | 
| 442   ASSERT_TRUE(peerconnection_server_.Stop()); |  | 
| 443 } | 424 } | 
| OLD | NEW | 
|---|