|
@@ -1639,6 +1639,45 @@ static struct snd_kcontrol_new snd_audigy_shared_spdif __devinitdata =
|
|
|
.put = snd_emu10k1_shared_spdif_put
|
|
|
};
|
|
|
|
|
|
+/* workaround for too low volume on Audigy due to 16bit/24bit conversion */
|
|
|
+
|
|
|
+#define snd_audigy_capture_boost_info snd_ctl_boolean_mono_info
|
|
|
+
|
|
|
+static int snd_audigy_capture_boost_get(struct snd_kcontrol *kcontrol,
|
|
|
+ struct snd_ctl_elem_value *ucontrol)
|
|
|
+{
|
|
|
+ struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
|
|
|
+ unsigned int val;
|
|
|
+
|
|
|
+ /* FIXME: better to use a cached version */
|
|
|
+ val = snd_ac97_read(emu->ac97, AC97_REC_GAIN);
|
|
|
+ ucontrol->value.integer.value[0] = !!val;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int snd_audigy_capture_boost_put(struct snd_kcontrol *kcontrol,
|
|
|
+ struct snd_ctl_elem_value *ucontrol)
|
|
|
+{
|
|
|
+ struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
|
|
|
+ unsigned int val;
|
|
|
+
|
|
|
+ if (ucontrol->value.integer.value[0])
|
|
|
+ val = 0x0f0f;
|
|
|
+ else
|
|
|
+ val = 0;
|
|
|
+ return snd_ac97_update(emu->ac97, AC97_REC_GAIN, val);
|
|
|
+}
|
|
|
+
|
|
|
+static struct snd_kcontrol_new snd_audigy_capture_boost __devinitdata =
|
|
|
+{
|
|
|
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
|
|
+ .name = "Analog Capture Boost",
|
|
|
+ .info = snd_audigy_capture_boost_info,
|
|
|
+ .get = snd_audigy_capture_boost_get,
|
|
|
+ .put = snd_audigy_capture_boost_put
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
/*
|
|
|
*/
|
|
|
static void snd_emu10k1_mixer_free_ac97(struct snd_ac97 *ac97)
|
|
@@ -2087,5 +2126,12 @@ int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (emu->card_capabilities->ac97_chip && emu->audigy) {
|
|
|
+ err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_capture_boost,
|
|
|
+ emu));
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
}
|