diff options
author | Linus Nielsen Feltzing <linus@haxx.se> | 2002-07-01 12:32:23 +0000 |
---|---|---|
committer | Linus Nielsen Feltzing <linus@haxx.se> | 2002-07-01 12:32:23 +0000 |
commit | b81ce1e9a1833f45e969ce3212bfd4541d6929cc (patch) | |
tree | e8fa867b526cbf4534ee253511b5b29b1f69a558 /firmware/mpeg.c | |
parent | 447185b6bbb4b2c493e2d51a65bf70debd70643a (diff) | |
download | rockbox-b81ce1e9a1833f45e969ce3212bfd4541d6929cc.tar.gz rockbox-b81ce1e9a1833f45e969ce3212bfd4541d6929cc.zip |
Player sound quality improvements by Julien Boissinot
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@1284 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/mpeg.c')
-rw-r--r-- | firmware/mpeg.c | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/firmware/mpeg.c b/firmware/mpeg.c index 1f8e331da2..f81f254a84 100644 --- a/firmware/mpeg.c +++ b/firmware/mpeg.c | |||
@@ -200,7 +200,6 @@ static unsigned int treble_table[] = | |||
200 | 0x5f800 /* 15dB */ | 200 | 0x5f800 /* 15dB */ |
201 | }; | 201 | }; |
202 | 202 | ||
203 | #if 0 | ||
204 | static unsigned int prescale_table[] = | 203 | static unsigned int prescale_table[] = |
205 | { | 204 | { |
206 | 0x80000, /* 0db */ | 205 | 0x80000, /* 0db */ |
@@ -221,7 +220,6 @@ static unsigned int prescale_table[] = | |||
221 | 0xe9400 /* 15dB */ | 220 | 0xe9400 /* 15dB */ |
222 | }; | 221 | }; |
223 | #endif | 222 | #endif |
224 | #endif | ||
225 | 223 | ||
226 | static unsigned char fliptable[] = | 224 | static unsigned char fliptable[] = |
227 | { | 225 | { |
@@ -796,6 +794,46 @@ void mpeg_prev(void) | |||
796 | #endif | 794 | #endif |
797 | } | 795 | } |
798 | 796 | ||
797 | |||
798 | #ifndef ARCHOS_RECORDER | ||
799 | int current_volume=0; /* all values in tenth of dB */ | ||
800 | int current_treble=0; | ||
801 | int current_bass=0; | ||
802 | int current_balance=0; | ||
803 | |||
804 | /* convert tenth of dB volume to register value */ | ||
805 | static int tenthdb2reg(int db) { | ||
806 | if (db < -540) | ||
807 | return (db + 780) / 30; | ||
808 | else | ||
809 | return (db + 660) / 15; | ||
810 | } | ||
811 | |||
812 | void set_prescaled_volume(void) | ||
813 | { | ||
814 | int prescale; | ||
815 | int l, r; | ||
816 | |||
817 | prescale = MAX(current_bass, current_treble); | ||
818 | if (prescale < 0) | ||
819 | prescale = 0; /* no need to prescale if we don't boost | ||
820 | bass or treble */ | ||
821 | |||
822 | mas_writereg(MAS_REG_KPRESCALE, prescale_table[prescale/10]); | ||
823 | |||
824 | /* gain up the analog volume to compensate the prescale reduction gain */ | ||
825 | r = l = current_volume + prescale; | ||
826 | |||
827 | /* balance */ | ||
828 | if (current_balance >= 0) | ||
829 | l -= current_balance; | ||
830 | else | ||
831 | r += current_balance; | ||
832 | |||
833 | dac_volume(tenthdb2reg(l), tenthdb2reg(r), false); | ||
834 | } | ||
835 | #endif | ||
836 | |||
799 | void mpeg_sound_set(int setting, int value) | 837 | void mpeg_sound_set(int setting, int value) |
800 | { | 838 | { |
801 | #ifdef SIMULATOR | 839 | #ifdef SIMULATOR |
@@ -813,7 +851,11 @@ void mpeg_sound_set(int setting, int value) | |||
813 | mas_codec_writereg(0x10, tmp & 0xff00); | 851 | mas_codec_writereg(0x10, tmp & 0xff00); |
814 | #else | 852 | #else |
815 | tmp = 0x38 * value / 100; | 853 | tmp = 0x38 * value / 100; |
816 | dac_volume(tmp, tmp, false); | 854 | |
855 | /* store volume in tenth of dB */ | ||
856 | current_volume = ( tmp < 0x08 ? tmp*30 - 780 : tmp*15 - 660 ); | ||
857 | |||
858 | set_prescaled_volume(); | ||
817 | #endif | 859 | #endif |
818 | break; | 860 | break; |
819 | 861 | ||
@@ -823,6 +865,8 @@ void mpeg_sound_set(int setting, int value) | |||
823 | mas_codec_writereg(0x14, tmp & 0xff00); | 865 | mas_codec_writereg(0x14, tmp & 0xff00); |
824 | #else | 866 | #else |
825 | mas_writereg(MAS_REG_KBASS, bass_table[value]); | 867 | mas_writereg(MAS_REG_KBASS, bass_table[value]); |
868 | current_bass = (value-15) * 10; | ||
869 | set_prescaled_volume(); | ||
826 | #endif | 870 | #endif |
827 | break; | 871 | break; |
828 | 872 | ||
@@ -832,6 +876,8 @@ void mpeg_sound_set(int setting, int value) | |||
832 | mas_codec_writereg(0x15, tmp & 0xff00); | 876 | mas_codec_writereg(0x15, tmp & 0xff00); |
833 | #else | 877 | #else |
834 | mas_writereg(MAS_REG_KTREBLE, treble_table[value]); | 878 | mas_writereg(MAS_REG_KTREBLE, treble_table[value]); |
879 | current_treble = (value-15) * 10; | ||
880 | set_prescaled_volume(); | ||
835 | #endif | 881 | #endif |
836 | break; | 882 | break; |
837 | } | 883 | } |