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

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

Issue 18420011: Support cancellation of request for opening device. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: add IsThisRequest method and some comments Created 7 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" 8 #include "base/message_loop/message_loop_proxy.h"
9 #include "content/common/media/media_stream_messages.h" 9 #include "content/common/media/media_stream_messages.h"
10 #include "content/renderer/media/media_stream_dispatcher_eventhandler.h" 10 #include "content/renderer/media/media_stream_dispatcher_eventhandler.h"
11 #include "content/renderer/render_thread_impl.h" 11 #include "content/renderer/render_thread_impl.h"
12 #include "content/renderer/render_view_impl.h" 12 #include "content/renderer/render_view_impl.h"
13 #include "googleurl/src/gurl.h" 13 #include "googleurl/src/gurl.h"
14 14
15 namespace content { 15 namespace content {
16 16
17 // A request is identified by pair (request_id, handler), or ipc_request.
18 // There could be multiple clients making requests and each has its own
19 // request_id sequence.
20 // The ipc_request is garanteed to be unique when it's created in
21 // MediaStreamDispatcher.
17 struct MediaStreamDispatcher::Request { 22 struct MediaStreamDispatcher::Request {
18 Request(const base::WeakPtr<MediaStreamDispatcherEventHandler>& handler, 23 Request(const base::WeakPtr<MediaStreamDispatcherEventHandler>& handler,
19 int request_id, 24 int request_id,
20 int ipc_request) 25 int ipc_request)
21 : handler(handler), 26 : handler(handler),
22 request_id(request_id), 27 request_id(request_id),
23 ipc_request(ipc_request) { 28 ipc_request(ipc_request) {
24 } 29 }
30 bool IsThisRequest(
31 int request_id1,
32 const base::WeakPtr<MediaStreamDispatcherEventHandler>& handler1) {
33 return (request_id1 == request_id && handler1.get() == handler.get());
34 }
25 base::WeakPtr<MediaStreamDispatcherEventHandler> handler; 35 base::WeakPtr<MediaStreamDispatcherEventHandler> handler;
26 int request_id; 36 int request_id;
27 int ipc_request; 37 int ipc_request;
28 }; 38 };
29 39
30 struct MediaStreamDispatcher::Stream { 40 struct MediaStreamDispatcher::Stream {
31 Stream() {} 41 Stream() {}
32 ~Stream() {} 42 ~Stream() {}
33 base::WeakPtr<MediaStreamDispatcherEventHandler> handler; 43 base::WeakPtr<MediaStreamDispatcherEventHandler> handler;
34 StreamDeviceInfoArray audio_array; 44 StreamDeviceInfoArray audio_array;
35 StreamDeviceInfoArray video_array; 45 StreamDeviceInfoArray video_array;
36 }; 46 };
37 47
38 MediaStreamDispatcher::EnumerationRequest::EnumerationRequest( 48 MediaStreamDispatcher::EnumerationRequest::EnumerationRequest(
39 const base::WeakPtr<MediaStreamDispatcherEventHandler>& handler, 49 const base::WeakPtr<MediaStreamDispatcherEventHandler>& handler,
40 int request_id) 50 int request_id)
41 : handler(handler), 51 : handler(handler),
42 request_id(request_id) { 52 request_id(request_id) {
43 } 53 }
44 54
45 MediaStreamDispatcher::EnumerationRequest::~EnumerationRequest() {} 55 MediaStreamDispatcher::EnumerationRequest::~EnumerationRequest() {}
46 56
57 bool MediaStreamDispatcher::EnumerationRequest::IsThisRequest(
58 int request_id1,
59 const base::WeakPtr<MediaStreamDispatcherEventHandler>& handler1) {
60 return (request_id1 == request_id && handler1.get() == handler.get());
61 }
62
47 MediaStreamDispatcher::EnumerationState::EnumerationState() 63 MediaStreamDispatcher::EnumerationState::EnumerationState()
48 : ipc_id(-1) { 64 : ipc_id(-1) {
49 } 65 }
50 66
51 MediaStreamDispatcher::EnumerationState::~EnumerationState() {} 67 MediaStreamDispatcher::EnumerationState::~EnumerationState() {}
52 68
53 struct MediaStreamDispatcher::EnumerationState::CachedDevices { 69 struct MediaStreamDispatcher::EnumerationState::CachedDevices {
54 CachedDevices(const std::string& label, 70 CachedDevices(const std::string& label,
55 const StreamDeviceInfoArray& device_array) 71 const StreamDeviceInfoArray& device_array)
56 : label(label), 72 : label(label),
(...skipping 21 matching lines...) Expand all
78 DCHECK(main_loop_->BelongsToCurrentThread()); 94 DCHECK(main_loop_->BelongsToCurrentThread());
79 DVLOG(1) << "MediaStreamDispatcher::GenerateStream(" << request_id << ")"; 95 DVLOG(1) << "MediaStreamDispatcher::GenerateStream(" << request_id << ")";
80 96
81 requests_.push_back(Request(event_handler, request_id, next_ipc_id_)); 97 requests_.push_back(Request(event_handler, request_id, next_ipc_id_));
82 Send(new MediaStreamHostMsg_GenerateStream(routing_id(), 98 Send(new MediaStreamHostMsg_GenerateStream(routing_id(),
83 next_ipc_id_++, 99 next_ipc_id_++,
84 components, 100 components,
85 security_origin)); 101 security_origin));
86 } 102 }
87 103
88 void MediaStreamDispatcher::CancelGenerateStream(int request_id) { 104 void MediaStreamDispatcher::CancelGenerateStream(
105 int request_id,
106 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler) {
89 DCHECK(main_loop_->BelongsToCurrentThread()); 107 DCHECK(main_loop_->BelongsToCurrentThread());
90 DVLOG(1) << "MediaStreamDispatcher::CancelGenerateStream" 108 DVLOG(1) << "MediaStreamDispatcher::CancelGenerateStream"
91 << ", {request_id = " << request_id << "}"; 109 << ", {request_id = " << request_id << "}";
92 110
93 RequestList::iterator it = requests_.begin(); 111 RequestList::iterator it = requests_.begin();
94 for (; it != requests_.end(); ++it) { 112 for (; it != requests_.end(); ++it) {
95 Request& request = *it; 113 if (it->IsThisRequest(request_id, event_handler)) {
96 if (request.request_id == request_id) { 114 int ipc_request = it->ipc_request;
97 requests_.erase(it); 115 requests_.erase(it);
98 Send(new MediaStreamHostMsg_CancelGenerateStream(routing_id(), 116 Send(new MediaStreamHostMsg_CancelGenerateStream(routing_id(),
99 request_id)); 117 ipc_request));
100 break; 118 break;
101 } 119 }
102 } 120 }
103 } 121 }
104 122
105 void MediaStreamDispatcher::StopStream(const std::string& label) { 123 void MediaStreamDispatcher::StopStream(const std::string& label) {
106 DCHECK(main_loop_->BelongsToCurrentThread()); 124 DCHECK(main_loop_->BelongsToCurrentThread());
107 DVLOG(1) << "MediaStreamDispatcher::StopStream" 125 DVLOG(1) << "MediaStreamDispatcher::StopStream"
108 << ", {label = " << label << "}"; 126 << ", {label = " << label << "}";
109 127
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 request_id, event_handler, &video_enumeration_state_); 175 request_id, event_handler, &video_enumeration_state_);
158 } 176 }
159 177
160 void MediaStreamDispatcher::RemoveEnumerationRequest( 178 void MediaStreamDispatcher::RemoveEnumerationRequest(
161 int request_id, 179 int request_id,
162 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, 180 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler,
163 EnumerationState* state) { 181 EnumerationState* state) {
164 EnumerationRequestList* requests = &state->requests; 182 EnumerationRequestList* requests = &state->requests;
165 for (EnumerationRequestList::iterator it = requests->begin(); 183 for (EnumerationRequestList::iterator it = requests->begin();
166 it != requests->end(); ++it) { 184 it != requests->end(); ++it) {
167 if (it->request_id == request_id && 185 if (it->IsThisRequest(request_id, event_handler)) {
168 it->handler.get() == event_handler.get()) {
169 requests->erase(it); 186 requests->erase(it);
170 if (requests->empty() && state->cached_devices) { 187 if (requests->empty() && state->cached_devices) {
171 // No more request and has a label, try to stop the label 188 // No more request and has a label, try to stop the label
172 // and invalidate the state. 189 // and invalidate the state.
173 Send(new MediaStreamHostMsg_StopGeneratedStream( 190 Send(new MediaStreamHostMsg_StopGeneratedStream(
174 routing_id(), state->cached_devices->label)); 191 routing_id(), state->cached_devices->label));
175 state->ipc_id = -1; 192 state->ipc_id = -1;
176 state->cached_devices.reset(); 193 state->cached_devices.reset();
177 } 194 }
178 return; 195 return;
(...skipping 11 matching lines...) Expand all
190 DVLOG(1) << "MediaStreamDispatcher::OpenDevice(" << request_id << ")"; 207 DVLOG(1) << "MediaStreamDispatcher::OpenDevice(" << request_id << ")";
191 208
192 requests_.push_back(Request(event_handler, request_id, next_ipc_id_)); 209 requests_.push_back(Request(event_handler, request_id, next_ipc_id_));
193 Send(new MediaStreamHostMsg_OpenDevice(routing_id(), 210 Send(new MediaStreamHostMsg_OpenDevice(routing_id(),
194 next_ipc_id_++, 211 next_ipc_id_++,
195 device_id, 212 device_id,
196 type, 213 type,
197 security_origin)); 214 security_origin));
198 } 215 }
199 216
217 void MediaStreamDispatcher::CancelOpenDevice(
218 int request_id,
219 const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler) {
220 CancelGenerateStream(request_id, event_handler);
221 }
222
200 void MediaStreamDispatcher::CloseDevice(const std::string& label) { 223 void MediaStreamDispatcher::CloseDevice(const std::string& label) {
201 DCHECK(main_loop_->BelongsToCurrentThread()); 224 DCHECK(main_loop_->BelongsToCurrentThread());
202 DVLOG(1) << "MediaStreamDispatcher::CloseDevice" 225 DVLOG(1) << "MediaStreamDispatcher::CloseDevice"
203 << ", {label = " << label << "}"; 226 << ", {label = " << label << "}";
204 227
205 StopStream(label); 228 StopStream(label);
206 } 229 }
207 230
208 bool MediaStreamDispatcher::Send(IPC::Message* message) { 231 bool MediaStreamDispatcher::Send(IPC::Message* message) {
209 if (!RenderThread::Get()) { 232 if (!RenderThread::Get()) {
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 int index) { 419 int index) {
397 LabelStreamMap::iterator it = label_stream_map_.find(label); 420 LabelStreamMap::iterator it = label_stream_map_.find(label);
398 if (it == label_stream_map_.end()) 421 if (it == label_stream_map_.end())
399 return StreamDeviceInfo::kNoId; 422 return StreamDeviceInfo::kNoId;
400 423
401 DCHECK_GT(it->second.video_array.size(), static_cast<size_t>(index)); 424 DCHECK_GT(it->second.video_array.size(), static_cast<size_t>(index));
402 return it->second.video_array[index].session_id; 425 return it->second.video_array[index].session_id;
403 } 426 }
404 427
405 } // namespace content 428 } // 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