Rewrote external media test.

BUG=
TEST=

Review URL: https://webrtc-codereview.appspot.com/482002

git-svn-id: http://webrtc.googlecode.com/svn/trunk@2007 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
phoglund@webrtc.org 2012-04-11 14:15:48 +00:00
parent efbdec0542
commit e1bbdb488e
7 changed files with 136 additions and 139 deletions

View File

@ -0,0 +1,44 @@
/*
* 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.
*/
#ifndef FAKE_MEDIA_PROCESS_H_
#define FAKE_MEDIA_PROCESS_H_
#include <cmath>
class FakeMediaProcess : public webrtc::VoEMediaProcess {
public:
virtual void Process(const int channel,
const webrtc::ProcessingTypes type,
WebRtc_Word16 audio_10ms[],
const int length,
const int sampling_freq_hz,
const bool stereo) {
for (int i = 0; i < length; i++) {
if (!stereo) {
audio_10ms[i] = static_cast<WebRtc_Word16>(audio_10ms[i] *
sin(2.0 * 3.14 * frequency * 400.0 / sampling_freq_hz));
} else {
// Interleaved stereo.
audio_10ms[2 * i] = static_cast<WebRtc_Word16> (
audio_10ms[2 * i] * sin(2.0 * 3.14 *
frequency * 400.0 / sampling_freq_hz));
audio_10ms[2 * i + 1] = static_cast<WebRtc_Word16> (
audio_10ms[2 * i + 1] * sin(2.0 * 3.14 *
frequency * 400.0 / sampling_freq_hz));
}
frequency++;
}
}
private:
int frequency;
};
#endif // FAKE_MEDIA_PROCESS_H_

View File

