OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/midi_message_filter.h" | 5 #include "content/renderer/media/midi_message_filter.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
11 #include "base/strings/utf_string_conversions.h" | 11 #include "base/strings/utf_string_conversions.h" |
12 #include "base/trace_event/trace_event.h" | 12 #include "base/trace_event/trace_event.h" |
13 #include "content/common/media/midi_messages.h" | 13 #include "content/common/media/midi_messages.h" |
14 #include "content/renderer/render_thread_impl.h" | 14 #include "content/renderer/render_thread_impl.h" |
15 #include "ipc/ipc_logging.h" | 15 #include "ipc/ipc_logging.h" |
16 | 16 |
17 using base::AutoLock; | 17 using base::AutoLock; |
| 18 using midi::mojom::PortState; |
18 using midi::mojom::Result; | 19 using midi::mojom::Result; |
19 | 20 |
20 // The maximum number of bytes which we're allowed to send to the browser | 21 // The maximum number of bytes which we're allowed to send to the browser |
21 // before getting acknowledgement back from the browser that they've been | 22 // before getting acknowledgement back from the browser that they've been |
22 // successfully sent. | 23 // successfully sent. |
23 static const size_t kMaxUnacknowledgedBytesSent = 10 * 1024 * 1024; // 10 MB. | 24 static const size_t kMaxUnacknowledgedBytesSent = 10 * 1024 * 1024; // 10 MB. |
24 | 25 |
25 namespace content { | 26 namespace content { |
26 | 27 |
27 MidiMessageFilter::MidiMessageFilter( | 28 MidiMessageFilter::MidiMessageFilter( |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 base::Bind(&MidiMessageFilter::HandleAddInputPort, this, info)); | 159 base::Bind(&MidiMessageFilter::HandleAddInputPort, this, info)); |
159 } | 160 } |
160 | 161 |
161 void MidiMessageFilter::OnAddOutputPort(midi::MidiPortInfo info) { | 162 void MidiMessageFilter::OnAddOutputPort(midi::MidiPortInfo info) { |
162 DCHECK(io_task_runner_->BelongsToCurrentThread()); | 163 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
163 main_task_runner_->PostTask( | 164 main_task_runner_->PostTask( |
164 FROM_HERE, | 165 FROM_HERE, |
165 base::Bind(&MidiMessageFilter::HandleAddOutputPort, this, info)); | 166 base::Bind(&MidiMessageFilter::HandleAddOutputPort, this, info)); |
166 } | 167 } |
167 | 168 |
168 void MidiMessageFilter::OnSetInputPortState(uint32_t port, | 169 void MidiMessageFilter::OnSetInputPortState(uint32_t port, PortState state) { |
169 midi::MidiPortState state) { | |
170 DCHECK(io_task_runner_->BelongsToCurrentThread()); | 170 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
171 main_task_runner_->PostTask( | 171 main_task_runner_->PostTask( |
172 FROM_HERE, base::Bind(&MidiMessageFilter::HandleSetInputPortState, this, | 172 FROM_HERE, base::Bind(&MidiMessageFilter::HandleSetInputPortState, this, |
173 port, state)); | 173 port, state)); |
174 } | 174 } |
175 | 175 |
176 void MidiMessageFilter::OnSetOutputPortState(uint32_t port, | 176 void MidiMessageFilter::OnSetOutputPortState(uint32_t port, PortState state) { |
177 midi::MidiPortState state) { | |
178 DCHECK(io_task_runner_->BelongsToCurrentThread()); | 177 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
179 main_task_runner_->PostTask( | 178 main_task_runner_->PostTask( |
180 FROM_HERE, base::Bind(&MidiMessageFilter::HandleSetOutputPortState, this, | 179 FROM_HERE, base::Bind(&MidiMessageFilter::HandleSetOutputPortState, this, |
181 port, state)); | 180 port, state)); |
182 } | 181 } |
183 | 182 |
184 void MidiMessageFilter::OnDataReceived(uint32_t port, | 183 void MidiMessageFilter::OnDataReceived(uint32_t port, |
185 const std::vector<uint8_t>& data, | 184 const std::vector<uint8_t>& data, |
186 double timestamp) { | 185 double timestamp) { |
187 TRACE_EVENT0("midi", "MidiMessageFilter::OnDataReceived"); | 186 TRACE_EVENT0("midi", "MidiMessageFilter::OnDataReceived"); |
(...skipping 17 matching lines...) Expand all Loading... |
205 session_result_ = result; | 204 session_result_ = result; |
206 | 205 |
207 // A for-loop using iterators does not work because |client| may touch | 206 // A for-loop using iterators does not work because |client| may touch |
208 // |clients_waiting_session_queue_| in callbacks. | 207 // |clients_waiting_session_queue_| in callbacks. |
209 while (!clients_waiting_session_queue_.empty()) { | 208 while (!clients_waiting_session_queue_.empty()) { |
210 auto* client = clients_waiting_session_queue_.back(); | 209 auto* client = clients_waiting_session_queue_.back(); |
211 clients_waiting_session_queue_.pop_back(); | 210 clients_waiting_session_queue_.pop_back(); |
212 if (result == Result::OK) { | 211 if (result == Result::OK) { |
213 // Add the client's input and output ports. | 212 // Add the client's input and output ports. |
214 for (const auto& info : inputs_) { | 213 for (const auto& info : inputs_) { |
215 client->didAddInputPort( | 214 client->didAddInputPort(base::UTF8ToUTF16(info.id), |
216 base::UTF8ToUTF16(info.id), | 215 base::UTF8ToUTF16(info.manufacturer), |
217 base::UTF8ToUTF16(info.manufacturer), | 216 base::UTF8ToUTF16(info.name), |
218 base::UTF8ToUTF16(info.name), | 217 base::UTF8ToUTF16(info.version), |
219 base::UTF8ToUTF16(info.version), | 218 ToBlinkState(info.state)); |
220 ToBlinkState(info.state)); | |
221 } | 219 } |
222 | 220 |
223 for (const auto& info : outputs_) { | 221 for (const auto& info : outputs_) { |
224 client->didAddOutputPort( | 222 client->didAddOutputPort(base::UTF8ToUTF16(info.id), |
225 base::UTF8ToUTF16(info.id), | 223 base::UTF8ToUTF16(info.manufacturer), |
226 base::UTF8ToUTF16(info.manufacturer), | 224 base::UTF8ToUTF16(info.name), |
227 base::UTF8ToUTF16(info.name), | 225 base::UTF8ToUTF16(info.version), |
228 base::UTF8ToUTF16(info.version), | 226 ToBlinkState(info.state)); |
229 ToBlinkState(info.state)); | |
230 } | 227 } |
231 } | 228 } |
232 client->didStartSession(result); | 229 client->didStartSession(result); |
233 clients_.insert(client); | 230 clients_.insert(client); |
234 } | 231 } |
235 } | 232 } |
236 | 233 |
237 void MidiMessageFilter::HandleAddInputPort(midi::MidiPortInfo info) { | 234 void MidiMessageFilter::HandleAddInputPort(midi::MidiPortInfo info) { |
238 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 235 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
239 inputs_.push_back(info); | 236 inputs_.push_back(info); |
240 const base::string16 id = base::UTF8ToUTF16(info.id); | 237 const base::string16 id = base::UTF8ToUTF16(info.id); |
241 const base::string16 manufacturer = base::UTF8ToUTF16(info.manufacturer); | 238 const base::string16 manufacturer = base::UTF8ToUTF16(info.manufacturer); |
242 const base::string16 name = base::UTF8ToUTF16(info.name); | 239 const base::string16 name = base::UTF8ToUTF16(info.name); |
243 const base::string16 version = base::UTF8ToUTF16(info.version); | 240 const base::string16 version = base::UTF8ToUTF16(info.version); |
244 const blink::WebMIDIAccessorClient::MIDIPortState state = | 241 const PortState state = ToBlinkState(info.state); |
245 ToBlinkState(info.state); | |
246 for (auto* client : clients_) | 242 for (auto* client : clients_) |
247 client->didAddInputPort(id, manufacturer, name, version, state); | 243 client->didAddInputPort(id, manufacturer, name, version, state); |
248 } | 244 } |
249 | 245 |
250 void MidiMessageFilter::HandleAddOutputPort(midi::MidiPortInfo info) { | 246 void MidiMessageFilter::HandleAddOutputPort(midi::MidiPortInfo info) { |
251 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 247 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
252 outputs_.push_back(info); | 248 outputs_.push_back(info); |
253 const base::string16 id = base::UTF8ToUTF16(info.id); | 249 const base::string16 id = base::UTF8ToUTF16(info.id); |
254 const base::string16 manufacturer = base::UTF8ToUTF16(info.manufacturer); | 250 const base::string16 manufacturer = base::UTF8ToUTF16(info.manufacturer); |
255 const base::string16 name = base::UTF8ToUTF16(info.name); | 251 const base::string16 name = base::UTF8ToUTF16(info.name); |
256 const base::string16 version = base::UTF8ToUTF16(info.version); | 252 const base::string16 version = base::UTF8ToUTF16(info.version); |
257 const blink::WebMIDIAccessorClient::MIDIPortState state = | 253 const PortState state = ToBlinkState(info.state); |
258 ToBlinkState(info.state); | |
259 for (auto* client : clients_) | 254 for (auto* client : clients_) |
260 client->didAddOutputPort(id, manufacturer, name, version, state); | 255 client->didAddOutputPort(id, manufacturer, name, version, state); |
261 } | 256 } |
262 | 257 |
263 void MidiMessageFilter::HandleDataReceived(uint32_t port, | 258 void MidiMessageFilter::HandleDataReceived(uint32_t port, |
264 const std::vector<uint8_t>& data, | 259 const std::vector<uint8_t>& data, |
265 double timestamp) { | 260 double timestamp) { |
266 TRACE_EVENT0("midi", "MidiMessageFilter::HandleDataReceived"); | 261 TRACE_EVENT0("midi", "MidiMessageFilter::HandleDataReceived"); |
267 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 262 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
268 DCHECK(!data.empty()); | 263 DCHECK(!data.empty()); |
269 | 264 |
270 for (auto* client : clients_) | 265 for (auto* client : clients_) |
271 client->didReceiveMIDIData(port, &data[0], data.size(), timestamp); | 266 client->didReceiveMIDIData(port, &data[0], data.size(), timestamp); |
272 } | 267 } |
273 | 268 |
274 void MidiMessageFilter::HandleAckknowledgeSentData(size_t bytes_sent) { | 269 void MidiMessageFilter::HandleAckknowledgeSentData(size_t bytes_sent) { |
275 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 270 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
276 DCHECK_GE(unacknowledged_bytes_sent_, bytes_sent); | 271 DCHECK_GE(unacknowledged_bytes_sent_, bytes_sent); |
277 if (unacknowledged_bytes_sent_ >= bytes_sent) | 272 if (unacknowledged_bytes_sent_ >= bytes_sent) |
278 unacknowledged_bytes_sent_ -= bytes_sent; | 273 unacknowledged_bytes_sent_ -= bytes_sent; |
279 } | 274 } |
280 | 275 |
281 void MidiMessageFilter::HandleSetInputPortState( | 276 void MidiMessageFilter::HandleSetInputPortState(uint32_t port, |
282 uint32_t port, | 277 PortState state) { |
283 midi::MidiPortState state) { | |
284 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 278 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
285 inputs_[port].state = state; | 279 inputs_[port].state = state; |
286 for (auto* client : clients_) | 280 for (auto* client : clients_) |
287 client->didSetInputPortState(port, ToBlinkState(state)); | 281 client->didSetInputPortState(port, ToBlinkState(state)); |
288 } | 282 } |
289 | 283 |
290 void MidiMessageFilter::HandleSetOutputPortState( | 284 void MidiMessageFilter::HandleSetOutputPortState(uint32_t port, |
291 uint32_t port, | 285 PortState state) { |
292 midi::MidiPortState state) { | |
293 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 286 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
294 outputs_[port].state = state; | 287 outputs_[port].state = state; |
295 for (auto* client : clients_) | 288 for (auto* client : clients_) |
296 client->didSetOutputPortState(port, ToBlinkState(state)); | 289 client->didSetOutputPortState(port, ToBlinkState(state)); |
297 } | 290 } |
298 | 291 |
299 } // namespace content | 292 } // namespace content |
OLD | NEW |