Chromium Code Reviews| Index: content/browser/renderer_host/media/media_stream_manager.cc |
| =================================================================== |
| --- content/browser/renderer_host/media/media_stream_manager.cc (revision 118766) |
| +++ content/browser/renderer_host/media/media_stream_manager.cc (working copy) |
| @@ -51,32 +51,44 @@ |
| } |
| struct MediaStreamManager::DeviceRequest { |
| + enum RequestState { |
| + kNotRequested = 0, |
| + kRequested, |
| + kOpening, |
| + kDone, |
| + kError |
| + }; |
| + |
| + enum RequestType { |
| + kGenerateStream = 0, |
| + kEnumerateDevices, |
| + kOpenDevice |
| + }; |
| + |
| DeviceRequest() |
| : requester(NULL), |
| - state(kNumMediaStreamTypes, kNotRequested) { |
| + state(kNumMediaStreamTypes, kNotRequested), |
| + type(kGenerateStream) { |
| options.audio = false; |
| options.video_option = StreamOptions::kNoCamera; |
| } |
| + |
| DeviceRequest(MediaStreamRequester* requester, |
| const StreamOptions& request_options) |
| : requester(requester), |
| options(request_options), |
| - state(kNumMediaStreamTypes, kNotRequested) { |
| + state(kNumMediaStreamTypes, kNotRequested), |
| + type(kGenerateStream) { |
| DCHECK(requester); |
| } |
| + |
| ~DeviceRequest() {} |
| - enum RequestState { |
| - kNotRequested = 0, |
| - kRequested, |
| - kOpening, |
| - kDone, |
| - kError |
| - }; |
| - |
| MediaStreamRequester* requester; |
| StreamOptions options; |
| std::vector<RequestState> state; |
| + RequestType type; |
| + std::string requested_device_id; |
| StreamDeviceInfoArray audio_devices; |
| StreamDeviceInfoArray video_devices; |
| }; |
| @@ -122,34 +134,8 @@ |
| // Create a new request based on options. |
| DeviceRequest new_request = DeviceRequest(requester, options); |
| - if (Requested(new_request.options, kAudioCapture)) { |
| - new_request.state[kAudioCapture] = DeviceRequest::kRequested; |
| - } |
| - if (Requested(new_request.options, kVideoCapture)) { |
| - new_request.state[kVideoCapture] = DeviceRequest::kRequested; |
| - } |
| - |
| - // Create a label for this request and verify it is unique. |
| - std::string request_label; |
| - do { |
| - request_label = RandomLabel(); |
| - } while (requests_.find(request_label) != requests_.end()); |
| - |
| - requests_.insert(std::make_pair(request_label, new_request)); |
| - |
| - // Get user confirmation to use capture devices. |
| - // Need to make an asynchronous call to make sure the |requester| gets the |
| - // |label| before it would receive any event. |
| - BrowserThread::PostTask( |
| - BrowserThread::IO, |
| - FROM_HERE, |
| - base::Bind(&MediaStreamDeviceSettings::RequestCaptureDeviceUsage, |
| - base::Unretained(device_settings_.get()), |
| - request_label, render_process_id, |
| - render_view_id, options, |
| - security_origin)); |
| - |
| - (*label) = request_label; |
| + StartEnumeration(&new_request, render_process_id, render_view_id, |
| + security_origin, label); |
| } |
| void MediaStreamManager::CancelRequests(MediaStreamRequester* requester) { |
| @@ -205,6 +191,101 @@ |
| } |
| } |
| +void MediaStreamManager::EnumerateDevices( |
| + MediaStreamRequester* requester, |
| + int render_process_id, |
| + int render_view_id, |
| + MediaStreamType type, |
| + const std::string& security_origin, |
| + std::string* label) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + // Create a new request. |
| + StreamOptions options; |
| + if (type == media_stream::kAudioCapture) |
| + options.audio = true; |
| + else |
| + options.video_option = StreamOptions::kFacingUser; |
| + |
| + DeviceRequest new_request = DeviceRequest(requester, options); |
| + new_request.type = DeviceRequest::kEnumerateDevices; |
| + |
| + StartEnumeration(&new_request, render_process_id, render_view_id, |
| + security_origin, label); |
| +} |
| + |
| +void MediaStreamManager::OpenDevice( |
| + MediaStreamRequester* requester, |
| + int render_process_id, |
| + int render_view_id, |
| + const std::string& device_id, |
| + MediaStreamType type, |
| + const std::string& security_origin, |
| + std::string* label) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + // Create a new request. |
| + StreamOptions options; |
| + if (type == media_stream::kAudioCapture) |
| + options.audio = true; |
| + else |
| + options.video_option = StreamOptions::kFacingUser; |
| + |
| + DeviceRequest new_request = DeviceRequest(requester, options); |
| + new_request.type = DeviceRequest::kOpenDevice; |
| + new_request.requested_device_id = device_id; |
| + |
| + StartEnumeration(&new_request, render_process_id, render_view_id, |
| + security_origin, 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)); |
| + |
| + if (Requested(new_request->options, kAudioCapture)) { |
| + new_request->state[kAudioCapture] = DeviceRequest::kRequested; |
| + if (!enumeration_in_progress_[kAudioCapture]) { |
| + enumeration_in_progress_[kAudioCapture] = true; |
| + GetDeviceManager(kAudioCapture)->EnumerateDevices(); |
| + } |
| + } |
| + if (Requested(new_request->options, kVideoCapture)) { |
| + new_request->state[kVideoCapture] = DeviceRequest::kRequested; |
| + if (!enumeration_in_progress_[kVideoCapture]) { |
| + enumeration_in_progress_[kVideoCapture] = true; |
| + GetDeviceManager(kVideoCapture)->EnumerateDevices(); |
| + } |
| + } |
| + |
| + // Create a label for this request and verify it is unique. |
| + std::string request_label; |
| + do { |
| + request_label = RandomLabel(); |
| + } while (requests_.find(request_label) != requests_.end()); |
| + |
| + requests_.insert(std::make_pair(request_label, *new_request)); |
| + |
| + // Get user confirmation to use capture devices. |
| + // Need to make an asynchronous call to make sure the |requester| gets the |
| + // |label| before it would receive any event. |
| + if (new_request->type == DeviceRequest::kGenerateStream) { |
| + BrowserThread::PostTask(BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind(&MediaStreamDeviceSettings::RequestCaptureDeviceUsage, |
| + base::Unretained(device_settings_.get()), |
| + request_label, render_process_id, |
| + render_view_id, new_request->options, |
| + security_origin)); |
| + } |
| + |
| + (*label) = request_label; |
| +} |
| + |
| void MediaStreamManager::Opened(MediaStreamType stream_type, |
| int capture_session_id) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| @@ -257,8 +338,14 @@ |
| return; |
| } |
| - request->requester->StreamGenerated(label, request->audio_devices, |
| - request->video_devices); |
| + if (request->type == DeviceRequest::kOpenDevice) { |
|
scherkus (not reviewing)
2012/01/25 03:19:42
use switch statement?
wjia(left Chromium)
2012/01/25 22:50:44
Done.
|
| + request->requester->DeviceOpened(label, (*devices)[0]); |
| + } else if (request->type == DeviceRequest::kGenerateStream) { |
| + request->requester->StreamGenerated(label, request->audio_devices, |
| + request->video_devices); |
| + } else { |
| + NOTREACHED(); |
| + } |
| } |
| void MediaStreamManager::Closed(MediaStreamType stream_type, |
| @@ -284,7 +371,33 @@ |
| } |
| for (std::list<std::string>::iterator it = label_list.begin(); |
| it != label_list.end(); ++it) { |
| - device_settings_->AvailableDevices(*it, stream_type, devices); |
| + DeviceRequest& request = requests_[*it]; |
| + if (request.type == DeviceRequest::kEnumerateDevices) { |
|
scherkus (not reviewing)
2012/01/25 03:19:42
use switch statement?
wjia(left Chromium)
2012/01/25 22:50:44
Done.
|
| + request.requester->DevicesEnumerated(*it, devices); |
| + requests_.erase(*it); |
| + } else if (request.type == DeviceRequest::kOpenDevice) { |
| + for (StreamDeviceInfoArray::const_iterator device_it = devices.begin(); |
| + device_it != devices.end(); device_it++) { |
| + if (request.requested_device_id == device_it->device_id) { |
| + StreamDeviceInfo device = *device_it; |
| + device.in_use = false; |
| + device.session_id = |
| + GetDeviceManager(device_it->stream_type)->Open(device); |
| + request.state[device_it->stream_type] = DeviceRequest::kOpening; |
| + if (stream_type == kAudioCapture) |
| + request.audio_devices.push_back(device); |
| + else |
| + request.video_devices.push_back(device); |
| + break; |
| + } |
| + } |
| + } else { |
| + BrowserThread::PostTask(BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind(&MediaStreamDeviceSettings::AvailableDevices, |
| + base::Unretained(device_settings_.get()), |
| + *it, stream_type, devices)); |
| + } |
| } |
| label_list.clear(); |
| enumeration_in_progress_[stream_type] = false; |
| @@ -339,15 +452,6 @@ |
| } |
| } |
| -void MediaStreamManager::GetDevices(const std::string& label, |
| - MediaStreamType stream_type) { |
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| - if (!enumeration_in_progress_[stream_type]) { |
| - enumeration_in_progress_[stream_type] = true; |
| - GetDeviceManager(stream_type)->EnumerateDevices(); |
| - } |
| -} |
| - |
| void MediaStreamManager::DevicesAccepted(const std::string& label, |
| const StreamDeviceInfoArray& devices) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| @@ -399,6 +503,7 @@ |
| // Erase this request and report an error. |
| DeviceRequests::iterator it = requests_.find(label); |
| if (it != requests_.end()) { |
| + DCHECK_EQ(it->second.type, DeviceRequest::kGenerateStream); |
| it->second.requester->StreamGenerationFailed(label); |
| requests_.erase(it); |
| return; |