blob: f40723c44a7ee15b6980ec24c2ad79d0ac2e7474 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// 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/functional/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_