usb_midi_input_stream.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. #ifndef MEDIA_MIDI_USB_MIDI_INPUT_STREAM_H_
  5. #define MEDIA_MIDI_USB_MIDI_INPUT_STREAM_H_
  6. #include <stddef.h>
  7. #include <stdint.h>
  8. #include <map>
  9. #include <vector>
  10. #include "base/memory/raw_ptr.h"
  11. #include "base/time/time.h"
  12. #include "media/midi/usb_midi_export.h"
  13. #include "media/midi/usb_midi_jack.h"
  14. namespace midi {
  15. class UsbMidiDevice;
  16. // UsbMidiInputStream converts USB-MIDI data to MIDI data.
  17. // See "USB Device Class Definition for MIDI Devices" Release 1.0,
  18. // Section 4 "USB-MIDI Event Packets" for details.
  19. class USB_MIDI_EXPORT UsbMidiInputStream {
  20. public:
  21. class USB_MIDI_EXPORT Delegate {
  22. public:
  23. virtual ~Delegate() {}
  24. // This function is called when some data arrives to a USB-MIDI jack.
  25. // An input USB-MIDI jack corresponds to an input MIDIPortInfo.
  26. virtual void OnReceivedData(size_t jack_index,
  27. const uint8_t* data,
  28. size_t size,
  29. base::TimeTicks time) = 0;
  30. };
  31. // This is public for testing.
  32. struct JackUniqueKey {
  33. JackUniqueKey(UsbMidiDevice* device, int endpoint_number, int cable_number);
  34. bool operator==(const JackUniqueKey& that) const;
  35. bool operator<(const JackUniqueKey& that) const;
  36. UsbMidiDevice* device;
  37. int endpoint_number;
  38. int cable_number;
  39. };
  40. explicit UsbMidiInputStream(Delegate* delegate);
  41. UsbMidiInputStream(const UsbMidiInputStream&) = delete;
  42. UsbMidiInputStream& operator=(const UsbMidiInputStream&) = delete;
  43. ~UsbMidiInputStream();
  44. void Add(const UsbMidiJack& jack);
  45. // This function should be called when some data arrives to a USB-MIDI
  46. // endpoint. This function converts the data to MIDI data and call
  47. // |delegate->OnReceivedData| with it.
  48. // |size| must be a multiple of |kPacketSize|.
  49. void OnReceivedData(UsbMidiDevice* device,
  50. int endpoint_number,
  51. const uint8_t* data,
  52. size_t size,
  53. base::TimeTicks time);
  54. const std::vector<UsbMidiJack>& jacks() const { return jacks_; }
  55. private:
  56. static const size_t kPacketSize = 4;
  57. // Processes a USB-MIDI Event Packet.
  58. // The first |kPacketSize| bytes of |packet| must be accessible.
  59. void ProcessOnePacket(UsbMidiDevice* device,
  60. int endpoint_number,
  61. const uint8_t* packet,
  62. base::TimeTicks time);
  63. std::vector<UsbMidiJack> jacks_;
  64. // A map from UsbMidiJack to its index in |jacks_|.
  65. std::map<JackUniqueKey, size_t> jack_dictionary_;
  66. // Not owned
  67. raw_ptr<Delegate> delegate_;
  68. };
  69. } // namespace midi
  70. #endif // MEDIA_MIDI_USB_MIDI_INPUT_STREAM_H_