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

Side by Side Diff: talk/media/webrtc/webrtcvoiceengine.h

Issue 1403363003: Move VoiceEngineObserver into AudioSendStream so that we detect typing noises and return properly i… (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: better comments Created 5 years, 1 month 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
OLDNEW
1 /* 1 /*
2 * libjingle 2 * libjingle
3 * Copyright 2004 Google Inc. 3 * Copyright 2004 Google Inc.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met: 6 * modification, are permitted provided that the following conditions are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright notice, 8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer. 9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice, 10 * 2. Redistributions in binary form must reproduce the above copyright notice,
(...skipping 19 matching lines...) Expand all
30 30
31 #include <map> 31 #include <map>
32 #include <set> 32 #include <set>
33 #include <string> 33 #include <string>
34 #include <vector> 34 #include <vector>
35 35
36 #include "talk/media/base/rtputils.h" 36 #include "talk/media/base/rtputils.h"
37 #include "talk/media/webrtc/webrtccommon.h" 37 #include "talk/media/webrtc/webrtccommon.h"
38 #include "talk/media/webrtc/webrtcvoe.h" 38 #include "talk/media/webrtc/webrtcvoe.h"
39 #include "talk/session/media/channel.h" 39 #include "talk/session/media/channel.h"
40 #include "webrtc/audio_state.h"
40 #include "webrtc/base/buffer.h" 41 #include "webrtc/base/buffer.h"
41 #include "webrtc/base/byteorder.h" 42 #include "webrtc/base/byteorder.h"
42 #include "webrtc/base/logging.h" 43 #include "webrtc/base/logging.h"
43 #include "webrtc/base/scoped_ptr.h" 44 #include "webrtc/base/scoped_ptr.h"
44 #include "webrtc/base/stream.h" 45 #include "webrtc/base/stream.h"
45 #include "webrtc/base/thread_checker.h" 46 #include "webrtc/base/thread_checker.h"
46 #include "webrtc/call.h" 47 #include "webrtc/call.h"
47 #include "webrtc/common.h" 48 #include "webrtc/common.h"
48 #include "webrtc/config.h" 49 #include "webrtc/config.h"
49 50
50 namespace cricket { 51 namespace cricket {
51 52
52 class AudioDeviceModule; 53 class AudioDeviceModule;
53 class AudioRenderer; 54 class AudioRenderer;
54 class VoETraceWrapper; 55 class VoETraceWrapper;
55 class VoEWrapper; 56 class VoEWrapper;
56 class WebRtcVoiceMediaChannel; 57 class WebRtcVoiceMediaChannel;
57 58
58 // WebRtcVoiceEngine is a class to be used with CompositeMediaEngine. 59 // WebRtcVoiceEngine is a class to be used with CompositeMediaEngine.
59 // It uses the WebRtc VoiceEngine library for audio handling. 60 // It uses the WebRtc VoiceEngine library for audio handling.
60 class WebRtcVoiceEngine 61 class WebRtcVoiceEngine final : public webrtc::TraceCallback {
61 : public webrtc::VoiceEngineObserver,
62 public webrtc::TraceCallback {
63 friend class WebRtcVoiceMediaChannel; 62 friend class WebRtcVoiceMediaChannel;
64 63
65 public: 64 public:
66 WebRtcVoiceEngine(); 65 WebRtcVoiceEngine();
67 // Dependency injection for testing. 66 // Dependency injection for testing.
68 WebRtcVoiceEngine(VoEWrapper* voe_wrapper, VoETraceWrapper* tracing); 67 WebRtcVoiceEngine(VoEWrapper* voe_wrapper,
68 VoETraceWrapper* tracing,
69 webrtc::AudioState* audio_state);
69 ~WebRtcVoiceEngine(); 70 ~WebRtcVoiceEngine();
70 bool Init(rtc::Thread* worker_thread); 71 bool Init(rtc::Thread* worker_thread);
71 void Terminate(); 72 void Terminate();
72 73
73 webrtc::VoiceEngine* GetVoE() { return voe()->engine(); } 74 webrtc::AudioState* GetAudioState() { return audio_state_.get(); }
74 VoiceMediaChannel* CreateChannel(webrtc::Call* call, 75 VoiceMediaChannel* CreateChannel(webrtc::Call* call,
75 const AudioOptions& options); 76 const AudioOptions& options);
76 77
77 AudioOptions GetOptions() const { return options_; } 78 AudioOptions GetOptions() const { return options_; }
78 bool SetOptions(const AudioOptions& options); 79 bool SetOptions(const AudioOptions& options);
79 bool SetDevices(const Device* in_device, const Device* out_device); 80 bool SetDevices(const Device* in_device, const Device* out_device);
80 bool GetOutputVolume(int* level); 81 bool GetOutputVolume(int* level);
81 bool SetOutputVolume(int level); 82 bool SetOutputVolume(int level);
82 int GetInputLevel(); 83 int GetInputLevel();
83 84
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 void SetTraceFilter(int filter); 127 void SetTraceFilter(int filter);
127 void SetTraceOptions(const std::string& options); 128 void SetTraceOptions(const std::string& options);
128 // Every option that is "set" will be applied. Every option not "set" will be 129 // Every option that is "set" will be applied. Every option not "set" will be
129 // ignored. This allows us to selectively turn on and off different options 130 // ignored. This allows us to selectively turn on and off different options
130 // easily at any time. 131 // easily at any time.
131 bool ApplyOptions(const AudioOptions& options); 132 bool ApplyOptions(const AudioOptions& options);
132 133
133 // webrtc::TraceCallback: 134 // webrtc::TraceCallback:
134 void Print(webrtc::TraceLevel level, const char* trace, int length) override; 135 void Print(webrtc::TraceLevel level, const char* trace, int length) override;
135 136
136 // webrtc::VoiceEngineObserver:
137 void CallbackOnError(int channel_id, int errCode) override;
138
139 // Given the device type, name, and id, find device id. Return true and 137 // Given the device type, name, and id, find device id. Return true and
140 // set the output parameter rtc_id if successful. 138 // set the output parameter rtc_id if successful.
141 bool FindWebRtcAudioDeviceId( 139 bool FindWebRtcAudioDeviceId(
142 bool is_input, const std::string& dev_name, int dev_id, int* rtc_id); 140 bool is_input, const std::string& dev_name, int dev_id, int* rtc_id);
143 141
144 void StartAecDump(const std::string& filename); 142 void StartAecDump(const std::string& filename);
145 int CreateVoEChannel(); 143 int CreateVoEChannel();
146 144
147 static const int kDefaultLogSeverity = rtc::LS_WARNING; 145 static const int kDefaultLogSeverity = rtc::LS_WARNING;
148 146
149 // The primary instance of WebRtc VoiceEngine. 147 // The primary instance of WebRtc VoiceEngine.
150 rtc::scoped_ptr<VoEWrapper> voe_wrapper_; 148 rtc::scoped_ptr<VoEWrapper> voe_wrapper_;
151 rtc::scoped_ptr<VoETraceWrapper> tracing_; 149 rtc::scoped_ptr<VoETraceWrapper> tracing_;
150 rtc::scoped_ptr<webrtc::AudioState> audio_state_;
152 // The external audio device manager 151 // The external audio device manager
153 webrtc::AudioDeviceModule* adm_; 152 webrtc::AudioDeviceModule* adm_ = nullptr;
154 int log_filter_; 153 int log_filter_;
155 std::string log_options_; 154 std::string log_options_;
156 bool is_dumping_aec_; 155 bool is_dumping_aec_ = false;
157 std::vector<AudioCodec> codecs_; 156 std::vector<AudioCodec> codecs_;
158 std::vector<RtpHeaderExtension> rtp_header_extensions_; 157 std::vector<RtpHeaderExtension> rtp_header_extensions_;
159 std::vector<WebRtcVoiceMediaChannel*> channels_; 158 std::vector<WebRtcVoiceMediaChannel*> channels_;
160 // channels_ can be read from WebRtc callback thread. We need a lock on that
161 // callback as well as the RegisterChannel/UnregisterChannel.
162 rtc::CriticalSection channels_cs_;
163 webrtc::AgcConfig default_agc_config_; 159 webrtc::AgcConfig default_agc_config_;
164 160
165 webrtc::Config voe_config_; 161 webrtc::Config voe_config_;
166 162
167 bool initialized_; 163 bool initialized_ = false;
168 AudioOptions options_; 164 AudioOptions options_;
169 165
170 // Cache received extended_filter_aec, delay_agnostic_aec and experimental_ns 166 // Cache received extended_filter_aec, delay_agnostic_aec and experimental_ns
171 // values, and apply them in case they are missing in the audio options. We 167 // values, and apply them in case they are missing in the audio options. We
172 // need to do this because SetExtraOptions() will revert to defaults for 168 // need to do this because SetExtraOptions() will revert to defaults for
173 // options which are not provided. 169 // options which are not provided.
174 Settable<bool> extended_filter_aec_; 170 Settable<bool> extended_filter_aec_;
175 Settable<bool> delay_agnostic_aec_; 171 Settable<bool> delay_agnostic_aec_;
176 Settable<bool> experimental_ns_; 172 Settable<bool> experimental_ns_;
177 173
178 RTC_DISALLOW_COPY_AND_ASSIGN(WebRtcVoiceEngine); 174 RTC_DISALLOW_COPY_AND_ASSIGN(WebRtcVoiceEngine);
179 }; 175 };
180 176
181 // WebRtcVoiceMediaChannel is an implementation of VoiceMediaChannel that uses 177 // WebRtcVoiceMediaChannel is an implementation of VoiceMediaChannel that uses
182 // WebRtc Voice Engine. 178 // WebRtc Voice Engine.
183 class WebRtcVoiceMediaChannel : public VoiceMediaChannel, 179 class WebRtcVoiceMediaChannel final : public VoiceMediaChannel,
184 public webrtc::Transport { 180 public webrtc::Transport {
185 public: 181 public:
186 WebRtcVoiceMediaChannel(WebRtcVoiceEngine* engine, 182 WebRtcVoiceMediaChannel(WebRtcVoiceEngine* engine,
187 const AudioOptions& options, 183 const AudioOptions& options,
188 webrtc::Call* call); 184 webrtc::Call* call);
189 ~WebRtcVoiceMediaChannel() override; 185 ~WebRtcVoiceMediaChannel() override;
190 186
191 const AudioOptions& options() const { return options_; } 187 const AudioOptions& options() const { return options_; }
192 188
193 bool SetSendParameters(const AudioSendParameters& params) override; 189 bool SetSendParameters(const AudioSendParameters& params) override;
194 bool SetRecvParameters(const AudioRecvParameters& params) override; 190 bool SetRecvParameters(const AudioRecvParameters& params) override;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 rtc_options.packet_id = options.packet_id; 232 rtc_options.packet_id = options.packet_id;
237 return VoiceMediaChannel::SendPacket(&packet, rtc_options); 233 return VoiceMediaChannel::SendPacket(&packet, rtc_options);
238 } 234 }
239 235
240 bool SendRtcp(const uint8_t* data, size_t len) override { 236 bool SendRtcp(const uint8_t* data, size_t len) override {
241 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len, 237 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len,
242 kMaxRtpPacketLen); 238 kMaxRtpPacketLen);
243 return VoiceMediaChannel::SendRtcp(&packet, rtc::PacketOptions()); 239 return VoiceMediaChannel::SendRtcp(&packet, rtc::PacketOptions());
244 } 240 }
245 241
246 void OnError(int error);
247
248 int GetReceiveChannelId(uint32_t ssrc) const; 242 int GetReceiveChannelId(uint32_t ssrc) const;
249 int GetSendChannelId(uint32_t ssrc) const; 243 int GetSendChannelId(uint32_t ssrc) const;
250 244
251 private: 245 private:
252 bool SetSendCodecs(const std::vector<AudioCodec>& codecs); 246 bool SetSendCodecs(const std::vector<AudioCodec>& codecs);
253 bool SetSendRtpHeaderExtensions( 247 bool SetSendRtpHeaderExtensions(
254 const std::vector<RtpHeaderExtension>& extensions); 248 const std::vector<RtpHeaderExtension>& extensions);
255 bool SetOptions(const AudioOptions& options); 249 bool SetOptions(const AudioOptions& options);
256 bool SetMaxSendBandwidth(int bps); 250 bool SetMaxSendBandwidth(int bps);
257 bool SetRecvCodecs(const std::vector<AudioCodec>& codecs); 251 bool SetRecvCodecs(const std::vector<AudioCodec>& codecs);
258 bool SetRecvRtpHeaderExtensions( 252 bool SetRecvRtpHeaderExtensions(
259 const std::vector<RtpHeaderExtension>& extensions); 253 const std::vector<RtpHeaderExtension>& extensions);
260 bool SetLocalRenderer(uint32_t ssrc, AudioRenderer* renderer); 254 bool SetLocalRenderer(uint32_t ssrc, AudioRenderer* renderer);
261 bool MuteStream(uint32_t ssrc, bool mute); 255 bool MuteStream(uint32_t ssrc, bool mute);
262 256
263 WebRtcVoiceEngine* engine() { return engine_; } 257 WebRtcVoiceEngine* engine() { return engine_; }
264 int GetLastEngineError() { return engine()->GetLastEngineError(); } 258 int GetLastEngineError() { return engine()->GetLastEngineError(); }
265 int GetOutputLevel(int channel); 259 int GetOutputLevel(int channel);
266 bool GetRedSendCodec(const AudioCodec& red_codec, 260 bool GetRedSendCodec(const AudioCodec& red_codec,
267 const std::vector<AudioCodec>& all_codecs, 261 const std::vector<AudioCodec>& all_codecs,
268 webrtc::CodecInst* send_codec); 262 webrtc::CodecInst* send_codec);
269 bool SetPlayout(int channel, bool playout); 263 bool SetPlayout(int channel, bool playout);
270 static Error WebRtcErrorToChannelError(int err_code);
271 264
272 typedef int (webrtc::VoERTP_RTCP::* ExtensionSetterFunction)(int, bool, 265 typedef int (webrtc::VoERTP_RTCP::* ExtensionSetterFunction)(int, bool,
273 unsigned char); 266 unsigned char);
274 267
275 void SetNack(int channel, bool nack_enabled); 268 void SetNack(int channel, bool nack_enabled);
276 bool SetSendCodec(int channel, const webrtc::CodecInst& send_codec); 269 bool SetSendCodec(int channel, const webrtc::CodecInst& send_codec);
277 bool ChangePlayout(bool playout); 270 bool ChangePlayout(bool playout);
278 bool ChangeSend(SendFlags send); 271 bool ChangeSend(SendFlags send);
279 bool ChangeSend(int channel, SendFlags send); 272 bool ChangeSend(int channel, SendFlags send);
280 bool ConfigureRecvChannel(int channel); 273 bool ConfigureRecvChannel(int channel);
(...skipping 14 matching lines...) Expand all
295 288
296 bool SetChannelRecvRtpHeaderExtensions( 289 bool SetChannelRecvRtpHeaderExtensions(
297 int channel_id, 290 int channel_id,
298 const std::vector<RtpHeaderExtension>& extensions); 291 const std::vector<RtpHeaderExtension>& extensions);
299 bool SetChannelSendRtpHeaderExtensions( 292 bool SetChannelSendRtpHeaderExtensions(
300 int channel_id, 293 int channel_id,
301 const std::vector<RtpHeaderExtension>& extensions); 294 const std::vector<RtpHeaderExtension>& extensions);
302 295
303 rtc::ThreadChecker thread_checker_; 296 rtc::ThreadChecker thread_checker_;
304 297
305 WebRtcVoiceEngine* const engine_; 298 WebRtcVoiceEngine* const engine_ = nullptr;
306 std::vector<AudioCodec> recv_codecs_; 299 std::vector<AudioCodec> recv_codecs_;
307 std::vector<AudioCodec> send_codecs_; 300 std::vector<AudioCodec> send_codecs_;
308 rtc::scoped_ptr<webrtc::CodecInst> send_codec_; 301 rtc::scoped_ptr<webrtc::CodecInst> send_codec_;
309 bool send_bitrate_setting_; 302 bool send_bitrate_setting_ = false;
310 int send_bitrate_bps_; 303 int send_bitrate_bps_ = 0;
311 AudioOptions options_; 304 AudioOptions options_;
312 bool dtmf_allowed_; 305 bool dtmf_allowed_ = false;
313 bool desired_playout_; 306 bool desired_playout_ = false;
314 bool nack_enabled_; 307 bool nack_enabled_ = false;
315 bool playout_; 308 bool playout_ = false;
316 bool typing_noise_detected_; 309 SendFlags desired_send_ = SEND_NOTHING;
317 SendFlags desired_send_; 310 SendFlags send_ = SEND_NOTHING;
318 SendFlags send_; 311 webrtc::Call* const call_ = nullptr;
319 webrtc::Call* const call_;
320 312
321 // SSRC of unsignalled receive stream, or -1 if there isn't one. 313 // SSRC of unsignalled receive stream, or -1 if there isn't one.
322 int64_t default_recv_ssrc_ = -1; 314 int64_t default_recv_ssrc_ = -1;
323 // Volume for unsignalled stream, which may be set before the stream exists. 315 // Volume for unsignalled stream, which may be set before the stream exists.
324 double default_recv_volume_ = 1.0; 316 double default_recv_volume_ = 1.0;
325 // SSRC to use for RTCP receiver reports; default to 1 in case of no signaled 317 // SSRC to use for RTCP receiver reports; default to 1 in case of no signaled
326 // send streams. See: https://code.google.com/p/webrtc/issues/detail?id=4740 318 // send streams. See: https://code.google.com/p/webrtc/issues/detail?id=4740
327 uint32_t receiver_reports_ssrc_ = 1; 319 uint32_t receiver_reports_ssrc_ = 1;
328 320
329 class WebRtcAudioSendStream; 321 class WebRtcAudioSendStream;
330 std::map<uint32_t, WebRtcAudioSendStream*> send_streams_; 322 std::map<uint32_t, WebRtcAudioSendStream*> send_streams_;
331 std::vector<RtpHeaderExtension> send_extensions_; 323 std::vector<RtpHeaderExtension> send_extensions_;
332 324
333 class WebRtcAudioReceiveStream; 325 class WebRtcAudioReceiveStream;
334 std::map<uint32_t, WebRtcAudioReceiveStream*> receive_channels_; 326 std::map<uint32_t, WebRtcAudioReceiveStream*> receive_channels_;
335 std::map<uint32_t, webrtc::AudioReceiveStream*> receive_streams_; 327 std::map<uint32_t, webrtc::AudioReceiveStream*> receive_streams_;
336 std::map<uint32_t, StreamParams> receive_stream_params_; 328 std::map<uint32_t, StreamParams> receive_stream_params_;
337 // receive_channels_ can be read from WebRtc callback thread. Access from 329 // receive_channels_ can be read from WebRtc callback thread. Access from
338 // the WebRtc thread must be synchronized with edits on the worker thread. 330 // the WebRtc thread must be synchronized with edits on the worker thread.
339 // Reads on the worker thread are ok. 331 // Reads on the worker thread are ok.
340 std::vector<RtpHeaderExtension> receive_extensions_; 332 std::vector<RtpHeaderExtension> receive_extensions_;
341 std::vector<webrtc::RtpExtension> recv_rtp_extensions_; 333 std::vector<webrtc::RtpExtension> recv_rtp_extensions_;
342 334
343 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(WebRtcVoiceMediaChannel); 335 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(WebRtcVoiceMediaChannel);
344 }; 336 };
345
346 } // namespace cricket 337 } // namespace cricket
347 338
348 #endif // TALK_MEDIA_WEBRTCVOICEENGINE_H_ 339 #endif // TALK_MEDIA_WEBRTCVOICEENGINE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698