diff options
author | Marcin Bukat <marcin.bukat@gmail.com> | 2010-10-31 21:09:34 +0000 |
---|---|---|
committer | Marcin Bukat <marcin.bukat@gmail.com> | 2010-10-31 21:09:34 +0000 |
commit | 56c4e9fa600557242d8b78f5fd8e32c2245b76fc (patch) | |
tree | f8558778a302f89c3e819e66e86577a5e37c3660 /firmware/sound.c | |
parent | 40ed5f57d9be61f1200026e9b0f944a9718111c1 (diff) | |
download | rockbox-56c4e9fa600557242d8b78f5fd8e32c2245b76fc.tar.gz rockbox-56c4e9fa600557242d8b78f5fd8e32c2245b76fc.zip |
Separate mas35xx lowlevel stuff. Move SH specific bits to target tree. FS#11189 by me.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28425 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/sound.c')
-rw-r--r-- | firmware/sound.c | 85 |
1 files changed, 21 insertions, 64 deletions
diff --git a/firmware/sound.c b/firmware/sound.c index bede18615a..82d5cdf47d 100644 --- a/firmware/sound.c +++ b/firmware/sound.c | |||
@@ -26,16 +26,17 @@ | |||
26 | #include "logf.h" | 26 | #include "logf.h" |
27 | #include "system.h" | 27 | #include "system.h" |
28 | #include "i2c.h" | 28 | #include "i2c.h" |
29 | #include "mas.h" | ||
30 | #if (CONFIG_PLATFORM & PLATFORM_NATIVE) | 29 | #if (CONFIG_PLATFORM & PLATFORM_NATIVE) |
31 | #if CONFIG_CPU == PNX0101 | 30 | #if CONFIG_CPU == PNX0101 |
32 | #include "pnx0101.h" | 31 | #include "pnx0101.h" |
33 | #endif | 32 | #endif /* CONFIG_CPU == PNX101 */ |
34 | #include "dac.h" | ||
35 | #if CONFIG_CODEC == SWCODEC | 33 | #if CONFIG_CODEC == SWCODEC |
36 | #include "pcm.h" | 34 | #include "pcm.h" |
35 | #else /* !CONFIG_CODEC == HWCODEC */ | ||
36 | #include "mas35xx.h" | ||
37 | #include "dac3550a.h" | ||
37 | #endif | 38 | #endif |
38 | #endif | 39 | #endif /* !SIMULATOR */ |
39 | 40 | ||
40 | /* TODO | 41 | /* TODO |
41 | * find a nice way to handle 1.5db steps -> see wm8751 ifdef in sound_set_bass/treble | 42 | * find a nice way to handle 1.5db steps -> see wm8751 ifdef in sound_set_bass/treble |
@@ -162,18 +163,6 @@ void sound_set_dsp_callback(int (*func)(int, intptr_t)) | |||
162 | } | 163 | } |
163 | #endif | 164 | #endif |
164 | 165 | ||
165 | #if (CONFIG_CODEC == MAS3507D) && !defined(SIMULATOR) | ||
166 | /* convert tenth of dB volume (-780..+180) to dac3550 register value */ | ||
167 | static int tenthdb2reg(int db) | ||
168 | { | ||
169 | if (db < -540) /* 3 dB steps */ | ||
170 | return (db + 780) / 30; | ||
171 | else /* 1.5 dB steps */ | ||
172 | return (db + 660) / 15; | ||
173 | } | ||
174 | #endif | ||
175 | |||
176 | |||
177 | #if !defined(AUDIOHW_HAVE_CLIPPING) | 166 | #if !defined(AUDIOHW_HAVE_CLIPPING) |
178 | /* | 167 | /* |
179 | * The prescaler compensates for any kind of boosts, to prevent clipping. | 168 | * The prescaler compensates for any kind of boosts, to prevent clipping. |
@@ -282,12 +271,6 @@ static void set_prescaled_volume(void) | |||
282 | } | 271 | } |
283 | #endif /* (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 */ | 272 | #endif /* (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380 */ |
284 | 273 | ||
285 | |||
286 | #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) | ||
287 | static unsigned long mdb_shape_shadow = 0; | ||
288 | static unsigned long loudness_shadow = 0; | ||
289 | #endif | ||
290 | |||
291 | void sound_set_volume(int value) | 274 | void sound_set_volume(int value) |
292 | { | 275 | { |
293 | if(!audio_is_initialized) | 276 | if(!audio_is_initialized) |
@@ -620,86 +603,64 @@ void sound_set_loudness(int value) | |||
620 | { | 603 | { |
621 | if(!audio_is_initialized) | 604 | if(!audio_is_initialized) |
622 | return; | 605 | return; |
623 | loudness_shadow = (loudness_shadow & 0x04) | | 606 | |
624 | (MAX(MIN(value * 4, 0x44), 0) << 8); | 607 | audiohw_set_loudness(value); |
625 | mas_codec_writereg(MAS_REG_KLOUDNESS, loudness_shadow); | ||
626 | } | 608 | } |
627 | 609 | ||
628 | void sound_set_avc(int value) | 610 | void sound_set_avc(int value) |
629 | { | 611 | { |
630 | if(!audio_is_initialized) | 612 | if(!audio_is_initialized) |
631 | return; | 613 | return; |
632 | int tmp; | ||
633 | 614 | ||
634 | static const uint16_t avc_vals[] = | 615 | audiohw_set_avc(value); |
635 | { | ||
636 | (0x1 << 8) | (0x8 << 12), /* 20ms */ | ||
637 | (0x2 << 8) | (0x8 << 12), /* 2s */ | ||
638 | (0x4 << 8) | (0x8 << 12), /* 4s */ | ||
639 | (0x8 << 8) | (0x8 << 12), /* 8s */ | ||
640 | }; | ||
641 | switch (value) { | ||
642 | case 1: | ||
643 | case 2: | ||
644 | case 3: | ||
645 | case 4: | ||
646 | tmp = avc_vals[value -1]; | ||
647 | break; | ||
648 | case -1: /* turn off and then turn on again to decay quickly */ | ||
649 | tmp = mas_codec_readreg(MAS_REG_KAVC); | ||
650 | mas_codec_writereg(MAS_REG_KAVC, 0); | ||
651 | break; | ||
652 | default: /* off */ | ||
653 | tmp = 0; | ||
654 | break; | ||
655 | } | ||
656 | mas_codec_writereg(MAS_REG_KAVC, tmp); | ||
657 | } | 616 | } |
658 | 617 | ||
659 | void sound_set_mdb_strength(int value) | 618 | void sound_set_mdb_strength(int value) |
660 | { | 619 | { |
661 | if(!audio_is_initialized) | 620 | if(!audio_is_initialized) |
662 | return; | 621 | return; |
663 | mas_codec_writereg(MAS_REG_KMDB_STR, (value & 0x7f) << 8); | 622 | |
623 | audiohw_set_mdb_strength(value); | ||
664 | } | 624 | } |
665 | 625 | ||
666 | void sound_set_mdb_harmonics(int value) | 626 | void sound_set_mdb_harmonics(int value) |
667 | { | 627 | { |
668 | if(!audio_is_initialized) | 628 | if(!audio_is_initialized) |
669 | return; | 629 | return; |
670 | int tmp = value * 127 / 100; | 630 | |
671 | mas_codec_writereg(MAS_REG_KMDB_HAR, (tmp & 0x7f) << 8); | 631 | audiohw_set_mdb_harmonics(value); |
672 | } | 632 | } |
673 | 633 | ||
674 | void sound_set_mdb_center(int value) | 634 | void sound_set_mdb_center(int value) |
675 | { | 635 | { |
676 | if(!audio_is_initialized) | 636 | if(!audio_is_initialized) |
677 | return; | 637 | return; |
678 | mas_codec_writereg(MAS_REG_KMDB_FC, (value/10) << 8); | 638 | |
639 | audiohw_set_mdb_center(value); | ||
679 | } | 640 | } |
680 | 641 | ||
681 | void sound_set_mdb_shape(int value) | 642 | void sound_set_mdb_shape(int value) |
682 | { | 643 | { |
683 | if(!audio_is_initialized) | 644 | if(!audio_is_initialized) |
684 | return; | 645 | return; |
685 | mdb_shape_shadow = (mdb_shape_shadow & 0x02) | ((value/10) << 8); | 646 | |
686 | mas_codec_writereg(MAS_REG_KMDB_SWITCH, mdb_shape_shadow); | 647 | audiohw_set_mdb_shape(value); |
687 | } | 648 | } |
688 | 649 | ||
689 | void sound_set_mdb_enable(int value) | 650 | void sound_set_mdb_enable(int value) |
690 | { | 651 | { |
691 | if(!audio_is_initialized) | 652 | if(!audio_is_initialized) |
692 | return; | 653 | return; |
693 | mdb_shape_shadow = (mdb_shape_shadow & ~0x02) | (value?2:0); | 654 | |
694 | mas_codec_writereg(MAS_REG_KMDB_SWITCH, mdb_shape_shadow); | 655 | audiohw_set_mdb_enable(value); |
695 | } | 656 | } |
696 | 657 | ||
697 | void sound_set_superbass(int value) | 658 | void sound_set_superbass(int value) |
698 | { | 659 | { |
699 | if(!audio_is_initialized) | 660 | if(!audio_is_initialized) |
700 | return; | 661 | return; |
701 | loudness_shadow = (loudness_shadow & ~0x04) | (value?4:0); | 662 | |
702 | mas_codec_writereg(MAS_REG_KLOUDNESS, loudness_shadow); | 663 | audiohw_set_superbass(value); |
703 | } | 664 | } |
704 | #endif /* (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) */ | 665 | #endif /* (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) */ |
705 | 666 | ||
@@ -847,11 +808,7 @@ void sound_set_pitch(int32_t pitch) | |||
847 | /* Calculate the new (bogus) frequency */ | 808 | /* Calculate the new (bogus) frequency */ |
848 | val = 18432 * PITCH_SPEED_100 / pitch; | 809 | val = 18432 * PITCH_SPEED_100 / pitch; |
849 | 810 | ||
850 | mas_writemem(MAS_BANK_D0, MAS_D0_OFREQ_CONTROL, &val, 1); | 811 | audiohw_set_pitch(val); |
851 | |||
852 | /* We must tell the MAS that the frequency has changed. | ||
853 | * This will unfortunately cause a short silence. */ | ||
854 | mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &shadow_io_control_main, 1); | ||
855 | 812 | ||
856 | last_pitch = pitch; | 813 | last_pitch = pitch; |
857 | } | 814 | } |