diff --git a/webrtc/api/fakemediacontroller.h b/webrtc/api/fakemediacontroller.h index 2e539e813a..bc3f3e2fdd 100644 --- a/webrtc/api/fakemediacontroller.h +++ b/webrtc/api/fakemediacontroller.h @@ -26,6 +26,7 @@ class FakeMediaController : public webrtc::MediaControllerInterface { RTC_DCHECK(nullptr != call_); } ~FakeMediaController() override {} + void Close() override {} webrtc::Call* call_w() override { return call_; } cricket::ChannelManager* channel_manager() const override { return channel_manager_; diff --git a/webrtc/api/mediacontroller.cc b/webrtc/api/mediacontroller.cc index 341c013ed1..71964d52a7 100644 --- a/webrtc/api/mediacontroller.cc +++ b/webrtc/api/mediacontroller.cc @@ -25,50 +25,55 @@ const int kMaxBandwidthBps = 2000000; class MediaController : public webrtc::MediaControllerInterface, public sigslot::has_slots<> { public: - MediaController(const cricket::MediaConfig& config, + MediaController(const cricket::MediaConfig& media_config, rtc::Thread* worker_thread, cricket::ChannelManager* channel_manager) : worker_thread_(worker_thread), - config_(config), + media_config_(media_config), channel_manager_(channel_manager) { - RTC_DCHECK(nullptr != worker_thread); + RTC_DCHECK(worker_thread); worker_thread_->Invoke( rtc::Bind(&MediaController::Construct_w, this, channel_manager_->media_engine())); } ~MediaController() override { - worker_thread_->Invoke(rtc::Bind(&MediaController::Destruct_w, this)); + Close(); } + // webrtc::MediaControllerInterface implementation. + void Close() override { + worker_thread_->Invoke(rtc::Bind(&MediaController::Close_w, this)); + } webrtc::Call* call_w() override { RTC_DCHECK(worker_thread_->IsCurrent()); + if (!call_) { + call_.reset(webrtc::Call::Create(call_config_)); + } return call_.get(); } - cricket::ChannelManager* channel_manager() const override { return channel_manager_; } - const cricket::MediaConfig& config() const override { return config_; } + const cricket::MediaConfig& config() const override { return media_config_; } private: void Construct_w(cricket::MediaEngineInterface* media_engine) { RTC_DCHECK(worker_thread_->IsCurrent()); RTC_DCHECK(media_engine); - webrtc::Call::Config config; - config.audio_state = media_engine->GetAudioState(); - config.bitrate_config.min_bitrate_bps = kMinBandwidthBps; - config.bitrate_config.start_bitrate_bps = kStartBandwidthBps; - config.bitrate_config.max_bitrate_bps = kMaxBandwidthBps; - call_.reset(webrtc::Call::Create(config)); + call_config_.audio_state = media_engine->GetAudioState(); + call_config_.bitrate_config.min_bitrate_bps = kMinBandwidthBps; + call_config_.bitrate_config.start_bitrate_bps = kStartBandwidthBps; + call_config_.bitrate_config.max_bitrate_bps = kMaxBandwidthBps; } - void Destruct_w() { + void Close_w() { RTC_DCHECK(worker_thread_->IsCurrent()); call_.reset(); } rtc::Thread* const worker_thread_; - const cricket::MediaConfig config_; + const cricket::MediaConfig media_config_; cricket::ChannelManager* const channel_manager_; + webrtc::Call::Config call_config_; rtc::scoped_ptr call_; RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(MediaController); diff --git a/webrtc/api/mediacontroller.h b/webrtc/api/mediacontroller.h index 7b6a2a3e3e..d7c76ab499 100644 --- a/webrtc/api/mediacontroller.h +++ b/webrtc/api/mediacontroller.h @@ -32,6 +32,7 @@ class MediaControllerInterface { cricket::ChannelManager* channel_manager); virtual ~MediaControllerInterface() {} + virtual void Close() = 0; virtual webrtc::Call* call_w() = 0; virtual cricket::ChannelManager* channel_manager() const = 0; virtual const cricket::MediaConfig& config() const = 0; diff --git a/webrtc/api/statscollector.cc b/webrtc/api/statscollector.cc index ca1548fa0d..7fb0c2b7b3 100644 --- a/webrtc/api/statscollector.cc +++ b/webrtc/api/statscollector.cc @@ -462,6 +462,8 @@ StatsCollector::UpdateStats(PeerConnectionInterface::StatsOutputLevel level) { } stats_gathering_started_ = time_now; + // TODO(pthatcher): Merge PeerConnection and WebRtcSession so there is no + // pc_->session(). if (pc_->session()) { // TODO(tommi): All of these hop over to the worker thread to fetch // information. We could use an AsyncInvoker to run all of these and post diff --git a/webrtc/api/webrtcsession.cc b/webrtc/api/webrtcsession.cc index 6bfa8a5eb6..455be0f808 100644 --- a/webrtc/api/webrtcsession.cc +++ b/webrtc/api/webrtcsession.cc @@ -648,6 +648,7 @@ void WebRtcSession::Close() { ASSERT(!voice_channel_); ASSERT(!video_channel_); ASSERT(!data_channel_); + media_controller_->Close(); } cricket::BaseChannel* WebRtcSession::GetChannel(