1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef MEDIA_MIDI_USB_MIDI_DEVICE_H_
6#define MEDIA_MIDI_USB_MIDI_DEVICE_H_
7
8#include <vector>
9
10#include "base/basictypes.h"
11#include "base/callback.h"
12#include "base/memory/scoped_vector.h"
13#include "base/time/time.h"
14#include "media/base/media_export.h"
15
16namespace media {
17
18class UsbMidiDevice;
19
20// Delegate class for UsbMidiDevice.
21// Each method is called when an corresponding event arrives at the device.
22class MEDIA_EXPORT UsbMidiDeviceDelegate {
23 public:
24  virtual ~UsbMidiDeviceDelegate() {}
25
26  // Called when USB-MIDI data arrives at |device|.
27  virtual void ReceiveUsbMidiData(UsbMidiDevice* device,
28                                  int endpoint_number,
29                                  const uint8* data,
30                                  size_t size,
31                                  base::TimeTicks time) = 0;
32};
33
34// UsbMidiDevice represents a USB-MIDI device.
35// This is an interface class and each platform-dependent implementation class
36// will be a derived class.
37class MEDIA_EXPORT UsbMidiDevice {
38 public:
39  typedef ScopedVector<UsbMidiDevice> Devices;
40
41  // Factory class for USB-MIDI devices.
42  // Each concrete implementation will find and create devices
43  // in platform-dependent way.
44  class Factory {
45   public:
46    typedef base::Callback<void(bool result, Devices* devices)> Callback;
47    virtual ~Factory() {}
48    // Enumerates devices.
49    // Devices that have no USB-MIDI interfaces can be omitted.
50    // When the operation succeeds, |callback| will be called with |true| and
51    // devices.
52    // Otherwise |callback| will be called with |false| and empty devices.
53    // When this factory is destroyed during the operation, the operation
54    // will be canceled silently (i.e. |callback| will not be called).
55    // This function can be called at most once per instance.
56    virtual void EnumerateDevices(UsbMidiDeviceDelegate* delegate,
57                                  Callback callback) = 0;
58  };
59
60  virtual ~UsbMidiDevice() {}
61
62  // Returns the descriptor of this device.
63  virtual std::vector<uint8> GetDescriptor() = 0;
64
65  // Sends |data| to the given USB endpoint of this device.
66  virtual void Send(int endpoint_number, const std::vector<uint8>& data) = 0;
67};
68
69}  // namespace media
70
71#endif  // MEDIA_MIDI_USB_MIDI_DEVICE_H_
72