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 MODULES_AUDIO_MIXER_AUDIO_MIXER_IMPL_H_
12 #define MODULES_AUDIO_MIXER_AUDIO_MIXER_IMPL_H_
13 
14 #include <memory>
15 #include <vector>
16 
17 #include "api/audio/audio_mixer.h"
18 #include "modules/audio_mixer/frame_combiner.h"
19 #include "modules/audio_mixer/output_rate_calculator.h"
20 #include "modules/audio_processing/include/audio_processing.h"
21 #include "modules/include/module_common_types.h"
22 #include "rtc_base/race_checker.h"
23 #include "rtc_base/scoped_ref_ptr.h"
24 #include "rtc_base/thread_annotations.h"
25 #include "typedefs.h"  // NOLINT(build/include)
26 
27 namespace webrtc {
28 
29 typedef std::vector<AudioFrame*> AudioFrameList;
30 
31 class AudioMixerImpl : public AudioMixer {
32  public:
33   struct SourceStatus {
SourceStatusSourceStatus34     SourceStatus(Source* audio_source, bool is_mixed, float gain)
35         : audio_source(audio_source), is_mixed(is_mixed), gain(gain) {}
36     Source* audio_source = nullptr;
37     bool is_mixed = false;
38     float gain = 0.0f;
39 
40     // A frame that will be passed to audio_source->GetAudioFrameWithInfo.
41     AudioFrame audio_frame;
42   };
43 
44   using SourceStatusList = std::vector<std::unique_ptr<SourceStatus>>;
45 
46   // AudioProcessing only accepts 10 ms frames.
47   static const int kFrameDurationInMs = 10;
48   static const int kMaximumAmountOfMixedAudioSources = 3;
49 
50   static rtc::scoped_refptr<AudioMixerImpl> Create();
51 
52   static rtc::scoped_refptr<AudioMixerImpl> Create(
53       std::unique_ptr<OutputRateCalculator> output_rate_calculator,
54       bool use_limiter);
55 
56   ~AudioMixerImpl() override;
57 
58   // AudioMixer functions
59   bool AddSource(Source* audio_source) override;
60   void RemoveSource(Source* audio_source) override;
61 
62   void Mix(size_t number_of_channels,
63            AudioFrame* audio_frame_for_mixing) override
64       RTC_LOCKS_EXCLUDED(crit_);
65 
66   // Returns true if the source was mixed last round. Returns
67   // false and logs an error if the source was never added to the
68   // mixer.
69   bool GetAudioSourceMixabilityStatusForTest(Source* audio_source) const;
70 
71  protected:
72   AudioMixerImpl(std::unique_ptr<OutputRateCalculator> output_rate_calculator,
73                  bool use_limiter);
74 
75  private:
76   // Set mixing frequency through OutputFrequencyCalculator.
77   void CalculateOutputFrequency();
78   // Get mixing frequency.
79   int OutputFrequency() const;
80 
81   // Compute what audio sources to mix from audio_source_list_. Ramp
82   // in and out. Update mixed status. Mixes up to
83   // kMaximumAmountOfMixedAudioSources audio sources.
84   AudioFrameList GetAudioFromSources() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
85 
86   // Add/remove the MixerAudioSource to the specified
87   // MixerAudioSource list.
88   bool AddAudioSourceToList(Source* audio_source,
89                             SourceStatusList* audio_source_list) const;
90   bool RemoveAudioSourceFromList(Source* remove_audio_source,
91                                  SourceStatusList* audio_source_list) const;
92 
93   // The critical section lock guards audio source insertion and
94   // removal, which can be done from any thread. The race checker
95   // checks that mixing is done sequentially.
96   rtc::CriticalSection crit_;
97   rtc::RaceChecker race_checker_;
98 
99   std::unique_ptr<OutputRateCalculator> output_rate_calculator_;
100   // The current sample frequency and sample size when mixing.
101   int output_frequency_ RTC_GUARDED_BY(race_checker_);
102   size_t sample_size_ RTC_GUARDED_BY(race_checker_);
103 
104   // List of all audio sources. Note all lists are disjunct
105   SourceStatusList audio_source_list_ RTC_GUARDED_BY(crit_);  // May be mixed.
106 
107   // Component that handles actual adding of audio frames.
108   FrameCombiner frame_combiner_ RTC_GUARDED_BY(race_checker_);
109 
110   RTC_DISALLOW_COPY_AND_ASSIGN(AudioMixerImpl);
111 };
112 }  // namespace webrtc
113 
114 #endif  // MODULES_AUDIO_MIXER_AUDIO_MIXER_IMPL_H_
115