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

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

Issue 10830063: refactor EnumerateDevices to make it a persistent request. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 8 years, 4 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 "content/common/media/media_stream_messages.h" 8 #include "content/common/media/media_stream_messages.h"
9 #include "content/renderer/media/media_stream_dispatcher_eventhandler.h" 9 #include "content/renderer/media/media_stream_dispatcher_eventhandler.h"
10 #include "content/renderer/render_view_impl.h" 10 #include "content/renderer/render_view_impl.h"
(...skipping 13 matching lines...) Expand all
24 }; 24 };
25 25
26 struct MediaStreamDispatcher::Stream { 26 struct MediaStreamDispatcher::Stream {
27 Stream() {} 27 Stream() {}
28 ~Stream() {} 28 ~Stream() {}
29 base::WeakPtr<MediaStreamDispatcherEventHandler> handler; 29 base::WeakPtr<MediaStreamDispatcherEventHandler> handler;
30 media_stream::StreamDeviceInfoArray audio_array; 30 media_stream::StreamDeviceInfoArray audio_array;
31 media_stream::StreamDeviceInfoArray video_array; 31 media_stream::StreamDeviceInfoArray video_array;
32 }; 32 };
33 33
34 MediaStreamDispatcher::EnumerationRequest::EnumerationRequest(
35 const base::WeakPtr<MediaStreamDispatcherEventHandler>& handler,
36 int request_id)
37 : handler(handler),
38 request_id(request_id) {
39 }
40
41 MediaStreamDispatcher::EnumerationState::EnumerationState()
42 : started(false),
43 ipc_id(0),
44 cache_valid(false) {
45 }
46
34 MediaStreamDispatcher::MediaStreamDispatcher(RenderViewImpl* render_view) 47 MediaStreamDispatcher::MediaStreamDispatcher(RenderViewImpl* render_view)
35 : content::RenderViewObserver(render_view), 48 : content::RenderViewObserver(render_view),
36 next_ipc_id_(0) { 49 next_ipc_id_(0) {
37 } 50 }
38 51
39 MediaStreamDispatcher::~MediaStreamDispatcher() {} 52 MediaStreamDispatcher::~MediaStreamDispatcher() {}
40 53
41 void MediaStreamDispatcher::GenerateStream( 54 void MediaStreamDispatcher::GenerateStream(
42 int request_id, 55 int request_id,
43 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, 56 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler,
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 91
79 Send(new MediaStreamHostMsg_StopGeneratedStream(routing_id(), label)); 92 Send(new MediaStreamHostMsg_StopGeneratedStream(routing_id(), label));
80 label_stream_map_.erase(it); 93 label_stream_map_.erase(it);
81 } 94 }
82 95
83 void MediaStreamDispatcher::EnumerateDevices( 96 void MediaStreamDispatcher::EnumerateDevices(
84 int request_id, 97 int request_id,
85 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, 98 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler,
86 media_stream::MediaStreamType type, 99 media_stream::MediaStreamType type,
87 const GURL& security_origin) { 100 const GURL& security_origin) {
88 DVLOG(1) << "MediaStreamDispatcher::EnumerateDevices(" 101 DVLOG(1) << "MediaStreamDispatcher::EnumerateDevices("
tommi (sloooow) - chröme 2012/07/30 12:10:21 Is this method (and the other methods that touch t
wjia(left Chromium) 2012/08/01 01:28:59 They are all called on main thread. DCHECK has bee
89 << request_id << ")"; 102 << request_id << ")";
90 103
91 requests_.push_back(Request(event_handler, request_id, next_ipc_id_)); 104 DCHECK(type == content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE ||
92 Send(new MediaStreamHostMsg_EnumerateDevices(routing_id(), 105 type == content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE);
93 next_ipc_id_++, 106
94 type, 107 EnumerationState* state =
95 security_origin)); 108 (type == content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE ?
109 &audio_enumeration_state_ : &video_enumeration_state_);
110 state->requests.push_back(
111 EnumerationRequest(event_handler, request_id));
112
113 if (state->cache_valid) {
114 event_handler->OnDevicesEnumerated(request_id, state->cached_device);
115 } else if (!state->started) {
116 state->started = true;
117 Send(new MediaStreamHostMsg_EnumerateDevices(routing_id(),
118 next_ipc_id_,
119 type,
120 security_origin));
121 state->ipc_id = next_ipc_id_++;
122 }
123 }
124
125 void MediaStreamDispatcher::StopEnumerateDevices(
126 int request_id,
127 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler) {
128 DVLOG(1) << "MediaStreamDispatcher::StopEnumerateDevices("
129 << request_id << ")";
130
131 // Just need remove the request from one type.
132 RemoveEnumerationRequest(request_id, event_handler,
133 &audio_enumeration_state_) ||
134 RemoveEnumerationRequest(request_id, event_handler,
135 &video_enumeration_state_);
136 }
137
138 bool MediaStreamDispatcher::RemoveEnumerationRequest(
139 int request_id,
140 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler,
141 EnumerationState* state) {
142 EnumerationRequestList* requests = &state->requests;
143 for (EnumerationRequestList::iterator it = requests->begin();
144 it != requests->end(); ++it) {
145 if (it->request_id == request_id && it->handler == event_handler) {
146 requests->erase(it);
147 if (requests->empty() && !state->label.empty()) {
148 // No more request and has a label, try to stop the label
149 // and invalidate the state.
150 Send(new MediaStreamHostMsg_StopGeneratedStream(
151 routing_id(), state->label));
152 state->started = false;
153 state->cache_valid = false;
154 }
155 return true;
156 }
157 }
158 return false;
96 } 159 }
97 160
98 void MediaStreamDispatcher::OpenDevice( 161 void MediaStreamDispatcher::OpenDevice(
99 int request_id, 162 int request_id,
100 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, 163 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler,
101 const std::string& device_id, 164 const std::string& device_id,
102 media_stream::MediaStreamType type, 165 media_stream::MediaStreamType type,
103 const GURL& security_origin) { 166 const GURL& security_origin) {
104 DVLOG(1) << "MediaStreamDispatcher::OpenDevice(" << request_id << ")"; 167 DVLOG(1) << "MediaStreamDispatcher::OpenDevice(" << request_id << ")";
105 168
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 DCHECK_GT(it->second.audio_array.size(), static_cast<size_t>(index)); 273 DCHECK_GT(it->second.audio_array.size(), static_cast<size_t>(index));
211 media_stream::StreamDeviceInfoArray::iterator device_it = 274 media_stream::StreamDeviceInfoArray::iterator device_it =
212 it->second.audio_array.begin(); 275 it->second.audio_array.begin();
213 it->second.audio_array.erase(device_it + index); 276 it->second.audio_array.erase(device_it + index);
214 if (it->second.handler) 277 if (it->second.handler)
215 it->second.handler->OnAudioDeviceFailed(label, index); 278 it->second.handler->OnAudioDeviceFailed(label, index);
216 } 279 }
217 280
218 void MediaStreamDispatcher::OnDevicesEnumerated( 281 void MediaStreamDispatcher::OnDevicesEnumerated(
219 int request_id, 282 int request_id,
283 const std::string& label,
220 const media_stream::StreamDeviceInfoArray& device_array) { 284 const media_stream::StreamDeviceInfoArray& device_array) {
285 EnumerationState* state;
286 if (audio_enumeration_state_.started &&
287 request_id == audio_enumeration_state_.ipc_id) {
288 state = &audio_enumeration_state_;
289 } else if (video_enumeration_state_.started &&
290 request_id == video_enumeration_state_.ipc_id) {
291 state = &video_enumeration_state_;
292 } else {
293 return;
294 }
221 295
222 for (RequestList::iterator it = requests_.begin(); 296 state->label = label;
223 it != requests_.end(); ++it) { 297 state->cache_valid = true;
224 Request& request = *it; 298 state->cached_device = device_array;
225 if (request.ipc_request == request_id) { 299
226 if (request.handler) { 300 for (EnumerationRequestList::iterator it = state->requests.begin();
227 request.handler->OnDevicesEnumerated(request.request_id, device_array); 301 it != state->requests.end(); ++it) {
228 DVLOG(1) << "MediaStreamDispatcher::OnDevicesEnumerated(" 302 if (it->handler) {
229 << request.request_id << ")"; 303 it->handler->OnDevicesEnumerated(it->request_id, device_array);
230 } 304 DVLOG(1) << "MediaStreamDispatcher::OnDevicesEnumerated("
231 requests_.erase(it); 305 << it->request_id << ")";
232 break;
233 } 306 }
234 } 307 }
235 } 308 }
236 309
237 void MediaStreamDispatcher::OnDevicesEnumerationFailed(int request_id) { 310 void MediaStreamDispatcher::OnDevicesEnumerationFailed(int request_id) {
238 for (RequestList::iterator it = requests_.begin(); 311 for (RequestList::iterator it = requests_.begin();
239 it != requests_.end(); ++it) { 312 it != requests_.end(); ++it) {
240 Request& request = *it; 313 Request& request = *it;
241 if (request.ipc_request == request_id) { 314 if (request.ipc_request == request_id) {
242 if (request.handler) { 315 if (request.handler) {
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 384
312 int MediaStreamDispatcher::video_session_id(const std::string& label, 385 int MediaStreamDispatcher::video_session_id(const std::string& label,
313 int index) { 386 int index) {
314 LabelStreamMap::iterator it = label_stream_map_.find(label); 387 LabelStreamMap::iterator it = label_stream_map_.find(label);
315 if (it == label_stream_map_.end()) 388 if (it == label_stream_map_.end())
316 return media_stream::StreamDeviceInfo::kNoId; 389 return media_stream::StreamDeviceInfo::kNoId;
317 390
318 DCHECK_GT(it->second.video_array.size(), static_cast<size_t>(index)); 391 DCHECK_GT(it->second.video_array.size(), static_cast<size_t>(index));
319 return it->second.video_array[index].session_id; 392 return it->second.video_array[index].session_id;
320 } 393 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698