@ -39,7 +39,7 @@ void AfterStreamingFixture::SwitchToManualMicrophone() {
TEST_LOG("You need to speak manually into the microphone for this test.\n");
TEST_LOG("Please start speaking now.\n");
Sleep(2000);
Sleep(1000);
}
void AfterStreamingFixture::RestartFakeMicrophone() {

View File

@ -0,0 +1,84 @@
/*
* 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.
*/
#include "voice_engine/main/interface/voe_external_media.h"
#include "voice_engine/main/test/auto_test/fakes/fake_media_process.h"
#include "voice_engine/main/test/auto_test/fixtures/after_streaming_fixture.h"
class ExternalMediaTest : public AfterStreamingFixture {
protected:
void TestRegisterExternalMedia(int channel, webrtc::ProcessingTypes type) {
FakeMediaProcess fake_media_process;
EXPECT_EQ(0, voe_xmedia_->RegisterExternalMediaProcessing(
channel, type, fake_media_process));
Sleep(2000);
TEST_LOG("Back to normal.\n");
EXPECT_EQ(0, voe_xmedia_->DeRegisterExternalMediaProcessing(
channel, type));
Sleep(2000);
}
};
TEST_F(ExternalMediaTest, ManualCanRecordAndPlaybackUsingExternalPlayout) {
SwitchToManualMicrophone();
EXPECT_EQ(0, voe_base_->StopSend(channel_));
EXPECT_EQ(0, voe_base_->StopPlayout(channel_));
EXPECT_EQ(0, voe_xmedia_->SetExternalPlayoutStatus(true));
EXPECT_EQ(0, voe_base_->StartPlayout(channel_));
EXPECT_EQ(0, voe_base_->StartSend(channel_));
TEST_LOG("Recording data for 2 seconds starting now: please speak.\n");
int16_t recording[32000];
for (int i = 0; i < 200; i++) {
int sample_length = 0;
EXPECT_EQ(0, voe_xmedia_->ExternalPlayoutGetData(
&(recording[i * 160]), 16000, 100, sample_length));
EXPECT_EQ(160, sample_length);
Sleep(10);
}
EXPECT_EQ(0, voe_base_->StopSend(channel_));
EXPECT_EQ(0, voe_base_->StopPlayout(channel_));
EXPECT_EQ(0, voe_xmedia_->SetExternalPlayoutStatus(false));
EXPECT_EQ(0, voe_base_->StartPlayout(channel_));
EXPECT_EQ(0, voe_xmedia_->SetExternalRecordingStatus(true));
EXPECT_EQ(0, voe_base_->StartSend(channel_));
TEST_LOG("Playing back recording, you should hear what you said earlier.\n");
for (int i = 0; i < 200; i++) {
EXPECT_EQ(0, voe_xmedia_->ExternalRecordingInsertData(
&(recording[i * 160]), 160, 16000, 20));
Sleep(10);
}
EXPECT_EQ(0, voe_base_->StopSend(channel_));
EXPECT_EQ(0, voe_xmedia_->SetExternalRecordingStatus(false));
}
TEST_F(ExternalMediaTest,
ManualRegisterExternalMediaProcessingOnAllChannelsAffectsPlayout) {
TEST_LOG("Enabling external media processing: audio should be affected.\n");
TestRegisterExternalMedia(-1, webrtc::kPlaybackAllChannelsMixed);
}
TEST_F(ExternalMediaTest,
ManualRegisterExternalMediaOnSingleChannelAffectsPlayout) {
TEST_LOG("Enabling external media processing: audio should be affected.\n");
TestRegisterExternalMedia(channel_, webrtc::kRecordingPerChannel);
}
TEST_F(ExternalMediaTest,
ManualRegisterExternalMediaOnAllChannelsMixedAffectsRecording) {
SwitchToManualMicrophone();
TEST_LOG("Speak and verify your voice is distorted.\n");
TestRegisterExternalMedia(-1, webrtc::kRecordingAllChannelsMixed);
}

View File

@ -188,31 +188,6 @@ void MyDeadOrAlive::OnPeriodicDeadOrAlive(const int /*channel*/,
fflush(NULL);
}
#ifdef WEBRTC_VOICE_ENGINE_EXTERNAL_MEDIA_API
void MyMedia::Process(const int channel,
const ProcessingTypes type,
WebRtc_Word16 audio_10ms[],
const int length,
const int samplingFreqHz,
const bool stereo) {
for (int i = 0; i < length; i++) {
if (!stereo) {
audio_10ms[i] = (WebRtc_Word16) (audio_10ms[i] *
sin(2.0 * 3.14 * f * 400.0 / samplingFreqHz));
} else {
// interleaved stereo
audio_10ms[2 * i] = (WebRtc_Word16) (audio_10ms[2 * i] *
sin(2.0 * 3.14 * f * 400.0 / samplingFreqHz));
audio_10ms[2 * i + 1] = (WebRtc_Word16) (audio_10ms[2 * i + 1] *
sin(2.0 * 3.14 * f * 400.0 / samplingFreqHz));
}
f++;
}
}
#endif
MyMedia mobj;
FakeExternalTransport::FakeExternalTransport(VoENetwork* ptr)
: my_network_(ptr),
thread_(NULL),
@ -942,100 +917,6 @@ int VoETestManager::DoStandardTest() {
if (TestStartStreaming(channel0_transport) != 0) return -1;
if (TestStartPlaying() != 0) return -1;
//////////////////
// External media
#ifdef _TEST_XMEDIA_
TEST_LOG("\n\n+++ External media tests +++\n\n");
#ifdef WEBRTC_VOE_EXTERNAL_REC_AND_PLAYOUT
TEST_LOG("Stop playing file as microphone \n");
TEST_LOG("==> Talk into the microphone \n");
TEST_MUSTPASS(voe_file_->StopPlayingFileAsMicrophone(0));
TEST_LOG("Enabling external playout\n");
TEST_MUSTPASS(voe_base_->StopSend(0));
TEST_MUSTPASS(voe_base_->StopPlayout(0));
TEST_MUSTPASS(voe_xmedia_->SetExternalPlayoutStatus(true));
TEST_MUSTPASS(voe_base_->StartPlayout(0));
TEST_MUSTPASS(voe_base_->StartSend(0));
TEST_LOG("Writing 2 secs of play data to vector\n");
int getLen;
WebRtc_Word16 speechData[32000];
for (int i = 0; i < 200; i++) {
TEST_MUSTPASS(voe_xmedia_->ExternalPlayoutGetData(speechData+i*160,
16000,
100,
getLen));
TEST_MUSTPASS(160 != getLen);
SLEEP(10);
}
TEST_LOG("Disabling external playout\n");
TEST_MUSTPASS(voe_base_->StopSend(0));
TEST_MUSTPASS(voe_base_->StopPlayout(0));
TEST_MUSTPASS(voe_xmedia_->SetExternalPlayoutStatus(false));
TEST_MUSTPASS(voe_base_->StartPlayout(0));
TEST_LOG("Enabling external recording\n");
TEST_MUSTPASS(voe_xmedia_->SetExternalRecordingStatus(true));
TEST_MUSTPASS(voe_base_->StartSend(0));
TEST_LOG("Inserting record data from vector\n");
for (int i = 0; i < 200; i++) {
TEST_MUSTPASS(voe_xmedia_->ExternalRecordingInsertData(speechData+i*160,
160,
16000,
20));
SLEEP(10);
}
TEST_LOG("Disabling external recording\n");
TEST_MUSTPASS(voe_base_->StopSend(0));
TEST_MUSTPASS(voe_xmedia_->SetExternalRecordingStatus(false));
TEST_MUSTPASS(voe_base_->StartSend(0));
TEST_LOG("==> Start playing a file as microphone again \n");
TEST_MUSTPASS(voe_file_->StartPlayingFileAsMicrophone(0, AudioFilename(),
true, true));
#else
TEST_LOG("Skipping external rec and playout tests - \
WEBRTC_VOE_EXTERNAL_REC_AND_PLAYOUT not defined \n");
#endif // WEBRTC_VOE_EXTERNAL_REC_AND_PLAYOUT
TEST_LOG("Enabling playout external media processing => "
"played audio should now be affected \n");
TEST_MUSTPASS(voe_xmedia_->RegisterExternalMediaProcessing(
-1, kPlaybackAllChannelsMixed, mobj));
SLEEP(2000);
TEST_LOG("Back to normal again \n");
TEST_MUSTPASS(voe_xmedia_->DeRegisterExternalMediaProcessing(
-1, kPlaybackAllChannelsMixed));
SLEEP(2000);
// Note that we must do per channel here because PlayFileAsMicrophone
// is only done on ch 0.
TEST_LOG("Enabling recording external media processing => "
"played audio should now be affected \n");
TEST_MUSTPASS(voe_xmedia_->RegisterExternalMediaProcessing(
0, kRecordingPerChannel, mobj));
SLEEP(2000);
TEST_LOG("Back to normal again \n");
TEST_MUSTPASS(voe_xmedia_->DeRegisterExternalMediaProcessing(
0, kRecordingPerChannel));
SLEEP(2000);
TEST_LOG("Enabling recording external media processing => "
"speak and make sure that voice is affected \n");
TEST_MUSTPASS(voe_xmedia_->RegisterExternalMediaProcessing(
-1, kRecordingAllChannelsMixed, mobj));
SLEEP(2000);
TEST_LOG("Back to normal again \n");
TEST_MUSTPASS(voe_xmedia_->DeRegisterExternalMediaProcessing(
-1, kRecordingAllChannelsMixed));
SLEEP(2000);
#else
TEST_LOG("\n\n+++ External media tests NOT ENABLED +++\n");
#endif // #ifdef _TEST_XMEDIA_
//////////////////
// Stop streaming
TEST_LOG("\n\n+++ Stop streaming +++\n\n");

View File

@ -166,20 +166,6 @@ class RxCallback : public VoERxVadCallback {
int _vadDecision;
};
#ifdef WEBRTC_VOICE_ENGINE_EXTERNAL_MEDIA_API
class MyMedia : public VoEMediaProcess {
public:
virtual void Process(const int channel,
const ProcessingTypes type,
WebRtc_Word16 audio_10ms[],
const int length,
const int samplingFreqHz,
const bool stereo);
private:
int f;
};
#endif
class SubAPIManager {
public:
SubAPIManager()

View File

@ -8,6 +8,8 @@
* be found in the AUTHORS file in the root of the source tree.
*/
#include "voe_unit_test.h"
#include <stdio.h>
#include <string.h>
#include <time.h>
@ -16,10 +18,9 @@
#include <conio.h>
#endif
#include "voe_unit_test.h"
#include "../../source/voice_engine_defines.h"
#include "thread_wrapper.h"
#include "system_wrappers/interface/thread_wrapper.h"
#include "voice_engine/main/source/voice_engine_defines.h"
#include "voice_engine/main/test/auto_test/fakes/fake_media_process.h"
using namespace webrtc;
@ -180,7 +181,7 @@ void VoEUnitTest::SetStereoExternalEncryption(int channel, bool onOff,
}
// VoEVEMediaProcess
MyMedia mpobj;
FakeMediaProcess mpobj;
// ----------------------------------------------------------------------------
// VoEUnitTest

View File

@ -42,6 +42,7 @@
'auto_test/standard/codec_test.cc',
'auto_test/standard/dtmf_test.cc',
'auto_test/standard/encryption_test.cc',
'auto_test/standard/external_media_test.cc',
'auto_test/standard/file_test.cc',
'auto_test/standard/hardware_before_initializing_test.cc',
'auto_test/standard/hardware_before_streaming_test.cc',