Configure AudioProcessing directly in agc_harness.
This allows us to configure create-time parameters for AudioProcessing in a voice engine app and avoid the onerous SetExtraOptions. voe_cmd_test would require significant refactoring to do the same. Minor cleanups: - Use agc_manager_direct. This should allow us to remove agc_manager. - Use CHECKs rather than ASSERTs. Review URL: https://codereview.webrtc.org/1247033006 Cr-Commit-Position: refs/heads/master@{#9618}
This commit is contained in:
parent
b297c5a01f
commit
0b6a204b21
@ -11,13 +11,14 @@
|
||||
// Refer to kUsage below for a description.
|
||||
|
||||
#include "gflags/gflags.h"
|
||||
#include "testing/gtest/include/gtest/gtest.h"
|
||||
#include "webrtc/base/checks.h"
|
||||
#include "webrtc/base/scoped_ptr.h"
|
||||
#include "webrtc/system_wrappers/interface/sleep.h"
|
||||
#include "webrtc/system_wrappers/interface/trace.h"
|
||||
#include "webrtc/test/channel_transport/include/channel_transport.h"
|
||||
#include "webrtc/test/testsupport/trace_to_stderr.h"
|
||||
#include "webrtc/tools/agc/agc_manager.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"
|
||||
@ -28,20 +29,26 @@
|
||||
#include "webrtc/voice_engine/include/voe_volume_control.h"
|
||||
|
||||
DEFINE_bool(codecs, false, "print out available codecs");
|
||||
DEFINE_int32(pt, 103, "codec payload type (defaults to ISAC/16000/1)");
|
||||
DEFINE_bool(internal, true, "use the internal AGC in 'serial' mode, or as the "
|
||||
"first voice engine's AGC in parallel mode");
|
||||
DEFINE_bool(parallel, false, "run internal and public AGCs in parallel, with "
|
||||
"left- and right-panning respectively. Not compatible with -aec.");
|
||||
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(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");
|
||||
@ -51,10 +58,9 @@ namespace {
|
||||
|
||||
const char kUsage[] =
|
||||
"\nWithout additional flags, sets up a simple VoiceEngine loopback call\n"
|
||||
"with the default audio devices and runs forever. The internal AGC is\n"
|
||||
"enabled and the public disabled.\n\n"
|
||||
"with the default audio devices and runs forever.\n"
|
||||
|
||||
"It can also run the public AGC in parallel with the internal, panned to\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"
|
||||
@ -75,63 +81,62 @@ class AgcVoiceEngine {
|
||||
PanRight
|
||||
};
|
||||
|
||||
AgcVoiceEngine(bool internal, int tx_port, int rx_port, int capture_idx,
|
||||
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_)),
|
||||
manager_(new AgcManager(voe_)),
|
||||
channel_(-1),
|
||||
capture_idx_(capture_idx),
|
||||
render_idx_(render_idx) {
|
||||
SetUp(internal, tx_port, rx_port);
|
||||
SetUp(legacy_agc, tx_port, rx_port);
|
||||
}
|
||||
|
||||
~AgcVoiceEngine() {
|
||||
TearDown();
|
||||
}
|
||||
|
||||
void SetUp(bool internal, int tx_port, int rx_port) {
|
||||
ASSERT_TRUE(voe_ != NULL);
|
||||
ASSERT_TRUE(base_ != NULL);
|
||||
ASSERT_TRUE(hardware_ != NULL);
|
||||
ASSERT_TRUE(codec_ != NULL);
|
||||
void SetUp(bool legacy_agc, int tx_port, int rx_port) {
|
||||
VoEAudioProcessing* audio = VoEAudioProcessing::GetInterface(voe_);
|
||||
ASSERT_TRUE(audio != NULL);
|
||||
VoENetwork* network = VoENetwork::GetInterface(voe_);
|
||||
ASSERT_TRUE(network != NULL);
|
||||
|
||||
ASSERT_EQ(0, base_->Init());
|
||||
{
|
||||
webrtc::Config config;
|
||||
config.Set<ExperimentalAgc>(new ExperimentalAgc(!legacy_agc));
|
||||
AudioProcessing* audioproc = AudioProcessing::Create(config);
|
||||
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();
|
||||
ASSERT_NE(-1, channel_);
|
||||
CHECK_NE(-1, channel_);
|
||||
|
||||
channel_transport_.reset(
|
||||
new test::VoiceChannelTransport(network, channel_));
|
||||
ASSERT_EQ(0, channel_transport_->SetSendDestination("127.0.0.1", tx_port));
|
||||
ASSERT_EQ(0, channel_transport_->SetLocalReceiver(rx_port));
|
||||
CHECK_EQ(0, channel_transport_->SetSendDestination("127.0.0.1", tx_port));
|
||||
CHECK_EQ(0, channel_transport_->SetLocalReceiver(rx_port));
|
||||
|
||||
ASSERT_EQ(0, hardware_->SetRecordingDevice(capture_idx_));
|
||||
ASSERT_EQ(0, hardware_->SetPlayoutDevice(render_idx_));
|
||||
CHECK_EQ(0, hardware_->SetRecordingDevice(capture_idx_));
|
||||
CHECK_EQ(0, hardware_->SetPlayoutDevice(render_idx_));
|
||||
|
||||
CodecInst codec_params = {0};
|
||||
CodecInst codec_params = {};
|
||||
bool codec_found = false;
|
||||
for (int i = 0; i < codec_->NumOfCodecs(); i++) {
|
||||
ASSERT_EQ(0, codec_->GetCodec(i, codec_params));
|
||||
CHECK_EQ(0, codec_->GetCodec(i, codec_params));
|
||||
if (FLAGS_pt == codec_params.pltype) {
|
||||
codec_found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
ASSERT_TRUE(codec_found);
|
||||
ASSERT_EQ(0, codec_->SetSendCodec(channel_, codec_params));
|
||||
|
||||
ASSERT_EQ(0, audio->EnableHighPassFilter(FLAGS_highpass));
|
||||
ASSERT_EQ(0, audio->SetNsStatus(FLAGS_ns));
|
||||
ASSERT_EQ(0, audio->SetEcStatus(FLAGS_aec));
|
||||
|
||||
ASSERT_EQ(0, manager_->Enable(internal));
|
||||
ASSERT_EQ(0, audio->SetAgcStatus(!internal));
|
||||
CHECK(codec_found);
|
||||
CHECK_EQ(0, codec_->SetSendCodec(channel_, codec_params));
|
||||
|
||||
audio->Release();
|
||||
network->Release();
|
||||
@ -139,31 +144,29 @@ class AgcVoiceEngine {
|
||||
|
||||
void TearDown() {
|
||||
Stop();
|
||||
channel_transport_.reset(NULL);
|
||||
ASSERT_EQ(0, base_->DeleteChannel(channel_));
|
||||
ASSERT_EQ(0, base_->Terminate());
|
||||
// Don't test; the manager hasn't released its interfaces.
|
||||
channel_transport_.reset(nullptr);
|
||||
CHECK_EQ(0, base_->DeleteChannel(channel_));
|
||||
CHECK_EQ(0, base_->Terminate());
|
||||
hardware_->Release();
|
||||
base_->Release();
|
||||
codec_->Release();
|
||||
delete manager_;
|
||||
ASSERT_TRUE(VoiceEngine::Delete(voe_));
|
||||
CHECK(VoiceEngine::Delete(voe_));
|
||||
}
|
||||
|
||||
void PrintDevices() {
|
||||
int num_devices = 0;
|
||||
char device_name[128] = {0};
|
||||
char guid[128] = {0};
|
||||
ASSERT_EQ(0, hardware_->GetNumOfRecordingDevices(num_devices));
|
||||
CHECK_EQ(0, hardware_->GetNumOfRecordingDevices(num_devices));
|
||||
printf("Capture devices:\n");
|
||||
for (int i = 0; i < num_devices; i++) {
|
||||
ASSERT_EQ(0, hardware_->GetRecordingDeviceName(i, device_name, guid));
|
||||
CHECK_EQ(0, hardware_->GetRecordingDeviceName(i, device_name, guid));
|
||||
printf("%d: %s\n", i, device_name);
|
||||
}
|
||||
ASSERT_EQ(0, hardware_->GetNumOfPlayoutDevices(num_devices));
|
||||
CHECK_EQ(0, hardware_->GetNumOfPlayoutDevices(num_devices));
|
||||
printf("Render devices:\n");
|
||||
for (int i = 0; i < num_devices; i++) {
|
||||
ASSERT_EQ(0, hardware_->GetPlayoutDeviceName(i, device_name, guid));
|
||||
CHECK_EQ(0, hardware_->GetPlayoutDeviceName(i, device_name, guid));
|
||||
printf("%d: %s\n", i, device_name);
|
||||
}
|
||||
}
|
||||
@ -172,21 +175,17 @@ class AgcVoiceEngine {
|
||||
CodecInst params = {0};
|
||||
printf("Codecs:\n");
|
||||
for (int i = 0; i < codec_->NumOfCodecs(); i++) {
|
||||
ASSERT_EQ(0, codec_->GetCodec(i, params));
|
||||
CHECK_EQ(0, codec_->GetCodec(i, params));
|
||||
printf("%d %s/%d/%d\n", params.pltype, params.plname, params.plfreq,
|
||||
params.channels);
|
||||
}
|
||||
}
|
||||
|
||||
void StartSending() {
|
||||
ASSERT_EQ(0, base_->StartSend(channel_));
|
||||
}
|
||||
void StartSending() { CHECK_EQ(0, base_->StartSend(channel_)); }
|
||||
|
||||
void StartPlaying(Pan pan, const std::string& filename) {
|
||||
VoEVolumeControl* volume = VoEVolumeControl::GetInterface(voe_);
|
||||
VoEFile* file = VoEFile::GetInterface(voe_);
|
||||
ASSERT_TRUE(volume != NULL);
|
||||
ASSERT_TRUE(file != NULL);
|
||||
if (pan == PanLeft) {
|
||||
volume->SetOutputVolumePan(channel_, 1, 0);
|
||||
} else if (pan == PanRight) {
|
||||
@ -194,18 +193,19 @@ class AgcVoiceEngine {
|
||||
}
|
||||
if (filename != "") {
|
||||
printf("playing file\n");
|
||||
ASSERT_EQ(0, file->StartPlayingFileLocally(channel_, filename.c_str(),
|
||||
true, kFileFormatPcm16kHzFile, 1.0, 0, 0));
|
||||
CHECK_EQ(
|
||||
0, file->StartPlayingFileLocally(channel_, filename.c_str(), true,
|
||||
kFileFormatPcm16kHzFile, 1.0, 0, 0));
|
||||
}
|
||||
ASSERT_EQ(0, base_->StartReceive(channel_));
|
||||
ASSERT_EQ(0, base_->StartPlayout(channel_));
|
||||
CHECK_EQ(0, base_->StartReceive(channel_));
|
||||
CHECK_EQ(0, base_->StartPlayout(channel_));
|
||||
volume->Release();
|
||||
file->Release();
|
||||
}
|
||||
|
||||
void Stop() {
|
||||
ASSERT_EQ(0, base_->StopSend(channel_));
|
||||
ASSERT_EQ(0, base_->StopPlayout(channel_));
|
||||
CHECK_EQ(0, base_->StopSend(channel_));
|
||||
CHECK_EQ(0, base_->StopPlayout(channel_));
|
||||
}
|
||||
|
||||
private:
|
||||
@ -213,7 +213,6 @@ class AgcVoiceEngine {
|
||||
VoEBase* base_;
|
||||
VoEHardware* hardware_;
|
||||
VoECodec* codec_;
|
||||
AgcManager* manager_;
|
||||
int channel_;
|
||||
int capture_idx_;
|
||||
int render_idx_;
|
||||
@ -222,19 +221,19 @@ class AgcVoiceEngine {
|
||||
|
||||
void RunHarness() {
|
||||
rtc::scoped_ptr<AgcVoiceEngine> voe1(new AgcVoiceEngine(
|
||||
FLAGS_internal, 2000, 2000, FLAGS_capture1, FLAGS_render1));
|
||||
FLAGS_legacy_agc, 2000, 2000, FLAGS_capture1, FLAGS_render1));
|
||||
rtc::scoped_ptr<AgcVoiceEngine> voe2;
|
||||
if (FLAGS_parallel) {
|
||||
voe2.reset(new AgcVoiceEngine(!FLAGS_internal, 3000, 3000, FLAGS_capture2,
|
||||
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_internal, 2000, 4242, FLAGS_capture1,
|
||||
voe1.reset(new AgcVoiceEngine(FLAGS_legacy_agc, 2000, 4242, FLAGS_capture1,
|
||||
FLAGS_render1));
|
||||
voe2.reset(new AgcVoiceEngine(!FLAGS_internal, 4242, 2000, FLAGS_capture2,
|
||||
voe2.reset(new AgcVoiceEngine(!FLAGS_legacy_agc, 4242, 2000, FLAGS_capture2,
|
||||
FLAGS_render2));
|
||||
voe1->StartPlaying(AgcVoiceEngine::NoPan, FLAGS_filename);
|
||||
voe1->StartSending();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user