summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/export/mp3_playback.h25
-rw-r--r--firmware/mp3_playback.c158
2 files changed, 141 insertions, 42 deletions
diff --git a/firmware/export/mp3_playback.h b/firmware/export/mp3_playback.h
index ad989a2572..2370614e19 100644
--- a/firmware/export/mp3_playback.h
+++ b/firmware/export/mp3_playback.h
@@ -26,7 +26,10 @@
26 26
27/* functions formerly in mpeg.c */ 27/* functions formerly in mpeg.c */
28void mp3_init(int volume, int bass, int treble, int balance, 28void mp3_init(int volume, int bass, int treble, int balance,
29 int loudness, int bass_boost, int avc, int channel_config); 29 int loudness, int avc, int channel_config,
30 int mdb_strength, int mdb_harmonics,
31 int mdb_center, int mdb_shape, bool mdb_enable,
32 bool superbass);
30void mpeg_sound_set(int setting, int value); 33void mpeg_sound_set(int setting, int value);
31int mpeg_sound_min(int setting); 34int mpeg_sound_min(int setting);
32int mpeg_sound_max(int setting); 35int mpeg_sound_max(int setting);
@@ -35,6 +38,7 @@ void mpeg_sound_channel_config(int configuration);
35int mpeg_val2phys(int setting, int value); 38int mpeg_val2phys(int setting, int value);
36char *mpeg_sound_unit(int setting); 39char *mpeg_sound_unit(int setting);
37int mpeg_sound_numdecimals(int setting); 40int mpeg_sound_numdecimals(int setting);
41int mpeg_sound_steps(int setting);
38#if defined(HAVE_MAS3587F) || defined(SIMULATOR) 42#if defined(HAVE_MAS3587F) || defined(SIMULATOR)
39void mpeg_set_pitch(int percent); 43void mpeg_set_pitch(int percent);
40#endif 44#endif
@@ -63,13 +67,18 @@ unsigned char* mp3_get_pos(void);
63#define SOUND_TREBLE 2 67#define SOUND_TREBLE 2
64#define SOUND_BALANCE 3 68#define SOUND_BALANCE 3
65#define SOUND_LOUDNESS 4 69#define SOUND_LOUDNESS 4
66#define SOUND_SUPERBASS 5 70#define SOUND_AVC 5
67#define SOUND_AVC 6 71#define SOUND_CHANNELS 6
68#define SOUND_CHANNELS 7 72#define SOUND_LEFT_GAIN 7
69#define SOUND_LEFT_GAIN 8 73#define SOUND_RIGHT_GAIN 8
70#define SOUND_RIGHT_GAIN 9 74#define SOUND_MIC_GAIN 9
71#define SOUND_MIC_GAIN 10 75#define SOUND_MDB_STRENGTH 10
72#define SOUND_NUMSETTINGS 11 76#define SOUND_MDB_HARMONICS 11
77#define SOUND_MDB_CENTER 12
78#define SOUND_MDB_SHAPE 13
79#define SOUND_MDB_ENABLE 14
80#define SOUND_SUPERBASS 15
81#define SOUND_NUMSETTINGS 16
73 82
74#define MPEG_SOUND_STEREO 0 83#define MPEG_SOUND_STEREO 0
75#define MPEG_SOUND_STEREO_NARROW 1 84#define MPEG_SOUND_STEREO_NARROW 1
diff --git a/firmware/mp3_playback.c b/firmware/mp3_playback.c
index 5d43458445..b890362776 100644
--- a/firmware/mp3_playback.c
+++ b/firmware/mp3_playback.c
@@ -68,12 +68,17 @@ static char *units[] =
68 "dB", /* Treble */ 68 "dB", /* Treble */
69 "%", /* Balance */ 69 "%", /* Balance */
70 "dB", /* Loudness */ 70 "dB", /* Loudness */
71 "%", /* Bass boost */
72 "", /* AVC */ 71 "", /* AVC */
73 "", /* Channels */ 72 "", /* Channels */
74 "dB", /* Left gain */ 73 "dB", /* Left gain */
75 "dB", /* Right gain */ 74 "dB", /* Right gain */
76 "dB", /* Mic gain */ 75 "dB", /* Mic gain */
76 "dB", /* MDB Strength */
77 "%", /* MDB Harmonics */
78 "Hz", /* MDB Center */
79 "Hz", /* MDB Shape */
80 "", /* MDB Enable */
81 "", /* Super bass */
77}; 82};
78 83
79static int numdecimals[] = 84static int numdecimals[] =
@@ -83,12 +88,37 @@ static int numdecimals[] =
83 0, /* Treble */ 88 0, /* Treble */
84 0, /* Balance */ 89 0, /* Balance */
85 0, /* Loudness */ 90 0, /* Loudness */
86 0, /* Bass boost */
87 0, /* AVC */ 91 0, /* AVC */
88 0, /* Channels */ 92 0, /* Channels */
89 1, /* Left gain */ 93 1, /* Left gain */
90 1, /* Right gain */ 94 1, /* Right gain */
91 1, /* Mic gain */ 95 1, /* Mic gain */
96 0, /* MDB Strength */
97 0, /* MDB Harmonics */
98 0, /* MDB Center */
99 0, /* MDB Shape */
100 0, /* MDB Enable */
101 0, /* Super bass */
102};
103
104static int steps[] =
105{
106 1, /* Volume */
107 1, /* Bass */
108 1, /* Treble */
109 2, /* Balance */
110 1, /* Loudness */
111 1, /* AVC */
112 1, /* Channels */
113 1, /* Left gain */
114 1, /* Right gain */
115 1, /* Mic gain */
116 1, /* MDB Strength */
117 1, /* MDB Harmonics */
118 10, /* MDB Center */
119 10, /* MDB Shape */
120 1, /* MDB Enable */
121 1, /* Super bass */
92}; 122};
93 123
94static int minval[] = 124static int minval[] =
@@ -103,12 +133,17 @@ static int minval[] =
103#endif 133#endif
104 -100, /* Balance */ 134 -100, /* Balance */
105 0, /* Loudness */ 135 0, /* Loudness */
106 0, /* Bass boost */
107 -1, /* AVC */ 136 -1, /* AVC */
108 0, /* Channels */ 137 0, /* Channels */
109 0, /* Left gain */ 138 0, /* Left gain */
110 0, /* Right gain */ 139 0, /* Right gain */
111 0, /* Mic gain */ 140 0, /* Mic gain */
141 0, /* MDB Strength */
142 0, /* MDB Harmonics */
143 20, /* MDB Center */
144 50, /* MDB Shape */
145 0, /* MDB Enable */
146 0, /* Super bass */
112}; 147};
113 148
114static int maxval[] = 149static int maxval[] =
@@ -123,12 +158,17 @@ static int maxval[] =
123#endif 158#endif
124 100, /* Balance */ 159 100, /* Balance */
125 17, /* Loudness */ 160 17, /* Loudness */
126 100, /* Bass boost */
127 4, /* AVC */ 161 4, /* AVC */
128 6, /* Channels */ 162 6, /* Channels */
129 15, /* Left gain */ 163 15, /* Left gain */
130 15, /* Right gain */ 164 15, /* Right gain */
131 15, /* Mic gain */ 165 15, /* Mic gain */
166 127, /* MDB Strength */
167 100, /* MDB Harmonics */
168 300, /* MDB Center */
169 300, /* MDB Shape */
170 1, /* MDB Enable */
171 1, /* Super bass */
132}; 172};
133 173
134static int defaultval[] = 174static int defaultval[] =
@@ -143,12 +183,17 @@ static int defaultval[] =
143#endif 183#endif
144 0, /* Balance */ 184 0, /* Balance */
145 0, /* Loudness */ 185 0, /* Loudness */
146 0, /* Bass boost */
147 0, /* AVC */ 186 0, /* AVC */
148 0, /* Channels */ 187 0, /* Channels */
149 8, /* Left gain */ 188 8, /* Left gain */
150 8, /* Right gain */ 189 8, /* Right gain */
151 2, /* Mic gain */ 190 2, /* Mic gain */
191 50, /* MDB Strength */
192 48, /* MDB Harmonics */
193 60, /* MDB Center */
194 90, /* MDB Shape */
195 0, /* MDB Enable */
196 0, /* Super bass */
152}; 197};
153 198
154char *mpeg_sound_unit(int setting) 199char *mpeg_sound_unit(int setting)
@@ -161,6 +206,11 @@ int mpeg_sound_numdecimals(int setting)
161 return numdecimals[setting]; 206 return numdecimals[setting];
162} 207}
163 208
209int mpeg_sound_steps(int setting)
210{
211 return steps[setting];
212}
213
164int mpeg_sound_min(int setting) 214int mpeg_sound_min(int setting)
165{ 215{
166 return minval[setting]; 216 return minval[setting];
@@ -566,6 +616,11 @@ void set_prescaled_volume(void)
566#endif /* HAVE_MAS3507D */ 616#endif /* HAVE_MAS3507D */
567#endif /* !SIMULATOR */ 617#endif /* !SIMULATOR */
568 618
619#ifdef HAVE_MAS3587F
620unsigned long mdb_shape_shadow = 0;
621unsigned long loudness_shadow = 0;
622#endif
623
569void mpeg_sound_set(int setting, int value) 624void mpeg_sound_set(int setting, int value)
570{ 625{
571#ifdef SIMULATOR 626#ifdef SIMULATOR
@@ -645,30 +700,10 @@ void mpeg_sound_set(int setting, int value)
645 break; 700 break;
646 701
647#ifdef HAVE_MAS3587F 702#ifdef HAVE_MAS3587F
648 case SOUND_SUPERBASS:
649 if (value) {
650 tmp = MAX(MIN(value * 127 / 100, 0x7f), 0);
651 mas_codec_writereg(MAS_REG_KMDB_STR, (tmp & 0xff) << 8);
652 tmp = 0x30; /* MDB_HAR: Space for experiment here */
653 mas_codec_writereg(MAS_REG_KMDB_HAR, (tmp & 0xff) << 8);
654 tmp = 60 / 10; /* calculate MDB_FC, 60hz - experiment here,
655 this would depend on the earphones...
656 perhaps make it tunable? */
657 mas_codec_writereg(MAS_REG_KMDB_FC, (tmp & 0xff) << 8);
658 tmp = (3 * tmp) / 2; /* calculate MDB_SHAPE */
659 mas_codec_writereg(MAS_REG_KMDB_SWITCH,
660 ((tmp & 0xff) << 8) /* MDB_SHAPE */
661 | 2); /* MDB_SWITCH enable */
662 } else {
663 mas_codec_writereg(MAS_REG_KMDB_STR, 0);
664 mas_codec_writereg(MAS_REG_KMDB_HAR, 0);
665 mas_codec_writereg(MAS_REG_KMDB_SWITCH, 0); /* MDB_SWITCH disable */
666 }
667 break;
668
669 case SOUND_LOUDNESS: 703 case SOUND_LOUDNESS:
670 tmp = MAX(MIN(value * 4, 0x44), 0); 704 loudness_shadow = (loudness_shadow & 0x04) |
671 mas_codec_writereg(MAS_REG_KLOUDNESS, (tmp & 0xff) << 8); 705 (MAX(MIN(value * 4, 0x44), 0) << 8);
706 mas_codec_writereg(MAS_REG_KLOUDNESS, loudness_shadow);
672 break; 707 break;
673 708
674 case SOUND_AVC: 709 case SOUND_AVC:
@@ -695,7 +730,36 @@ void mpeg_sound_set(int setting, int value)
695 } 730 }
696 mas_codec_writereg(MAS_REG_KAVC, tmp); 731 mas_codec_writereg(MAS_REG_KAVC, tmp);
697 break; 732 break;
698#endif 733
734 case SOUND_MDB_STRENGTH:
735 mas_codec_writereg(MAS_REG_KMDB_STR, (value & 0x7f) << 8);
736 break;
737
738 case SOUND_MDB_HARMONICS:
739 tmp = value * 127 / 100;
740 mas_codec_writereg(MAS_REG_KMDB_HAR, (tmp & 0x7f) << 8);
741 break;
742
743 case SOUND_MDB_CENTER:
744 mas_codec_writereg(MAS_REG_KMDB_FC, (value/10) << 8);
745 break;
746
747 case SOUND_MDB_SHAPE:
748 mdb_shape_shadow = (mdb_shape_shadow & 0x02) | ((value/10) << 8);
749 mas_codec_writereg(MAS_REG_KMDB_SWITCH, mdb_shape_shadow);
750 break;
751
752 case SOUND_MDB_ENABLE:
753 mdb_shape_shadow = (mdb_shape_shadow & ~0x02) | (value?2:0);
754 mas_codec_writereg(MAS_REG_KMDB_SWITCH, mdb_shape_shadow);
755 break;
756
757 case SOUND_SUPERBASS:
758 loudness_shadow = (loudness_shadow & ~0x04) |
759 (value?4:0);
760 mas_codec_writereg(MAS_REG_KLOUDNESS, loudness_shadow);
761 break;
762#endif
699 case SOUND_CHANNELS: 763 case SOUND_CHANNELS:
700 mpeg_sound_channel_config(value); 764 mpeg_sound_channel_config(value);
701 break; 765 break;
@@ -832,15 +896,36 @@ void mpeg_set_pitch(int pitch)
832#endif 896#endif
833 897
834void mp3_init(int volume, int bass, int treble, int balance, int loudness, 898void mp3_init(int volume, int bass, int treble, int balance, int loudness,
835 int bass_boost, int avc, int channel_config) 899 int avc, int channel_config,
900 int mdb_strength, int mdb_harmonics,
901 int mdb_center, int mdb_shape, bool mdb_enable,
902 bool superbass)
836{ 903{
837#ifdef SIMULATOR 904#ifdef SIMULATOR
838 volume = bass = treble = balance = loudness 905 (void)volume;
839 = bass_boost = avc = channel_config; 906 (void)bass;
907 (void)treble;
908 (void)balance;
909 (void)loudness;
910 (void)avc;
911 (void)channel_config;
912 (void)mdb_strength;
913 (void)mdb_harmonics;
914 (void)mdb_center;
915 (void)mdb_shape;
916 (void)mdb_enable;
917 (void)superbass;
840#else 918#else
841#ifdef HAVE_MAS3507D 919#ifdef HAVE_MAS3507D
842 unsigned long val; 920 unsigned long val;
843 loudness = bass_boost = avc; 921 (void)loudness;
922 (void)avc;
923 (void)mdb_strength;
924 (void)mdb_harmonics;
925 (void)mdb_center;
926 (void)mdb_shape;
927 (void)mdb_enable;
928 (void)superbass;
844#endif 929#endif
845 930
846 setup_sci0(); 931 setup_sci0();
@@ -929,8 +1014,13 @@ void mp3_init(int volume, int bass, int treble, int balance, int loudness,
929#ifdef HAVE_MAS3587F 1014#ifdef HAVE_MAS3587F
930 mpeg_sound_channel_config(channel_config); 1015 mpeg_sound_channel_config(channel_config);
931 mpeg_sound_set(SOUND_LOUDNESS, loudness); 1016 mpeg_sound_set(SOUND_LOUDNESS, loudness);
932 mpeg_sound_set(SOUND_SUPERBASS, bass_boost);
933 mpeg_sound_set(SOUND_AVC, avc); 1017 mpeg_sound_set(SOUND_AVC, avc);
1018 mpeg_sound_set(SOUND_MDB_STRENGTH, mdb_strength);
1019 mpeg_sound_set(SOUND_MDB_HARMONICS, mdb_harmonics);
1020 mpeg_sound_set(SOUND_MDB_CENTER, mdb_center);
1021 mpeg_sound_set(SOUND_MDB_SHAPE, mdb_shape);
1022 mpeg_sound_set(SOUND_MDB_ENABLE, mdb_enable);
1023 mpeg_sound_set(SOUND_SUPERBASS, superbass);
934#endif 1024#endif
935#endif /* !SIMULATOR */ 1025#endif /* !SIMULATOR */
936 1026