Definitely fixed the sorting/find problems for hcontrol & mixer.

This commit is contained in:
Jaroslav Kysela 2001-02-13 14:07:28 +00:00
parent 6ea4260c1c
commit e02f9a9650
4 changed files with 22 additions and 22 deletions

View file

@ -50,7 +50,7 @@ int snd_mixer_wait(snd_mixer_t *mixer, int timeout);
int snd_mixer_set_compare(snd_mixer_t *mixer, snd_mixer_compare_t msort); int snd_mixer_set_compare(snd_mixer_t *mixer, snd_mixer_compare_t msort);
snd_mixer_elem_t *snd_mixer_elem_next(snd_mixer_elem_t *elem); snd_mixer_elem_t *snd_mixer_elem_next(snd_mixer_elem_t *elem);
snd_mixer_elem_t *snd_mixer_elem_prev(snd_mixer_elem_t *helem); snd_mixer_elem_t *snd_mixer_elem_prev(snd_mixer_elem_t *elem);
int snd_mixer_class_unregister(snd_mixer_class_t *clss); int snd_mixer_class_unregister(snd_mixer_class_t *clss);

View file

@ -99,9 +99,9 @@ static int _snd_hctl_find_elem(snd_hctl_t *hctl, const snd_ctl_elem_id_t *id, in
while (l < u) { while (l < u) {
idx = (l + u) / 2; idx = (l + u) / 2;
c = hctl->compare((snd_hctl_elem_t *) id, hctl->pelems[idx]); c = hctl->compare((snd_hctl_elem_t *) id, hctl->pelems[idx]);
if (c > 0) if (c < 0)
u = idx; u = idx;
else if (c < 0) else if (c > 0)
l = idx + 1; l = idx + 1;
else else
break; break;
@ -148,9 +148,9 @@ static int snd_hctl_elem_add(snd_hctl_t *hctl, snd_hctl_elem_t *elem)
assert(dir != 0); assert(dir != 0);
if (dir > 0) { if (dir > 0) {
list_add(&elem->list, &hctl->pelems[idx]->list); list_add(&elem->list, &hctl->pelems[idx]->list);
idx++;
} else { } else {
list_add_tail(&elem->list, &hctl->pelems[idx]->list); list_add_tail(&elem->list, &hctl->pelems[idx]->list);
idx++;
} }
memmove(hctl->pelems + idx + 1, memmove(hctl->pelems + idx + 1,
hctl->pelems + idx, hctl->pelems + idx,
@ -221,7 +221,7 @@ static int snd_hctl_compare_mixer_priority_lookup(char **name, char * const *nam
*name += strlen(*names); *name += strlen(*names);
if (**name == ' ') if (**name == ' ')
(*name)++; (*name)++;
return res; return res+1;
} }
} }
return NOT_FOUND; return NOT_FOUND;
@ -231,16 +231,11 @@ static int snd_hctl_compare_mixer_priority(const char *name)
{ {
static char *names[] = { static char *names[] = {
"Master", "Master",
"Master Digital",
"Master Mono",
"Hardware Master", "Hardware Master",
"Headphone", "Headphone",
"Tone Control", "Tone Control",
"3D Control", "3D Control",
"PCM", "PCM",
"PCM Front",
"PCM Rear",
"PCM Pan",
"Synth", "Synth",
"FM", "FM",
"Wave", "Wave",
@ -254,7 +249,6 @@ static int snd_hctl_compare_mixer_priority(const char *name)
"PC Speaker", "PC Speaker",
"Aux", "Aux",
"Mono", "Mono",
"Mono Output",
"ADC", "ADC",
"Capture Source", "Capture Source",
"Capture", "Capture",
@ -272,6 +266,11 @@ static int snd_hctl_compare_mixer_priority(const char *name)
"Playback", "Playback",
"Capture", "Capture",
"Bypass", "Bypass",
"Mono",
"Front",
"Rear",
"Pan",
"Output",
NULL NULL
}; };
static char *names2[] = { static char *names2[] = {

View file

@ -233,9 +233,9 @@ static int _snd_mixer_find_elem(snd_mixer_t *mixer, snd_mixer_elem_t *elem, int
while (l < u) { while (l < u) {
idx = (l + u) / 2; idx = (l + u) / 2;
c = mixer->compare(elem, mixer->pelems[idx]); c = mixer->compare(elem, mixer->pelems[idx]);
if (c > 0) if (c < 0)
u = idx; u = idx;
else if (c < 0) else if (c > 0)
l = idx + 1; l = idx + 1;
else else
break; break;
@ -268,9 +268,9 @@ int snd_mixer_elem_add(snd_mixer_elem_t *elem, snd_mixer_class_t *class)
assert(dir != 0); assert(dir != 0);
if (dir > 0) { if (dir > 0) {
list_add(&elem->list, &mixer->pelems[idx]->list); list_add(&elem->list, &mixer->pelems[idx]->list);
idx++;
} else { } else {
list_add_tail(&elem->list, &mixer->pelems[idx]->list); list_add_tail(&elem->list, &mixer->pelems[idx]->list);
idx++;
} }
memmove(mixer->pelems + idx + 1, memmove(mixer->pelems + idx + 1,
mixer->pelems + idx, mixer->pelems + idx,
@ -431,7 +431,7 @@ static int snd_mixer_sort(snd_mixer_t *mixer)
assert(mixer); assert(mixer);
assert(mixer->compare); assert(mixer->compare);
INIT_LIST_HEAD(&mixer->elems); INIT_LIST_HEAD(&mixer->elems);
qsort(mixer->pelems, mixer->count, sizeof(snd_mixer_elem_t), compar); qsort(mixer->pelems, mixer->count, sizeof(snd_mixer_elem_t*), compar);
for (k = 0; k < mixer->count; k++) for (k = 0; k < mixer->count; k++)
list_add_tail(&mixer->pelems[k]->list, &mixer->elems); list_add_tail(&mixer->pelems[k]->list, &mixer->elems);
return 0; return 0;

View file

@ -97,13 +97,11 @@ static const char *get_short_name(const char *lname)
static int get_compare_weight(const char *name, int index) static int get_compare_weight(const char *name, int index)
{ {
static char *names[] = { static char *names[] = {
"Master",
"Master Mono", "Master Mono",
"Master Digital", "Master Digital",
"Master", "Bass",
"Tone Control - Bass", "Treble",
"Tone Control - Treble",
"Synth Tone Control - Bass",
"Synth Tone Control - Treble",
"PCM", "PCM",
"Surround", "Surround",
"Synth", "Synth",
@ -692,6 +690,7 @@ int simple_add1(snd_mixer_class_t *class, const char *name,
melem->private_data = simple; melem->private_data = simple;
melem->private_free = selem_free; melem->private_free = selem_free;
INIT_LIST_HEAD(&melem->helems); INIT_LIST_HEAD(&melem->helems);
melem->compare_weight = get_compare_weight(simple->id.name, simple->id.index);
new = 1; new = 1;
} else { } else {
simple = melem->private_data; simple = melem->private_data;
@ -712,7 +711,6 @@ int simple_add1(snd_mixer_class_t *class, const char *name,
err = snd_mixer_elem_attach(melem, helem); err = snd_mixer_elem_attach(melem, helem);
if (err < 0) if (err < 0)
return err; return err;
melem->compare_weight = get_compare_weight(simple->id.name, simple->id.index);
err = simple_update(melem); err = simple_update(melem);
assert(err >= 0); assert(err >= 0);
if (new) if (new)
@ -812,7 +810,10 @@ static int simple_compare(const snd_mixer_elem_t *c1, const snd_mixer_elem_t *c2
{ {
selem_t *s1 = c1->private_data; selem_t *s1 = c1->private_data;
selem_t *s2 = c2->private_data; selem_t *s2 = c2->private_data;
return strcmp(s1->id.name, s2->id.name); int res = strcmp(s1->id.name, s2->id.name);
if (res)
return res;
return s1->id.index - s2->id.index;
} }
int snd_mixer_selem_register(snd_mixer_t *mixer, snd_mixer_class_t **classp) int snd_mixer_selem_register(snd_mixer_t *mixer, snd_mixer_class_t **classp)