Home | History | Annotate | Download | only in audio
      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 // Sets up a simple VoiceEngine loopback call with the default audio devices
     12 // and runs forever. Some parameters can be configured through command-line
     13 // flags.
     14 
     15 #include "gflags/gflags.h"
     16 #include "gtest/gtest.h"
     17 
     18 #include "webrtc/system_wrappers/interface/scoped_ptr.h"
     19 #include "webrtc/test/channel_transport/include/channel_transport.h"
     20 #include "webrtc/voice_engine/include/voe_audio_processing.h"
     21 #include "webrtc/voice_engine/include/voe_base.h"
     22 #include "webrtc/voice_engine/include/voe_codec.h"
     23 #include "webrtc/voice_engine/include/voe_hardware.h"
     24 #include "webrtc/voice_engine/include/voe_network.h"
     25 
     26 DEFINE_string(render, "render", "render device name");
     27 DEFINE_string(codec, "ISAC", "codec name");
     28 DEFINE_int32(rate, 16000, "codec sample rate in Hz");
     29 
     30 namespace webrtc {
     31 namespace test {
     32 
     33 void RunHarness() {
     34   VoiceEngine* voe = VoiceEngine::Create();
     35   ASSERT_TRUE(voe != NULL);
     36   VoEAudioProcessing* audio = VoEAudioProcessing::GetInterface(voe);
     37   ASSERT_TRUE(audio != NULL);
     38   VoEBase* base = VoEBase::GetInterface(voe);
     39   ASSERT_TRUE(base != NULL);
     40   VoECodec* codec = VoECodec::GetInterface(voe);
     41   ASSERT_TRUE(codec != NULL);
     42   VoEHardware* hardware = VoEHardware::GetInterface(voe);
     43   ASSERT_TRUE(hardware != NULL);
     44   VoENetwork* network = VoENetwork::GetInterface(voe);
     45   ASSERT_TRUE(network != NULL);
     46 
     47   ASSERT_EQ(0, base->Init());
     48   int channel = base->CreateChannel();
     49   ASSERT_NE(-1, channel);
     50 
     51   scoped_ptr<VoiceChannelTransport> voice_channel_transport(
     52       new VoiceChannelTransport(network, channel));
     53 
     54   ASSERT_EQ(0, voice_channel_transport->SetSendDestination("127.0.0.1", 1234));
     55   ASSERT_EQ(0, voice_channel_transport->SetLocalReceiver(1234));
     56 
     57   CodecInst codec_params = {0};
     58   bool codec_found = false;
     59   for (int i = 0; i < codec->NumOfCodecs(); i++) {
     60     ASSERT_EQ(0, codec->GetCodec(i, codec_params));
     61     if (FLAGS_codec.compare(codec_params.plname) == 0 &&
     62         FLAGS_rate == codec_params.plfreq) {
     63       codec_found = true;
     64       break;
     65     }
     66   }
     67   ASSERT_TRUE(codec_found);
     68   ASSERT_EQ(0, codec->SetSendCodec(channel, codec_params));
     69 
     70   int num_devices = 0;
     71   ASSERT_EQ(0, hardware->GetNumOfPlayoutDevices(num_devices));
     72   char device_name[128] = {0};
     73   char guid[128] = {0};
     74   bool device_found = false;
     75   int device_index;
     76   for (device_index = 0; device_index < num_devices; device_index++) {
     77     ASSERT_EQ(0, hardware->GetPlayoutDeviceName(device_index, device_name,
     78                                                 guid));
     79     if (FLAGS_render.compare(device_name) == 0) {
     80       device_found = true;
     81       break;
     82     }
     83   }
     84   ASSERT_TRUE(device_found);
     85   ASSERT_EQ(0, hardware->SetPlayoutDevice(device_index));
     86 
     87   // Disable all audio processing.
     88   ASSERT_EQ(0, audio->SetAgcStatus(false));
     89   ASSERT_EQ(0, audio->SetEcStatus(false));
     90   ASSERT_EQ(0, audio->EnableHighPassFilter(false));
     91   ASSERT_EQ(0, audio->SetNsStatus(false));
     92 
     93   ASSERT_EQ(0, base->StartReceive(channel));
     94   ASSERT_EQ(0, base->StartPlayout(channel));
     95   ASSERT_EQ(0, base->StartSend(channel));
     96 
     97   // Run forever...
     98   while (1) {
     99   }
    100 }
    101 
    102 }  // namespace test
    103 }  // namespace webrtc
    104 
    105 int main(int argc, char** argv) {
    106   google::ParseCommandLineFlags(&argc, &argv, true);
    107   webrtc::test::RunHarness();
    108 }
    109