diff options
author | Thom Johansen <thomj@rockbox.org> | 2007-03-07 15:00:29 +0000 |
---|---|---|
committer | Thom Johansen <thomj@rockbox.org> | 2007-03-07 15:00:29 +0000 |
commit | 2d7bb99c524c5da0d3360161f298503dcfbb01c7 (patch) | |
tree | edd8a481f7b1ae3ea2f8800ce937e1b0344136a3 /firmware | |
parent | a844a1833766d45acee28d37ffd0acc938be0fbd (diff) | |
download | rockbox-2d7bb99c524c5da0d3360161f298503dcfbb01c7.tar.gz rockbox-2d7bb99c524c5da0d3360161f298503dcfbb01c7.zip |
Hack around the lack of a hardware prescaler on a number of WM codecs. Bass and treble controls should work on DAPs using these chips now, but will be prone to distort when boosting bass. Gut out UDA1380 code(!!) and switch to high bass cutoff and low treble cutoff in WM8975 driver.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12673 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/drivers/wm8975.c | 37 | ||||
-rw-r--r-- | firmware/sound.c | 13 |
2 files changed, 26 insertions, 24 deletions
diff --git a/firmware/drivers/wm8975.c b/firmware/drivers/wm8975.c index 89e0b155da..9052236131 100644 --- a/firmware/drivers/wm8975.c +++ b/firmware/drivers/wm8975.c | |||
@@ -53,7 +53,7 @@ int tenthdb2master(int db) | |||
53 | /* 1111111 == +6dB (0x7f) */ | 53 | /* 1111111 == +6dB (0x7f) */ |
54 | /* 1111001 == 0dB (0x79) */ | 54 | /* 1111001 == 0dB (0x79) */ |
55 | /* 0110000 == -73dB (0x30 */ | 55 | /* 0110000 == -73dB (0x30 */ |
56 | /* 0101111 == mute (0x2f) */ | 56 | /* 0101111..0000000 == mute (0x2f) */ |
57 | 57 | ||
58 | if (db < VOLUME_MIN) { | 58 | if (db < VOLUME_MIN) { |
59 | return 0x0; | 59 | return 0x0; |
@@ -65,14 +65,8 @@ int tenthdb2master(int db) | |||
65 | /* convert tenth of dB volume (-780..0) to mixer volume register value */ | 65 | /* convert tenth of dB volume (-780..0) to mixer volume register value */ |
66 | int tenthdb2mixer(int db) | 66 | int tenthdb2mixer(int db) |
67 | { | 67 | { |
68 | if (db < -660) /* 1.5 dB steps */ | 68 | (void)db; |
69 | return (2640 - db) / 15; | 69 | return 0; |
70 | else if (db < -600) /* 0.75 dB steps */ | ||
71 | return (990 - db) * 2 / 15; | ||
72 | else if (db < -460) /* 0.5 dB steps */ | ||
73 | return (460 - db) / 5; | ||
74 | else /* 0.25 dB steps */ | ||
75 | return -db * 2 / 5; | ||
76 | } | 70 | } |
77 | 71 | ||
78 | 72 | ||
@@ -171,25 +165,28 @@ int audiohw_set_mixer_vol(int channel1, int channel2) | |||
171 | return 0; | 165 | return 0; |
172 | } | 166 | } |
173 | 167 | ||
174 | /* We are using Linear bass control */ | ||
175 | void audiohw_set_bass(int value) | 168 | void audiohw_set_bass(int value) |
176 | { | 169 | { |
177 | int regvalues[]={11, 10, 10, 9, 8, 8, 0xf , 6, 6, 5, 4, 4, 3, 2, 1, 0}; | 170 | const int regvalues[] = { |
171 | 11, 10, 10, 9, 8, 8, 0xf, 6, 6, 5, 4, 4, 3, 2, 1, 0 | ||
172 | }; | ||
178 | 173 | ||
179 | if ((value >= -6) && (value <= 9)) { | 174 | if ((value >= -6) && (value <= 9)) { |
180 | /* We use linear bass control with 130Hz cutoff */ | 175 | /* We use linear bass control with 200 Hz cutoff */ |
181 | wmcodec_write(BASSCTRL, regvalues[value+6]); | 176 | wmcodec_write(BASSCTRL, regvalues[value + 6] | 0x40); |
182 | } | 177 | } |
183 | } | 178 | } |
184 | 179 | ||
185 | void audiohw_set_treble(int value) | 180 | void audiohw_set_treble(int value) |
186 | { | 181 | { |
187 | int regvalues[]={11, 10, 10, 9, 8, 8, 0xf , 6, 6, 5, 4, 4, 3, 2, 1, 0}; | 182 | const int regvalues[] = { |
183 | 11, 10, 10, 9, 8, 8, 0xf, 6, 6, 5, 4, 4, 3, 2, 1, 0 | ||
184 | }; | ||
188 | 185 | ||
189 | if ((value >= -6) && (value <= 9)) { | 186 | if ((value >= -6) && (value <= 9)) { |
190 | /* We use a 8Khz cutoff */ | 187 | /* We use linear treble control with 4 kHz cutoff */ |
191 | wmcodec_write(TREBCTRL, regvalues[value+6]); | 188 | wmcodec_write(TREBCTRL, regvalues[value + 6] | 0x40); |
192 | } | 189 | } |
193 | } | 190 | } |
194 | 191 | ||
195 | int audiohw_mute(int mute) | 192 | int audiohw_mute(int mute) |
diff --git a/firmware/sound.c b/firmware/sound.c index 01d76a0a39..6182e6b567 100644 --- a/firmware/sound.c +++ b/firmware/sound.c | |||
@@ -312,9 +312,14 @@ int current_bass = 0; /* -150..+150 0..+240 */ | |||
312 | 312 | ||
313 | static void set_prescaled_volume(void) | 313 | static void set_prescaled_volume(void) |
314 | { | 314 | { |
315 | int prescale; | 315 | int prescale = 0; |
316 | int l, r; | 316 | int l, r; |
317 | 317 | ||
318 | /* The WM codecs listed don't have suitable prescaler functionality, so we let | ||
319 | * the prescaler stay at 0 for these unless SW tone controls are in use */ | ||
320 | #if defined(HAVE_SW_TONE_CONTROLS) || !(defined(HAVE_WM8975) \ | ||
321 | || defined(HAVE_WM8731) || defined(HAVE_WM8721) || defined(HAVE_WM8751)) | ||
322 | |||
318 | prescale = MAX(current_bass, current_treble); | 323 | prescale = MAX(current_bass, current_treble); |
319 | if (prescale < 0) | 324 | if (prescale < 0) |
320 | prescale = 0; /* no need to prescale if we don't boost | 325 | prescale = 0; /* no need to prescale if we don't boost |
@@ -325,13 +330,13 @@ static void set_prescaled_volume(void) | |||
325 | * instead (might cause clipping). */ | 330 | * instead (might cause clipping). */ |
326 | if (current_volume + prescale > VOLUME_MAX) | 331 | if (current_volume + prescale > VOLUME_MAX) |
327 | prescale = VOLUME_MAX - current_volume; | 332 | prescale = VOLUME_MAX - current_volume; |
328 | 333 | #endif | |
334 | |||
329 | #if defined(HAVE_SW_TONE_CONTROLS) | 335 | #if defined(HAVE_SW_TONE_CONTROLS) |
330 | dsp_callback(DSP_CALLBACK_SET_PRESCALE, prescale); | 336 | dsp_callback(DSP_CALLBACK_SET_PRESCALE, prescale); |
331 | #elif CONFIG_CODEC == MAS3507D | 337 | #elif CONFIG_CODEC == MAS3507D |
332 | mas_writereg(MAS_REG_KPRESCALE, prescale_table[prescale/10]); | 338 | mas_writereg(MAS_REG_KPRESCALE, prescale_table[prescale/10]); |
333 | #elif defined(HAVE_UDA1380) || defined(HAVE_WM8975) || defined(HAVE_WM8758) \ | 339 | #elif defined(HAVE_UDA1380) || defined(HAVE_WM8758) |
334 | || defined(HAVE_WM8731) || defined(HAVE_WM8721) || defined(HAVE_WM8751) | ||
335 | audiohw_set_mixer_vol(tenthdb2mixer(-prescale), tenthdb2mixer(-prescale)); | 340 | audiohw_set_mixer_vol(tenthdb2mixer(-prescale), tenthdb2mixer(-prescale)); |
336 | #endif | 341 | #endif |
337 | 342 | ||