1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "content/browser/renderer_host/media/media_capture_devices_impl.h" 6 7#include "content/browser/browser_main_loop.h" 8#include "content/browser/renderer_host/media/media_stream_manager.h" 9#include "content/public/browser/browser_thread.h" 10 11namespace content { 12 13namespace { 14 15void EnsureMonitorCaptureDevices() { 16 DCHECK_CURRENTLY_ON(BrowserThread::UI); 17 BrowserThread::PostTask( 18 BrowserThread::IO, FROM_HERE, 19 base::Bind(&MediaStreamManager::EnsureDeviceMonitorStarted, 20 base::Unretained( 21 BrowserMainLoop::GetInstance()->media_stream_manager()))); 22} 23 24} // namespace 25 26MediaCaptureDevices* MediaCaptureDevices::GetInstance() { 27 return MediaCaptureDevicesImpl::GetInstance(); 28} 29 30MediaCaptureDevicesImpl* MediaCaptureDevicesImpl::GetInstance() { 31 return Singleton<MediaCaptureDevicesImpl>::get(); 32} 33 34const MediaStreamDevices& 35MediaCaptureDevicesImpl::GetAudioCaptureDevices() { 36 DCHECK_CURRENTLY_ON(BrowserThread::UI); 37 if (!devices_enumerated_) { 38 EnsureMonitorCaptureDevices(); 39 devices_enumerated_ = true; 40 } 41 return audio_devices_; 42} 43 44const MediaStreamDevices& 45MediaCaptureDevicesImpl::GetVideoCaptureDevices() { 46 DCHECK_CURRENTLY_ON(BrowserThread::UI); 47 if (!devices_enumerated_) { 48 EnsureMonitorCaptureDevices(); 49 devices_enumerated_ = true; 50 } 51 return video_devices_; 52} 53 54void MediaCaptureDevicesImpl::OnAudioCaptureDevicesChanged( 55 const MediaStreamDevices& devices) { 56 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { 57 UpdateAudioDevicesOnUIThread(devices); 58 } else { 59 BrowserThread::PostTask( 60 BrowserThread::UI, FROM_HERE, 61 base::Bind(&MediaCaptureDevicesImpl::UpdateAudioDevicesOnUIThread, 62 base::Unretained(this), devices)); 63 } 64} 65 66void MediaCaptureDevicesImpl::OnVideoCaptureDevicesChanged( 67 const MediaStreamDevices& devices) { 68 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { 69 UpdateVideoDevicesOnUIThread(devices); 70 } else { 71 BrowserThread::PostTask( 72 BrowserThread::UI, FROM_HERE, 73 base::Bind(&MediaCaptureDevicesImpl::UpdateVideoDevicesOnUIThread, 74 base::Unretained(this), devices)); 75 } 76} 77 78MediaCaptureDevicesImpl::MediaCaptureDevicesImpl() 79 : devices_enumerated_(false) { 80} 81 82MediaCaptureDevicesImpl::~MediaCaptureDevicesImpl() { 83} 84 85void MediaCaptureDevicesImpl::UpdateAudioDevicesOnUIThread( 86 const MediaStreamDevices& devices) { 87 DCHECK_CURRENTLY_ON(BrowserThread::UI); 88 devices_enumerated_ = true; 89 audio_devices_ = devices; 90} 91 92void MediaCaptureDevicesImpl::UpdateVideoDevicesOnUIThread( 93 const MediaStreamDevices& devices) { 94 DCHECK_CURRENTLY_ON(BrowserThread::UI); 95 devices_enumerated_ = true; 96 video_devices_ = devices; 97} 98 99} // namespace content 100