277 lines
6.3 KiB
C
277 lines
6.3 KiB
C
|
/*
|
||
|
* Copyright (c) 2011 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_MODULES_AUDIO_CONFERENCE_MIXER_TEST_FUNCTIONTEST_FUNCTIONTEST_H_
|
||
|
#define WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_TEST_FUNCTIONTEST_FUNCTIONTEST_H_
|
||
|
|
||
|
#include "module_common_types.h"
|
||
|
#include "level_indicator.h"
|
||
|
#include "list_wrapper.h"
|
||
|
#include "map_wrapper.h"
|
||
|
#include "audio_conference_mixer.h"
|
||
|
#include "audio_conference_mixer_defines.h"
|
||
|
#include "tick_util.h"
|
||
|
|
||
|
namespace webrtc {
|
||
|
class EventWrapper;
|
||
|
class ThreadWrapper;
|
||
|
class Trace;
|
||
|
}
|
||
|
struct WebRtcVadInst;
|
||
|
|
||
|
class FileWriter
|
||
|
{
|
||
|
public:
|
||
|
FileWriter();
|
||
|
~FileWriter();
|
||
|
|
||
|
bool SetFileName(
|
||
|
const char* fileName);
|
||
|
|
||
|
bool WriteToFile(
|
||
|
const AudioFrame& audioFrame);
|
||
|
private:
|
||
|
FILE* _file;
|
||
|
};
|
||
|
|
||
|
class FileReader
|
||
|
{
|
||
|
public:
|
||
|
enum {kProcessPeriodicityInMs = 10};
|
||
|
enum Frequency
|
||
|
{
|
||
|
kNbInHz = 8000,
|
||
|
kWbInHz = 16000,
|
||
|
kDefaultFrequency = kWbInHz
|
||
|
};
|
||
|
|
||
|
FileReader();
|
||
|
~FileReader();
|
||
|
|
||
|
bool SetFileName(
|
||
|
const char* fileName);
|
||
|
|
||
|
bool ReadFromFile(
|
||
|
AudioFrame& audioFrame);
|
||
|
|
||
|
bool FastForwardFile(
|
||
|
const WebRtc_Word32 samples);
|
||
|
|
||
|
bool EnableAutomaticVAD(
|
||
|
bool enable,
|
||
|
int mode);
|
||
|
|
||
|
bool SetVAD(
|
||
|
bool vad);
|
||
|
private:
|
||
|
bool GetVAD(
|
||
|
WebRtc_Word16* buffer,
|
||
|
WebRtc_UWord8 bufferLengthInSamples,
|
||
|
bool& vad);
|
||
|
|
||
|
Frequency _frequency;
|
||
|
WebRtc_UWord8 _sampleSize;
|
||
|
|
||
|
WebRtc_UWord32 _timeStamp;
|
||
|
|
||
|
FILE* _file;
|
||
|
|
||
|
WebRtcVadInst* _vadInstr;
|
||
|
bool _automaticVad;
|
||
|
bool _vad;
|
||
|
|
||
|
LevelIndicator _volumeCalculator;
|
||
|
};
|
||
|
|
||
|
class MixerParticipant : public MixerParticipant
|
||
|
{
|
||
|
public:
|
||
|
enum ParticipantType
|
||
|
{
|
||
|
VIP = 0,
|
||
|
REGULAR = 1,
|
||
|
MIXED_ANONYMOUS = 2,
|
||
|
RANDOM = 3
|
||
|
};
|
||
|
|
||
|
static MixerParticipant* CreateParticipant(
|
||
|
const WebRtc_UWord32 id,
|
||
|
ParticipantType participantType,
|
||
|
const WebRtc_Word32 startPosition,
|
||
|
char* outputPath);
|
||
|
~MixerParticipant();
|
||
|
|
||
|
WebRtc_Word32 GetAudioFrame(
|
||
|
const WebRtc_Word32 id,
|
||
|
AudioFrame& audioFrame);
|
||
|
|
||
|
WebRtc_Word32 MixedAudioFrame(
|
||
|
const AudioFrame& audioFrame);
|
||
|
|
||
|
WebRtc_Word32 GetParticipantType(
|
||
|
ParticipantType& participantType);
|
||
|
private:
|
||
|
MixerParticipant(
|
||
|
const WebRtc_UWord32 id,
|
||
|
ParticipantType participantType);
|
||
|
|
||
|
bool InitializeFileReader(
|
||
|
const WebRtc_Word32 startPositionInSamples);
|
||
|
|
||
|
bool InitializeFileWriter(
|
||
|
char* outputPath);
|
||
|
|
||
|
WebRtc_UWord32 _id;
|
||
|
ParticipantType _participantType;
|
||
|
|
||
|
FileReader _fileReader;
|
||
|
FileWriter _fileWriter;
|
||
|
};
|
||
|
|
||
|
class StatusReceiver : public AudioMixerStatusReceiver
|
||
|
{
|
||
|
public:
|
||
|
StatusReceiver(
|
||
|
const WebRtc_Word32 id);
|
||
|
~StatusReceiver();
|
||
|
|
||
|
void MixedParticipants(
|
||
|
const WebRtc_Word32 id,
|
||
|
const ParticipantStatistics* participantStatistics,
|
||
|
const WebRtc_UWord32 size);
|
||
|
|
||
|
void VADPositiveParticipants(
|
||
|
const WebRtc_Word32 id,
|
||
|
const ParticipantStatistics* participantStatistics,
|
||
|
const WebRtc_UWord32 size);
|
||
|
|
||
|
void MixedAudioLevel(
|
||
|
const WebRtc_Word32 id,
|
||
|
const WebRtc_UWord32 level);
|
||
|
|
||
|
void PrintMixedParticipants();
|
||
|
|
||
|
void PrintVadPositiveParticipants();
|
||
|
|
||
|
void PrintMixedAudioLevel();
|
||
|
private:
|
||
|
WebRtc_Word32 _id;
|
||
|
|
||
|
ParticipantStatistics* _mixedParticipants;
|
||
|
WebRtc_UWord32 _mixedParticipantsAmount;
|
||
|
WebRtc_UWord32 _mixedParticipantsSize;
|
||
|
|
||
|
ParticipantStatistics* _vadPositiveParticipants;
|
||
|
WebRtc_UWord32 _vadPositiveParticipantsAmount;
|
||
|
WebRtc_UWord32 _vadPositiveParticipantsSize;
|
||
|
|
||
|
WebRtc_UWord32 _mixedAudioLevel;
|
||
|
};
|
||
|
|
||
|
class MixerWrapper : public AudioMixerOutputReceiver
|
||
|
{
|
||
|
public:
|
||
|
static MixerWrapper* CreateMixerWrapper();
|
||
|
~MixerWrapper();
|
||
|
|
||
|
bool SetMixFrequency(
|
||
|
const AudioConferenceMixer::Frequency frequency);
|
||
|
|
||
|
bool CreateParticipant(
|
||
|
MixerParticipant::ParticipantType participantType);
|
||
|
|
||
|
bool CreateParticipant(
|
||
|
MixerParticipant::ParticipantType participantType,
|
||
|
const WebRtc_Word32 startPosition);
|
||
|
|
||
|
bool DeleteParticipant(
|
||
|
const WebRtc_UWord32 id);
|
||
|
|
||
|
bool StartMixing(
|
||
|
const WebRtc_UWord32 mixedParticipants = AudioConferenceMixer::kDefaultAmountOfMixedParticipants);
|
||
|
|
||
|
bool StopMixing();
|
||
|
|
||
|
void NewMixedAudio(
|
||
|
const WebRtc_Word32 id,
|
||
|
const AudioFrame& generalAudioFrame,
|
||
|
const AudioFrame** uniqueAudioFrames,
|
||
|
const WebRtc_UWord32 size);
|
||
|
|
||
|
bool GetParticipantList(
|
||
|
ListWrapper& participants);
|
||
|
|
||
|
void PrintStatus();
|
||
|
private:
|
||
|
MixerWrapper();
|
||
|
|
||
|
bool InitializeFileWriter();
|
||
|
|
||
|
static bool Process(
|
||
|
void* instance);
|
||
|
|
||
|
bool Process();
|
||
|
|
||
|
bool StartMixingParticipant(
|
||
|
const WebRtc_UWord32 id);
|
||
|
|
||
|
bool StopMixingParticipant(
|
||
|
const WebRtc_UWord32 id);
|
||
|
|
||
|
bool GetFreeItemIds(
|
||
|
WebRtc_UWord32& itemId);
|
||
|
|
||
|
void AddFreeItemIds(
|
||
|
const WebRtc_UWord32 itemId);
|
||
|
|
||
|
void ClearAllItemIds();
|
||
|
|
||
|
webrtc::ThreadWrapper* _processThread;
|
||
|
unsigned int _threadId;
|
||
|
|
||
|
// Performance hooks
|
||
|
enum{WARNING_COUNTER = 100};
|
||
|
|
||
|
bool _firstProcessCall;
|
||
|
TickTime _previousTime; // Tick time of previous process
|
||
|
const WebRtc_Word64 _periodicityInTicks; // Periodicity
|
||
|
|
||
|
webrtc::EventWrapper* _synchronizationEvent;
|
||
|
|
||
|
ListWrapper _freeItemIds;
|
||
|
WebRtc_UWord32 _itemIdCounter;
|
||
|
|
||
|
MapWrapper _mixerParticipants;
|
||
|
|
||
|
static WebRtc_Word32 _mixerWrapperIdCounter;
|
||
|
WebRtc_Word32 _mixerWrappererId;
|
||
|
char _instanceOutputPath[128];
|
||
|
|
||
|
webrtc::Trace* _trace;
|
||
|
AudioConferenceMixer* _mixer;
|
||
|
|
||
|
StatusReceiver _statusReceiver;
|
||
|
|
||
|
FileWriter _generalAudioWriter;
|
||
|
};
|
||
|
|
||
|
bool
|
||
|
LoopedFileRead(
|
||
|
WebRtc_Word16* buffer,
|
||
|
WebRtc_UWord32 bufferSizeInSamples,
|
||
|
WebRtc_UWord32 samplesToRead,
|
||
|
FILE* file);
|
||
|
|
||
|
void
|
||
|
GenerateRandomPosition(
|
||
|
WebRtc_Word32& startPosition);
|
||
|
|
||
|
#endif // WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_TEST_FUNCTIONTEST_FUNCTIONTEST_H_
|