2 * Driver for Digigram VXpocket soundcards
6 * Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include <sound/driver.h>
24 #include <sound/core.h>
25 #include <sound/control.h>
28 #define MIC_LEVEL_MIN 0
29 #define MIC_LEVEL_MAX 8
32 * mic level control (for VXPocket)
34 static int vx_mic_level_info(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
*uinfo
)
36 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_INTEGER
;
38 uinfo
->value
.integer
.min
= 0;
39 uinfo
->value
.integer
.max
= MIC_LEVEL_MAX
;
43 static int vx_mic_level_get(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_value_t
*ucontrol
)
45 vx_core_t
*_chip
= snd_kcontrol_chip(kcontrol
);
46 struct snd_vxpocket
*chip
= (struct snd_vxpocket
*)_chip
;
47 ucontrol
->value
.integer
.value
[0] = chip
->mic_level
;
51 static int vx_mic_level_put(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_value_t
*ucontrol
)
53 vx_core_t
*_chip
= snd_kcontrol_chip(kcontrol
);
54 struct snd_vxpocket
*chip
= (struct snd_vxpocket
*)_chip
;
55 down(&_chip
->mixer_mutex
);
56 if (chip
->mic_level
!= ucontrol
->value
.integer
.value
[0]) {
57 vx_set_mic_level(_chip
, ucontrol
->value
.integer
.value
[0]);
58 chip
->mic_level
= ucontrol
->value
.integer
.value
[0];
59 up(&_chip
->mixer_mutex
);
62 up(&_chip
->mixer_mutex
);
66 static snd_kcontrol_new_t vx_control_mic_level
= {
67 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
68 .name
= "Mic Capture Volume",
69 .info
= vx_mic_level_info
,
70 .get
= vx_mic_level_get
,
71 .put
= vx_mic_level_put
,
75 * mic boost level control (for VXP440)
77 static int vx_mic_boost_info(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
*uinfo
)
79 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_BOOLEAN
;
81 uinfo
->value
.integer
.min
= 0;
82 uinfo
->value
.integer
.max
= 1;
86 static int vx_mic_boost_get(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_value_t
*ucontrol
)
88 vx_core_t
*_chip
= snd_kcontrol_chip(kcontrol
);
89 struct snd_vxpocket
*chip
= (struct snd_vxpocket
*)_chip
;
90 ucontrol
->value
.integer
.value
[0] = chip
->mic_level
;
94 static int vx_mic_boost_put(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_value_t
*ucontrol
)
96 vx_core_t
*_chip
= snd_kcontrol_chip(kcontrol
);
97 struct snd_vxpocket
*chip
= (struct snd_vxpocket
*)_chip
;
98 down(&_chip
->mixer_mutex
);
99 if (chip
->mic_level
!= ucontrol
->value
.integer
.value
[0]) {
100 vx_set_mic_boost(_chip
, ucontrol
->value
.integer
.value
[0]);
101 chip
->mic_level
= ucontrol
->value
.integer
.value
[0];
102 up(&_chip
->mixer_mutex
);
105 up(&_chip
->mixer_mutex
);
109 static snd_kcontrol_new_t vx_control_mic_boost
= {
110 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
112 .info
= vx_mic_boost_info
,
113 .get
= vx_mic_boost_get
,
114 .put
= vx_mic_boost_put
,
118 int vxp_add_mic_controls(vx_core_t
*_chip
)
120 struct snd_vxpocket
*chip
= (struct snd_vxpocket
*)_chip
;
123 /* mute input levels */
125 switch (_chip
->type
) {
126 case VX_TYPE_VXPOCKET
:
127 vx_set_mic_level(_chip
, 0);
130 vx_set_mic_boost(_chip
, 0);
135 switch (_chip
->type
) {
136 case VX_TYPE_VXPOCKET
:
137 if ((err
= snd_ctl_add(_chip
->card
, snd_ctl_new1(&vx_control_mic_level
, chip
))) < 0)
141 if ((err
= snd_ctl_add(_chip
->card
, snd_ctl_new1(&vx_control_mic_boost
, chip
))) < 0)