summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Chapman <dave@dchapman.com>2006-01-30 21:12:31 +0000
committerDave Chapman <dave@dchapman.com>2006-01-30 21:12:31 +0000
commit5ffa8c52df2df1096c484efe6815ea8e8b548065 (patch)
treec9add96d65013bfced444a7b77f9c09b8dc785a4
parent1a4ef4fc0aa7a6257995f5df51f686c726802e5b (diff)
downloadrockbox-5ffa8c52df2df1096c484efe6815ea8e8b548065.tar.gz
rockbox-5ffa8c52df2df1096c484efe6815ea8e8b548065.zip
iPod: Initial attempt at volume/bass/treble control - more work is needed, but it seems to be working.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8495 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/drivers/wm8975.c15
-rw-r--r--firmware/sound.c74
2 files changed, 70 insertions, 19 deletions
diff --git a/firmware/drivers/wm8975.c b/firmware/drivers/wm8975.c
index 802bcfa72b..a817284406 100644
--- a/firmware/drivers/wm8975.c
+++ b/firmware/drivers/wm8975.c
@@ -196,14 +196,25 @@ int wm8975_set_mixer_vol(int channel1, int channel2)
196 return 0; 196 return 0;
197} 197}
198 198
199/* We are using Linear bass control */
199void wm8975_set_bass(int value) 200void wm8975_set_bass(int value)
200{ 201{
201 (void)value; 202 int regvalues[]={11, 10, 10, 9, 8, 8, 0xf , 6, 6, 5, 4, 4, 3, 2, 1, 0};
203
204 if ((value >= -6) && (value <= 9)) {
205 /* We use linear bass control with 130Hz cutoff */
206 ipod_i2c_send(0x1a, 0x0c << 1, regvalues[value+6]);
207 }
202} 208}
203 209
204void wm8975_set_treble(int value) 210void wm8975_set_treble(int value)
205{ 211{
206 (void)value; 212 int regvalues[]={11, 10, 10, 9, 8, 8, 0xf , 6, 6, 5, 4, 4, 3, 2, 1, 0};
213
214 if ((value >= -6) && (value <= 9)) {
215 /* We use a 8Khz cutoff */
216 ipod_i2c_send(0x1a, 0x0d << 1, regvalues[value+6]);
217 }
207} 218}
208 219
209int wm8975_mute(int mute) 220int wm8975_mute(int mute)
diff --git a/firmware/sound.c b/firmware/sound.c
index 555280c3d5..41212e72b9 100644
--- a/firmware/sound.c
+++ b/firmware/sound.c
@@ -20,11 +20,14 @@
20#include <stdio.h> 20#include <stdio.h>
21#include "config.h" 21#include "config.h"
22#include "sound.h" 22#include "sound.h"
23#include "logf.h"
23#ifndef SIMULATOR 24#ifndef SIMULATOR
24#include "i2c.h" 25#include "i2c.h"
25#include "mas.h" 26#include "mas.h"
26#ifdef HAVE_UDA1380 27#ifdef HAVE_UDA1380
27#include "uda1380.h" 28#include "uda1380.h"
29#elif defined(HAVE_WM8975)
30#include "wm8975.h"
28#elif HAVE_TLV320 31#elif HAVE_TLV320
29#include "tlv320.h" 32#include "tlv320.h"
30#endif 33#endif
@@ -64,6 +67,10 @@ static const struct sound_settings_info sound_settings_table[] = {
64 [SOUND_VOLUME] = {"dB", 0, 1, -84, 0, -25, sound_set_volume}, 67 [SOUND_VOLUME] = {"dB", 0, 1, -84, 0, -25, sound_set_volume},
65 [SOUND_BASS] = {"dB", 0, 2, 0, 24, 0, sound_set_bass}, 68 [SOUND_BASS] = {"dB", 0, 2, 0, 24, 0, sound_set_bass},
66 [SOUND_TREBLE] = {"dB", 0, 2, 0, 6, 0, sound_set_treble}, 69 [SOUND_TREBLE] = {"dB", 0, 2, 0, 6, 0, sound_set_treble},
70#elif defined(HAVE_WM8975)
71 [SOUND_VOLUME] = {"dB", 0, 1, -73, 6, -25, sound_set_volume},
72 [SOUND_BASS] = {"dB", 0, 1, -6, 9, 0, sound_set_bass},
73 [SOUND_TREBLE] = {"dB", 0, 1, -6, 9, 0, sound_set_treble},
67#else /* MAS3507D */ 74#else /* MAS3507D */
68 [SOUND_VOLUME] = {"dB", 0, 1, -78, 18, -18, sound_set_volume}, 75 [SOUND_VOLUME] = {"dB", 0, 1, -78, 18, -18, sound_set_volume},
69 [SOUND_BASS] = {"dB", 0, 1, -15, 15, 7, sound_set_bass}, 76 [SOUND_BASS] = {"dB", 0, 1, -15, 15, 7, sound_set_bass},
@@ -269,9 +276,42 @@ static int tenthdb2mixer(int db)
269 return -db * 2 / 5; 276 return -db * 2 / 5;
270} 277}
271 278
279#elif defined(HAVE_WM8975) /* volume/balance/treble/bass interdependency */
280#define VOLUME_MIN -730
281#define VOLUME_MAX 60
282
283/* convert tenth of dB volume (-730..60) to master volume register value */
284static int tenthdb2master(int db)
285{
286 /* +6 to -73dB 1dB steps (plus mute == 80levels) 7bits */
287 /* 1111111 == +6dB (0x7f) */
288 /* 1111001 == 0dB (0x79) */
289 /* 0110000 == -73dB (0x30 */
290 /* 0101111 == mute (0x2f) */
291
292 if (db <= -730) {
293 return 0x2f;
294 } else {
295 return((db/10)+74+0x2f);
296 }
297}
298
299/* convert tenth of dB volume (-780..0) to mixer volume register value */
300static int tenthdb2mixer(int db)
301{
302 if (db < -660) /* 1.5 dB steps */
303 return (2640 - db) / 15;
304 else if (db < -600) /* 0.75 dB steps */
305 return (990 - db) * 2 / 15;
306 else if (db < -460) /* 0.5 dB steps */
307 return (460 - db) / 5;
308 else /* 0.25 dB steps */
309 return -db * 2 / 5;
310}
311
272#endif 312#endif
273 313
274#if (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 314#if (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 || defined HAVE_WM8975
275 /* volume/balance/treble/bass interdependency main part */ 315 /* volume/balance/treble/bass interdependency main part */
276#define VOLUME_RANGE (VOLUME_MAX - VOLUME_MIN) 316#define VOLUME_RANGE (VOLUME_MAX - VOLUME_MIN)
277 317
@@ -299,8 +339,10 @@ static void set_prescaled_volume(void)
299 339
300#if CONFIG_CODEC == MAS3507D 340#if CONFIG_CODEC == MAS3507D
301 mas_writereg(MAS_REG_KPRESCALE, prescale_table[prescale/10]); 341 mas_writereg(MAS_REG_KPRESCALE, prescale_table[prescale/10]);
302#else /* UDA1380 */ 342#elif defined(HAVE_UDA1380)
303 uda1380_set_mixer_vol(tenthdb2mixer(-prescale), tenthdb2mixer(-prescale)); 343 uda1380_set_mixer_vol(tenthdb2mixer(-prescale), tenthdb2mixer(-prescale));
344#elif defined(HAVE_WM8975)
345 wm8975_set_mixer_vol(tenthdb2mixer(-prescale), tenthdb2mixer(-prescale));
304#endif 346#endif
305 347
306 if (current_volume == VOLUME_MIN) 348 if (current_volume == VOLUME_MIN)
@@ -323,8 +365,10 @@ static void set_prescaled_volume(void)
323 365
324#if CONFIG_CODEC == MAS3507D 366#if CONFIG_CODEC == MAS3507D
325 dac_volume(tenthdb2reg(l), tenthdb2reg(r), false); 367 dac_volume(tenthdb2reg(l), tenthdb2reg(r), false);
326#else /* UDA1380 */ 368#elif defined(HAVE_UDA1380)
327 uda1380_set_master_vol(tenthdb2master(l), tenthdb2master(r)); 369 uda1380_set_master_vol(tenthdb2master(l), tenthdb2master(r));
370#elif defined(HAVE_WM8975)
371 wm8975_set_master_vol(tenthdb2master(l), tenthdb2master(r));
328#endif 372#endif
329} 373}
330#endif /* (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 */ 374#endif /* (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 */
@@ -424,12 +468,9 @@ void sound_set_volume(int value)
424#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) 468#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
425 unsigned tmp = ((unsigned)(value + 115) & 0xff) << 8; 469 unsigned tmp = ((unsigned)(value + 115) & 0xff) << 8;
426 mas_codec_writereg(0x10, tmp); 470 mas_codec_writereg(0x10, tmp);
427#elif (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 471#elif (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 || defined HAVE_WM8975
428 current_volume = value * 10; /* tenth of dB */ 472 current_volume = value * 10; /* tenth of dB */
429 set_prescaled_volume(); 473 set_prescaled_volume();
430#elif (CONFIG_CPU == PP5020)
431 /* TODO: Implement sound_set_volume() */
432 (void)value;
433#endif 474#endif
434} 475}
435 476
@@ -440,12 +481,9 @@ void sound_set_balance(int value)
440#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) 481#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
441 unsigned tmp = ((unsigned)(value * 127 / 100) & 0xff) << 8; 482 unsigned tmp = ((unsigned)(value * 127 / 100) & 0xff) << 8;
442 mas_codec_writereg(0x11, tmp); 483 mas_codec_writereg(0x11, tmp);
443#elif CONFIG_CODEC == MAS3507D || defined HAVE_UDA1380 484#elif CONFIG_CODEC == MAS3507D || defined HAVE_UDA1380 || defined HAVE_WM8975
444 current_balance = value * VOLUME_RANGE / 100; /* tenth of dB */ 485 current_balance = value * VOLUME_RANGE / 100; /* tenth of dB */
445 set_prescaled_volume(); 486 set_prescaled_volume();
446#elif (CONFIG_CPU == PP5020)
447 /* TODO: Implement sound_set_balance() */
448 (void)value;
449#endif 487#endif
450} 488}
451 489
@@ -464,9 +502,10 @@ void sound_set_bass(int value)
464 uda1380_set_bass(value >> 1); 502 uda1380_set_bass(value >> 1);
465 current_bass = value * 10; 503 current_bass = value * 10;
466 set_prescaled_volume(); 504 set_prescaled_volume();
467#elif (CONFIG_CPU == PP5020) 505#elif defined(HAVE_WM8975)
468 /* TODO: Implement sound_set_bass() */ 506 current_bass = value * 10;
469 (void)value; 507 wm8975_set_bass(value);
508 set_prescaled_volume();
470#endif 509#endif
471} 510}
472 511
@@ -485,9 +524,10 @@ void sound_set_treble(int value)
485 uda1380_set_treble(value >> 1); 524 uda1380_set_treble(value >> 1);
486 current_treble = value * 10; 525 current_treble = value * 10;
487 set_prescaled_volume(); 526 set_prescaled_volume();
488#elif (CONFIG_CPU == PP5020) 527#elif defined(HAVE_WM8975)
489 /* TODO: Implement sound_set_treble() */ 528 wm8975_set_treble(value);
490 (void)value; 529 current_treble = value * 10;
530 set_prescaled_volume();
491#endif 531#endif
492} 532}
493 533