OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2010 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2010 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 |
11 #ifndef WEBRTC_MEDIA_ENGINE_FAKEWEBRTCVOICEENGINE_H_ | 11 #ifndef WEBRTC_MEDIA_ENGINE_FAKEWEBRTCVOICEENGINE_H_ |
12 #define WEBRTC_MEDIA_ENGINE_FAKEWEBRTCVOICEENGINE_H_ | 12 #define WEBRTC_MEDIA_ENGINE_FAKEWEBRTCVOICEENGINE_H_ |
13 | 13 |
14 #include <list> | 14 #include <list> |
15 #include <map> | 15 #include <map> |
16 #include <vector> | 16 #include <vector> |
17 | 17 |
18 #include "webrtc/base/basictypes.h" | 18 #include "webrtc/base/basictypes.h" |
19 #include "webrtc/base/checks.h" | 19 #include "webrtc/base/checks.h" |
20 #include "webrtc/base/gunit.h" | 20 #include "webrtc/base/gunit.h" |
21 #include "webrtc/base/stringutils.h" | 21 #include "webrtc/base/stringutils.h" |
22 #include "webrtc/config.h" | 22 #include "webrtc/config.h" |
23 #include "webrtc/media/base/codec.h" | 23 #include "webrtc/media/base/codec.h" |
24 #include "webrtc/media/base/rtputils.h" | 24 #include "webrtc/media/base/rtputils.h" |
25 #include "webrtc/media/engine/fakewebrtccommon.h" | 25 #include "webrtc/media/engine/fakewebrtccommon.h" |
26 #include "webrtc/media/engine/webrtcvoe.h" | 26 #include "webrtc/media/engine/webrtcvoe.h" |
27 #include "webrtc/modules/audio_coding/acm2/rent_a_codec.h" | 27 #include "webrtc/modules/audio_coding/acm2/rent_a_codec.h" |
28 #include "webrtc/modules/audio_device/include/fake_audio_device.h" | |
29 #include "webrtc/modules/audio_processing/include/audio_processing.h" | 28 #include "webrtc/modules/audio_processing/include/audio_processing.h" |
30 | 29 |
31 namespace cricket { | 30 namespace cricket { |
32 | 31 |
33 static const int kOpusBandwidthNb = 4000; | 32 static const int kOpusBandwidthNb = 4000; |
34 static const int kOpusBandwidthMb = 6000; | 33 static const int kOpusBandwidthMb = 6000; |
35 static const int kOpusBandwidthWb = 8000; | 34 static const int kOpusBandwidthWb = 8000; |
36 static const int kOpusBandwidthSwb = 12000; | 35 static const int kOpusBandwidthSwb = 12000; |
37 static const int kOpusBandwidthFb = 20000; | 36 static const int kOpusBandwidthFb = 20000; |
38 | 37 |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 webrtc::VoiceDetection* voice_detection() const override { return NULL; } | 111 webrtc::VoiceDetection* voice_detection() const override { return NULL; } |
113 | 112 |
114 bool experimental_ns_enabled() { | 113 bool experimental_ns_enabled() { |
115 return experimental_ns_enabled_; | 114 return experimental_ns_enabled_; |
116 } | 115 } |
117 | 116 |
118 private: | 117 private: |
119 bool experimental_ns_enabled_; | 118 bool experimental_ns_enabled_; |
120 }; | 119 }; |
121 | 120 |
122 // TODO(solenberg): Swap this for a proper mock of the ADM. | |
123 class FakeAudioDeviceModule : public webrtc::FakeAudioDeviceModule { | |
124 public: | |
125 ~FakeAudioDeviceModule() override { | |
126 RTC_DCHECK_EQ(0, ref_count_); | |
127 } | |
128 int32_t AddRef() const override { | |
129 ref_count_++; | |
130 return ref_count_; | |
131 } | |
132 int32_t Release() const override { | |
133 RTC_DCHECK_LT(0, ref_count_); | |
134 ref_count_--; | |
135 return ref_count_; | |
136 } | |
137 | |
138 private: | |
139 mutable int32_t ref_count_ = 0; | |
140 }; | |
141 | |
142 class FakeWebRtcVoiceEngine | 121 class FakeWebRtcVoiceEngine |
143 : public webrtc::VoEAudioProcessing, | 122 : public webrtc::VoEAudioProcessing, |
144 public webrtc::VoEBase, public webrtc::VoECodec, | 123 public webrtc::VoEBase, public webrtc::VoECodec, |
145 public webrtc::VoEHardware, | 124 public webrtc::VoEHardware, |
146 public webrtc::VoENetwork, public webrtc::VoERTP_RTCP, | 125 public webrtc::VoENetwork, public webrtc::VoERTP_RTCP, |
147 public webrtc::VoEVolumeControl { | 126 public webrtc::VoEVolumeControl { |
148 public: | 127 public: |
149 struct Channel { | 128 struct Channel { |
150 explicit Channel() | 129 Channel() { |
151 : external_transport(false), | |
152 playout(false), | |
153 volume_scale(1.0), | |
154 vad(false), | |
155 codec_fec(false), | |
156 max_encoding_bandwidth(0), | |
157 opus_dtx(false), | |
158 red(false), | |
159 nack(false), | |
160 cn8_type(13), | |
161 cn16_type(105), | |
162 red_type(117), | |
163 nack_max_packets(0), | |
164 send_ssrc(0), | |
165 associate_send_channel(-1), | |
166 recv_codecs(), | |
167 neteq_capacity(-1), | |
168 neteq_fast_accelerate(false) { | |
169 memset(&send_codec, 0, sizeof(send_codec)); | 130 memset(&send_codec, 0, sizeof(send_codec)); |
170 } | 131 } |
171 bool external_transport; | 132 bool external_transport = false; |
172 bool playout; | 133 bool playout = false; |
173 float volume_scale; | 134 float volume_scale = 1.0f; |
174 bool vad; | 135 bool vad = false; |
175 bool codec_fec; | 136 bool codec_fec = false; |
176 int max_encoding_bandwidth; | 137 int max_encoding_bandwidth = 0; |
177 bool opus_dtx; | 138 bool opus_dtx = false; |
178 bool red; | 139 bool red = false; |
179 bool nack; | 140 bool nack = false; |
180 int cn8_type; | 141 int cn8_type = 13; |
181 int cn16_type; | 142 int cn16_type = 105; |
182 int red_type; | 143 int red_type = 117; |
183 int nack_max_packets; | 144 int nack_max_packets = 0; |
184 uint32_t send_ssrc; | 145 uint32_t send_ssrc = 0; |
185 int associate_send_channel; | 146 int associate_send_channel = -1; |
186 std::vector<webrtc::CodecInst> recv_codecs; | 147 std::vector<webrtc::CodecInst> recv_codecs; |
187 webrtc::CodecInst send_codec; | 148 webrtc::CodecInst send_codec; |
188 webrtc::PacketTime last_rtp_packet_time; | 149 webrtc::PacketTime last_rtp_packet_time; |
189 std::list<std::string> packets; | 150 std::list<std::string> packets; |
190 int neteq_capacity; | 151 int neteq_capacity = -1; |
191 bool neteq_fast_accelerate; | 152 bool neteq_fast_accelerate = false; |
192 }; | 153 }; |
193 | 154 |
194 FakeWebRtcVoiceEngine() | 155 FakeWebRtcVoiceEngine() { |
195 : inited_(false), | |
196 last_channel_(-1), | |
197 fail_create_channel_(false), | |
198 num_set_send_codecs_(0), | |
199 ec_enabled_(false), | |
200 ec_metrics_enabled_(false), | |
201 cng_enabled_(false), | |
202 ns_enabled_(false), | |
203 agc_enabled_(false), | |
204 highpass_filter_enabled_(false), | |
205 stereo_swapping_enabled_(false), | |
206 typing_detection_enabled_(false), | |
207 ec_mode_(webrtc::kEcDefault), | |
208 aecm_mode_(webrtc::kAecmSpeakerphone), | |
209 ns_mode_(webrtc::kNsDefault), | |
210 agc_mode_(webrtc::kAgcDefault), | |
211 observer_(NULL), | |
212 playout_fail_channel_(-1), | |
213 recording_sample_rate_(-1), | |
214 playout_sample_rate_(-1) { | |
215 memset(&agc_config_, 0, sizeof(agc_config_)); | 156 memset(&agc_config_, 0, sizeof(agc_config_)); |
216 } | 157 } |
217 ~FakeWebRtcVoiceEngine() override { | 158 ~FakeWebRtcVoiceEngine() override { |
218 RTC_CHECK(channels_.empty()); | 159 RTC_CHECK(channels_.empty()); |
219 } | 160 } |
220 | 161 |
221 bool ec_metrics_enabled() const { return ec_metrics_enabled_; } | 162 bool ec_metrics_enabled() const { return ec_metrics_enabled_; } |
222 | 163 |
223 bool IsInited() const { return inited_; } | 164 bool IsInited() const { return inited_; } |
224 int GetLastChannel() const { return last_channel_; } | 165 int GetLastChannel() const { return last_channel_; } |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 if (result) { | 208 if (result) { |
268 std::string packet = channels_[channel]->packets.front(); | 209 std::string packet = channels_[channel]->packets.front(); |
269 result = (packet == std::string(static_cast<const char*>(data), len)); | 210 result = (packet == std::string(static_cast<const char*>(data), len)); |
270 channels_[channel]->packets.pop_front(); | 211 channels_[channel]->packets.pop_front(); |
271 } | 212 } |
272 return result; | 213 return result; |
273 } | 214 } |
274 bool CheckNoPacket(int channel) { | 215 bool CheckNoPacket(int channel) { |
275 return channels_[channel]->packets.empty(); | 216 return channels_[channel]->packets.empty(); |
276 } | 217 } |
277 void TriggerCallbackOnError(int channel_num, int err_code) { | |
278 RTC_DCHECK(observer_ != NULL); | |
279 observer_->CallbackOnError(channel_num, err_code); | |
280 } | |
281 void set_playout_fail_channel(int channel) { | 218 void set_playout_fail_channel(int channel) { |
282 playout_fail_channel_ = channel; | 219 playout_fail_channel_ = channel; |
283 } | 220 } |
284 void set_fail_create_channel(bool fail_create_channel) { | 221 void set_fail_create_channel(bool fail_create_channel) { |
285 fail_create_channel_ = fail_create_channel; | 222 fail_create_channel_ = fail_create_channel; |
286 } | 223 } |
287 int AddChannel(const webrtc::Config& config) { | 224 int AddChannel(const webrtc::Config& config) { |
288 if (fail_create_channel_) { | 225 if (fail_create_channel_) { |
289 return -1; | 226 return -1; |
290 } | 227 } |
(...skipping 11 matching lines...) Expand all Loading... |
302 | 239 |
303 int GetNumSetSendCodecs() const { return num_set_send_codecs_; } | 240 int GetNumSetSendCodecs() const { return num_set_send_codecs_; } |
304 | 241 |
305 int GetAssociateSendChannel(int channel) { | 242 int GetAssociateSendChannel(int channel) { |
306 return channels_[channel]->associate_send_channel; | 243 return channels_[channel]->associate_send_channel; |
307 } | 244 } |
308 | 245 |
309 WEBRTC_STUB(Release, ()); | 246 WEBRTC_STUB(Release, ()); |
310 | 247 |
311 // webrtc::VoEBase | 248 // webrtc::VoEBase |
312 WEBRTC_FUNC(RegisterVoiceEngineObserver, ( | 249 WEBRTC_STUB(RegisterVoiceEngineObserver, ( |
313 webrtc::VoiceEngineObserver& observer)) { | 250 webrtc::VoiceEngineObserver& observer)); |
314 observer_ = &observer; | |
315 return 0; | |
316 } | |
317 WEBRTC_STUB(DeRegisterVoiceEngineObserver, ()); | 251 WEBRTC_STUB(DeRegisterVoiceEngineObserver, ()); |
318 WEBRTC_FUNC(Init, (webrtc::AudioDeviceModule* adm, | 252 WEBRTC_FUNC(Init, (webrtc::AudioDeviceModule* adm, |
319 webrtc::AudioProcessing* audioproc)) { | 253 webrtc::AudioProcessing* audioproc)) { |
320 inited_ = true; | 254 inited_ = true; |
321 return 0; | 255 return 0; |
322 } | 256 } |
323 WEBRTC_FUNC(Terminate, ()) { | 257 WEBRTC_FUNC(Terminate, ()) { |
324 inited_ = false; | 258 inited_ = false; |
325 return 0; | 259 return 0; |
326 } | 260 } |
327 webrtc::AudioProcessing* audio_processing() override { | 261 webrtc::AudioProcessing* audio_processing() override { |
328 return &audio_processing_; | 262 return &audio_processing_; |
329 } | 263 } |
330 webrtc::AudioDeviceModule* audio_device_module() override { | 264 webrtc::AudioDeviceModule* audio_device_module() override { |
331 return &audio_device_module_; | 265 return nullptr; |
332 } | 266 } |
333 WEBRTC_FUNC(CreateChannel, ()) { | 267 WEBRTC_FUNC(CreateChannel, ()) { |
334 webrtc::Config empty_config; | 268 webrtc::Config empty_config; |
335 return AddChannel(empty_config); | 269 return AddChannel(empty_config); |
336 } | 270 } |
337 WEBRTC_FUNC(CreateChannel, (const webrtc::Config& config)) { | 271 WEBRTC_FUNC(CreateChannel, (const webrtc::Config& config)) { |
338 return AddChannel(config); | 272 return AddChannel(config); |
339 } | 273 } |
340 WEBRTC_FUNC(DeleteChannel, (int channel)) { | 274 WEBRTC_FUNC(DeleteChannel, (int channel)) { |
341 WEBRTC_CHECK_CHANNEL(channel); | 275 WEBRTC_CHECK_CHANNEL(channel); |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
769 ASSERT(ch != channels_.end()); | 703 ASSERT(ch != channels_.end()); |
770 return ch->second->neteq_capacity; | 704 return ch->second->neteq_capacity; |
771 } | 705 } |
772 bool GetNetEqFastAccelerate() const { | 706 bool GetNetEqFastAccelerate() const { |
773 auto ch = channels_.find(last_channel_); | 707 auto ch = channels_.find(last_channel_); |
774 ASSERT(ch != channels_.end()); | 708 ASSERT(ch != channels_.end()); |
775 return ch->second->neteq_fast_accelerate; | 709 return ch->second->neteq_fast_accelerate; |
776 } | 710 } |
777 | 711 |
778 private: | 712 private: |
779 bool inited_; | 713 bool inited_ = false; |
780 int last_channel_; | 714 int last_channel_ = -1; |
781 std::map<int, Channel*> channels_; | 715 std::map<int, Channel*> channels_; |
782 bool fail_create_channel_; | 716 bool fail_create_channel_ = false; |
783 int num_set_send_codecs_; // how many times we call SetSendCodec(). | 717 int num_set_send_codecs_ = 0; // how many times we call SetSendCodec(). |
784 bool ec_enabled_; | 718 bool ec_enabled_ = false; |
785 bool ec_metrics_enabled_; | 719 bool ec_metrics_enabled_ = false; |
786 bool cng_enabled_; | 720 bool cng_enabled_ = false; |
787 bool ns_enabled_; | 721 bool ns_enabled_ = false; |
788 bool agc_enabled_; | 722 bool agc_enabled_ = false; |
789 bool highpass_filter_enabled_; | 723 bool highpass_filter_enabled_ = false; |
790 bool stereo_swapping_enabled_; | 724 bool stereo_swapping_enabled_ = false; |
791 bool typing_detection_enabled_; | 725 bool typing_detection_enabled_ = false; |
792 webrtc::EcModes ec_mode_; | 726 webrtc::EcModes ec_mode_ = webrtc::kEcDefault; |
793 webrtc::AecmModes aecm_mode_; | 727 webrtc::AecmModes aecm_mode_ = webrtc::kAecmSpeakerphone; |
794 webrtc::NsModes ns_mode_; | 728 webrtc::NsModes ns_mode_ = webrtc::kNsDefault; |
795 webrtc::AgcModes agc_mode_; | 729 webrtc::AgcModes agc_mode_ = webrtc::kAgcDefault; |
796 webrtc::AgcConfig agc_config_; | 730 webrtc::AgcConfig agc_config_; |
797 webrtc::VoiceEngineObserver* observer_; | 731 int playout_fail_channel_ = -1; |
798 int playout_fail_channel_; | 732 int recording_sample_rate_ = -1; |
799 int recording_sample_rate_; | 733 int playout_sample_rate_ = -1; |
800 int playout_sample_rate_; | |
801 FakeAudioProcessing audio_processing_; | 734 FakeAudioProcessing audio_processing_; |
802 FakeAudioDeviceModule audio_device_module_; | |
803 }; | 735 }; |
804 | 736 |
805 } // namespace cricket | 737 } // namespace cricket |
806 | 738 |
807 #endif // WEBRTC_MEDIA_ENGINE_FAKEWEBRTCVOICEENGINE_H_ | 739 #endif // WEBRTC_MEDIA_ENGINE_FAKEWEBRTCVOICEENGINE_H_ |
OLD | NEW |