12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- // 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_DESCRIPTOR_PARSER_H_
- #define MEDIA_MIDI_USB_MIDI_DESCRIPTOR_PARSER_H_
- #include <stddef.h>
- #include <stdint.h>
- #include <string>
- #include <vector>
- #include "media/midi/usb_midi_export.h"
- #include "media/midi/usb_midi_jack.h"
- namespace midi {
- class UsbMidiDevice;
- // UsbMidiDescriptorParser parses USB descriptors and
- // generates input / output lists of MIDIPortInfo.
- // This is not a generic USB descriptor parser: this parser is designed
- // for collecting USB-MIDI jacks information from the descriptor.
- class USB_MIDI_EXPORT UsbMidiDescriptorParser {
- public:
- struct DeviceInfo {
- DeviceInfo()
- : vendor_id(0),
- product_id(0),
- bcd_device_version(0),
- manufacturer_index(0),
- product_index(0) {}
- uint16_t vendor_id;
- uint16_t product_id;
- // The higher one byte represents the "major" number and the lower one byte
- // represents the "minor" number.
- uint16_t bcd_device_version;
- uint8_t manufacturer_index;
- uint8_t product_index;
- static std::string BcdVersionToString(uint16_t);
- };
- UsbMidiDescriptorParser();
- UsbMidiDescriptorParser(const UsbMidiDescriptorParser&) = delete;
- UsbMidiDescriptorParser& operator=(const UsbMidiDescriptorParser&) = delete;
- ~UsbMidiDescriptorParser();
- // Returns true if the operation succeeds.
- // When an incorrect input is given, this method may return true but
- // never crashes.
- bool Parse(UsbMidiDevice* device,
- const uint8_t* data,
- size_t size,
- std::vector<UsbMidiJack>* jacks);
- bool ParseDeviceInfo(const uint8_t* data, size_t size, DeviceInfo* info);
- private:
- bool ParseInternal(UsbMidiDevice* device,
- const uint8_t* data,
- size_t size,
- std::vector<UsbMidiJack>* jacks);
- bool ParseDevice(const uint8_t* data, size_t size, DeviceInfo* info);
- bool ParseInterface(const uint8_t* data, size_t size);
- bool ParseCSInterface(UsbMidiDevice* device,
- const uint8_t* data,
- size_t size);
- bool ParseEndpoint(const uint8_t* data, size_t size);
- bool ParseCSEndpoint(const uint8_t* data,
- size_t size,
- std::vector<UsbMidiJack>* jacks);
- void Clear();
- bool is_parsing_usb_midi_interface_;
- uint8_t current_endpoint_address_;
- uint8_t current_cable_number_;
- std::vector<UsbMidiJack> incomplete_jacks_;
- };
- } // namespace midi
- #endif // MEDIA_MIDI_USB_MIDI_DESCRIPTOR_PARSER_H_
|