| /* |
| * 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_ |