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_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);
while (l < u) {
idx = (l + u) / 2;
c = hctl->compare((snd_hctl_elem_t *) id, hctl->pelems[idx]);
- if (c > 0)
+ if (c < 0)
u = idx;
- else if (c < 0)
+ else if (c > 0)
l = idx + 1;
else
break;
assert(dir != 0);
if (dir > 0) {
list_add(&elem->list, &hctl->pelems[idx]->list);
+ idx++;
} else {
list_add_tail(&elem->list, &hctl->pelems[idx]->list);
- idx++;
}
memmove(hctl->pelems + idx + 1,
hctl->pelems + idx,
*name += strlen(*names);
if (**name == ' ')
(*name)++;
- return res;
+ return res+1;
}
}
return NOT_FOUND;
{
static char *names[] = {
"Master",
- "Master Digital",
- "Master Mono",
"Hardware Master",
"Headphone",
"Tone Control",
"3D Control",
"PCM",
- "PCM Front",
- "PCM Rear",
- "PCM Pan",
"Synth",
"FM",
"Wave",
"PC Speaker",
"Aux",
"Mono",
- "Mono Output",
"ADC",
"Capture Source",
"Capture",
"Playback",
"Capture",
"Bypass",
+ "Mono",
+ "Front",
+ "Rear",
+ "Pan",
+ "Output",
NULL
};
static char *names2[] = {
while (l < u) {
idx = (l + u) / 2;
c = mixer->compare(elem, mixer->pelems[idx]);
- if (c > 0)
+ if (c < 0)
u = idx;
- else if (c < 0)
+ else if (c > 0)
l = idx + 1;
else
break;
assert(dir != 0);
if (dir > 0) {
list_add(&elem->list, &mixer->pelems[idx]->list);
+ idx++;
} else {
list_add_tail(&elem->list, &mixer->pelems[idx]->list);
- idx++;
}
memmove(mixer->pelems + idx + 1,
mixer->pelems + idx,
assert(mixer);
assert(mixer->compare);
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++)
list_add_tail(&mixer->pelems[k]->list, &mixer->elems);
return 0;
static int get_compare_weight(const char *name, int index)
{
static char *names[] = {
+ "Master",
"Master Mono",
"Master Digital",
- "Master",
- "Tone Control - Bass",
- "Tone Control - Treble",
- "Synth Tone Control - Bass",
- "Synth Tone Control - Treble",
+ "Bass",
+ "Treble",
"PCM",
"Surround",
"Synth",
melem->private_data = simple;
melem->private_free = selem_free;
INIT_LIST_HEAD(&melem->helems);
+ melem->compare_weight = get_compare_weight(simple->id.name, simple->id.index);
new = 1;
} else {
simple = melem->private_data;
err = snd_mixer_elem_attach(melem, helem);
if (err < 0)
return err;
- melem->compare_weight = get_compare_weight(simple->id.name, simple->id.index);
err = simple_update(melem);
assert(err >= 0);
if (new)
{
selem_t *s1 = c1->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)