Commit FS#11364 by me. Increases the A3525v2 volume range by 7.5dB. Each volume setting gets 7.5dB louder (if you listened before at 0dB, you would have to set it to about -7.5dB to get the same volume). As a result, the new 0dB actually is pretty close to max line level for a full scale voltage, so positive dB may clip, whereas before they did not because the scale was off. Thanks to dfkt and Tim Graf for help figuring this out.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27101 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Michael Giacomelli 2010-06-24 01:11:51 +00:00
parent 0864fde69b
commit 103eabd31f
3 changed files with 30 additions and 12 deletions

View file

@ -550,6 +550,7 @@ Hinrik Örn Sigurðsson
Stephen Carroll Stephen Carroll
Joe Balough Joe Balough
Jérôme Heil Jérôme Heil
Tim Graf
The libmad team The libmad team
The wavpack team The wavpack team

View file

@ -64,7 +64,7 @@
#endif #endif
const struct sound_settings_info audiohw_settings[] = { const struct sound_settings_info audiohw_settings[] = {
[SOUND_VOLUME] = {"dB", 0, 1, -73, 6, -25}, [SOUND_VOLUME] = {"dB", 0, 1, VOLUME_MIN/10, 6, -25},
/* HAVE_SW_TONE_CONTROLS */ /* HAVE_SW_TONE_CONTROLS */
[SOUND_BASS] = {"dB", 0, 1, -24, 24, 0}, [SOUND_BASS] = {"dB", 0, 1, -24, 24, 0},
[SOUND_TREBLE] = {"dB", 0, 1, -24, 24, 0}, [SOUND_TREBLE] = {"dB", 0, 1, -24, 24, 0},
@ -114,11 +114,11 @@ static void as3514_write_masked(unsigned int reg, unsigned int bits,
/* convert tenth of dB volume to master volume register value */ /* convert tenth of dB volume to master volume register value */
int tenthdb2master(int db) int tenthdb2master(int db)
{ {
/* +6 to -73.5dB in 1.5dB steps == 53 levels */ /* +6 to -73.5dB (or -81.0 dB) in 1.5dB steps == 53 (or 58) levels */
if (db < VOLUME_MIN) { if (db < VOLUME_MIN) {
return 0x0; return 0x0;
} else if (db >= VOLUME_MAX) { } else if (db > VOLUME_MAX) {
return 0x35; return (VOLUME_MAX-VOLUME_MIN)/15;
} else { } else {
return((db-VOLUME_MIN)/15); /* VOLUME_MIN is negative */ return((db-VOLUME_MIN)/15); /* VOLUME_MIN is negative */
} }
@ -250,24 +250,35 @@ void audiohw_set_master_vol(int vol_l, int vol_r)
return; return;
} }
/* We combine the mixer channel volume range with the headphone volume /* We combine the mixer/DAC channel volume range with the headphone volume
range - keep first stage as loud as possible */ range - keep first stage as loud as possible */
if (vol_r <= 0x16) {
/*AS3543 mixer can go a little louder then the as3514, although
* it might be possible to go louder on the as3514 as well */
#if CONFIG_CPU == AS3525v2
#define MIXER_MAX_VOLUME 0x1b
#else /* lets leave the AS3514 alone until its better tested*/
#define MIXER_MAX_VOLUME 0x16
#endif
if (vol_r <= MIXER_MAX_VOLUME) {
mix_r = vol_r; mix_r = vol_r;
hph_r = 0; hph_r = 0;
} else { } else {
mix_r = 0x16; mix_r = MIXER_MAX_VOLUME;
hph_r = vol_r - 0x16; hph_r = vol_r - MIXER_MAX_VOLUME;
} }
if (vol_l <= 0x16) { if (vol_l <= MIXER_MAX_VOLUME) {
mix_l = vol_l; mix_l = vol_l;
hph_l = 0; hph_l = 0;
} else { } else {
mix_l = 0x16; mix_l = MIXER_MAX_VOLUME;
hph_l = vol_l - 0x16; hph_l = vol_l - MIXER_MAX_VOLUME;
} }
as3514_write_masked(AS3514_DAC_R, mix_r, AS3514_VOL_MASK); as3514_write_masked(AS3514_DAC_R, mix_r, AS3514_VOL_MASK);
as3514_write_masked(AS3514_DAC_L, mix_l, AS3514_VOL_MASK); as3514_write_masked(AS3514_DAC_L, mix_l, AS3514_VOL_MASK);
#if defined(HAVE_RECORDING) || defined(HAVE_FMRADIO_IN) #if defined(HAVE_RECORDING) || defined(HAVE_FMRADIO_IN)

View file

@ -119,8 +119,14 @@ extern void audiohw_set_lineout_vol(int vol_l, int vol_r);
#define AS3514_UID_0 0x30 #define AS3514_UID_0 0x30
/*different volume ranges for different AMS chips*/
#if CONFIG_CPU == AS3525v2
/* Headphone volume goes from -81.0 ... +6dB */
#define VOLUME_MIN -810
#else
/* Headphone volume goes from -73.5 ... +6dB */ /* Headphone volume goes from -73.5 ... +6dB */
#define VOLUME_MIN -735 #define VOLUME_MIN -735
#endif
#define VOLUME_MAX 60 #define VOLUME_MAX 60
/*** Audio Registers ***/ /*** Audio Registers ***/