Chromium Code Reviews| Index: content/browser/renderer_host/media/midi_host.cc |
| diff --git a/content/browser/renderer_host/media/midi_host.cc b/content/browser/renderer_host/media/midi_host.cc |
| index 934d5a21f1839fa97a5740fc60d28bba1936a05a..26942504f223aff1f118f77d16452ccfc2544768 100644 |
| --- a/content/browser/renderer_host/media/midi_host.cc |
| +++ b/content/browser/renderer_host/media/midi_host.cc |
| @@ -16,6 +16,7 @@ |
| #include "content/public/browser/media_observer.h" |
| #include "content/public/browser/user_metrics.h" |
| #include "media/midi/midi_manager.h" |
| +#include "media/midi/midi_message_queue.h" |
| using media::MIDIManager; |
| using media::MIDIPortInfoList; |
| @@ -75,6 +76,8 @@ void MIDIHost::OnStartSession(int client_id) { |
| if (success) { |
| input_ports = midi_manager_->input_ports(); |
| output_ports = midi_manager_->output_ports(); |
| + received_messages_queues_.clear(); |
| + received_messages_queues_.resize(input_ports.size()); |
| } |
| } |
| @@ -130,20 +133,41 @@ void MIDIHost::ReceiveMIDIData( |
| double timestamp) { |
| TRACE_EVENT0("midi", "MIDIHost::ReceiveMIDIData"); |
| - // Check a process security policy to receive a system exclusive message. |
| - if (length > 0 && data[0] >= kSysExMessage) { |
| - if (!ChildProcessSecurityPolicyImpl::GetInstance()->CanSendMIDISysExMessage( |
| - renderer_process_id_)) { |
| - // MIDI devices may send a system exclusive messages even if the renderer |
| - // doesn't have a permission to receive it. Don't kill the renderer as |
| - // OnSendData() does. |
| - return; |
| + if (received_messages_queues_.size() <= port) |
| + return; |
| + |
| + // Lazy initialization |
| + if (received_messages_queues_[port] == NULL) |
| + received_messages_queues_[port] = new media::MIDIMessageQueue(true); |
| + |
| + bool sys_ex_allowed = false; |
| + bool sys_ex_allowed_initialized = false; |
| + |
| + received_messages_queues_[port]->Add(data, length); |
| + std::vector<uint8> message; |
| + while (true) { |
| + received_messages_queues_[port]->Get(&message); |
| + if (message.empty()) |
| + break; |
| + |
| + // MIDI devices may send a system exclusive messages even if the renderer |
| + // doesn't have a permission to receive it. Don't kill the renderer as |
| + // OnSendData() does. |
| + if (message[0] == kSysExMessage) { |
|
yukawa
2013/11/14 14:55:31
This condition is slightly different from the prev
Takashi Toyoshima
2013/11/19 01:08:37
I chatted this with Chris, and double checked that
|
| + // Lazily check if SysEx is allowed or not in case checking this is |
| + // costly. |
| + if (!sys_ex_allowed_initialized) { |
| + sys_ex_allowed = ChildProcessSecurityPolicyImpl::GetInstance()-> |
| + CanSendMIDISysExMessage(renderer_process_id_); |
| + sys_ex_allowed_initialized = true; |
| + } |
| + if (!sys_ex_allowed) |
| + continue; |
| } |
| - } |
| - // Send to the renderer. |
| - std::vector<uint8> v(data, data + length); |
| - Send(new MIDIMsg_DataReceived(port, v, timestamp)); |
| + // Send to the renderer. |
| + Send(new MIDIMsg_DataReceived(port, message, timestamp)); |
| + } |
| } |
| void MIDIHost::AccumulateMIDIBytesSent(size_t n) { |