1 /*
2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "webrtc/base/arraysize.h"
12 #include "webrtc/modules/include/module_common_types.h"
13 #include "webrtc/voice_engine/include/voe_external_media.h"
14 #include "webrtc/voice_engine/test/auto_test/fakes/fake_media_process.h"
15 #include "webrtc/voice_engine/test/auto_test/fixtures/after_streaming_fixture.h"
16 
17 class ExternalMediaTest : public AfterStreamingFixture {
18  protected:
TestRegisterExternalMedia(int channel,webrtc::ProcessingTypes type)19   void TestRegisterExternalMedia(int channel, webrtc::ProcessingTypes type) {
20     FakeMediaProcess fake_media_process;
21     EXPECT_EQ(0, voe_xmedia_->RegisterExternalMediaProcessing(
22         channel, type, fake_media_process));
23     Sleep(2000);
24 
25     TEST_LOG("Back to normal.\n");
26     EXPECT_EQ(0, voe_xmedia_->DeRegisterExternalMediaProcessing(
27         channel, type));
28     Sleep(2000);
29   }
30 };
31 
TEST_F(ExternalMediaTest,ManualRegisterExternalMediaProcessingOnAllChannelsAffectsPlayout)32 TEST_F(ExternalMediaTest,
33     ManualRegisterExternalMediaProcessingOnAllChannelsAffectsPlayout) {
34   TEST_LOG("Enabling external media processing: audio should be affected.\n");
35   TestRegisterExternalMedia(-1, webrtc::kPlaybackAllChannelsMixed);
36 }
37 
TEST_F(ExternalMediaTest,ManualRegisterExternalMediaOnSingleChannelAffectsPlayout)38 TEST_F(ExternalMediaTest,
39     ManualRegisterExternalMediaOnSingleChannelAffectsPlayout) {
40   TEST_LOG("Enabling external media processing: audio should be affected.\n");
41   TestRegisterExternalMedia(channel_, webrtc::kRecordingPerChannel);
42 }
43 
TEST_F(ExternalMediaTest,ManualRegisterExternalMediaOnAllChannelsMixedAffectsRecording)44 TEST_F(ExternalMediaTest,
45     ManualRegisterExternalMediaOnAllChannelsMixedAffectsRecording) {
46   SwitchToManualMicrophone();
47   TEST_LOG("Speak and verify your voice is distorted.\n");
48   TestRegisterExternalMedia(-1, webrtc::kRecordingAllChannelsMixed);
49 }
50 
TEST_F(ExternalMediaTest,ExternalMixingCannotBeChangedDuringPlayback)51 TEST_F(ExternalMediaTest,
52        ExternalMixingCannotBeChangedDuringPlayback) {
53   EXPECT_EQ(-1, voe_xmedia_->SetExternalMixing(channel_, true));
54   EXPECT_EQ(-1, voe_xmedia_->SetExternalMixing(channel_, false));
55 }
56 
TEST_F(ExternalMediaTest,ExternalMixingIsRequiredForGetAudioFrame)57 TEST_F(ExternalMediaTest,
58        ExternalMixingIsRequiredForGetAudioFrame) {
59   webrtc::AudioFrame frame;
60   EXPECT_EQ(-1, voe_xmedia_->GetAudioFrame(channel_, 0, &frame));
61 }
62 
TEST_F(ExternalMediaTest,ExternalMixingPreventsAndRestoresRegularPlayback)63 TEST_F(ExternalMediaTest,
64        ExternalMixingPreventsAndRestoresRegularPlayback) {
65   PausePlaying();
66   ASSERT_EQ(0, voe_xmedia_->SetExternalMixing(channel_, true));
67   TEST_LOG("Verify that no sound is played out.\n");
68   ResumePlaying();
69   Sleep(1000);
70   PausePlaying();
71   ASSERT_EQ(0, voe_xmedia_->SetExternalMixing(channel_, false));
72   ResumePlaying();
73   TEST_LOG("Verify that sound is played out.\n");
74   ResumePlaying();
75   Sleep(1000);
76 }
77 
TEST_F(ExternalMediaTest,ExternalMixingWorks)78 TEST_F(ExternalMediaTest,
79        ExternalMixingWorks) {
80   webrtc::AudioFrame frame;
81   PausePlaying();
82   EXPECT_EQ(0, voe_xmedia_->SetExternalMixing(channel_, true));
83   ResumePlaying();
84   EXPECT_EQ(0, voe_xmedia_->GetAudioFrame(channel_, 0, &frame));
85   EXPECT_GT(frame.sample_rate_hz_, 0);
86   EXPECT_GT(frame.samples_per_channel_, 0U);
87   PausePlaying();
88   EXPECT_EQ(0, voe_xmedia_->SetExternalMixing(channel_, false));
89   ResumePlaying();
90 }
91 
TEST_F(ExternalMediaTest,ExternalMixingResamplesToDesiredFrequency)92 TEST_F(ExternalMediaTest,
93        ExternalMixingResamplesToDesiredFrequency) {
94   const int kValidFrequencies[] = {8000, 16000, 22000, 32000, 48000};
95   webrtc::AudioFrame frame;
96   PausePlaying();
97   EXPECT_EQ(0, voe_xmedia_->SetExternalMixing(channel_, true));
98   ResumePlaying();
99   for (size_t i = 0; i < arraysize(kValidFrequencies); i++) {
100     int f = kValidFrequencies[i];
101     EXPECT_EQ(0, voe_xmedia_->GetAudioFrame(channel_, f, &frame))
102        << "Resampling succeeds for freq=" << f;
103     EXPECT_EQ(f, frame.sample_rate_hz_);
104     EXPECT_EQ(static_cast<size_t>(f / 100), frame.samples_per_channel_);
105   }
106   PausePlaying();
107   EXPECT_EQ(0, voe_xmedia_->SetExternalMixing(channel_, false));
108   ResumePlaying();
109 }
110 
TEST_F(ExternalMediaTest,ExternalMixingResamplingToInvalidFrequenciesFails)111 TEST_F(ExternalMediaTest,
112        ExternalMixingResamplingToInvalidFrequenciesFails) {
113   const int kInvalidFrequencies[] = {-8000, -1};
114   webrtc::AudioFrame frame;
115   PausePlaying();
116   EXPECT_EQ(0, voe_xmedia_->SetExternalMixing(channel_, true));
117   ResumePlaying();
118   for (size_t i = 0; i < arraysize(kInvalidFrequencies); i++) {
119     int f = kInvalidFrequencies[i];
120     EXPECT_EQ(-1, voe_xmedia_->GetAudioFrame(channel_, f, &frame))
121         << "Resampling fails for freq=" << f;
122   }
123   PausePlaying();
124   EXPECT_EQ(0, voe_xmedia_->SetExternalMixing(channel_, false));
125   ResumePlaying();
126 }
127