Chromium Code Reviews| Index: content/renderer/media/midi_message_filter.cc |
| diff --git a/content/renderer/media/midi_message_filter.cc b/content/renderer/media/midi_message_filter.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..5cb796ca7c577238a514fe7a786a04630d04ca8c |
| --- /dev/null |
| +++ b/content/renderer/media/midi_message_filter.cc |
| @@ -0,0 +1,123 @@ |
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "content/renderer/media/midi_message_filter.h" |
| + |
| +#include "base/bind.h" |
| +#include "base/debug/trace_event.h" |
| +#include "base/message_loop_proxy.h" |
| +#include "content/common/media/midi_messages.h" |
| +#include "content/renderer/render_thread_impl.h" |
| +#include "ipc/ipc_logging.h" |
| + |
| +namespace content { |
| + |
| +MIDIMessageFilter* MIDIMessageFilter::g_filter = NULL; |
| + |
| +MIDIMessageFilter::MIDIMessageFilter( |
| + const scoped_refptr<base::MessageLoopProxy>& io_message_loop) |
| + : channel_(NULL), |
| + io_message_loop_(io_message_loop), |
| + client_(NULL), |
| + message_loop_(NULL) { |
| + DCHECK(!g_filter); |
| + g_filter = this; |
| +} |
| + |
| +MIDIMessageFilter::~MIDIMessageFilter() { |
| + DCHECK_EQ(g_filter, this); |
| + g_filter = NULL; |
| +} |
| + |
| +// static |
| +MIDIMessageFilter* MIDIMessageFilter::Get() { |
| + return g_filter; |
|
scherkus (not reviewing)
2013/06/03 22:44:59
AFAIK you can replace this global and RendererWebM
|
| +} |
| + |
| +void MIDIMessageFilter::Send(IPC::Message* message) { |
| + DCHECK(io_message_loop_->BelongsToCurrentThread()); |
| + if (!channel_) { |
| + delete message; |
| + } else { |
| + channel_->Send(message); |
| + } |
| +} |
| + |
| +bool MIDIMessageFilter::OnMessageReceived(const IPC::Message& message) { |
| + DCHECK(io_message_loop_->BelongsToCurrentThread()); |
| + bool handled = true; |
| + IPC_BEGIN_MESSAGE_MAP(MIDIMessageFilter, message) |
| + IPC_MESSAGE_HANDLER(MIDIMsg_AccessApproved, OnAccessApproved) |
| + IPC_MESSAGE_HANDLER(MIDIMsg_DataReceived, OnDataReceived) |
| + IPC_MESSAGE_UNHANDLED(handled = false) |
| + IPC_END_MESSAGE_MAP() |
| + return handled; |
| +} |
| + |
| +void MIDIMessageFilter::OnFilterAdded(IPC::Channel* channel) { |
| + DCHECK(io_message_loop_->BelongsToCurrentThread()); |
| + channel_ = channel; |
| +} |
| + |
| +void MIDIMessageFilter::OnFilterRemoved() { |
| + DCHECK(io_message_loop_->BelongsToCurrentThread()); |
| + |
| + // Once removed, a filter will not be used again. At this time all |
| + // delegates must be notified so they release their reference. |
| + OnChannelClosing(); |
| +} |
| + |
| +void MIDIMessageFilter::OnChannelClosing() { |
| + DCHECK(io_message_loop_->BelongsToCurrentThread()); |
| + channel_ = NULL; |
| +} |
| + |
| +// Received from browser. |
| + |
| +void MIDIMessageFilter::OnAccessApproved(int access, bool success) { |
| +} |
| + |
| +void MIDIMessageFilter::OnDataReceived(int port, |
| + const std::vector<uint8>& data, |
| + double timestamp) { |
| + TRACE_EVENT0("midi", "MIDIMessageFilter::OnDataReceived"); |
| + |
| +#if 1 |
| + if (message_loop_) { |
| + message_loop_->PostTask(FROM_HERE, |
| + base::Bind(&MIDIMessageFilter::HandleDataReceived, this, |
| + port, data, timestamp |
| + )); |
| + } |
| +#else |
| + HandleDataReceived(port, data, timestamp); |
| +#endif |
| +} |
| + |
| +void MIDIMessageFilter::HandleDataReceived(int port, |
| + const std::vector<uint8>& data, |
| + double timestamp) { |
| + TRACE_EVENT0("midi", "MIDIMessageFilter::HandleDataReceived"); |
| + size_t n = data.size(); |
| + // printf("MIDIMessageFilter::OnDataReceived(%d %f): ", (int)n, timestamp); |
| + // for (size_t i = 0; i < n; ++i) { |
| + // printf("%2x ", data[i]); |
| + // } |
| + // printf("\n"); |
| + |
| + if (client_ && message_loop_) |
| + client_->receiveMIDIData(port, data.data(), n, timestamp); |
| +} |
| + |
| +void MIDIMessageFilter::AddClient(WebKit::WebMIDIAccessor::Client* client) { |
| + client_ = client; |
| + message_loop_ = base::MessageLoop::current(); |
| +} |
| + |
| +void MIDIMessageFilter::RemoveClient(WebKit::WebMIDIAccessor::Client* client) { |
| + if (client == client_) |
| + client_ = NULL; //????????????????? multiple clients?? |
|
scherkus (not reviewing)
2013/06/03 22:44:59
I didn't see anything in the spec that mentioned m
|
| +} |
| + |
| +} // namespace content |