usb_midi_descriptor_parser.h 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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_DESCRIPTOR_PARSER_H_
  5. #define MEDIA_MIDI_USB_MIDI_DESCRIPTOR_PARSER_H_
  6. #include <stddef.h>
  7. #include <stdint.h>
  8. #include <string>
  9. #include <vector>
  10. #include "media/midi/usb_midi_export.h"
  11. #include "media/midi/usb_midi_jack.h"
  12. namespace midi {
  13. class UsbMidiDevice;
  14. // UsbMidiDescriptorParser parses USB descriptors and
  15. // generates input / output lists of MIDIPortInfo.
  16. // This is not a generic USB descriptor parser: this parser is designed
  17. // for collecting USB-MIDI jacks information from the descriptor.
  18. class USB_MIDI_EXPORT UsbMidiDescriptorParser {
  19. public:
  20. struct DeviceInfo {
  21. DeviceInfo()
  22. : vendor_id(0),
  23. product_id(0),
  24. bcd_device_version(0),
  25. manufacturer_index(0),
  26. product_index(0) {}
  27. uint16_t vendor_id;
  28. uint16_t product_id;
  29. // The higher one byte represents the "major" number and the lower one byte
  30. // represents the "minor" number.
  31. uint16_t bcd_device_version;
  32. uint8_t manufacturer_index;
  33. uint8_t product_index;
  34. static std::string BcdVersionToString(uint16_t);
  35. };
  36. UsbMidiDescriptorParser();
  37. UsbMidiDescriptorParser(const UsbMidiDescriptorParser&) = delete;
  38. UsbMidiDescriptorParser& operator=(const UsbMidiDescriptorParser&) = delete;
  39. ~UsbMidiDescriptorParser();
  40. // Returns true if the operation succeeds.
  41. // When an incorrect input is given, this method may return true but
  42. // never crashes.
  43. bool Parse(UsbMidiDevice* device,
  44. const uint8_t* data,
  45. size_t size,
  46. std::vector<UsbMidiJack>* jacks);
  47. bool ParseDeviceInfo(const uint8_t* data, size_t size, DeviceInfo* info);
  48. private:
  49. bool ParseInternal(UsbMidiDevice* device,
  50. const uint8_t* data,
  51. size_t size,
  52. std::vector<UsbMidiJack>* jacks);
  53. bool ParseDevice(const uint8_t* data, size_t size, DeviceInfo* info);
  54. bool ParseInterface(const uint8_t* data, size_t size);
  55. bool ParseCSInterface(UsbMidiDevice* device,
  56. const uint8_t* data,
  57. size_t size);
  58. bool ParseEndpoint(const uint8_t* data, size_t size);
  59. bool ParseCSEndpoint(const uint8_t* data,
  60. size_t size,
  61. std::vector<UsbMidiJack>* jacks);
  62. void Clear();
  63. bool is_parsing_usb_midi_interface_;
  64. uint8_t current_endpoint_address_;
  65. uint8_t current_cable_number_;
  66. std::vector<UsbMidiJack> incomplete_jacks_;
  67. };
  68. } // namespace midi
  69. #endif // MEDIA_MIDI_USB_MIDI_DESCRIPTOR_PARSER_H_