Index: chrome/browser/media/media_capture_devices_dispatcher.cc |
=================================================================== |
--- chrome/browser/media/media_capture_devices_dispatcher.cc (revision 179909) |
+++ chrome/browser/media/media_capture_devices_dispatcher.cc (working copy) |
@@ -4,7 +4,9 @@ |
#include "chrome/browser/media/media_capture_devices_dispatcher.h" |
+#include "chrome/browser/media/media_stream_capture_indicator.h" |
#include "chrome/browser/prefs/scoped_user_pref_update.h" |
+#include "chrome/browser/profiles/profile.h" |
#include "chrome/common/pref_names.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/media_devices_monitor.h" |
@@ -13,8 +15,34 @@ |
using content::BrowserThread; |
using content::MediaStreamDevices; |
+namespace { |
+ |
+const content::MediaStreamDevice* FindDefaultDeviceWithId( |
+ const content::MediaStreamDevices& devices, |
+ const std::string& device_id) { |
+ if (devices.empty()) |
+ return NULL; |
+ |
+ content::MediaStreamDevices::const_iterator iter = devices.begin(); |
+ for (; iter != devices.end(); ++iter) { |
+ if (iter->id == device_id) { |
+ return &(*iter); |
+ } |
+ } |
+ |
+ return &(*devices.begin()); |
+}; |
+ |
+} // namespace |
+ |
+ |
+MediaCaptureDevicesDispatcher* MediaCaptureDevicesDispatcher::GetInstance() { |
+ return Singleton<MediaCaptureDevicesDispatcher>::get(); |
+} |
+ |
MediaCaptureDevicesDispatcher::MediaCaptureDevicesDispatcher() |
- : devices_enumerated_(false) {} |
+ : devices_enumerated_(false), |
+ media_stream_capture_indicator_(new MediaStreamCaptureIndicator()) {} |
MediaCaptureDevicesDispatcher::~MediaCaptureDevicesDispatcher() {} |
@@ -32,26 +60,6 @@ |
} |
} |
-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)) |
@@ -87,6 +95,109 @@ |
return video_devices_; |
} |
+void MediaCaptureDevicesDispatcher::GetDefaultDevicesForProfile( |
+ Profile* profile, |
+ bool audio, |
+ bool video, |
+ content::MediaStreamDevices* devices) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ DCHECK(audio || video); |
+ |
+ PrefService* prefs = profile->GetPrefs(); |
+ std::string default_device; |
+ if (audio) { |
+ default_device = prefs->GetString(prefs::kDefaultAudioCaptureDevice); |
+ GetRequestedDevice(default_device, true, false, devices); |
+ } |
+ |
+ if (video) { |
+ default_device = prefs->GetString(prefs::kDefaultVideoCaptureDevice); |
+ GetRequestedDevice(default_device, false, true, devices); |
+ } |
+} |
+ |
+void MediaCaptureDevicesDispatcher::GetRequestedDevice( |
+ const std::string& requested_device_id, |
+ bool audio, |
+ bool video, |
+ content::MediaStreamDevices* devices) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ DCHECK(audio || video); |
+ |
+ if (audio) { |
+ const content::MediaStreamDevices& audio_devices = GetAudioCaptureDevices(); |
+ const content::MediaStreamDevice* const device = |
+ FindDefaultDeviceWithId(audio_devices, requested_device_id); |
+ if (device) |
+ devices->push_back(*device); |
+ } |
+ if (video) { |
+ const content::MediaStreamDevices& video_devices = GetVideoCaptureDevices(); |
+ const content::MediaStreamDevice* const device = |
+ FindDefaultDeviceWithId(video_devices, requested_device_id); |
+ if (device) |
+ devices->push_back(*device); |
+ } |
+} |
+ |
+scoped_refptr<MediaStreamCaptureIndicator> |
+ MediaCaptureDevicesDispatcher::GetMediaStreamCaptureIndicator() { |
+ return media_stream_capture_indicator_; |
+} |
+ |
+void MediaCaptureDevicesDispatcher::OnCaptureDevicesOpened( |
+ int render_process_id, |
+ int render_view_id, |
+ const content::MediaStreamDevices& devices) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ media_stream_capture_indicator_->CaptureDevicesOpened(render_process_id, |
+ render_view_id, |
+ devices); |
+} |
+ |
+void MediaCaptureDevicesDispatcher::OnCaptureDevicesClosed( |
+ int render_process_id, |
+ int render_view_id, |
+ const content::MediaStreamDevices& devices) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ media_stream_capture_indicator_->CaptureDevicesClosed(render_process_id, |
+ render_view_id, |
+ devices); |
+} |
+ |
+void MediaCaptureDevicesDispatcher::OnAudioCaptureDevicesChanged( |
+ const content::MediaStreamDevices& devices) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind(&MediaCaptureDevicesDispatcher::UpdateAudioDevicesOnUIThread, |
+ base::Unretained(this), devices)); |
+} |
+ |
+void MediaCaptureDevicesDispatcher::OnVideoCaptureDevicesChanged( |
+ const content::MediaStreamDevices& devices) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind(&MediaCaptureDevicesDispatcher::UpdateVideoDevicesOnUIThread, |
+ base::Unretained(this), devices)); |
+} |
+ |
+void MediaCaptureDevicesDispatcher::OnMediaRequestStateChanged( |
+ int render_process_id, |
+ int render_view_id, |
+ const content::MediaStreamDevice& device, |
+ content::MediaRequestState state) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind( |
+ &MediaCaptureDevicesDispatcher::UpdateMediaRequestStateOnUIThread, |
+ base::Unretained(this), render_process_id, render_view_id, device, |
+ state)); |
+ |
+} |
+ |
void MediaCaptureDevicesDispatcher::UpdateAudioDevicesOnUIThread( |
const content::MediaStreamDevices& devices) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
@@ -104,3 +215,15 @@ |
FOR_EACH_OBSERVER(Observer, observers_, |
OnUpdateVideoDevices(video_devices_)); |
} |
+ |
+void MediaCaptureDevicesDispatcher::UpdateMediaRequestStateOnUIThread( |
+ int render_process_id, |
+ int render_view_id, |
+ const content::MediaStreamDevice& device, |
+ content::MediaRequestState state) { |
+ FOR_EACH_OBSERVER(Observer, observers_, |
+ OnRequestUpdate(render_process_id, |
+ render_view_id, |
+ device, |
+ state)); |
+} |