157 lines
4.9 KiB
C++
157 lines
4.9 KiB
C++
// Copyright (c) 2013 GitHub, Inc. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "browser/media/media_capture_devices_dispatcher.h"
|
|
|
|
#include "base/prefs/pref_service.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;
|
|
|
|
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) {}
|
|
|
|
MediaCaptureDevicesDispatcher::~MediaCaptureDevicesDispatcher() {}
|
|
|
|
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::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);
|
|
}
|
|
}
|
|
|
|
void MediaCaptureDevicesDispatcher::GetDefaultDevices(
|
|
bool audio,
|
|
bool video,
|
|
content::MediaStreamDevices* devices) {
|
|
if (audio) {
|
|
GetRequestedDevice(std::string(), true, false, devices);
|
|
}
|
|
|
|
if (video) {
|
|
GetRequestedDevice(std::string(), false, true, 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));
|
|
devices_enumerated_ = true;
|
|
audio_devices_ = devices;
|
|
}
|
|
|
|
void MediaCaptureDevicesDispatcher::UpdateVideoDevicesOnUIThread(
|
|
const content::MediaStreamDevices& devices) {
|
|
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
devices_enumerated_ = true;
|
|
video_devices_ = devices;
|
|
}
|
|
|
|
void MediaCaptureDevicesDispatcher::UpdateMediaRequestStateOnUIThread(
|
|
int render_process_id,
|
|
int render_view_id,
|
|
const content::MediaStreamDevice& device,
|
|
content::MediaRequestState state) {
|
|
}
|