summaryrefslogtreecommitdiff
path: root/firmware/sound.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/sound.c')
-rw-r--r--firmware/sound.c85
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 */
167static 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)
287static unsigned long mdb_shape_shadow = 0;
288static unsigned long loudness_shadow = 0;
289#endif
290
291void sound_set_volume(int value) 274void 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
628void sound_set_avc(int value) 610void 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
659void sound_set_mdb_strength(int value) 618void 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
666void sound_set_mdb_harmonics(int value) 626void 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
674void sound_set_mdb_center(int value) 634void 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
681void sound_set_mdb_shape(int value) 642void 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
689void sound_set_mdb_enable(int value) 650void 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
697void sound_set_superbass(int value) 658void 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 }