OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/media/user_media_client_impl.h" | 5 #include "content/renderer/media/user_media_client_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 | 460 |
461 for (StreamDeviceInfoArray::const_iterator device_it = video_array.begin(); | 461 for (StreamDeviceInfoArray::const_iterator device_it = video_array.begin(); |
462 device_it != video_array.end(); ++device_it) { | 462 device_it != video_array.end(); ++device_it) { |
463 if (!FindLocalSource(*device_it)) | 463 if (!FindLocalSource(*device_it)) |
464 media_stream_dispatcher_->StopStreamDevice(*device_it); | 464 media_stream_dispatcher_->StopStreamDevice(*device_it); |
465 } | 465 } |
466 } | 466 } |
467 | 467 |
468 void UserMediaClientImpl::FinalizeEnumerateDevices( | 468 void UserMediaClientImpl::FinalizeEnumerateDevices( |
469 MediaDevicesRequestInfo* request) { | 469 MediaDevicesRequestInfo* request) { |
470 // All devices are ready for copying. We use a hashed audio output device id | |
471 // as the group id for input and output audio devices. If an input device | |
472 // doesn't have an associated output device, we use the input device's own id. | |
473 // We don't support group id for video devices, that's left empty. | |
474 blink::WebVector<blink::WebMediaDeviceInfo> | 470 blink::WebVector<blink::WebMediaDeviceInfo> |
475 devices(request->audio_input_devices.size() + | 471 devices(request->audio_input_devices.size() + |
476 request->video_input_devices.size() + | 472 request->video_input_devices.size() + |
477 request->audio_output_devices.size()); | 473 request->audio_output_devices.size()); |
478 for (size_t i = 0; i < request->audio_input_devices.size(); ++i) { | 474 for (size_t i = 0; i < request->audio_input_devices.size(); ++i) { |
479 const MediaStreamDevice& device = request->audio_input_devices[i].device; | 475 const MediaStreamDevice& device = request->audio_input_devices[i].device; |
480 DCHECK_EQ(device.type, MEDIA_DEVICE_AUDIO_CAPTURE); | 476 DCHECK_EQ(device.type, MEDIA_DEVICE_AUDIO_CAPTURE); |
481 | 477 |
482 // We add an arbitrary character to the device ID in order to avoid the same | 478 devices[i].initialize(blink::WebString::fromUTF8(device.id), |
483 // group ID for the input and output devices that share the same ID but are | 479 blink::WebMediaDeviceInfo::MediaDeviceKindAudioInput, |
484 // not in the same physical device. This may happen with the default and | 480 blink::WebString::fromUTF8(device.name), |
485 // communication devices. | 481 blink::WebString::fromUTF8(device.group_id)); |
486 std::string group_id = base::UintToString(base::Hash( | |
487 device.matched_output_device_id.empty() ? | |
488 device.id + "i" : | |
489 device.matched_output_device_id)); | |
490 devices[i].initialize( | |
491 blink::WebString::fromUTF8(device.id), | |
492 blink::WebMediaDeviceInfo::MediaDeviceKindAudioInput, | |
493 blink::WebString::fromUTF8(device.name), | |
494 blink::WebString::fromUTF8(group_id)); | |
495 } | 482 } |
496 size_t offset = request->audio_input_devices.size(); | 483 size_t offset = request->audio_input_devices.size(); |
497 for (size_t i = 0; i < request->video_input_devices.size(); ++i) { | 484 for (size_t i = 0; i < request->video_input_devices.size(); ++i) { |
498 const MediaStreamDevice& device = request->video_input_devices[i].device; | 485 const MediaStreamDevice& device = request->video_input_devices[i].device; |
499 DCHECK_EQ(device.type, MEDIA_DEVICE_VIDEO_CAPTURE); | 486 DCHECK_EQ(device.type, MEDIA_DEVICE_VIDEO_CAPTURE); |
500 devices[offset + i].initialize( | 487 devices[offset + i].initialize( |
501 blink::WebString::fromUTF8(device.id), | 488 blink::WebString::fromUTF8(device.id), |
502 blink::WebMediaDeviceInfo::MediaDeviceKindVideoInput, | 489 blink::WebMediaDeviceInfo::MediaDeviceKindVideoInput, |
503 blink::WebString::fromUTF8(device.name), | 490 blink::WebString::fromUTF8(device.name), |
504 blink::WebString()); | 491 blink::WebString()); |
505 } | 492 } |
506 offset += request->video_input_devices.size(); | 493 offset += request->video_input_devices.size(); |
507 for (size_t i = 0; i < request->audio_output_devices.size(); ++i) { | 494 for (size_t i = 0; i < request->audio_output_devices.size(); ++i) { |
508 const MediaStreamDevice& device = request->audio_output_devices[i].device; | 495 const MediaStreamDevice& device = request->audio_output_devices[i].device; |
509 DCHECK_EQ(device.type, MEDIA_DEVICE_AUDIO_OUTPUT); | 496 DCHECK_EQ(device.type, MEDIA_DEVICE_AUDIO_OUTPUT); |
510 devices[offset + i].initialize( | 497 devices[offset + i].initialize( |
511 blink::WebString::fromUTF8(device.id), | 498 blink::WebString::fromUTF8(device.id), |
512 blink::WebMediaDeviceInfo::MediaDeviceKindAudioOutput, | 499 blink::WebMediaDeviceInfo::MediaDeviceKindAudioOutput, |
513 blink::WebString::fromUTF8(device.name), | 500 blink::WebString::fromUTF8(device.name), |
514 blink::WebString::fromUTF8(base::UintToString(base::Hash(device.id)))); | 501 blink::WebString::fromUTF8(device.group_id)); |
515 } | 502 } |
516 | 503 |
517 EnumerateDevicesSucceded(&request->media_devices_request, devices); | 504 EnumerateDevicesSucceded(&request->media_devices_request, devices); |
518 } | 505 } |
519 | 506 |
520 void UserMediaClientImpl::FinalizeEnumerateSources( | 507 void UserMediaClientImpl::FinalizeEnumerateSources( |
521 MediaDevicesRequestInfo* request) { | 508 MediaDevicesRequestInfo* request) { |
522 blink::WebVector<blink::WebSourceInfo> | 509 blink::WebVector<blink::WebSourceInfo> |
523 sources(request->audio_input_devices.size() + | 510 sources(request->audio_input_devices.size() + |
524 request->video_input_devices.size()); | 511 request->video_input_devices.size()); |
(...skipping 674 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1199 | 1186 |
1200 bool UserMediaClientImpl::UserMediaRequestInfo::HasPendingSources() const { | 1187 bool UserMediaClientImpl::UserMediaRequestInfo::HasPendingSources() const { |
1201 return !sources_waiting_for_callback_.empty(); | 1188 return !sources_waiting_for_callback_.empty(); |
1202 } | 1189 } |
1203 | 1190 |
1204 void UserMediaClientImpl::OnDestruct() { | 1191 void UserMediaClientImpl::OnDestruct() { |
1205 delete this; | 1192 delete this; |
1206 } | 1193 } |
1207 | 1194 |
1208 } // namespace content | 1195 } // namespace content |
OLD | NEW |