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

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

Issue 364123002: [Cross-Site Isolation] Migrate entire MediaStream verticals to be per-RenderFrame. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: It's random enough. + REBASE Created 6 years, 5 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_dispatcher.h" 5 #include "content/renderer/media/media_stream_dispatcher.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/message_loop/message_loop_proxy.h"
9 #include "content/common/media/media_stream_messages.h" 8 #include "content/common/media/media_stream_messages.h"
10 #include "content/renderer/media/media_stream_dispatcher_eventhandler.h" 9 #include "content/renderer/media/media_stream_dispatcher_eventhandler.h"
11 #include "content/renderer/render_thread_impl.h" 10 #include "content/renderer/render_thread_impl.h"
12 #include "content/renderer/render_view_impl.h"
13 #include "media/audio/audio_parameters.h" 11 #include "media/audio/audio_parameters.h"
14 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h" 12 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
15 #include "url/gurl.h" 13 #include "url/gurl.h"
16 14
17 namespace content { 15 namespace content {
18 16
19 namespace { 17 namespace {
20 18
21 bool RemoveStreamDeviceFromArray(const StreamDeviceInfo device_info, 19 bool RemoveStreamDeviceFromArray(const StreamDeviceInfo device_info,
22 StreamDeviceInfoArray* array) { 20 StreamDeviceInfoArray* array) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 }; 54 };
57 55
58 struct MediaStreamDispatcher::Stream { 56 struct MediaStreamDispatcher::Stream {
59 Stream() {} 57 Stream() {}
60 ~Stream() {} 58 ~Stream() {}
61 base::WeakPtr<MediaStreamDispatcherEventHandler> handler; 59 base::WeakPtr<MediaStreamDispatcherEventHandler> handler;
62 StreamDeviceInfoArray audio_array; 60 StreamDeviceInfoArray audio_array;
63 StreamDeviceInfoArray video_array; 61 StreamDeviceInfoArray video_array;
64 }; 62 };
65 63
66 MediaStreamDispatcher::MediaStreamDispatcher(RenderViewImpl* render_view) 64 MediaStreamDispatcher::MediaStreamDispatcher(RenderFrame* render_frame)
67 : RenderViewObserver(render_view), 65 : RenderFrameObserver(render_frame),
68 main_loop_(base::MessageLoopProxy::current()),
69 next_ipc_id_(0) { 66 next_ipc_id_(0) {
70 } 67 }
71 68
72 MediaStreamDispatcher::~MediaStreamDispatcher() {} 69 MediaStreamDispatcher::~MediaStreamDispatcher() {}
73 70
74 void MediaStreamDispatcher::GenerateStream( 71 void MediaStreamDispatcher::GenerateStream(
75 int request_id, 72 int request_id,
76 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, 73 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler,
77 const StreamOptions& components, 74 const StreamOptions& components,
78 const GURL& security_origin) { 75 const GURL& security_origin) {
79 DCHECK(main_loop_->BelongsToCurrentThread()); 76 DCHECK(thread_checker_.CalledOnValidThread());
80 DVLOG(1) << "MediaStreamDispatcher::GenerateStream(" << request_id << ")"; 77 DVLOG(1) << "MediaStreamDispatcher::GenerateStream(" << request_id << ")";
81 78
82 requests_.push_back(Request(event_handler, request_id, next_ipc_id_)); 79 requests_.push_back(Request(event_handler, request_id, next_ipc_id_));
83 Send(new MediaStreamHostMsg_GenerateStream( 80 Send(new MediaStreamHostMsg_GenerateStream(
84 routing_id(), next_ipc_id_++, components, security_origin, 81 routing_id(), next_ipc_id_++, components, security_origin,
85 blink::WebUserGestureIndicator::isProcessingUserGesture())); 82 blink::WebUserGestureIndicator::isProcessingUserGesture()));
86 } 83 }
87 84
88 void MediaStreamDispatcher::CancelGenerateStream( 85 void MediaStreamDispatcher::CancelGenerateStream(
89 int request_id, 86 int request_id,
90 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler) { 87 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler) {
91 DCHECK(main_loop_->BelongsToCurrentThread()); 88 DCHECK(thread_checker_.CalledOnValidThread());
92 DVLOG(1) << "MediaStreamDispatcher::CancelGenerateStream" 89 DVLOG(1) << "MediaStreamDispatcher::CancelGenerateStream"
93 << ", {request_id = " << request_id << "}"; 90 << ", {request_id = " << request_id << "}";
94 91
95 RequestList::iterator it = requests_.begin(); 92 RequestList::iterator it = requests_.begin();
96 for (; it != requests_.end(); ++it) { 93 for (; it != requests_.end(); ++it) {
97 if (it->IsThisRequest(request_id, event_handler)) { 94 if (it->IsThisRequest(request_id, event_handler)) {
98 int ipc_request = it->ipc_request; 95 int ipc_request = it->ipc_request;
99 requests_.erase(it); 96 requests_.erase(it);
100 Send(new MediaStreamHostMsg_CancelGenerateStream(routing_id(), 97 Send(new MediaStreamHostMsg_CancelGenerateStream(routing_id(),
101 ipc_request)); 98 ipc_request));
102 break; 99 break;
103 } 100 }
104 } 101 }
105 } 102 }
106 103
107 void MediaStreamDispatcher::StopStreamDevice( 104 void MediaStreamDispatcher::StopStreamDevice(
108 const StreamDeviceInfo& device_info) { 105 const StreamDeviceInfo& device_info) {
109 DCHECK(main_loop_->BelongsToCurrentThread()); 106 DCHECK(thread_checker_.CalledOnValidThread());
110 DVLOG(1) << "MediaStreamDispatcher::StopStreamDevice" 107 DVLOG(1) << "MediaStreamDispatcher::StopStreamDevice"
111 << ", {device_id = " << device_info.device.id << "}"; 108 << ", {device_id = " << device_info.device.id << "}";
112 // Remove |device_info| from all streams in |label_stream_map_|. 109 // Remove |device_info| from all streams in |label_stream_map_|.
113 bool device_found = false; 110 bool device_found = false;
114 LabelStreamMap::iterator stream_it = label_stream_map_.begin(); 111 LabelStreamMap::iterator stream_it = label_stream_map_.begin();
115 while (stream_it != label_stream_map_.end()) { 112 while (stream_it != label_stream_map_.end()) {
116 StreamDeviceInfoArray& audio_array = stream_it->second.audio_array; 113 StreamDeviceInfoArray& audio_array = stream_it->second.audio_array;
117 StreamDeviceInfoArray& video_array = stream_it->second.video_array; 114 StreamDeviceInfoArray& video_array = stream_it->second.video_array;
118 115
119 if (RemoveStreamDeviceFromArray(device_info, &audio_array) || 116 if (RemoveStreamDeviceFromArray(device_info, &audio_array) ||
120 RemoveStreamDeviceFromArray(device_info, &video_array)) { 117 RemoveStreamDeviceFromArray(device_info, &video_array)) {
121 device_found = true; 118 device_found = true;
122 if (audio_array.empty() && video_array.empty()) { 119 if (audio_array.empty() && video_array.empty()) {
123 label_stream_map_.erase(stream_it++); 120 label_stream_map_.erase(stream_it++);
124 continue; 121 continue;
125 } 122 }
126 } 123 }
127 ++stream_it; 124 ++stream_it;
128 } 125 }
129 126
130 if (!device_found) { 127 if (!device_found) {
131 // TODO(perkj): This can currently happen since there is one 128 // TODO(perkj): Revisit this. It used to be true (but isn't anymore) that
132 // MediaStreamDispatcher per RenderView but there is one MediaStreamImpl 129 // there was one MediaStreamDispatcher per RenderView, but one
133 // per RenderFrame. http://crbug/368030. 130 // MediaStreamImpl per RenderFrame. Now both MediaStreamDispatcher and
131 // MediaStreamImpl are 1:1 per RenderFrame. http://crbug/368030.
134 return; 132 return;
135 } 133 }
136 134
137 Send(new MediaStreamHostMsg_StopStreamDevice(routing_id(), 135 Send(new MediaStreamHostMsg_StopStreamDevice(routing_id(),
138 device_info.device.id)); 136 device_info.device.id));
139 } 137 }
140 138
141 void MediaStreamDispatcher::EnumerateDevices( 139 void MediaStreamDispatcher::EnumerateDevices(
142 int request_id, 140 int request_id,
143 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, 141 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler,
144 MediaStreamType type, 142 MediaStreamType type,
145 const GURL& security_origin, 143 const GURL& security_origin,
146 bool hide_labels_if_no_access) { 144 bool hide_labels_if_no_access) {
147 DCHECK(main_loop_->BelongsToCurrentThread()); 145 DCHECK(thread_checker_.CalledOnValidThread());
148 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE || 146 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE ||
149 type == MEDIA_DEVICE_VIDEO_CAPTURE || 147 type == MEDIA_DEVICE_VIDEO_CAPTURE ||
150 type == MEDIA_DEVICE_AUDIO_OUTPUT); 148 type == MEDIA_DEVICE_AUDIO_OUTPUT);
151 DVLOG(1) << "MediaStreamDispatcher::EnumerateDevices(" 149 DVLOG(1) << "MediaStreamDispatcher::EnumerateDevices("
152 << request_id << ")"; 150 << request_id << ")";
153 151
154 for (RequestList::iterator it = requests_.begin(); it != requests_.end(); 152 for (RequestList::iterator it = requests_.begin(); it != requests_.end();
155 ++it) { 153 ++it) {
156 DCHECK(!it->IsThisRequest(request_id, event_handler)); 154 DCHECK(!it->IsThisRequest(request_id, event_handler));
157 } 155 }
158 156
159 requests_.push_back(Request(event_handler, request_id, next_ipc_id_)); 157 requests_.push_back(Request(event_handler, request_id, next_ipc_id_));
160 Send(new MediaStreamHostMsg_EnumerateDevices(routing_id(), 158 Send(new MediaStreamHostMsg_EnumerateDevices(routing_id(),
161 next_ipc_id_++, 159 next_ipc_id_++,
162 type, 160 type,
163 security_origin, 161 security_origin,
164 hide_labels_if_no_access)); 162 hide_labels_if_no_access));
165 } 163 }
166 164
167 void MediaStreamDispatcher::StopEnumerateDevices( 165 void MediaStreamDispatcher::StopEnumerateDevices(
168 int request_id, 166 int request_id,
169 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler) { 167 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler) {
170 DCHECK(main_loop_->BelongsToCurrentThread()); 168 DCHECK(thread_checker_.CalledOnValidThread());
171 DVLOG(1) << "MediaStreamDispatcher::StopEnumerateDevices(" 169 DVLOG(1) << "MediaStreamDispatcher::StopEnumerateDevices("
172 << request_id << ")"; 170 << request_id << ")";
173 for (RequestList::iterator it = requests_.begin(); it != requests_.end(); 171 for (RequestList::iterator it = requests_.begin(); it != requests_.end();
174 ++it) { 172 ++it) {
175 if (it->IsThisRequest(request_id, event_handler)) { 173 if (it->IsThisRequest(request_id, event_handler)) {
176 Send(new MediaStreamHostMsg_CancelEnumerateDevices(routing_id(), 174 Send(new MediaStreamHostMsg_CancelEnumerateDevices(routing_id(),
177 it->ipc_request)); 175 it->ipc_request));
178 requests_.erase(it); 176 requests_.erase(it);
179 break; 177 break;
180 } 178 }
181 } 179 }
182 } 180 }
183 181
184 void MediaStreamDispatcher::OpenDevice( 182 void MediaStreamDispatcher::OpenDevice(
185 int request_id, 183 int request_id,
186 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, 184 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler,
187 const std::string& device_id, 185 const std::string& device_id,
188 MediaStreamType type, 186 MediaStreamType type,
189 const GURL& security_origin) { 187 const GURL& security_origin) {
190 DCHECK(main_loop_->BelongsToCurrentThread()); 188 DCHECK(thread_checker_.CalledOnValidThread());
191 DVLOG(1) << "MediaStreamDispatcher::OpenDevice(" << request_id << ")"; 189 DVLOG(1) << "MediaStreamDispatcher::OpenDevice(" << request_id << ")";
192 190
193 requests_.push_back(Request(event_handler, request_id, next_ipc_id_)); 191 requests_.push_back(Request(event_handler, request_id, next_ipc_id_));
194 Send(new MediaStreamHostMsg_OpenDevice(routing_id(), 192 Send(new MediaStreamHostMsg_OpenDevice(routing_id(),
195 next_ipc_id_++, 193 next_ipc_id_++,
196 device_id, 194 device_id,
197 type, 195 type,
198 security_origin)); 196 security_origin));
199 } 197 }
200 198
201 void MediaStreamDispatcher::CancelOpenDevice( 199 void MediaStreamDispatcher::CancelOpenDevice(
202 int request_id, 200 int request_id,
203 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler) { 201 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler) {
204 CancelGenerateStream(request_id, event_handler); 202 CancelGenerateStream(request_id, event_handler);
205 } 203 }
206 204
207 void MediaStreamDispatcher::CloseDevice(const std::string& label) { 205 void MediaStreamDispatcher::CloseDevice(const std::string& label) {
208 DCHECK(main_loop_->BelongsToCurrentThread()); 206 DCHECK(thread_checker_.CalledOnValidThread());
209 DCHECK(!label.empty()); 207 DCHECK(!label.empty());
210 DVLOG(1) << "MediaStreamDispatcher::CloseDevice" 208 DVLOG(1) << "MediaStreamDispatcher::CloseDevice"
211 << ", {label = " << label << "}"; 209 << ", {label = " << label << "}";
212 210
213 LabelStreamMap::iterator it = label_stream_map_.find(label); 211 LabelStreamMap::iterator it = label_stream_map_.find(label);
214 if (it == label_stream_map_.end()) 212 if (it == label_stream_map_.end())
215 return; 213 return;
216 label_stream_map_.erase(it); 214 label_stream_map_.erase(it);
217 215
218 Send(new MediaStreamHostMsg_CloseDevice(routing_id(), label)); 216 Send(new MediaStreamHostMsg_CloseDevice(routing_id(), label));
219 } 217 }
220 218
219 void MediaStreamDispatcher::OnDestruct() {
220 // Do not self-destruct. MediaStreamImpl owns |this|.
221 }
222
221 bool MediaStreamDispatcher::Send(IPC::Message* message) { 223 bool MediaStreamDispatcher::Send(IPC::Message* message) {
222 if (!RenderThread::Get()) { 224 if (!RenderThread::Get()) {
223 delete message; 225 delete message;
224 return false; 226 return false;
225 } 227 }
226 228
227 return RenderThread::Get()->Send(message); 229 return RenderThread::Get()->Send(message);
228 } 230 }
229 231
230 bool MediaStreamDispatcher::OnMessageReceived(const IPC::Message& message) { 232 bool MediaStreamDispatcher::OnMessageReceived(const IPC::Message& message) {
(...skipping 14 matching lines...) Expand all
245 IPC_MESSAGE_UNHANDLED(handled = false) 247 IPC_MESSAGE_UNHANDLED(handled = false)
246 IPC_END_MESSAGE_MAP() 248 IPC_END_MESSAGE_MAP()
247 return handled; 249 return handled;
248 } 250 }
249 251
250 void MediaStreamDispatcher::OnStreamGenerated( 252 void MediaStreamDispatcher::OnStreamGenerated(
251 int request_id, 253 int request_id,
252 const std::string& label, 254 const std::string& label,
253 const StreamDeviceInfoArray& audio_array, 255 const StreamDeviceInfoArray& audio_array,
254 const StreamDeviceInfoArray& video_array) { 256 const StreamDeviceInfoArray& video_array) {
255 DCHECK(main_loop_->BelongsToCurrentThread()); 257 DCHECK(thread_checker_.CalledOnValidThread());
256 258
257 for (RequestList::iterator it = requests_.begin(); 259 for (RequestList::iterator it = requests_.begin();
258 it != requests_.end(); ++it) { 260 it != requests_.end(); ++it) {
259 Request& request = *it; 261 Request& request = *it;
260 if (request.ipc_request == request_id) { 262 if (request.ipc_request == request_id) {
261 Stream new_stream; 263 Stream new_stream;
262 new_stream.handler = request.handler; 264 new_stream.handler = request.handler;
263 new_stream.audio_array = audio_array; 265 new_stream.audio_array = audio_array;
264 new_stream.video_array = video_array; 266 new_stream.video_array = video_array;
265 label_stream_map_[label] = new_stream; 267 label_stream_map_[label] = new_stream;
266 if (request.handler.get()) { 268 if (request.handler.get()) {
267 request.handler->OnStreamGenerated( 269 request.handler->OnStreamGenerated(
268 request.request_id, label, audio_array, video_array); 270 request.request_id, label, audio_array, video_array);
269 DVLOG(1) << "MediaStreamDispatcher::OnStreamGenerated(" 271 DVLOG(1) << "MediaStreamDispatcher::OnStreamGenerated("
270 << request.request_id << ", " << label << ")"; 272 << request.request_id << ", " << label << ")";
271 } 273 }
272 requests_.erase(it); 274 requests_.erase(it);
273 break; 275 break;
274 } 276 }
275 } 277 }
276 } 278 }
277 279
278 void MediaStreamDispatcher::OnStreamGenerationFailed( 280 void MediaStreamDispatcher::OnStreamGenerationFailed(
279 int request_id, 281 int request_id,
280 content::MediaStreamRequestResult result) { 282 content::MediaStreamRequestResult result) {
281 DCHECK(main_loop_->BelongsToCurrentThread()); 283 DCHECK(thread_checker_.CalledOnValidThread());
282 for (RequestList::iterator it = requests_.begin(); 284 for (RequestList::iterator it = requests_.begin();
283 it != requests_.end(); ++it) { 285 it != requests_.end(); ++it) {
284 Request& request = *it; 286 Request& request = *it;
285 if (request.ipc_request == request_id) { 287 if (request.ipc_request == request_id) {
286 if (request.handler.get()) { 288 if (request.handler.get()) {
287 request.handler->OnStreamGenerationFailed(request.request_id, result); 289 request.handler->OnStreamGenerationFailed(request.request_id, result);
288 DVLOG(1) << "MediaStreamDispatcher::OnStreamGenerationFailed(" 290 DVLOG(1) << "MediaStreamDispatcher::OnStreamGenerationFailed("
289 << request.request_id << ")\n"; 291 << request.request_id << ")\n";
290 } 292 }
291 requests_.erase(it); 293 requests_.erase(it);
292 break; 294 break;
293 } 295 }
294 } 296 }
295 } 297 }
296 298
297 void MediaStreamDispatcher::OnDeviceStopped( 299 void MediaStreamDispatcher::OnDeviceStopped(
298 const std::string& label, 300 const std::string& label,
299 const StreamDeviceInfo& device_info) { 301 const StreamDeviceInfo& device_info) {
300 DCHECK(main_loop_->BelongsToCurrentThread()); 302 DCHECK(thread_checker_.CalledOnValidThread());
301 DVLOG(1) << "MediaStreamDispatcher::OnDeviceStopped(" 303 DVLOG(1) << "MediaStreamDispatcher::OnDeviceStopped("
302 << "{label = " << label << "})" 304 << "{label = " << label << "})"
303 << ", {device_id = " << device_info.device.id << "})"; 305 << ", {device_id = " << device_info.device.id << "})";
304 306
305 LabelStreamMap::iterator it = label_stream_map_.find(label); 307 LabelStreamMap::iterator it = label_stream_map_.find(label);
306 if (it == label_stream_map_.end()) { 308 if (it == label_stream_map_.end()) {
307 // This can happen if a user happen stop a the device from JS at the same 309 // This can happen if a user happen stop a the device from JS at the same
308 // time as the underlying media device is unplugged from the system. 310 // time as the underlying media device is unplugged from the system.
309 return; 311 return;
310 } 312 }
311 Stream* stream = &it->second; 313 Stream* stream = &it->second;
312 if (IsAudioInputMediaType(device_info.device.type)) 314 if (IsAudioInputMediaType(device_info.device.type))
313 RemoveStreamDeviceFromArray(device_info, &stream->audio_array); 315 RemoveStreamDeviceFromArray(device_info, &stream->audio_array);
314 else 316 else
315 RemoveStreamDeviceFromArray(device_info, &stream->video_array); 317 RemoveStreamDeviceFromArray(device_info, &stream->video_array);
316 318
317 if (stream->handler.get()) 319 if (stream->handler.get())
318 stream->handler->OnDeviceStopped(label, device_info); 320 stream->handler->OnDeviceStopped(label, device_info);
319 321
320 if (stream->audio_array.empty() && stream->video_array.empty()) 322 if (stream->audio_array.empty() && stream->video_array.empty())
321 label_stream_map_.erase(it); 323 label_stream_map_.erase(it);
322 } 324 }
323 325
324 void MediaStreamDispatcher::OnDevicesEnumerated( 326 void MediaStreamDispatcher::OnDevicesEnumerated(
325 int request_id, 327 int request_id,
326 const StreamDeviceInfoArray& device_array) { 328 const StreamDeviceInfoArray& device_array) {
327 DCHECK(main_loop_->BelongsToCurrentThread()); 329 DCHECK(thread_checker_.CalledOnValidThread());
328 DCHECK_GE(request_id, 0); 330 DCHECK_GE(request_id, 0);
329 331
330 for (RequestList::iterator it = requests_.begin(); it != requests_.end(); 332 for (RequestList::iterator it = requests_.begin(); it != requests_.end();
331 ++it) { 333 ++it) {
332 if (it->ipc_request == request_id && it->handler.get()) { 334 if (it->ipc_request == request_id && it->handler.get()) {
333 it->handler->OnDevicesEnumerated(it->request_id, device_array); 335 it->handler->OnDevicesEnumerated(it->request_id, device_array);
334 break; 336 break;
335 } 337 }
336 } 338 }
337 } 339 }
338 340
339 void MediaStreamDispatcher::OnDeviceOpened( 341 void MediaStreamDispatcher::OnDeviceOpened(
340 int request_id, 342 int request_id,
341 const std::string& label, 343 const std::string& label,
342 const StreamDeviceInfo& device_info) { 344 const StreamDeviceInfo& device_info) {
343 DCHECK(main_loop_->BelongsToCurrentThread()); 345 DCHECK(thread_checker_.CalledOnValidThread());
344 for (RequestList::iterator it = requests_.begin(); 346 for (RequestList::iterator it = requests_.begin();
345 it != requests_.end(); ++it) { 347 it != requests_.end(); ++it) {
346 Request& request = *it; 348 Request& request = *it;
347 if (request.ipc_request == request_id) { 349 if (request.ipc_request == request_id) {
348 Stream new_stream; 350 Stream new_stream;
349 new_stream.handler = request.handler; 351 new_stream.handler = request.handler;
350 if (IsAudioInputMediaType(device_info.device.type)) { 352 if (IsAudioInputMediaType(device_info.device.type)) {
351 new_stream.audio_array.push_back(device_info); 353 new_stream.audio_array.push_back(device_info);
352 } else if (IsVideoMediaType(device_info.device.type)) { 354 } else if (IsVideoMediaType(device_info.device.type)) {
353 new_stream.video_array.push_back(device_info); 355 new_stream.video_array.push_back(device_info);
354 } else { 356 } else {
355 NOTREACHED(); 357 NOTREACHED();
356 } 358 }
357 label_stream_map_[label] = new_stream; 359 label_stream_map_[label] = new_stream;
358 if (request.handler.get()) { 360 if (request.handler.get()) {
359 request.handler->OnDeviceOpened(request.request_id, label, device_info); 361 request.handler->OnDeviceOpened(request.request_id, label, device_info);
360 DVLOG(1) << "MediaStreamDispatcher::OnDeviceOpened(" 362 DVLOG(1) << "MediaStreamDispatcher::OnDeviceOpened("
361 << request.request_id << ", " << label << ")"; 363 << request.request_id << ", " << label << ")";
362 } 364 }
363 requests_.erase(it); 365 requests_.erase(it);
364 break; 366 break;
365 } 367 }
366 } 368 }
367 } 369 }
368 370
369 void MediaStreamDispatcher::OnDeviceOpenFailed(int request_id) { 371 void MediaStreamDispatcher::OnDeviceOpenFailed(int request_id) {
370 DCHECK(main_loop_->BelongsToCurrentThread()); 372 DCHECK(thread_checker_.CalledOnValidThread());
371 for (RequestList::iterator it = requests_.begin(); 373 for (RequestList::iterator it = requests_.begin();
372 it != requests_.end(); ++it) { 374 it != requests_.end(); ++it) {
373 Request& request = *it; 375 Request& request = *it;
374 if (request.ipc_request == request_id) { 376 if (request.ipc_request == request_id) {
375 if (request.handler.get()) { 377 if (request.handler.get()) {
376 request.handler->OnDeviceOpenFailed(request.request_id); 378 request.handler->OnDeviceOpenFailed(request.request_id);
377 DVLOG(1) << "MediaStreamDispatcher::OnDeviceOpenFailed(" 379 DVLOG(1) << "MediaStreamDispatcher::OnDeviceOpenFailed("
378 << request.request_id << ")\n"; 380 << request.request_id << ")\n";
379 } 381 }
380 requests_.erase(it); 382 requests_.erase(it);
381 break; 383 break;
382 } 384 }
383 } 385 }
384 } 386 }
385 387
386 int MediaStreamDispatcher::audio_session_id(const std::string& label, 388 int MediaStreamDispatcher::audio_session_id(const std::string& label,
387 int index) { 389 int index) {
388 DCHECK(main_loop_->BelongsToCurrentThread()); 390 DCHECK(thread_checker_.CalledOnValidThread());
389 LabelStreamMap::iterator it = label_stream_map_.find(label); 391 LabelStreamMap::iterator it = label_stream_map_.find(label);
390 if (it == label_stream_map_.end() || 392 if (it == label_stream_map_.end() ||
391 it->second.audio_array.size() <= static_cast<size_t>(index)) { 393 it->second.audio_array.size() <= static_cast<size_t>(index)) {
392 return StreamDeviceInfo::kNoId; 394 return StreamDeviceInfo::kNoId;
393 } 395 }
394 return it->second.audio_array[index].session_id; 396 return it->second.audio_array[index].session_id;
395 } 397 }
396 398
397 bool MediaStreamDispatcher::IsStream(const std::string& label) { 399 bool MediaStreamDispatcher::IsStream(const std::string& label) {
398 DCHECK(main_loop_->BelongsToCurrentThread()); 400 DCHECK(thread_checker_.CalledOnValidThread());
399 return label_stream_map_.find(label) != label_stream_map_.end(); 401 return label_stream_map_.find(label) != label_stream_map_.end();
400 } 402 }
401 403
402 int MediaStreamDispatcher::video_session_id(const std::string& label, 404 int MediaStreamDispatcher::video_session_id(const std::string& label,
403 int index) { 405 int index) {
404 DCHECK(main_loop_->BelongsToCurrentThread()); 406 DCHECK(thread_checker_.CalledOnValidThread());
405 LabelStreamMap::iterator it = label_stream_map_.find(label); 407 LabelStreamMap::iterator it = label_stream_map_.find(label);
406 if (it == label_stream_map_.end() || 408 if (it == label_stream_map_.end() ||
407 it->second.video_array.size() <= static_cast<size_t>(index)) { 409 it->second.video_array.size() <= static_cast<size_t>(index)) {
408 return StreamDeviceInfo::kNoId; 410 return StreamDeviceInfo::kNoId;
409 } 411 }
410 return it->second.video_array[index].session_id; 412 return it->second.video_array[index].session_id;
411 } 413 }
412 414
413 bool MediaStreamDispatcher::IsAudioDuckingActive() const { 415 bool MediaStreamDispatcher::IsAudioDuckingActive() const {
414 DCHECK(main_loop_->BelongsToCurrentThread()); 416 DCHECK(thread_checker_.CalledOnValidThread());
415 LabelStreamMap::const_iterator stream_it = label_stream_map_.begin(); 417 LabelStreamMap::const_iterator stream_it = label_stream_map_.begin();
416 while (stream_it != label_stream_map_.end()) { 418 while (stream_it != label_stream_map_.end()) {
417 const StreamDeviceInfoArray& audio_array = stream_it->second.audio_array; 419 const StreamDeviceInfoArray& audio_array = stream_it->second.audio_array;
418 for (StreamDeviceInfoArray::const_iterator device_it = audio_array.begin(); 420 for (StreamDeviceInfoArray::const_iterator device_it = audio_array.begin();
419 device_it != audio_array.end(); ++device_it) { 421 device_it != audio_array.end(); ++device_it) {
420 if (device_it->device.input.effects & media::AudioParameters::DUCKING) 422 if (device_it->device.input.effects & media::AudioParameters::DUCKING)
421 return true; 423 return true;
422 } 424 }
423 ++stream_it; 425 ++stream_it;
424 } 426 }
425 return false; 427 return false;
426 } 428 }
427 429
428 } // namespace content 430 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/media_stream_dispatcher.h ('k') | content/renderer/media/media_stream_dispatcher_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698