| Index: content/browser/renderer_host/media/media_stream_manager.cc
|
| diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc
|
| index 9771e25ac6c96fee1a4c75c6839c43d7580855dd..f7982b872064e2c779a9ce3049f2cee5a5b45c66 100644
|
| --- a/content/browser/renderer_host/media/media_stream_manager.cc
|
| +++ b/content/browser/renderer_host/media/media_stream_manager.cc
|
| @@ -17,6 +17,8 @@
|
| #include "content/browser/resource_context_impl.h"
|
| #include "content/common/media/media_stream_options.h"
|
| #include "content/public/browser/browser_thread.h"
|
| +#include "content/public/browser/content_browser_client.h"
|
| +#include "content/public/browser/media_observer.h"
|
| #include "media/audio/audio_manager.h"
|
|
|
| using content::BrowserThread;
|
| @@ -54,6 +56,7 @@ static bool Requested(const StreamOptions& options,
|
| return false;
|
| }
|
|
|
| +// TODO(xians): Merge DeviceRequest with MediaStreamRequest.
|
| struct MediaStreamManager::DeviceRequest {
|
| enum RequestState {
|
| kNotRequested = 0,
|
| @@ -73,17 +76,25 @@ struct MediaStreamManager::DeviceRequest {
|
| DeviceRequest()
|
| : requester(NULL),
|
| state(content::NUM_MEDIA_STREAM_DEVICE_TYPES, kNotRequested),
|
| - type(kGenerateStream) {
|
| + type(kGenerateStream),
|
| + render_process_id(-1),
|
| + render_view_id(-1) {
|
| options.audio = false;
|
| options.video = false;
|
| }
|
|
|
| DeviceRequest(MediaStreamRequester* requester,
|
| - const StreamOptions& request_options)
|
| + const StreamOptions& request_options,
|
| + int render_process_id,
|
| + int render_view_id,
|
| + const std::string& request_security_origin)
|
| : requester(requester),
|
| options(request_options),
|
| state(content::NUM_MEDIA_STREAM_DEVICE_TYPES, kNotRequested),
|
| - type(kGenerateStream) {
|
| + type(kGenerateStream),
|
| + render_process_id(render_process_id),
|
| + render_view_id(render_view_id),
|
| + security_origin(request_security_origin) {
|
| DCHECK(requester);
|
| }
|
|
|
| @@ -93,6 +104,9 @@ struct MediaStreamManager::DeviceRequest {
|
| StreamOptions options;
|
| std::vector<RequestState> state;
|
| RequestType type;
|
| + int render_process_id;
|
| + int render_view_id;
|
| + std::string security_origin;
|
| std::string requested_device_id;
|
| StreamDeviceInfoArray audio_devices;
|
| StreamDeviceInfoArray video_devices;
|
| @@ -154,9 +168,11 @@ void MediaStreamManager::GenerateStream(MediaStreamRequester* requester,
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
|
|
| // Create a new request based on options.
|
| - DeviceRequest new_request = DeviceRequest(requester, options);
|
| - StartEnumeration(&new_request, render_process_id, render_view_id,
|
| - security_origin, label);
|
| + DeviceRequest new_request(requester, options,
|
| + render_process_id,
|
| + render_view_id,
|
| + security_origin);
|
| + StartEnumeration(&new_request, label);
|
| }
|
|
|
| void MediaStreamManager::CancelRequests(MediaStreamRequester* requester) {
|
| @@ -209,6 +225,9 @@ void MediaStreamManager::StopGeneratedStream(const std::string& label) {
|
| video_it != it->second.video_devices.end(); ++video_it) {
|
| video_capture_manager()->Close(video_it->session_id);
|
| }
|
| + if (it->second.type == DeviceRequest::kGenerateStream) {
|
| + NotifyObserverDevicesClosed(&(it->second));
|
| + }
|
| requests_.erase(it);
|
| return;
|
| }
|
| @@ -230,11 +249,13 @@ void MediaStreamManager::EnumerateDevices(
|
| else
|
| options.video = true;
|
|
|
| - DeviceRequest new_request = DeviceRequest(requester, options);
|
| + DeviceRequest new_request(requester, options,
|
| + render_process_id,
|
| + render_view_id,
|
| + security_origin);
|
| new_request.type = DeviceRequest::kEnumerateDevices;
|
|
|
| - StartEnumeration(&new_request, render_process_id, render_view_id,
|
| - security_origin, label);
|
| + StartEnumeration(&new_request, label);
|
| }
|
|
|
| void MediaStreamManager::OpenDevice(
|
| @@ -254,19 +275,18 @@ void MediaStreamManager::OpenDevice(
|
| else
|
| options.video = true;
|
|
|
| - DeviceRequest new_request = DeviceRequest(requester, options);
|
| + DeviceRequest new_request(requester, options,
|
| + render_process_id,
|
| + render_view_id,
|
| + security_origin);
|
| new_request.type = DeviceRequest::kOpenDevice;
|
| new_request.requested_device_id = device_id;
|
|
|
| - StartEnumeration(&new_request, render_process_id, render_view_id,
|
| - security_origin, label);
|
| + StartEnumeration(&new_request, label);
|
| }
|
|
|
| void MediaStreamManager::StartEnumeration(
|
| DeviceRequest* new_request,
|
| - int render_process_id,
|
| - int render_view_id,
|
| - const std::string& security_origin,
|
| std::string* label) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
|
|
| @@ -303,9 +323,9 @@ void MediaStreamManager::StartEnumeration(
|
| FROM_HERE,
|
| base::Bind(&MediaStreamDeviceSettings::RequestCaptureDeviceUsage,
|
| base::Unretained(device_settings_.get()),
|
| - request_label, render_process_id,
|
| - render_view_id, new_request->options,
|
| - security_origin));
|
| + request_label, new_request->render_process_id,
|
| + new_request->render_view_id, new_request->options,
|
| + new_request->security_origin));
|
| }
|
|
|
| (*label) = request_label;
|
| @@ -370,6 +390,7 @@ void MediaStreamManager::Opened(MediaStreamType stream_type,
|
| case DeviceRequest::kGenerateStream:
|
| request->requester->StreamGenerated(label, request->audio_devices,
|
| request->video_devices);
|
| + NotifyObserverDevicesOpened(request);
|
| break;
|
| default:
|
| NOTREACHED();
|
| @@ -556,6 +577,49 @@ void MediaStreamManager::UseFakeDevice() {
|
| device_settings_->UseFakeUI();
|
| }
|
|
|
| +void MediaStreamManager::NotifyObserverDevicesOpened(DeviceRequest* request) {
|
| + content::MediaObserver* media_observer =
|
| + content::GetContentClient()->browser()->GetMediaObserver();
|
| + content::MediaStreamDevices opened_devices;
|
| + DevicesFromRequest(request, &opened_devices);
|
| + DCHECK(!opened_devices.empty());
|
| + media_observer->OnCaptureDevicesOpened(request->render_process_id,
|
| + request->render_view_id,
|
| + opened_devices);
|
| +}
|
| +
|
| +void MediaStreamManager::NotifyObserverDevicesClosed(DeviceRequest* request) {
|
| + content::MediaObserver* media_observer =
|
| + content::GetContentClient()->browser()->GetMediaObserver();
|
| + content::MediaStreamDevices closed_devices;
|
| + DevicesFromRequest(request, &closed_devices);
|
| + if (closed_devices.empty())
|
| + return;
|
| + media_observer->OnCaptureDevicesClosed(request->render_process_id,
|
| + request->render_view_id,
|
| + closed_devices);
|
| +}
|
| +
|
| +void MediaStreamManager::DevicesFromRequest(
|
| + DeviceRequest* request, content::MediaStreamDevices* devices) {
|
| + StreamDeviceInfoArray::const_iterator it = request->audio_devices.begin();
|
| + for (; it != request->audio_devices.end(); ++it) {
|
| + devices->push_back(
|
| + content::MediaStreamDevice(
|
| + content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE,
|
| + it->device_id,
|
| + it->name));
|
| + }
|
| + for (it = request->video_devices.begin(); it != request->video_devices.end();
|
| + ++it) {
|
| + devices->push_back(
|
| + content::MediaStreamDevice(
|
| + content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE,
|
| + it->device_id,
|
| + it->name));
|
| + }
|
| +}
|
| +
|
| bool MediaStreamManager::RequestDone(const DeviceRequest& request) const {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| // Check if all devices are opened.
|
|
|