|
@@ -35,6 +35,7 @@
|
|
|
#include <linux/vmalloc.h>
|
|
|
#include <linux/init.h>
|
|
|
#include <linux/mutex.h>
|
|
|
+#include <linux/moduleparam.h>
|
|
|
|
|
|
#include <sound/core.h>
|
|
|
#include <sound/tlv.h>
|
|
@@ -50,6 +51,10 @@
|
|
|
#define EMU10K1_CENTER_LFE_FROM_FRONT
|
|
|
#endif
|
|
|
|
|
|
+static bool high_res_gpr_volume;
|
|
|
+module_param(high_res_gpr_volume, bool, 0444);
|
|
|
+MODULE_PARM_DESC(high_res_gpr_volume, "GPR mixer controls use 31-bit range.");
|
|
|
+
|
|
|
/*
|
|
|
* Tables
|
|
|
*/
|
|
@@ -296,6 +301,7 @@ static const u32 db_table[101] = {
|
|
|
|
|
|
/* EMU10k1/EMU10k2 DSP control db gain */
|
|
|
static const DECLARE_TLV_DB_SCALE(snd_emu10k1_db_scale1, -4000, 40, 1);
|
|
|
+static const DECLARE_TLV_DB_LINEAR(snd_emu10k1_db_linear, TLV_DB_GAIN_MUTE, 0);
|
|
|
|
|
|
static const u32 onoff_table[2] = {
|
|
|
0x00000000, 0x00000001
|
|
@@ -1072,10 +1078,17 @@ snd_emu10k1_init_mono_control(struct snd_emu10k1_fx8010_control_gpr *ctl,
|
|
|
strcpy(ctl->id.name, name);
|
|
|
ctl->vcount = ctl->count = 1;
|
|
|
ctl->gpr[0] = gpr + 0; ctl->value[0] = defval;
|
|
|
- ctl->min = 0;
|
|
|
- ctl->max = 100;
|
|
|
- ctl->tlv = snd_emu10k1_db_scale1;
|
|
|
- ctl->translation = EMU10K1_GPR_TRANSLATION_TABLE100;
|
|
|
+ if (high_res_gpr_volume) {
|
|
|
+ ctl->min = 0;
|
|
|
+ ctl->max = 0x7fffffff;
|
|
|
+ ctl->tlv = snd_emu10k1_db_linear;
|
|
|
+ ctl->translation = EMU10K1_GPR_TRANSLATION_NONE;
|
|
|
+ } else {
|
|
|
+ ctl->min = 0;
|
|
|
+ ctl->max = 100;
|
|
|
+ ctl->tlv = snd_emu10k1_db_scale1;
|
|
|
+ ctl->translation = EMU10K1_GPR_TRANSLATION_TABLE100;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void __devinit
|
|
@@ -1087,10 +1100,17 @@ snd_emu10k1_init_stereo_control(struct snd_emu10k1_fx8010_control_gpr *ctl,
|
|
|
ctl->vcount = ctl->count = 2;
|
|
|
ctl->gpr[0] = gpr + 0; ctl->value[0] = defval;
|
|
|
ctl->gpr[1] = gpr + 1; ctl->value[1] = defval;
|
|
|
- ctl->min = 0;
|
|
|
- ctl->max = 100;
|
|
|
- ctl->tlv = snd_emu10k1_db_scale1;
|
|
|
- ctl->translation = EMU10K1_GPR_TRANSLATION_TABLE100;
|
|
|
+ if (high_res_gpr_volume) {
|
|
|
+ ctl->min = 0;
|
|
|
+ ctl->max = 0x7fffffff;
|
|
|
+ ctl->tlv = snd_emu10k1_db_linear;
|
|
|
+ ctl->translation = EMU10K1_GPR_TRANSLATION_NONE;
|
|
|
+ } else {
|
|
|
+ ctl->min = 0;
|
|
|
+ ctl->max = 100;
|
|
|
+ ctl->tlv = snd_emu10k1_db_scale1;
|
|
|
+ ctl->translation = EMU10K1_GPR_TRANSLATION_TABLE100;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void __devinit
|