summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2005-01-12 00:24:15 +0000
committerJens Arnold <amiconn@rockbox.org>2005-01-12 00:24:15 +0000
commit76b257fd40217013b3107148090c2062f06097e5 (patch)
treeedb08fb3b29d3fc930c7f48c6404dbde421d8a27
parent01c484c5d27906f30f7fd9f2cc3f1d9073269c95 (diff)
downloadrockbox-76b257fd40217013b3107148090c2062f06097e5.tar.gz
rockbox-76b257fd40217013b3107148090c2062f06097e5.zip
New channel configuration setting, allowing fine-grained control of the stereo width. This replaces the 'stereo narrow' and 'stereo wide' modes.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5559 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/lang/deutsch.lang37
-rw-r--r--apps/lang/english.lang31
-rw-r--r--apps/main.c2
-rw-r--r--apps/settings.c22
-rw-r--r--apps/settings.h3
-rw-r--r--apps/sound_menu.c18
-rw-r--r--firmware/export/mp3_playback.h30
-rw-r--r--firmware/mp3_playback.c186
8 files changed, 191 insertions, 138 deletions
diff --git a/apps/lang/deutsch.lang b/apps/lang/deutsch.lang
index 8aa8425c47..1010493231 100644
--- a/apps/lang/deutsch.lang
+++ b/apps/lang/deutsch.lang
@@ -1261,22 +1261,22 @@ voice: "LCD-Modus"
1261new: "LCD-Modus" 1261new: "LCD-Modus"
1262 1262
1263id: LANG_CHANNEL_STEREO_NARROW_PLAYER 1263id: LANG_CHANNEL_STEREO_NARROW_PLAYER
1264desc: in sound_settings 1264desc: DEPRECATED
1265eng: "St. Narrow" 1265eng: ""
1266voice: "Stereo schmal" 1266voice: ""
1267new: "St. schmal" 1267new:
1268 1268
1269id: LANG_CHANNEL_STEREO_NARROW_RECORDER 1269id: LANG_CHANNEL_STEREO_NARROW_RECORDER
1270desc: in sound_settings 1270desc: DEPRECATED
1271eng: "Stereo Narrow" 1271eng: ""
1272voice: "Stereo schmal" 1272voice: ""
1273new: "Stereo schmal" 1273new:
1274 1274
1275id: LANG_CHANNEL_STEREO_WIDE 1275id: LANG_CHANNEL_STEREO_WIDE
1276desc: in sound_settings 1276desc: DEPRECATED
1277eng: "Stereo Wide" 1277eng: ""
1278voice: "Stereo breit" 1278voice: ""
1279new: "Stereo breit" 1279new:
1280 1280
1281id: LANG_CHANNEL_KARAOKE 1281id: LANG_CHANNEL_KARAOKE
1282desc: in sound_settings 1282desc: in sound_settings
@@ -2846,3 +2846,16 @@ eng: ""
2846voice: " " 2846voice: " "
2847new: 2847new:
2848 2848
2849id: LANG_STEREO_WIDTH
2850desc: in sound_settings
2851eng: "Stereo width"
2852voice: "Stereobasisbreite"
2853new: "Stereobasisbreite"
2854
2855id: LANG_CHANNEL_CUSTOM
2856desc: in sound_settings
2857eng: "Custom"
2858voice: "Angepasst"
2859new: "Angepasst"
2860
2861
diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index 1f2dd4d9e3..4cc95b8383 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -1274,21 +1274,21 @@ voice: "LCD Mode"
1274new: 1274new:
1275 1275
1276id: LANG_CHANNEL_STEREO_NARROW_PLAYER 1276id: LANG_CHANNEL_STEREO_NARROW_PLAYER
1277desc: in sound_settings 1277desc: DEPRECATED
1278eng: "St. Narrow" 1278eng: ""
1279voice: "Stereo Narrow" 1279voice: ""
1280new: 1280new:
1281 1281
1282id: LANG_CHANNEL_STEREO_NARROW_RECORDER 1282id: LANG_CHANNEL_STEREO_NARROW_RECORDER
1283desc: in sound_settings 1283desc: DEPRECATED
1284eng: "Stereo Narrow" 1284eng: ""
1285voice: "Stereo Narrow" 1285voice: ""
1286new: 1286new:
1287 1287
1288id: LANG_CHANNEL_STEREO_WIDE 1288id: LANG_CHANNEL_STEREO_WIDE
1289desc: in sound_settings 1289desc: DEPRECATED
1290eng: "Stereo Wide" 1290eng: ""
1291voice: "Stereo Wide" 1291voice: ""
1292new: 1292new:
1293 1293
1294id: LANG_CHANNEL_KARAOKE 1294id: LANG_CHANNEL_KARAOKE
@@ -2860,3 +2860,16 @@ eng: ""
2860voice: " " 2860voice: " "
2861new: 2861new:
2862 2862
2863id: LANG_STEREO_WIDTH
2864desc: in sound_settings
2865eng: "Stereo width"
2866voice: "Stereo width"
2867new:
2868
2869id: LANG_CHANNEL_CUSTOM
2870desc: in sound_settings
2871eng: "Custom"
2872voice: "Custom"
2873new:
2874
2875
diff --git a/apps/main.c b/apps/main.c
index 964a7c8b4f..cc270ba136 100644
--- a/apps/main.c
+++ b/apps/main.c
@@ -140,6 +140,7 @@ void init(void)
140 global_settings.loudness, 140 global_settings.loudness,
141 global_settings.avc, 141 global_settings.avc,
142 global_settings.channel_config, 142 global_settings.channel_config,
143 global_settings.stereo_width,
143 global_settings.mdb_strength, 144 global_settings.mdb_strength,
144 global_settings.mdb_harmonics, 145 global_settings.mdb_harmonics,
145 global_settings.mdb_center, 146 global_settings.mdb_center,
@@ -272,6 +273,7 @@ void init(void)
272 global_settings.loudness, 273 global_settings.loudness,
273 global_settings.avc, 274 global_settings.avc,
274 global_settings.channel_config, 275 global_settings.channel_config,
276 global_settings.stereo_width,
275 global_settings.mdb_strength, 277 global_settings.mdb_strength,
276 global_settings.mdb_harmonics, 278 global_settings.mdb_harmonics,
277 global_settings.mdb_center, 279 global_settings.mdb_center,
diff --git a/apps/settings.c b/apps/settings.c
index d4945d4431..ca1b900ef4 100644
--- a/apps/settings.c
+++ b/apps/settings.c
@@ -71,7 +71,7 @@ const char rec_base_directory[] = REC_BASE_DIR;
71 71
72 72
73 73
74#define CONFIG_BLOCK_VERSION 18 74#define CONFIG_BLOCK_VERSION 19
75#define CONFIG_BLOCK_SIZE 512 75#define CONFIG_BLOCK_SIZE 512
76#define RTC_BLOCK_SIZE 44 76#define RTC_BLOCK_SIZE 44
77 77
@@ -170,8 +170,9 @@ static const struct bit_entry rtc_bits[] =
170 {3, S_O(avc), 0, "auto volume", "off,20ms,2,4,8" }, 170 {3, S_O(avc), 0, "auto volume", "off,20ms,2,4,8" },
171 {1, S_O(superbass), false, "superbass", off_on }, 171 {1, S_O(superbass), false, "superbass", off_on },
172#endif 172#endif
173 {3, S_O(channel_config), 6, "channels", 173 {3, S_O(channel_config), 0, "channels",
174 "stereo,stereo narrow,mono,mono left,mono right,karaoke,stereo wide" }, 174 "stereo,mono,custom,mono left,mono right,karaoke" },
175 {8, S_O(stereo_width), 100, "stereo width", NULL},
175 /* playback */ 176 /* playback */
176 {2, S_O(resume), RESUME_ASK, "resume", "off,ask,ask once,on" }, 177 {2, S_O(resume), RESUME_ASK, "resume", "off,ask,ask once,on" },
177 {1, S_O(playlist_shuffle), false, "shuffle", off_on }, 178 {1, S_O(playlist_shuffle), false, "shuffle", off_on },
@@ -206,7 +207,7 @@ static const struct bit_entry rtc_bits[] =
206#endif 207#endif
207 {1, S_O(show_icons), true, "show icons", off_on }, 208 {1, S_O(show_icons), true, "show icons", off_on },
208 /* system */ 209 /* system */
209 {4, S_O(poweroff), 10, 210 {4, S_O(poweroff), 10,
210 "idle poweroff", "off,1,2,3,4,5,6,7,8,9,10,15,30,45,60" }, 211 "idle poweroff", "off,1,2,3,4,5,6,7,8,9,10,15,30,45,60" },
211 {18, S_O(runtime), 0, NULL, NULL }, 212 {18, S_O(runtime), 0, NULL, NULL },
212 {18, S_O(topruntime), 0, NULL, NULL }, 213 {18, S_O(topruntime), 0, NULL, NULL },
@@ -221,19 +222,20 @@ static const struct bit_entry rtc_bits[] =
221#endif 222#endif
222 {12, S_O(battery_capacity), BATTERY_CAPACITY_MIN, "battery capacity", 223 {12, S_O(battery_capacity), BATTERY_CAPACITY_MIN, "battery capacity",
223 NULL }, /* 1500...3200 for NiMH, 2200...3200 for LiIon, 224 NULL }, /* 1500...3200 for NiMH, 2200...3200 for LiIon,
224 1000...2000 for Alkaline */ 225 500...1500 for Alkaline */
225#ifdef HAVE_CHARGING 226#ifdef HAVE_CHARGING
226 {1, S_O(car_adapter_mode), false, "car adapter mode", off_on }, 227 {1, S_O(car_adapter_mode), false, "car adapter mode", off_on },
227#endif 228#endif
228 229 /* tuner */
229 /* new stuff to be added here */
230 /* If values are just added to the end, no need to bump the version. */
231#ifdef CONFIG_TUNER 230#ifdef CONFIG_TUNER
232 {1, S_O(fm_force_mono), false, "force fm mono", off_on }, 231 {1, S_O(fm_force_mono), false, "force fm mono", off_on },
233 {8, S_O(last_frequency), 0, NULL, NULL }, /* Default: MIN_FREQ */ 232 {8, S_O(last_frequency), 0, NULL, NULL }, /* Default: MIN_FREQ */
234#endif 233#endif
235 234
236 /* Current sum of bits: 286 (worst case) */ 235 /* new stuff to be added here */
236 /* If values are just added to the end, no need to bump the version. */
237
238 /* Current sum of bits: 259 (worst case) */
237 /* Sum of all bit sizes must not grow beyond 288! */ 239 /* Sum of all bit sizes must not grow beyond 288! */
238}; 240};
239 241
@@ -716,6 +718,7 @@ void sound_settings_apply(void)
716 mpeg_sound_set(SOUND_BALANCE, global_settings.balance); 718 mpeg_sound_set(SOUND_BALANCE, global_settings.balance);
717 mpeg_sound_set(SOUND_VOLUME, global_settings.volume); 719 mpeg_sound_set(SOUND_VOLUME, global_settings.volume);
718 mpeg_sound_set(SOUND_CHANNELS, global_settings.channel_config); 720 mpeg_sound_set(SOUND_CHANNELS, global_settings.channel_config);
721 mpeg_sound_set(SOUND_STEREO_WIDTH, global_settings.stereo_width);
719#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F) 722#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
720 mpeg_sound_set(SOUND_LOUDNESS, global_settings.loudness); 723 mpeg_sound_set(SOUND_LOUDNESS, global_settings.loudness);
721 mpeg_sound_set(SOUND_AVC, global_settings.avc); 724 mpeg_sound_set(SOUND_AVC, global_settings.avc);
@@ -1261,6 +1264,7 @@ void settings_reset(void) {
1261 global_settings.loudness = mpeg_sound_default(SOUND_LOUDNESS); 1264 global_settings.loudness = mpeg_sound_default(SOUND_LOUDNESS);
1262 global_settings.avc = mpeg_sound_default(SOUND_AVC); 1265 global_settings.avc = mpeg_sound_default(SOUND_AVC);
1263 global_settings.channel_config = mpeg_sound_default(SOUND_CHANNELS); 1266 global_settings.channel_config = mpeg_sound_default(SOUND_CHANNELS);
1267 global_settings.stereo_width = mpeg_sound_default(SOUND_STEREO_WIDTH);
1264 global_settings.mdb_strength = mpeg_sound_default(SOUND_MDB_STRENGTH); 1268 global_settings.mdb_strength = mpeg_sound_default(SOUND_MDB_STRENGTH);
1265 global_settings.mdb_harmonics = mpeg_sound_default(SOUND_MDB_HARMONICS); 1269 global_settings.mdb_harmonics = mpeg_sound_default(SOUND_MDB_HARMONICS);
1266 global_settings.mdb_center = mpeg_sound_default(SOUND_MDB_CENTER); 1270 global_settings.mdb_center = mpeg_sound_default(SOUND_MDB_CENTER);
diff --git a/apps/settings.h b/apps/settings.h
index 8d92aa9ad1..88bc71804a 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -129,7 +129,8 @@ struct user_settings
129 int treble; /* treble eq: 0-100 0=low 100=high */ 129 int treble; /* treble eq: 0-100 0=low 100=high */
130 int loudness; /* loudness eq: 0-100 0=off 100=max */ 130 int loudness; /* loudness eq: 0-100 0=off 100=max */
131 int avc; /* auto volume correct: 0=off, 1=20ms, 2=2s 3=4s 4=8s */ 131 int avc; /* auto volume correct: 0=off, 1=20ms, 2=2s 3=4s 4=8s */
132 int channel_config; /* Stereo, Mono, Mono left, Mono right */ 132 int channel_config; /* Stereo, Mono, Custom, Mono left, Mono right, Karaoke */
133 int stereo_width; /* 0-255% */
133 int mdb_strength; /* 0-127dB */ 134 int mdb_strength; /* 0-127dB */
134 int mdb_harmonics; /* 0-100% */ 135 int mdb_harmonics; /* 0-100% */
135 int mdb_center; /* 20-300Hz */ 136 int mdb_center; /* 20-300Hz */
diff --git a/apps/sound_menu.c b/apps/sound_menu.c
index de5b8c0a8c..6e5b74bfa3 100644
--- a/apps/sound_menu.c
+++ b/apps/sound_menu.c
@@ -385,19 +385,20 @@ static bool chanconf(void)
385{ 385{
386 static const struct opt_items names[] = { 386 static const struct opt_items names[] = {
387 { STR(LANG_CHANNEL_STEREO) }, 387 { STR(LANG_CHANNEL_STEREO) },
388#ifdef HAVE_LCD_CHARCELLS
389 { STR(LANG_CHANNEL_STEREO_NARROW_PLAYER) },
390#else
391 { STR(LANG_CHANNEL_STEREO_NARROW_RECORDER) },
392#endif
393 { STR(LANG_CHANNEL_MONO) }, 388 { STR(LANG_CHANNEL_MONO) },
389 { STR(LANG_CHANNEL_CUSTOM) },
394 { STR(LANG_CHANNEL_LEFT) }, 390 { STR(LANG_CHANNEL_LEFT) },
395 { STR(LANG_CHANNEL_RIGHT) }, 391 { STR(LANG_CHANNEL_RIGHT) },
396 { STR(LANG_CHANNEL_KARAOKE) }, 392 { STR(LANG_CHANNEL_KARAOKE) }
397 { STR(LANG_CHANNEL_STEREO_WIDE) }
398 }; 393 };
399 return set_option(str(LANG_CHANNEL), &global_settings.channel_config, INT, 394 return set_option(str(LANG_CHANNEL), &global_settings.channel_config, INT,
400 names, 7, set_chanconf ); 395 names, 6, set_chanconf );
396}
397
398static bool stereo_width(void)
399{
400 return set_sound(str(LANG_STEREO_WIDTH), &global_settings.stereo_width,
401 SOUND_STEREO_WIDTH);
401} 402}
402 403
403bool sound_menu(void) 404bool sound_menu(void)
@@ -410,6 +411,7 @@ bool sound_menu(void)
410 { ID2P(LANG_TREBLE), treble }, 411 { ID2P(LANG_TREBLE), treble },
411 { ID2P(LANG_BALANCE), balance }, 412 { ID2P(LANG_BALANCE), balance },
412 { ID2P(LANG_CHANNEL_MENU), chanconf }, 413 { ID2P(LANG_CHANNEL_MENU), chanconf },
414 { ID2P(LANG_STEREO_WIDTH), stereo_width },
413#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F) 415#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
414 { ID2P(LANG_LOUDNESS), loudness }, 416 { ID2P(LANG_LOUDNESS), loudness },
415 { ID2P(LANG_AUTOVOL), avc }, 417 { ID2P(LANG_AUTOVOL), avc },
diff --git a/firmware/export/mp3_playback.h b/firmware/export/mp3_playback.h
index 456569342b..aced6ddc94 100644
--- a/firmware/export/mp3_playback.h
+++ b/firmware/export/mp3_playback.h
@@ -25,8 +25,8 @@
25#include <stdbool.h> 25#include <stdbool.h>
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, int loudness,
29 int loudness, int avc, int channel_config, 29 int avc, int channel_config, int stereo_width,
30 int mdb_strength, int mdb_harmonics, 30 int mdb_strength, int mdb_harmonics,
31 int mdb_center, int mdb_shape, bool mdb_enable, 31 int mdb_center, int mdb_shape, bool mdb_enable,
32 bool superbass); 32 bool superbass);
@@ -70,23 +70,23 @@ void mp3_shutdown(void);
70#define SOUND_LOUDNESS 4 70#define SOUND_LOUDNESS 4
71#define SOUND_AVC 5 71#define SOUND_AVC 5
72#define SOUND_CHANNELS 6 72#define SOUND_CHANNELS 6
73#define SOUND_LEFT_GAIN 7 73#define SOUND_STEREO_WIDTH 7
74#define SOUND_RIGHT_GAIN 8 74#define SOUND_LEFT_GAIN 8
75#define SOUND_MIC_GAIN 9 75#define SOUND_RIGHT_GAIN 9
76#define SOUND_MDB_STRENGTH 10 76#define SOUND_MIC_GAIN 10
77#define SOUND_MDB_HARMONICS 11 77#define SOUND_MDB_STRENGTH 11
78#define SOUND_MDB_CENTER 12 78#define SOUND_MDB_HARMONICS 12
79#define SOUND_MDB_SHAPE 13 79#define SOUND_MDB_CENTER 13
80#define SOUND_MDB_ENABLE 14 80#define SOUND_MDB_SHAPE 14
81#define SOUND_SUPERBASS 15 81#define SOUND_MDB_ENABLE 15
82#define SOUND_NUMSETTINGS 16 82#define SOUND_SUPERBASS 16
83#define SOUND_NUMSETTINGS 17
83 84
84#define MPEG_SOUND_STEREO 0 85#define MPEG_SOUND_STEREO 0
85#define MPEG_SOUND_STEREO_NARROW 1 86#define MPEG_SOUND_MONO 1
86#define MPEG_SOUND_MONO 2 87#define MPEG_SOUND_CUSTOM 2
87#define MPEG_SOUND_MONO_LEFT 3 88#define MPEG_SOUND_MONO_LEFT 3
88#define MPEG_SOUND_MONO_RIGHT 4 89#define MPEG_SOUND_MONO_RIGHT 4
89#define MPEG_SOUND_KARAOKE 5 90#define MPEG_SOUND_KARAOKE 5
90#define MPEG_SOUND_STEREO_WIDE 6
91 91
92#endif /* #ifndef _MP3_PLAYBACK_H_ */ 92#endif /* #ifndef _MP3_PLAYBACK_H_ */
diff --git a/firmware/mp3_playback.c b/firmware/mp3_playback.c
index 140d1ff75b..f2c588c6b5 100644
--- a/firmware/mp3_playback.c
+++ b/firmware/mp3_playback.c
@@ -72,6 +72,7 @@ static const char* const units[] =
72 "dB", /* Loudness */ 72 "dB", /* Loudness */
73 "", /* AVC */ 73 "", /* AVC */
74 "", /* Channels */ 74 "", /* Channels */
75 "%", /* Stereo width */
75 "dB", /* Left gain */ 76 "dB", /* Left gain */
76 "dB", /* Right gain */ 77 "dB", /* Right gain */
77 "dB", /* Mic gain */ 78 "dB", /* Mic gain */
@@ -92,6 +93,7 @@ static const int numdecimals[] =
92 0, /* Loudness */ 93 0, /* Loudness */
93 0, /* AVC */ 94 0, /* AVC */
94 0, /* Channels */ 95 0, /* Channels */
96 0, /* Stereo width */
95 1, /* Left gain */ 97 1, /* Left gain */
96 1, /* Right gain */ 98 1, /* Right gain */
97 1, /* Mic gain */ 99 1, /* Mic gain */
@@ -112,6 +114,7 @@ static const int steps[] =
112 1, /* Loudness */ 114 1, /* Loudness */
113 1, /* AVC */ 115 1, /* AVC */
114 1, /* Channels */ 116 1, /* Channels */
117 1, /* Stereo width */
115 1, /* Left gain */ 118 1, /* Left gain */
116 1, /* Right gain */ 119 1, /* Right gain */
117 1, /* Mic gain */ 120 1, /* Mic gain */
@@ -137,6 +140,7 @@ static const int minval[] =
137 0, /* Loudness */ 140 0, /* Loudness */
138 -1, /* AVC */ 141 -1, /* AVC */
139 0, /* Channels */ 142 0, /* Channels */
143 0, /* Stereo width */
140 0, /* Left gain */ 144 0, /* Left gain */
141 0, /* Right gain */ 145 0, /* Right gain */
142 0, /* Mic gain */ 146 0, /* Mic gain */
@@ -161,7 +165,8 @@ static const int maxval[] =
161 100, /* Balance */ 165 100, /* Balance */
162 17, /* Loudness */ 166 17, /* Loudness */
163 4, /* AVC */ 167 4, /* AVC */
164 6, /* Channels */ 168 5, /* Channels */
169 255, /* Stereo width */
165 15, /* Left gain */ 170 15, /* Left gain */
166 15, /* Right gain */ 171 15, /* Right gain */
167 15, /* Mic gain */ 172 15, /* Mic gain */
@@ -187,6 +192,7 @@ static const int defaultval[] =
187 0, /* Loudness */ 192 0, /* Loudness */
188 0, /* AVC */ 193 0, /* AVC */
189 0, /* Channels */ 194 0, /* Channels */
195 100, /* Stereo width */
190 8, /* Left gain */ 196 8, /* Left gain */
191 8, /* Right gain */ 197 8, /* Right gain */
192 2, /* Mic gain */ 198 2, /* Mic gain */
@@ -566,8 +572,6 @@ static void init_playback(void)
566 mas_readmem(MAS_BANK_D0, MAS_D0_APP_RUNNING, &val, 1); 572 mas_readmem(MAS_BANK_D0, MAS_D0_APP_RUNNING, &val, 1);
567 } while((val & 0x0c) != 0x0c); 573 } while((val & 0x0c) != 0x0c);
568 574
569 mpeg_sound_channel_config(MPEG_SOUND_STEREO);
570
571#if CONFIG_HWCODEC == MAS3587F 575#if CONFIG_HWCODEC == MAS3587F
572 mpeg_mode = MPEG_DECODER; 576 mpeg_mode = MPEG_DECODER;
573#endif 577#endif
@@ -619,6 +623,89 @@ void set_prescaled_volume(void)
619#endif /* MAS3507D */ 623#endif /* MAS3507D */
620#endif /* !SIMULATOR */ 624#endif /* !SIMULATOR */
621 625
626int channel_configuration = MPEG_SOUND_STEREO;
627int stereo_width = 100;
628
629#ifndef SIMULATOR
630static void set_channel_config(void)
631{
632 /* default values: stereo */
633 unsigned long val_ll = 0x80000;
634 unsigned long val_lr = 0;
635 unsigned long val_rl = 0;
636 unsigned long val_rr = 0x80000;
637
638 switch(channel_configuration)
639 {
640 /* case MPEG_SOUND_STEREO unnecessary */
641
642 case MPEG_SOUND_MONO:
643 val_ll = 0xc0000;
644 val_lr = 0xc0000;
645 val_rl = 0xc0000;
646 val_rr = 0xc0000;
647 break;
648
649 case MPEG_SOUND_CUSTOM:
650 {
651 /* fixed point variables (matching MAS internal format)
652 integer part: upper 13 bits (inlcuding sign)
653 fractional part: lower 19 bits */
654 long fp_width, fp_straight, fp_cross;
655
656 fp_width = (stereo_width << 19) / 100;
657 if (stereo_width <= 100)
658 {
659 fp_straight = - ((1<<19) + fp_width) / 2;
660 fp_cross = fp_straight + fp_width;
661 }
662 else
663 {
664 fp_straight = - (1<<19);
665 fp_cross = ((2 * fp_width / (((1<<19) + fp_width) >> 10))
666 << 9) - (1<<19);
667 }
668 val_ll = val_rr = fp_straight & 0xFFFFF;
669 val_lr = val_rl = fp_cross & 0xFFFFF;
670 }
671 break;
672
673 case MPEG_SOUND_MONO_LEFT:
674 val_ll = 0x80000;
675 val_lr = 0x80000;
676 val_rl = 0;
677 val_rr = 0;
678 break;
679
680 case MPEG_SOUND_MONO_RIGHT:
681 val_ll = 0;
682 val_lr = 0;
683 val_rl = 0x80000;
684 val_rr = 0x80000;
685 break;
686
687 case MPEG_SOUND_KARAOKE:
688 val_ll = 0x80001;
689 val_lr = 0x7ffff;
690 val_rl = 0x7ffff;
691 val_rr = 0x80001;
692 break;
693 }
694
695#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
696 mas_writemem(MAS_BANK_D0, MAS_D0_OUT_LL, &val_ll, 1); /* LL */
697 mas_writemem(MAS_BANK_D0, MAS_D0_OUT_LR, &val_lr, 1); /* LR */
698 mas_writemem(MAS_BANK_D0, MAS_D0_OUT_RL, &val_rl, 1); /* RL */
699 mas_writemem(MAS_BANK_D0, MAS_D0_OUT_RR, &val_rr, 1); /* RR */
700#elif CONFIG_HWCODEC == MAS3507D
701 mas_writemem(MAS_BANK_D1, 0x7f8, &val_ll, 1); /* LL */
702 mas_writemem(MAS_BANK_D1, 0x7f9, &val_lr, 1); /* LR */
703 mas_writemem(MAS_BANK_D1, 0x7fa, &val_rl, 1); /* RL */
704 mas_writemem(MAS_BANK_D1, 0x7fb, &val_rr, 1); /* RR */
705#endif
706}
707#endif /* !SIMULATOR */
708
622#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F) 709#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
623unsigned long mdb_shape_shadow = 0; 710unsigned long mdb_shape_shadow = 0;
624unsigned long loudness_shadow = 0; 711unsigned long loudness_shadow = 0;
@@ -766,7 +853,14 @@ void mpeg_sound_set(int setting, int value)
766 break; 853 break;
767#endif 854#endif
768 case SOUND_CHANNELS: 855 case SOUND_CHANNELS:
769 mpeg_sound_channel_config(value); 856 channel_configuration = value;
857 set_channel_config();
858 break;
859
860 case SOUND_STEREO_WIDTH:
861 stereo_width = value;
862 if (channel_configuration == MPEG_SOUND_CUSTOM)
863 set_channel_config();
770 break; 864 break;
771 } 865 }
772#endif /* SIMULATOR */ 866#endif /* SIMULATOR */
@@ -799,82 +893,6 @@ int mpeg_val2phys(int setting, int value)
799#endif 893#endif
800} 894}
801 895
802void mpeg_sound_channel_config(int configuration)
803{
804#ifdef SIMULATOR
805 (void)configuration;
806#else
807 unsigned long val_ll = 0x80000;
808 unsigned long val_lr = 0;
809 unsigned long val_rl = 0;
810 unsigned long val_rr = 0x80000;
811
812 switch(configuration)
813 {
814 case MPEG_SOUND_STEREO:
815 val_ll = 0x80000;
816 val_lr = 0;
817 val_rl = 0;
818 val_rr = 0x80000;
819 break;
820
821 case MPEG_SOUND_MONO:
822 val_ll = 0xc0000;
823 val_lr = 0xc0000;
824 val_rl = 0xc0000;
825 val_rr = 0xc0000;
826 break;
827
828 case MPEG_SOUND_MONO_LEFT:
829 val_ll = 0x80000;
830 val_lr = 0x80000;
831 val_rl = 0;
832 val_rr = 0;
833 break;
834
835 case MPEG_SOUND_MONO_RIGHT:
836 val_ll = 0;
837 val_lr = 0;
838 val_rl = 0x80000;
839 val_rr = 0x80000;
840 break;
841
842 case MPEG_SOUND_STEREO_NARROW:
843 val_ll = 0xa0000;
844 val_lr = 0xe0000;
845 val_rl = 0xe0000;
846 val_rr = 0xa0000;
847 break;
848
849 case MPEG_SOUND_STEREO_WIDE:
850 val_ll = 0x80000;
851 val_lr = 0x40000;
852 val_rl = 0x40000;
853 val_rr = 0x80000;
854 break;
855
856 case MPEG_SOUND_KARAOKE:
857 val_ll = 0x80001;
858 val_lr = 0x7ffff;
859 val_rl = 0x7ffff;
860 val_rr = 0x80001;
861 break;
862 }
863
864#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
865 mas_writemem(MAS_BANK_D0, MAS_D0_OUT_LL, &val_ll, 1); /* LL */
866 mas_writemem(MAS_BANK_D0, MAS_D0_OUT_LR, &val_lr, 1); /* LR */
867 mas_writemem(MAS_BANK_D0, MAS_D0_OUT_RL, &val_rl, 1); /* RL */
868 mas_writemem(MAS_BANK_D0, MAS_D0_OUT_RR, &val_rr, 1); /* RR */
869#else
870 mas_writemem(MAS_BANK_D1, 0x7f8, &val_ll, 1); /* LL */
871 mas_writemem(MAS_BANK_D1, 0x7f9, &val_lr, 1); /* LR */
872 mas_writemem(MAS_BANK_D1, 0x7fa, &val_rl, 1); /* RL */
873 mas_writemem(MAS_BANK_D1, 0x7fb, &val_rr, 1); /* RR */
874#endif
875#endif
876}
877
878#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F) 896#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
879/* This function works by telling the decoder that we have another 897/* This function works by telling the decoder that we have another
880 crystal frequency than we actually have. It will adjust its internal 898 crystal frequency than we actually have. It will adjust its internal
@@ -901,7 +919,7 @@ void mpeg_set_pitch(int pitch)
901#endif 919#endif
902 920
903void mp3_init(int volume, int bass, int treble, int balance, int loudness, 921void mp3_init(int volume, int bass, int treble, int balance, int loudness,
904 int avc, int channel_config, 922 int avc, int channel_config, int stereo_width,
905 int mdb_strength, int mdb_harmonics, 923 int mdb_strength, int mdb_harmonics,
906 int mdb_center, int mdb_shape, bool mdb_enable, 924 int mdb_center, int mdb_shape, bool mdb_enable,
907 bool superbass) 925 bool superbass)
@@ -914,6 +932,7 @@ void mp3_init(int volume, int bass, int treble, int balance, int loudness,
914 (void)loudness; 932 (void)loudness;
915 (void)avc; 933 (void)avc;
916 (void)channel_config; 934 (void)channel_config;
935 (void)stereo_width;
917 (void)mdb_strength; 936 (void)mdb_strength;
918 (void)mdb_harmonics; 937 (void)mdb_harmonics;
919 (void)mdb_center; 938 (void)mdb_center;
@@ -1015,8 +1034,6 @@ void mp3_init(int volume, int bass, int treble, int balance, int loudness,
1015 1034
1016 mas_writereg(MAS_REG_KPRESCALE, 0xe9400); 1035 mas_writereg(MAS_REG_KPRESCALE, 0xe9400);
1017 dac_enable(true); 1036 dac_enable(true);
1018
1019 mpeg_sound_channel_config(channel_config);
1020#endif 1037#endif
1021 1038
1022#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F) 1039#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
@@ -1031,9 +1048,10 @@ void mp3_init(int volume, int bass, int treble, int balance, int loudness,
1031 mpeg_sound_set(SOUND_TREBLE, treble); 1048 mpeg_sound_set(SOUND_TREBLE, treble);
1032 mpeg_sound_set(SOUND_BALANCE, balance); 1049 mpeg_sound_set(SOUND_BALANCE, balance);
1033 mpeg_sound_set(SOUND_VOLUME, volume); 1050 mpeg_sound_set(SOUND_VOLUME, volume);
1051 mpeg_sound_set(SOUND_CHANNELS, channel_config);
1052 mpeg_sound_set(SOUND_STEREO_WIDTH, stereo_width);
1034 1053
1035#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F) 1054#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
1036 mpeg_sound_channel_config(channel_config);
1037 mpeg_sound_set(SOUND_LOUDNESS, loudness); 1055 mpeg_sound_set(SOUND_LOUDNESS, loudness);
1038 mpeg_sound_set(SOUND_AVC, avc); 1056 mpeg_sound_set(SOUND_AVC, avc);
1039 mpeg_sound_set(SOUND_MDB_STRENGTH, mdb_strength); 1057 mpeg_sound_set(SOUND_MDB_STRENGTH, mdb_strength);