mirror of https://gitee.com/openkylin/linux.git
[ALSA] usb-audio - change quirk type handling
USB generic driver Make the quirk type an enum instead of a #defined integer, and use a table for the quirk constructor functions instead of a big switch statement. Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
This commit is contained in:
parent
f38275fe99
commit
854af9578c
|
@ -2735,7 +2735,8 @@ static int create_standard_interface_quirk(snd_usb_audio_t *chip,
|
|||
* to detect the sample rate is by looking at wMaxPacketSize.
|
||||
*/
|
||||
static int create_ua700_ua25_quirk(snd_usb_audio_t *chip,
|
||||
struct usb_interface *iface)
|
||||
struct usb_interface *iface,
|
||||
const snd_usb_audio_quirk_t *quirk)
|
||||
{
|
||||
static const struct audioformat ua_format = {
|
||||
.format = SNDRV_PCM_FORMAT_S24_3LE,
|
||||
|
@ -2826,7 +2827,9 @@ static int create_ua700_ua25_quirk(snd_usb_audio_t *chip,
|
|||
/*
|
||||
* Create a stream for an Edirol UA-1000 interface.
|
||||
*/
|
||||
static int create_ua1000_quirk(snd_usb_audio_t *chip, struct usb_interface *iface)
|
||||
static int create_ua1000_quirk(snd_usb_audio_t *chip,
|
||||
struct usb_interface *iface,
|
||||
const snd_usb_audio_quirk_t *quirk)
|
||||
{
|
||||
static const struct audioformat ua1000_format = {
|
||||
.format = SNDRV_PCM_FORMAT_S32_LE,
|
||||
|
@ -2903,6 +2906,13 @@ static int create_composite_quirk(snd_usb_audio_t *chip,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int ignore_interface_quirk(snd_usb_audio_t *chip,
|
||||
struct usb_interface *iface,
|
||||
const snd_usb_audio_quirk_t *quirk)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* boot quirks
|
||||
|
@ -2965,29 +2975,28 @@ static int snd_usb_create_quirk(snd_usb_audio_t *chip,
|
|||
struct usb_interface *iface,
|
||||
const snd_usb_audio_quirk_t *quirk)
|
||||
{
|
||||
switch (quirk->type) {
|
||||
case QUIRK_MIDI_FIXED_ENDPOINT:
|
||||
case QUIRK_MIDI_YAMAHA:
|
||||
case QUIRK_MIDI_MIDIMAN:
|
||||
case QUIRK_MIDI_NOVATION:
|
||||
case QUIRK_MIDI_RAW:
|
||||
case QUIRK_MIDI_EMAGIC:
|
||||
case QUIRK_MIDI_MIDITECH:
|
||||
return snd_usb_create_midi_interface(chip, iface, quirk);
|
||||
case QUIRK_COMPOSITE:
|
||||
return create_composite_quirk(chip, iface, quirk);
|
||||
case QUIRK_AUDIO_FIXED_ENDPOINT:
|
||||
return create_fixed_stream_quirk(chip, iface, quirk);
|
||||
case QUIRK_AUDIO_STANDARD_INTERFACE:
|
||||
case QUIRK_MIDI_STANDARD_INTERFACE:
|
||||
return create_standard_interface_quirk(chip, iface, quirk);
|
||||
case QUIRK_AUDIO_EDIROL_UA700_UA25:
|
||||
return create_ua700_ua25_quirk(chip, iface);
|
||||
case QUIRK_AUDIO_EDIROL_UA1000:
|
||||
return create_ua1000_quirk(chip, iface);
|
||||
case QUIRK_IGNORE_INTERFACE:
|
||||
return 0;
|
||||
default:
|
||||
typedef int (*quirk_func_t)(snd_usb_audio_t *, struct usb_interface *,
|
||||
const snd_usb_audio_quirk_t *);
|
||||
static const quirk_func_t quirk_funcs[] = {
|
||||
[QUIRK_IGNORE_INTERFACE] = ignore_interface_quirk,
|
||||
[QUIRK_COMPOSITE] = create_composite_quirk,
|
||||
[QUIRK_MIDI_STANDARD_INTERFACE] = snd_usb_create_midi_interface,
|
||||
[QUIRK_MIDI_FIXED_ENDPOINT] = snd_usb_create_midi_interface,
|
||||
[QUIRK_MIDI_YAMAHA] = snd_usb_create_midi_interface,
|
||||
[QUIRK_MIDI_MIDIMAN] = snd_usb_create_midi_interface,
|
||||
[QUIRK_MIDI_NOVATION] = snd_usb_create_midi_interface,
|
||||
[QUIRK_MIDI_RAW] = snd_usb_create_midi_interface,
|
||||
[QUIRK_MIDI_EMAGIC] = snd_usb_create_midi_interface,
|
||||
[QUIRK_MIDI_MIDITECH] = snd_usb_create_midi_interface,
|
||||
[QUIRK_AUDIO_STANDARD_INTERFACE] = create_standard_interface_quirk,
|
||||
[QUIRK_AUDIO_FIXED_ENDPOINT] = create_fixed_stream_quirk,
|
||||
[QUIRK_AUDIO_EDIROL_UA700_UA25] = create_ua700_ua25_quirk,
|
||||
[QUIRK_AUDIO_EDIROL_UA1000] = create_ua1000_quirk,
|
||||
};
|
||||
|
||||
if (quirk->type < QUIRK_TYPE_COUNT) {
|
||||
return quirk_funcs[quirk->type](chip, iface, quirk);
|
||||
} else {
|
||||
snd_printd(KERN_ERR "invalid quirk type %d\n", quirk->type);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
|
|
@ -153,21 +153,24 @@ struct snd_usb_audio {
|
|||
#define QUIRK_NO_INTERFACE -2
|
||||
#define QUIRK_ANY_INTERFACE -1
|
||||
|
||||
/* quirk type */
|
||||
#define QUIRK_MIDI_FIXED_ENDPOINT 0
|
||||
#define QUIRK_MIDI_YAMAHA 1
|
||||
#define QUIRK_MIDI_MIDIMAN 2
|
||||
#define QUIRK_COMPOSITE 3
|
||||
#define QUIRK_AUDIO_FIXED_ENDPOINT 4
|
||||
#define QUIRK_AUDIO_STANDARD_INTERFACE 5
|
||||
#define QUIRK_MIDI_STANDARD_INTERFACE 6
|
||||
#define QUIRK_AUDIO_EDIROL_UA700_UA25 7
|
||||
#define QUIRK_AUDIO_EDIROL_UA1000 8
|
||||
#define QUIRK_IGNORE_INTERFACE 9
|
||||
#define QUIRK_MIDI_NOVATION 10
|
||||
#define QUIRK_MIDI_RAW 11
|
||||
#define QUIRK_MIDI_EMAGIC 12
|
||||
#define QUIRK_MIDI_MIDITECH 13
|
||||
enum quirk_type {
|
||||
QUIRK_IGNORE_INTERFACE,
|
||||
QUIRK_COMPOSITE,
|
||||
QUIRK_MIDI_STANDARD_INTERFACE,
|
||||
QUIRK_MIDI_FIXED_ENDPOINT,
|
||||
QUIRK_MIDI_YAMAHA,
|
||||
QUIRK_MIDI_MIDIMAN,
|
||||
QUIRK_MIDI_NOVATION,
|
||||
QUIRK_MIDI_RAW,
|
||||
QUIRK_MIDI_EMAGIC,
|
||||
QUIRK_MIDI_MIDITECH,
|
||||
QUIRK_AUDIO_STANDARD_INTERFACE,
|
||||
QUIRK_AUDIO_FIXED_ENDPOINT,
|
||||
QUIRK_AUDIO_EDIROL_UA700_UA25,
|
||||
QUIRK_AUDIO_EDIROL_UA1000,
|
||||
|
||||
QUIRK_TYPE_COUNT
|
||||
};
|
||||
|
||||
typedef struct snd_usb_audio_quirk snd_usb_audio_quirk_t;
|
||||
typedef struct snd_usb_midi_endpoint_info snd_usb_midi_endpoint_info_t;
|
||||
|
@ -176,7 +179,7 @@ struct snd_usb_audio_quirk {
|
|||
const char *vendor_name;
|
||||
const char *product_name;
|
||||
int16_t ifnum;
|
||||
int16_t type;
|
||||
uint16_t type;
|
||||
const void *data;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue