15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef MEDIA_MIDI_MIDI_MANAGER_USB_H_ 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MEDIA_MIDI_MIDI_MANAGER_USB_H_ 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <utility> 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector> 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/basictypes.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/callback.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/containers/hash_tables.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/time/time.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/base/media_export.h" 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/midi/midi_manager.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/midi/usb_midi_device.h" 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/midi/usb_midi_input_stream.h" 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/midi/usb_midi_jack.h" 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/midi/usb_midi_output_stream.h" 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace media { 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// MidiManager for USB-MIDI. 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MEDIA_EXPORT MidiManagerUsb : public MidiManager, 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public UsbMidiDeviceDelegate, 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public UsbMidiInputStream::Delegate { 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) explicit MidiManagerUsb(scoped_ptr<UsbMidiDevice::Factory> device_factory); 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~MidiManagerUsb(); 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // MidiManager implementation. 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void StartInitialization() OVERRIDE; 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DispatchSendMidiData(MidiManagerClient* client, 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint32 port_index, 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<uint8>& data, 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) double timestamp) OVERRIDE; 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // UsbMidiDeviceDelegate implementation. 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void ReceiveUsbMidiData(UsbMidiDevice* device, 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int endpoint_number, 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const uint8* data, 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t size, 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::TimeTicks time) OVERRIDE; 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // UsbMidiInputStream::Delegate implementation. 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnReceivedData(size_t jack_index, 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const uint8* data, 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t size, 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::TimeTicks time) OVERRIDE; 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ScopedVector<UsbMidiOutputStream>& output_streams() const { 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return output_streams_; 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const UsbMidiInputStream* input_stream() const { return input_stream_.get(); } 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Initializes this object. 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // When the initialization finishes, |callback| will be called with the 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // result. 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // When this factory is destroyed during the operation, the operation 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // will be canceled silently (i.e. |callback| will not be called). 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // The function is public just for unit tests. Do not call this function 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // outside code for testing. 66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void Initialize(base::Callback<void(MidiResult result)> callback); 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OnEnumerateDevicesDone(bool result, UsbMidiDevice::Devices* devices); 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<UsbMidiDevice::Factory> device_factory_; 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<UsbMidiDevice> devices_; 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<UsbMidiOutputStream> output_streams_; 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<UsbMidiInputStream> input_stream_; 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Callback<void(MidiResult result)> initialize_callback_; 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // A map from <endpoint_number, cable_number> to the index of input jacks. 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::hash_map<std::pair<int, int>, size_t> input_jack_dictionary_; 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MidiManagerUsb); 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace media 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // MEDIA_MIDI_MIDI_MANAGER_USB_H_ 87