summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/mpeg.c52
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
204static unsigned int prescale_table[] = 203static 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
226static unsigned char fliptable[] = 224static 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
799int current_volume=0; /* all values in tenth of dB */
800int current_treble=0;
801int current_bass=0;
802int current_balance=0;
803
804/* convert tenth of dB volume to register value */
805static int tenthdb2reg(int db) {
806 if (db < -540)
807 return (db + 780) / 30;
808 else
809 return (db + 660) / 15;
810}
811
812void 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
799void mpeg_sound_set(int setting, int value) 837void 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 }