1d5ac70f0Sopenharmony_ci/* SPDX-License-Identifier: LGPL-2.1+ */ 2d5ac70f0Sopenharmony_ci/** 3d5ac70f0Sopenharmony_ci * \file include/ump_msg.h 4d5ac70f0Sopenharmony_ci * \brief API library for ALSA rawmidi/UMP interface 5d5ac70f0Sopenharmony_ci * 6d5ac70f0Sopenharmony_ci * API library for ALSA rawmidi/UMP interface 7d5ac70f0Sopenharmony_ci */ 8d5ac70f0Sopenharmony_ci 9d5ac70f0Sopenharmony_ci#ifndef __ALSA_UMP_MSG_H 10d5ac70f0Sopenharmony_ci#define __ALSA_UMP_MSG_H 11d5ac70f0Sopenharmony_ci 12d5ac70f0Sopenharmony_ci#include <stdint.h> 13d5ac70f0Sopenharmony_ci 14d5ac70f0Sopenharmony_ci#ifdef __cplusplus 15d5ac70f0Sopenharmony_ciextern "C" { 16d5ac70f0Sopenharmony_ci#endif 17d5ac70f0Sopenharmony_ci 18d5ac70f0Sopenharmony_ci/** general UMP packet header in 32bit word */ 19d5ac70f0Sopenharmony_citypedef struct _snd_ump_msg_hdr { 20d5ac70f0Sopenharmony_ci#ifdef SNDRV_BIG_ENDIAN_BITFIELD 21d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 22d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 23d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 24d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 25d5ac70f0Sopenharmony_ci uint8_t byte1; /**< First data byte */ 26d5ac70f0Sopenharmony_ci uint8_t byte2; /**< Second data byte */ 27d5ac70f0Sopenharmony_ci#else 28d5ac70f0Sopenharmony_ci uint8_t byte2; /**< Second data byte */ 29d5ac70f0Sopenharmony_ci uint8_t byte1; /**< First data byte */ 30d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 31d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 32d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 33d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 34d5ac70f0Sopenharmony_ci#endif 35d5ac70f0Sopenharmony_ci} __attribute((packed)) snd_ump_msg_hdr_t; 36d5ac70f0Sopenharmony_ci 37d5ac70f0Sopenharmony_ci/** MIDI 1.0 Note Off / Note On (32bit) */ 38d5ac70f0Sopenharmony_citypedef struct _snd_ump_msg_midi1_note { 39d5ac70f0Sopenharmony_ci#ifdef SNDRV_BIG_ENDIAN_BITFIELD 40d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 41d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 42d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 43d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 44d5ac70f0Sopenharmony_ci uint8_t note; /**< Note (7bit) */ 45d5ac70f0Sopenharmony_ci uint8_t velocity; /**< Velocity (7bit) */ 46d5ac70f0Sopenharmony_ci#else 47d5ac70f0Sopenharmony_ci uint8_t velocity; /**< Velocity (7bit) */ 48d5ac70f0Sopenharmony_ci uint8_t note; /**< Note (7bit) */ 49d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 50d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 51d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 52d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 53d5ac70f0Sopenharmony_ci#endif 54d5ac70f0Sopenharmony_ci} __attribute((packed)) snd_ump_msg_midi1_note_t; 55d5ac70f0Sopenharmony_ci 56d5ac70f0Sopenharmony_ci/** MIDI 1.0 Poly Pressure (32bit) */ 57d5ac70f0Sopenharmony_citypedef struct _snd_ump_msg_midi1_paf { 58d5ac70f0Sopenharmony_ci#ifdef SNDRV_BIG_ENDIAN_BITFIELD 59d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 60d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 61d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 62d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 63d5ac70f0Sopenharmony_ci uint8_t note; /** Note (7bit) */ 64d5ac70f0Sopenharmony_ci uint8_t data; /** Pressure (7bit) */ 65d5ac70f0Sopenharmony_ci#else 66d5ac70f0Sopenharmony_ci uint8_t data; /** Pressure (7bit) */ 67d5ac70f0Sopenharmony_ci uint8_t note; /** Note (7bit) */ 68d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 69d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 70d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 71d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 72d5ac70f0Sopenharmony_ci#endif 73d5ac70f0Sopenharmony_ci} __attribute((packed)) snd_ump_msg_midi1_paf_t; 74d5ac70f0Sopenharmony_ci 75d5ac70f0Sopenharmony_ci/** MIDI 1.0 Control Change (32bit) */ 76d5ac70f0Sopenharmony_citypedef struct _snd_ump_msg_midi1_cc { 77d5ac70f0Sopenharmony_ci#ifdef SNDRV_BIG_ENDIAN_BITFIELD 78d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 79d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 80d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 81d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 82d5ac70f0Sopenharmony_ci uint8_t index; /** Control index (7bit) */ 83d5ac70f0Sopenharmony_ci uint8_t data; /** Control data (7bit) */ 84d5ac70f0Sopenharmony_ci#else 85d5ac70f0Sopenharmony_ci uint8_t data; /** Control data (7bit) */ 86d5ac70f0Sopenharmony_ci uint8_t index; /** Control index (7bit) */ 87d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 88d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 89d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 90d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 91d5ac70f0Sopenharmony_ci#endif 92d5ac70f0Sopenharmony_ci} __attribute((packed)) snd_ump_msg_midi1_cc_t; 93d5ac70f0Sopenharmony_ci 94d5ac70f0Sopenharmony_ci/** MIDI 1.0 Program Change (32bit) */ 95d5ac70f0Sopenharmony_citypedef struct _snd_ump_msg_midi1_program { 96d5ac70f0Sopenharmony_ci#ifdef SNDRV_BIG_ENDIAN_BITFIELD 97d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 98d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 99d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 100d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 101d5ac70f0Sopenharmony_ci uint8_t program; /**< Program number (7bit) */ 102d5ac70f0Sopenharmony_ci uint8_t reserved; /**< Unused */ 103d5ac70f0Sopenharmony_ci#else 104d5ac70f0Sopenharmony_ci uint8_t reserved; /**< Unused */ 105d5ac70f0Sopenharmony_ci uint8_t program; /**< Program number (7bit) */ 106d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 107d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 108d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 109d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 110d5ac70f0Sopenharmony_ci#endif 111d5ac70f0Sopenharmony_ci} __attribute((packed)) snd_ump_msg_midi1_program_t; 112d5ac70f0Sopenharmony_ci 113d5ac70f0Sopenharmony_ci/** MIDI 1.0 Channel Pressure (32bit) */ 114d5ac70f0Sopenharmony_citypedef struct _snd_ump_msg_midi1_caf { 115d5ac70f0Sopenharmony_ci#ifdef SNDRV_BIG_ENDIAN_BITFIELD 116d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 117d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 118d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 119d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 120d5ac70f0Sopenharmony_ci uint8_t data; /**< Pressure (7bit) */ 121d5ac70f0Sopenharmony_ci uint8_t reserved; /**< Unused */ 122d5ac70f0Sopenharmony_ci#else 123d5ac70f0Sopenharmony_ci uint8_t reserved; /**< Unused */ 124d5ac70f0Sopenharmony_ci uint8_t data; /**< Pressure (7bit) */ 125d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 126d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 127d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 128d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 129d5ac70f0Sopenharmony_ci#endif 130d5ac70f0Sopenharmony_ci} __attribute((packed)) snd_ump_msg_midi1_caf_t; 131d5ac70f0Sopenharmony_ci 132d5ac70f0Sopenharmony_ci/** MIDI 1.0 Pitch Bend (32bit) */ 133d5ac70f0Sopenharmony_citypedef struct _snd_ump_msg_midi1_pitchbend { 134d5ac70f0Sopenharmony_ci#ifdef SNDRV_BIG_ENDIAN_BITFIELD 135d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 136d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 137d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 138d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 139d5ac70f0Sopenharmony_ci uint8_t data_lsb; /**< LSB of pitchbend (7bit) */ 140d5ac70f0Sopenharmony_ci uint8_t data_msb; /**< MSB of pitchbend (7bit) */ 141d5ac70f0Sopenharmony_ci#else 142d5ac70f0Sopenharmony_ci uint8_t data_msb; /**< MSB of pitchbend (7bit) */ 143d5ac70f0Sopenharmony_ci uint8_t data_lsb; /**< LSB of pitchbend (7bit) */ 144d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 145d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 146d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 147d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 148d5ac70f0Sopenharmony_ci#endif 149d5ac70f0Sopenharmony_ci} __attribute((packed)) snd_ump_msg_midi1_pitchbend_t; 150d5ac70f0Sopenharmony_ci 151d5ac70f0Sopenharmony_ci/** System Common and Real Time messages (32bit); no channel field */ 152d5ac70f0Sopenharmony_citypedef struct snd_ump_msg_system { 153d5ac70f0Sopenharmony_ci#ifdef SNDRV_BIG_ENDIAN_BITFIELD 154d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 155d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 156d5ac70f0Sopenharmony_ci uint8_t status; /**< Status */ 157d5ac70f0Sopenharmony_ci uint8_t parm1; /**< First parameter */ 158d5ac70f0Sopenharmony_ci uint8_t parm2; /**< Second parameter */ 159d5ac70f0Sopenharmony_ci#else 160d5ac70f0Sopenharmony_ci uint8_t parm1; /**< First parameter */ 161d5ac70f0Sopenharmony_ci uint8_t parm2; /**< Second parameter */ 162d5ac70f0Sopenharmony_ci uint8_t status; /**< Status */ 163d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 164d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 165d5ac70f0Sopenharmony_ci#endif 166d5ac70f0Sopenharmony_ci} __attribute((packed)) snd_ump_msg_system_t; 167d5ac70f0Sopenharmony_ci 168d5ac70f0Sopenharmony_ci/** MIDI 1.0 UMP CVM (32bit) */ 169d5ac70f0Sopenharmony_citypedef union _snd_ump_msg_midi1 { 170d5ac70f0Sopenharmony_ci snd_ump_msg_midi1_note_t note_on; 171d5ac70f0Sopenharmony_ci snd_ump_msg_midi1_note_t note_off; 172d5ac70f0Sopenharmony_ci snd_ump_msg_midi1_paf_t poly_pressure; 173d5ac70f0Sopenharmony_ci snd_ump_msg_midi1_cc_t control_change; 174d5ac70f0Sopenharmony_ci snd_ump_msg_midi1_program_t program_change; 175d5ac70f0Sopenharmony_ci snd_ump_msg_midi1_caf_t channel_pressure; 176d5ac70f0Sopenharmony_ci snd_ump_msg_midi1_pitchbend_t pitchbend; 177d5ac70f0Sopenharmony_ci snd_ump_msg_system_t system; 178d5ac70f0Sopenharmony_ci snd_ump_msg_hdr_t hdr; 179d5ac70f0Sopenharmony_ci uint32_t raw; 180d5ac70f0Sopenharmony_ci} snd_ump_msg_midi1_t; 181d5ac70f0Sopenharmony_ci 182d5ac70f0Sopenharmony_ci/** MIDI 2.0 Note-on/off attribute type */ 183d5ac70f0Sopenharmony_cienum { 184d5ac70f0Sopenharmony_ci SND_UMP_MIDI2_NOTE_ATTR_NO_DATA = 0x00, /**< No attribute data */ 185d5ac70f0Sopenharmony_ci SND_UMP_MIDI2_NOTE_ATTR_MANUFACTURER = 0x01, /**< Manufacturer specific */ 186d5ac70f0Sopenharmony_ci SND_UMP_MIDI2_NOTE_ATTR_PROFILE = 0x02, /**< Profile specific */ 187d5ac70f0Sopenharmony_ci SND_UMP_MIDI2_NOTE_ATTR_PITCH79 = 0x03, /**< Pitch 7.9 */ 188d5ac70f0Sopenharmony_ci}; 189d5ac70f0Sopenharmony_ci 190d5ac70f0Sopenharmony_ci/* MIDI 2.0 Note Off / Note On (64bit) */ 191d5ac70f0Sopenharmony_citypedef struct _snd_ump_msg_midi2_note { 192d5ac70f0Sopenharmony_ci#ifdef SNDRV_BIG_ENDIAN_BITFIELD 193d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 194d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 195d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 196d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 197d5ac70f0Sopenharmony_ci uint8_t note; /**< Note (7bit) */ 198d5ac70f0Sopenharmony_ci uint8_t attr_type; /**< Attribute type */ 199d5ac70f0Sopenharmony_ci 200d5ac70f0Sopenharmony_ci uint16_t velocity; /**< Velocity (16bit) */ 201d5ac70f0Sopenharmony_ci uint16_t attr_data; /**< Attribute data (16bit) */ 202d5ac70f0Sopenharmony_ci#else 203d5ac70f0Sopenharmony_ci uint8_t attr_type; /**< Attribute type */ 204d5ac70f0Sopenharmony_ci uint8_t note; /**< Note (7bit) */ 205d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 206d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 207d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 208d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 209d5ac70f0Sopenharmony_ci 210d5ac70f0Sopenharmony_ci uint16_t attr_data; /**< Attribute data (16bit) */ 211d5ac70f0Sopenharmony_ci uint16_t velocity; /**< Velocity (16bit) */ 212d5ac70f0Sopenharmony_ci#endif 213d5ac70f0Sopenharmony_ci} __attribute((packed)) snd_ump_msg_midi2_note_t; 214d5ac70f0Sopenharmony_ci 215d5ac70f0Sopenharmony_ci/** MIDI 2.0 Poly Pressure (64bit) */ 216d5ac70f0Sopenharmony_citypedef struct _snd_ump_msg_midi2_paf { 217d5ac70f0Sopenharmony_ci#ifdef SNDRV_BIG_ENDIAN_BITFIELD 218d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 219d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 220d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 221d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 222d5ac70f0Sopenharmony_ci uint8_t note; /**< Note (7bit) */ 223d5ac70f0Sopenharmony_ci uint8_t reserved; /**< Unused */ 224d5ac70f0Sopenharmony_ci 225d5ac70f0Sopenharmony_ci uint32_t data; /**< Pressure (32bit) */ 226d5ac70f0Sopenharmony_ci#else 227d5ac70f0Sopenharmony_ci uint8_t reserved; /**< Unused */ 228d5ac70f0Sopenharmony_ci uint8_t note; /**< Note (7bit) */ 229d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 230d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 231d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 232d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 233d5ac70f0Sopenharmony_ci 234d5ac70f0Sopenharmony_ci uint32_t data; /**< Pressure (32bit) */ 235d5ac70f0Sopenharmony_ci#endif 236d5ac70f0Sopenharmony_ci} __attribute((packed)) snd_ump_msg_midi2_paf_t; 237d5ac70f0Sopenharmony_ci 238d5ac70f0Sopenharmony_ci/** MIDI 2.0 Per-Note Controller (64bit) */ 239d5ac70f0Sopenharmony_citypedef struct _snd_ump_msg_midi2_per_note_cc { 240d5ac70f0Sopenharmony_ci#ifdef SNDRV_BIG_ENDIAN_BITFIELD 241d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 242d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 243d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 244d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 245d5ac70f0Sopenharmony_ci uint8_t note; /**< Note (7bit) */ 246d5ac70f0Sopenharmony_ci uint8_t index; /**< Control index (8bit) */ 247d5ac70f0Sopenharmony_ci 248d5ac70f0Sopenharmony_ci uint32_t data; /**< Data (32bit) */ 249d5ac70f0Sopenharmony_ci#else 250d5ac70f0Sopenharmony_ci uint8_t index; /**< Control index (8bit) */ 251d5ac70f0Sopenharmony_ci uint8_t note; /**< Note (7bit) */ 252d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 253d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 254d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 255d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 256d5ac70f0Sopenharmony_ci 257d5ac70f0Sopenharmony_ci uint32_t data; /**< Data (32bit) */ 258d5ac70f0Sopenharmony_ci#endif 259d5ac70f0Sopenharmony_ci} __attribute((packed)) snd_ump_msg_midi2_per_note_cc_t; 260d5ac70f0Sopenharmony_ci 261d5ac70f0Sopenharmony_ci/** MIDI 2.0 per-note management flag bits */ 262d5ac70f0Sopenharmony_cienum { 263d5ac70f0Sopenharmony_ci SND_UMP_MIDI2_PNMGMT_RESET_CONTROLLERS = 0x01, /**< Reset (set) per-note controllers */ 264d5ac70f0Sopenharmony_ci SND_UMP_MIDI2_PNMGMT_DETACH_CONTROLLERS = 0x02, /**< Detach per-note controllers */ 265d5ac70f0Sopenharmony_ci}; 266d5ac70f0Sopenharmony_ci 267d5ac70f0Sopenharmony_ci/** MIDI 2.0 Per-Note Management (64bit) */ 268d5ac70f0Sopenharmony_citypedef struct _snd_ump_msg_midi2_per_note_mgmt { 269d5ac70f0Sopenharmony_ci#ifdef SNDRV_BIG_ENDIAN_BITFIELD 270d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 271d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 272d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 273d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 274d5ac70f0Sopenharmony_ci uint8_t note; /**< Note (7bit) */ 275d5ac70f0Sopenharmony_ci uint8_t flags; /**< Option flags (8bit) */ 276d5ac70f0Sopenharmony_ci 277d5ac70f0Sopenharmony_ci uint32_t reserved; /**< Unused */ 278d5ac70f0Sopenharmony_ci#else 279d5ac70f0Sopenharmony_ci uint8_t flags; /**< Option flags (8bit) */ 280d5ac70f0Sopenharmony_ci uint8_t note; /**< Note (7bit) */ 281d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 282d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 283d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 284d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 285d5ac70f0Sopenharmony_ci 286d5ac70f0Sopenharmony_ci uint32_t reserved; /**< Unused */ 287d5ac70f0Sopenharmony_ci#endif 288d5ac70f0Sopenharmony_ci} __attribute((packed)) snd_ump_msg_midi2_per_note_mgmt_t; 289d5ac70f0Sopenharmony_ci 290d5ac70f0Sopenharmony_ci/** MIDI 2.0 Control Change (64bit) */ 291d5ac70f0Sopenharmony_citypedef struct _snd_ump_msg_midi2_cc { 292d5ac70f0Sopenharmony_ci#ifdef SNDRV_BIG_ENDIAN_BITFIELD 293d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 294d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 295d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 296d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 297d5ac70f0Sopenharmony_ci uint8_t index; /**< Control index (7bit) */ 298d5ac70f0Sopenharmony_ci uint8_t reserved; /**< Unused */ 299d5ac70f0Sopenharmony_ci 300d5ac70f0Sopenharmony_ci uint32_t data; /**< Control data (32bit) */ 301d5ac70f0Sopenharmony_ci#else 302d5ac70f0Sopenharmony_ci uint8_t reserved; /**< Unused */ 303d5ac70f0Sopenharmony_ci uint8_t index; /**< Control index (7bit) */ 304d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 305d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 306d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 307d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 308d5ac70f0Sopenharmony_ci 309d5ac70f0Sopenharmony_ci uint32_t data; /**< Control data (32bit) */ 310d5ac70f0Sopenharmony_ci#endif 311d5ac70f0Sopenharmony_ci} __attribute((packed)) snd_ump_msg_midi2_cc_t; 312d5ac70f0Sopenharmony_ci 313d5ac70f0Sopenharmony_ci/** MIDI 2.0 Registered Controller (RPN) / Assignable Controller (NRPN) (64bit) */ 314d5ac70f0Sopenharmony_citypedef struct _snd_ump_msg_midi2_rpn { 315d5ac70f0Sopenharmony_ci#ifdef SNDRV_BIG_ENDIAN_BITFIELD 316d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 317d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 318d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 319d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 320d5ac70f0Sopenharmony_ci uint8_t bank; /**< Bank number (7bit) */ 321d5ac70f0Sopenharmony_ci uint8_t index; /**< Control index (7bit) */ 322d5ac70f0Sopenharmony_ci 323d5ac70f0Sopenharmony_ci uint32_t data; /**< Data (32bit) */ 324d5ac70f0Sopenharmony_ci#else 325d5ac70f0Sopenharmony_ci uint8_t index; /**< Control index (7bit) */ 326d5ac70f0Sopenharmony_ci uint8_t bank; /**< Bank number (7bit) */ 327d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 328d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 329d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 330d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 331d5ac70f0Sopenharmony_ci 332d5ac70f0Sopenharmony_ci uint32_t data; /**< Data (32bit) */ 333d5ac70f0Sopenharmony_ci#endif 334d5ac70f0Sopenharmony_ci} __attribute((packed)) snd_ump_msg_midi2_rpn_t; 335d5ac70f0Sopenharmony_ci 336d5ac70f0Sopenharmony_ci/** MIDI 2.0 Program Change (64bit) */ 337d5ac70f0Sopenharmony_citypedef struct _snd_ump_msg_midi2_program { 338d5ac70f0Sopenharmony_ci#ifdef SNDRV_BIG_ENDIAN_BITFIELD 339d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 340d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 341d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 342d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 343d5ac70f0Sopenharmony_ci uint16_t reserved:15; /**< Unused */ 344d5ac70f0Sopenharmony_ci uint16_t bank_valid:1; /**< Option flag: bank valid */ 345d5ac70f0Sopenharmony_ci 346d5ac70f0Sopenharmony_ci uint8_t program; /**< Program number (7bit) */ 347d5ac70f0Sopenharmony_ci uint8_t reserved2; /**< Unused */ 348d5ac70f0Sopenharmony_ci uint8_t bank_msb; /**< MSB of bank (8bit) */ 349d5ac70f0Sopenharmony_ci uint8_t bank_lsb; /**< LSB of bank (7bit) */ 350d5ac70f0Sopenharmony_ci#else 351d5ac70f0Sopenharmony_ci uint16_t bank_valid:1; /**< Option flag: bank valid */ 352d5ac70f0Sopenharmony_ci uint16_t reserved:15; /**< Unused */ 353d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 354d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 355d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 356d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 357d5ac70f0Sopenharmony_ci 358d5ac70f0Sopenharmony_ci uint8_t bank_lsb; /**< LSB of bank (7bit) */ 359d5ac70f0Sopenharmony_ci uint8_t bank_msb; /**< MSB of bank (8bit) */ 360d5ac70f0Sopenharmony_ci uint8_t reserved2; /**< Unused */ 361d5ac70f0Sopenharmony_ci uint8_t program; /**< Program number (7bit) */ 362d5ac70f0Sopenharmony_ci#endif 363d5ac70f0Sopenharmony_ci} __attribute((packed)) snd_ump_msg_midi2_program_t; 364d5ac70f0Sopenharmony_ci 365d5ac70f0Sopenharmony_ci/** MIDI 2.0 Channel Pressure (64bit) */ 366d5ac70f0Sopenharmony_citypedef struct _snd_ump_msg_midi2_caf { 367d5ac70f0Sopenharmony_ci#ifdef SNDRV_BIG_ENDIAN_BITFIELD 368d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 369d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 370d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 371d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 372d5ac70f0Sopenharmony_ci uint16_t reserved; /**< Unused */ 373d5ac70f0Sopenharmony_ci 374d5ac70f0Sopenharmony_ci uint32_t data; /** Data (32bit) */ 375d5ac70f0Sopenharmony_ci#else 376d5ac70f0Sopenharmony_ci uint16_t reserved; /**< Unused */ 377d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 378d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 379d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 380d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 381d5ac70f0Sopenharmony_ci 382d5ac70f0Sopenharmony_ci uint32_t data; /** Data (32bit) */ 383d5ac70f0Sopenharmony_ci#endif 384d5ac70f0Sopenharmony_ci} __attribute((packed)) snd_ump_msg_midi2_caf_t; 385d5ac70f0Sopenharmony_ci 386d5ac70f0Sopenharmony_ci/* MIDI 2.0 Pitch Bend (64bit) */ 387d5ac70f0Sopenharmony_citypedef struct _snd_ump_msg_midi2_pitchbend { 388d5ac70f0Sopenharmony_ci#ifdef SNDRV_BIG_ENDIAN_BITFIELD 389d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 390d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 391d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 392d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 393d5ac70f0Sopenharmony_ci uint16_t reserved; /**< Unused */ 394d5ac70f0Sopenharmony_ci 395d5ac70f0Sopenharmony_ci uint32_t data; /** Data (32bit) */ 396d5ac70f0Sopenharmony_ci#else 397d5ac70f0Sopenharmony_ci uint16_t reserved; /**< Unused */ 398d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 399d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 400d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 401d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 402d5ac70f0Sopenharmony_ci 403d5ac70f0Sopenharmony_ci uint32_t data; /** Data (32bit) */ 404d5ac70f0Sopenharmony_ci#endif 405d5ac70f0Sopenharmony_ci} __attribute((packed)) snd_ump_msg_midi2_pitchbend_t; 406d5ac70f0Sopenharmony_ci 407d5ac70f0Sopenharmony_ci/* MIDI 2.0 Per-Note Pitch Bend (64bit) */ 408d5ac70f0Sopenharmony_citypedef struct _snd_ump_msg_midi2_per_note_pitchbend { 409d5ac70f0Sopenharmony_ci#ifdef __BIG_ENDIAN_BITFIELD 410d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 411d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 412d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 413d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 414d5ac70f0Sopenharmony_ci uint8_t note; /**< Note (7bit) */ 415d5ac70f0Sopenharmony_ci uint8_t reserved; /**< Unused */ 416d5ac70f0Sopenharmony_ci 417d5ac70f0Sopenharmony_ci uint32_t data; /**< Data (32bit) */ 418d5ac70f0Sopenharmony_ci#else 419d5ac70f0Sopenharmony_ci /* 0 */ 420d5ac70f0Sopenharmony_ci uint8_t reserved; /**< Unused */ 421d5ac70f0Sopenharmony_ci uint8_t note; /**< Note (7bit) */ 422d5ac70f0Sopenharmony_ci uint8_t channel:4; /**< Channel */ 423d5ac70f0Sopenharmony_ci uint8_t status:4; /**< Status */ 424d5ac70f0Sopenharmony_ci uint8_t group:4; /**< UMP Group */ 425d5ac70f0Sopenharmony_ci uint8_t type:4; /**< UMP packet type */ 426d5ac70f0Sopenharmony_ci 427d5ac70f0Sopenharmony_ci uint32_t data; /**< Data (32bit) */ 428d5ac70f0Sopenharmony_ci#endif 429d5ac70f0Sopenharmony_ci} __attribute((packed)) snd_ump_msg_midi2_per_note_pitchbend_t; 430d5ac70f0Sopenharmony_ci 431d5ac70f0Sopenharmony_ci/** MIDI2 UMP packet (64bit little-endian) */ 432d5ac70f0Sopenharmony_citypedef union _snd_ump_msg_midi2 { 433d5ac70f0Sopenharmony_ci snd_ump_msg_midi2_note_t note_on; 434d5ac70f0Sopenharmony_ci snd_ump_msg_midi2_note_t note_off; 435d5ac70f0Sopenharmony_ci snd_ump_msg_midi2_paf_t poly_pressure; 436d5ac70f0Sopenharmony_ci snd_ump_msg_midi2_per_note_cc_t per_note_acc; 437d5ac70f0Sopenharmony_ci snd_ump_msg_midi2_per_note_cc_t per_note_rcc; 438d5ac70f0Sopenharmony_ci snd_ump_msg_midi2_per_note_mgmt_t per_note_mgmt; 439d5ac70f0Sopenharmony_ci snd_ump_msg_midi2_cc_t control_change; 440d5ac70f0Sopenharmony_ci snd_ump_msg_midi2_rpn_t rpn; 441d5ac70f0Sopenharmony_ci snd_ump_msg_midi2_rpn_t nrpn; 442d5ac70f0Sopenharmony_ci snd_ump_msg_midi2_rpn_t relative_rpn; 443d5ac70f0Sopenharmony_ci snd_ump_msg_midi2_rpn_t relative_nrpn; 444d5ac70f0Sopenharmony_ci snd_ump_msg_midi2_program_t program_change; 445d5ac70f0Sopenharmony_ci snd_ump_msg_midi2_caf_t channel_pressure; 446d5ac70f0Sopenharmony_ci snd_ump_msg_midi2_pitchbend_t pitchbend; 447d5ac70f0Sopenharmony_ci snd_ump_msg_midi2_per_note_pitchbend_t per_note_pitchbend; 448d5ac70f0Sopenharmony_ci snd_ump_msg_hdr_t hdr; 449d5ac70f0Sopenharmony_ci uint32_t raw[2]; 450d5ac70f0Sopenharmony_ci} snd_ump_msg_midi2_t; 451d5ac70f0Sopenharmony_ci 452d5ac70f0Sopenharmony_ci/** 453d5ac70f0Sopenharmony_ci * UMP message type 454d5ac70f0Sopenharmony_ci */ 455d5ac70f0Sopenharmony_cienum { 456d5ac70f0Sopenharmony_ci SND_UMP_MSG_TYPE_UTILITY = 0x00, /* Utility messages */ 457d5ac70f0Sopenharmony_ci SND_UMP_MSG_TYPE_SYSTEM = 0x01, /* System messages */ 458d5ac70f0Sopenharmony_ci SND_UMP_MSG_TYPE_MIDI1_CHANNEL_VOICE = 0x02, /* MIDI 1.0 messages */ 459d5ac70f0Sopenharmony_ci SND_UMP_MSG_TYPE_DATA = 0x03, /* 7bit SysEx messages */ 460d5ac70f0Sopenharmony_ci SND_UMP_MSG_TYPE_MIDI2_CHANNEL_VOICE = 0x04, /* MIDI 2.0 messages */ 461d5ac70f0Sopenharmony_ci SND_UMP_MSG_TYPE_EXTENDED_DATA = 0x05, /* 8bit data message */ 462d5ac70f0Sopenharmony_ci SND_UMP_MSG_TYPE_FLEX_DATA = 0x0d, /* Flexible data messages */ 463d5ac70f0Sopenharmony_ci SND_UMP_MSG_TYPE_STREAM = 0x0f, /* Stream messages */ 464d5ac70f0Sopenharmony_ci}; 465d5ac70f0Sopenharmony_ci 466d5ac70f0Sopenharmony_ci/** 467d5ac70f0Sopenharmony_ci * UMP MIDI 1.0 / 2.0 message status code (4bit) 468d5ac70f0Sopenharmony_ci */ 469d5ac70f0Sopenharmony_cienum { 470d5ac70f0Sopenharmony_ci SND_UMP_MSG_PER_NOTE_RCC = 0x0, 471d5ac70f0Sopenharmony_ci SND_UMP_MSG_PER_NOTE_ACC = 0x1, 472d5ac70f0Sopenharmony_ci SND_UMP_MSG_RPN = 0x2, 473d5ac70f0Sopenharmony_ci SND_UMP_MSG_NRPN = 0x3, 474d5ac70f0Sopenharmony_ci SND_UMP_MSG_RELATIVE_RPN = 0x4, 475d5ac70f0Sopenharmony_ci SND_UMP_MSG_RELATIVE_NRPN = 0x5, 476d5ac70f0Sopenharmony_ci SND_UMP_MSG_PER_NOTE_PITCHBEND = 0x6, 477d5ac70f0Sopenharmony_ci SND_UMP_MSG_NOTE_OFF = 0x8, 478d5ac70f0Sopenharmony_ci SND_UMP_MSG_NOTE_ON = 0x9, 479d5ac70f0Sopenharmony_ci SND_UMP_MSG_POLY_PRESSURE = 0xa, 480d5ac70f0Sopenharmony_ci SND_UMP_MSG_CONTROL_CHANGE = 0xb, 481d5ac70f0Sopenharmony_ci SND_UMP_MSG_PROGRAM_CHANGE = 0xc, 482d5ac70f0Sopenharmony_ci SND_UMP_MSG_CHANNEL_PRESSURE = 0xd, 483d5ac70f0Sopenharmony_ci SND_UMP_MSG_PITCHBEND = 0xe, 484d5ac70f0Sopenharmony_ci SND_UMP_MSG_PER_NOTE_MGMT = 0xf, 485d5ac70f0Sopenharmony_ci}; 486d5ac70f0Sopenharmony_ci 487d5ac70f0Sopenharmony_ci/** 488d5ac70f0Sopenharmony_ci * MIDI System / Realtime message status code (8bit) 489d5ac70f0Sopenharmony_ci */ 490d5ac70f0Sopenharmony_cienum { 491d5ac70f0Sopenharmony_ci SND_UMP_MSG_REALTIME = 0xf0, /* mask */ 492d5ac70f0Sopenharmony_ci SND_UMP_MSG_SYSEX_START = 0xf0, 493d5ac70f0Sopenharmony_ci SND_UMP_MSG_MIDI_TIME_CODE = 0xf1, 494d5ac70f0Sopenharmony_ci SND_UMP_MSG_SONG_POSITION = 0xf2, 495d5ac70f0Sopenharmony_ci SND_UMP_MSG_SONG_SELECT = 0xf3, 496d5ac70f0Sopenharmony_ci SND_UMP_MSG_TUNE_REQUEST = 0xf6, 497d5ac70f0Sopenharmony_ci SND_UMP_MSG_SYSEX_END = 0xf7, 498d5ac70f0Sopenharmony_ci SND_UMP_MSG_TIMING_CLOCK = 0xf8, 499d5ac70f0Sopenharmony_ci SND_UMP_MSG_START = 0xfa, 500d5ac70f0Sopenharmony_ci SND_UMP_MSG_CONTINUE = 0xfb, 501d5ac70f0Sopenharmony_ci SND_UMP_MSG_STOP = 0xfc, 502d5ac70f0Sopenharmony_ci SND_UMP_MSG_ACTIVE_SENSING = 0xfe, 503d5ac70f0Sopenharmony_ci SND_UMP_MSG_RESET = 0xff, 504d5ac70f0Sopenharmony_ci}; 505d5ac70f0Sopenharmony_ci 506d5ac70f0Sopenharmony_ci/** MIDI 2.0 SysEx / Data Status; same values for both 7-bit and 8-bit SysEx */ 507d5ac70f0Sopenharmony_cienum { 508d5ac70f0Sopenharmony_ci SND_UMP_SYSEX_STATUS_SINGLE = 0, 509d5ac70f0Sopenharmony_ci SND_UMP_SYSEX_STATUS_START = 1, 510d5ac70f0Sopenharmony_ci SND_UMP_SYSEX_STATUS_CONTINUE = 2, 511d5ac70f0Sopenharmony_ci SND_UMP_SYSEX_STATUS_END = 3, 512d5ac70f0Sopenharmony_ci}; 513d5ac70f0Sopenharmony_ci 514d5ac70f0Sopenharmony_ci/** UMP Utility Type Status (type 0x0) **/ 515d5ac70f0Sopenharmony_cienum { 516d5ac70f0Sopenharmony_ci SND_UMP_UTILITY_MSG_STATUS_NOOP = 0x00, 517d5ac70f0Sopenharmony_ci SND_UMP_UTILITY_MSG_STATUS_JR_CLOCK = 0x01, 518d5ac70f0Sopenharmony_ci SND_UMP_UTILITY_MSG_STATUS_JR_TSTAMP = 0x02, 519d5ac70f0Sopenharmony_ci SND_UMP_UTILITY_MSG_STATUS_DCTPQ = 0x03, 520d5ac70f0Sopenharmony_ci SND_UMP_UTILITY_MSG_STATUS_DC = 0x04, 521d5ac70f0Sopenharmony_ci}; 522d5ac70f0Sopenharmony_ci 523d5ac70f0Sopenharmony_ci/** UMP Stream Message Status (type 0xf) */ 524d5ac70f0Sopenharmony_cienum { 525d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_STATUS_EP_DISCOVERY = 0x00, 526d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_STATUS_EP_INFO = 0x01, 527d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_STATUS_DEVICE_INFO = 0x02, 528d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_STATUS_EP_NAME = 0x03, 529d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_STATUS_PRODUCT_ID = 0x04, 530d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_STATUS_STREAM_CFG_REQUEST = 0x05, 531d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_STATUS_STREAM_CFG = 0x06, 532d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_STATUS_FB_DISCOVERY = 0x10, 533d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_STATUS_FB_INFO = 0x11, 534d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_STATUS_FB_NAME = 0x12, 535d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_STATUS_START_CLIP = 0x20, 536d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_STATUS_END_CLIP = 0x21, 537d5ac70f0Sopenharmony_ci}; 538d5ac70f0Sopenharmony_ci 539d5ac70f0Sopenharmony_ci/** UMP Endpoint Discovery filter bitmap */ 540d5ac70f0Sopenharmony_cienum { 541d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_REQUEST_EP_INFO = (1U << 0), 542d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_REQUEST_DEVICE_INFO = (1U << 1), 543d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_REQUEST_EP_NAME = (1U << 2), 544d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_REQUEST_PRODUCT_ID = (1U << 3), 545d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_REQUEST_STREAM_CFG = (1U << 4), 546d5ac70f0Sopenharmony_ci}; 547d5ac70f0Sopenharmony_ci 548d5ac70f0Sopenharmony_ci/** UMP Function Block Discovery filter bitmap */ 549d5ac70f0Sopenharmony_cienum { 550d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_REQUEST_FB_INFO = (1U << 0), 551d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_REQUEST_FB_NAME = (1U << 1), 552d5ac70f0Sopenharmony_ci}; 553d5ac70f0Sopenharmony_ci 554d5ac70f0Sopenharmony_ci/** UMP Endpoint Info capability bits (used for protocol request/notify, too) */ 555d5ac70f0Sopenharmony_cienum { 556d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_EP_INFO_CAP_TXJR = (1U << 0), /* Sending JRTS */ 557d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_EP_INFO_CAP_RXJR = (1U << 1), /* Receiving JRTS */ 558d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_EP_INFO_CAP_MIDI1 = (1U << 8), /* MIDI 1.0 */ 559d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_EP_INFO_CAP_MIDI2 = (1U << 9), /* MIDI 2.0 */ 560d5ac70f0Sopenharmony_ci}; 561d5ac70f0Sopenharmony_ci 562d5ac70f0Sopenharmony_ci/** UMP Endpoint / Function Block name string format bits */ 563d5ac70f0Sopenharmony_cienum { 564d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_FORMAT_SINGLE = 0, 565d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_FORMAT_START = 1, 566d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_FORMAT_CONTINUE = 2, 567d5ac70f0Sopenharmony_ci SND_UMP_STREAM_MSG_FORMAT_END = 3, 568d5ac70f0Sopenharmony_ci}; 569d5ac70f0Sopenharmony_ci 570d5ac70f0Sopenharmony_ci/** 571d5ac70f0Sopenharmony_ci * \brief get UMP status (4bit) from 32bit UMP message header 572d5ac70f0Sopenharmony_ci */ 573d5ac70f0Sopenharmony_cistatic inline uint8_t snd_ump_msg_hdr_status(uint32_t ump) 574d5ac70f0Sopenharmony_ci{ 575d5ac70f0Sopenharmony_ci return (ump >> 20) & 0x0f; 576d5ac70f0Sopenharmony_ci} 577d5ac70f0Sopenharmony_ci 578d5ac70f0Sopenharmony_ci/** 579d5ac70f0Sopenharmony_ci * \brief get UMP channel (4bit) from 32bit UMP message header 580d5ac70f0Sopenharmony_ci */ 581d5ac70f0Sopenharmony_cistatic inline uint8_t snd_ump_msg_hdr_channel(uint32_t ump) 582d5ac70f0Sopenharmony_ci{ 583d5ac70f0Sopenharmony_ci return (ump >> 16) & 0x0f; 584d5ac70f0Sopenharmony_ci} 585d5ac70f0Sopenharmony_ci 586d5ac70f0Sopenharmony_ci/** 587d5ac70f0Sopenharmony_ci * \brief get UMP message type (4bit) from 32bit UMP message header 588d5ac70f0Sopenharmony_ci */ 589d5ac70f0Sopenharmony_cistatic inline uint8_t snd_ump_msg_hdr_type(uint32_t ump) 590d5ac70f0Sopenharmony_ci{ 591d5ac70f0Sopenharmony_ci return (ump >> 28); 592d5ac70f0Sopenharmony_ci} 593d5ac70f0Sopenharmony_ci 594d5ac70f0Sopenharmony_ci/** 595d5ac70f0Sopenharmony_ci * \brief check if the given UMP type is a groupless message 596d5ac70f0Sopenharmony_ci */ 597d5ac70f0Sopenharmony_cistatic inline int snd_ump_msg_type_is_groupless(uint8_t type) 598d5ac70f0Sopenharmony_ci{ 599d5ac70f0Sopenharmony_ci return type == SND_UMP_MSG_TYPE_UTILITY || type == SND_UMP_MSG_TYPE_STREAM; 600d5ac70f0Sopenharmony_ci} 601d5ac70f0Sopenharmony_ci 602d5ac70f0Sopenharmony_ci/** 603d5ac70f0Sopenharmony_ci * \brief get UMP group (4bit) from 32bit UMP message header 604d5ac70f0Sopenharmony_ci */ 605d5ac70f0Sopenharmony_cistatic inline uint8_t snd_ump_msg_hdr_group(uint32_t ump) 606d5ac70f0Sopenharmony_ci{ 607d5ac70f0Sopenharmony_ci return (ump >> 24) & 0x0f; 608d5ac70f0Sopenharmony_ci} 609d5ac70f0Sopenharmony_ci 610d5ac70f0Sopenharmony_ci/** 611d5ac70f0Sopenharmony_ci * \brief get UMP status from UMP packet pointer 612d5ac70f0Sopenharmony_ci */ 613d5ac70f0Sopenharmony_cistatic inline uint8_t snd_ump_msg_status(const uint32_t *ump) 614d5ac70f0Sopenharmony_ci{ 615d5ac70f0Sopenharmony_ci return snd_ump_msg_hdr_status(*ump); 616d5ac70f0Sopenharmony_ci} 617d5ac70f0Sopenharmony_ci 618d5ac70f0Sopenharmony_ci/** 619d5ac70f0Sopenharmony_ci * \brief get UMP channel from UMP packet pointer 620d5ac70f0Sopenharmony_ci */ 621d5ac70f0Sopenharmony_cistatic inline uint8_t snd_ump_msg_channel(const uint32_t *ump) 622d5ac70f0Sopenharmony_ci{ 623d5ac70f0Sopenharmony_ci return snd_ump_msg_hdr_channel(*ump); 624d5ac70f0Sopenharmony_ci} 625d5ac70f0Sopenharmony_ci 626d5ac70f0Sopenharmony_ci/** 627d5ac70f0Sopenharmony_ci * \brief get UMP message type from UMP packet pointer 628d5ac70f0Sopenharmony_ci */ 629d5ac70f0Sopenharmony_cistatic inline uint8_t snd_ump_msg_type(const uint32_t *ump) 630d5ac70f0Sopenharmony_ci{ 631d5ac70f0Sopenharmony_ci return snd_ump_msg_hdr_type(*ump); 632d5ac70f0Sopenharmony_ci} 633d5ac70f0Sopenharmony_ci 634d5ac70f0Sopenharmony_ci/** 635d5ac70f0Sopenharmony_ci * \brief get UMP group from UMP packet pointer 636d5ac70f0Sopenharmony_ci */ 637d5ac70f0Sopenharmony_cistatic inline uint8_t snd_ump_msg_group(const uint32_t *ump) 638d5ac70f0Sopenharmony_ci{ 639d5ac70f0Sopenharmony_ci return snd_ump_msg_hdr_group(*ump); 640d5ac70f0Sopenharmony_ci} 641d5ac70f0Sopenharmony_ci 642d5ac70f0Sopenharmony_ci/** 643d5ac70f0Sopenharmony_ci * \brief get UMP sysex message status 644d5ac70f0Sopenharmony_ci */ 645d5ac70f0Sopenharmony_cistatic inline uint8_t snd_ump_sysex_msg_status(const uint32_t *ump) 646d5ac70f0Sopenharmony_ci{ 647d5ac70f0Sopenharmony_ci return (*ump >> 20) & 0xf; 648d5ac70f0Sopenharmony_ci} 649d5ac70f0Sopenharmony_ci 650d5ac70f0Sopenharmony_ci/** 651d5ac70f0Sopenharmony_ci * \brief get UMP sysex message length 652d5ac70f0Sopenharmony_ci */ 653d5ac70f0Sopenharmony_cistatic inline uint8_t snd_ump_sysex_msg_length(const uint32_t *ump) 654d5ac70f0Sopenharmony_ci{ 655d5ac70f0Sopenharmony_ci return (*ump >> 16) & 0xf; 656d5ac70f0Sopenharmony_ci} 657d5ac70f0Sopenharmony_ci 658d5ac70f0Sopenharmony_ciint snd_ump_msg_sysex_expand(const uint32_t *ump, uint8_t *buf, size_t maxlen, 659d5ac70f0Sopenharmony_ci size_t *filled); 660d5ac70f0Sopenharmony_ci 661d5ac70f0Sopenharmony_ci#ifdef __cplusplus 662d5ac70f0Sopenharmony_ci} 663d5ac70f0Sopenharmony_ci#endif 664d5ac70f0Sopenharmony_ci 665d5ac70f0Sopenharmony_ci#endif /* __ALSA_UMP_MSG_H */ 666