OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <vector> | 5 #include <vector> |
6 | 6 |
7 #include "base/environment.h" | 7 #include "base/environment.h" |
8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 int output_sample_rate = hardware_config->GetOutputSampleRate(); | 97 int output_sample_rate = hardware_config->GetOutputSampleRate(); |
98 if (!FindElementInArray(valid_output_rates, arraysize(valid_output_rates), | 98 if (!FindElementInArray(valid_output_rates, arraysize(valid_output_rates), |
99 output_sample_rate)) { | 99 output_sample_rate)) { |
100 LOG(WARNING) << "Non-supported output sample rate detected."; | 100 LOG(WARNING) << "Non-supported output sample rate detected."; |
101 return false; | 101 return false; |
102 } | 102 } |
103 | 103 |
104 return true; | 104 return true; |
105 } | 105 } |
106 | 106 |
107 // Utility method which creates and initializes the audio capturer and adds it | 107 // Utility method which creates the audio capturer, it returns a scoped |
108 // to WebRTC audio device. This method should be used in tests where | 108 // reference of the capturer if it is created successfully, otherwise it returns |
| 109 // NULL. This method should be used in tests where |
109 // HardwareSampleRatesAreValid() has been called and returned true. | 110 // HardwareSampleRatesAreValid() has been called and returned true. |
110 bool CreateAndInitializeCapturer(WebRtcAudioDeviceImpl* webrtc_audio_device) { | 111 scoped_refptr<WebRtcAudioCapturer> CreateAudioCapturer( |
111 DCHECK(webrtc_audio_device); | 112 WebRtcAudioDeviceImpl* webrtc_audio_device) { |
112 scoped_refptr<WebRtcAudioCapturer> capturer( | |
113 WebRtcAudioCapturer::CreateCapturer()); | |
114 | |
115 media::AudioHardwareConfig* hardware_config = | 113 media::AudioHardwareConfig* hardware_config = |
116 RenderThreadImpl::current()->GetAudioHardwareConfig(); | 114 RenderThreadImpl::current()->GetAudioHardwareConfig(); |
117 | |
118 // Use native capture sample rate and channel configuration to get some | 115 // Use native capture sample rate and channel configuration to get some |
119 // action in this test. | 116 // action in this test. |
120 int sample_rate = hardware_config->GetInputSampleRate(); | 117 int sample_rate = hardware_config->GetInputSampleRate(); |
121 media::ChannelLayout channel_layout = | 118 media::ChannelLayout channel_layout = |
122 hardware_config->GetInputChannelLayout(); | 119 hardware_config->GetInputChannelLayout(); |
123 blink::WebMediaConstraints constraints; | 120 blink::WebMediaConstraints constraints; |
124 if (!capturer->Initialize(kRenderViewId, channel_layout, sample_rate, 0, 1, | 121 StreamDeviceInfo device(MEDIA_DEVICE_AUDIO_CAPTURE, |
125 media::AudioManagerBase::kDefaultDeviceId, 0, 0, | 122 media::AudioManagerBase::kDefaultDeviceName, |
126 media::AudioParameters::NO_EFFECTS, constraints)) { | 123 media::AudioManagerBase::kDefaultDeviceId, |
127 return false; | 124 sample_rate, channel_layout, 0); |
128 } | 125 device.session_id = 1; |
129 | 126 return WebRtcAudioCapturer::CreateCapturer(kRenderViewId, device, |
130 // Add the capturer to the WebRtcAudioDeviceImpl. | 127 constraints, |
131 webrtc_audio_device->AddAudioCapturer(capturer); | 128 webrtc_audio_device); |
132 | |
133 return true; | |
134 } | 129 } |
135 | 130 |
136 // Create and start a local audio track. Starting the audio track will connect | 131 // Create and start a local audio track. Starting the audio track will connect |
137 // the audio track to the capturer and also start the source of the capturer. | 132 // the audio track to the capturer and also start the source of the capturer. |
138 // Also, connect the sink to the audio track. | 133 // Also, connect the sink to the audio track. |
139 scoped_refptr<WebRtcLocalAudioTrack> | 134 scoped_refptr<WebRtcLocalAudioTrack> |
140 CreateAndStartLocalAudioTrack(WebRtcAudioCapturer* capturer, | 135 CreateAndStartLocalAudioTrack(WebRtcAudioCapturer* capturer, |
141 PeerConnectionAudioSink* sink) { | 136 PeerConnectionAudioSink* sink) { |
142 scoped_refptr<WebRtcLocalAudioTrack> local_audio_track( | 137 scoped_refptr<WebRtcLocalAudioTrack> local_audio_track( |
143 WebRtcLocalAudioTrack::Create(std::string(), capturer, NULL, NULL)); | 138 WebRtcLocalAudioTrack::Create(std::string(), capturer, NULL, NULL)); |
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 SetAudioHardwareConfig(&audio_config); | 478 SetAudioHardwareConfig(&audio_config); |
484 | 479 |
485 scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device( | 480 scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device( |
486 new WebRtcAudioDeviceImpl()); | 481 new WebRtcAudioDeviceImpl()); |
487 | 482 |
488 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create()); | 483 WebRTCAutoDelete<webrtc::VoiceEngine> engine(webrtc::VoiceEngine::Create()); |
489 ASSERT_TRUE(engine.valid()); | 484 ASSERT_TRUE(engine.valid()); |
490 | 485 |
491 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get()); | 486 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get()); |
492 int err = base->Init(webrtc_audio_device.get()); | 487 int err = base->Init(webrtc_audio_device.get()); |
493 EXPECT_TRUE(CreateAndInitializeCapturer(webrtc_audio_device.get())); | 488 EXPECT_TRUE(CreateAudioCapturer(webrtc_audio_device) != NULL); |
494 EXPECT_EQ(0, err); | 489 EXPECT_EQ(0, err); |
495 EXPECT_EQ(0, base->Terminate()); | 490 EXPECT_EQ(0, base->Terminate()); |
496 } | 491 } |
497 | 492 |
498 // Verify that a call to webrtc::VoEBase::StartPlayout() starts audio output | 493 // Verify that a call to webrtc::VoEBase::StartPlayout() starts audio output |
499 // with the correct set of parameters. A WebRtcAudioDeviceImpl instance will | 494 // with the correct set of parameters. A WebRtcAudioDeviceImpl instance will |
500 // be utilized to implement the actual audio path. The test registers a | 495 // be utilized to implement the actual audio path. The test registers a |
501 // webrtc::VoEExternalMedia implementation to hijack the output audio and | 496 // webrtc::VoEExternalMedia implementation to hijack the output audio and |
502 // verify that streaming starts correctly. | 497 // verify that streaming starts correctly. |
503 // TODO(henrika): include on Android as well as soon as alla race conditions | 498 // TODO(henrika): include on Android as well as soon as alla race conditions |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
632 | 627 |
633 // We must add an external transport implementation to be able to start | 628 // We must add an external transport implementation to be able to start |
634 // recording without actually sending encoded packets to the network. All | 629 // recording without actually sending encoded packets to the network. All |
635 // we want to do here is to verify that audio capturing starts as it should. | 630 // we want to do here is to verify that audio capturing starts as it should. |
636 ScopedWebRTCPtr<webrtc::VoENetwork> network(engine.get()); | 631 ScopedWebRTCPtr<webrtc::VoENetwork> network(engine.get()); |
637 scoped_ptr<WebRTCTransportImpl> transport( | 632 scoped_ptr<WebRTCTransportImpl> transport( |
638 new WebRTCTransportImpl(network.get())); | 633 new WebRTCTransportImpl(network.get())); |
639 EXPECT_EQ(0, network->RegisterExternalTransport(ch, *transport.get())); | 634 EXPECT_EQ(0, network->RegisterExternalTransport(ch, *transport.get())); |
640 EXPECT_EQ(0, base->StartSend(ch)); | 635 EXPECT_EQ(0, base->StartSend(ch)); |
641 | 636 |
642 // Create and initialize the capturer which starts the source of the data | 637 // Create the capturer which starts the source of the data flow. |
643 // flow. | 638 scoped_refptr<WebRtcAudioCapturer> capturer( |
644 EXPECT_TRUE(CreateAndInitializeCapturer(webrtc_audio_device.get())); | 639 CreateAudioCapturer(webrtc_audio_device)); |
| 640 EXPECT_TRUE(capturer); |
645 | 641 |
646 // Create and start a local audio track which is bridging the data flow | 642 // Create and start a local audio track which is bridging the data flow |
647 // between the capturer and WebRtcAudioDeviceImpl. | 643 // between the capturer and WebRtcAudioDeviceImpl. |
648 scoped_refptr<WebRtcLocalAudioTrack> local_audio_track( | 644 scoped_refptr<WebRtcLocalAudioTrack> local_audio_track( |
649 CreateAndStartLocalAudioTrack(webrtc_audio_device->GetDefaultCapturer(), | 645 CreateAndStartLocalAudioTrack(capturer, webrtc_audio_device)); |
650 webrtc_audio_device)); | |
651 // connect the VoE voice channel to the audio track | 646 // connect the VoE voice channel to the audio track |
652 static_cast<webrtc::AudioTrackInterface*>(local_audio_track.get())-> | 647 static_cast<webrtc::AudioTrackInterface*>(local_audio_track.get())-> |
653 GetRenderer()->AddChannel(ch); | 648 GetRenderer()->AddChannel(ch); |
654 | 649 |
655 // Verify we get the data flow. | 650 // Verify we get the data flow. |
656 EXPECT_TRUE(event.TimedWait(TestTimeouts::action_timeout())); | 651 EXPECT_TRUE(event.TimedWait(TestTimeouts::action_timeout())); |
657 WaitForIOThreadCompletion(); | 652 WaitForIOThreadCompletion(); |
658 | 653 |
659 EXPECT_FALSE(webrtc_audio_device->Playing()); | 654 EXPECT_FALSE(webrtc_audio_device->Playing()); |
660 EXPECT_TRUE(webrtc_audio_device->Recording()); | 655 EXPECT_TRUE(webrtc_audio_device->Recording()); |
661 EXPECT_EQ(ch, media_process->channel_id()); | 656 EXPECT_EQ(ch, media_process->channel_id()); |
662 EXPECT_EQ(webrtc::kRecordingPerChannel, media_process->type()); | 657 EXPECT_EQ(webrtc::kRecordingPerChannel, media_process->type()); |
663 EXPECT_EQ(80, media_process->packet_size()); | 658 EXPECT_EQ(80, media_process->packet_size()); |
664 EXPECT_EQ(8000, media_process->sample_rate()); | 659 EXPECT_EQ(8000, media_process->sample_rate()); |
665 | 660 |
666 EXPECT_EQ(0, external_media->DeRegisterExternalMediaProcessing( | 661 EXPECT_EQ(0, external_media->DeRegisterExternalMediaProcessing( |
667 ch, webrtc::kRecordingPerChannel)); | 662 ch, webrtc::kRecordingPerChannel)); |
668 EXPECT_EQ(0, base->StopSend(ch)); | 663 EXPECT_EQ(0, base->StopSend(ch)); |
669 | 664 |
670 webrtc_audio_device->GetDefaultCapturer()->Stop(); | 665 capturer->Stop(); |
671 EXPECT_EQ(0, base->DeleteChannel(ch)); | 666 EXPECT_EQ(0, base->DeleteChannel(ch)); |
672 EXPECT_EQ(0, base->Terminate()); | 667 EXPECT_EQ(0, base->Terminate()); |
673 } | 668 } |
674 | 669 |
675 // Uses WebRtcAudioDeviceImpl to play a local wave file. | 670 // Uses WebRtcAudioDeviceImpl to play a local wave file. |
676 // TODO(henrika): include on Android as well as soon as alla race conditions | 671 // TODO(henrika): include on Android as well as soon as alla race conditions |
677 // in OpenSLES are resolved. | 672 // in OpenSLES are resolved. |
678 #if defined(OS_ANDROID) | 673 #if defined(OS_ANDROID) |
679 #define MAYBE_PlayLocalFile DISABLED_PlayLocalFile | 674 #define MAYBE_PlayLocalFile DISABLED_PlayLocalFile |
680 #else | 675 #else |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
789 bool enabled = false; | 784 bool enabled = false; |
790 webrtc::AgcModes agc_mode = webrtc::kAgcDefault; | 785 webrtc::AgcModes agc_mode = webrtc::kAgcDefault; |
791 EXPECT_EQ(0, audio_processing->GetAgcStatus(enabled, agc_mode)); | 786 EXPECT_EQ(0, audio_processing->GetAgcStatus(enabled, agc_mode)); |
792 EXPECT_TRUE(enabled); | 787 EXPECT_TRUE(enabled); |
793 EXPECT_EQ(agc_mode, webrtc::kAgcAdaptiveAnalog); | 788 EXPECT_EQ(agc_mode, webrtc::kAgcAdaptiveAnalog); |
794 #endif | 789 #endif |
795 | 790 |
796 int ch = base->CreateChannel(); | 791 int ch = base->CreateChannel(); |
797 EXPECT_NE(-1, ch); | 792 EXPECT_NE(-1, ch); |
798 | 793 |
799 EXPECT_TRUE(CreateAndInitializeCapturer(webrtc_audio_device.get())); | 794 scoped_refptr<WebRtcAudioCapturer> capturer( |
| 795 CreateAudioCapturer(webrtc_audio_device)); |
| 796 EXPECT_TRUE(capturer); |
800 scoped_refptr<WebRtcLocalAudioTrack> local_audio_track( | 797 scoped_refptr<WebRtcLocalAudioTrack> local_audio_track( |
801 CreateAndStartLocalAudioTrack(webrtc_audio_device->GetDefaultCapturer(), | 798 CreateAndStartLocalAudioTrack(capturer, webrtc_audio_device)); |
802 webrtc_audio_device)); | |
803 // connect the VoE voice channel to the audio track | 799 // connect the VoE voice channel to the audio track |
804 static_cast<webrtc::AudioTrackInterface*>(local_audio_track.get())-> | 800 static_cast<webrtc::AudioTrackInterface*>(local_audio_track.get())-> |
805 GetRenderer()->AddChannel(ch); | 801 GetRenderer()->AddChannel(ch); |
806 | 802 |
807 ScopedWebRTCPtr<webrtc::VoENetwork> network(engine.get()); | 803 ScopedWebRTCPtr<webrtc::VoENetwork> network(engine.get()); |
808 ASSERT_TRUE(network.valid()); | 804 ASSERT_TRUE(network.valid()); |
809 scoped_ptr<WebRTCTransportImpl> transport( | 805 scoped_ptr<WebRTCTransportImpl> transport( |
810 new WebRTCTransportImpl(network.get())); | 806 new WebRTCTransportImpl(network.get())); |
811 EXPECT_EQ(0, network->RegisterExternalTransport(ch, *transport.get())); | 807 EXPECT_EQ(0, network->RegisterExternalTransport(ch, *transport.get())); |
812 EXPECT_EQ(0, base->StartPlayout(ch)); | 808 EXPECT_EQ(0, base->StartPlayout(ch)); |
813 EXPECT_EQ(0, base->StartSend(ch)); | 809 EXPECT_EQ(0, base->StartSend(ch)); |
814 scoped_refptr<WebRtcAudioRenderer> renderer( | 810 scoped_refptr<WebRtcAudioRenderer> renderer( |
815 CreateDefaultWebRtcAudioRenderer(kRenderViewId)); | 811 CreateDefaultWebRtcAudioRenderer(kRenderViewId)); |
816 scoped_refptr<MediaStreamAudioRenderer> proxy( | 812 scoped_refptr<MediaStreamAudioRenderer> proxy( |
817 renderer->CreateSharedAudioRendererProxy()); | 813 renderer->CreateSharedAudioRendererProxy()); |
818 EXPECT_TRUE(webrtc_audio_device->SetAudioRenderer(renderer.get())); | 814 EXPECT_TRUE(webrtc_audio_device->SetAudioRenderer(renderer.get())); |
819 proxy->Start(); | 815 proxy->Start(); |
820 proxy->Play(); | 816 proxy->Play(); |
821 | 817 |
822 VLOG(0) << ">> You should now be able to hear yourself in loopback..."; | 818 VLOG(0) << ">> You should now be able to hear yourself in loopback..."; |
823 message_loop_.PostDelayedTask(FROM_HERE, | 819 message_loop_.PostDelayedTask(FROM_HERE, |
824 base::MessageLoop::QuitClosure(), | 820 base::MessageLoop::QuitClosure(), |
825 base::TimeDelta::FromSeconds(2)); | 821 base::TimeDelta::FromSeconds(2)); |
826 message_loop_.Run(); | 822 message_loop_.Run(); |
827 | 823 |
828 webrtc_audio_device->GetDefaultCapturer()->Stop(); | 824 capturer->Stop(); |
829 proxy->Stop(); | 825 proxy->Stop(); |
830 EXPECT_EQ(0, base->StopSend(ch)); | 826 EXPECT_EQ(0, base->StopSend(ch)); |
831 EXPECT_EQ(0, base->StopPlayout(ch)); | 827 EXPECT_EQ(0, base->StopPlayout(ch)); |
832 | 828 |
833 EXPECT_EQ(0, base->DeleteChannel(ch)); | 829 EXPECT_EQ(0, base->DeleteChannel(ch)); |
834 EXPECT_EQ(0, base->Terminate()); | 830 EXPECT_EQ(0, base->Terminate()); |
835 } | 831 } |
836 | 832 |
837 // Test times out on bots, see http://crbug.com/247447 | 833 // Test times out on bots, see http://crbug.com/247447 |
838 TEST_F(MAYBE_WebRTCAudioDeviceTest, DISABLED_WebRtcRecordingSetupTime) { | 834 TEST_F(MAYBE_WebRTCAudioDeviceTest, DISABLED_WebRtcRecordingSetupTime) { |
(...skipping 16 matching lines...) Expand all Loading... |
855 ASSERT_TRUE(engine.valid()); | 851 ASSERT_TRUE(engine.valid()); |
856 | 852 |
857 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get()); | 853 ScopedWebRTCPtr<webrtc::VoEBase> base(engine.get()); |
858 ASSERT_TRUE(base.valid()); | 854 ASSERT_TRUE(base.valid()); |
859 int err = base->Init(webrtc_audio_device.get()); | 855 int err = base->Init(webrtc_audio_device.get()); |
860 ASSERT_EQ(0, err); | 856 ASSERT_EQ(0, err); |
861 | 857 |
862 int ch = base->CreateChannel(); | 858 int ch = base->CreateChannel(); |
863 EXPECT_NE(-1, ch); | 859 EXPECT_NE(-1, ch); |
864 | 860 |
865 EXPECT_TRUE(CreateAndInitializeCapturer(webrtc_audio_device.get())); | 861 scoped_refptr<WebRtcAudioCapturer> capturer( |
| 862 CreateAudioCapturer(webrtc_audio_device)); |
| 863 EXPECT_TRUE(capturer); |
866 base::WaitableEvent event(false, false); | 864 base::WaitableEvent event(false, false); |
867 scoped_ptr<MockMediaStreamAudioSink> sink( | 865 scoped_ptr<MockMediaStreamAudioSink> sink( |
868 new MockMediaStreamAudioSink(&event)); | 866 new MockMediaStreamAudioSink(&event)); |
869 | 867 |
870 // Create and start a local audio track. Starting the audio track will connect | 868 // Create and start a local audio track. Starting the audio track will connect |
871 // the audio track to the capturer and also start the source of the capturer. | 869 // the audio track to the capturer and also start the source of the capturer. |
872 scoped_refptr<WebRtcLocalAudioTrack> local_audio_track( | 870 scoped_refptr<WebRtcLocalAudioTrack> local_audio_track( |
873 CreateAndStartLocalAudioTrack( | 871 CreateAndStartLocalAudioTrack(capturer, sink.get())); |
874 webrtc_audio_device->GetDefaultCapturer().get(), sink.get())); | |
875 | 872 |
876 // connect the VoE voice channel to the audio track. | 873 // connect the VoE voice channel to the audio track. |
877 static_cast<webrtc::AudioTrackInterface*>(local_audio_track.get())-> | 874 static_cast<webrtc::AudioTrackInterface*>(local_audio_track.get())-> |
878 GetRenderer()->AddChannel(ch); | 875 GetRenderer()->AddChannel(ch); |
879 | 876 |
880 base::Time start_time = base::Time::Now(); | 877 base::Time start_time = base::Time::Now(); |
881 EXPECT_EQ(0, base->StartSend(ch)); | 878 EXPECT_EQ(0, base->StartSend(ch)); |
882 | 879 |
883 EXPECT_TRUE(event.TimedWait(TestTimeouts::action_timeout())); | 880 EXPECT_TRUE(event.TimedWait(TestTimeouts::action_timeout())); |
884 int delay = (base::Time::Now() - start_time).InMilliseconds(); | 881 int delay = (base::Time::Now() - start_time).InMilliseconds(); |
885 PrintPerfResultMs("webrtc_recording_setup_c", "t", delay); | 882 PrintPerfResultMs("webrtc_recording_setup_c", "t", delay); |
886 | 883 |
887 webrtc_audio_device->GetDefaultCapturer()->Stop(); | 884 capturer->Stop(); |
888 EXPECT_EQ(0, base->StopSend(ch)); | 885 EXPECT_EQ(0, base->StopSend(ch)); |
889 EXPECT_EQ(0, base->DeleteChannel(ch)); | 886 EXPECT_EQ(0, base->DeleteChannel(ch)); |
890 EXPECT_EQ(0, base->Terminate()); | 887 EXPECT_EQ(0, base->Terminate()); |
891 } | 888 } |
892 | 889 |
893 | 890 |
894 // TODO(henrika): include on Android as well as soon as alla race conditions | 891 // TODO(henrika): include on Android as well as soon as alla race conditions |
895 // in OpenSLES are resolved. | 892 // in OpenSLES are resolved. |
896 #if defined(OS_ANDROID) | 893 #if defined(OS_ANDROID) |
897 #define MAYBE_WebRtcPlayoutSetupTime DISABLED_WebRtcPlayoutSetupTime | 894 #define MAYBE_WebRtcPlayoutSetupTime DISABLED_WebRtcPlayoutSetupTime |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
972 LOG(WARNING) << "Test disabled due to the test hangs on WinXP."; | 969 LOG(WARNING) << "Test disabled due to the test hangs on WinXP."; |
973 return; | 970 return; |
974 } | 971 } |
975 #endif | 972 #endif |
976 int latency = RunWebRtcLoopbackTimeTest(audio_manager_.get(), true); | 973 int latency = RunWebRtcLoopbackTimeTest(audio_manager_.get(), true); |
977 PrintPerfResultMs("webrtc_loopback_with_signal_processing (100 packets)", | 974 PrintPerfResultMs("webrtc_loopback_with_signal_processing (100 packets)", |
978 "t", latency); | 975 "t", latency); |
979 } | 976 } |
980 | 977 |
981 } // namespace content | 978 } // namespace content |
OLD | NEW |