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