| Index: webrtc/tools/agc/agc_harness.cc
|
| diff --git a/webrtc/tools/agc/agc_harness.cc b/webrtc/tools/agc/agc_harness.cc
|
| deleted file mode 100644
|
| index 17919629b91ccc5276d46032df298fe7e484bf1a..0000000000000000000000000000000000000000
|
| --- a/webrtc/tools/agc/agc_harness.cc
|
| +++ /dev/null
|
| @@ -1,284 +0,0 @@
|
| -/*
|
| - * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
| - *
|
| - * Use of this source code is governed by a BSD-style license
|
| - * that can be found in the LICENSE file in the root of the source
|
| - * tree. An additional intellectual property rights grant can be found
|
| - * in the file PATENTS. All contributing project authors may
|
| - * be found in the AUTHORS file in the root of the source tree.
|
| - */
|
| -
|
| -// Refer to kUsage below for a description.
|
| -
|
| -#include <memory>
|
| -
|
| -#include "gflags/gflags.h"
|
| -#include "webrtc/base/checks.h"
|
| -#include "webrtc/base/format_macros.h"
|
| -#include "webrtc/system_wrappers/include/sleep.h"
|
| -#include "webrtc/system_wrappers/include/trace.h"
|
| -#include "webrtc/test/channel_transport/channel_transport.h"
|
| -#include "webrtc/test/testsupport/trace_to_stderr.h"
|
| -#include "webrtc/modules/audio_processing/include/audio_processing.h"
|
| -#include "webrtc/voice_engine/include/voe_audio_processing.h"
|
| -#include "webrtc/voice_engine/include/voe_base.h"
|
| -#include "webrtc/voice_engine/include/voe_codec.h"
|
| -#include "webrtc/voice_engine/include/voe_external_media.h"
|
| -#include "webrtc/voice_engine/include/voe_file.h"
|
| -#include "webrtc/voice_engine/include/voe_hardware.h"
|
| -#include "webrtc/voice_engine/include/voe_network.h"
|
| -#include "webrtc/voice_engine/include/voe_volume_control.h"
|
| -
|
| -DEFINE_bool(codecs, false, "print out available codecs");
|
| -DEFINE_int32(pt, 120, "codec payload type (defaults to opus/48000/2)");
|
| -DEFINE_bool(legacy_agc,
|
| - false,
|
| - "use the legacy AGC in 'serial' mode, or as the first voice "
|
| - "engine's AGC in parallel mode");
|
| -DEFINE_bool(parallel,
|
| - false,
|
| - "run new and legacy AGCs in parallel, with left- and right-panning "
|
| - "respectively. Not compatible with -aec.");
|
| -DEFINE_bool(devices, false, "print out capture devices and indexes to be used "
|
| - "with the capture flags");
|
| -DEFINE_int32(capture1, 0, "capture device index for the first voice engine");
|
| -DEFINE_int32(capture2, 0, "capture device index for second voice engine");
|
| -DEFINE_int32(render1, 0, "render device index for first voice engine");
|
| -DEFINE_int32(render2, 0, "render device index for second voice engine");
|
| -DEFINE_bool(aec,
|
| - false,
|
| - "runs two voice engines in parallel, with the first playing out a "
|
| - "file and sending its captured signal to the second voice engine. "
|
| - "Also enables echo cancellation.");
|
| -DEFINE_bool(ns, true, "enable noise suppression");
|
| -DEFINE_bool(highpass, true, "enable high pass filter");
|
| -DEFINE_string(filename, "", "filename for the -aec mode");
|
| -
|
| -namespace webrtc {
|
| -namespace {
|
| -
|
| -const char kUsage[] =
|
| - "\nWithout additional flags, sets up a simple VoiceEngine loopback call\n"
|
| - "with the default audio devices and runs forever.\n"
|
| -
|
| - "It can also run the new and legacy AGCs in parallel, panned to\n"
|
| - "opposite stereo channels on the default render device. The capture\n"
|
| - "devices for each can be selected (recommended, because otherwise they\n"
|
| - "will fight for the level on the same device).\n\n"
|
| -
|
| - "Lastly, it can be used for local AEC testing. In this mode, the first\n"
|
| - "voice engine plays out a file over the selected render device (normally\n"
|
| - "loudspeakers) and records from the selected capture device. The second\n"
|
| - "voice engine receives the capture signal and plays it out over the\n"
|
| - "selected render device (normally headphones). This allows the user to\n"
|
| - "test an echo scenario with the first voice engine, while monitoring the\n"
|
| - "result with the second.";
|
| -
|
| -class AgcVoiceEngine {
|
| - public:
|
| - enum Pan {
|
| - NoPan,
|
| - PanLeft,
|
| - PanRight
|
| - };
|
| -
|
| - AgcVoiceEngine(bool legacy_agc,
|
| - int tx_port,
|
| - int rx_port,
|
| - int capture_idx,
|
| - int render_idx)
|
| - : voe_(VoiceEngine::Create()),
|
| - base_(VoEBase::GetInterface(voe_)),
|
| - hardware_(VoEHardware::GetInterface(voe_)),
|
| - codec_(VoECodec::GetInterface(voe_)),
|
| - channel_(-1),
|
| - capture_idx_(capture_idx),
|
| - render_idx_(render_idx) {
|
| - SetUp(legacy_agc, tx_port, rx_port);
|
| - }
|
| -
|
| - ~AgcVoiceEngine() {
|
| - TearDown();
|
| - }
|
| -
|
| - void SetUp(bool legacy_agc, int tx_port, int rx_port) {
|
| - VoEAudioProcessing* audio = VoEAudioProcessing::GetInterface(voe_);
|
| - VoENetwork* network = VoENetwork::GetInterface(voe_);
|
| - {
|
| - webrtc::Config config;
|
| - config.Set<ExperimentalAgc>(new ExperimentalAgc(!legacy_agc));
|
| - AudioProcessing* audioproc = AudioProcessing::Create(config);
|
| - RTC_CHECK_EQ(0, base_->Init(nullptr, audioproc));
|
| - // Set this stuff after Init, to override the default voice engine
|
| - // settings.
|
| - audioproc->gain_control()->Enable(true);
|
| - audioproc->high_pass_filter()->Enable(FLAGS_highpass);
|
| - audioproc->noise_suppression()->Enable(FLAGS_ns);
|
| - audioproc->echo_cancellation()->Enable(FLAGS_aec);
|
| - }
|
| - channel_ = base_->CreateChannel();
|
| - RTC_CHECK_NE(-1, channel_);
|
| -
|
| - channel_transport_.reset(
|
| - new test::VoiceChannelTransport(network, channel_));
|
| - RTC_CHECK_EQ(0,
|
| - channel_transport_->SetSendDestination("127.0.0.1", tx_port));
|
| - RTC_CHECK_EQ(0, channel_transport_->SetLocalReceiver(rx_port));
|
| -
|
| - RTC_CHECK_EQ(0, hardware_->SetRecordingDevice(capture_idx_));
|
| - RTC_CHECK_EQ(0, hardware_->SetPlayoutDevice(render_idx_));
|
| -
|
| - CodecInst codec_params = {};
|
| - bool codec_found = false;
|
| - for (int i = 0; i < codec_->NumOfCodecs(); i++) {
|
| - RTC_CHECK_EQ(0, codec_->GetCodec(i, codec_params));
|
| - if (FLAGS_pt == codec_params.pltype) {
|
| - codec_found = true;
|
| - break;
|
| - }
|
| - }
|
| - RTC_CHECK(codec_found);
|
| - RTC_CHECK_EQ(0, codec_->SetSendCodec(channel_, codec_params));
|
| -
|
| - audio->Release();
|
| - network->Release();
|
| - }
|
| -
|
| - void TearDown() {
|
| - Stop();
|
| - channel_transport_.reset(nullptr);
|
| - RTC_CHECK_EQ(0, base_->DeleteChannel(channel_));
|
| - RTC_CHECK_EQ(0, base_->Terminate());
|
| - hardware_->Release();
|
| - base_->Release();
|
| - codec_->Release();
|
| - RTC_CHECK(VoiceEngine::Delete(voe_));
|
| - }
|
| -
|
| - void PrintDevices() {
|
| - int num_devices = 0;
|
| - char device_name[128] = {0};
|
| - char guid[128] = {0};
|
| - RTC_CHECK_EQ(0, hardware_->GetNumOfRecordingDevices(num_devices));
|
| - printf("Capture devices:\n");
|
| - for (int i = 0; i < num_devices; i++) {
|
| - RTC_CHECK_EQ(0, hardware_->GetRecordingDeviceName(i, device_name, guid));
|
| - printf("%d: %s\n", i, device_name);
|
| - }
|
| - RTC_CHECK_EQ(0, hardware_->GetNumOfPlayoutDevices(num_devices));
|
| - printf("Render devices:\n");
|
| - for (int i = 0; i < num_devices; i++) {
|
| - RTC_CHECK_EQ(0, hardware_->GetPlayoutDeviceName(i, device_name, guid));
|
| - printf("%d: %s\n", i, device_name);
|
| - }
|
| - }
|
| -
|
| - void PrintCodecs() {
|
| - CodecInst params = {0};
|
| - printf("Codecs:\n");
|
| - for (int i = 0; i < codec_->NumOfCodecs(); i++) {
|
| - RTC_CHECK_EQ(0, codec_->GetCodec(i, params));
|
| - printf("%d %s/%d/%" PRIuS "\n", params.pltype, params.plname,
|
| - params.plfreq, params.channels);
|
| - }
|
| - }
|
| -
|
| - void StartSending() { RTC_CHECK_EQ(0, base_->StartSend(channel_)); }
|
| -
|
| - void StartPlaying(Pan pan, const std::string& filename) {
|
| - VoEVolumeControl* volume = VoEVolumeControl::GetInterface(voe_);
|
| - VoEFile* file = VoEFile::GetInterface(voe_);
|
| - if (pan == PanLeft) {
|
| - volume->SetOutputVolumePan(channel_, 1, 0);
|
| - } else if (pan == PanRight) {
|
| - volume->SetOutputVolumePan(channel_, 0, 1);
|
| - }
|
| - if (filename != "") {
|
| - printf("playing file\n");
|
| - RTC_CHECK_EQ(
|
| - 0, file->StartPlayingFileLocally(channel_, filename.c_str(), true,
|
| - kFileFormatPcm16kHzFile, 1.0, 0, 0));
|
| - }
|
| - RTC_CHECK_EQ(0, base_->StartReceive(channel_));
|
| - RTC_CHECK_EQ(0, base_->StartPlayout(channel_));
|
| - volume->Release();
|
| - file->Release();
|
| - }
|
| -
|
| - void Stop() {
|
| - RTC_CHECK_EQ(0, base_->StopSend(channel_));
|
| - RTC_CHECK_EQ(0, base_->StopPlayout(channel_));
|
| - }
|
| -
|
| - private:
|
| - VoiceEngine* voe_;
|
| - VoEBase* base_;
|
| - VoEHardware* hardware_;
|
| - VoECodec* codec_;
|
| - int channel_;
|
| - int capture_idx_;
|
| - int render_idx_;
|
| - std::unique_ptr<test::VoiceChannelTransport> channel_transport_;
|
| -};
|
| -
|
| -void RunHarness() {
|
| - std::unique_ptr<AgcVoiceEngine> voe1(new AgcVoiceEngine(
|
| - FLAGS_legacy_agc, 2000, 2000, FLAGS_capture1, FLAGS_render1));
|
| - std::unique_ptr<AgcVoiceEngine> voe2;
|
| - if (FLAGS_parallel) {
|
| - voe2.reset(new AgcVoiceEngine(!FLAGS_legacy_agc, 3000, 3000, FLAGS_capture2,
|
| - FLAGS_render2));
|
| - voe1->StartPlaying(AgcVoiceEngine::PanLeft, "");
|
| - voe1->StartSending();
|
| - voe2->StartPlaying(AgcVoiceEngine::PanRight, "");
|
| - voe2->StartSending();
|
| - } else if (FLAGS_aec) {
|
| - voe1.reset(new AgcVoiceEngine(FLAGS_legacy_agc, 2000, 4242, FLAGS_capture1,
|
| - FLAGS_render1));
|
| - voe2.reset(new AgcVoiceEngine(!FLAGS_legacy_agc, 4242, 2000, FLAGS_capture2,
|
| - FLAGS_render2));
|
| - voe1->StartPlaying(AgcVoiceEngine::NoPan, FLAGS_filename);
|
| - voe1->StartSending();
|
| - voe2->StartPlaying(AgcVoiceEngine::NoPan, "");
|
| - } else {
|
| - voe1->StartPlaying(AgcVoiceEngine::NoPan, "");
|
| - voe1->StartSending();
|
| - }
|
| -
|
| - // Run forever...
|
| - SleepMs(0x7fffffff);
|
| -}
|
| -
|
| -void PrintDevices() {
|
| - AgcVoiceEngine device_voe(false, 4242, 4242, 0, 0);
|
| - device_voe.PrintDevices();
|
| -}
|
| -
|
| -void PrintCodecs() {
|
| - AgcVoiceEngine codec_voe(false, 4242, 4242, 0, 0);
|
| - codec_voe.PrintCodecs();
|
| -}
|
| -
|
| -} // namespace
|
| -} // namespace webrtc
|
| -
|
| -int main(int argc, char** argv) {
|
| - google::SetUsageMessage(webrtc::kUsage);
|
| - google::ParseCommandLineFlags(&argc, &argv, true);
|
| - webrtc::test::TraceToStderr trace_to_stderr;
|
| -
|
| - if (FLAGS_parallel && FLAGS_aec) {
|
| - printf("-parallel and -aec are not compatible\n");
|
| - return 1;
|
| - }
|
| - if (FLAGS_devices) {
|
| - webrtc::PrintDevices();
|
| - }
|
| - if (FLAGS_codecs) {
|
| - webrtc::PrintCodecs();
|
| - }
|
| - if (!FLAGS_devices && !FLAGS_codecs) {
|
| - webrtc::RunHarness();
|
| - }
|
| - return 0;
|
| -}
|
|
|