Chromium Code Reviews| 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 31f2b7f18f4d74aac72bd5d83e797ce42338aa47..c258d8a4fe7636530c1c15ab2f11ba86c6017810 100644 |
| --- a/content/browser/renderer_host/media/media_stream_manager.cc |
| +++ b/content/browser/renderer_host/media/media_stream_manager.cc |
| @@ -209,7 +209,9 @@ class MediaStreamManager::DeviceRequest { |
| ~DeviceRequest() {} |
| void SetAudioType(MediaStreamType audio_type) { |
| - DCHECK(IsAudioMediaType(audio_type) || audio_type == MEDIA_NO_SERVICE); |
| + DCHECK(IsAudioInputMediaType(audio_type) || |
| + audio_type == MEDIA_DEVICE_AUDIO_OUTPUT || |
| + audio_type == MEDIA_NO_SERVICE); |
| audio_type_ = audio_type; |
| } |
| @@ -655,7 +657,8 @@ std::string MediaStreamManager::EnumerateDevices( |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| DCHECK(requester); |
| DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE || |
| - type == MEDIA_DEVICE_VIDEO_CAPTURE); |
| + type == MEDIA_DEVICE_VIDEO_CAPTURE || |
| + type == MEDIA_DEVICE_AUDIO_OUTPUT); |
| DeviceRequest* request = new DeviceRequest(requester, |
| render_process_id, |
| @@ -667,7 +670,7 @@ std::string MediaStreamManager::EnumerateDevices( |
| MEDIA_ENUMERATE_DEVICES, |
| StreamOptions(), |
| sc); |
| - if (IsAudioMediaType(type)) |
| + if (IsAudioInputMediaType(type) || type == MEDIA_DEVICE_AUDIO_OUTPUT) |
| request->SetAudioType(type); |
| else if (IsVideoMediaType(type)) |
| request->SetVideoType(type); |
| @@ -691,6 +694,21 @@ void MediaStreamManager::DoEnumerateDevices(const std::string& label) { |
| if (!request) |
| return; // This can happen if the request has been canceled. |
| + if (request->audio_type() == MEDIA_DEVICE_AUDIO_OUTPUT) { |
| + DCHECK_EQ(MEDIA_NO_SERVICE, request->video_type()); |
| + DCHECK_GE(active_enumeration_ref_count_[MEDIA_DEVICE_AUDIO_OUTPUT], 0); |
| + request->SetState(MEDIA_DEVICE_AUDIO_OUTPUT, MEDIA_REQUEST_STATE_REQUESTED); |
| + if (active_enumeration_ref_count_[MEDIA_DEVICE_AUDIO_OUTPUT] == 0) { |
| + ++active_enumeration_ref_count_[MEDIA_DEVICE_AUDIO_OUTPUT]; |
| + device_task_runner_->PostTask( |
| + FROM_HERE, |
| + base::Bind(&MediaStreamManager::EnumerateAudioOutputDevices, |
| + base::Unretained(this), |
| + label)); |
| + } |
| + return; |
|
tommi (sloooow) - chröme
2014/06/03 13:38:37
no chance that video_type could get incorrectly ig
Henrik Grunell
2014/06/03 14:33:16
Hmm, there's already this above:
DCHECK_EQ(MEDIA_N
tommi (sloooow) - chröme
2014/06/03 16:42:42
Ah, yes that's it. Thanks.
|
| + } |
| + |
| MediaStreamType type; |
| EnumerationCache* cache; |
| if (request->audio_type() == MEDIA_DEVICE_AUDIO_CAPTURE) { |
| @@ -715,6 +733,57 @@ void MediaStreamManager::DoEnumerateDevices(const std::string& label) { |
| DVLOG(1) << "Enumerate Devices ({label = " << label << "})"; |
| } |
| +void MediaStreamManager::EnumerateAudioOutputDevices( |
| + const std::string& label) { |
| + DCHECK(device_task_runner_); |
|
tommi (sloooow) - chröme
2014/06/03 13:38:37
no need for this dcheck if you deref on the next l
Henrik Grunell
2014/06/03 14:33:16
Done.
|
| + DCHECK(device_task_runner_->BelongsToCurrentThread()); |
| + |
| + scoped_ptr<media::AudioDeviceNames> device_names(new media::AudioDeviceNames); |
|
tommi (sloooow) - chröme
2014/06/03 13:38:37
nit: AudioDeviceNames()
Henrik Grunell
2014/06/03 14:33:16
Done.
|
| + audio_manager_->GetAudioOutputDeviceNames(device_names.get()); |
| + StreamDeviceInfoArray devices; |
| + for (media::AudioDeviceNames::iterator it = device_names->begin(); |
| + it != device_names->end(); ++it) { |
| + StreamDeviceInfo device(MEDIA_DEVICE_AUDIO_OUTPUT, |
| + it->device_name, |
| + it->unique_id); |
| + devices.push_back(device); |
| + } |
| + |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, FROM_HERE, |
| + base::Bind(&MediaStreamManager::AudioOutputDevicesEnumerated, |
| + base::Unretained(this), |
| + devices)); |
| +} |
| + |
| +void MediaStreamManager::AudioOutputDevicesEnumerated( |
| + const StreamDeviceInfoArray& devices) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + DVLOG(1) << "AudioOutputDevicesEnumerated()"; |
| + |
| + std::string log_message = "New device enumeration result:\n" + |
| + GetLogMessageString(MEDIA_DEVICE_AUDIO_OUTPUT, |
| + devices); |
| + SendMessageToNativeLog(log_message); |
| + |
| + // Publish the result for all requests waiting for device list(s). |
| + for (DeviceRequests::iterator it = requests_.begin(); it != requests_.end(); |
| + ++it) { |
| + if (it->second->state(MEDIA_DEVICE_AUDIO_OUTPUT) == |
| + MEDIA_REQUEST_STATE_REQUESTED && |
| + it->second->audio_type() == MEDIA_DEVICE_AUDIO_OUTPUT) { |
| + DCHECK_EQ(MEDIA_ENUMERATE_DEVICES, it->second->request_type); |
| + it->second->SetState(MEDIA_DEVICE_AUDIO_OUTPUT, |
| + MEDIA_REQUEST_STATE_PENDING_APPROVAL); |
| + it->second->devices = devices; |
| + FinalizeEnumerateDevices(it->first, it->second); |
| + } |
| + } |
| + |
| + --active_enumeration_ref_count_[MEDIA_DEVICE_AUDIO_OUTPUT]; |
| + DCHECK_GE(active_enumeration_ref_count_[MEDIA_DEVICE_AUDIO_OUTPUT], 0); |
| +} |
| + |
| void MediaStreamManager::OpenDevice(MediaStreamRequester* requester, |
| int render_process_id, |
| int render_view_id, |
| @@ -728,7 +797,7 @@ void MediaStreamManager::OpenDevice(MediaStreamRequester* requester, |
| type == MEDIA_DEVICE_VIDEO_CAPTURE); |
| DVLOG(1) << "OpenDevice ({page_request_id = " << page_request_id << "})"; |
| StreamOptions options; |
| - if (IsAudioMediaType(type)) { |
| + if (IsAudioInputMediaType(type)) { |
| options.audio_requested = true; |
| options.mandatory_audio.push_back( |
| StreamOptions::Constraint(kMediaStreamSourceInfoId, device_id)); |
| @@ -1060,7 +1129,7 @@ void MediaStreamManager::PostRequestToUI(const std::string& label, |
| const MediaStreamType video_type = request->video_type(); |
| // Post the request to UI and set the state. |
| - if (IsAudioMediaType(audio_type)) |
| + if (IsAudioInputMediaType(audio_type)) |
| request->SetState(audio_type, MEDIA_REQUEST_STATE_PENDING_APPROVAL); |
| if (IsVideoMediaType(video_type)) |
| request->SetState(video_type, MEDIA_REQUEST_STATE_PENDING_APPROVAL); |
| @@ -1341,7 +1410,7 @@ void MediaStreamManager::FinalizeGenerateStream(const std::string& label, |
| for (StreamDeviceInfoArray::const_iterator device_it = |
| requested_devices.begin(); |
| device_it != requested_devices.end(); ++device_it) { |
| - if (IsAudioMediaType(device_it->device.type)) { |
| + if (IsAudioInputMediaType(device_it->device.type)) { |
| audio_devices.push_back(*device_it); |
| } else if (IsVideoMediaType(device_it->device.type)) { |
| video_devices.push_back(*device_it); |
| @@ -1493,7 +1562,7 @@ void MediaStreamManager::Opened(MediaStreamType stream_type, |
| // We've found a matching request. |
| request->SetState(device_it->device.type, MEDIA_REQUEST_STATE_DONE); |
| - if (IsAudioMediaType(device_it->device.type)) { |
| + if (IsAudioInputMediaType(device_it->device.type)) { |
| // Store the native audio parameters in the device struct. |
| // TODO(xians): Handle the tab capture sample rate/channel layout |
| // in AudioInputDeviceManager::Open(). |
| @@ -1796,7 +1865,7 @@ void MediaStreamManager::HandleAccessRequestResponse( |
| } |
| // Check whether we've received all stream types requested. |
| - if (!found_audio && IsAudioMediaType(request->audio_type())) { |
| + if (!found_audio && IsAudioInputMediaType(request->audio_type())) { |
| request->SetState(request->audio_type(), MEDIA_REQUEST_STATE_ERROR); |
| DVLOG(1) << "Set no audio found label " << label; |
| } |
| @@ -1864,7 +1933,7 @@ void MediaStreamManager::NotifyDevicesChanged( |
| new_devices.push_back(it->device); |
| } |
| - if (IsAudioMediaType(stream_type)) { |
| + if (IsAudioInputMediaType(stream_type)) { |
| MediaCaptureDevicesImpl::GetInstance()->OnAudioCaptureDevicesChanged( |
| new_devices); |
| if (media_observer) |
| @@ -1882,7 +1951,7 @@ void MediaStreamManager::NotifyDevicesChanged( |
| bool MediaStreamManager::RequestDone(const DeviceRequest& request) const { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| - const bool requested_audio = IsAudioMediaType(request.audio_type()); |
| + const bool requested_audio = IsAudioInputMediaType(request.audio_type()); |
| const bool requested_video = IsVideoMediaType(request.video_type()); |
| const bool audio_done = |
| @@ -1906,7 +1975,7 @@ MediaStreamProvider* MediaStreamManager::GetDeviceManager( |
| MediaStreamType stream_type) { |
| if (IsVideoMediaType(stream_type)) { |
| return video_capture_manager(); |
| - } else if (IsAudioMediaType(stream_type)) { |
| + } else if (IsAudioInputMediaType(stream_type)) { |
| return audio_input_device_manager(); |
| } |
| NOTREACHED(); |