Blame view

sound/core/ctljack.c 2.2 KB
35be544af   Takashi Iwai   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   Takashi Iwai   ALSA: hda - Add m...
13
  #include <linux/export.h>
35be544af   Takashi Iwai   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   Jie Yang   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   Takashi Iwai   ALSA: jack: Fix e...
42
  	while (snd_ctl_find_id(card, &sid)) {
b8dd08667   Jie Yang   ALSA: Jack: handl...
43
  		sid.index++;
7378bc2f1   Takashi Iwai   ALSA: jack: Fix e...
44
45
46
  		/* reset numid; otherwise snd_ctl_find_id() hits this again */
  		sid.numid = 0;
  	}
b8dd08667   Jie Yang   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   Takashi Iwai   ALSA: Introduce c...
63
  struct snd_kcontrol *
2ba2dfa1f   Jie Yang   ALSA: hda - Updat...
64
  snd_kctl_jack_new(const char *name, struct snd_card *card)
35be544af   Takashi Iwai   ALSA: Introduce c...
65
66
  {
  	struct snd_kcontrol *kctl;
b8dd08667   Jie Yang   ALSA: Jack: handl...
67

2ba2dfa1f   Jie Yang   ALSA: hda - Updat...
68
  	kctl = snd_ctl_new1(&jack_detect_kctl, NULL);
35be544af   Takashi Iwai   ALSA: Introduce c...
69
70
  	if (!kctl)
  		return NULL;
b8dd08667   Jie Yang   ALSA: Jack: handl...
71
72
  
  	jack_kctl_name_gen(kctl->id.name, name, sizeof(kctl->id.name));
d0a601c27   Takashi Iwai   ALSA: jack: Fix t...
73
  	kctl->id.index = get_available_index(card, kctl->id.name);
35be544af   Takashi Iwai   ALSA: Introduce c...
74
75
76
  	kctl->private_value = 0;
  	return kctl;
  }
35be544af   Takashi Iwai   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);
  }