summaryrefslogtreecommitdiff
path: root/firmware/mpeg.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/mpeg.c')
-rw-r--r--firmware/mpeg.c77
1 files changed, 68 insertions, 9 deletions
diff --git a/firmware/mpeg.c b/firmware/mpeg.c
index 70232571b7..9906620fdb 100644
--- a/firmware/mpeg.c
+++ b/firmware/mpeg.c
@@ -56,21 +56,30 @@ static char *units[] =
56{ 56{
57 "%", /* Volume */ 57 "%", /* Volume */
58 "dB", /* Bass */ 58 "dB", /* Bass */
59 "dB" /* Treble */ 59 "dB", /* Treble */
60 "", /* Balance */
61 "dB", /* Loudness */
62 "%" /* Bass boost */
60}; 63};
61 64
62static int numdecimals[] = 65static int numdecimals[] =
63{ 66{
64 0, /* Volume */ 67 0, /* Volume */
65 0, /* Bass */ 68 0, /* Bass */
66 0 /* Treble */ 69 0, /* Treble */
70 0, /* Balance */
71 0, /* Loudness */
72 0 /* Bass boost */
67}; 73};
68 74
69static int minval[] = 75static int minval[] =
70{ 76{
71 0, /* Volume */ 77 0, /* Volume */
72 0, /* Bass */ 78 0, /* Bass */
73 0 /* Treble */ 79 0, /* Treble */
80 0, /* Balance */
81 0, /* Loudness */
82 0 /* Bass boost */
74}; 83};
75 84
76static int maxval[] = 85static int maxval[] =
@@ -78,11 +87,14 @@ static int maxval[] =
78 50, /* Volume */ 87 50, /* Volume */
79#ifdef ARCHOS_RECORDER 88#ifdef ARCHOS_RECORDER
80 24, /* Bass */ 89 24, /* Bass */
81 24 /* Treble */ 90 24, /* Treble */
82#else 91#else
83 30, /* Bass */ 92 30, /* Bass */
84 30 /* Treble */ 93 30, /* Treble */
85#endif 94#endif
95 100, /* Balance */
96 17, /* Loudness */
97 10 /* Bass boost */
86}; 98};
87 99
88static int defaultval[] = 100static int defaultval[] =
@@ -90,11 +102,14 @@ static int defaultval[] =
90 70/2, /* Volume */ 102 70/2, /* Volume */
91#ifdef ARCHOS_RECORDER 103#ifdef ARCHOS_RECORDER
92 12+6, /* Bass */ 104 12+6, /* Bass */
93 12+6 /* Treble */ 105 12+6, /* Treble */
94#else 106#else
95 15+7, /* Bass */ 107 15+7, /* Bass */
96 15+7 /* Treble */ 108 15+7, /* Treble */
97#endif 109#endif
110 50, /* Balance */
111 0, /* Loudness */
112 0 /* Bass boost */
98}; 113};
99 114
100char *mpeg_sound_unit(int setting) 115char *mpeg_sound_unit(int setting)
@@ -965,6 +980,34 @@ void mpeg_sound_set(int setting, int value)
965 set_prescaled_volume(); 980 set_prescaled_volume();
966#endif 981#endif
967 break; 982 break;
983
984#ifdef ARCHOS_RECORDER
985 case SOUND_SUPERBASS:
986 if (value) {
987 tmp = MAX(MIN(value * 12, 0x7f), 0);
988 mas_codec_writereg(MAS_REG_KMDB_STR, (tmp & 0xff) << 8);
989 tmp = 0x30; /* MDB_HAR: Space for experiment here */
990 mas_codec_writereg(MAS_REG_KMDB_HAR, (tmp & 0xff) << 8);
991 tmp = 60 / 10; /* calculate MDB_FC, 60hz - experiment here,
992 this would depend on the earphones...
993 perhaps make it tunable? */
994 mas_codec_writereg(MAS_REG_KMDB_FC, (tmp & 0xff) << 8);
995 tmp = (3 * tmp) / 2; /* calculate MDB_SHAPE */
996 mas_codec_writereg(MAS_REG_KMDB_SWITCH,
997 ((tmp & 0xff) << 8) /* MDB_SHAPE */
998 | 2); /* MDB_SWITCH enable */
999 } else {
1000 mas_codec_writereg(MAS_REG_KMDB_STR, 0);
1001 mas_codec_writereg(MAS_REG_KMDB_HAR, 0);
1002 mas_codec_writereg(MAS_REG_KMDB_SWITCH, 0); /* MDB_SWITCH disable */
1003 }
1004 break;
1005
1006 case SOUND_LOUDNESS:
1007 tmp = MAX(MIN(value * 4, 0x44), 0);
1008 mas_codec_writereg(MAS_REG_KLOUDNESS, (tmp & 0xff) << 8);
1009 break;
1010#endif
968 } 1011 }
969#endif /* SIMULATOR */ 1012#endif /* SIMULATOR */
970} 1013}
@@ -994,18 +1037,30 @@ int mpeg_val2phys(int setting, int value)
994 result = value - 15; 1037 result = value - 15;
995#endif 1038#endif
996 break; 1039 break;
1040
1041#ifdef ARCHOS_RECORDER
1042 case SOUND_LOUDNESS:
1043 result = value;
1044 break;
1045
1046 case SOUND_SUPERBASS:
1047 result = value * 10;
1048 break;
1049#endif
997 } 1050 }
998 return result; 1051 return result;
999} 1052}
1000 1053
1001void mpeg_init(int volume, int bass, int treble) 1054void mpeg_init(int volume, int bass, int treble, int loudness, int bass_boost)
1002{ 1055{
1003#ifdef SIMULATOR 1056#ifdef SIMULATOR
1004 volume = bass = treble; 1057 volume = bass = treble = loudness = bass_boost;
1005#else 1058#else
1006#ifdef ARCHOS_RECORDER 1059#ifdef ARCHOS_RECORDER
1007 int rc; 1060 int rc;
1008 unsigned long val; 1061 unsigned long val;
1062#else
1063 loudness = bass_boost;
1009#endif 1064#endif
1010 1065
1011 setup_sci0(); 1066 setup_sci0();
@@ -1069,5 +1124,9 @@ void mpeg_init(int volume, int bass, int treble)
1069 mpeg_sound_set(SOUND_BASS, bass); 1124 mpeg_sound_set(SOUND_BASS, bass);
1070 mpeg_sound_set(SOUND_TREBLE, treble); 1125 mpeg_sound_set(SOUND_TREBLE, treble);
1071 mpeg_sound_set(SOUND_VOLUME, volume); 1126 mpeg_sound_set(SOUND_VOLUME, volume);
1127#ifdef ARCHOS_RECORDER
1128 mpeg_sound_set(SOUND_LOUDNESS, loudness);
1129 mpeg_sound_set(SOUND_SUPERBASS, bass_boost);
1130#endif
1072#endif /* SIMULATOR */ 1131#endif /* SIMULATOR */
1073} 1132}