diff options
author | Dave Chapman <dave@dchapman.com> | 2006-02-13 13:48:08 +0000 |
---|---|---|
committer | Dave Chapman <dave@dchapman.com> | 2006-02-13 13:48:08 +0000 |
commit | 9581ad39ec15cf20350d01d2787dea0c7db6074d (patch) | |
tree | 28ead339e852346eb9f4e947e3494353cb687d72 /firmware/sound.c | |
parent | b55f20a12d6b68d0f4f53ab19db76e8b5388d8bb (diff) | |
download | rockbox-9581ad39ec15cf20350d01d2787dea0c7db6074d.tar.gz rockbox-9581ad39ec15cf20350d01d2787dea0c7db6074d.zip |
iPod: Audio driver for iPod Video/5G. Rename wm8971_* functions to wmcodec_* to enable unification of the audio code for WM codecs
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8676 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/sound.c')
-rw-r--r-- | firmware/sound.c | 72 |
1 files changed, 58 insertions, 14 deletions
diff --git a/firmware/sound.c b/firmware/sound.c index 110c2c91b8..a039cca609 100644 --- a/firmware/sound.c +++ b/firmware/sound.c | |||
@@ -28,6 +28,8 @@ | |||
28 | #include "uda1380.h" | 28 | #include "uda1380.h" |
29 | #elif defined(HAVE_WM8975) | 29 | #elif defined(HAVE_WM8975) |
30 | #include "wm8975.h" | 30 | #include "wm8975.h" |
31 | #elif defined(HAVE_WM8758) | ||
32 | #include "wm8758.h" | ||
31 | #elif defined(HAVE_TLV320) | 33 | #elif defined(HAVE_TLV320) |
32 | #include "tlv320.h" | 34 | #include "tlv320.h" |
33 | #endif | 35 | #endif |
@@ -71,6 +73,10 @@ static const struct sound_settings_info sound_settings_table[] = { | |||
71 | [SOUND_VOLUME] = {"dB", 0, 1, -73, 6, -25, sound_set_volume}, | 73 | [SOUND_VOLUME] = {"dB", 0, 1, -73, 6, -25, sound_set_volume}, |
72 | [SOUND_BASS] = {"dB", 0, 1, -6, 9, 0, sound_set_bass}, | 74 | [SOUND_BASS] = {"dB", 0, 1, -6, 9, 0, sound_set_bass}, |
73 | [SOUND_TREBLE] = {"dB", 0, 1, -6, 9, 0, sound_set_treble}, | 75 | [SOUND_TREBLE] = {"dB", 0, 1, -6, 9, 0, sound_set_treble}, |
76 | #elif defined(HAVE_WM8758) | ||
77 | [SOUND_VOLUME] = {"dB", 0, 1, -57, 6, -25, sound_set_volume}, | ||
78 | [SOUND_BASS] = {"dB", 0, 1, -6, 9, 0, sound_set_bass}, | ||
79 | [SOUND_TREBLE] = {"dB", 0, 1, -6, 9, 0, sound_set_treble}, | ||
74 | #else /* MAS3507D */ | 80 | #else /* MAS3507D */ |
75 | [SOUND_VOLUME] = {"dB", 0, 1, -78, 18, -18, sound_set_volume}, | 81 | [SOUND_VOLUME] = {"dB", 0, 1, -78, 18, -18, sound_set_volume}, |
76 | [SOUND_BASS] = {"dB", 0, 1, -15, 15, 7, sound_set_bass}, | 82 | [SOUND_BASS] = {"dB", 0, 1, -15, 15, 7, sound_set_bass}, |
@@ -276,7 +282,8 @@ static int tenthdb2mixer(int db) | |||
276 | return -db * 2 / 5; | 282 | return -db * 2 / 5; |
277 | } | 283 | } |
278 | 284 | ||
279 | #elif defined(HAVE_WM8975) /* volume/balance/treble/bass interdependency */ | 285 | #elif defined(HAVE_WM8975) |
286 | /* volume/balance/treble/bass interdependency */ | ||
280 | #define VOLUME_MIN -730 | 287 | #define VOLUME_MIN -730 |
281 | #define VOLUME_MAX 60 | 288 | #define VOLUME_MAX 60 |
282 | 289 | ||
@@ -290,9 +297,43 @@ static int tenthdb2master(int db) | |||
290 | /* 0101111 == mute (0x2f) */ | 297 | /* 0101111 == mute (0x2f) */ |
291 | 298 | ||
292 | if (db <= -730) { | 299 | if (db <= -730) { |
293 | return 0x2f; | 300 | return 0x0; |
294 | } else { | 301 | } else { |
295 | return((db/10)+74+0x2f); | 302 | return((db/10)+73+0x2f); |
303 | } | ||
304 | } | ||
305 | |||
306 | /* convert tenth of dB volume (-780..0) to mixer volume register value */ | ||
307 | static int tenthdb2mixer(int db) | ||
308 | { | ||
309 | if (db < -660) /* 1.5 dB steps */ | ||
310 | return (2640 - db) / 15; | ||
311 | else if (db < -600) /* 0.75 dB steps */ | ||
312 | return (990 - db) * 2 / 15; | ||
313 | else if (db < -460) /* 0.5 dB steps */ | ||
314 | return (460 - db) / 5; | ||
315 | else /* 0.25 dB steps */ | ||
316 | return -db * 2 / 5; | ||
317 | } | ||
318 | |||
319 | #elif defined(HAVE_WM8758) | ||
320 | /* volume/balance/treble/bass interdependency */ | ||
321 | #define VOLUME_MIN -730 | ||
322 | #define VOLUME_MAX 60 | ||
323 | |||
324 | /* convert tenth of dB volume (-730..60) to master volume register value */ | ||
325 | static int tenthdb2master(int db) | ||
326 | { | ||
327 | /* +6 to -73dB 1dB steps (plus mute == 80levels) 7bits */ | ||
328 | /* 1111111 == +6dB (0x7f) */ | ||
329 | /* 1111001 == 0dB (0x79) */ | ||
330 | /* 0110000 == -73dB (0x30 */ | ||
331 | /* 0101111 == mute (0x2f) */ | ||
332 | |||
333 | if (db <= -570) { | ||
334 | return 0x0; | ||
335 | } else { | ||
336 | return((db/10)+57); | ||
296 | } | 337 | } |
297 | } | 338 | } |
298 | 339 | ||
@@ -311,7 +352,8 @@ static int tenthdb2mixer(int db) | |||
311 | 352 | ||
312 | #endif | 353 | #endif |
313 | 354 | ||
314 | #if (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 || defined HAVE_WM8975 | 355 | #if (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 || \ |
356 | defined HAVE_WM8975 || defined HAVE_WM8758 | ||
315 | /* volume/balance/treble/bass interdependency main part */ | 357 | /* volume/balance/treble/bass interdependency main part */ |
316 | #define VOLUME_RANGE (VOLUME_MAX - VOLUME_MIN) | 358 | #define VOLUME_RANGE (VOLUME_MAX - VOLUME_MIN) |
317 | 359 | ||
@@ -341,8 +383,8 @@ static void set_prescaled_volume(void) | |||
341 | mas_writereg(MAS_REG_KPRESCALE, prescale_table[prescale/10]); | 383 | mas_writereg(MAS_REG_KPRESCALE, prescale_table[prescale/10]); |
342 | #elif defined(HAVE_UDA1380) | 384 | #elif defined(HAVE_UDA1380) |
343 | uda1380_set_mixer_vol(tenthdb2mixer(-prescale), tenthdb2mixer(-prescale)); | 385 | uda1380_set_mixer_vol(tenthdb2mixer(-prescale), tenthdb2mixer(-prescale)); |
344 | #elif defined(HAVE_WM8975) | 386 | #elif defined(HAVE_WM8975) || defined(HAVE_WM8758) |
345 | wm8975_set_mixer_vol(tenthdb2mixer(-prescale), tenthdb2mixer(-prescale)); | 387 | wmcodec_set_mixer_vol(tenthdb2mixer(-prescale), tenthdb2mixer(-prescale)); |
346 | #endif | 388 | #endif |
347 | 389 | ||
348 | if (current_volume == VOLUME_MIN) | 390 | if (current_volume == VOLUME_MIN) |
@@ -367,8 +409,8 @@ static void set_prescaled_volume(void) | |||
367 | dac_volume(tenthdb2reg(l), tenthdb2reg(r), false); | 409 | dac_volume(tenthdb2reg(l), tenthdb2reg(r), false); |
368 | #elif defined(HAVE_UDA1380) | 410 | #elif defined(HAVE_UDA1380) |
369 | uda1380_set_master_vol(tenthdb2master(l), tenthdb2master(r)); | 411 | uda1380_set_master_vol(tenthdb2master(l), tenthdb2master(r)); |
370 | #elif defined(HAVE_WM8975) | 412 | #elif defined(HAVE_WM8975) || defined(HAVE_WM8758) |
371 | wm8975_set_master_vol(tenthdb2master(l), tenthdb2master(r)); | 413 | wmcodec_set_master_vol(tenthdb2master(l), tenthdb2master(r)); |
372 | #endif | 414 | #endif |
373 | } | 415 | } |
374 | #endif /* (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 */ | 416 | #endif /* (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 */ |
@@ -468,7 +510,8 @@ void sound_set_volume(int value) | |||
468 | #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) | 510 | #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) |
469 | unsigned tmp = ((unsigned)(value + 115) & 0xff) << 8; | 511 | unsigned tmp = ((unsigned)(value + 115) & 0xff) << 8; |
470 | mas_codec_writereg(0x10, tmp); | 512 | mas_codec_writereg(0x10, tmp); |
471 | #elif (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 || defined HAVE_WM8975 | 513 | #elif (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 || \ |
514 | defined HAVE_WM8975 || defined HAVE_WM8758 | ||
472 | current_volume = value * 10; /* tenth of dB */ | 515 | current_volume = value * 10; /* tenth of dB */ |
473 | set_prescaled_volume(); | 516 | set_prescaled_volume(); |
474 | #elif CONFIG_CPU == PNX0101 | 517 | #elif CONFIG_CPU == PNX0101 |
@@ -484,7 +527,8 @@ void sound_set_balance(int value) | |||
484 | #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) | 527 | #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) |
485 | unsigned tmp = ((unsigned)(value * 127 / 100) & 0xff) << 8; | 528 | unsigned tmp = ((unsigned)(value * 127 / 100) & 0xff) << 8; |
486 | mas_codec_writereg(0x11, tmp); | 529 | mas_codec_writereg(0x11, tmp); |
487 | #elif CONFIG_CODEC == MAS3507D || defined HAVE_UDA1380 || defined HAVE_WM8975 | 530 | #elif CONFIG_CODEC == MAS3507D || defined HAVE_UDA1380 || \ |
531 | defined HAVE_WM8975 || defined HAVE_WM8758 | ||
488 | current_balance = value * VOLUME_RANGE / 100; /* tenth of dB */ | 532 | current_balance = value * VOLUME_RANGE / 100; /* tenth of dB */ |
489 | set_prescaled_volume(); | 533 | set_prescaled_volume(); |
490 | #elif CONFIG_CPU == PNX0101 | 534 | #elif CONFIG_CPU == PNX0101 |
@@ -508,9 +552,9 @@ void sound_set_bass(int value) | |||
508 | uda1380_set_bass(value >> 1); | 552 | uda1380_set_bass(value >> 1); |
509 | current_bass = value * 10; | 553 | current_bass = value * 10; |
510 | set_prescaled_volume(); | 554 | set_prescaled_volume(); |
511 | #elif defined(HAVE_WM8975) | 555 | #elif defined HAVE_WM8975 || defined HAVE_WM8758 |
512 | current_bass = value * 10; | 556 | current_bass = value * 10; |
513 | wm8975_set_bass(value); | 557 | wmcodec_set_bass(value); |
514 | set_prescaled_volume(); | 558 | set_prescaled_volume(); |
515 | #elif CONFIG_CPU == PNX0101 | 559 | #elif CONFIG_CPU == PNX0101 |
516 | /* TODO: implement for iFP */ | 560 | /* TODO: implement for iFP */ |
@@ -533,8 +577,8 @@ void sound_set_treble(int value) | |||
533 | uda1380_set_treble(value >> 1); | 577 | uda1380_set_treble(value >> 1); |
534 | current_treble = value * 10; | 578 | current_treble = value * 10; |
535 | set_prescaled_volume(); | 579 | set_prescaled_volume(); |
536 | #elif defined(HAVE_WM8975) | 580 | #elif defined(HAVE_WM8975) || defined(HAVE_WM8758) |
537 | wm8975_set_treble(value); | 581 | wmcodec_set_treble(value); |
538 | current_treble = value * 10; | 582 | current_treble = value * 10; |
539 | set_prescaled_volume(); | 583 | set_prescaled_volume(); |
540 | #elif CONFIG_CPU == PNX0101 | 584 | #elif CONFIG_CPU == PNX0101 |