// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/media/media_capture_devices_dispatcher.h" #include "chrome/browser/prefs/scoped_user_pref_update.h" #include "chrome/common/pref_names.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/media_devices_monitor.h" #include "content/public/common/media_stream_request.h" using content::BrowserThread; using content::MediaStreamDevices; MediaCaptureDevicesDispatcher::MediaCaptureDevicesDispatcher() : devices_enumerated_(false) {} MediaCaptureDevicesDispatcher::~MediaCaptureDevicesDispatcher() {} void MediaCaptureDevicesDispatcher::RegisterUserPrefs( PrefServiceSyncable* user_prefs) { if (!user_prefs->FindPreference(prefs::kDefaultAudioCaptureDevice)) { user_prefs->RegisterStringPref(prefs::kDefaultAudioCaptureDevice, std::string(), PrefServiceSyncable::UNSYNCABLE_PREF); } if (!user_prefs->FindPreference(prefs::kDefaultVideoCaptureDevice)) { user_prefs->RegisterStringPref(prefs::kDefaultVideoCaptureDevice, std::string(), PrefServiceSyncable::UNSYNCABLE_PREF); } } void MediaCaptureDevicesDispatcher::AudioCaptureDevicesChanged( const MediaStreamDevices& devices) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, base::Bind(&MediaCaptureDevicesDispatcher::UpdateAudioDevicesOnUIThread, this, devices)); } void MediaCaptureDevicesDispatcher::VideoCaptureDevicesChanged( const MediaStreamDevices& devices) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, base::Bind(&MediaCaptureDevicesDispatcher::UpdateVideoDevicesOnUIThread, this, devices)); } void MediaCaptureDevicesDispatcher::AddObserver(Observer* observer) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); if (!observers_.HasObserver(observer)) observers_.AddObserver(observer); } void MediaCaptureDevicesDispatcher::RemoveObserver(Observer* observer) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); observers_.RemoveObserver(observer); } const MediaStreamDevices& MediaCaptureDevicesDispatcher::GetAudioCaptureDevices() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); if (!devices_enumerated_) { BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, base::Bind(&content::EnsureMonitorCaptureDevices)); devices_enumerated_ = true; } return audio_devices_; } const MediaStreamDevices& MediaCaptureDevicesDispatcher::GetVideoCaptureDevices() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); if (!devices_enumerated_) { BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, base::Bind(&content::EnsureMonitorCaptureDevices)); devices_enumerated_ = true; } return video_devices_; } void MediaCaptureDevicesDispatcher::UpdateAudioDevicesOnUIThread( const content::MediaStreamDevices& devices) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); devices_enumerated_ = true; audio_devices_ = devices; FOR_EACH_OBSERVER(Observer, observers_, OnUpdateAudioDevices(audio_devices_)); } void MediaCaptureDevicesDispatcher::UpdateVideoDevicesOnUIThread( const content::MediaStreamDevices& devices){ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); devices_enumerated_ = true; video_devices_ = devices; FOR_EACH_OBSERVER(Observer, observers_, OnUpdateVideoDevices(video_devices_)); }