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 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 return true; | 55 return true; |
56 } | 56 } |
57 return false; | 57 return false; |
58 } | 58 } |
59 | 59 |
60 DeviceThread::DeviceThread(const char* name) | 60 DeviceThread::DeviceThread(const char* name) |
61 : base::Thread(name) { | 61 : base::Thread(name) { |
62 } | 62 } |
63 | 63 |
64 DeviceThread::~DeviceThread() { | 64 DeviceThread::~DeviceThread() { |
| 65 Stop(); |
65 } | 66 } |
66 | 67 |
67 void DeviceThread::Init() { | 68 void DeviceThread::Init() { |
68 using base::win::ScopedCOMInitializer; | 69 using base::win::ScopedCOMInitializer; |
69 // Enter the multi-threaded apartment. | 70 // Enter the multi-threaded apartment. |
70 com_initializer_.reset(new ScopedCOMInitializer(ScopedCOMInitializer::kMTA)); | 71 com_initializer_.reset(new ScopedCOMInitializer(ScopedCOMInitializer::kMTA)); |
71 } | 72 } |
72 | 73 |
73 void DeviceThread::CleanUp() { | 74 void DeviceThread::CleanUp() { |
74 com_initializer_.reset(); | 75 com_initializer_.reset(); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 StreamDeviceInfoArray video_devices; | 131 StreamDeviceInfoArray video_devices; |
131 }; | 132 }; |
132 | 133 |
133 MediaStreamManager::MediaStreamManager( | 134 MediaStreamManager::MediaStreamManager( |
134 AudioInputDeviceManager* audio_input_device_manager, | 135 AudioInputDeviceManager* audio_input_device_manager, |
135 VideoCaptureManager* video_capture_manager) | 136 VideoCaptureManager* video_capture_manager) |
136 : ALLOW_THIS_IN_INITIALIZER_LIST( | 137 : ALLOW_THIS_IN_INITIALIZER_LIST( |
137 device_settings_(new MediaStreamDeviceSettings(this))), | 138 device_settings_(new MediaStreamDeviceSettings(this))), |
138 audio_input_device_manager_(audio_input_device_manager), | 139 audio_input_device_manager_(audio_input_device_manager), |
139 video_capture_manager_(video_capture_manager), | 140 video_capture_manager_(video_capture_manager), |
140 enumeration_in_progress_(content::NUM_MEDIA_STREAM_DEVICE_TYPES, false) { | 141 enumeration_in_progress_(content::NUM_MEDIA_STREAM_DEVICE_TYPES, false), |
| 142 io_loop_(NULL) { |
141 } | 143 } |
142 | 144 |
143 MediaStreamManager::~MediaStreamManager() { | 145 MediaStreamManager::~MediaStreamManager() { |
144 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 146 DCHECK(requests_.empty()); |
145 if (device_thread_.get()) { | 147 DCHECK(!device_thread_.get()); |
146 video_capture_manager_->Unregister(); | 148 DCHECK(!io_loop_); |
147 audio_input_device_manager_->Unregister(); | |
148 device_thread_->Stop(); | |
149 } | |
150 } | 149 } |
151 | 150 |
152 VideoCaptureManager* MediaStreamManager::video_capture_manager() { | 151 VideoCaptureManager* MediaStreamManager::video_capture_manager() { |
153 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 152 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
154 DCHECK(video_capture_manager_.get()); | 153 DCHECK(video_capture_manager_); |
155 EnsureDeviceThreadAndListener(); | 154 EnsureDeviceThreadAndListener(); |
156 return video_capture_manager_.get(); | 155 return video_capture_manager_; |
157 } | 156 } |
158 | 157 |
159 AudioInputDeviceManager* MediaStreamManager::audio_input_device_manager() { | 158 AudioInputDeviceManager* MediaStreamManager::audio_input_device_manager() { |
160 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 159 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
161 DCHECK(audio_input_device_manager_.get()); | 160 DCHECK(audio_input_device_manager_); |
162 EnsureDeviceThreadAndListener(); | 161 EnsureDeviceThreadAndListener(); |
163 return audio_input_device_manager_.get(); | 162 return audio_input_device_manager_; |
164 } | 163 } |
165 | 164 |
166 void MediaStreamManager::GenerateStream(MediaStreamRequester* requester, | 165 void MediaStreamManager::GenerateStream(MediaStreamRequester* requester, |
167 int render_process_id, | 166 int render_process_id, |
168 int render_view_id, | 167 int render_view_id, |
169 const StreamOptions& options, | 168 const StreamOptions& options, |
170 const GURL& security_origin, | 169 const GURL& security_origin, |
171 std::string* label) { | 170 std::string* label) { |
172 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 171 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
173 | 172 |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 366 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
368 if (device_thread_.get()) | 367 if (device_thread_.get()) |
369 return; | 368 return; |
370 | 369 |
371 device_thread_.reset(new DeviceThread("MediaStreamDeviceThread")); | 370 device_thread_.reset(new DeviceThread("MediaStreamDeviceThread")); |
372 CHECK(device_thread_->Start()); | 371 CHECK(device_thread_->Start()); |
373 | 372 |
374 audio_input_device_manager_->Register(this, | 373 audio_input_device_manager_->Register(this, |
375 device_thread_->message_loop_proxy()); | 374 device_thread_->message_loop_proxy()); |
376 video_capture_manager_->Register(this, device_thread_->message_loop_proxy()); | 375 video_capture_manager_->Register(this, device_thread_->message_loop_proxy()); |
| 376 |
| 377 // We want to be notified of IO message loop destruction to delete the thread |
| 378 // and the device managers. |
| 379 io_loop_ = MessageLoop::current(); |
| 380 io_loop_->AddDestructionObserver(this); |
377 } | 381 } |
378 | 382 |
379 void MediaStreamManager::Opened(MediaStreamType stream_type, | 383 void MediaStreamManager::Opened(MediaStreamType stream_type, |
380 int capture_session_id) { | 384 int capture_session_id) { |
381 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 385 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
382 | 386 |
383 // Find the request containing this device and mark it as used. | 387 // Find the request containing this device and mark it as used. |
384 DeviceRequest* request = NULL; | 388 DeviceRequest* request = NULL; |
385 StreamDeviceInfoArray* devices = NULL; | 389 StreamDeviceInfoArray* devices = NULL; |
386 std::string label; | 390 std::string label; |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
615 return; | 619 return; |
616 } | 620 } |
617 } | 621 } |
618 | 622 |
619 void MediaStreamManager::UseFakeDevice() { | 623 void MediaStreamManager::UseFakeDevice() { |
620 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 624 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
621 video_capture_manager()->UseFakeDevice(); | 625 video_capture_manager()->UseFakeDevice(); |
622 device_settings_->UseFakeUI(); | 626 device_settings_->UseFakeUI(); |
623 } | 627 } |
624 | 628 |
| 629 void MediaStreamManager::WillDestroyCurrentMessageLoop() { |
| 630 DCHECK_EQ(MessageLoop::current(), io_loop_); |
| 631 if (device_thread_.get()) { |
| 632 video_capture_manager_->Unregister(); |
| 633 audio_input_device_manager_->Unregister(); |
| 634 device_thread_.reset(); |
| 635 } |
| 636 |
| 637 audio_input_device_manager_ = NULL; |
| 638 video_capture_manager_ = NULL; |
| 639 io_loop_ = NULL; |
| 640 device_settings_.reset(); |
| 641 } |
| 642 |
625 void MediaStreamManager::NotifyObserverDevicesOpened(DeviceRequest* request) { | 643 void MediaStreamManager::NotifyObserverDevicesOpened(DeviceRequest* request) { |
626 content::MediaObserver* media_observer = | 644 content::MediaObserver* media_observer = |
627 content::GetContentClient()->browser()->GetMediaObserver(); | 645 content::GetContentClient()->browser()->GetMediaObserver(); |
628 content::MediaStreamDevices opened_devices; | 646 content::MediaStreamDevices opened_devices; |
629 DevicesFromRequest(request, &opened_devices); | 647 DevicesFromRequest(request, &opened_devices); |
630 DCHECK(!opened_devices.empty()); | 648 DCHECK(!opened_devices.empty()); |
631 media_observer->OnCaptureDevicesOpened(request->render_process_id, | 649 media_observer->OnCaptureDevicesOpened(request->render_process_id, |
632 request->render_view_id, | 650 request->render_view_id, |
633 opened_devices); | 651 opened_devices); |
634 } | 652 } |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
697 if (stream_type == content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE) { | 715 if (stream_type == content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE) { |
698 return video_capture_manager(); | 716 return video_capture_manager(); |
699 } else if (stream_type == content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE) { | 717 } else if (stream_type == content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE) { |
700 return audio_input_device_manager(); | 718 return audio_input_device_manager(); |
701 } | 719 } |
702 NOTREACHED(); | 720 NOTREACHED(); |
703 return NULL; | 721 return NULL; |
704 } | 722 } |
705 | 723 |
706 } // namespace media_stream | 724 } // namespace media_stream |
OLD | NEW |