Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(730)

Side by Side Diff: webrtc/modules/audio_mixer/audio_mixer_impl.h

Issue 2286343002: Less lock acquisitions for AudioMixer. (Closed)
Patch Set: Rebase. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | webrtc/modules/audio_mixer/audio_mixer_impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 55
56 private: 56 private:
57 bool is_mixed_; 57 bool is_mixed_;
58 }; 58 };
59 59
60 class AudioMixerImpl : public AudioMixer { 60 class AudioMixerImpl : public AudioMixer {
61 public: 61 public:
62 // AudioProcessing only accepts 10 ms frames. 62 // AudioProcessing only accepts 10 ms frames.
63 static const int kFrameDurationInMs = 10; 63 static const int kFrameDurationInMs = 10;
64 64
65 explicit AudioMixerImpl(int id); 65 static std::unique_ptr<AudioMixer> Create(int id);
66 66
67 ~AudioMixerImpl() override; 67 ~AudioMixerImpl() override;
68 68
69 // Must be called after ctor.
70 bool Init();
71
72 // AudioMixer functions 69 // AudioMixer functions
73 int32_t SetMixabilityStatus(MixerAudioSource* audio_source, 70 int32_t SetMixabilityStatus(MixerAudioSource* audio_source,
74 bool mixable) override; 71 bool mixable) override;
75 bool MixabilityStatus(const MixerAudioSource& audio_source) const override; 72 bool MixabilityStatus(const MixerAudioSource& audio_source) const override;
76 int32_t SetAnonymousMixabilityStatus(MixerAudioSource* audio_source, 73 int32_t SetAnonymousMixabilityStatus(MixerAudioSource* audio_source,
77 bool mixable) override; 74 bool mixable) override;
78 void Mix(int sample_rate, 75 void Mix(int sample_rate,
79 size_t number_of_channels, 76 size_t number_of_channels,
80 AudioFrame* audio_frame_for_mixing) override; 77 AudioFrame* audio_frame_for_mixing) override;
81 bool AnonymousMixabilityStatus( 78 bool AnonymousMixabilityStatus(
82 const MixerAudioSource& audio_source) const override; 79 const MixerAudioSource& audio_source) const override;
83 80
84 private: 81 private:
82 AudioMixerImpl(int id, std::unique_ptr<AudioProcessing> limiter);
83
85 // Set/get mix frequency 84 // Set/get mix frequency
86 int32_t SetOutputFrequency(const Frequency& frequency); 85 int32_t SetOutputFrequency(const Frequency& frequency);
87 Frequency OutputFrequency() const; 86 Frequency OutputFrequency() const;
88 87
89 // Compute what audio sources to mix from audio_source_list_. Ramp in 88 // Compute what audio sources to mix from audio_source_list_. Ramp in
90 // and out. Update mixed status. maxAudioFrameCounter specifies how 89 // and out. Update mixed status. maxAudioFrameCounter specifies how
91 // many participants are allowed to be mixed. 90 // many participants are allowed to be mixed.
92 AudioFrameList UpdateToMix(size_t maxAudioFrameCounter) const; 91 AudioFrameList UpdateToMix(size_t maxAudioFrameCounter) const
92 EXCLUSIVE_LOCKS_REQUIRED(crit_);
93 93
94 // Return the lowest mixing frequency that can be used without having to 94 // Return the lowest mixing frequency that can be used without having to
95 // downsample any audio. 95 // downsample any audio.
96 int32_t GetLowestMixingFrequency() const; 96 int32_t GetLowestMixingFrequency() const;
97 int32_t GetLowestMixingFrequencyFromList( 97 int32_t GetLowestMixingFrequencyFromList(
98 const MixerAudioSourceList& mixList) const; 98 const MixerAudioSourceList& mixList) const;
99 99
100 // Return the AudioFrames that should be mixed anonymously. 100 // Return the AudioFrames that should be mixed anonymously.
101 void GetAdditionalAudio(AudioFrameList* additionalFramesList) const; 101 void GetAdditionalAudio(AudioFrameList* additionalFramesList) const
102 EXCLUSIVE_LOCKS_REQUIRED(crit_);
102 103
103 // This function returns true if it finds the MixerAudioSource in the 104 // This function returns true if it finds the MixerAudioSource in the
104 // specified list of MixerAudioSources. 105 // specified list of MixerAudioSources.
105 bool IsAudioSourceInList(const MixerAudioSource& audio_source, 106 bool IsAudioSourceInList(const MixerAudioSource& audio_source,
106 const MixerAudioSourceList& audioSourceList) const; 107 const MixerAudioSourceList& audioSourceList) const;
107 108
108 // Add/remove the MixerAudioSource to the specified 109 // Add/remove the MixerAudioSource to the specified
109 // MixerAudioSource list. 110 // MixerAudioSource list.
110 bool AddAudioSourceToList(MixerAudioSource* audio_source, 111 bool AddAudioSourceToList(MixerAudioSource* audio_source,
111 MixerAudioSourceList* audioSourceList) const; 112 MixerAudioSourceList* audioSourceList) const;
(...skipping 12 matching lines...) Expand all
124 int32_t MixAnonomouslyFromList(AudioFrame* mixedAudio, 125 int32_t MixAnonomouslyFromList(AudioFrame* mixedAudio,
125 const AudioFrameList& audioFrameList) const; 126 const AudioFrameList& audioFrameList) const;
126 127
127 bool LimitMixedAudio(AudioFrame* mixedAudio) const; 128 bool LimitMixedAudio(AudioFrame* mixedAudio) const;
128 129
129 // Output level functions for VoEVolumeControl. 130 // Output level functions for VoEVolumeControl.
130 int GetOutputAudioLevel() override; 131 int GetOutputAudioLevel() override;
131 132
132 int GetOutputAudioLevelFullRange() override; 133 int GetOutputAudioLevelFullRange() override;
133 134
134 std::unique_ptr<CriticalSectionWrapper> crit_; 135 rtc::CriticalSection crit_;
135 std::unique_ptr<CriticalSectionWrapper> cb_crit_;
136 136
137 int32_t id_; 137 const int32_t id_;
138 138
139 // The current sample frequency and sample size when mixing. 139 // The current sample frequency and sample size when mixing.
140 Frequency output_frequency_; 140 Frequency output_frequency_ ACCESS_ON(&thread_checker_);
141 size_t sample_size_; 141 size_t sample_size_ ACCESS_ON(&thread_checker_);
142 142
143 // List of all audio sources. Note all lists are disjunct 143 // List of all audio sources. Note all lists are disjunct
144 MixerAudioSourceList audio_source_list_; // May be mixed. 144 MixerAudioSourceList audio_source_list_ GUARDED_BY(crit_); // May be mixed.
145 145
146 // Always mixed, anonomously. 146 // Always mixed, anonomously.
147 MixerAudioSourceList additional_audio_source_list_; 147 MixerAudioSourceList additional_audio_source_list_ GUARDED_BY(crit_);
148 148
149 size_t num_mixed_audio_sources_; 149 size_t num_mixed_audio_sources_ GUARDED_BY(crit_);
150 // Determines if we will use a limiter for clipping protection during 150 // Determines if we will use a limiter for clipping protection during
151 // mixing. 151 // mixing.
152 bool use_limiter_; 152 bool use_limiter_ ACCESS_ON(&thread_checker_);
153 153
154 uint32_t time_stamp_; 154 uint32_t time_stamp_ ACCESS_ON(&thread_checker_);
155 155
156 // Ensures that Mix is called from the same thread. 156 // Ensures that Mix is called from the same thread.
157 rtc::ThreadChecker thread_checker_; 157 rtc::ThreadChecker thread_checker_;
158 158
159 // Used for inhibiting saturation in mixing. 159 // Used for inhibiting saturation in mixing.
160 std::unique_ptr<AudioProcessing> limiter_; 160 std::unique_ptr<AudioProcessing> limiter_ ACCESS_ON(&thread_checker_);
161 161
162 // Measures audio level for the combined signal. 162 // Measures audio level for the combined signal.
163 voe::AudioLevel audio_level_; 163 voe::AudioLevel audio_level_ ACCESS_ON(&thread_checker_);
164 }; 164 };
165 } // namespace webrtc 165 } // namespace webrtc
166 166
167 #endif // WEBRTC_MODULES_AUDIO_MIXER_AUDIO_MIXER_IMPL_H_ 167 #endif // WEBRTC_MODULES_AUDIO_MIXER_AUDIO_MIXER_IMPL_H_
OLDNEW
« no previous file with comments | « no previous file | webrtc/modules/audio_mixer/audio_mixer_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698