Small refactoring of AudioProcessing use in channel.cc.

- Apply consistent naming.
- Use a scoped_ptr for rx_audioproc_.
- Remove now unnecessary AudioProcessing::Destroy().

R=bjornv@webrtc.org, xians@webrtc.org

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

git-svn-id: http://webrtc.googlecode.com/svn/trunk@4784 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
andrew@webrtc.org 2013-09-18 22:37:32 +00:00
parent 0d5da25e6c
commit f3930e941c
6 changed files with 81 additions and 135 deletions

View File

@ -47,10 +47,6 @@ AudioProcessing* AudioProcessing::Create(int id) {
return apm;
}
void AudioProcessing::Destroy(AudioProcessing* apm) {
delete static_cast<AudioProcessingImpl*>(apm);
}
int32_t AudioProcessing::TimeUntilNextProcess() { return -1; }
int32_t AudioProcessing::Process() { return -1; }

View File

@ -105,8 +105,7 @@ class VoiceDetection;
// apm->Initialize();
//
// // Close the application...
// AudioProcessing::Destroy(apm);
// apm = NULL;
// delete apm;
//
class AudioProcessing : public Module {
public:
@ -118,11 +117,6 @@ class AudioProcessing : public Module {
static AudioProcessing* Create(int id);
virtual ~AudioProcessing() {}
// TODO(andrew): remove this method. We now allow users to delete instances
// directly, useful for scoped_ptr.
// Destroys a |apm| instance.
static void Destroy(AudioProcessing* apm);
// Initializes internal states, while retaining all user settings. This
// should be called before beginning to process a new audio stream. However,
// it is not necessary to call before processing the first stream after

View File

@ -42,6 +42,7 @@ using webrtc::NoiseSuppression;
using webrtc::EchoCancellation;
using webrtc::EventWrapper;
using webrtc::scoped_array;
using webrtc::scoped_ptr;
using webrtc::Trace;
using webrtc::LevelEstimator;
using webrtc::EchoCancellation;
@ -244,9 +245,9 @@ class ApmTest : public ::testing::Test {
const std::string output_path_;
const std::string ref_path_;
const std::string ref_filename_;
webrtc::AudioProcessing* apm_;
webrtc::AudioFrame* frame_;
webrtc::AudioFrame* revframe_;
scoped_ptr<webrtc::AudioProcessing> apm_;
AudioFrame* frame_;
AudioFrame* revframe_;
FILE* far_file_;
FILE* near_file_;
FILE* out_file_;
@ -261,7 +262,7 @@ ApmTest::ApmTest()
#elif defined(WEBRTC_AUDIOPROC_FLOAT_PROFILE)
ref_filename_(ref_path_ + "output_data_float.pb"),
#endif
apm_(NULL),
apm_(AudioProcessing::Create(0)),
frame_(NULL),
revframe_(NULL),
far_file_(NULL),
@ -269,8 +270,7 @@ ApmTest::ApmTest()
out_file_(NULL) {}
void ApmTest::SetUp() {
apm_ = AudioProcessing::Create(0);
ASSERT_TRUE(apm_ != NULL);
ASSERT_TRUE(apm_.get() != NULL);
frame_ = new AudioFrame();
revframe_ = new AudioFrame();
@ -303,11 +303,6 @@ void ApmTest::TearDown() {
ASSERT_EQ(0, fclose(out_file_));
}
out_file_ = NULL;
if (apm_ != NULL) {
AudioProcessing::Destroy(apm_);
}
apm_ = NULL;
}
std::string ApmTest::ResourceFilePath(std::string name, int sample_rate_hz) {
@ -466,8 +461,8 @@ void ApmTest::ChangeTriggersInit(F f, AudioProcessing* ap, int initial_value,
EXPECT_FALSE(FrameDataAreEqual(*frame_, frame_copy));
// Test that a change in value triggers an init.
f(apm_, changed_value);
f(apm_, initial_value);
f(apm_.get(), changed_value);
f(apm_.get(), initial_value);
ProcessWithDefaultStreamParameters(&frame_copy);
EXPECT_TRUE(FrameDataAreEqual(*frame_, frame_copy));
@ -492,7 +487,7 @@ void ApmTest::ChangeTriggersInit(F f, AudioProcessing* ap, int initial_value,
apm_->Initialize();
ProcessWithDefaultStreamParameters(&frame_copy);
// Test that the same value does not trigger an init.
f(apm_, initial_value);
f(apm_.get(), initial_value);
ProcessWithDefaultStreamParameters(&frame_copy);
EXPECT_TRUE(FrameDataAreEqual(*frame_, frame_copy));
}
@ -737,15 +732,15 @@ void SetNumOutputChannels(AudioProcessing* ap, int value) {
}
TEST_F(ApmTest, SampleRateChangeTriggersInit) {
ChangeTriggersInit(SetSampleRate, apm_, 16000, 8000);
ChangeTriggersInit(SetSampleRate, apm_.get(), 16000, 8000);
}
TEST_F(ApmTest, ReverseChannelChangeTriggersInit) {
ChangeTriggersInit(SetNumReverseChannels, apm_, 2, 1);
ChangeTriggersInit(SetNumReverseChannels, apm_.get(), 2, 1);
}
TEST_F(ApmTest, ChannelChangeTriggersInit) {
ChangeTriggersInit(SetNumOutputChannels, apm_, 2, 1);
ChangeTriggersInit(SetNumOutputChannels, apm_.get(), 2, 1);
}
TEST_F(ApmTest, EchoCancellation) {

View File

@ -38,6 +38,7 @@ using webrtc::EchoCancellation;
using webrtc::GainControl;
using webrtc::NoiseSuppression;
using webrtc::scoped_array;
using webrtc::scoped_ptr;
using webrtc::TickInterval;
using webrtc::TickTime;
using webrtc::VoiceDetection;
@ -167,8 +168,8 @@ void void_main(int argc, char* argv[]) {
printf("Try `process_test --help' for more information.\n\n");
}
AudioProcessing* apm = AudioProcessing::Create(0);
ASSERT_TRUE(apm != NULL);
scoped_ptr<AudioProcessing> apm(AudioProcessing::Create(0));
ASSERT_TRUE(apm.get() != NULL);
const char* pb_filename = NULL;
const char* far_filename = NULL;
@ -1057,9 +1058,6 @@ void void_main(int argc, char* argv[]) {
printf("Warning: no capture frames\n");
}
}
AudioProcessing::Destroy(apm);
apm = NULL;
}
} // namespace

View File

@ -53,11 +53,10 @@ Channel::SendData(FrameType frameType,
if (_includeAudioLevelIndication)
{
assert(_rtpAudioProc.get() != NULL);
// Store current audio level in the RTP/RTCP module.
// The level will be used in combination with voice-activity state
// (frameType) to add an RTP header extension
_rtpRtcpModule->SetAudioLevel(_rtpAudioProc->level_estimator()->RMS());
_rtpRtcpModule->SetAudioLevel(rtp_audioproc_->level_estimator()->RMS());
}
// Push data from ACM to RTP/RTCP-module to deliver audio frame for
@ -960,8 +959,8 @@ Channel::Channel(int32_t channelId,
_callbackCritSectPtr(NULL),
_transportPtr(NULL),
_encryptionPtr(NULL),
_rtpAudioProc(NULL),
_rxAudioProcessingModulePtr(NULL),
rtp_audioproc_(NULL),
rx_audioproc_(AudioProcessing::Create(VoEModuleId(instanceId, channelId))),
_rxVadObserverPtr(NULL),
_oldVadDecision(-1),
_sendFrameType(0),
@ -1025,10 +1024,6 @@ Channel::Channel(int32_t channelId,
configuration.receive_statistics = rtp_receive_statistics_.get();
_rtpRtcpModule.reset(RtpRtcp::CreateRtpRtcp(configuration));
// Create far end AudioProcessing Module
_rxAudioProcessingModulePtr = AudioProcessing::Create(
VoEModuleId(instanceId, channelId));
}
Channel::~Channel()
@ -1100,11 +1095,6 @@ Channel::~Channel()
// Destroy modules
AudioCodingModule::Destroy(&_audioCodingModule);
if (_rxAudioProcessingModulePtr != NULL)
{
AudioProcessing::Destroy(_rxAudioProcessingModulePtr); // far end APM
_rxAudioProcessingModulePtr = NULL;
}
// End of modules shutdown
@ -1277,19 +1267,8 @@ Channel::Init()
#endif
}
// Initialize the far end AP module
// Using 8 kHz as initial Fs, the same as in transmission. Might be
// changed at the first receiving audio.
if (_rxAudioProcessingModulePtr == NULL)
{
_engineStatisticsPtr->SetLastError(
VE_NO_MEMORY, kTraceCritical,
"Channel::Init() failed to create the far-end AudioProcessing"
" module");
return -1;
}
if (_rxAudioProcessingModulePtr->set_sample_rate_hz(8000))
if (rx_audioproc_->set_sample_rate_hz(8000))
{
_engineStatisticsPtr->SetLastError(
VE_APM_ERROR, kTraceWarning,
@ -1297,14 +1276,14 @@ Channel::Init()
" far-end AP module");
}
if (_rxAudioProcessingModulePtr->set_num_channels(1, 1) != 0)
if (rx_audioproc_->set_num_channels(1, 1) != 0)
{
_engineStatisticsPtr->SetLastError(
VE_SOUNDCARD_ERROR, kTraceWarning,
"Init() failed to set channels for the primary audio stream");
}
if (_rxAudioProcessingModulePtr->high_pass_filter()->Enable(
if (rx_audioproc_->high_pass_filter()->Enable(
WEBRTC_VOICE_ENGINE_RX_HP_DEFAULT_STATE) != 0)
{
_engineStatisticsPtr->SetLastError(
@ -1313,7 +1292,7 @@ Channel::Init()
" far-end AP module");
}
if (_rxAudioProcessingModulePtr->noise_suppression()->set_level(
if (rx_audioproc_->noise_suppression()->set_level(
(NoiseSuppression::Level)WEBRTC_VOICE_ENGINE_RX_NS_DEFAULT_MODE) != 0)
{
_engineStatisticsPtr->SetLastError(
@ -1321,7 +1300,7 @@ Channel::Init()
"Init() failed to set noise reduction level for far-end"
" AP module");
}
if (_rxAudioProcessingModulePtr->noise_suppression()->Enable(
if (rx_audioproc_->noise_suppression()->Enable(
WEBRTC_VOICE_ENGINE_RX_NS_DEFAULT_STATE) != 0)
{
_engineStatisticsPtr->SetLastError(
@ -1330,14 +1309,14 @@ Channel::Init()
" AP module");
}
if (_rxAudioProcessingModulePtr->gain_control()->set_mode(
if (rx_audioproc_->gain_control()->set_mode(
(GainControl::Mode)WEBRTC_VOICE_ENGINE_RX_AGC_DEFAULT_MODE) != 0)
{
_engineStatisticsPtr->SetLastError(
VE_APM_ERROR, kTraceWarning,
"Init() failed to set AGC mode for far-end AP module");
}
if (_rxAudioProcessingModulePtr->gain_control()->Enable(
if (rx_audioproc_->gain_control()->Enable(
WEBRTC_VOICE_ENGINE_RX_AGC_DEFAULT_STATE) != 0)
{
_engineStatisticsPtr->SetLastError(
@ -3317,7 +3296,7 @@ Channel::SetRxAgcStatus(bool enable, AgcModes mode)
agcMode = GainControl::kAdaptiveDigital;
break;
case kAgcUnchanged:
agcMode = _rxAudioProcessingModulePtr->gain_control()->mode();
agcMode = rx_audioproc_->gain_control()->mode();
break;
case kAgcFixedDigital:
agcMode = GainControl::kFixedDigital;
@ -3332,14 +3311,14 @@ Channel::SetRxAgcStatus(bool enable, AgcModes mode)
return -1;
}
if (_rxAudioProcessingModulePtr->gain_control()->set_mode(agcMode) != 0)
if (rx_audioproc_->gain_control()->set_mode(agcMode) != 0)
{
_engineStatisticsPtr->SetLastError(
VE_APM_ERROR, kTraceError,
"SetRxAgcStatus() failed to set Agc mode");
return -1;
}
if (_rxAudioProcessingModulePtr->gain_control()->Enable(enable) != 0)
if (rx_audioproc_->gain_control()->Enable(enable) != 0)
{
_engineStatisticsPtr->SetLastError(
VE_APM_ERROR, kTraceError,
@ -3359,9 +3338,9 @@ Channel::GetRxAgcStatus(bool& enabled, AgcModes& mode)
WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId,_channelId),
"Channel::GetRxAgcStatus(enable=?, mode=?)");
bool enable = _rxAudioProcessingModulePtr->gain_control()->is_enabled();
bool enable = rx_audioproc_->gain_control()->is_enabled();
GainControl::Mode agcMode =
_rxAudioProcessingModulePtr->gain_control()->mode();
rx_audioproc_->gain_control()->mode();
enabled = enable;
@ -3389,7 +3368,7 @@ Channel::SetRxAgcConfig(AgcConfig config)
WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId,_channelId),
"Channel::SetRxAgcConfig()");
if (_rxAudioProcessingModulePtr->gain_control()->set_target_level_dbfs(
if (rx_audioproc_->gain_control()->set_target_level_dbfs(
config.targetLeveldBOv) != 0)
{
_engineStatisticsPtr->SetLastError(
@ -3398,7 +3377,7 @@ Channel::SetRxAgcConfig(AgcConfig config)
"(or envelope) of the Agc");
return -1;
}
if (_rxAudioProcessingModulePtr->gain_control()->set_compression_gain_db(
if (rx_audioproc_->gain_control()->set_compression_gain_db(
config.digitalCompressionGaindB) != 0)
{
_engineStatisticsPtr->SetLastError(
@ -3407,7 +3386,7 @@ Channel::SetRxAgcConfig(AgcConfig config)
" digital compression stage may apply");
return -1;
}
if (_rxAudioProcessingModulePtr->gain_control()->enable_limiter(
if (rx_audioproc_->gain_control()->enable_limiter(
config.limiterEnable) != 0)
{
_engineStatisticsPtr->SetLastError(
@ -3426,11 +3405,11 @@ Channel::GetRxAgcConfig(AgcConfig& config)
"Channel::GetRxAgcConfig(config=%?)");
config.targetLeveldBOv =
_rxAudioProcessingModulePtr->gain_control()->target_level_dbfs();
rx_audioproc_->gain_control()->target_level_dbfs();
config.digitalCompressionGaindB =
_rxAudioProcessingModulePtr->gain_control()->compression_gain_db();
rx_audioproc_->gain_control()->compression_gain_db();
config.limiterEnable =
_rxAudioProcessingModulePtr->gain_control()->is_limiter_enabled();
rx_audioproc_->gain_control()->is_limiter_enabled();
WEBRTC_TRACE(kTraceStateInfo, kTraceVoice,
VoEId(_instanceId,_channelId), "GetRxAgcConfig() => "
@ -3464,7 +3443,7 @@ Channel::SetRxNsStatus(bool enable, NsModes mode)
WEBRTC_VOICE_ENGINE_RX_NS_DEFAULT_MODE;
break;
case kNsUnchanged:
nsLevel = _rxAudioProcessingModulePtr->noise_suppression()->level();
nsLevel = rx_audioproc_->noise_suppression()->level();
break;
case kNsConference:
nsLevel = NoiseSuppression::kHigh;
@ -3483,7 +3462,7 @@ Channel::SetRxNsStatus(bool enable, NsModes mode)
break;
}
if (_rxAudioProcessingModulePtr->noise_suppression()->set_level(nsLevel)
if (rx_audioproc_->noise_suppression()->set_level(nsLevel)
!= 0)
{
_engineStatisticsPtr->SetLastError(
@ -3491,7 +3470,7 @@ Channel::SetRxNsStatus(bool enable, NsModes mode)
"SetRxAgcStatus() failed to set Ns level");
return -1;
}
if (_rxAudioProcessingModulePtr->noise_suppression()->Enable(enable) != 0)
if (rx_audioproc_->noise_suppression()->Enable(enable) != 0)
{
_engineStatisticsPtr->SetLastError(
VE_APM_ERROR, kTraceError,
@ -3512,9 +3491,9 @@ Channel::GetRxNsStatus(bool& enabled, NsModes& mode)
"Channel::GetRxNsStatus(enable=?, mode=?)");
bool enable =
_rxAudioProcessingModulePtr->noise_suppression()->is_enabled();
rx_audioproc_->noise_suppression()->is_enabled();
NoiseSuppression::Level ncLevel =
_rxAudioProcessingModulePtr->noise_suppression()->level();
rx_audioproc_->noise_suppression()->level();
enabled = enable;
@ -3702,34 +3681,28 @@ Channel::GetRemoteCSRCs(unsigned int arrCSRC[15])
int
Channel::SetRTPAudioLevelIndicationStatus(bool enable, unsigned char ID)
{
if (_rtpAudioProc.get() == NULL)
{
_rtpAudioProc.reset(AudioProcessing::Create(VoEModuleId(_instanceId,
_channelId)));
if (_rtpAudioProc.get() == NULL)
{
_engineStatisticsPtr->SetLastError(VE_NO_MEMORY, kTraceCritical,
"Failed to create AudioProcessing");
return -1;
}
}
if (rtp_audioproc_.get() == NULL) {
rtp_audioproc_.reset(AudioProcessing::Create(VoEModuleId(_instanceId,
_channelId)));
}
if (_rtpAudioProc->level_estimator()->Enable(enable) !=
AudioProcessing::kNoError)
{
_engineStatisticsPtr->SetLastError(VE_APM_ERROR, kTraceWarning,
"Failed to enable AudioProcessing::level_estimator()");
}
if (rtp_audioproc_->level_estimator()->Enable(enable) !=
AudioProcessing::kNoError) {
_engineStatisticsPtr->SetLastError(VE_APM_ERROR, kTraceError,
"Failed to enable AudioProcessing::level_estimator()");
return -1;
}
_includeAudioLevelIndication = enable;
if (enable) {
rtp_header_parser_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel,
ID);
} else {
rtp_header_parser_->DeregisterRtpHeaderExtension(kRtpExtensionAudioLevel);
}
return _rtpRtcpModule->SetRTPAudioLevelIndicationStatus(enable, ID);
_includeAudioLevelIndication = enable;
if (enable) {
rtp_header_parser_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel,
ID);
} else {
rtp_header_parser_->DeregisterRtpHeaderExtension(kRtpExtensionAudioLevel);
}
return _rtpRtcpModule->SetRTPAudioLevelIndicationStatus(enable, ID);
}
int
Channel::GetRTPAudioLevelIndicationStatus(bool& enabled, unsigned char& ID)
{
@ -4506,36 +4479,27 @@ Channel::PrepareEncodeAndSend(int mixingFrequency)
if (_includeAudioLevelIndication)
{
assert(_rtpAudioProc.get() != NULL);
// Check if settings need to be updated.
if (_rtpAudioProc->sample_rate_hz() != _audioFrame.sample_rate_hz_)
if (rtp_audioproc_->set_sample_rate_hz(_audioFrame.sample_rate_hz_) !=
AudioProcessing::kNoError)
{
if (_rtpAudioProc->set_sample_rate_hz(_audioFrame.sample_rate_hz_) !=
AudioProcessing::kNoError)
{
WEBRTC_TRACE(kTraceWarning, kTraceVoice,
VoEId(_instanceId, _channelId),
"Error setting AudioProcessing sample rate");
return -1;
}
WEBRTC_TRACE(kTraceWarning, kTraceVoice,
VoEId(_instanceId, _channelId),
"Error setting AudioProcessing sample rate");
return -1;
}
if (_rtpAudioProc->num_input_channels() != _audioFrame.num_channels_)
if (rtp_audioproc_->set_num_channels(_audioFrame.num_channels_,
_audioFrame.num_channels_) !=
AudioProcessing::kNoError)
{
if (_rtpAudioProc->set_num_channels(_audioFrame.num_channels_,
_audioFrame.num_channels_)
!= AudioProcessing::kNoError)
{
WEBRTC_TRACE(kTraceWarning, kTraceVoice,
VoEId(_instanceId, _channelId),
"Error setting AudioProcessing channels");
return -1;
}
WEBRTC_TRACE(kTraceWarning, kTraceVoice,
VoEId(_instanceId, _channelId),
"Error setting AudioProcessing channels");
return -1;
}
// Performs level analysis only; does not affect the signal.
_rtpAudioProc->ProcessStream(&_audioFrame);
rtp_audioproc_->ProcessStream(&_audioFrame);
}
return 0;
@ -5271,16 +5235,15 @@ Channel::RegisterReceiveCodecsToRTPModule()
}
int Channel::ApmProcessRx(AudioFrame& frame) {
AudioProcessing* audioproc = _rxAudioProcessingModulePtr;
// Register the (possibly new) frame parameters.
if (audioproc->set_sample_rate_hz(frame.sample_rate_hz_) != 0) {
if (rx_audioproc_->set_sample_rate_hz(frame.sample_rate_hz_) != 0) {
LOG_FERR1(LS_WARNING, set_sample_rate_hz, frame.sample_rate_hz_);
}
if (audioproc->set_num_channels(frame.num_channels_,
frame.num_channels_) != 0) {
if (rx_audioproc_->set_num_channels(frame.num_channels_,
frame.num_channels_) != 0) {
LOG_FERR1(LS_WARNING, set_num_channels, frame.num_channels_);
}
if (audioproc->ProcessStream(&frame) != 0) {
if (rx_audioproc_->ProcessStream(&frame) != 0) {
LOG_FERR0(LS_WARNING, ProcessStream);
}
return 0;

View File

@ -520,8 +520,8 @@ private:
CriticalSectionWrapper* _callbackCritSectPtr; // owned by base
Transport* _transportPtr; // WebRtc socket or external transport
Encryption* _encryptionPtr; // WebRtc SRTP or external encryption
scoped_ptr<AudioProcessing> _rtpAudioProc;
AudioProcessing* _rxAudioProcessingModulePtr; // far end AudioProcessing
scoped_ptr<AudioProcessing> rtp_audioproc_;
scoped_ptr<AudioProcessing> rx_audioproc_; // far end AudioProcessing
VoERxVadCallback* _rxVadObserverPtr;
int32_t _oldVadDecision;
int32_t _sendFrameType; // Send data is voice, 1-voice, 0-otherwise