r4326 was mistakenly committed to stable, so this is to re-merge back to trunk. Fixed the AGC and interface problems on the new path. In order to make the AGC work properly, we need to cache the volume value passed by the callback, compare it with the value returned by shared->transmit_mixer()->CaptureLevel(). If they are the same, we need to return 0 to indicate no volume needs changing, otherwise return the new volume. By doing this, we avoid setting the volume all the same, which allows the users to change the volume manually. This patch also fixes some minor issues with the interfaces too: make the int channel[] const, and correct the order of the input params in channel::Demultiplex. R=tommi@webrtc.org BUG=[2134] TEST=compile && manual AGC test Review URL: https://webrtc-codereview.appspot.com/1921004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@4450 4adac7df-926f-26a2-2b94-8c16560cd09d
235 lines
6.7 KiB
C++
235 lines
6.7 KiB
C++
/*
|
|
* 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 WEBRTC_AUDIO_DEVICE_FUNC_TEST_MANAGER_H
|
|
#define WEBRTC_AUDIO_DEVICE_FUNC_TEST_MANAGER_H
|
|
|
|
#include "webrtc/modules/audio_device/audio_device_utility.h"
|
|
|
|
#include <string>
|
|
|
|
#include "webrtc/common_audio/resampler/include/resampler.h"
|
|
#include "webrtc/modules/audio_device/include/audio_device.h"
|
|
#include "webrtc/modules/audio_device/test/audio_device_test_defines.h"
|
|
#include "webrtc/system_wrappers/interface/file_wrapper.h"
|
|
#include "webrtc/system_wrappers/interface/list_wrapper.h"
|
|
#include "webrtc/typedefs.h"
|
|
|
|
#if defined(WEBRTC_IOS) || defined(ANDROID)
|
|
#define USE_SLEEP_AS_PAUSE
|
|
#else
|
|
//#define USE_SLEEP_AS_PAUSE
|
|
#endif
|
|
|
|
// Sets the default pause time if using sleep as pause
|
|
#define DEFAULT_PAUSE_TIME 5000
|
|
|
|
#if defined(USE_SLEEP_AS_PAUSE)
|
|
#define PAUSE(a) SleepMs(a);
|
|
#else
|
|
#define PAUSE(a) AudioDeviceUtility::WaitForKey();
|
|
#endif
|
|
|
|
#define ADM_AUDIO_LAYER AudioDeviceModule::kPlatformDefaultAudio
|
|
//#define ADM_AUDIO_LAYER AudioDeviceModule::kLinuxPulseAudio
|
|
|
|
enum TestType
|
|
{
|
|
TTInvalid = -1,
|
|
TTAll = 0,
|
|
TTAudioLayerSelection = 1,
|
|
TTDeviceEnumeration = 2,
|
|
TTDeviceSelection = 3,
|
|
TTAudioTransport = 4,
|
|
TTSpeakerVolume = 5,
|
|
TTMicrophoneVolume = 6,
|
|
TTSpeakerMute = 7,
|
|
TTMicrophoneMute = 8,
|
|
TTMicrophoneBoost = 9,
|
|
TTMicrophoneAGC = 10,
|
|
TTLoopback = 11,
|
|
TTDeviceRemoval = 13,
|
|
TTMobileAPI = 14,
|
|
TTTest = 66,
|
|
};
|
|
|
|
class ProcessThread;
|
|
|
|
namespace webrtc
|
|
{
|
|
|
|
class AudioDeviceModule;
|
|
class AudioEventObserver;
|
|
class AudioTransport;
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// AudioEventObserver
|
|
// ----------------------------------------------------------------------------
|
|
|
|
class AudioEventObserver: public AudioDeviceObserver
|
|
{
|
|
public:
|
|
virtual void OnErrorIsReported(const ErrorCode error);
|
|
virtual void OnWarningIsReported(const WarningCode warning);
|
|
AudioEventObserver(AudioDeviceModule* audioDevice);
|
|
~AudioEventObserver();
|
|
public:
|
|
ErrorCode _error;
|
|
WarningCode _warning;
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// AudioTransport
|
|
// ----------------------------------------------------------------------------
|
|
|
|
class AudioTransportImpl: public AudioTransport
|
|
{
|
|
public:
|
|
virtual int32_t
|
|
RecordedDataIsAvailable(const void* audioSamples,
|
|
const uint32_t nSamples,
|
|
const uint8_t nBytesPerSample,
|
|
const uint8_t nChannels,
|
|
const uint32_t samplesPerSec,
|
|
const uint32_t totalDelayMS,
|
|
const int32_t clockDrift,
|
|
const uint32_t currentMicLevel,
|
|
const bool keyPressed,
|
|
uint32_t& newMicLevel);
|
|
|
|
virtual int32_t NeedMorePlayData(const uint32_t nSamples,
|
|
const uint8_t nBytesPerSample,
|
|
const uint8_t nChannels,
|
|
const uint32_t samplesPerSec,
|
|
void* audioSamples,
|
|
uint32_t& nSamplesOut);
|
|
|
|
virtual int OnDataAvailable(const int voe_channels[],
|
|
int number_of_voe_channels,
|
|
const int16_t* audio_data,
|
|
int sample_rate,
|
|
int number_of_channels,
|
|
int number_of_frames,
|
|
int audio_delay_milliseconds,
|
|
int current_volume,
|
|
bool key_pressed,
|
|
bool need_audio_processing);
|
|
|
|
AudioTransportImpl(AudioDeviceModule* audioDevice);
|
|
~AudioTransportImpl();
|
|
|
|
public:
|
|
int32_t SetFilePlayout(bool enable, const char* fileName = NULL);
|
|
void SetFullDuplex(bool enable);
|
|
void SetSpeakerVolume(bool enable)
|
|
{
|
|
_speakerVolume = enable;
|
|
}
|
|
;
|
|
void SetSpeakerMute(bool enable)
|
|
{
|
|
_speakerMute = enable;
|
|
}
|
|
;
|
|
void SetMicrophoneMute(bool enable)
|
|
{
|
|
_microphoneMute = enable;
|
|
}
|
|
;
|
|
void SetMicrophoneVolume(bool enable)
|
|
{
|
|
_microphoneVolume = enable;
|
|
}
|
|
;
|
|
void SetMicrophoneBoost(bool enable)
|
|
{
|
|
_microphoneBoost = enable;
|
|
}
|
|
;
|
|
void SetLoopbackMeasurements(bool enable)
|
|
{
|
|
_loopBackMeasurements = enable;
|
|
}
|
|
;
|
|
void SetMicrophoneAGC(bool enable)
|
|
{
|
|
_microphoneAGC = enable;
|
|
}
|
|
;
|
|
|
|
private:
|
|
AudioDeviceModule* _audioDevice;
|
|
|
|
bool _playFromFile;
|
|
bool _fullDuplex;
|
|
bool _speakerVolume;
|
|
bool _speakerMute;
|
|
bool _microphoneVolume;
|
|
bool _microphoneMute;
|
|
bool _microphoneBoost;
|
|
bool _microphoneAGC;
|
|
bool _loopBackMeasurements;
|
|
|
|
FileWrapper& _playFile;
|
|
|
|
uint32_t _recCount;
|
|
uint32_t _playCount;
|
|
|
|
ListWrapper _audioList;
|
|
|
|
Resampler _resampler;
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// FuncTestManager
|
|
// ----------------------------------------------------------------------------
|
|
|
|
class FuncTestManager
|
|
{
|
|
public:
|
|
FuncTestManager();
|
|
~FuncTestManager();
|
|
int32_t Init();
|
|
int32_t Close();
|
|
int32_t DoTest(const TestType testType);
|
|
private:
|
|
int32_t TestAudioLayerSelection();
|
|
int32_t TestDeviceEnumeration();
|
|
int32_t TestDeviceSelection();
|
|
int32_t TestAudioTransport();
|
|
int32_t TestSpeakerVolume();
|
|
int32_t TestMicrophoneVolume();
|
|
int32_t TestSpeakerMute();
|
|
int32_t TestMicrophoneMute();
|
|
int32_t TestMicrophoneBoost();
|
|
int32_t TestLoopback();
|
|
int32_t TestDeviceRemoval();
|
|
int32_t TestExtra();
|
|
int32_t TestMicrophoneAGC();
|
|
int32_t SelectPlayoutDevice();
|
|
int32_t SelectRecordingDevice();
|
|
int32_t TestAdvancedMBAPI();
|
|
private:
|
|
// Paths to where the resource files to be used for this test are located.
|
|
std::string _playoutFile48;
|
|
std::string _playoutFile44;
|
|
std::string _playoutFile16;
|
|
std::string _playoutFile8;
|
|
|
|
ProcessThread* _processThread;
|
|
AudioDeviceModule* _audioDevice;
|
|
AudioEventObserver* _audioEventObserver;
|
|
AudioTransportImpl* _audioTransport;
|
|
};
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // #ifndef WEBRTC_AUDIO_DEVICE_FUNC_TEST_MANAGER_H
|