At Wed, 17 Dec 2008 14:34:00 +0000, Mark Brown wrote:
On Wed, Dec 17, 2008 at 02:13:34PM +0100, Takashi Iwai wrote:
Jani Nikula wrote:
Add support for reporting new jack types SND_JACK_TVOUT and
This might be better as "video" rather than "TV", identifying the type of video with the descriptive text in the label.
Well, the patch itself looks good to me, but I'm slowly getting nervous about such an addition.
If any more new jack type will come, it'd be the time to consider a better mapping between SW_*_INSERT and SND_JACK_*...
Hrm. Difficult given that the input side has incrementing numbers rather than the bitmask...
Can't we use a simple bit shift? But, hum, it's not 1:1 mapping.
Simplifying the code like below might be still worth, though...
Takashi
---
diff --git a/sound/core/jack.c b/sound/core/jack.c index dd4a12d..c6e34f4 100644 --- a/sound/core/jack.c +++ b/sound/core/jack.c @@ -23,6 +23,11 @@ #include <sound/jack.h> #include <sound/core.h>
+static int jack_types[] = { + SW_HEADPHONE_INSERT, SW_MICROPHONE_INSERT, SW_LINEOUT_INSERT, + SW_JACK_PHYSICAL_INSERT, +}; + static int snd_jack_dev_free(struct snd_device *device) { struct snd_jack *jack = device->device_data; @@ -78,7 +83,7 @@ int snd_jack_new(struct snd_card *card, const char *id, int type, struct snd_jack **jjack) { struct snd_jack *jack; - int err; + int i, err; static struct snd_device_ops ops = { .dev_free = snd_jack_dev_free, .dev_register = snd_jack_dev_register, @@ -100,18 +105,10 @@ int snd_jack_new(struct snd_card *card, const char *id, int type,
jack->type = type;
- if (type & SND_JACK_HEADPHONE) - input_set_capability(jack->input_dev, EV_SW, - SW_HEADPHONE_INSERT); - if (type & SND_JACK_LINEOUT) - input_set_capability(jack->input_dev, EV_SW, - SW_LINEOUT_INSERT); - if (type & SND_JACK_MICROPHONE) - input_set_capability(jack->input_dev, EV_SW, - SW_MICROPHONE_INSERT); - if (type & SND_JACK_MECHANICAL) - input_set_capability(jack->input_dev, EV_SW, - SW_JACK_PHYSICAL_INSERT); + for (i = 0; i < ARRAY_SIZE(jack_types); i++) + if (type & (1 << i)) + input_set_capability(jack->input_dev, EV_SW, + jack_types[i]);
err = snd_device_new(card, SNDRV_DEV_JACK, jack, &ops); if (err < 0) @@ -154,21 +151,17 @@ EXPORT_SYMBOL(snd_jack_set_parent); */ void snd_jack_report(struct snd_jack *jack, int status) { + int i; + if (!jack) return;
- if (jack->type & SND_JACK_HEADPHONE) - input_report_switch(jack->input_dev, SW_HEADPHONE_INSERT, - status & SND_JACK_HEADPHONE); - if (jack->type & SND_JACK_LINEOUT) - input_report_switch(jack->input_dev, SW_LINEOUT_INSERT, - status & SND_JACK_LINEOUT); - if (jack->type & SND_JACK_MICROPHONE) - input_report_switch(jack->input_dev, SW_MICROPHONE_INSERT, - status & SND_JACK_MICROPHONE); - if (jack->type & SND_JACK_MECHANICAL) - input_report_switch(jack->input_dev, SW_JACK_PHYSICAL_INSERT, - status & SND_JACK_MECHANICAL); + for (i = 0; i < ARRAY_SIZE(jack_types); i++) { + int testbit = 1 << i; + if (jack->type & testbit) + input_report_switch(jack->input_dev, jack_types[i], + status & testbit); + }
input_sync(jack->input_dev); }