diff options
author | crogers@google.com <crogers@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-22 00:55:52 +0000 |
---|---|---|
committer | crogers@google.com <crogers@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-22 00:55:52 +0000 |
commit | 3940e87eaee6fb59800cffba475a294e3fa5c72c (patch) | |
tree | 615fe36029f356c946c1374ba604967741bd4912 /content/browser/renderer_host/media | |
parent | 8fce311668977b966f21d61220dcdb2091375a16 (diff) | |
download | chromium_src-3940e87eaee6fb59800cffba475a294e3fa5c72c.zip chromium_src-3940e87eaee6fb59800cffba475a294e3fa5c72c.tar.gz chromium_src-3940e87eaee6fb59800cffba475a294e3fa5c72c.tar.bz2 |
Implement Web MIDI API back-end
This involves browser-side support and IPC for sending and receiving
MIDI messages. Initially support for OSX is included.
BUG=163795
R=palmer@chromium.org, piman@chromium.org, scherkus@chromium.org
Review URL: https://codereview.chromium.org/16025005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@207983 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/renderer_host/media')
-rw-r--r-- | content/browser/renderer_host/media/midi_host.cc | 99 | ||||
-rw-r--r-- | content/browser/renderer_host/media/midi_host.h | 62 |
2 files changed, 161 insertions, 0 deletions
diff --git a/content/browser/renderer_host/media/midi_host.cc b/content/browser/renderer_host/media/midi_host.cc new file mode 100644 index 0000000..56f4099 --- /dev/null +++ b/content/browser/renderer_host/media/midi_host.cc @@ -0,0 +1,99 @@ +// 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/browser/renderer_host/media/midi_host.h" + +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/debug/trace_event.h" +#include "base/process.h" +#include "content/browser/browser_main_loop.h" +#include "content/browser/media/media_internals.h" +#include "content/common/media/midi_messages.h" +#include "content/public/browser/content_browser_client.h" +#include "content/public/browser/media_observer.h" +#include "media/midi/midi_manager.h" + +using media::MIDIManager; +using media::MIDIPortInfoList; + +namespace content { + +MIDIHost::MIDIHost(media::MIDIManager* midi_manager) + : midi_manager_(midi_manager) { +} + +MIDIHost::~MIDIHost() { + if (midi_manager_) + midi_manager_->ReleaseAccess(this); +} + +void MIDIHost::OnChannelClosing() { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); + + BrowserMessageFilter::OnChannelClosing(); +} + +void MIDIHost::OnDestruct() const { + BrowserThread::DeleteOnIOThread::Destruct(this); +} + +/////////////////////////////////////////////////////////////////////////////// +// IPC Messages handler +bool MIDIHost::OnMessageReceived(const IPC::Message& message, + bool* message_was_ok) { + bool handled = true; + IPC_BEGIN_MESSAGE_MAP_EX(MIDIHost, message, *message_was_ok) + IPC_MESSAGE_HANDLER(MIDIHostMsg_RequestAccess, OnRequestAccess) + IPC_MESSAGE_HANDLER(MIDIHostMsg_SendData, OnSendData) + IPC_MESSAGE_UNHANDLED(handled = false) + IPC_END_MESSAGE_MAP_EX() + + return handled; +} + +void MIDIHost::OnRequestAccess(int client_id, int access) { + MIDIPortInfoList input_ports; + MIDIPortInfoList output_ports; + + // Ask permission and register to receive MIDI data. + bool approved = false; + if (midi_manager_) { + approved = midi_manager_->RequestAccess(this, access); + if (approved) { + input_ports = midi_manager_->input_ports(); + output_ports = midi_manager_->output_ports(); + } + } + + Send(new MIDIMsg_AccessApproved( + client_id, + access, + approved, + input_ports, + output_ports)); +} + +void MIDIHost::OnSendData(int port, + const std::vector<uint8>& data, + double timestamp) { + // TODO(crogers): we need to post this to a dedicated thread for + // sending MIDI. For now, we will not implement the sending of MIDI data. + NOTIMPLEMENTED(); + // if (midi_manager_) + // midi_manager_->SendMIDIData(port, data.data(), data.size(), timestamp); +} + +void MIDIHost::ReceiveMIDIData( + int port_index, + const uint8* data, + size_t length, + double timestamp) { + TRACE_EVENT0("midi", "MIDIHost::ReceiveMIDIData"); + // Send to the renderer. + std::vector<uint8> v(data, data + length); + Send(new MIDIMsg_DataReceived(port_index, v, timestamp)); +} + +} // namespace content diff --git a/content/browser/renderer_host/media/midi_host.h b/content/browser/renderer_host/media/midi_host.h new file mode 100644 index 0000000..e46ed53 --- /dev/null +++ b/content/browser/renderer_host/media/midi_host.h @@ -0,0 +1,62 @@ +// 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. + +#ifndef CONTENT_BROWSER_RENDERER_HOST_MEDIA_MIDI_HOST_H_ +#define CONTENT_BROWSER_RENDERER_HOST_MEDIA_MIDI_HOST_H_ + +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "content/common/content_export.h" +#include "content/public/browser/browser_message_filter.h" +#include "content/public/browser/browser_thread.h" +#include "media/midi/midi_manager.h" + +namespace media { +class MIDIManager; +} + +namespace content { + +class CONTENT_EXPORT MIDIHost + : public BrowserMessageFilter, + public media::MIDIManagerClient { + public: + // Called from UI thread from the owner of this object. + MIDIHost(media::MIDIManager* midi_manager); + + // BrowserMessageFilter implementation. + virtual void OnChannelClosing() OVERRIDE; + virtual void OnDestruct() const OVERRIDE; + virtual bool OnMessageReceived(const IPC::Message& message, + bool* message_was_ok) OVERRIDE; + + // MIDIManagerClient implementation. + virtual void ReceiveMIDIData( + int port_index, + const uint8* data, + size_t length, + double timestamp) OVERRIDE; + + // Request access to MIDI hardware. + void OnRequestAccess(int client_id, int access); + + // Data to be sent to a MIDI output port. + void OnSendData(int port, + const std::vector<uint8>& data, + double timestamp); + + private: + friend class base::DeleteHelper<MIDIHost>; + friend class BrowserThread; + + virtual ~MIDIHost(); + + media::MIDIManager* const midi_manager_; + + DISALLOW_COPY_AND_ASSIGN(MIDIHost); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_RENDERER_HOST_MEDIA_MIDI_HOST_H_ |