|  | // Copyright 2014 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 MEDIA_MIDI_USB_MIDI_DEVICE_H_ | 
|  | #define MEDIA_MIDI_USB_MIDI_DEVICE_H_ | 
|  |  | 
|  | #include <stddef.h> | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include <memory> | 
|  | #include <vector> | 
|  |  | 
|  | #include "base/callback.h" | 
|  | #include "base/time/time.h" | 
|  | #include "media/midi/usb_midi_export.h" | 
|  |  | 
|  | namespace midi { | 
|  |  | 
|  | class UsbMidiDevice; | 
|  |  | 
|  | // Delegate class for UsbMidiDevice. | 
|  | // Each method is called when an corresponding event arrives at the device. | 
|  | class USB_MIDI_EXPORT UsbMidiDeviceDelegate { | 
|  | public: | 
|  | virtual ~UsbMidiDeviceDelegate() {} | 
|  |  | 
|  | // Called when USB-MIDI data arrives at |device|. | 
|  | virtual void ReceiveUsbMidiData(UsbMidiDevice* device, | 
|  | int endpoint_number, | 
|  | const uint8_t* data, | 
|  | size_t size, | 
|  | base::TimeTicks time) = 0; | 
|  |  | 
|  | // Called when a USB-MIDI device is attached. | 
|  | virtual void OnDeviceAttached(std::unique_ptr<UsbMidiDevice> device) = 0; | 
|  | // Called when a USB-MIDI device is detached. | 
|  | virtual void OnDeviceDetached(size_t index) = 0; | 
|  | }; | 
|  |  | 
|  | // UsbMidiDevice represents a USB-MIDI device. | 
|  | // This is an interface class and each platform-dependent implementation class | 
|  | // will be a derived class. | 
|  | class USB_MIDI_EXPORT UsbMidiDevice { | 
|  | public: | 
|  | typedef std::vector<std::unique_ptr<UsbMidiDevice>> Devices; | 
|  |  | 
|  | // Factory class for USB-MIDI devices. | 
|  | // Each concrete implementation will find and create devices | 
|  | // in platform-dependent way. | 
|  | class Factory { | 
|  | public: | 
|  | typedef base::OnceCallback<void(bool result, Devices* devices)> Callback; | 
|  | virtual ~Factory() {} | 
|  |  | 
|  | // Enumerates devices. | 
|  | // Devices that have no USB-MIDI interfaces can be omitted. | 
|  | // When the operation succeeds, |callback| will be called with |true| and | 
|  | // devices. | 
|  | // Otherwise |callback| will be called with |false| and empty devices. | 
|  | // When this factory is destroyed during the operation, the operation | 
|  | // will be canceled silently (i.e. |callback| will not be called). | 
|  | // This function can be called at most once per instance. | 
|  | virtual void EnumerateDevices(UsbMidiDeviceDelegate* delegate, | 
|  | Callback callback) = 0; | 
|  | }; | 
|  |  | 
|  | virtual ~UsbMidiDevice() {} | 
|  |  | 
|  | // Returns the descriptors of this device. | 
|  | virtual std::vector<uint8_t> GetDescriptors() = 0; | 
|  |  | 
|  | // Return the name of the manufacturer. | 
|  | virtual std::string GetManufacturer() = 0; | 
|  |  | 
|  | // Retur the name of the device. | 
|  | virtual std::string GetProductName() = 0; | 
|  |  | 
|  | // Return the device version. | 
|  | virtual std::string GetDeviceVersion() = 0; | 
|  |  | 
|  | // Sends |data| to the given USB endpoint of this device. | 
|  | virtual void Send(int endpoint_number, const std::vector<uint8_t>& data) = 0; | 
|  | }; | 
|  |  | 
|  | }  // namespace midi | 
|  |  | 
|  | #endif  // MEDIA_MIDI_USB_MIDI_DEVICE_H_ |