60 to_consume = *ump_size;
68 midi[size++] = (u[0] >> 16) & 0xff;
69 if (midi[0] >= 0xf1 && midi[0] <= 0xf3) {
70 midi[size++] = (u[0] >> 8) & 0x7f;
72 midi[size++] = u[0] & 0x7f;
76 midi[size++] = (u[0] >> 16);
77 midi[size++] = (u[0] >> 8);
78 if (midi[0] < 0xc0 || midi[0] > 0xdf)
79 midi[size++] = (u[0]);
83 uint8_t status, i, bytes;
85 status = (u[0] >> 20) & 0xf;
86 bytes =
SPA_CLAMP((u[0] >> 16) & 0xf, 0u, 6u);
88 if (status == 0 || status == 1)
90 for (i = 0 ; i < bytes; i++)
92 midi[size++] = u[(i+2)/4] >> ((5-i)%4 * 8);
93 if (status == 0 || status == 3)
99 uint8_t status = (u[0] >> 16) | 0x80;
100 switch (status & 0xf0) {
106 midi[size++] = (status & 0xf) | 0xb0;
108 midi[size++] = (u[1] >> 8) & 0x7f;
112 else if (*state == 1) {
113 midi[size++] = (status & 0xf) | 0xb0;
115 midi[size++] = u[1] & 0x7f;
119 else if (*state == 2) {
120 midi[size++] = status;
121 midi[size++] = (u[1] >> 24) & 0x7f;
126 midi[size++] = status;
127 midi[size++] = (u[1] >> 25);
130 midi[size++] = status;
131 midi[size++] = (u[1] >> 18) & 0x7f;
132 midi[size++] = (u[1] >> 25);
135 midi[size++] = status;
136 midi[size++] = (u[0] >> 8) & 0x7f;
137 midi[size++] = (u[1] >> 25);
148 (*ump_size) -= to_consume;
149 (*ump) =
SPA_PTROFF(*ump, to_consume, uint32_t);
154 uint32_t *ump,
size_t ump_maxsize, uint8_t group, uint64_t *state)
157 uint32_t i, prefix = group << 24, to_consume = 0, bytes;
158 uint8_t status, *m = (*midi), end, prev_state;
162 if (ump_maxsize < 16)
166 prev_state = *state & 0x3;
172 else if (status == 0xf7)
176 prefix |= 0x30000000;
181 bytes =
SPA_CLAMP(*midi_size - to_consume, 0u, 7u);
204 }
else if (*state == 1) {
212 ump[size++] = prefix | bytes << 16;
214 for (i = 0 ; i < bytes; i++)
219 ump[(i+2)/4] |= (m[i] & 0x7f) << ((5-i)%4 * 8);
220 }
else if (status == 0xf7) {
222 if (prev_state == 1) {
224 ump[size++] = prefix;
226 }
else if (prev_state == 2) {
228 ump[size++] = prefix;
241 prefix |= 0x20000000;
245 prefix |= 0x20000000;
249 prefix |= 0x10000000;
251 case 0xf1:
case 0xf3:
253 prefix |= 0x10000000;
257 prefix |= 0x10000000;
262 if (*midi_size < to_consume) {
263 to_consume = *midi_size;
265 prefix |= status << 16;
267 prefix |= (m[1] & 0x7f) << 8;
269 prefix |= (m[2] & 0x7f);
270 ump[size++] = prefix;
273 (*midi_size) -= to_consume;
274 (*midi) += to_consume;
SPA_API_CONTROL_UMP_UTILS int spa_ump_to_midi(const uint32_t **ump, size_t *ump_size, uint8_t *midi, size_t midi_maxsize, uint64_t *state)
Definition ump-utils.h:58
SPA_API_CONTROL_UMP_UTILS int spa_ump_from_midi(uint8_t **midi, size_t *midi_size, uint32_t *ump, size_t ump_maxsize, uint8_t group, uint64_t *state)
Definition ump-utils.h:160
#define SPA_PTROFF(ptr_, offset_, type_)
Return the address (buffer + offset) as pointer of type.
Definition defs.h:223