Chromium Code Reviews| 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/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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } |
| OLD | NEW |