From 83e4c1ab775126be038116d68d4fa8eae4126736 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Tue, 23 Mar 2021 17:43:30 +0100 Subject: [PATCH] control: add snd_ctl_elem_id_compare_numid() function Idea for the function prototype by Takashi Sakamoto. Signed-off-by: Jaroslav Kysela --- include/control.h | 1 + src/control/control.c | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/include/control.h b/include/control.h index 9e52f4c0..386fbd7d 100644 --- a/include/control.h +++ b/include/control.h @@ -424,6 +424,7 @@ int snd_ctl_elem_id_malloc(snd_ctl_elem_id_t **ptr); void snd_ctl_elem_id_free(snd_ctl_elem_id_t *obj); void snd_ctl_elem_id_clear(snd_ctl_elem_id_t *obj); void snd_ctl_elem_id_copy(snd_ctl_elem_id_t *dst, const snd_ctl_elem_id_t *src); +int snd_ctl_elem_id_compare_numid(const snd_ctl_elem_id_t *id1, const snd_ctl_elem_id_t *id2); int snd_ctl_elem_id_compare_set(const snd_ctl_elem_id_t *id1, const snd_ctl_elem_id_t *id2); unsigned int snd_ctl_elem_id_get_numid(const snd_ctl_elem_id_t *obj); snd_ctl_elem_iface_t snd_ctl_elem_id_get_interface(const snd_ctl_elem_id_t *obj); diff --git a/src/control/control.c b/src/control/control.c index 3f98817c..a3a32a17 100644 --- a/src/control/control.c +++ b/src/control/control.c @@ -1819,6 +1819,32 @@ void snd_ctl_elem_id_copy(snd_ctl_elem_id_t *dst, const snd_ctl_elem_id_t *src) *dst = *src; } +/** + * \brief compare one #snd_ctl_elem_id_t to another using numid + * \param id1 pointer to first id + * \param id2 pointer to second id + * \retval zero when values are identical, other value on a difference (like strcmp) + * + * This comparison ignores the set of fields part. + * + * The return value can be used for sorting like qsort(). It gives persistent + * results. + */ +int snd_ctl_elem_id_compare_numid(const snd_ctl_elem_id_t *id1, const snd_ctl_elem_id_t *id2) +{ + int64_t d; + + assert(id1 && id2); + d = (int64_t)id1->numid - (int64_t)id2->numid; + if (d & ((int64_t)INT_MAX + 1)) { /* fast path */ + if (d > INT_MAX) + d = INT_MAX; + else if (d < INT_MIN) + d = INT_MIN; + } + return d; +} + /** * \brief compare one #snd_ctl_elem_id_t to another * \param id1 pointer to first id -- 2.47.1