1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Universal MIDI Packet (UMP): Message Definitions 4 */ 5 #ifndef __SOUND_UMP_MSG_H 6 #define __SOUND_UMP_MSG_H 7 8 /* MIDI 1.0 / 2.0 Status Code (4bit) */ 9 enum { 10 UMP_MSG_STATUS_PER_NOTE_RCC = 0x0, 11 UMP_MSG_STATUS_PER_NOTE_ACC = 0x1, 12 UMP_MSG_STATUS_RPN = 0x2, 13 UMP_MSG_STATUS_NRPN = 0x3, 14 UMP_MSG_STATUS_RELATIVE_RPN = 0x4, 15 UMP_MSG_STATUS_RELATIVE_NRPN = 0x5, 16 UMP_MSG_STATUS_PER_NOTE_PITCH_BEND = 0x6, 17 UMP_MSG_STATUS_NOTE_OFF = 0x8, 18 UMP_MSG_STATUS_NOTE_ON = 0x9, 19 UMP_MSG_STATUS_POLY_PRESSURE = 0xa, 20 UMP_MSG_STATUS_CC = 0xb, 21 UMP_MSG_STATUS_PROGRAM = 0xc, 22 UMP_MSG_STATUS_CHANNEL_PRESSURE = 0xd, 23 UMP_MSG_STATUS_PITCH_BEND = 0xe, 24 UMP_MSG_STATUS_PER_NOTE_MGMT = 0xf, 25 }; 26 27 /* MIDI 1.0 Channel Control (7bit) */ 28 enum { 29 UMP_CC_BANK_SELECT = 0, 30 UMP_CC_MODULATION = 1, 31 UMP_CC_BREATH = 2, 32 UMP_CC_FOOT = 4, 33 UMP_CC_PORTAMENTO_TIME = 5, 34 UMP_CC_DATA = 6, 35 UMP_CC_VOLUME = 7, 36 UMP_CC_BALANCE = 8, 37 UMP_CC_PAN = 10, 38 UMP_CC_EXPRESSION = 11, 39 UMP_CC_EFFECT_CONTROL_1 = 12, 40 UMP_CC_EFFECT_CONTROL_2 = 13, 41 UMP_CC_GP_1 = 16, 42 UMP_CC_GP_2 = 17, 43 UMP_CC_GP_3 = 18, 44 UMP_CC_GP_4 = 19, 45 UMP_CC_BANK_SELECT_LSB = 32, 46 UMP_CC_MODULATION_LSB = 33, 47 UMP_CC_BREATH_LSB = 34, 48 UMP_CC_FOOT_LSB = 36, 49 UMP_CC_PORTAMENTO_TIME_LSB = 37, 50 UMP_CC_DATA_LSB = 38, 51 UMP_CC_VOLUME_LSB = 39, 52 UMP_CC_BALANCE_LSB = 40, 53 UMP_CC_PAN_LSB = 42, 54 UMP_CC_EXPRESSION_LSB = 43, 55 UMP_CC_EFFECT1_LSB = 44, 56 UMP_CC_EFFECT2_LSB = 45, 57 UMP_CC_GP_1_LSB = 48, 58 UMP_CC_GP_2_LSB = 49, 59 UMP_CC_GP_3_LSB = 50, 60 UMP_CC_GP_4_LSB = 51, 61 UMP_CC_SUSTAIN = 64, 62 UMP_CC_PORTAMENTO_SWITCH = 65, 63 UMP_CC_SOSTENUTO = 66, 64 UMP_CC_SOFT_PEDAL = 67, 65 UMP_CC_LEGATO = 68, 66 UMP_CC_HOLD_2 = 69, 67 UMP_CC_SOUND_CONTROLLER_1 = 70, 68 UMP_CC_SOUND_CONTROLLER_2 = 71, 69 UMP_CC_SOUND_CONTROLLER_3 = 72, 70 UMP_CC_SOUND_CONTROLLER_4 = 73, 71 UMP_CC_SOUND_CONTROLLER_5 = 74, 72 UMP_CC_SOUND_CONTROLLER_6 = 75, 73 UMP_CC_SOUND_CONTROLLER_7 = 76, 74 UMP_CC_SOUND_CONTROLLER_8 = 77, 75 UMP_CC_SOUND_CONTROLLER_9 = 78, 76 UMP_CC_SOUND_CONTROLLER_10 = 79, 77 UMP_CC_GP_5 = 80, 78 UMP_CC_GP_6 = 81, 79 UMP_CC_GP_7 = 82, 80 UMP_CC_GP_8 = 83, 81 UMP_CC_PORTAMENTO_CONTROL = 84, 82 UMP_CC_EFFECT_1 = 91, 83 UMP_CC_EFFECT_2 = 92, 84 UMP_CC_EFFECT_3 = 93, 85 UMP_CC_EFFECT_4 = 94, 86 UMP_CC_EFFECT_5 = 95, 87 UMP_CC_DATA_INC = 96, 88 UMP_CC_DATA_DEC = 97, 89 UMP_CC_NRPN_LSB = 98, 90 UMP_CC_NRPN_MSB = 99, 91 UMP_CC_RPN_LSB = 100, 92 UMP_CC_RPN_MSB = 101, 93 UMP_CC_ALL_SOUND_OFF = 120, 94 UMP_CC_RESET_ALL = 121, 95 UMP_CC_LOCAL_CONTROL = 122, 96 UMP_CC_ALL_NOTES_OFF = 123, 97 UMP_CC_OMNI_OFF = 124, 98 UMP_CC_OMNI_ON = 125, 99 UMP_CC_POLY_OFF = 126, 100 UMP_CC_POLY_ON = 127, 101 }; 102 103 /* MIDI 1.0 / 2.0 System Messages (0xfx) */ 104 enum { 105 UMP_SYSTEM_STATUS_MIDI_TIME_CODE = 0xf1, 106 UMP_SYSTEM_STATUS_SONG_POSITION = 0xf2, 107 UMP_SYSTEM_STATUS_SONG_SELECT = 0xf3, 108 UMP_SYSTEM_STATUS_TUNE_REQUEST = 0xf6, 109 UMP_SYSTEM_STATUS_TIMING_CLOCK = 0xf8, 110 UMP_SYSTEM_STATUS_START = 0xfa, 111 UMP_SYSTEM_STATUS_CONTINUE = 0xfb, 112 UMP_SYSTEM_STATUS_STOP = 0xfc, 113 UMP_SYSTEM_STATUS_ACTIVE_SENSING = 0xfe, 114 UMP_SYSTEM_STATUS_RESET = 0xff, 115 }; 116 117 /* MIDI 1.0 Realtime and SysEx status messages (0xfx) */ 118 enum { 119 UMP_MIDI1_MSG_REALTIME = 0xf0, /* mask */ 120 UMP_MIDI1_MSG_SYSEX_START = 0xf0, 121 UMP_MIDI1_MSG_SYSEX_END = 0xf7, 122 }; 123 124 /* 125 * UMP Message Definitions 126 */ 127 128 /* MIDI 1.0 Note Off / Note On (32bit) */ 129 struct snd_ump_midi1_msg_note { 130 #ifdef __BIG_ENDIAN_BITFIELD 131 u32 type:4; 132 u32 group:4; 133 u32 status:4; 134 u32 channel:4; 135 u32 note:8; 136 u32 velocity:8; 137 #else 138 u32 velocity:8; 139 u32 note:8; 140 u32 channel:4; 141 u32 status:4; 142 u32 group:4; 143 u32 type:4; 144 #endif 145 } __packed; 146 147 /* MIDI 1.0 Poly Pressure (32bit) */ 148 struct snd_ump_midi1_msg_paf { 149 #ifdef __BIG_ENDIAN_BITFIELD 150 u32 type:4; 151 u32 group:4; 152 u32 status:4; 153 u32 channel:4; 154 u32 note:8; 155 u32 data:8; 156 #else 157 u32 data:8; 158 u32 note:8; 159 u32 channel:4; 160 u32 status:4; 161 u32 group:4; 162 u32 type:4; 163 #endif 164 } __packed; 165 166 /* MIDI 1.0 Control Change (32bit) */ 167 struct snd_ump_midi1_msg_cc { 168 #ifdef __BIG_ENDIAN_BITFIELD 169 u32 type:4; 170 u32 group:4; 171 u32 status:4; 172 u32 channel:4; 173 u32 index:8; 174 u32 data:8; 175 #else 176 u32 data:8; 177 u32 index:8; 178 u32 channel:4; 179 u32 status:4; 180 u32 group:4; 181 u32 type:4; 182 #endif 183 } __packed; 184 185 /* MIDI 1.0 Program Change (32bit) */ 186 struct snd_ump_midi1_msg_program { 187 #ifdef __BIG_ENDIAN_BITFIELD 188 u32 type:4; 189 u32 group:4; 190 u32 status:4; 191 u32 channel:4; 192 u32 program:8; 193 u32 reserved:8; 194 #else 195 u32 reserved:8; 196 u32 program:8; 197 u32 channel:4; 198 u32 status:4; 199 u32 group:4; 200 u32 type:4; 201 #endif 202 } __packed; 203 204 /* MIDI 1.0 Channel Pressure (32bit) */ 205 struct snd_ump_midi1_msg_caf { 206 #ifdef __BIG_ENDIAN_BITFIELD 207 u32 type:4; 208 u32 group:4; 209 u32 status:4; 210 u32 channel:4; 211 u32 data:8; 212 u32 reserved:8; 213 #else 214 u32 reserved:8; 215 u32 data:8; 216 u32 channel:4; 217 u32 status:4; 218 u32 group:4; 219 u32 type:4; 220 #endif 221 } __packed; 222 223 /* MIDI 1.0 Pitch Bend (32bit) */ 224 struct snd_ump_midi1_msg_pitchbend { 225 #ifdef __BIG_ENDIAN_BITFIELD 226 u32 type:4; 227 u32 group:4; 228 u32 status:4; 229 u32 channel:4; 230 u32 data_lsb:8; 231 u32 data_msb:8; 232 #else 233 u32 data_msb:8; 234 u32 data_lsb:8; 235 u32 channel:4; 236 u32 status:4; 237 u32 group:4; 238 u32 type:4; 239 #endif 240 } __packed; 241 242 /* System Common and Real Time messages (32bit); no channel field */ 243 struct snd_ump_system_msg { 244 #ifdef __BIG_ENDIAN_BITFIELD 245 u32 type:4; 246 u32 group:4; 247 u32 status:8; 248 u32 parm1:8; 249 u32 parm2:8; 250 #else 251 u32 parm2:8; 252 u32 parm1:8; 253 u32 status:8; 254 u32 group:4; 255 u32 type:4; 256 #endif 257 } __packed; 258 259 /* MIDI 1.0 UMP CVM (32bit) */ 260 union snd_ump_midi1_msg { 261 struct snd_ump_midi1_msg_note note; 262 struct snd_ump_midi1_msg_paf paf; 263 struct snd_ump_midi1_msg_cc cc; 264 struct snd_ump_midi1_msg_program pg; 265 struct snd_ump_midi1_msg_caf caf; 266 struct snd_ump_midi1_msg_pitchbend pb; 267 struct snd_ump_system_msg system; 268 u32 raw; 269 }; 270 271 /* MIDI 2.0 Note Off / Note On (64bit) */ 272 struct snd_ump_midi2_msg_note { 273 #ifdef __BIG_ENDIAN_BITFIELD 274 /* 0 */ 275 u32 type:4; 276 u32 group:4; 277 u32 status:4; 278 u32 channel:4; 279 u32 note:8; 280 u32 attribute_type:8; 281 /* 1 */ 282 u32 velocity:16; 283 u32 attribute_data:16; 284 #else 285 /* 0 */ 286 u32 attribute_type:8; 287 u32 note:8; 288 u32 channel:4; 289 u32 status:4; 290 u32 group:4; 291 u32 type:4; 292 /* 1 */ 293 u32 attribute_data:16; 294 u32 velocity:16; 295 #endif 296 } __packed; 297 298 /* MIDI 2.0 Poly Pressure (64bit) */ 299 struct snd_ump_midi2_msg_paf { 300 #ifdef __BIG_ENDIAN_BITFIELD 301 /* 0 */ 302 u32 type:4; 303 u32 group:4; 304 u32 status:4; 305 u32 channel:4; 306 u32 note:8; 307 u32 reserved:8; 308 /* 1 */ 309 u32 data; 310 #else 311 /* 0 */ 312 u32 reserved:8; 313 u32 note:8; 314 u32 channel:4; 315 u32 status:4; 316 u32 group:4; 317 u32 type:4; 318 /* 1 */ 319 u32 data; 320 #endif 321 } __packed; 322 323 /* MIDI 2.0 Per-Note Controller (64bit) */ 324 struct snd_ump_midi2_msg_pernote_cc { 325 #ifdef __BIG_ENDIAN_BITFIELD 326 /* 0 */ 327 u32 type:4; 328 u32 group:4; 329 u32 status:4; 330 u32 channel:4; 331 u32 note:8; 332 u32 index:8; 333 /* 1 */ 334 u32 data; 335 #else 336 /* 0 */ 337 u32 index:8; 338 u32 note:8; 339 u32 channel:4; 340 u32 status:4; 341 u32 group:4; 342 u32 type:4; 343 /* 1 */ 344 u32 data; 345 #endif 346 } __packed; 347 348 /* MIDI 2.0 Per-Note Management (64bit) */ 349 struct snd_ump_midi2_msg_pernote_mgmt { 350 #ifdef __BIG_ENDIAN_BITFIELD 351 /* 0 */ 352 u32 type:4; 353 u32 group:4; 354 u32 status:4; 355 u32 channel:4; 356 u32 note:8; 357 u32 flags:8; 358 /* 1 */ 359 u32 reserved; 360 #else 361 /* 0 */ 362 u32 flags:8; 363 u32 note:8; 364 u32 channel:4; 365 u32 status:4; 366 u32 group:4; 367 u32 type:4; 368 /* 1 */ 369 u32 reserved; 370 #endif 371 } __packed; 372 373 /* MIDI 2.0 Control Change (64bit) */ 374 struct snd_ump_midi2_msg_cc { 375 #ifdef __BIG_ENDIAN_BITFIELD 376 /* 0 */ 377 u32 type:4; 378 u32 group:4; 379 u32 status:4; 380 u32 channel:4; 381 u32 index:8; 382 u32 reserved:8; 383 /* 1 */ 384 u32 data; 385 #else 386 /* 0 */ 387 u32 reserved:8; 388 u32 index:8; 389 u32 channel:4; 390 u32 status:4; 391 u32 group:4; 392 u32 type:4; 393 /* 1 */ 394 u32 data; 395 #endif 396 } __packed; 397 398 /* MIDI 2.0 Registered Controller (RPN) / Assignable Controller (NRPN) (64bit) */ 399 struct snd_ump_midi2_msg_rpn { 400 #ifdef __BIG_ENDIAN_BITFIELD 401 /* 0 */ 402 u32 type:4; 403 u32 group:4; 404 u32 status:4; 405 u32 channel:4; 406 u32 bank:8; 407 u32 index:8; 408 /* 1 */ 409 u32 data; 410 #else 411 /* 0 */ 412 u32 index:8; 413 u32 bank:8; 414 u32 channel:4; 415 u32 status:4; 416 u32 group:4; 417 u32 type:4; 418 /* 1 */ 419 u32 data; 420 #endif 421 } __packed; 422 423 /* MIDI 2.0 Program Change (64bit) */ 424 struct snd_ump_midi2_msg_program { 425 #ifdef __BIG_ENDIAN_BITFIELD 426 /* 0 */ 427 u32 type:4; 428 u32 group:4; 429 u32 status:4; 430 u32 channel:4; 431 u32 reserved:15; 432 u32 bank_valid:1; 433 /* 1 */ 434 u32 program:8; 435 u32 reserved2:8; 436 u32 bank_msb:8; 437 u32 bank_lsb:8; 438 #else 439 /* 0 */ 440 u32 bank_valid:1; 441 u32 reserved:15; 442 u32 channel:4; 443 u32 status:4; 444 u32 group:4; 445 u32 type:4; 446 /* 1 */ 447 u32 bank_lsb:8; 448 u32 bank_msb:8; 449 u32 reserved2:8; 450 u32 program:8; 451 #endif 452 } __packed; 453 454 /* MIDI 2.0 Channel Pressure (64bit) */ 455 struct snd_ump_midi2_msg_caf { 456 #ifdef __BIG_ENDIAN_BITFIELD 457 /* 0 */ 458 u32 type:4; 459 u32 group:4; 460 u32 status:4; 461 u32 channel:4; 462 u32 reserved:16; 463 /* 1 */ 464 u32 data; 465 #else 466 /* 0 */ 467 u32 reserved:16; 468 u32 channel:4; 469 u32 status:4; 470 u32 group:4; 471 u32 type:4; 472 /* 1 */ 473 u32 data; 474 #endif 475 } __packed; 476 477 /* MIDI 2.0 Pitch Bend (64bit) */ 478 struct snd_ump_midi2_msg_pitchbend { 479 #ifdef __BIG_ENDIAN_BITFIELD 480 /* 0 */ 481 u32 type:4; 482 u32 group:4; 483 u32 status:4; 484 u32 channel:4; 485 u32 reserved:16; 486 /* 1 */ 487 u32 data; 488 #else 489 /* 0 */ 490 u32 reserved:16; 491 u32 channel:4; 492 u32 status:4; 493 u32 group:4; 494 u32 type:4; 495 /* 1 */ 496 u32 data; 497 #endif 498 } __packed; 499 500 /* MIDI 2.0 Per-Note Pitch Bend (64bit) */ 501 struct snd_ump_midi2_msg_pernote_pitchbend { 502 #ifdef __BIG_ENDIAN_BITFIELD 503 /* 0 */ 504 u32 type:4; 505 u32 group:4; 506 u32 status:4; 507 u32 channel:4; 508 u32 note:8; 509 u32 reserved:8; 510 /* 1 */ 511 u32 data; 512 #else 513 /* 0 */ 514 u32 reserved:8; 515 u32 note:8; 516 u32 channel:4; 517 u32 status:4; 518 u32 group:4; 519 u32 type:4; 520 /* 1 */ 521 u32 data; 522 #endif 523 } __packed; 524 525 /* MIDI 2.0 UMP CVM (64bit) */ 526 union snd_ump_midi2_msg { 527 struct snd_ump_midi2_msg_note note; 528 struct snd_ump_midi2_msg_paf paf; 529 struct snd_ump_midi2_msg_pernote_cc pernote_cc; 530 struct snd_ump_midi2_msg_pernote_mgmt pernote_mgmt; 531 struct snd_ump_midi2_msg_cc cc; 532 struct snd_ump_midi2_msg_rpn rpn; 533 struct snd_ump_midi2_msg_program pg; 534 struct snd_ump_midi2_msg_caf caf; 535 struct snd_ump_midi2_msg_pitchbend pb; 536 struct snd_ump_midi2_msg_pernote_pitchbend pernote_pb; 537 u32 raw[2]; 538 }; 539 540 /* UMP Stream Message: Endpoint Discovery (128bit) */ 541 struct snd_ump_stream_msg_ep_discovery { 542 #ifdef __BIG_ENDIAN_BITFIELD 543 /* 0 */ 544 u32 type:4; 545 u32 format:2; 546 u32 status:10; 547 u32 ump_version_major:8; 548 u32 ump_version_minor:8; 549 /* 1 */ 550 u32 reserved:24; 551 u32 filter_bitmap:8; 552 /* 2-3 */ 553 u32 reserved2[2]; 554 #else 555 /* 0 */ 556 u32 ump_version_minor:8; 557 u32 ump_version_major:8; 558 u32 status:10; 559 u32 format:2; 560 u32 type:4; 561 /* 1 */ 562 u32 filter_bitmap:8; 563 u32 reserved:24; 564 /* 2-3 */ 565 u32 reserved2[2]; 566 #endif 567 } __packed; 568 569 /* UMP Stream Message: Endpoint Info Notification (128bit) */ 570 struct snd_ump_stream_msg_ep_info { 571 #ifdef __BIG_ENDIAN_BITFIELD 572 /* 0 */ 573 u32 type:4; 574 u32 format:2; 575 u32 status:10; 576 u32 ump_version_major:8; 577 u32 ump_version_minor:8; 578 /* 1 */ 579 u32 static_function_block:1; 580 u32 num_function_blocks:7; 581 u32 reserved:8; 582 u32 protocol:8; 583 u32 reserved2:6; 584 u32 jrts:2; 585 /* 2-3 */ 586 u32 reserved3[2]; 587 #else 588 /* 0 */ 589 u32 ump_version_minor:8; 590 u32 ump_version_major:8; 591 u32 status:10; 592 u32 format:2; 593 u32 type:4; 594 /* 1 */ 595 u32 jrts:2; 596 u32 reserved2:6; 597 u32 protocol:8; 598 u32 reserved:8; 599 u32 num_function_blocks:7; 600 u32 static_function_block:1; 601 /* 2-3 */ 602 u32 reserved3[2]; 603 #endif 604 } __packed; 605 606 /* UMP Stream Message: Device Info Notification (128bit) */ 607 struct snd_ump_stream_msg_devince_info { 608 #ifdef __BIG_ENDIAN_BITFIELD 609 /* 0 */ 610 u32 type:4; 611 u32 format:2; 612 u32 status:10; 613 u32 reserved:16; 614 /* 1 */ 615 u32 manufacture_id; 616 /* 2 */ 617 u8 family_lsb; 618 u8 family_msb; 619 u8 model_lsb; 620 u8 model_msb; 621 /* 3 */ 622 u32 sw_revision; 623 #else 624 /* 0 */ 625 u32 reserved:16; 626 u32 status:10; 627 u32 format:2; 628 u32 type:4; 629 /* 1 */ 630 u32 manufacture_id; 631 /* 2 */ 632 u8 model_msb; 633 u8 model_lsb; 634 u8 family_msb; 635 u8 family_lsb; 636 /* 3 */ 637 u32 sw_revision; 638 #endif 639 } __packed; 640 641 /* UMP Stream Message: Stream Config Request / Notification (128bit) */ 642 struct snd_ump_stream_msg_stream_cfg { 643 #ifdef __BIG_ENDIAN_BITFIELD 644 /* 0 */ 645 u32 type:4; 646 u32 format:2; 647 u32 status:10; 648 u32 protocol:8; 649 u32 reserved:6; 650 u32 jrts:2; 651 /* 1-3 */ 652 u32 reserved2[3]; 653 #else 654 /* 0 */ 655 u32 jrts:2; 656 u32 reserved:6; 657 u32 protocol:8; 658 u32 status:10; 659 u32 format:2; 660 u32 type:4; 661 /* 1-3 */ 662 u32 reserved2[3]; 663 #endif 664 } __packed; 665 666 /* UMP Stream Message: Function Block Discovery (128bit) */ 667 struct snd_ump_stream_msg_fb_discovery { 668 #ifdef __BIG_ENDIAN_BITFIELD 669 /* 0 */ 670 u32 type:4; 671 u32 format:2; 672 u32 status:10; 673 u32 function_block_id:8; 674 u32 filter:8; 675 /* 1-3 */ 676 u32 reserved[3]; 677 #else 678 /* 0 */ 679 u32 filter:8; 680 u32 function_block_id:8; 681 u32 status:10; 682 u32 format:2; 683 u32 type:4; 684 /* 1-3 */ 685 u32 reserved[3]; 686 #endif 687 } __packed; 688 689 /* UMP Stream Message: Function Block Info Notification (128bit) */ 690 struct snd_ump_stream_msg_fb_info { 691 #ifdef __BIG_ENDIAN_BITFIELD 692 /* 0 */ 693 u32 type:4; 694 u32 format:2; 695 u32 status:10; 696 u32 active:1; 697 u32 function_block_id:7; 698 u32 reserved:2; 699 u32 ui_hint:2; 700 u32 midi_10:2; 701 u32 direction:2; 702 /* 1 */ 703 u32 first_group:8; 704 u32 num_groups:8; 705 u32 midi_ci_version:8; 706 u32 sysex8_streams:8; 707 /* 2-3 */ 708 u32 reserved2[2]; 709 #else 710 /* 0 */ 711 u32 direction:2; 712 u32 midi_10:2; 713 u32 ui_hint:2; 714 u32 reserved:2; 715 u32 function_block_id:7; 716 u32 active:1; 717 u32 status:10; 718 u32 format:2; 719 u32 type:4; 720 /* 1 */ 721 u32 sysex8_streams:8; 722 u32 midi_ci_version:8; 723 u32 num_groups:8; 724 u32 first_group:8; 725 /* 2-3 */ 726 u32 reserved2[2]; 727 #endif 728 } __packed; 729 730 /* UMP Stream Message: Function Block Name Notification (128bit) */ 731 struct snd_ump_stream_msg_fb_name { 732 #ifdef __BIG_ENDIAN_BITFIELD 733 /* 0 */ 734 u16 type:4; 735 u16 format:2; 736 u16 status:10; 737 u8 function_block_id; 738 u8 name0; 739 /* 1-3 */ 740 u8 name[12]; 741 #else 742 /* 0 */ 743 u8 name0; 744 u8 function_block_id; 745 u16 status:10; 746 u16 format:2; 747 u16 type:4; 748 /* 1-3 */ 749 u8 name[12]; // FIXME: byte order 750 #endif 751 } __packed; 752 753 /* MIDI 2.0 Stream Messages (128bit) */ 754 union snd_ump_stream_msg { 755 struct snd_ump_stream_msg_ep_discovery ep_discovery; 756 struct snd_ump_stream_msg_ep_info ep_info; 757 struct snd_ump_stream_msg_devince_info device_info; 758 struct snd_ump_stream_msg_stream_cfg stream_cfg; 759 struct snd_ump_stream_msg_fb_discovery fb_discovery; 760 struct snd_ump_stream_msg_fb_info fb_info; 761 struct snd_ump_stream_msg_fb_name fb_name; 762 u32 raw[4]; 763 }; 764 765 #endif /* __SOUND_UMP_MSG_H */ 766