1 /* 2 * Driver for Digigram VXpocket soundcards 3 * 4 * VX-pocket mixer 5 * 6 * Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de> 7 * 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. 12 * 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. 17 * 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 21 */ 22 23 #include <sound/driver.h> 24 #include <sound/core.h> 25 #include <sound/control.h> 26 #include "vxpocket.h" 27 28 #define MIC_LEVEL_MIN 0 29 #define MIC_LEVEL_MAX 8 30 31 /* 32 * mic level control (for VXPocket) 33 */ 34 static int vx_mic_level_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo) 35 { 36 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 37 uinfo->count = 1; 38 uinfo->value.integer.min = 0; 39 uinfo->value.integer.max = MIC_LEVEL_MAX; 40 return 0; 41 } 42 43 static int vx_mic_level_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) 44 { 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; 48 return 0; 49 } 50 51 static int vx_mic_level_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) 52 { 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); 60 return 1; 61 } 62 up(&_chip->mixer_mutex); 63 return 0; 64 } 65 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, 72 }; 73 74 /* 75 * mic boost level control (for VXP440) 76 */ 77 static int vx_mic_boost_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo) 78 { 79 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; 80 uinfo->count = 1; 81 uinfo->value.integer.min = 0; 82 uinfo->value.integer.max = 1; 83 return 0; 84 } 85 86 static int vx_mic_boost_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) 87 { 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; 91 return 0; 92 } 93 94 static int vx_mic_boost_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) 95 { 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); 103 return 1; 104 } 105 up(&_chip->mixer_mutex); 106 return 0; 107 } 108 109 static snd_kcontrol_new_t vx_control_mic_boost = { 110 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 111 .name = "Mic Boost", 112 .info = vx_mic_boost_info, 113 .get = vx_mic_boost_get, 114 .put = vx_mic_boost_put, 115 }; 116 117 118 int vxp_add_mic_controls(vx_core_t *_chip) 119 { 120 struct snd_vxpocket *chip = (struct snd_vxpocket *)_chip; 121 int err; 122 123 /* mute input levels */ 124 chip->mic_level = 0; 125 switch (_chip->type) { 126 case VX_TYPE_VXPOCKET: 127 vx_set_mic_level(_chip, 0); 128 break; 129 case VX_TYPE_VXP440: 130 vx_set_mic_boost(_chip, 0); 131 break; 132 } 133 134 /* mic level */ 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) 138 return err; 139 break; 140 case VX_TYPE_VXP440: 141 if ((err = snd_ctl_add(_chip->card, snd_ctl_new1(&vx_control_mic_boost, chip))) < 0) 142 return err; 143 break; 144 } 145 146 return 0; 147 } 148 149