diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/export/mp3_playback.h | 25 | ||||
-rw-r--r-- | firmware/mp3_playback.c | 158 |
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 */ |
28 | void mp3_init(int volume, int bass, int treble, int balance, | 28 | void 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); | ||
30 | void mpeg_sound_set(int setting, int value); | 33 | void mpeg_sound_set(int setting, int value); |
31 | int mpeg_sound_min(int setting); | 34 | int mpeg_sound_min(int setting); |
32 | int mpeg_sound_max(int setting); | 35 | int mpeg_sound_max(int setting); |
@@ -35,6 +38,7 @@ void mpeg_sound_channel_config(int configuration); | |||
35 | int mpeg_val2phys(int setting, int value); | 38 | int mpeg_val2phys(int setting, int value); |
36 | char *mpeg_sound_unit(int setting); | 39 | char *mpeg_sound_unit(int setting); |
37 | int mpeg_sound_numdecimals(int setting); | 40 | int mpeg_sound_numdecimals(int setting); |
41 | int mpeg_sound_steps(int setting); | ||
38 | #if defined(HAVE_MAS3587F) || defined(SIMULATOR) | 42 | #if defined(HAVE_MAS3587F) || defined(SIMULATOR) |
39 | void mpeg_set_pitch(int percent); | 43 | void 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 | ||
79 | static int numdecimals[] = | 84 | static 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 | |||
104 | static 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 | ||
94 | static int minval[] = | 124 | static 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 | ||
114 | static int maxval[] = | 149 | static 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 | ||
134 | static int defaultval[] = | 174 | static 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 | ||
154 | char *mpeg_sound_unit(int setting) | 199 | char *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 | ||
209 | int mpeg_sound_steps(int setting) | ||
210 | { | ||
211 | return steps[setting]; | ||
212 | } | ||
213 | |||
164 | int mpeg_sound_min(int setting) | 214 | int 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 | ||
620 | unsigned long mdb_shape_shadow = 0; | ||
621 | unsigned long loudness_shadow = 0; | ||
622 | #endif | ||
623 | |||
569 | void mpeg_sound_set(int setting, int value) | 624 | void 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 | ||
834 | void mp3_init(int volume, int bass, int treble, int balance, int loudness, | 898 | void 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 | ||