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

Unified Diff: content/renderer/media/midi_message_filter.cc

Issue 16025005: Web MIDI API back-end (work-in-progress) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: merge Created 7 years, 7 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698