OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "content/renderer/media/media_stream_dispatcher.h" | |
6 | |
7 #include "base/logging.h" | |
8 #include "content/common/media/media_stream_messages.h" | |
9 #include "content/renderer/media/media_stream_dispatcher_eventhandler.h" | |
10 | |
11 MediaStreamDispatcherEventHandler::~MediaStreamDispatcherEventHandler() {} | |
12 | |
13 MediaStreamDispatcher::MediaStreamDispatcher(RenderView* render_view) | |
14 : RenderViewObserver(render_view), | |
15 next_ipc_id_(0), | |
16 message_loop_(MessageLoop::current()) { | |
17 } | |
18 | |
19 MediaStreamDispatcher::~MediaStreamDispatcher() {} | |
20 | |
21 void MediaStreamDispatcher::GenerateStream( | |
22 int request_id, | |
23 MediaStreamDispatcherEventHandler* event_handler, | |
24 media_stream::StreamOptions components, | |
25 const std::string& security_origin) { | |
26 DCHECK_EQ(MessageLoop::current(), message_loop_); | |
27 VLOG(1) << "MediaStreamDispatcher::GenerateStream(" << request_id << ")"; | |
28 | |
29 requests_.push_back(Request(event_handler, request_id, next_ipc_id_)); | |
30 Send(new MediaStreamHostMsg_GenerateStream(routing_id(), | |
31 next_ipc_id_++, | |
32 components, | |
33 security_origin)); | |
34 } | |
35 | |
36 void MediaStreamDispatcher::StopStream(const std::string& label) { | |
37 DCHECK_EQ(MessageLoop::current(), message_loop_); | |
38 VLOG(1) << "MediaStreamDispatcher::StopStream" | |
39 << ", {label = " << label << "}"; | |
40 | |
41 LabelStreamMap::iterator it = label_stream_map_.find(label); | |
42 if (it == label_stream_map_.end()) | |
43 return; | |
44 | |
45 Send(new MediaStreamHostMsg_StopGeneratedStream(routing_id(), label)); | |
46 label_stream_map_.erase(it); | |
47 } | |
48 | |
49 bool MediaStreamDispatcher::OnMessageReceived(const IPC::Message& message) { | |
50 bool handled = true; | |
51 IPC_BEGIN_MESSAGE_MAP(MediaStreamDispatcher, message) | |
52 IPC_MESSAGE_HANDLER(MediaStreamMsg_StreamGenerated, | |
53 OnStreamGenerated) | |
54 IPC_MESSAGE_HANDLER(MediaStreamMsg_StreamGenerationFailed, | |
55 OnStreamGenerationFailed) | |
56 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_VideoDeviceFailed, | |
57 OnVideoDeviceFailed) | |
58 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_AudioDeviceFailed, | |
59 OnAudioDeviceFailed) | |
60 IPC_MESSAGE_UNHANDLED(handled = false) | |
61 IPC_END_MESSAGE_MAP() | |
62 return handled; | |
63 } | |
64 | |
65 void MediaStreamDispatcher::OnStreamGenerated( | |
66 int request_id, | |
67 const std::string& label, | |
68 const media_stream::StreamDeviceInfoArray& audio_array, | |
69 const media_stream::StreamDeviceInfoArray& video_array) { | |
70 | |
71 for (RequestList::iterator it = requests_.begin(); | |
72 it != requests_.end(); ++it) { | |
73 Request& request = *it; | |
74 if (request.ipc_request == request_id) { | |
75 Stream new_stream; | |
76 new_stream.handler = request.handler; | |
77 new_stream.audio_array = audio_array; | |
78 new_stream.video_array = video_array; | |
79 label_stream_map_[label] = new_stream; | |
80 request.handler->OnStreamGenerated(request.request_id, label, | |
81 audio_array, video_array); | |
82 VLOG(1) << "MediaStreamDispatcher::OnStreamGenerated(" | |
83 << request.request_id << ", " << label << ")"; | |
84 requests_.erase(it); | |
85 break; | |
86 } | |
87 } | |
88 } | |
89 | |
90 void MediaStreamDispatcher::OnStreamGenerationFailed(int request_id) { | |
91 for (RequestList::iterator it = requests_.begin(); | |
92 it != requests_.end(); ++it) { | |
93 Request& request = *it; | |
94 if (request.ipc_request == request_id) { | |
95 request.handler->OnStreamGenerationFailed(request.request_id); | |
96 VLOG(1) << "MediaStreamDispatcher::OnStreamGenerationFailed(" | |
97 << request.request_id << ")\n"; | |
98 requests_.erase(it); | |
99 break; | |
100 } | |
101 } | |
102 } | |
103 | |
104 void MediaStreamDispatcher::OnVideoDeviceFailed(const std::string& label, | |
105 int index) { | |
106 LabelStreamMap::iterator it = label_stream_map_.find(label); | |
107 if (it == label_stream_map_.end()) | |
108 return; | |
109 | |
110 // index is the index in the video_array that have failed. | |
Leandro Graciá Gil
2011/06/21 18:24:22
Nit: has failed. Repeated more times in this file.
Per K
2011/06/22 08:11:57
Done.
| |
111 DCHECK_GT(it->second.video_array.size(), static_cast<size_t>(index)); | |
Leandro Graciá Gil
2011/06/21 18:24:22
Is index 0-based or 1-based? Should this and simil
| |
112 media_stream::StreamDeviceInfoArray::iterator device_it = | |
113 it->second.video_array.begin(); | |
114 it->second.video_array.erase(device_it + index); | |
115 it->second.handler->OnVideoDeviceFailed(label, index); | |
116 } | |
117 | |
118 void MediaStreamDispatcher::OnAudioDeviceFailed(const std::string& label, | |
119 int index) { | |
120 LabelStreamMap::iterator it = label_stream_map_.find(label); | |
121 if (it == label_stream_map_.end()) | |
122 return; | |
123 | |
124 // index is the index in the audio_array that have failed. | |
125 DCHECK_GT(it->second.audio_array.size(), static_cast<size_t>(index)); | |
126 media_stream::StreamDeviceInfoArray::iterator device_it = | |
127 it->second.audio_array.begin(); | |
128 it->second.audio_array.erase(device_it + index); | |
129 it->second.handler->OnAudioDeviceFailed(label, index); | |
130 } | |
131 | |
132 int MediaStreamDispatcher::audio_session_id(const std::string& label, | |
133 int index) { | |
134 LabelStreamMap::iterator it = label_stream_map_.find(label); | |
135 if (it == label_stream_map_.end()) | |
136 return media_stream::StreamDeviceInfo::kNoId; | |
137 | |
138 DCHECK_GT(it->second.audio_array.size(), static_cast<size_t>(index)); | |
139 return it->second.audio_array[index].session_id; | |
140 } | |
141 | |
142 bool MediaStreamDispatcher::IsStream(const std::string& label) { | |
143 return label_stream_map_.find(label) != label_stream_map_.end(); | |
144 } | |
145 | |
146 int MediaStreamDispatcher::video_session_id(const std::string& label, | |
147 int index) { | |
148 LabelStreamMap::iterator it = label_stream_map_.find(label); | |
149 if (it == label_stream_map_.end()) | |
150 return media_stream::StreamDeviceInfo::kNoId; | |
151 | |
152 DCHECK_GT(it->second.video_array.size(), static_cast<size_t>(index)); | |
153 return it->second.video_array[index].session_id; | |
154 } | |
OLD | NEW |