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

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

Issue 664843002: Web MIDI: distributes MIDIPort information asynchronously (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@lifecycle
Patch Set: typo on ipc Created 6 years, 2 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
« no previous file with comments | « content/renderer/media/midi_message_filter.h ('k') | media/midi/midi_manager.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 void MidiMessageFilter::RemoveClient(blink::WebMIDIAccessorClient* client) { 53 void MidiMessageFilter::RemoveClient(blink::WebMIDIAccessorClient* client) {
54 base::AutoLock auto_lock(lock_); 54 base::AutoLock auto_lock(lock_);
55 clients_.erase(client); 55 clients_.erase(client);
56 ClientsQueue::iterator it = std::find(clients_waiting_session_queue_.begin(), 56 ClientsQueue::iterator it = std::find(clients_waiting_session_queue_.begin(),
57 clients_waiting_session_queue_.end(), 57 clients_waiting_session_queue_.end(),
58 client); 58 client);
59 if (it != clients_waiting_session_queue_.end()) 59 if (it != clients_waiting_session_queue_.end())
60 clients_waiting_session_queue_.erase(it); 60 clients_waiting_session_queue_.erase(it);
61 if (clients_.empty() && clients_waiting_session_queue_.empty()) { 61 if (clients_.empty() && clients_waiting_session_queue_.empty()) {
62 session_result_ = media::MIDI_NOT_INITIALIZED; 62 session_result_ = media::MIDI_NOT_INITIALIZED;
63 inputs_.clear();
64 outputs_.clear();
63 io_message_loop_->PostTask(FROM_HERE, 65 io_message_loop_->PostTask(FROM_HERE,
64 base::Bind(&MidiMessageFilter::EndSessionOnIOThread, this)); 66 base::Bind(&MidiMessageFilter::EndSessionOnIOThread, this));
65 } 67 }
66 } 68 }
67 69
68 void MidiMessageFilter::SendMidiData(uint32 port, 70 void MidiMessageFilter::SendMidiData(uint32 port,
69 const uint8* data, 71 const uint8* data,
70 size_t length, 72 size_t length,
71 double timestamp) { 73 double timestamp) {
72 if (length > kMaxUnacknowledgedBytesSent) { 74 if (length > kMaxUnacknowledgedBytesSent) {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 } else { 120 } else {
119 sender_->Send(message); 121 sender_->Send(message);
120 } 122 }
121 } 123 }
122 124
123 bool MidiMessageFilter::OnMessageReceived(const IPC::Message& message) { 125 bool MidiMessageFilter::OnMessageReceived(const IPC::Message& message) {
124 DCHECK(io_message_loop_->BelongsToCurrentThread()); 126 DCHECK(io_message_loop_->BelongsToCurrentThread());
125 bool handled = true; 127 bool handled = true;
126 IPC_BEGIN_MESSAGE_MAP(MidiMessageFilter, message) 128 IPC_BEGIN_MESSAGE_MAP(MidiMessageFilter, message)
127 IPC_MESSAGE_HANDLER(MidiMsg_SessionStarted, OnSessionStarted) 129 IPC_MESSAGE_HANDLER(MidiMsg_SessionStarted, OnSessionStarted)
130 IPC_MESSAGE_HANDLER(MidiMsg_AddInputPort, OnAddInputPort)
131 IPC_MESSAGE_HANDLER(MidiMsg_AddOutputPort, OnAddOutputPort)
128 IPC_MESSAGE_HANDLER(MidiMsg_DataReceived, OnDataReceived) 132 IPC_MESSAGE_HANDLER(MidiMsg_DataReceived, OnDataReceived)
129 IPC_MESSAGE_HANDLER(MidiMsg_AcknowledgeSentData, OnAcknowledgeSentData) 133 IPC_MESSAGE_HANDLER(MidiMsg_AcknowledgeSentData, OnAcknowledgeSentData)
130 IPC_MESSAGE_UNHANDLED(handled = false) 134 IPC_MESSAGE_UNHANDLED(handled = false)
131 IPC_END_MESSAGE_MAP() 135 IPC_END_MESSAGE_MAP()
132 return handled; 136 return handled;
133 } 137 }
134 138
135 void MidiMessageFilter::OnFilterAdded(IPC::Sender* sender) { 139 void MidiMessageFilter::OnFilterAdded(IPC::Sender* sender) {
136 DCHECK(io_message_loop_->BelongsToCurrentThread()); 140 DCHECK(io_message_loop_->BelongsToCurrentThread());
137 sender_ = sender; 141 sender_ = sender;
138 } 142 }
139 143
140 void MidiMessageFilter::OnFilterRemoved() { 144 void MidiMessageFilter::OnFilterRemoved() {
141 DCHECK(io_message_loop_->BelongsToCurrentThread()); 145 DCHECK(io_message_loop_->BelongsToCurrentThread());
142 // Once removed, a filter will not be used again. At this time all 146 // Once removed, a filter will not be used again. At this time all
143 // delegates must be notified so they release their reference. 147 // delegates must be notified so they release their reference.
144 OnChannelClosing(); 148 OnChannelClosing();
145 } 149 }
146 150
147 void MidiMessageFilter::OnChannelClosing() { 151 void MidiMessageFilter::OnChannelClosing() {
148 DCHECK(io_message_loop_->BelongsToCurrentThread()); 152 DCHECK(io_message_loop_->BelongsToCurrentThread());
149 sender_ = NULL; 153 sender_ = NULL;
150 } 154 }
151 155
152 void MidiMessageFilter::OnSessionStarted(media::MidiResult result, 156 void MidiMessageFilter::OnSessionStarted(media::MidiResult result) {
153 MidiPortInfoList inputs,
154 MidiPortInfoList outputs) {
155 TRACE_EVENT0("midi", "MidiMessageFilter::OnSessionStarted"); 157 TRACE_EVENT0("midi", "MidiMessageFilter::OnSessionStarted");
156 DCHECK(io_message_loop_->BelongsToCurrentThread()); 158 DCHECK(io_message_loop_->BelongsToCurrentThread());
157 base::AutoLock auto_lock(lock_); 159 base::AutoLock auto_lock(lock_);
158 session_result_ = result; 160 session_result_ = result;
159 inputs_ = inputs;
160 outputs_ = outputs;
161 // Handle on the main JS thread. 161 // Handle on the main JS thread.
162 for (blink::WebMIDIAccessorClient* client : clients_waiting_session_queue_) { 162 for (blink::WebMIDIAccessorClient* client : clients_waiting_session_queue_) {
163 main_message_loop_->PostTask(FROM_HERE, 163 main_message_loop_->PostTask(FROM_HERE,
164 base::Bind(&MidiMessageFilter::HandleClientAdded, this, client)); 164 base::Bind(&MidiMessageFilter::HandleClientAdded, this, client));
165 } 165 }
166 clients_waiting_session_queue_.clear(); 166 clients_waiting_session_queue_.clear();
167 } 167 }
168 168
169 void MidiMessageFilter::OnAddInputPort(media::MidiPortInfo info) {
170 DCHECK(io_message_loop_->BelongsToCurrentThread());
171 base::AutoLock auto_lock(lock_);
172 inputs_.push_back(info);
173 // TODO(toyoshim): Notify to clients that were already added.
174 }
175
176 void MidiMessageFilter::OnAddOutputPort(media::MidiPortInfo info) {
177 DCHECK(io_message_loop_->BelongsToCurrentThread());
178 base::AutoLock auto_lock(lock_);
179 outputs_.push_back(info);
180 // TODO(toyoshim): Notify to clients that were already added.
181 }
182
169 void MidiMessageFilter::OnDataReceived(uint32 port, 183 void MidiMessageFilter::OnDataReceived(uint32 port,
170 const std::vector<uint8>& data, 184 const std::vector<uint8>& data,
171 double timestamp) { 185 double timestamp) {
172 TRACE_EVENT0("midi", "MidiMessageFilter::OnDataReceived"); 186 TRACE_EVENT0("midi", "MidiMessageFilter::OnDataReceived");
173 DCHECK(io_message_loop_->BelongsToCurrentThread()); 187 DCHECK(io_message_loop_->BelongsToCurrentThread());
174 main_message_loop_->PostTask( 188 main_message_loop_->PostTask(
175 FROM_HERE, 189 FROM_HERE,
176 base::Bind(&MidiMessageFilter::HandleDataReceived, this, 190 base::Bind(&MidiMessageFilter::HandleDataReceived, this,
177 port, data, timestamp)); 191 port, data, timestamp));
178 } 192 }
179 193
180 void MidiMessageFilter::OnAcknowledgeSentData(size_t bytes_sent) { 194 void MidiMessageFilter::OnAcknowledgeSentData(size_t bytes_sent) {
181 DCHECK(io_message_loop_->BelongsToCurrentThread()); 195 DCHECK(io_message_loop_->BelongsToCurrentThread());
182 DCHECK_GE(unacknowledged_bytes_sent_, bytes_sent); 196 DCHECK_GE(unacknowledged_bytes_sent_, bytes_sent);
183 if (unacknowledged_bytes_sent_ >= bytes_sent) 197 if (unacknowledged_bytes_sent_ >= bytes_sent)
184 unacknowledged_bytes_sent_ -= bytes_sent; 198 unacknowledged_bytes_sent_ -= bytes_sent;
185 } 199 }
186 200
187 void MidiMessageFilter::HandleClientAdded( 201 void MidiMessageFilter::HandleClientAdded(
188 blink::WebMIDIAccessorClient* client) { 202 blink::WebMIDIAccessorClient* client) {
189 TRACE_EVENT0("midi", "MidiMessageFilter::HandleClientAdded"); 203 TRACE_EVENT0("midi", "MidiMessageFilter::HandleClientAdded");
190 DCHECK(main_message_loop_->BelongsToCurrentThread()); 204 DCHECK(main_message_loop_->BelongsToCurrentThread());
191 media::MidiResult result; 205 media::MidiResult result;
192 { 206 {
193 base::AutoLock auto_lock(lock_); 207 base::AutoLock auto_lock(lock_);
194 result = session_result_; 208 result = session_result_;
195 } 209 }
Takashi Toyoshima 2014/10/20 18:31:12 Originally, I protect line 210:230 with the lock_
196 if (result == media::MIDI_OK) { 210 if (result == media::MIDI_OK) {
197 // Add the client's input and output ports. 211 // Add the client's input and output ports.
198 const bool active = true; 212 const bool active = true;
199 for (media::MidiPortInfo info : inputs_) { 213 for (media::MidiPortInfo info : inputs_) {
200 client->didAddInputPort( 214 client->didAddInputPort(
201 base::UTF8ToUTF16(info.id), 215 base::UTF8ToUTF16(info.id),
202 base::UTF8ToUTF16(info.manufacturer), 216 base::UTF8ToUTF16(info.manufacturer),
203 base::UTF8ToUTF16(info.name), 217 base::UTF8ToUTF16(info.name),
204 base::UTF8ToUTF16(info.version), 218 base::UTF8ToUTF16(info.version),
205 true); 219 true);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 double timestamp) { 259 double timestamp) {
246 TRACE_EVENT0("midi", "MidiMessageFilter::HandleDataReceived"); 260 TRACE_EVENT0("midi", "MidiMessageFilter::HandleDataReceived");
247 DCHECK(main_message_loop_->BelongsToCurrentThread()); 261 DCHECK(main_message_loop_->BelongsToCurrentThread());
248 DCHECK(!data.empty()); 262 DCHECK(!data.empty());
249 263
250 for (blink::WebMIDIAccessorClient* client : clients_) 264 for (blink::WebMIDIAccessorClient* client : clients_)
251 client->didReceiveMIDIData(port, &data[0], data.size(), timestamp); 265 client->didReceiveMIDIData(port, &data[0], data.size(), timestamp);
252 } 266 }
253 267
254 } // namespace content 268 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/midi_message_filter.h ('k') | media/midi/midi_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698