Blame view
sound/core/ctljack.c
2.2 KB
35be544af ALSA: Introduce c... |
1 2 3 4 5 6 7 8 9 10 11 12 |
/* * Helper functions for jack-detection kcontrols * * Copyright (c) 2011 Takashi Iwai <tiwai@suse.de> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. */ #include <linux/kernel.h> |
bf815bf0a ALSA: hda - Add m... |
13 |
#include <linux/export.h> |
35be544af ALSA: Introduce c... |
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#include <sound/core.h> #include <sound/control.h> #define jack_detect_kctl_info snd_ctl_boolean_mono_info static int jack_detect_kctl_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { ucontrol->value.integer.value[0] = kcontrol->private_value; return 0; } static struct snd_kcontrol_new jack_detect_kctl = { /* name is filled later */ .iface = SNDRV_CTL_ELEM_IFACE_CARD, .access = SNDRV_CTL_ELEM_ACCESS_READ, .info = jack_detect_kctl_info, .get = jack_detect_kctl_get, }; |
b8dd08667 ALSA: Jack: handl... |
33 34 35 36 37 38 39 40 41 |
static int get_available_index(struct snd_card *card, const char *name) { struct snd_ctl_elem_id sid; memset(&sid, 0, sizeof(sid)); sid.index = 0; sid.iface = SNDRV_CTL_ELEM_IFACE_CARD; strlcpy(sid.name, name, sizeof(sid.name)); |
7378bc2f1 ALSA: jack: Fix e... |
42 |
while (snd_ctl_find_id(card, &sid)) { |
b8dd08667 ALSA: Jack: handl... |
43 |
sid.index++; |
7378bc2f1 ALSA: jack: Fix e... |
44 45 46 |
/* reset numid; otherwise snd_ctl_find_id() hits this again */ sid.numid = 0; } |
b8dd08667 ALSA: Jack: handl... |
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
return sid.index; } static void jack_kctl_name_gen(char *name, const char *src_name, int size) { size_t count = strlen(src_name); bool need_cat = true; /* remove redundant " Jack" from src_name */ if (count >= 5) need_cat = strncmp(&src_name[count - 5], " Jack", 5) ? true : false; snprintf(name, size, need_cat ? "%s Jack" : "%s", src_name); } |
35be544af ALSA: Introduce c... |
63 |
struct snd_kcontrol * |
2ba2dfa1f ALSA: hda - Updat... |
64 |
snd_kctl_jack_new(const char *name, struct snd_card *card) |
35be544af ALSA: Introduce c... |
65 66 |
{ struct snd_kcontrol *kctl; |
b8dd08667 ALSA: Jack: handl... |
67 |
|
2ba2dfa1f ALSA: hda - Updat... |
68 |
kctl = snd_ctl_new1(&jack_detect_kctl, NULL); |
35be544af ALSA: Introduce c... |
69 70 |
if (!kctl) return NULL; |
b8dd08667 ALSA: Jack: handl... |
71 72 |
jack_kctl_name_gen(kctl->id.name, name, sizeof(kctl->id.name)); |
d0a601c27 ALSA: jack: Fix t... |
73 |
kctl->id.index = get_available_index(card, kctl->id.name); |
35be544af ALSA: Introduce c... |
74 75 76 |
kctl->private_value = 0; return kctl; } |
35be544af ALSA: Introduce c... |
77 78 79 80 81 82 83 84 85 |
void snd_kctl_jack_report(struct snd_card *card, struct snd_kcontrol *kctl, bool status) { if (kctl->private_value == status) return; kctl->private_value = status; snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, &kctl->id); } |