| OLD | NEW | 
|---|
| 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 370 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 381   options.extended_filter_aec.Set(false); | 381   options.extended_filter_aec.Set(false); | 
| 382   options.delay_agnostic_aec.Set(false); | 382   options.delay_agnostic_aec.Set(false); | 
| 383   options.experimental_ns.Set(false); | 383   options.experimental_ns.Set(false); | 
| 384   options.aec_dump.Set(false); | 384   options.aec_dump.Set(false); | 
| 385   return options; | 385   return options; | 
| 386 } | 386 } | 
| 387 | 387 | 
| 388 std::string GetEnableString(bool enable) { | 388 std::string GetEnableString(bool enable) { | 
| 389   return enable ? "enable" : "disable"; | 389   return enable ? "enable" : "disable"; | 
| 390 } | 390 } | 
|  | 391 | 
|  | 392 webrtc::AudioState::Config MakeAudioStateConfig(VoEWrapper* voe_wrapper) { | 
|  | 393   webrtc::AudioState::Config config; | 
|  | 394   config.voice_engine = voe_wrapper->engine(); | 
|  | 395   return config; | 
|  | 396 } | 
|  | 397 | 
| 391 } // namespace { | 398 } // namespace { | 
| 392 | 399 | 
| 393 WebRtcVoiceEngine::WebRtcVoiceEngine() | 400 WebRtcVoiceEngine::WebRtcVoiceEngine() | 
| 394     : voe_wrapper_(new VoEWrapper()), | 401     : voe_wrapper_(new VoEWrapper()), | 
| 395       tracing_(new VoETraceWrapper()), | 402       tracing_(new VoETraceWrapper()), | 
| 396       adm_(NULL), | 403       audio_state_(webrtc::AudioState::Create(MakeAudioStateConfig(voe()))), | 
| 397       log_filter_(SeverityToFilter(kDefaultLogSeverity)), | 404       log_filter_(SeverityToFilter(kDefaultLogSeverity)) { | 
| 398       is_dumping_aec_(false) { |  | 
| 399   Construct(); | 405   Construct(); | 
| 400 } | 406 } | 
| 401 | 407 | 
| 402 WebRtcVoiceEngine::WebRtcVoiceEngine(VoEWrapper* voe_wrapper, | 408 WebRtcVoiceEngine::WebRtcVoiceEngine(VoEWrapper* voe_wrapper, | 
| 403                                      VoETraceWrapper* tracing) | 409                                      VoETraceWrapper* tracing, | 
|  | 410                                      webrtc::AudioState* audio_state) | 
| 404     : voe_wrapper_(voe_wrapper), | 411     : voe_wrapper_(voe_wrapper), | 
| 405       tracing_(tracing), | 412       tracing_(tracing), | 
| 406       adm_(NULL), | 413       audio_state_(audio_state), | 
| 407       log_filter_(SeverityToFilter(kDefaultLogSeverity)), | 414       log_filter_(SeverityToFilter(kDefaultLogSeverity)) { | 
| 408       is_dumping_aec_(false) { |  | 
| 409   Construct(); | 415   Construct(); | 
| 410 } | 416 } | 
| 411 | 417 | 
| 412 void WebRtcVoiceEngine::Construct() { | 418 void WebRtcVoiceEngine::Construct() { | 
|  | 419   std::memset(&default_agc_config_, 0, sizeof(default_agc_config_)); | 
| 413   SetTraceFilter(log_filter_); | 420   SetTraceFilter(log_filter_); | 
| 414   initialized_ = false; |  | 
| 415   LOG(LS_VERBOSE) << "WebRtcVoiceEngine::WebRtcVoiceEngine"; | 421   LOG(LS_VERBOSE) << "WebRtcVoiceEngine::WebRtcVoiceEngine"; | 
| 416   SetTraceOptions(""); | 422   SetTraceOptions(""); | 
| 417   if (tracing_->SetTraceCallback(this) == -1) { | 423   if (tracing_->SetTraceCallback(this) == -1) { | 
| 418     LOG_RTCERR0(SetTraceCallback); | 424     LOG_RTCERR0(SetTraceCallback); | 
| 419   } | 425   } | 
| 420   if (voe_wrapper_->base()->RegisterVoiceEngineObserver(*this) == -1) { |  | 
| 421     LOG_RTCERR0(RegisterVoiceEngineObserver); |  | 
| 422   } |  | 
| 423   // Clear the default agc state. |  | 
| 424   memset(&default_agc_config_, 0, sizeof(default_agc_config_)); |  | 
| 425 | 426 | 
| 426   // Load our audio codec list. | 427   // Load our audio codec list. | 
| 427   ConstructCodecs(); | 428   ConstructCodecs(); | 
| 428 | 429 | 
| 429   // Load our RTP Header extensions. | 430   // Load our RTP Header extensions. | 
| 430   rtp_header_extensions_.push_back( | 431   rtp_header_extensions_.push_back( | 
| 431       RtpHeaderExtension(kRtpAudioLevelHeaderExtension, | 432       RtpHeaderExtension(kRtpAudioLevelHeaderExtension, | 
| 432                          kRtpAudioLevelHeaderExtensionDefaultId)); | 433                          kRtpAudioLevelHeaderExtensionDefaultId)); | 
| 433   rtp_header_extensions_.push_back( | 434   rtp_header_extensions_.push_back( | 
| 434       RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, | 435       RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, | 
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 502   if (voe_wrapper_->codec()->GetCodec(index, *codec) == -1) { | 503   if (voe_wrapper_->codec()->GetCodec(index, *codec) == -1) { | 
| 503     return false; | 504     return false; | 
| 504   } | 505   } | 
| 505   // Change the sample rate of G722 to 8000 to match SDP. | 506   // Change the sample rate of G722 to 8000 to match SDP. | 
| 506   MaybeFixupG722(codec, 8000); | 507   MaybeFixupG722(codec, 8000); | 
| 507   return true; | 508   return true; | 
| 508 } | 509 } | 
| 509 | 510 | 
| 510 WebRtcVoiceEngine::~WebRtcVoiceEngine() { | 511 WebRtcVoiceEngine::~WebRtcVoiceEngine() { | 
| 511   LOG(LS_VERBOSE) << "WebRtcVoiceEngine::~WebRtcVoiceEngine"; | 512   LOG(LS_VERBOSE) << "WebRtcVoiceEngine::~WebRtcVoiceEngine"; | 
| 512   if (voe_wrapper_->base()->DeRegisterVoiceEngineObserver() == -1) { |  | 
| 513     LOG_RTCERR0(DeRegisterVoiceEngineObserver); |  | 
| 514   } |  | 
| 515   if (adm_) { | 513   if (adm_) { | 
| 516     voe_wrapper_.reset(); | 514     voe_wrapper_.reset(); | 
| 517     adm_->Release(); | 515     adm_->Release(); | 
| 518     adm_ = NULL; | 516     adm_ = NULL; | 
| 519   } | 517   } | 
| 520 | 518 | 
| 521   tracing_->SetTraceCallback(NULL); | 519   tracing_->SetTraceCallback(NULL); | 
| 522 } | 520 } | 
| 523 | 521 | 
| 524 bool WebRtcVoiceEngine::Init(rtc::Thread* worker_thread) { | 522 bool WebRtcVoiceEngine::Init(rtc::Thread* thread) { | 
| 525   RTC_DCHECK(worker_thread == rtc::Thread::Current()); | 523   RTC_DCHECK(thread == rtc::Thread::Current()); | 
| 526   LOG(LS_INFO) << "WebRtcVoiceEngine::Init"; | 524   LOG(LS_INFO) << "WebRtcVoiceEngine::Init"; | 
| 527   bool res = InitInternal(); | 525   bool res = InitInternal(); | 
| 528   if (res) { | 526   if (res) { | 
| 529     LOG(LS_INFO) << "WebRtcVoiceEngine::Init Done!"; | 527     LOG(LS_INFO) << "WebRtcVoiceEngine::Init Done!"; | 
| 530   } else { | 528   } else { | 
| 531     LOG(LS_ERROR) << "WebRtcVoiceEngine::Init failed"; | 529     LOG(LS_ERROR) << "WebRtcVoiceEngine::Init failed"; | 
| 532     Terminate(); | 530     Terminate(); | 
| 533   } | 531   } | 
| 534   return res; | 532   return res; | 
| 535 } | 533 } | 
| (...skipping 658 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1194   if (length < 72) { | 1192   if (length < 72) { | 
| 1195     std::string msg(trace, length); | 1193     std::string msg(trace, length); | 
| 1196     LOG(LS_ERROR) << "Malformed webrtc log message: "; | 1194     LOG(LS_ERROR) << "Malformed webrtc log message: "; | 
| 1197     LOG_V(sev) << msg; | 1195     LOG_V(sev) << msg; | 
| 1198   } else { | 1196   } else { | 
| 1199     std::string msg(trace + 71, length - 72); | 1197     std::string msg(trace + 71, length - 72); | 
| 1200     LOG_V(sev) << "webrtc: " << msg; | 1198     LOG_V(sev) << "webrtc: " << msg; | 
| 1201   } | 1199   } | 
| 1202 } | 1200 } | 
| 1203 | 1201 | 
| 1204 void WebRtcVoiceEngine::CallbackOnError(int channel_id, int err_code) { |  | 
| 1205   RTC_DCHECK(channel_id == -1); |  | 
| 1206   LOG(LS_WARNING) << "VoiceEngine error " << err_code << " reported on channel " |  | 
| 1207                   << channel_id << "."; |  | 
| 1208   rtc::CritScope lock(&channels_cs_); |  | 
| 1209   for (WebRtcVoiceMediaChannel* channel : channels_) { |  | 
| 1210     channel->OnError(err_code); |  | 
| 1211   } |  | 
| 1212 } |  | 
| 1213 |  | 
| 1214 void WebRtcVoiceEngine::RegisterChannel(WebRtcVoiceMediaChannel* channel) { | 1202 void WebRtcVoiceEngine::RegisterChannel(WebRtcVoiceMediaChannel* channel) { | 
| 1215   RTC_DCHECK(channel != NULL); | 1203   RTC_DCHECK(channel); | 
| 1216   rtc::CritScope lock(&channels_cs_); |  | 
| 1217   channels_.push_back(channel); | 1204   channels_.push_back(channel); | 
| 1218 } | 1205 } | 
| 1219 | 1206 | 
| 1220 void WebRtcVoiceEngine::UnregisterChannel(WebRtcVoiceMediaChannel* channel) { | 1207 void WebRtcVoiceEngine::UnregisterChannel(WebRtcVoiceMediaChannel* channel) { | 
| 1221   rtc::CritScope lock(&channels_cs_); |  | 
| 1222   auto it = std::find(channels_.begin(), channels_.end(), channel); | 1208   auto it = std::find(channels_.begin(), channels_.end(), channel); | 
| 1223   if (it != channels_.end()) { | 1209   RTC_DCHECK(it != channels_.end()); | 
| 1224     channels_.erase(it); | 1210   channels_.erase(it); | 
| 1225   } |  | 
| 1226 } | 1211 } | 
| 1227 | 1212 | 
| 1228 // Adjusts the default AGC target level by the specified delta. | 1213 // Adjusts the default AGC target level by the specified delta. | 
| 1229 // NB: If we start messing with other config fields, we'll want | 1214 // NB: If we start messing with other config fields, we'll want | 
| 1230 // to save the current webrtc::AgcConfig as well. | 1215 // to save the current webrtc::AgcConfig as well. | 
| 1231 bool WebRtcVoiceEngine::AdjustAgcLevel(int delta) { | 1216 bool WebRtcVoiceEngine::AdjustAgcLevel(int delta) { | 
| 1232   webrtc::AgcConfig config = default_agc_config_; | 1217   webrtc::AgcConfig config = default_agc_config_; | 
| 1233   config.targetLeveldBOv -= delta; | 1218   config.targetLeveldBOv -= delta; | 
| 1234 | 1219 | 
| 1235   LOG(LS_INFO) << "Adjusting AGC level from default -" | 1220   LOG(LS_INFO) << "Adjusting AGC level from default -" | 
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1326     // RTC_DCHECK(voe_audio_transport); | 1311     // RTC_DCHECK(voe_audio_transport); | 
| 1327     RTC_DCHECK(call); | 1312     RTC_DCHECK(call); | 
| 1328     audio_capture_thread_checker_.DetachFromThread(); | 1313     audio_capture_thread_checker_.DetachFromThread(); | 
| 1329     webrtc::AudioSendStream::Config config(nullptr); | 1314     webrtc::AudioSendStream::Config config(nullptr); | 
| 1330     config.voe_channel_id = channel_; | 1315     config.voe_channel_id = channel_; | 
| 1331     config.rtp.ssrc = ssrc; | 1316     config.rtp.ssrc = ssrc; | 
| 1332     stream_ = call_->CreateAudioSendStream(config); | 1317     stream_ = call_->CreateAudioSendStream(config); | 
| 1333     RTC_DCHECK(stream_); | 1318     RTC_DCHECK(stream_); | 
| 1334   } | 1319   } | 
| 1335   ~WebRtcAudioSendStream() override { | 1320   ~WebRtcAudioSendStream() override { | 
| 1336     RTC_DCHECK(signal_thread_checker_.CalledOnValidThread()); | 1321     RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 
| 1337     Stop(); | 1322     Stop(); | 
| 1338     call_->DestroyAudioSendStream(stream_); | 1323     call_->DestroyAudioSendStream(stream_); | 
| 1339   } | 1324   } | 
| 1340 | 1325 | 
| 1341   // Starts the rendering by setting a sink to the renderer to get data | 1326   // Starts the rendering by setting a sink to the renderer to get data | 
| 1342   // callback. | 1327   // callback. | 
| 1343   // This method is called on the libjingle worker thread. | 1328   // This method is called on the libjingle worker thread. | 
| 1344   // TODO(xians): Make sure Start() is called only once. | 1329   // TODO(xians): Make sure Start() is called only once. | 
| 1345   void Start(AudioRenderer* renderer) { | 1330   void Start(AudioRenderer* renderer) { | 
| 1346     RTC_DCHECK(signal_thread_checker_.CalledOnValidThread()); | 1331     RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 
| 1347     RTC_DCHECK(renderer); | 1332     RTC_DCHECK(renderer); | 
| 1348     if (renderer_) { | 1333     if (renderer_) { | 
| 1349       RTC_DCHECK(renderer_ == renderer); | 1334       RTC_DCHECK(renderer_ == renderer); | 
| 1350       return; | 1335       return; | 
| 1351     } | 1336     } | 
| 1352     renderer->SetSink(this); | 1337     renderer->SetSink(this); | 
| 1353     renderer_ = renderer; | 1338     renderer_ = renderer; | 
| 1354   } | 1339   } | 
| 1355 | 1340 | 
| 1356   webrtc::AudioSendStream::Stats GetStats() const { | 1341   webrtc::AudioSendStream::Stats GetStats() const { | 
| 1357     RTC_DCHECK(signal_thread_checker_.CalledOnValidThread()); | 1342     RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 
| 1358     return stream_->GetStats(); | 1343     return stream_->GetStats(); | 
| 1359   } | 1344   } | 
| 1360 | 1345 | 
| 1361   // Stops rendering by setting the sink of the renderer to nullptr. No data | 1346   // Stops rendering by setting the sink of the renderer to nullptr. No data | 
| 1362   // callback will be received after this method. | 1347   // callback will be received after this method. | 
| 1363   // This method is called on the libjingle worker thread. | 1348   // This method is called on the libjingle worker thread. | 
| 1364   void Stop() { | 1349   void Stop() { | 
| 1365     RTC_DCHECK(signal_thread_checker_.CalledOnValidThread()); | 1350     RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 
| 1366     if (renderer_) { | 1351     if (renderer_) { | 
| 1367       renderer_->SetSink(nullptr); | 1352       renderer_->SetSink(nullptr); | 
| 1368       renderer_ = nullptr; | 1353       renderer_ = nullptr; | 
| 1369     } | 1354     } | 
| 1370   } | 1355   } | 
| 1371 | 1356 | 
| 1372   // AudioRenderer::Sink implementation. | 1357   // AudioRenderer::Sink implementation. | 
| 1373   // This method is called on the audio thread. | 1358   // This method is called on the audio thread. | 
| 1374   void OnData(const void* audio_data, | 1359   void OnData(const void* audio_data, | 
| 1375               int bits_per_sample, | 1360               int bits_per_sample, | 
| 1376               int sample_rate, | 1361               int sample_rate, | 
| 1377               int number_of_channels, | 1362               int number_of_channels, | 
| 1378               size_t number_of_frames) override { | 1363               size_t number_of_frames) override { | 
|  | 1364     RTC_DCHECK(!thread_checker_.CalledOnValidThread()); | 
| 1379     RTC_DCHECK(audio_capture_thread_checker_.CalledOnValidThread()); | 1365     RTC_DCHECK(audio_capture_thread_checker_.CalledOnValidThread()); | 
| 1380     RTC_DCHECK(voe_audio_transport_); | 1366     RTC_DCHECK(voe_audio_transport_); | 
| 1381     voe_audio_transport_->OnData(channel_, | 1367     voe_audio_transport_->OnData(channel_, | 
| 1382                                  audio_data, | 1368                                  audio_data, | 
| 1383                                  bits_per_sample, | 1369                                  bits_per_sample, | 
| 1384                                  sample_rate, | 1370                                  sample_rate, | 
| 1385                                  number_of_channels, | 1371                                  number_of_channels, | 
| 1386                                  number_of_frames); | 1372                                  number_of_frames); | 
| 1387   } | 1373   } | 
| 1388 | 1374 | 
| 1389   // Callback from the |renderer_| when it is going away. In case Start() has | 1375   // Callback from the |renderer_| when it is going away. In case Start() has | 
| 1390   // never been called, this callback won't be triggered. | 1376   // never been called, this callback won't be triggered. | 
| 1391   void OnClose() override { | 1377   void OnClose() override { | 
| 1392     RTC_DCHECK(signal_thread_checker_.CalledOnValidThread()); | 1378     RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 
| 1393     // Set |renderer_| to nullptr to make sure no more callback will get into | 1379     // Set |renderer_| to nullptr to make sure no more callback will get into | 
| 1394     // the renderer. | 1380     // the renderer. | 
| 1395     renderer_ = nullptr; | 1381     renderer_ = nullptr; | 
| 1396   } | 1382   } | 
| 1397 | 1383 | 
| 1398   // Accessor to the VoE channel ID. | 1384   // Accessor to the VoE channel ID. | 
| 1399   int channel() const { | 1385   int channel() const { | 
| 1400     RTC_DCHECK(signal_thread_checker_.CalledOnValidThread()); | 1386     RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 
| 1401     return channel_; | 1387     return channel_; | 
| 1402   } | 1388   } | 
| 1403 | 1389 | 
| 1404  private: | 1390  private: | 
| 1405   rtc::ThreadChecker signal_thread_checker_; | 1391   rtc::ThreadChecker thread_checker_; | 
| 1406   rtc::ThreadChecker audio_capture_thread_checker_; | 1392   rtc::ThreadChecker audio_capture_thread_checker_; | 
| 1407   const int channel_ = -1; | 1393   const int channel_ = -1; | 
| 1408   webrtc::AudioTransport* const voe_audio_transport_ = nullptr; | 1394   webrtc::AudioTransport* const voe_audio_transport_ = nullptr; | 
| 1409   webrtc::Call* call_ = nullptr; | 1395   webrtc::Call* call_ = nullptr; | 
| 1410   webrtc::AudioSendStream* stream_ = nullptr; | 1396   webrtc::AudioSendStream* stream_ = nullptr; | 
| 1411 | 1397 | 
| 1412   // Raw pointer to AudioRenderer owned by LocalAudioTrackHandler. | 1398   // Raw pointer to AudioRenderer owned by LocalAudioTrackHandler. | 
| 1413   // PeerConnection will make sure invalidating the pointer before the object | 1399   // PeerConnection will make sure invalidating the pointer before the object | 
| 1414   // goes away. | 1400   // goes away. | 
| 1415   AudioRenderer* renderer_ = nullptr; | 1401   AudioRenderer* renderer_ = nullptr; | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 1427  private: | 1413  private: | 
| 1428   int channel_; | 1414   int channel_; | 
| 1429 | 1415 | 
| 1430   RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(WebRtcAudioReceiveStream); | 1416   RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(WebRtcAudioReceiveStream); | 
| 1431 }; | 1417 }; | 
| 1432 | 1418 | 
| 1433 // WebRtcVoiceMediaChannel | 1419 // WebRtcVoiceMediaChannel | 
| 1434 WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel(WebRtcVoiceEngine* engine, | 1420 WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel(WebRtcVoiceEngine* engine, | 
| 1435                                                  const AudioOptions& options, | 1421                                                  const AudioOptions& options, | 
| 1436                                                  webrtc::Call* call) | 1422                                                  webrtc::Call* call) | 
| 1437     : engine_(engine), | 1423     : engine_(engine), call_(call) { | 
| 1438       send_bitrate_setting_(false), |  | 
| 1439       send_bitrate_bps_(0), |  | 
| 1440       options_(), |  | 
| 1441       dtmf_allowed_(false), |  | 
| 1442       desired_playout_(false), |  | 
| 1443       nack_enabled_(false), |  | 
| 1444       playout_(false), |  | 
| 1445       typing_noise_detected_(false), |  | 
| 1446       desired_send_(SEND_NOTHING), |  | 
| 1447       send_(SEND_NOTHING), |  | 
| 1448       call_(call) { |  | 
| 1449   LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel"; | 1424   LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel"; | 
| 1450   RTC_DCHECK(nullptr != call); | 1425   RTC_DCHECK(call); | 
| 1451   engine->RegisterChannel(this); | 1426   engine->RegisterChannel(this); | 
| 1452   SetOptions(options); | 1427   SetOptions(options); | 
| 1453 } | 1428 } | 
| 1454 | 1429 | 
| 1455 WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel() { | 1430 WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel() { | 
| 1456   RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 1431   RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 
| 1457   LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel"; | 1432   LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel"; | 
| 1458 | 1433 | 
| 1459   // Remove any remaining send streams. | 1434   // Remove any remaining send streams. | 
| 1460   while (!send_streams_.empty()) { | 1435   while (!send_streams_.empty()) { | 
| (...skipping 1184 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2645     sinfo.codec_name = stats.codec_name; | 2620     sinfo.codec_name = stats.codec_name; | 
| 2646     sinfo.ext_seqnum = stats.ext_seqnum; | 2621     sinfo.ext_seqnum = stats.ext_seqnum; | 
| 2647     sinfo.jitter_ms = stats.jitter_ms; | 2622     sinfo.jitter_ms = stats.jitter_ms; | 
| 2648     sinfo.rtt_ms = stats.rtt_ms; | 2623     sinfo.rtt_ms = stats.rtt_ms; | 
| 2649     sinfo.audio_level = stats.audio_level; | 2624     sinfo.audio_level = stats.audio_level; | 
| 2650     sinfo.aec_quality_min = stats.aec_quality_min; | 2625     sinfo.aec_quality_min = stats.aec_quality_min; | 
| 2651     sinfo.echo_delay_median_ms = stats.echo_delay_median_ms; | 2626     sinfo.echo_delay_median_ms = stats.echo_delay_median_ms; | 
| 2652     sinfo.echo_delay_std_ms = stats.echo_delay_std_ms; | 2627     sinfo.echo_delay_std_ms = stats.echo_delay_std_ms; | 
| 2653     sinfo.echo_return_loss = stats.echo_return_loss; | 2628     sinfo.echo_return_loss = stats.echo_return_loss; | 
| 2654     sinfo.echo_return_loss_enhancement = stats.echo_return_loss_enhancement; | 2629     sinfo.echo_return_loss_enhancement = stats.echo_return_loss_enhancement; | 
| 2655     sinfo.typing_noise_detected = typing_noise_detected_; | 2630     sinfo.typing_noise_detected = | 
| 2656     // TODO(solenberg): Move to AudioSendStream. | 2631         (send_ == SEND_NOTHING ? false : stats.typing_noise_detected); | 
| 2657     //  sinfo.typing_noise_detected = stats.typing_noise_detected; |  | 
| 2658     info->senders.push_back(sinfo); | 2632     info->senders.push_back(sinfo); | 
| 2659   } | 2633   } | 
| 2660 | 2634 | 
| 2661   // Get SSRC and stats for each receiver. | 2635   // Get SSRC and stats for each receiver. | 
| 2662   RTC_DCHECK(info->receivers.size() == 0); | 2636   RTC_DCHECK(info->receivers.size() == 0); | 
| 2663   for (const auto& stream : receive_streams_) { | 2637   for (const auto& stream : receive_streams_) { | 
| 2664     webrtc::AudioReceiveStream::Stats stats = stream.second->GetStats(); | 2638     webrtc::AudioReceiveStream::Stats stats = stream.second->GetStats(); | 
| 2665     VoiceReceiverInfo rinfo; | 2639     VoiceReceiverInfo rinfo; | 
| 2666     rinfo.add_ssrc(stats.remote_ssrc); | 2640     rinfo.add_ssrc(stats.remote_ssrc); | 
| 2667     rinfo.bytes_rcvd = stats.bytes_rcvd; | 2641     rinfo.bytes_rcvd = stats.bytes_rcvd; | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 2687     rinfo.decoding_plc = stats.decoding_plc; | 2661     rinfo.decoding_plc = stats.decoding_plc; | 
| 2688     rinfo.decoding_cng = stats.decoding_cng; | 2662     rinfo.decoding_cng = stats.decoding_cng; | 
| 2689     rinfo.decoding_plc_cng = stats.decoding_plc_cng; | 2663     rinfo.decoding_plc_cng = stats.decoding_plc_cng; | 
| 2690     rinfo.capture_start_ntp_time_ms = stats.capture_start_ntp_time_ms; | 2664     rinfo.capture_start_ntp_time_ms = stats.capture_start_ntp_time_ms; | 
| 2691     info->receivers.push_back(rinfo); | 2665     info->receivers.push_back(rinfo); | 
| 2692   } | 2666   } | 
| 2693 | 2667 | 
| 2694   return true; | 2668   return true; | 
| 2695 } | 2669 } | 
| 2696 | 2670 | 
| 2697 void WebRtcVoiceMediaChannel::OnError(int error) { |  | 
| 2698   if (send_ == SEND_NOTHING) { |  | 
| 2699     return; |  | 
| 2700   } |  | 
| 2701   if (error == VE_TYPING_NOISE_WARNING) { |  | 
| 2702     typing_noise_detected_ = true; |  | 
| 2703   } else if (error == VE_TYPING_NOISE_OFF_WARNING) { |  | 
| 2704     typing_noise_detected_ = false; |  | 
| 2705   } |  | 
| 2706 } |  | 
| 2707 |  | 
| 2708 int WebRtcVoiceMediaChannel::GetOutputLevel(int channel) { | 2671 int WebRtcVoiceMediaChannel::GetOutputLevel(int channel) { | 
| 2709   unsigned int ulevel = 0; | 2672   unsigned int ulevel = 0; | 
| 2710   int ret = engine()->voe()->volume()->GetSpeechOutputLevel(channel, ulevel); | 2673   int ret = engine()->voe()->volume()->GetSpeechOutputLevel(channel, ulevel); | 
| 2711   return (ret == 0) ? static_cast<int>(ulevel) : -1; | 2674   return (ret == 0) ? static_cast<int>(ulevel) : -1; | 
| 2712 } | 2675 } | 
| 2713 | 2676 | 
| 2714 int WebRtcVoiceMediaChannel::GetReceiveChannelId(uint32_t ssrc) const { | 2677 int WebRtcVoiceMediaChannel::GetReceiveChannelId(uint32_t ssrc) const { | 
| 2715   RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 2678   RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 
| 2716   const auto it = receive_channels_.find(ssrc); | 2679   const auto it = receive_channels_.find(ssrc); | 
| 2717   if (it != receive_channels_.end()) { | 2680   if (it != receive_channels_.end()) { | 
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2780       LOG_RTCERR1(StartPlayout, channel); | 2743       LOG_RTCERR1(StartPlayout, channel); | 
| 2781       return false; | 2744       return false; | 
| 2782     } | 2745     } | 
| 2783   } else { | 2746   } else { | 
| 2784     LOG(LS_INFO) << "Stopping playout for channel #" << channel; | 2747     LOG(LS_INFO) << "Stopping playout for channel #" << channel; | 
| 2785     engine()->voe()->base()->StopPlayout(channel); | 2748     engine()->voe()->base()->StopPlayout(channel); | 
| 2786   } | 2749   } | 
| 2787   return true; | 2750   return true; | 
| 2788 } | 2751 } | 
| 2789 | 2752 | 
| 2790 // Convert VoiceEngine error code into VoiceMediaChannel::Error enum. |  | 
| 2791 VoiceMediaChannel::Error |  | 
| 2792     WebRtcVoiceMediaChannel::WebRtcErrorToChannelError(int err_code) { |  | 
| 2793   switch (err_code) { |  | 
| 2794     case 0: |  | 
| 2795       return ERROR_NONE; |  | 
| 2796     case VE_CANNOT_START_RECORDING: |  | 
| 2797     case VE_MIC_VOL_ERROR: |  | 
| 2798     case VE_GET_MIC_VOL_ERROR: |  | 
| 2799     case VE_CANNOT_ACCESS_MIC_VOL: |  | 
| 2800       return ERROR_REC_DEVICE_OPEN_FAILED; |  | 
| 2801     case VE_SATURATION_WARNING: |  | 
| 2802       return ERROR_REC_DEVICE_SATURATION; |  | 
| 2803     case VE_REC_DEVICE_REMOVED: |  | 
| 2804       return ERROR_REC_DEVICE_REMOVED; |  | 
| 2805     case VE_RUNTIME_REC_WARNING: |  | 
| 2806     case VE_RUNTIME_REC_ERROR: |  | 
| 2807       return ERROR_REC_RUNTIME_ERROR; |  | 
| 2808     case VE_CANNOT_START_PLAYOUT: |  | 
| 2809     case VE_SPEAKER_VOL_ERROR: |  | 
| 2810     case VE_GET_SPEAKER_VOL_ERROR: |  | 
| 2811     case VE_CANNOT_ACCESS_SPEAKER_VOL: |  | 
| 2812       return ERROR_PLAY_DEVICE_OPEN_FAILED; |  | 
| 2813     case VE_RUNTIME_PLAY_WARNING: |  | 
| 2814     case VE_RUNTIME_PLAY_ERROR: |  | 
| 2815       return ERROR_PLAY_RUNTIME_ERROR; |  | 
| 2816     case VE_TYPING_NOISE_WARNING: |  | 
| 2817       return ERROR_REC_TYPING_NOISE_DETECTED; |  | 
| 2818     default: |  | 
| 2819       return VoiceMediaChannel::ERROR_OTHER; |  | 
| 2820   } |  | 
| 2821 } |  | 
| 2822 |  | 
| 2823 bool WebRtcVoiceMediaChannel::SetHeaderExtension(ExtensionSetterFunction setter, | 2753 bool WebRtcVoiceMediaChannel::SetHeaderExtension(ExtensionSetterFunction setter, | 
| 2824     int channel_id, const RtpHeaderExtension* extension) { | 2754     int channel_id, const RtpHeaderExtension* extension) { | 
| 2825   bool enable = false; | 2755   bool enable = false; | 
| 2826   int id = 0; | 2756   int id = 0; | 
| 2827   std::string uri; | 2757   std::string uri; | 
| 2828   if (extension) { | 2758   if (extension) { | 
| 2829     enable = true; | 2759     enable = true; | 
| 2830     id = extension->id; | 2760     id = extension->id; | 
| 2831     uri = extension->uri; | 2761     uri = extension->uri; | 
| 2832   } | 2762   } | 
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2893       LOG(LS_WARNING) << "Unknown codec " << ToString(codec); | 2823       LOG(LS_WARNING) << "Unknown codec " << ToString(codec); | 
| 2894       return false; | 2824       return false; | 
| 2895     } | 2825     } | 
| 2896   } | 2826   } | 
| 2897   return true; | 2827   return true; | 
| 2898 } | 2828 } | 
| 2899 | 2829 | 
| 2900 }  // namespace cricket | 2830 }  // namespace cricket | 
| 2901 | 2831 | 
| 2902 #endif  // HAVE_WEBRTC_VOICE | 2832 #endif  // HAVE_WEBRTC_VOICE | 
| OLD | NEW | 
|---|