output_mixer.h revision 6141e13873d0fdea626de08dfec2efa2c9171c76
1/*
2 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_VOICE_ENGINE_OUTPUT_MIXER_H_
12#define WEBRTC_VOICE_ENGINE_OUTPUT_MIXER_H_
13
14#include "audio_conference_mixer.h"
15#include "audio_conference_mixer_defines.h"
16#include "common_types.h"
17#include "dtmf_inband.h"
18#include "file_recorder.h"
19#include "level_indicator.h"
20#include "resampler.h"
21#include "voice_engine_defines.h"
22
23namespace webrtc {
24
25class AudioProcessing;
26class CriticalSectionWrapper;
27class FileWrapper;
28class VoEMediaProcess;
29
30namespace voe {
31
32class Statistics;
33
34class OutputMixer : public AudioMixerOutputReceiver,
35                    public AudioMixerStatusReceiver,
36                    public FileCallback
37{
38public:
39    static int32_t Create(OutputMixer*& mixer, const uint32_t instanceId);
40
41    static void Destroy(OutputMixer*& mixer);
42
43    int32_t SetEngineInformation(Statistics& engineStatistics);
44
45    int32_t SetAudioProcessingModule(
46        AudioProcessing* audioProcessingModule);
47
48    // VoEExternalMedia
49    int RegisterExternalMediaProcessing(
50        VoEMediaProcess& proccess_object);
51
52    int DeRegisterExternalMediaProcessing();
53
54    // VoEDtmf
55    int PlayDtmfTone(uint8_t eventCode, int lengthMs, int attenuationDb);
56
57    int StartPlayingDtmfTone(uint8_t eventCode, int attenuationDb);
58
59    int StopPlayingDtmfTone();
60
61    int32_t MixActiveChannels();
62
63    int32_t DoOperationsOnCombinedSignal();
64
65    int32_t SetMixabilityStatus(MixerParticipant& participant,
66                                const bool mixable);
67
68    int32_t SetAnonymousMixabilityStatus(MixerParticipant& participant,
69                                         const bool mixable);
70
71    int GetMixedAudio(int sample_rate_hz, int num_channels,
72                      AudioFrame* audioFrame);
73
74    // VoEVolumeControl
75    int GetSpeechOutputLevel(uint32_t& level);
76
77    int GetSpeechOutputLevelFullRange(uint32_t& level);
78
79    int SetOutputVolumePan(float left, float right);
80
81    int GetOutputVolumePan(float& left, float& right);
82
83    // VoEFile
84    int StartRecordingPlayout(const char* fileName,
85                              const CodecInst* codecInst);
86
87    int StartRecordingPlayout(OutStream* stream,
88                              const CodecInst* codecInst);
89    int StopRecordingPlayout();
90
91    virtual ~OutputMixer();
92
93    // from AudioMixerOutputReceiver
94    virtual void NewMixedAudio(
95        const int32_t id,
96        const AudioFrame& generalAudioFrame,
97        const AudioFrame** uniqueAudioFrames,
98        const uint32_t size);
99
100    // from AudioMixerStatusReceiver
101    virtual void MixedParticipants(
102        const int32_t id,
103        const ParticipantStatistics* participantStatistics,
104        const uint32_t size);
105
106    virtual void VADPositiveParticipants(
107        const int32_t id,
108        const ParticipantStatistics* participantStatistics,
109        const uint32_t size);
110
111    virtual void MixedAudioLevel(const int32_t id, const uint32_t level);
112
113    // For file recording
114    void PlayNotification(const int32_t id, const uint32_t durationMs);
115
116    void RecordNotification(const int32_t id, const uint32_t durationMs);
117
118    void PlayFileEnded(const int32_t id);
119    void RecordFileEnded(const int32_t id);
120
121private:
122    OutputMixer(const uint32_t instanceId);
123    void APMAnalyzeReverseStream();
124    int InsertInbandDtmfTone();
125
126    // uses
127    Statistics* _engineStatisticsPtr;
128    AudioProcessing* _audioProcessingModulePtr;
129
130    // owns
131    CriticalSectionWrapper& _callbackCritSect;
132    // protect the _outputFileRecorderPtr and _outputFileRecording
133    CriticalSectionWrapper& _fileCritSect;
134    AudioConferenceMixer& _mixerModule;
135    AudioFrame _audioFrame;
136    Resampler _resampler;        // converts mixed audio to fit ADM format
137    Resampler _apmResampler;    // converts mixed audio to fit APM rate
138    AudioLevel _audioLevel;    // measures audio level for the combined signal
139    DtmfInband _dtmfGenerator;
140    int _instanceId;
141    VoEMediaProcess* _externalMediaCallbackPtr;
142    bool _externalMedia;
143    float _panLeft;
144    float _panRight;
145    int _mixingFrequencyHz;
146    FileRecorder* _outputFileRecorderPtr;
147    bool _outputFileRecording;
148};
149
150}  //  namespace voe
151
152}  //  namespace werbtc
153
154#endif  // VOICE_ENGINE_OUTPUT_MIXER_H_
155