blob: f25e5f16f36d158f74dc0d17d616423f0d3d46dd [file] [log] [blame]
/*
* 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_