1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #ifndef API_AUDIO_AUDIO_MIXER_H_ 12*d9f75844SAndroid Build Coastguard Worker #define API_AUDIO_AUDIO_MIXER_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <memory> 15*d9f75844SAndroid Build Coastguard Worker 16*d9f75844SAndroid Build Coastguard Worker #include "api/audio/audio_frame.h" 17*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/ref_count.h" 18*d9f75844SAndroid Build Coastguard Worker 19*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 20*d9f75844SAndroid Build Coastguard Worker 21*d9f75844SAndroid Build Coastguard Worker // WORK IN PROGRESS 22*d9f75844SAndroid Build Coastguard Worker // This class is under development and is not yet intended for for use outside 23*d9f75844SAndroid Build Coastguard Worker // of WebRtc/Libjingle. 24*d9f75844SAndroid Build Coastguard Worker class AudioMixer : public rtc::RefCountInterface { 25*d9f75844SAndroid Build Coastguard Worker public: 26*d9f75844SAndroid Build Coastguard Worker // A callback class that all mixer participants must inherit from/implement. 27*d9f75844SAndroid Build Coastguard Worker class Source { 28*d9f75844SAndroid Build Coastguard Worker public: 29*d9f75844SAndroid Build Coastguard Worker enum class AudioFrameInfo { 30*d9f75844SAndroid Build Coastguard Worker kNormal, // The samples in audio_frame are valid and should be used. 31*d9f75844SAndroid Build Coastguard Worker kMuted, // The samples in audio_frame should not be used, but 32*d9f75844SAndroid Build Coastguard Worker // should be implicitly interpreted as zero. Other 33*d9f75844SAndroid Build Coastguard Worker // fields in audio_frame may be read and should 34*d9f75844SAndroid Build Coastguard Worker // contain meaningful values. 35*d9f75844SAndroid Build Coastguard Worker kError, // The audio_frame will not be used. 36*d9f75844SAndroid Build Coastguard Worker }; 37*d9f75844SAndroid Build Coastguard Worker 38*d9f75844SAndroid Build Coastguard Worker // Overwrites `audio_frame`. The data_ field is overwritten with 39*d9f75844SAndroid Build Coastguard Worker // 10 ms of new audio (either 1 or 2 interleaved channels) at 40*d9f75844SAndroid Build Coastguard Worker // `sample_rate_hz`. All fields in `audio_frame` must be updated. 41*d9f75844SAndroid Build Coastguard Worker virtual AudioFrameInfo GetAudioFrameWithInfo(int sample_rate_hz, 42*d9f75844SAndroid Build Coastguard Worker AudioFrame* audio_frame) = 0; 43*d9f75844SAndroid Build Coastguard Worker 44*d9f75844SAndroid Build Coastguard Worker // A way for a mixer implementation to distinguish participants. 45*d9f75844SAndroid Build Coastguard Worker virtual int Ssrc() const = 0; 46*d9f75844SAndroid Build Coastguard Worker 47*d9f75844SAndroid Build Coastguard Worker // A way for this source to say that GetAudioFrameWithInfo called 48*d9f75844SAndroid Build Coastguard Worker // with this sample rate or higher will not cause quality loss. 49*d9f75844SAndroid Build Coastguard Worker virtual int PreferredSampleRate() const = 0; 50*d9f75844SAndroid Build Coastguard Worker ~Source()51*d9f75844SAndroid Build Coastguard Worker virtual ~Source() {} 52*d9f75844SAndroid Build Coastguard Worker }; 53*d9f75844SAndroid Build Coastguard Worker 54*d9f75844SAndroid Build Coastguard Worker // Returns true if adding was successful. A source is never added 55*d9f75844SAndroid Build Coastguard Worker // twice. Addition and removal can happen on different threads. 56*d9f75844SAndroid Build Coastguard Worker virtual bool AddSource(Source* audio_source) = 0; 57*d9f75844SAndroid Build Coastguard Worker 58*d9f75844SAndroid Build Coastguard Worker // Removal is never attempted if a source has not been successfully 59*d9f75844SAndroid Build Coastguard Worker // added to the mixer. 60*d9f75844SAndroid Build Coastguard Worker virtual void RemoveSource(Source* audio_source) = 0; 61*d9f75844SAndroid Build Coastguard Worker 62*d9f75844SAndroid Build Coastguard Worker // Performs mixing by asking registered audio sources for audio. The 63*d9f75844SAndroid Build Coastguard Worker // mixed result is placed in the provided AudioFrame. This method 64*d9f75844SAndroid Build Coastguard Worker // will only be called from a single thread. The channels argument 65*d9f75844SAndroid Build Coastguard Worker // specifies the number of channels of the mix result. The mixer 66*d9f75844SAndroid Build Coastguard Worker // should mix at a rate that doesn't cause quality loss of the 67*d9f75844SAndroid Build Coastguard Worker // sources' audio. The mixing rate is one of the rates listed in 68*d9f75844SAndroid Build Coastguard Worker // AudioProcessing::NativeRate. All fields in 69*d9f75844SAndroid Build Coastguard Worker // `audio_frame_for_mixing` must be updated. 70*d9f75844SAndroid Build Coastguard Worker virtual void Mix(size_t number_of_channels, 71*d9f75844SAndroid Build Coastguard Worker AudioFrame* audio_frame_for_mixing) = 0; 72*d9f75844SAndroid Build Coastguard Worker 73*d9f75844SAndroid Build Coastguard Worker protected: 74*d9f75844SAndroid Build Coastguard Worker // Since the mixer is reference counted, the destructor may be 75*d9f75844SAndroid Build Coastguard Worker // called from any thread. ~AudioMixer()76*d9f75844SAndroid Build Coastguard Worker ~AudioMixer() override {} 77*d9f75844SAndroid Build Coastguard Worker }; 78*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 79*d9f75844SAndroid Build Coastguard Worker 80*d9f75844SAndroid Build Coastguard Worker #endif // API_AUDIO_AUDIO_MIXER_H_ 81