1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef CONTENT_RENDERER_MEDIA_MIDI_MESSAGE_FILTER_H_ 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define CONTENT_RENDERER_MEDIA_MIDI_MESSAGE_FILTER_H_ 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <map> 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <vector> 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/scoped_ptr.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/common/content_export.h" 135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ipc/message_filter.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "media/midi/midi_port_info.h" 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "media/midi/midi_result.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/platform/WebMIDIAccessorClient.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace base { 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass MessageLoopProxy; 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace content { 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// MessageFilter that handles MIDI messages. 255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass CONTENT_EXPORT MidiMessageFilter : public IPC::MessageFilter { 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) explicit MidiMessageFilter( 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const scoped_refptr<base::MessageLoopProxy>& io_message_loop); 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Each client registers for MIDI access here. 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // If permission is granted, then the client's 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // addInputPort() and addOutputPort() methods will be called, 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // giving the client access to receive and send data. 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void StartSession(blink::WebMIDIAccessorClient* client); 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void RemoveClient(blink::WebMIDIAccessorClient* client); 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // A client will only be able to call this method if it has a suitable 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // output port (from addOutputPort()). 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SendMidiData(uint32 port, 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const uint8* data, 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t length, 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch double timestamp); 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // IO message loop associated with this message filter. 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<base::MessageLoopProxy> io_message_loop() const { 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return io_message_loop_; 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected: 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~MidiMessageFilter(); 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Sends an IPC message using |sender_|. 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void Send(IPC::Message* message); 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // IPC::MessageFilter override. Called on |io_message_loop|. 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void OnFilterAdded(IPC::Sender* sender) OVERRIDE; 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void OnFilterRemoved() OVERRIDE; 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void OnChannelClosing() OVERRIDE; 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Called when the browser process has approved (or denied) access to 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // MIDI hardware. 6458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch void OnSessionStarted(int client_id, 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) media::MidiResult result, 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::MidiPortInfoList inputs, 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::MidiPortInfoList outputs); 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Called when the browser process has sent MIDI data containing one or 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // more messages. 71424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void OnDataReceived(uint32 port, 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector<uint8>& data, 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch double timestamp); 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // From time-to-time, the browser incrementally informs us of how many bytes 76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // it has successfully sent. This is part of our throttling process to avoid 77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // sending too much data before knowing how much has already been sent. 78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void OnAcknowledgeSentData(size_t bytes_sent); 79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 8058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch void HandleSessionStarted(int client_id, 81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) media::MidiResult result, 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::MidiPortInfoList inputs, 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::MidiPortInfoList outputs); 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 85424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void HandleDataReceived(uint32 port, 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector<uint8>& data, 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch double timestamp); 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 8958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch void StartSessionOnIOThread(int client_id); 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SendMidiDataOnIOThread(uint32 port, 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector<uint8>& data, 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch double timestamp); 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMIDIAccessorClient* GetClientFromId(int client_id); 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // IPC sender for Send(); must only be accessed on |io_message_loop_|. 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IPC::Sender* sender_; 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Message loop on which IPC calls are driven. 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const scoped_refptr<base::MessageLoopProxy> io_message_loop_; 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Main thread's message loop. 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<base::MessageLoopProxy> main_message_loop_; 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Keeps track of all MIDI clients. 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // We map client to "client id" used to track permission. 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // When access has been approved, we add the input and output ports to 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the client, allowing it to actually receive and send MIDI data. 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) typedef std::map<blink::WebMIDIAccessorClient*, int> ClientsMap; 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ClientsMap clients_; 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Dishes out client ids. 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int next_available_id_; 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) size_t unacknowledged_bytes_sent_; 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MidiMessageFilter); 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace content 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // CONTENT_RENDERER_MEDIA_MIDI_MESSAGE_FILTER_H_ 124