[ALSA] usb-audio - add selector unit names override for Audigy 2 NX
USB generic driver Add a mechanism to specify source names of selector units, and add such names for the SB Audigy 2 NX. Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
This commit is contained in:
parent
08fe15899d
commit
8e062ec710
@ -70,6 +70,7 @@ struct usb_mixer_build {
|
||||
DECLARE_BITMAP(unitbitmap, 32*32);
|
||||
usb_audio_term_t oterm;
|
||||
const struct usbmix_name_map *map;
|
||||
const struct usbmix_selector_map *selector_map;
|
||||
};
|
||||
|
||||
struct usb_mixer_elem_info {
|
||||
@ -187,6 +188,21 @@ static int check_ignored_ctl(mixer_build_t *state, int unitid, int control)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* get the mapped selector source name */
|
||||
static int check_mapped_selector_name(mixer_build_t *state, int unitid,
|
||||
int index, char *buf, int buflen)
|
||||
{
|
||||
const struct usbmix_selector_map *p;
|
||||
|
||||
if (! state->selector_map)
|
||||
return 0;
|
||||
for (p = state->selector_map; p->id; p++) {
|
||||
if (p->id == unitid && index < p->count)
|
||||
return strlcpy(buf, p->names[index], buflen);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* find an audio control unit with the given unit id
|
||||
*/
|
||||
@ -1415,7 +1431,9 @@ static int parse_audio_selector_unit(mixer_build_t *state, int unitid, unsigned
|
||||
kfree(cval);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (check_input_term(state, desc[5 + i], &iterm) >= 0)
|
||||
len = check_mapped_selector_name(state, unitid, i, namelist[i],
|
||||
MAX_ITEM_NAME_LEN);
|
||||
if (! len && check_input_term(state, desc[5 + i], &iterm) >= 0)
|
||||
len = get_term_name(state, &iterm, namelist[i], MAX_ITEM_NAME_LEN, 0);
|
||||
if (! len)
|
||||
sprintf(namelist[i], "Input %d", i);
|
||||
@ -1521,6 +1539,7 @@ int snd_usb_create_mixer(snd_usb_audio_t *chip, int ctrlif)
|
||||
for (map = usbmix_ctl_maps; map->vendor; map++) {
|
||||
if (map->vendor == state.vendor && map->product == state.product) {
|
||||
state.map = map->map;
|
||||
state.selector_map = map->selector_map;
|
||||
chip->ignore_ctl_error = map->ignore_ctl_error;
|
||||
break;
|
||||
}
|
||||
|
@ -26,10 +26,17 @@ struct usbmix_name_map {
|
||||
int control;
|
||||
};
|
||||
|
||||
struct usbmix_selector_map {
|
||||
int id;
|
||||
int count;
|
||||
const char **names;
|
||||
};
|
||||
|
||||
struct usbmix_ctl_map {
|
||||
int vendor;
|
||||
int product;
|
||||
const struct usbmix_name_map *map;
|
||||
const struct usbmix_selector_map *selector_map;
|
||||
int ignore_ctl_error;
|
||||
};
|
||||
|
||||
@ -162,6 +169,25 @@ static struct usbmix_name_map audigy2nx_map[] = {
|
||||
{ 0 } /* terminator */
|
||||
};
|
||||
|
||||
static struct usbmix_selector_map audigy2nx_selectors[] = {
|
||||
{
|
||||
.id = 14, /* Capture Source */
|
||||
.count = 3,
|
||||
.names = (const char*[]) {"Line", "Digital In", "What-U-Hear"}
|
||||
},
|
||||
{
|
||||
.id = 29, /* Digital Out Source */
|
||||
.count = 3,
|
||||
.names = (const char*[]) {"Front", "PCM", "Digital In"}
|
||||
},
|
||||
{
|
||||
.id = 31, /* Headphone Source */
|
||||
.count = 2,
|
||||
.names = (const char*[]) {"Front", "Side"}
|
||||
},
|
||||
{ 0 } /* terminator */
|
||||
};
|
||||
|
||||
/* LineX FM Transmitter entry - needed to bypass controls bug */
|
||||
static struct usbmix_name_map linex_map[] = {
|
||||
/* 1: IT pcm */
|
||||
@ -198,11 +224,29 @@ static struct usbmix_name_map justlink_map[] = {
|
||||
*/
|
||||
|
||||
static struct usbmix_ctl_map usbmix_ctl_maps[] = {
|
||||
{ 0x41e, 0x3000, extigy_map, 1 },
|
||||
{ 0x41e, 0x3010, mp3plus_map, 0 },
|
||||
{ 0x41e, 0x3020, audigy2nx_map, 0 },
|
||||
{ 0x8bb, 0x2702, linex_map, 1 },
|
||||
{ 0xc45, 0x1158, justlink_map, 0 },
|
||||
{
|
||||
.vendor = 0x41e, .product = 0x3000,
|
||||
.map = extigy_map,
|
||||
.ignore_ctl_error = 1,
|
||||
},
|
||||
{
|
||||
.vendor = 0x41e, .product = 0x3010,
|
||||
.map = mp3plus_map,
|
||||
},
|
||||
{
|
||||
.vendor = 0x41e, .product = 0x3020,
|
||||
.map = audigy2nx_map,
|
||||
.selector_map = audigy2nx_selectors,
|
||||
},
|
||||
{
|
||||
.vendor = 0x8bb, .product = 0x2702,
|
||||
.map = linex_map,
|
||||
.ignore_ctl_error = 1,
|
||||
},
|
||||
{
|
||||
.vendor = 0xc45, .product = 0x1158,
|
||||
.map = justlink_map,
|
||||
},
|
||||
{ 0 } /* terminator */
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user