OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/renderer_host/media/media_stream_manager.h" | 5 #include "content/browser/renderer_host/media/media_stream_manager.h" |
6 | 6 |
7 #include <list> | 7 #include <list> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 StreamDeviceInfoArray video_devices; | 130 StreamDeviceInfoArray video_devices; |
131 }; | 131 }; |
132 | 132 |
133 MediaStreamManager::MediaStreamManager( | 133 MediaStreamManager::MediaStreamManager( |
134 AudioInputDeviceManager* audio_input_device_manager, | 134 AudioInputDeviceManager* audio_input_device_manager, |
135 VideoCaptureManager* video_capture_manager) | 135 VideoCaptureManager* video_capture_manager) |
136 : ALLOW_THIS_IN_INITIALIZER_LIST( | 136 : ALLOW_THIS_IN_INITIALIZER_LIST( |
137 device_settings_(new MediaStreamDeviceSettings(this))), | 137 device_settings_(new MediaStreamDeviceSettings(this))), |
138 audio_input_device_manager_(audio_input_device_manager), | 138 audio_input_device_manager_(audio_input_device_manager), |
139 video_capture_manager_(video_capture_manager), | 139 video_capture_manager_(video_capture_manager), |
140 enumeration_in_progress_(content::NUM_MEDIA_STREAM_DEVICE_TYPES, false) { | 140 enumeration_in_progress_(content::NUM_MEDIA_STREAM_DEVICE_TYPES, false), |
| 141 io_loop_(NULL) { |
141 } | 142 } |
142 | 143 |
143 MediaStreamManager::~MediaStreamManager() { | 144 MediaStreamManager::~MediaStreamManager() { |
144 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 145 DCHECK(requests_.empty()); |
145 if (device_thread_.get()) { | 146 DCHECK(!device_thread_.get()); |
146 video_capture_manager_->Unregister(); | 147 DCHECK(!io_loop_); |
147 audio_input_device_manager_->Unregister(); | |
148 device_thread_->Stop(); | |
149 } | |
150 } | 148 } |
151 | 149 |
152 VideoCaptureManager* MediaStreamManager::video_capture_manager() { | 150 VideoCaptureManager* MediaStreamManager::video_capture_manager() { |
153 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 151 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
154 DCHECK(video_capture_manager_.get()); | 152 DCHECK(video_capture_manager_); |
155 EnsureDeviceThreadAndListener(); | 153 EnsureDeviceThreadAndListener(); |
156 return video_capture_manager_.get(); | 154 return video_capture_manager_; |
157 } | 155 } |
158 | 156 |
159 AudioInputDeviceManager* MediaStreamManager::audio_input_device_manager() { | 157 AudioInputDeviceManager* MediaStreamManager::audio_input_device_manager() { |
160 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 158 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
161 DCHECK(audio_input_device_manager_.get()); | 159 DCHECK(audio_input_device_manager_); |
162 EnsureDeviceThreadAndListener(); | 160 EnsureDeviceThreadAndListener(); |
163 return audio_input_device_manager_.get(); | 161 return audio_input_device_manager_; |
164 } | 162 } |
165 | 163 |
166 void MediaStreamManager::GenerateStream(MediaStreamRequester* requester, | 164 void MediaStreamManager::GenerateStream(MediaStreamRequester* requester, |
167 int render_process_id, | 165 int render_process_id, |
168 int render_view_id, | 166 int render_view_id, |
169 const StreamOptions& options, | 167 const StreamOptions& options, |
170 const GURL& security_origin, | 168 const GURL& security_origin, |
171 std::string* label) { | 169 std::string* label) { |
172 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 170 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
173 | 171 |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 365 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
368 if (device_thread_.get()) | 366 if (device_thread_.get()) |
369 return; | 367 return; |
370 | 368 |
371 device_thread_.reset(new DeviceThread("MediaStreamDeviceThread")); | 369 device_thread_.reset(new DeviceThread("MediaStreamDeviceThread")); |
372 CHECK(device_thread_->Start()); | 370 CHECK(device_thread_->Start()); |
373 | 371 |
374 audio_input_device_manager_->Register(this, | 372 audio_input_device_manager_->Register(this, |
375 device_thread_->message_loop_proxy()); | 373 device_thread_->message_loop_proxy()); |
376 video_capture_manager_->Register(this, device_thread_->message_loop_proxy()); | 374 video_capture_manager_->Register(this, device_thread_->message_loop_proxy()); |
| 375 |
| 376 // We want to be notified of IO message loop destruction to delete the thread |
| 377 // and the device managers. |
| 378 io_loop_ = MessageLoop::current(); |
| 379 io_loop_->AddDestructionObserver(this); |
377 } | 380 } |
378 | 381 |
379 void MediaStreamManager::Opened(MediaStreamType stream_type, | 382 void MediaStreamManager::Opened(MediaStreamType stream_type, |
380 int capture_session_id) { | 383 int capture_session_id) { |
381 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 384 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
382 | 385 |
383 // Find the request containing this device and mark it as used. | 386 // Find the request containing this device and mark it as used. |
384 DeviceRequest* request = NULL; | 387 DeviceRequest* request = NULL; |
385 StreamDeviceInfoArray* devices = NULL; | 388 StreamDeviceInfoArray* devices = NULL; |
386 std::string label; | 389 std::string label; |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
615 return; | 618 return; |
616 } | 619 } |
617 } | 620 } |
618 | 621 |
619 void MediaStreamManager::UseFakeDevice() { | 622 void MediaStreamManager::UseFakeDevice() { |
620 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 623 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
621 video_capture_manager()->UseFakeDevice(); | 624 video_capture_manager()->UseFakeDevice(); |
622 device_settings_->UseFakeUI(); | 625 device_settings_->UseFakeUI(); |
623 } | 626 } |
624 | 627 |
| 628 void MediaStreamManager::WillDestroyCurrentMessageLoop() { |
| 629 DCHECK_EQ(MessageLoop::current(), io_loop_); |
| 630 if (device_thread_.get()) { |
| 631 video_capture_manager_->Unregister(); |
| 632 audio_input_device_manager_->Unregister(); |
| 633 device_thread_.reset(); |
| 634 } |
| 635 |
| 636 audio_input_device_manager_ = NULL; |
| 637 video_capture_manager_ = NULL; |
| 638 io_loop_ = NULL; |
| 639 device_settings_.reset(); |
| 640 } |
| 641 |
625 void MediaStreamManager::NotifyObserverDevicesOpened(DeviceRequest* request) { | 642 void MediaStreamManager::NotifyObserverDevicesOpened(DeviceRequest* request) { |
626 content::MediaObserver* media_observer = | 643 content::MediaObserver* media_observer = |
627 content::GetContentClient()->browser()->GetMediaObserver(); | 644 content::GetContentClient()->browser()->GetMediaObserver(); |
628 content::MediaStreamDevices opened_devices; | 645 content::MediaStreamDevices opened_devices; |
629 DevicesFromRequest(request, &opened_devices); | 646 DevicesFromRequest(request, &opened_devices); |
630 DCHECK(!opened_devices.empty()); | 647 DCHECK(!opened_devices.empty()); |
631 media_observer->OnCaptureDevicesOpened(request->render_process_id, | 648 media_observer->OnCaptureDevicesOpened(request->render_process_id, |
632 request->render_view_id, | 649 request->render_view_id, |
633 opened_devices); | 650 opened_devices); |
634 } | 651 } |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
697 if (stream_type == content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE) { | 714 if (stream_type == content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE) { |
698 return video_capture_manager(); | 715 return video_capture_manager(); |
699 } else if (stream_type == content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE) { | 716 } else if (stream_type == content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE) { |
700 return audio_input_device_manager(); | 717 return audio_input_device_manager(); |
701 } | 718 } |
702 NOTREACHED(); | 719 NOTREACHED(); |
703 return NULL; | 720 return NULL; |
704 } | 721 } |
705 | 722 |
706 } // namespace media_stream | 723 } // namespace media_stream |
OLD | NEW |