diff --git a/include/ump_msg.h b/include/ump_msg.h index 19e4cb28..3d8f95ef 100644 --- a/include/ump_msg.h +++ b/include/ump_msg.h @@ -1003,6 +1003,7 @@ static inline uint8_t snd_ump_sysex_msg_length(const uint32_t *ump) int snd_ump_msg_sysex_expand(const uint32_t *ump, uint8_t *buf, size_t maxlen, size_t *filled); +int snd_ump_packet_length(unsigned int type); #ifdef __cplusplus } diff --git a/src/Versions.in.in b/src/Versions.in.in index c945d6dc..1c40d461 100644 --- a/src/Versions.in.in +++ b/src/Versions.in.in @@ -212,5 +212,6 @@ ALSA_1.2.13 { @SYMBOL_PREFIX@snd_ump_endpoint_info_set_*; @SYMBOL_PREFIX@snd_ump_block_info_clear; @SYMBOL_PREFIX@snd_ump_block_info_set_*; + @SYMBOL_PREFIX@snd_ump_packet_length; #endif } ALSA_1.2.10; diff --git a/src/rawmidi/ump.c b/src/rawmidi/ump.c index fddb60c2..d3676afb 100644 --- a/src/rawmidi/ump.c +++ b/src/rawmidi/ump.c @@ -1072,3 +1072,20 @@ int snd_ump_msg_sysex_expand(const uint32_t *ump, uint8_t *buf, size_t maxlen, return -EINVAL; } } + +/** + * \brief return the length of a UMP packet type + * \param type UMP packet type + * \return the length of the given UMP packet type in 32bit words (from 1 to 4), + * or 0 for negative inputs. + */ +int snd_ump_packet_length(unsigned int type) +{ + static int packet_length[16] = { + 1, 1, 1, 2, 2, 4, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4 + }; + + if (type > 16) + return 0; + return packet_length[type]; +}