| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  *  Copyright (c) 2004 The WebRTC project authors. All Rights Reserved. | 2  *  Copyright (c) 2004 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 15 matching lines...) Expand all  Loading... | 
| 26 #include "webrtc/base/base64.h" | 26 #include "webrtc/base/base64.h" | 
| 27 #include "webrtc/base/byteorder.h" | 27 #include "webrtc/base/byteorder.h" | 
| 28 #include "webrtc/base/common.h" | 28 #include "webrtc/base/common.h" | 
| 29 #include "webrtc/base/helpers.h" | 29 #include "webrtc/base/helpers.h" | 
| 30 #include "webrtc/base/logging.h" | 30 #include "webrtc/base/logging.h" | 
| 31 #include "webrtc/base/stringencode.h" | 31 #include "webrtc/base/stringencode.h" | 
| 32 #include "webrtc/base/stringutils.h" | 32 #include "webrtc/base/stringutils.h" | 
| 33 #include "webrtc/call/rtc_event_log.h" | 33 #include "webrtc/call/rtc_event_log.h" | 
| 34 #include "webrtc/common.h" | 34 #include "webrtc/common.h" | 
| 35 #include "webrtc/media/base/audioframe.h" | 35 #include "webrtc/media/base/audioframe.h" | 
| 36 #include "webrtc/media/base/audiorenderer.h" | 36 #include "webrtc/media/base/audiosource.h" | 
| 37 #include "webrtc/media/base/mediaconstants.h" | 37 #include "webrtc/media/base/mediaconstants.h" | 
| 38 #include "webrtc/media/base/streamparams.h" | 38 #include "webrtc/media/base/streamparams.h" | 
| 39 #include "webrtc/media/engine/webrtcmediaengine.h" | 39 #include "webrtc/media/engine/webrtcmediaengine.h" | 
| 40 #include "webrtc/media/engine/webrtcvoe.h" | 40 #include "webrtc/media/engine/webrtcvoe.h" | 
| 41 #include "webrtc/modules/audio_coding/acm2/rent_a_codec.h" | 41 #include "webrtc/modules/audio_coding/acm2/rent_a_codec.h" | 
| 42 #include "webrtc/modules/audio_processing/include/audio_processing.h" | 42 #include "webrtc/modules/audio_processing/include/audio_processing.h" | 
| 43 #include "webrtc/system_wrappers/include/field_trial.h" | 43 #include "webrtc/system_wrappers/include/field_trial.h" | 
| 44 #include "webrtc/system_wrappers/include/trace.h" | 44 #include "webrtc/system_wrappers/include/trace.h" | 
| 45 | 45 | 
| 46 namespace cricket { | 46 namespace cricket { | 
| (...skipping 1084 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1131   } | 1131   } | 
| 1132   LOG_RTCERR0(StopRtcEventLog); | 1132   LOG_RTCERR0(StopRtcEventLog); | 
| 1133 } | 1133 } | 
| 1134 | 1134 | 
| 1135 int WebRtcVoiceEngine::CreateVoEChannel() { | 1135 int WebRtcVoiceEngine::CreateVoEChannel() { | 
| 1136   RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 1136   RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 
| 1137   return voe_wrapper_->base()->CreateChannel(voe_config_); | 1137   return voe_wrapper_->base()->CreateChannel(voe_config_); | 
| 1138 } | 1138 } | 
| 1139 | 1139 | 
| 1140 class WebRtcVoiceMediaChannel::WebRtcAudioSendStream | 1140 class WebRtcVoiceMediaChannel::WebRtcAudioSendStream | 
| 1141     : public AudioRenderer::Sink { | 1141     : public AudioSource::Sink { | 
| 1142  public: | 1142  public: | 
| 1143   WebRtcAudioSendStream(int ch, webrtc::AudioTransport* voe_audio_transport, | 1143   WebRtcAudioSendStream(int ch, webrtc::AudioTransport* voe_audio_transport, | 
| 1144                         uint32_t ssrc, const std::string& c_name, | 1144                         uint32_t ssrc, const std::string& c_name, | 
| 1145                         const std::vector<webrtc::RtpExtension>& extensions, | 1145                         const std::vector<webrtc::RtpExtension>& extensions, | 
| 1146                         webrtc::Call* call) | 1146                         webrtc::Call* call) | 
| 1147       : voe_audio_transport_(voe_audio_transport), | 1147       : voe_audio_transport_(voe_audio_transport), | 
| 1148         call_(call), | 1148         call_(call), | 
| 1149         config_(nullptr) { | 1149         config_(nullptr) { | 
| 1150     RTC_DCHECK_GE(ch, 0); | 1150     RTC_DCHECK_GE(ch, 0); | 
| 1151     // TODO(solenberg): Once we're not using FakeWebRtcVoiceEngine anymore: | 1151     // TODO(solenberg): Once we're not using FakeWebRtcVoiceEngine anymore: | 
| 1152     // RTC_DCHECK(voe_audio_transport); | 1152     // RTC_DCHECK(voe_audio_transport); | 
| 1153     RTC_DCHECK(call); | 1153     RTC_DCHECK(call); | 
| 1154     audio_capture_thread_checker_.DetachFromThread(); | 1154     audio_capture_thread_checker_.DetachFromThread(); | 
| 1155     config_.rtp.ssrc = ssrc; | 1155     config_.rtp.ssrc = ssrc; | 
| 1156     config_.rtp.c_name = c_name; | 1156     config_.rtp.c_name = c_name; | 
| 1157     config_.voe_channel_id = ch; | 1157     config_.voe_channel_id = ch; | 
| 1158     RecreateAudioSendStream(extensions); | 1158     RecreateAudioSendStream(extensions); | 
| 1159   } | 1159   } | 
| 1160 | 1160 | 
| 1161   ~WebRtcAudioSendStream() override { | 1161   ~WebRtcAudioSendStream() override { | 
| 1162     RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 1162     RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 
| 1163     Stop(); | 1163     ClearSource(); | 
| 1164     call_->DestroyAudioSendStream(stream_); | 1164     call_->DestroyAudioSendStream(stream_); | 
| 1165   } | 1165   } | 
| 1166 | 1166 | 
| 1167   void RecreateAudioSendStream( | 1167   void RecreateAudioSendStream( | 
| 1168       const std::vector<webrtc::RtpExtension>& extensions) { | 1168       const std::vector<webrtc::RtpExtension>& extensions) { | 
| 1169     RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 1169     RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 
| 1170     if (stream_) { | 1170     if (stream_) { | 
| 1171       call_->DestroyAudioSendStream(stream_); | 1171       call_->DestroyAudioSendStream(stream_); | 
| 1172       stream_ = nullptr; | 1172       stream_ = nullptr; | 
| 1173     } | 1173     } | 
| 1174     config_.rtp.extensions = extensions; | 1174     config_.rtp.extensions = extensions; | 
| 1175     RTC_DCHECK(!stream_); | 1175     RTC_DCHECK(!stream_); | 
| 1176     stream_ = call_->CreateAudioSendStream(config_); | 1176     stream_ = call_->CreateAudioSendStream(config_); | 
| 1177     RTC_CHECK(stream_); | 1177     RTC_CHECK(stream_); | 
| 1178   } | 1178   } | 
| 1179 | 1179 | 
| 1180   bool SendTelephoneEvent(int payload_type, uint8_t event, | 1180   bool SendTelephoneEvent(int payload_type, uint8_t event, | 
| 1181                           uint32_t duration_ms) { | 1181                           uint32_t duration_ms) { | 
| 1182     RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 1182     RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 
| 1183     RTC_DCHECK(stream_); | 1183     RTC_DCHECK(stream_); | 
| 1184     return stream_->SendTelephoneEvent(payload_type, event, duration_ms); | 1184     return stream_->SendTelephoneEvent(payload_type, event, duration_ms); | 
| 1185   } | 1185   } | 
| 1186 | 1186 | 
|  | 1187   void SetSend(bool send) { | 
|  | 1188     RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 
|  | 1189     send_ = send; | 
|  | 1190     UpdateSendState(); | 
|  | 1191   } | 
|  | 1192 | 
| 1187   webrtc::AudioSendStream::Stats GetStats() const { | 1193   webrtc::AudioSendStream::Stats GetStats() const { | 
| 1188     RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 1194     RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 
| 1189     RTC_DCHECK(stream_); | 1195     RTC_DCHECK(stream_); | 
| 1190     return stream_->GetStats(); | 1196     return stream_->GetStats(); | 
| 1191   } | 1197   } | 
| 1192 | 1198 | 
| 1193   // Starts the rendering by setting a sink to the renderer to get data | 1199   // Starts the sending by setting ourselves as a sink to the AudioSource to | 
| 1194   // callback. | 1200   // get data callbacks. | 
| 1195   // This method is called on the libjingle worker thread. | 1201   // This method is called on the libjingle worker thread. | 
| 1196   // TODO(xians): Make sure Start() is called only once. | 1202   // TODO(xians): Make sure Start() is called only once. | 
| 1197   void Start(AudioRenderer* renderer) { | 1203   void SetSource(AudioSource* source) { | 
| 1198     RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 1204     RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 
| 1199     RTC_DCHECK(renderer); | 1205     RTC_DCHECK(source); | 
| 1200     if (renderer_) { | 1206     if (source_) { | 
| 1201       RTC_DCHECK(renderer_ == renderer); | 1207       RTC_DCHECK(source_ == source); | 
| 1202       return; | 1208       return; | 
| 1203     } | 1209     } | 
| 1204     renderer->SetSink(this); | 1210     source->SetSink(this); | 
| 1205     renderer_ = renderer; | 1211     source_ = source; | 
|  | 1212     UpdateSendState(); | 
| 1206   } | 1213   } | 
| 1207 | 1214 | 
| 1208   // Stops rendering by setting the sink of the renderer to nullptr. No data | 1215   // Stops sending by setting the sink of the AudioSource to nullptr. No data | 
| 1209   // callback will be received after this method. | 1216   // callback will be received after this method. | 
| 1210   // This method is called on the libjingle worker thread. | 1217   // This method is called on the libjingle worker thread. | 
| 1211   void Stop() { | 1218   void ClearSource() { | 
| 1212     RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 1219     RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 
| 1213     if (renderer_) { | 1220     if (source_) { | 
| 1214       renderer_->SetSink(nullptr); | 1221       source_->SetSink(nullptr); | 
| 1215       renderer_ = nullptr; | 1222       source_ = nullptr; | 
| 1216     } | 1223     } | 
|  | 1224     UpdateSendState(); | 
| 1217   } | 1225   } | 
| 1218 | 1226 | 
| 1219   // AudioRenderer::Sink implementation. | 1227   // AudioSource::Sink implementation. | 
| 1220   // This method is called on the audio thread. | 1228   // This method is called on the audio thread. | 
| 1221   void OnData(const void* audio_data, | 1229   void OnData(const void* audio_data, | 
| 1222               int bits_per_sample, | 1230               int bits_per_sample, | 
| 1223               int sample_rate, | 1231               int sample_rate, | 
| 1224               size_t number_of_channels, | 1232               size_t number_of_channels, | 
| 1225               size_t number_of_frames) override { | 1233               size_t number_of_frames) override { | 
| 1226     RTC_DCHECK(!worker_thread_checker_.CalledOnValidThread()); | 1234     RTC_DCHECK(!worker_thread_checker_.CalledOnValidThread()); | 
| 1227     RTC_DCHECK(audio_capture_thread_checker_.CalledOnValidThread()); | 1235     RTC_DCHECK(audio_capture_thread_checker_.CalledOnValidThread()); | 
| 1228     RTC_DCHECK(voe_audio_transport_); | 1236     RTC_DCHECK(voe_audio_transport_); | 
| 1229     voe_audio_transport_->OnData(config_.voe_channel_id, | 1237     voe_audio_transport_->OnData(config_.voe_channel_id, | 
| 1230                                  audio_data, | 1238                                  audio_data, | 
| 1231                                  bits_per_sample, | 1239                                  bits_per_sample, | 
| 1232                                  sample_rate, | 1240                                  sample_rate, | 
| 1233                                  number_of_channels, | 1241                                  number_of_channels, | 
| 1234                                  number_of_frames); | 1242                                  number_of_frames); | 
| 1235   } | 1243   } | 
| 1236 | 1244 | 
| 1237   // Callback from the |renderer_| when it is going away. In case Start() has | 1245   // Callback from the |source_| when it is going away. In case Start() has | 
| 1238   // never been called, this callback won't be triggered. | 1246   // never been called, this callback won't be triggered. | 
| 1239   void OnClose() override { | 1247   void OnClose() override { | 
| 1240     RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 1248     RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 
| 1241     // Set |renderer_| to nullptr to make sure no more callback will get into | 1249     // Set |source_| to nullptr to make sure no more callback will get into | 
| 1242     // the renderer. | 1250     // the source. | 
| 1243     renderer_ = nullptr; | 1251     source_ = nullptr; | 
|  | 1252     UpdateSendState(); | 
| 1244   } | 1253   } | 
| 1245 | 1254 | 
| 1246   // Accessor to the VoE channel ID. | 1255   // Accessor to the VoE channel ID. | 
| 1247   int channel() const { | 1256   int channel() const { | 
| 1248     RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 1257     RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 
| 1249     return config_.voe_channel_id; | 1258     return config_.voe_channel_id; | 
| 1250   } | 1259   } | 
| 1251 | 1260 | 
| 1252  private: | 1261  private: | 
|  | 1262   void UpdateSendState() { | 
|  | 1263     RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 
|  | 1264     RTC_DCHECK(stream_); | 
|  | 1265     if (send_ && source_ != nullptr) { | 
|  | 1266       stream_->Start(); | 
|  | 1267     } else {  // !send || source_ = nullptr | 
|  | 1268       stream_->Stop(); | 
|  | 1269     } | 
|  | 1270   } | 
|  | 1271 | 
| 1253   rtc::ThreadChecker worker_thread_checker_; | 1272   rtc::ThreadChecker worker_thread_checker_; | 
| 1254   rtc::ThreadChecker audio_capture_thread_checker_; | 1273   rtc::ThreadChecker audio_capture_thread_checker_; | 
| 1255   webrtc::AudioTransport* const voe_audio_transport_ = nullptr; | 1274   webrtc::AudioTransport* const voe_audio_transport_ = nullptr; | 
| 1256   webrtc::Call* call_ = nullptr; | 1275   webrtc::Call* call_ = nullptr; | 
| 1257   webrtc::AudioSendStream::Config config_; | 1276   webrtc::AudioSendStream::Config config_; | 
| 1258   // The stream is owned by WebRtcAudioSendStream and may be reallocated if | 1277   // The stream is owned by WebRtcAudioSendStream and may be reallocated if | 
| 1259   // configuration changes. | 1278   // configuration changes. | 
| 1260   webrtc::AudioSendStream* stream_ = nullptr; | 1279   webrtc::AudioSendStream* stream_ = nullptr; | 
| 1261 | 1280 | 
| 1262   // Raw pointer to AudioRenderer owned by LocalAudioTrackHandler. | 1281   // Raw pointer to AudioSource owned by LocalAudioTrackHandler. | 
| 1263   // PeerConnection will make sure invalidating the pointer before the object | 1282   // PeerConnection will make sure invalidating the pointer before the object | 
| 1264   // goes away. | 1283   // goes away. | 
| 1265   AudioRenderer* renderer_ = nullptr; | 1284   AudioSource* source_ = nullptr; | 
|  | 1285   bool send_ = false; | 
| 1266 | 1286 | 
| 1267   RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(WebRtcAudioSendStream); | 1287   RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(WebRtcAudioSendStream); | 
| 1268 }; | 1288 }; | 
| 1269 | 1289 | 
| 1270 class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream { | 1290 class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream { | 
| 1271  public: | 1291  public: | 
| 1272   WebRtcAudioReceiveStream(int ch, | 1292   WebRtcAudioReceiveStream(int ch, | 
| 1273                            uint32_t remote_ssrc, | 1293                            uint32_t remote_ssrc, | 
| 1274                            uint32_t local_ssrc, | 1294                            uint32_t local_ssrc, | 
| 1275                            bool use_transport_cc, | 1295                            bool use_transport_cc, | 
| (...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1820     if (!SetPlayout(ch.second->channel(), playout)) { | 1840     if (!SetPlayout(ch.second->channel(), playout)) { | 
| 1821       LOG(LS_ERROR) << "SetPlayout " << playout << " on channel " | 1841       LOG(LS_ERROR) << "SetPlayout " << playout << " on channel " | 
| 1822                     << ch.second->channel() << " failed"; | 1842                     << ch.second->channel() << " failed"; | 
| 1823       return false; | 1843       return false; | 
| 1824     } | 1844     } | 
| 1825   } | 1845   } | 
| 1826   playout_ = playout; | 1846   playout_ = playout; | 
| 1827   return true; | 1847   return true; | 
| 1828 } | 1848 } | 
| 1829 | 1849 | 
| 1830 bool WebRtcVoiceMediaChannel::SetSend(SendFlags send) { | 1850 void WebRtcVoiceMediaChannel::SetSend(bool send) { | 
| 1831   desired_send_ = send; |  | 
| 1832   if (!send_streams_.empty()) { |  | 
| 1833     return ChangeSend(desired_send_); |  | 
| 1834   } |  | 
| 1835   return true; |  | 
| 1836 } |  | 
| 1837 |  | 
| 1838 bool WebRtcVoiceMediaChannel::PauseSend() { |  | 
| 1839   return ChangeSend(SEND_NOTHING); |  | 
| 1840 } |  | 
| 1841 |  | 
| 1842 bool WebRtcVoiceMediaChannel::ResumeSend() { |  | 
| 1843   return ChangeSend(desired_send_); |  | 
| 1844 } |  | 
| 1845 |  | 
| 1846 bool WebRtcVoiceMediaChannel::ChangeSend(SendFlags send) { |  | 
| 1847   if (send_ == send) { | 1851   if (send_ == send) { | 
| 1848     return true; | 1852     return; | 
| 1849   } | 1853   } | 
| 1850 | 1854 | 
| 1851   // Apply channel specific options when channel is enabled for sending. | 1855   // Apply channel specific options when channel is enabled for sending. | 
| 1852   if (send == SEND_MICROPHONE) { | 1856   if (send) { | 
| 1853     engine()->ApplyOptions(options_); | 1857     engine()->ApplyOptions(options_); | 
| 1854   } | 1858   } | 
| 1855 | 1859 | 
| 1856   // Change the settings on each send channel. | 1860   // Change the settings on each send channel. | 
| 1857   for (const auto& ch : send_streams_) { | 1861   for (auto& kv : send_streams_) { | 
| 1858     if (!ChangeSend(ch.second->channel(), send)) { | 1862     kv.second->SetSend(send); | 
| 1859       return false; |  | 
| 1860     } |  | 
| 1861   } | 1863   } | 
| 1862 | 1864 | 
| 1863   send_ = send; | 1865   send_ = send; | 
| 1864   return true; |  | 
| 1865 } |  | 
| 1866 |  | 
| 1867 bool WebRtcVoiceMediaChannel::ChangeSend(int channel, SendFlags send) { |  | 
| 1868   if (send == SEND_MICROPHONE) { |  | 
| 1869     if (engine()->voe()->base()->StartSend(channel) == -1) { |  | 
| 1870       LOG_RTCERR1(StartSend, channel); |  | 
| 1871       return false; |  | 
| 1872     } |  | 
| 1873   } else {  // SEND_NOTHING |  | 
| 1874     RTC_DCHECK(send == SEND_NOTHING); |  | 
| 1875     if (engine()->voe()->base()->StopSend(channel) == -1) { |  | 
| 1876       LOG_RTCERR1(StopSend, channel); |  | 
| 1877       return false; |  | 
| 1878     } |  | 
| 1879   } |  | 
| 1880 |  | 
| 1881   return true; |  | 
| 1882 } | 1866 } | 
| 1883 | 1867 | 
| 1884 bool WebRtcVoiceMediaChannel::SetAudioSend(uint32_t ssrc, | 1868 bool WebRtcVoiceMediaChannel::SetAudioSend(uint32_t ssrc, | 
| 1885                                            bool enable, | 1869                                            bool enable, | 
| 1886                                            const AudioOptions* options, | 1870                                            const AudioOptions* options, | 
| 1887                                            AudioRenderer* renderer) { | 1871                                            AudioSource* source) { | 
| 1888   RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 1872   RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 
| 1889   // TODO(solenberg): The state change should be fully rolled back if any one of | 1873   // TODO(solenberg): The state change should be fully rolled back if any one of | 
| 1890   //                  these calls fail. | 1874   //                  these calls fail. | 
| 1891   if (!SetLocalRenderer(ssrc, renderer)) { | 1875   if (!SetLocalSource(ssrc, source)) { | 
| 1892     return false; | 1876     return false; | 
| 1893   } | 1877   } | 
| 1894   if (!MuteStream(ssrc, !enable)) { | 1878   if (!MuteStream(ssrc, !enable)) { | 
| 1895     return false; | 1879     return false; | 
| 1896   } | 1880   } | 
| 1897   if (enable && options) { | 1881   if (enable && options) { | 
| 1898     return SetOptions(*options); | 1882     return SetOptions(*options); | 
| 1899   } | 1883   } | 
| 1900   return true; | 1884   return true; | 
| 1901 } | 1885 } | 
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1968       if (engine()->voe()->rtp()->SetLocalSSRC(recv_channel, ssrc) != 0) { | 1952       if (engine()->voe()->rtp()->SetLocalSSRC(recv_channel, ssrc) != 0) { | 
| 1969         LOG_RTCERR2(SetLocalSSRC, recv_channel, ssrc); | 1953         LOG_RTCERR2(SetLocalSSRC, recv_channel, ssrc); | 
| 1970         return false; | 1954         return false; | 
| 1971       } | 1955       } | 
| 1972       engine()->voe()->base()->AssociateSendChannel(recv_channel, channel); | 1956       engine()->voe()->base()->AssociateSendChannel(recv_channel, channel); | 
| 1973       LOG(LS_INFO) << "VoiceEngine channel #" << recv_channel | 1957       LOG(LS_INFO) << "VoiceEngine channel #" << recv_channel | 
| 1974                    << " is associated with channel #" << channel << "."; | 1958                    << " is associated with channel #" << channel << "."; | 
| 1975     } | 1959     } | 
| 1976   } | 1960   } | 
| 1977 | 1961 | 
| 1978   return ChangeSend(channel, desired_send_); | 1962   send_streams_[ssrc]->SetSend(send_); | 
|  | 1963   return true; | 
| 1979 } | 1964 } | 
| 1980 | 1965 | 
| 1981 bool WebRtcVoiceMediaChannel::RemoveSendStream(uint32_t ssrc) { | 1966 bool WebRtcVoiceMediaChannel::RemoveSendStream(uint32_t ssrc) { | 
| 1982   RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 1967   RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 
| 1983   LOG(LS_INFO) << "RemoveSendStream: " << ssrc; | 1968   LOG(LS_INFO) << "RemoveSendStream: " << ssrc; | 
| 1984 | 1969 | 
| 1985   auto it = send_streams_.find(ssrc); | 1970   auto it = send_streams_.find(ssrc); | 
| 1986   if (it == send_streams_.end()) { | 1971   if (it == send_streams_.end()) { | 
| 1987     LOG(LS_WARNING) << "Try to remove stream with ssrc " << ssrc | 1972     LOG(LS_WARNING) << "Try to remove stream with ssrc " << ssrc | 
| 1988                     << " which doesn't exist."; | 1973                     << " which doesn't exist."; | 
| 1989     return false; | 1974     return false; | 
| 1990   } | 1975   } | 
| 1991 | 1976 | 
| 1992   int channel = it->second->channel(); | 1977   it->second->SetSend(false); | 
| 1993   ChangeSend(channel, SEND_NOTHING); |  | 
| 1994 | 1978 | 
| 1995   // Clean up and delete the send stream+channel. | 1979   // Clean up and delete the send stream+channel. | 
|  | 1980   int channel = it->second->channel(); | 
| 1996   LOG(LS_INFO) << "Removing audio send stream " << ssrc | 1981   LOG(LS_INFO) << "Removing audio send stream " << ssrc | 
| 1997                << " with VoiceEngine channel #" << channel << "."; | 1982                << " with VoiceEngine channel #" << channel << "."; | 
| 1998   delete it->second; | 1983   delete it->second; | 
| 1999   send_streams_.erase(it); | 1984   send_streams_.erase(it); | 
| 2000   if (!DeleteVoEChannel(channel)) { | 1985   if (!DeleteVoEChannel(channel)) { | 
| 2001     return false; | 1986     return false; | 
| 2002   } | 1987   } | 
| 2003   if (send_streams_.empty()) { | 1988   if (send_streams_.empty()) { | 
| 2004     ChangeSend(SEND_NOTHING); | 1989     SetSend(false); | 
| 2005   } | 1990   } | 
| 2006   return true; | 1991   return true; | 
| 2007 } | 1992 } | 
| 2008 | 1993 | 
| 2009 bool WebRtcVoiceMediaChannel::AddRecvStream(const StreamParams& sp) { | 1994 bool WebRtcVoiceMediaChannel::AddRecvStream(const StreamParams& sp) { | 
| 2010   RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 1995   RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 
| 2011   LOG(LS_INFO) << "AddRecvStream: " << sp.ToString(); | 1996   LOG(LS_INFO) << "AddRecvStream: " << sp.ToString(); | 
| 2012 | 1997 | 
| 2013   if (!ValidateStreamParams(sp)) { | 1998   if (!ValidateStreamParams(sp)) { | 
| 2014     return false; | 1999     return false; | 
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2103 | 2088 | 
| 2104   // Clean up and delete the receive stream+channel. | 2089   // Clean up and delete the receive stream+channel. | 
| 2105   LOG(LS_INFO) << "Removing audio receive stream " << ssrc | 2090   LOG(LS_INFO) << "Removing audio receive stream " << ssrc | 
| 2106                << " with VoiceEngine channel #" << channel << "."; | 2091                << " with VoiceEngine channel #" << channel << "."; | 
| 2107   it->second->SetRawAudioSink(nullptr); | 2092   it->second->SetRawAudioSink(nullptr); | 
| 2108   delete it->second; | 2093   delete it->second; | 
| 2109   recv_streams_.erase(it); | 2094   recv_streams_.erase(it); | 
| 2110   return DeleteVoEChannel(channel); | 2095   return DeleteVoEChannel(channel); | 
| 2111 } | 2096 } | 
| 2112 | 2097 | 
| 2113 bool WebRtcVoiceMediaChannel::SetLocalRenderer(uint32_t ssrc, | 2098 bool WebRtcVoiceMediaChannel::SetLocalSource(uint32_t ssrc, | 
| 2114                                                AudioRenderer* renderer) { | 2099                                              AudioSource* source) { | 
| 2115   auto it = send_streams_.find(ssrc); | 2100   auto it = send_streams_.find(ssrc); | 
| 2116   if (it == send_streams_.end()) { | 2101   if (it == send_streams_.end()) { | 
| 2117     if (renderer) { | 2102     if (source) { | 
| 2118       // Return an error if trying to set a valid renderer with an invalid ssrc. | 2103       // Return an error if trying to set a valid source with an invalid ssrc. | 
| 2119       LOG(LS_ERROR) << "SetLocalRenderer failed with ssrc "<< ssrc; | 2104       LOG(LS_ERROR) << "SetLocalSource failed with ssrc " << ssrc; | 
| 2120       return false; | 2105       return false; | 
| 2121     } | 2106     } | 
| 2122 | 2107 | 
| 2123     // The channel likely has gone away, do nothing. | 2108     // The channel likely has gone away, do nothing. | 
| 2124     return true; | 2109     return true; | 
| 2125   } | 2110   } | 
| 2126 | 2111 | 
| 2127   if (renderer) { | 2112   if (source) { | 
| 2128     it->second->Start(renderer); | 2113     it->second->SetSource(source); | 
| 2129   } else { | 2114   } else { | 
| 2130     it->second->Stop(); | 2115     it->second->ClearSource(); | 
| 2131   } | 2116   } | 
| 2132 | 2117 | 
| 2133   return true; | 2118   return true; | 
| 2134 } | 2119 } | 
| 2135 | 2120 | 
| 2136 bool WebRtcVoiceMediaChannel::GetActiveStreams( | 2121 bool WebRtcVoiceMediaChannel::GetActiveStreams( | 
| 2137     AudioInfo::StreamList* actives) { | 2122     AudioInfo::StreamList* actives) { | 
| 2138   RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 2123   RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 
| 2139   actives->clear(); | 2124   actives->clear(); | 
| 2140   for (const auto& ch : recv_streams_) { | 2125   for (const auto& ch : recv_streams_) { | 
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2438     sinfo.codec_name = stats.codec_name; | 2423     sinfo.codec_name = stats.codec_name; | 
| 2439     sinfo.ext_seqnum = stats.ext_seqnum; | 2424     sinfo.ext_seqnum = stats.ext_seqnum; | 
| 2440     sinfo.jitter_ms = stats.jitter_ms; | 2425     sinfo.jitter_ms = stats.jitter_ms; | 
| 2441     sinfo.rtt_ms = stats.rtt_ms; | 2426     sinfo.rtt_ms = stats.rtt_ms; | 
| 2442     sinfo.audio_level = stats.audio_level; | 2427     sinfo.audio_level = stats.audio_level; | 
| 2443     sinfo.aec_quality_min = stats.aec_quality_min; | 2428     sinfo.aec_quality_min = stats.aec_quality_min; | 
| 2444     sinfo.echo_delay_median_ms = stats.echo_delay_median_ms; | 2429     sinfo.echo_delay_median_ms = stats.echo_delay_median_ms; | 
| 2445     sinfo.echo_delay_std_ms = stats.echo_delay_std_ms; | 2430     sinfo.echo_delay_std_ms = stats.echo_delay_std_ms; | 
| 2446     sinfo.echo_return_loss = stats.echo_return_loss; | 2431     sinfo.echo_return_loss = stats.echo_return_loss; | 
| 2447     sinfo.echo_return_loss_enhancement = stats.echo_return_loss_enhancement; | 2432     sinfo.echo_return_loss_enhancement = stats.echo_return_loss_enhancement; | 
| 2448     sinfo.typing_noise_detected = | 2433     sinfo.typing_noise_detected = (send_ ? stats.typing_noise_detected : false); | 
| 2449         (send_ == SEND_NOTHING ? false : stats.typing_noise_detected); |  | 
| 2450     info->senders.push_back(sinfo); | 2434     info->senders.push_back(sinfo); | 
| 2451   } | 2435   } | 
| 2452 | 2436 | 
| 2453   // Get SSRC and stats for each receiver. | 2437   // Get SSRC and stats for each receiver. | 
| 2454   RTC_DCHECK(info->receivers.size() == 0); | 2438   RTC_DCHECK(info->receivers.size() == 0); | 
| 2455   for (const auto& stream : recv_streams_) { | 2439   for (const auto& stream : recv_streams_) { | 
| 2456     webrtc::AudioReceiveStream::Stats stats = stream.second->GetStats(); | 2440     webrtc::AudioReceiveStream::Stats stats = stream.second->GetStats(); | 
| 2457     VoiceReceiverInfo rinfo; | 2441     VoiceReceiverInfo rinfo; | 
| 2458     rinfo.add_ssrc(stats.remote_ssrc); | 2442     rinfo.add_ssrc(stats.remote_ssrc); | 
| 2459     rinfo.bytes_rcvd = stats.bytes_rcvd; | 2443     rinfo.bytes_rcvd = stats.bytes_rcvd; | 
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2542     } | 2526     } | 
| 2543   } else { | 2527   } else { | 
| 2544     LOG(LS_INFO) << "Stopping playout for channel #" << channel; | 2528     LOG(LS_INFO) << "Stopping playout for channel #" << channel; | 
| 2545     engine()->voe()->base()->StopPlayout(channel); | 2529     engine()->voe()->base()->StopPlayout(channel); | 
| 2546   } | 2530   } | 
| 2547   return true; | 2531   return true; | 
| 2548 } | 2532 } | 
| 2549 }  // namespace cricket | 2533 }  // namespace cricket | 
| 2550 | 2534 | 
| 2551 #endif  // HAVE_WEBRTC_VOICE | 2535 #endif  // HAVE_WEBRTC_VOICE | 
| OLD | NEW | 
|---|