mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-29 05:40:25 -04:00
Definitely fixed the sorting/find problems for hcontrol & mixer.
This commit is contained in:
parent
6ea4260c1c
commit
e02f9a9650
4 changed files with 22 additions and 22 deletions
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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[] = {
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue