Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(325)

Side by Side Diff: content/renderer/media/media_stream_impl.cc

Issue 348443002: Revert 274823 "Support for audio output devices for getMediaDevi..." (Closed) Base URL: svn://svn.chromium.org/chrome/branches/2057/src/
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/media_stream_impl.h" 5 #include "content/renderer/media/media_stream_impl.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/hash.h"
10 #include "base/logging.h" 9 #include "base/logging.h"
11 #include "base/strings/string_number_conversions.h"
12 #include "base/strings/string_util.h" 10 #include "base/strings/string_util.h"
13 #include "base/strings/stringprintf.h" 11 #include "base/strings/stringprintf.h"
14 #include "base/strings/utf_string_conversions.h" 12 #include "base/strings/utf_string_conversions.h"
15 #include "content/renderer/media/media_stream.h" 13 #include "content/renderer/media/media_stream.h"
16 #include "content/renderer/media/media_stream_audio_source.h" 14 #include "content/renderer/media/media_stream_audio_source.h"
17 #include "content/renderer/media/media_stream_dispatcher.h" 15 #include "content/renderer/media/media_stream_dispatcher.h"
18 #include "content/renderer/media/media_stream_video_capturer_source.h" 16 #include "content/renderer/media/media_stream_video_capturer_source.h"
19 #include "content/renderer/media/media_stream_video_track.h" 17 #include "content/renderer/media/media_stream_video_track.h"
20 #include "content/renderer/media/peer_connection_tracker.h" 18 #include "content/renderer/media/peer_connection_tracker.h"
21 #include "content/renderer/media/webrtc/webrtc_video_capturer_adapter.h" 19 #include "content/renderer/media/webrtc/webrtc_video_capturer_adapter.h"
(...skipping 30 matching lines...) Expand all
52 } 50 }
53 } 51 }
54 52
55 static int g_next_request_id = 0; 53 static int g_next_request_id = 0;
56 54
57 } // namespace 55 } // namespace
58 56
59 struct MediaStreamImpl::MediaDevicesRequestInfo { 57 struct MediaStreamImpl::MediaDevicesRequestInfo {
60 MediaDevicesRequestInfo(const blink::WebMediaDevicesRequest& request, 58 MediaDevicesRequestInfo(const blink::WebMediaDevicesRequest& request,
61 int audio_input_request_id, 59 int audio_input_request_id,
62 int video_input_request_id, 60 int video_input_request_id)
63 int audio_output_request_id)
64 : request(request), 61 : request(request),
65 audio_input_request_id(audio_input_request_id), 62 audio_input_request_id(audio_input_request_id),
66 video_input_request_id(video_input_request_id), 63 video_input_request_id(video_input_request_id),
67 audio_output_request_id(audio_output_request_id),
68 has_audio_input_returned(false), 64 has_audio_input_returned(false),
69 has_video_input_returned(false), 65 has_video_input_returned(false) {}
70 has_audio_output_returned(false) {}
71 66
72 blink::WebMediaDevicesRequest request; 67 blink::WebMediaDevicesRequest request;
73 int audio_input_request_id; 68 int audio_input_request_id;
74 int video_input_request_id; 69 int video_input_request_id;
75 int audio_output_request_id;
76 bool has_audio_input_returned; 70 bool has_audio_input_returned;
77 bool has_video_input_returned; 71 bool has_video_input_returned;
78 bool has_audio_output_returned;
79 StreamDeviceInfoArray audio_input_devices; 72 StreamDeviceInfoArray audio_input_devices;
80 StreamDeviceInfoArray video_input_devices; 73 StreamDeviceInfoArray video_input_devices;
81 StreamDeviceInfoArray audio_output_devices;
82 }; 74 };
83 75
84 MediaStreamImpl::MediaStreamImpl( 76 MediaStreamImpl::MediaStreamImpl(
85 RenderView* render_view, 77 RenderView* render_view,
86 MediaStreamDispatcher* media_stream_dispatcher, 78 MediaStreamDispatcher* media_stream_dispatcher,
87 PeerConnectionDependencyFactory* dependency_factory) 79 PeerConnectionDependencyFactory* dependency_factory)
88 : RenderViewObserver(render_view), 80 : RenderViewObserver(render_view),
89 dependency_factory_(dependency_factory), 81 dependency_factory_(dependency_factory),
90 media_stream_dispatcher_(media_stream_dispatcher) { 82 media_stream_dispatcher_(media_stream_dispatcher) {
91 } 83 }
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
198 } 190 }
199 } 191 }
200 192
201 void MediaStreamImpl::requestMediaDevices( 193 void MediaStreamImpl::requestMediaDevices(
202 const blink::WebMediaDevicesRequest& media_devices_request) { 194 const blink::WebMediaDevicesRequest& media_devices_request) {
203 UpdateWebRTCMethodCount(WEBKIT_GET_MEDIA_DEVICES); 195 UpdateWebRTCMethodCount(WEBKIT_GET_MEDIA_DEVICES);
204 DCHECK(CalledOnValidThread()); 196 DCHECK(CalledOnValidThread());
205 197
206 int audio_input_request_id = g_next_request_id++; 198 int audio_input_request_id = g_next_request_id++;
207 int video_input_request_id = g_next_request_id++; 199 int video_input_request_id = g_next_request_id++;
208 int audio_output_request_id = g_next_request_id++;
209 200
210 // |media_devices_request| can't be mocked, so in tests it will be empty (the 201 // |media_devices_request| can't be mocked, so in tests it will be empty (the
211 // underlying pointer is null). In order to use this function in a test we 202 // underlying pointer is null). In order to use this function in a test we
212 // need to check if it isNull. 203 // need to check if it isNull.
213 GURL security_origin; 204 GURL security_origin;
214 if (!media_devices_request.isNull()) 205 if (!media_devices_request.isNull())
215 security_origin = GURL(media_devices_request.securityOrigin().toString()); 206 security_origin = GURL(media_devices_request.securityOrigin().toString());
216 207
217 DVLOG(1) << "MediaStreamImpl::requestMediaDevices(" << audio_input_request_id 208 DVLOG(1) << "MediaStreamImpl::requestMediaDevices(" << audio_input_request_id
218 << ", " << video_input_request_id << ", " << audio_output_request_id 209 << ", " << video_input_request_id << ", "
219 << ", " << security_origin.spec() << ")"; 210 << security_origin.spec() << ")";
220 211
221 media_devices_requests_.push_back(new MediaDevicesRequestInfo( 212 media_devices_requests_.push_back(new MediaDevicesRequestInfo(
222 media_devices_request, 213 media_devices_request, audio_input_request_id, video_input_request_id));
223 audio_input_request_id,
224 video_input_request_id,
225 audio_output_request_id));
226 214
227 media_stream_dispatcher_->EnumerateDevices( 215 media_stream_dispatcher_->EnumerateDevices(
228 audio_input_request_id, 216 audio_input_request_id,
229 AsWeakPtr(), 217 AsWeakPtr(),
230 MEDIA_DEVICE_AUDIO_CAPTURE, 218 MEDIA_DEVICE_AUDIO_CAPTURE,
231 security_origin); 219 security_origin);
232 220
233 media_stream_dispatcher_->EnumerateDevices( 221 media_stream_dispatcher_->EnumerateDevices(
234 video_input_request_id, 222 video_input_request_id,
235 AsWeakPtr(), 223 AsWeakPtr(),
236 MEDIA_DEVICE_VIDEO_CAPTURE, 224 MEDIA_DEVICE_VIDEO_CAPTURE,
237 security_origin); 225 security_origin);
238
239 media_stream_dispatcher_->EnumerateDevices(
240 audio_output_request_id,
241 AsWeakPtr(),
242 MEDIA_DEVICE_AUDIO_OUTPUT,
243 security_origin);
244 } 226 }
245 227
246 void MediaStreamImpl::cancelMediaDevicesRequest( 228 void MediaStreamImpl::cancelMediaDevicesRequest(
247 const blink::WebMediaDevicesRequest& media_devices_request) { 229 const blink::WebMediaDevicesRequest& media_devices_request) {
248 DCHECK(CalledOnValidThread()); 230 DCHECK(CalledOnValidThread());
249 MediaDevicesRequestInfo* request = 231 MediaDevicesRequestInfo* request =
250 FindMediaDevicesRequestInfo(media_devices_request); 232 FindMediaDevicesRequestInfo(media_devices_request);
251 if (!request) 233 if (!request)
252 return; 234 return;
253 235
254 // Cancel device enumeration. 236 // Cancel device enumeration.
255 media_stream_dispatcher_->StopEnumerateDevices( 237 media_stream_dispatcher_->StopEnumerateDevices(
256 request->audio_input_request_id, 238 request->audio_input_request_id,
257 AsWeakPtr()); 239 AsWeakPtr());
258 media_stream_dispatcher_->StopEnumerateDevices( 240 media_stream_dispatcher_->StopEnumerateDevices(
259 request->video_input_request_id, 241 request->video_input_request_id,
260 AsWeakPtr()); 242 AsWeakPtr());
261 media_stream_dispatcher_->StopEnumerateDevices(
262 request->audio_output_request_id,
263 AsWeakPtr());
264 DeleteMediaDevicesRequestInfo(request); 243 DeleteMediaDevicesRequestInfo(request);
265 } 244 }
266 245
267 // Callback from MediaStreamDispatcher. 246 // Callback from MediaStreamDispatcher.
268 // The requested stream have been generated by the MediaStreamDispatcher. 247 // The requested stream have been generated by the MediaStreamDispatcher.
269 void MediaStreamImpl::OnStreamGenerated( 248 void MediaStreamImpl::OnStreamGenerated(
270 int request_id, 249 int request_id,
271 const std::string& label, 250 const std::string& label,
272 const StreamDeviceInfoArray& audio_array, 251 const StreamDeviceInfoArray& audio_array,
273 const StreamDeviceInfoArray& video_array) { 252 const StreamDeviceInfoArray& video_array) {
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
514 const StreamDeviceInfoArray& device_array) { 493 const StreamDeviceInfoArray& device_array) {
515 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" << request_id << ")"; 494 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" << request_id << ")";
516 495
517 MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id); 496 MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id);
518 DCHECK(request); 497 DCHECK(request);
519 498
520 if (request_id == request->audio_input_request_id) { 499 if (request_id == request->audio_input_request_id) {
521 request->has_audio_input_returned = true; 500 request->has_audio_input_returned = true;
522 DCHECK(request->audio_input_devices.empty()); 501 DCHECK(request->audio_input_devices.empty());
523 request->audio_input_devices = device_array; 502 request->audio_input_devices = device_array;
524 } else if (request_id == request->video_input_request_id) { 503 } else {
504 DCHECK(request_id == request->video_input_request_id);
525 request->has_video_input_returned = true; 505 request->has_video_input_returned = true;
526 DCHECK(request->video_input_devices.empty()); 506 DCHECK(request->video_input_devices.empty());
527 request->video_input_devices = device_array; 507 request->video_input_devices = device_array;
528 } else {
529 DCHECK_EQ(request->audio_output_request_id, request_id);
530 request->has_audio_output_returned = true;
531 DCHECK(request->audio_output_devices.empty());
532 request->audio_output_devices = device_array;
533 } 508 }
534 509
535 if (!request->has_audio_input_returned || 510 if (!request->has_audio_input_returned ||
536 !request->has_video_input_returned || 511 !request->has_video_input_returned) {
537 !request->has_audio_output_returned) {
538 // Wait for the rest of the devices to complete. 512 // Wait for the rest of the devices to complete.
539 return; 513 return;
540 } 514 }
541 515
542 // All devices are ready for copying. We use a hashed audio output device id 516 // Both audio and video devices are ready for copying.
543 // as the group id for input and output audio devices. If an input device 517 // TODO(grunell): Add support for output devices and group id.
544 // doesn't have an associated output device, we use the input device's own id.
545 // We don't support group id for video devices, that's left empty.
546 blink::WebVector<blink::WebMediaDeviceInfo> 518 blink::WebVector<blink::WebMediaDeviceInfo>
547 devices(request->audio_input_devices.size() + 519 devices(request->audio_input_devices.size() +
548 request->video_input_devices.size() + 520 request->video_input_devices.size());
549 request->audio_output_devices.size());
550 for (size_t i = 0; i < request->audio_input_devices.size(); ++i) { 521 for (size_t i = 0; i < request->audio_input_devices.size(); ++i) {
551 const MediaStreamDevice& device = request->audio_input_devices[i].device; 522 const MediaStreamDevice& device = request->audio_input_devices[i].device;
552 DCHECK_EQ(device.type, MEDIA_DEVICE_AUDIO_CAPTURE); 523 DCHECK_EQ(device.type, MEDIA_DEVICE_AUDIO_CAPTURE);
553 std::string group_id = base::UintToString(base::Hash( 524 devices[i].initialize(blink::WebString::fromUTF8(device.id),
554 !device.matched_output_device_id.empty() ? 525 blink::WebMediaDeviceInfo::MediaDeviceKindAudioInput,
555 device.matched_output_device_id : 526 blink::WebString::fromUTF8(device.name),
556 device.id)); 527 blink::WebString());
557 devices[i].initialize(
558 blink::WebString::fromUTF8(device.id),
559 blink::WebMediaDeviceInfo::MediaDeviceKindAudioInput,
560 blink::WebString::fromUTF8(device.name),
561 blink::WebString::fromUTF8(group_id));
562 } 528 }
563 size_t offset = request->audio_input_devices.size(); 529 size_t audio_size = request->audio_input_devices.size();
564 for (size_t i = 0; i < request->video_input_devices.size(); ++i) { 530 for (size_t i = 0; i < request->video_input_devices.size(); ++i) {
565 const MediaStreamDevice& device = request->video_input_devices[i].device; 531 const MediaStreamDevice& device = request->video_input_devices[i].device;
566 DCHECK_EQ(device.type, MEDIA_DEVICE_VIDEO_CAPTURE); 532 DCHECK_EQ(device.type, MEDIA_DEVICE_VIDEO_CAPTURE);
567 devices[offset + i].initialize( 533 devices[audio_size + i].initialize(
568 blink::WebString::fromUTF8(device.id), 534 blink::WebString::fromUTF8(device.id),
569 blink::WebMediaDeviceInfo::MediaDeviceKindVideoInput, 535 blink::WebMediaDeviceInfo::MediaDeviceKindVideoInput,
570 blink::WebString::fromUTF8(device.name), 536 blink::WebString::fromUTF8(device.name),
571 blink::WebString()); 537 blink::WebString());
572 } 538 }
573 offset += request->video_input_devices.size();
574 for (size_t i = 0; i < request->audio_output_devices.size(); ++i) {
575 const MediaStreamDevice& device = request->audio_output_devices[i].device;
576 DCHECK_EQ(device.type, MEDIA_DEVICE_AUDIO_OUTPUT);
577 devices[offset + i].initialize(
578 blink::WebString::fromUTF8(device.id),
579 blink::WebMediaDeviceInfo::MediaDeviceKindAudioOutput,
580 blink::WebString::fromUTF8(device.name),
581 blink::WebString::fromUTF8(base::UintToString(base::Hash(device.id))));
582 }
583 539
584 EnumerateDevicesSucceded(&request->request, devices); 540 EnumerateDevicesSucceded(&request->request, devices);
585 541
586 // Cancel device enumeration. 542 // Cancel device enumeration.
587 media_stream_dispatcher_->StopEnumerateDevices( 543 media_stream_dispatcher_->StopEnumerateDevices(
588 request->audio_input_request_id, 544 request->audio_input_request_id,
589 AsWeakPtr()); 545 AsWeakPtr());
590 media_stream_dispatcher_->StopEnumerateDevices( 546 media_stream_dispatcher_->StopEnumerateDevices(
591 request->video_input_request_id, 547 request->video_input_request_id,
592 AsWeakPtr()); 548 AsWeakPtr());
593 media_stream_dispatcher_->StopEnumerateDevices(
594 request->audio_output_request_id,
595 AsWeakPtr());
596 549
597 DeleteMediaDevicesRequestInfo(request); 550 DeleteMediaDevicesRequestInfo(request);
598 } 551 }
599 552
600 void MediaStreamImpl::OnDeviceOpened( 553 void MediaStreamImpl::OnDeviceOpened(
601 int request_id, 554 int request_id,
602 const std::string& label, 555 const std::string& label,
603 const StreamDeviceInfo& video_device) { 556 const StreamDeviceInfo& video_device) {
604 DVLOG(1) << "MediaStreamImpl::OnDeviceOpened(" 557 DVLOG(1) << "MediaStreamImpl::OnDeviceOpened("
605 << request_id << ", " << label << ")"; 558 << request_id << ", " << label << ")";
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
713 } 666 }
714 NOTREACHED(); 667 NOTREACHED();
715 } 668 }
716 669
717 MediaStreamImpl::MediaDevicesRequestInfo* 670 MediaStreamImpl::MediaDevicesRequestInfo*
718 MediaStreamImpl::FindMediaDevicesRequestInfo( 671 MediaStreamImpl::FindMediaDevicesRequestInfo(
719 int request_id) { 672 int request_id) {
720 MediaDevicesRequests::iterator it = media_devices_requests_.begin(); 673 MediaDevicesRequests::iterator it = media_devices_requests_.begin();
721 for (; it != media_devices_requests_.end(); ++it) { 674 for (; it != media_devices_requests_.end(); ++it) {
722 if ((*it)->audio_input_request_id == request_id || 675 if ((*it)->audio_input_request_id == request_id ||
723 (*it)->video_input_request_id == request_id || 676 (*it)->video_input_request_id == request_id) {
724 (*it)->audio_output_request_id == request_id) {
725 return (*it); 677 return (*it);
726 } 678 }
727 } 679 }
728 return NULL; 680 return NULL;
729 } 681 }
730 682
731 MediaStreamImpl::MediaDevicesRequestInfo* 683 MediaStreamImpl::MediaDevicesRequestInfo*
732 MediaStreamImpl::FindMediaDevicesRequestInfo( 684 MediaStreamImpl::FindMediaDevicesRequestInfo(
733 const blink::WebMediaDevicesRequest& request) { 685 const blink::WebMediaDevicesRequest& request) {
734 MediaDevicesRequests::iterator it = media_devices_requests_.begin(); 686 MediaDevicesRequests::iterator it = media_devices_requests_.begin();
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
926 sources_.begin(); 878 sources_.begin();
927 it != sources_.end(); ++it) { 879 it != sources_.end(); ++it) {
928 if (source.id() == it->id()) { 880 if (source.id() == it->id()) {
929 sources_.erase(it); 881 sources_.erase(it);
930 return; 882 return;
931 } 883 }
932 } 884 }
933 } 885 }
934 886
935 } // namespace content 887 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/media_stream_dispatcher_unittest.cc ('k') | content/renderer/media/media_stream_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698