454e28d906
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40433 a95241bf-73f2-0310-859d-f6bbb57e9c96
124 lines
3.5 KiB
C
124 lines
3.5 KiB
C
#ifndef USB_MIDI_H
|
|
#define USB_MIDI_H
|
|
|
|
#include <usb/USB_audio.h>
|
|
|
|
// (Partial) USB Class Definitions for MIDI Devices, version 1.0
|
|
// Reference: http://www.usb.org/developers/devclass_docs/midi10.pdf
|
|
|
|
#define USB_MIDI_CLASS_VERSION 0x0100 // Class specification version 1.0
|
|
|
|
// USB MIDI Event Packet
|
|
|
|
// ... as clean structure:
|
|
typedef struct { // USB MIDI Event Packet
|
|
uint8 cin:4; // Code Index Number
|
|
uint8 cn:4; // Cable Number
|
|
uint8 midi[3];
|
|
} _PACKED usb_midi_event_packet;
|
|
|
|
|
|
// MIDIStreaming (ms) interface descriptors (p20)
|
|
|
|
enum { // MIDI Streaming descriptors subtypes
|
|
USB_MS_HEADER_DESCRIPTOR = 0x01,
|
|
USB_MS_MIDI_IN_JACK_DESCRIPTOR,
|
|
USB_MS_MIDI_OUT_JACK_DESCRIPTOR,
|
|
USB_MS_ELEMENT_DESCRIPTOR
|
|
};
|
|
|
|
typedef struct usb_midi_interface_header_descriptor {
|
|
uint8 length;
|
|
uint8 descriptor_type;
|
|
uint8 descriptor_subtype; // USB_MS_HEADER_DESCRIPTOR
|
|
uint16 ms_version;
|
|
uint16 total_length;
|
|
} _PACKED usb_midi_interface_header_descriptor;
|
|
|
|
|
|
enum {
|
|
USB_MIDI_EMBEDDED_JACK = 0x01,
|
|
USB_MIDI_EXTERNAL_JACK
|
|
};
|
|
|
|
typedef struct usb_midi_in_jack_descriptor {
|
|
uint8 length;
|
|
uint8 descriptor_type;
|
|
uint8 descriptor_subtype; // USB_MS_MIDI_IN_JACK_DESCRIPTOR
|
|
uint8 type; // USB_MIDI_{EMBEDDED | EXTERNAL}_JACK
|
|
uint8 id;
|
|
uint8 string_descriptor;
|
|
} _PACKED usb_ms_midi_in_jack_descriptor;
|
|
|
|
|
|
typedef struct usb_midi_source {
|
|
uint8 source_id;
|
|
uint8 source_pin;
|
|
} _PACKED usb_midi_source;
|
|
|
|
typedef struct usb_midi_out_jack_descriptor {
|
|
uint8 length;
|
|
uint8 descriptor_type;
|
|
uint8 descriptor_subtype; // USB_MS_MIDI_OUT_JACK_DESCRIPTOR
|
|
uint8 type; // USB_MIDI_{EMBEDDED | EXTERNAL}_JACK
|
|
uint8 id;
|
|
uint8 inputs_count;
|
|
usb_midi_source input_source[0]; // inputs_count times
|
|
// uint8 string_descriptor;
|
|
} _PACKED usb_midi_out_jack_descriptor;
|
|
|
|
|
|
enum { // USB Element Capabilities bitmap (p23,25)
|
|
USB_MS_ELEMENT_CUSTOM_UNDEFINED = 0x0001,
|
|
USB_MS_ELEMENT_MIDI_CLOCK = 0x0002,
|
|
USB_MS_ELEMENT_MIDI_TIME_CODE = 0x0004,
|
|
USB_MS_ELEMENT_MTC = USB_MS_ELEMENT_MIDI_TIME_CODE,
|
|
USB_MS_ELEMENT_MIDI_MACHINE_CONTROL = 0x0008,
|
|
USB_MS_ELEMENT_MMC = USB_MS_ELEMENT_MIDI_MACHINE_CONTROL,
|
|
// General MIDI System Level 1 compatible
|
|
USB_MS_ELEMENT_GM1 = 0x0010,
|
|
// General MIDI System Level 2 compatible
|
|
USB_MS_ELEMENT_GM2 = 0x0020,
|
|
// GS Format compatible (Roland)
|
|
USB_MS_ELEMENT_GS = 0x0040,
|
|
// XG compatible (Yamaha)
|
|
USB_MS_ELEMENT_XG = 0x0080,
|
|
USB_MS_ELEMENT_EFX = 0x0100,
|
|
// internal MIDI Patcher or Router
|
|
USB_MS_ELEMENT_MIDI_PATCH_BAY = 0x0200,
|
|
// Downloadable Sounds Standards Level 1 compatible
|
|
USB_MS_ELEMENT_DLS1 = 0x0400,
|
|
// Downloadable Sounds Standards Level 2 compatible
|
|
USB_MS_ELEMENT_DLS2 = 0x0800
|
|
};
|
|
|
|
typedef struct usb_midi_element_descriptor {
|
|
uint8 length;
|
|
uint8 descriptor_type;
|
|
uint8 descriptor_subtype; // USB_MS_ELEMENT_DESCRIPTOR
|
|
uint8 id;
|
|
uint8 inputs_count;
|
|
usb_midi_source input_source[0]; // inputs_count times
|
|
// uint8 outputs_count;
|
|
// uint8 input_terminal_id;
|
|
// uint8 output_terminal_id;
|
|
// uint8 capabilities_size;
|
|
// uint8 capabilities[0]; // capabilities_size bytes
|
|
// uint8 string_descriptor; // see USB_MS_ELEMENT_* enum above
|
|
} _PACKED usb_midi_element_descriptor;
|
|
|
|
// Class-Specific MIDIStream Bulk Data Endpoint descriptor (p26)
|
|
|
|
#define USB_MS_GENERAL_DESCRIPTOR 0x01
|
|
|
|
typedef struct usb_midi_endpoint_descriptor {
|
|
uint8 length;
|
|
uint8 descriptor_type; // USB_DESCRIPTOR_CS_ENDPOINT
|
|
uint8 descriptor_subtype; // USB_MS_GENERAL_DESCRIPTOR
|
|
uint8 jacks_count;
|
|
uint8 jacks_id[0]; // jacks_count times
|
|
} _PACKED usb_midi_endpoint_descriptor;
|
|
|
|
|
|
#endif // USB_MIDI_H
|