]> git.alsa-project.org Git - alsa-lib.git/commitdiff
Fix snd_mixer_sort()
authorTakashi Iwai <tiwai@suse.de>
Tue, 17 May 2005 09:34:18 +0000 (09:34 +0000)
committerTakashi Iwai <tiwai@suse.de>
Tue, 17 May 2005 09:34:18 +0000 (09:34 +0000)
Fixed the wrong pointer use in snd_mixer_sort().
(Patch from https://bugs.gentoo.org/attachment.cgi?id=58918)

src/mixer/mixer.c

index 74d1e79df9d9aaed092dd230d681478be23838c1..7f49a00790dc5b5eb6a74a28d5b597da0d57154b 100644 (file)
@@ -45,6 +45,7 @@ This is an abstraction layer over the hcontrol layer.
 #include <string.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
+#include <pthread.h>
 #include "mixer_local.h"
 
 #ifndef DOC_HIDDEN
@@ -520,14 +521,26 @@ static int snd_mixer_compare_default(const snd_mixer_elem_t *c1,
        return c1->class->compare(c1, c2);
 }
 
-typedef int (*qsort_func)(const void *, const void *);
+static snd_mixer_t *compare_mixer;
+static int mixer_compare(const void *a, const void *b) {
+       return compare_mixer->compare(*(const snd_mixer_elem_t * const *) a,
+                                     *(const snd_mixer_elem_t * const *) b);
+}
+
 static int snd_mixer_sort(snd_mixer_t *mixer)
 {
        unsigned int k;
+       static pthread_mutex_t sync_lock = PTHREAD_MUTEX_INITIALIZER;
+
        assert(mixer);
        assert(mixer->compare);
        INIT_LIST_HEAD(&mixer->elems);
-       qsort(mixer->pelems, mixer->count, sizeof(snd_mixer_elem_t*), (qsort_func)mixer->compare);
+
+       pthread_mutex_lock(&sync_lock);
+       compare_mixer = mixer;
+       qsort(mixer->pelems, mixer->count, sizeof(snd_mixer_elem_t*), mixer_compare);
+       pthread_mutex_unlock(&sync_lock);
+
        for (k = 0; k < mixer->count; k++)
                list_add_tail(&mixer->pelems[k]->list, &mixer->elems);
        return 0;