summaryrefslogtreecommitdiff
path: root/firmware/mp3_playback.c
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2005-01-12 00:24:15 +0000
committerJens Arnold <amiconn@rockbox.org>2005-01-12 00:24:15 +0000
commit76b257fd40217013b3107148090c2062f06097e5 (patch)
treeedb08fb3b29d3fc930c7f48c6404dbde421d8a27 /firmware/mp3_playback.c
parent01c484c5d27906f30f7fd9f2cc3f1d9073269c95 (diff)
downloadrockbox-76b257fd40217013b3107148090c2062f06097e5.tar.gz
rockbox-76b257fd40217013b3107148090c2062f06097e5.zip
New channel configuration setting, allowing fine-grained control of the stereo width. This replaces the 'stereo narrow' and 'stereo wide' modes.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5559 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/mp3_playback.c')
-rw-r--r--firmware/mp3_playback.c186
1 files changed, 102 insertions, 84 deletions
diff --git a/firmware/mp3_playback.c b/firmware/mp3_playback.c
index 140d1ff75b..f2c588c6b5 100644
--- a/firmware/mp3_playback.c
+++ b/firmware/mp3_playback.c
@@ -72,6 +72,7 @@ static const char* const units[] =
72 "dB", /* Loudness */ 72 "dB", /* Loudness */
73 "", /* AVC */ 73 "", /* AVC */
74 "", /* Channels */ 74 "", /* Channels */
75 "%", /* Stereo width */
75 "dB", /* Left gain */ 76 "dB", /* Left gain */
76 "dB", /* Right gain */ 77 "dB", /* Right gain */
77 "dB", /* Mic gain */ 78 "dB", /* Mic gain */
@@ -92,6 +93,7 @@ static const int numdecimals[] =
92 0, /* Loudness */ 93 0, /* Loudness */
93 0, /* AVC */ 94 0, /* AVC */
94 0, /* Channels */ 95 0, /* Channels */
96 0, /* Stereo width */
95 1, /* Left gain */ 97 1, /* Left gain */
96 1, /* Right gain */ 98 1, /* Right gain */
97 1, /* Mic gain */ 99 1, /* Mic gain */
@@ -112,6 +114,7 @@ static const int steps[] =
112 1, /* Loudness */ 114 1, /* Loudness */
113 1, /* AVC */ 115 1, /* AVC */
114 1, /* Channels */ 116 1, /* Channels */
117 1, /* Stereo width */
115 1, /* Left gain */ 118 1, /* Left gain */
116 1, /* Right gain */ 119 1, /* Right gain */
117 1, /* Mic gain */ 120 1, /* Mic gain */
@@ -137,6 +140,7 @@ static const int minval[] =
137 0, /* Loudness */ 140 0, /* Loudness */
138 -1, /* AVC */ 141 -1, /* AVC */
139 0, /* Channels */ 142 0, /* Channels */
143 0, /* Stereo width */
140 0, /* Left gain */ 144 0, /* Left gain */
141 0, /* Right gain */ 145 0, /* Right gain */
142 0, /* Mic gain */ 146 0, /* Mic gain */
@@ -161,7 +165,8 @@ static const int maxval[] =
161 100, /* Balance */ 165 100, /* Balance */
162 17, /* Loudness */ 166 17, /* Loudness */
163 4, /* AVC */ 167 4, /* AVC */
164 6, /* Channels */ 168 5, /* Channels */
169 255, /* Stereo width */
165 15, /* Left gain */ 170 15, /* Left gain */
166 15, /* Right gain */ 171 15, /* Right gain */
167 15, /* Mic gain */ 172 15, /* Mic gain */
@@ -187,6 +192,7 @@ static const int defaultval[] =
187 0, /* Loudness */ 192 0, /* Loudness */
188 0, /* AVC */ 193 0, /* AVC */
189 0, /* Channels */ 194 0, /* Channels */
195 100, /* Stereo width */
190 8, /* Left gain */ 196 8, /* Left gain */
191 8, /* Right gain */ 197 8, /* Right gain */
192 2, /* Mic gain */ 198 2, /* Mic gain */
@@ -566,8 +572,6 @@ static void init_playback(void)
566 mas_readmem(MAS_BANK_D0, MAS_D0_APP_RUNNING, &val, 1); 572 mas_readmem(MAS_BANK_D0, MAS_D0_APP_RUNNING, &val, 1);
567 } while((val & 0x0c) != 0x0c); 573 } while((val & 0x0c) != 0x0c);
568 574
569 mpeg_sound_channel_config(MPEG_SOUND_STEREO);
570
571#if CONFIG_HWCODEC == MAS3587F 575#if CONFIG_HWCODEC == MAS3587F
572 mpeg_mode = MPEG_DECODER; 576 mpeg_mode = MPEG_DECODER;
573#endif 577#endif
@@ -619,6 +623,89 @@ void set_prescaled_volume(void)
619#endif /* MAS3507D */ 623#endif /* MAS3507D */
620#endif /* !SIMULATOR */ 624#endif /* !SIMULATOR */
621 625
626int channel_configuration = MPEG_SOUND_STEREO;
627int stereo_width = 100;
628
629#ifndef SIMULATOR
630static void set_channel_config(void)
631{
632 /* default values: stereo */
633 unsigned long val_ll = 0x80000;
634 unsigned long val_lr = 0;
635 unsigned long val_rl = 0;
636 unsigned long val_rr = 0x80000;
637
638 switch(channel_configuration)
639 {
640 /* case MPEG_SOUND_STEREO unnecessary */
641
642 case MPEG_SOUND_MONO:
643 val_ll = 0xc0000;
644 val_lr = 0xc0000;
645 val_rl = 0xc0000;
646 val_rr = 0xc0000;
647 break;
648
649 case MPEG_SOUND_CUSTOM:
650 {
651 /* fixed point variables (matching MAS internal format)
652 integer part: upper 13 bits (inlcuding sign)
653 fractional part: lower 19 bits */
654 long fp_width, fp_straight, fp_cross;
655
656 fp_width = (stereo_width << 19) / 100;
657 if (stereo_width <= 100)
658 {
659 fp_straight = - ((1<<19) + fp_width) / 2;
660 fp_cross = fp_straight + fp_width;
661 }
662 else
663 {
664 fp_straight = - (1<<19);
665 fp_cross = ((2 * fp_width / (((1<<19) + fp_width) >> 10))
666 << 9) - (1<<19);
667 }
668 val_ll = val_rr = fp_straight & 0xFFFFF;
669 val_lr = val_rl = fp_cross & 0xFFFFF;
670 }
671 break;
672
673 case MPEG_SOUND_MONO_LEFT:
674 val_ll = 0x80000;
675 val_lr = 0x80000;
676 val_rl = 0;
677 val_rr = 0;
678 break;
679
680 case MPEG_SOUND_MONO_RIGHT:
681 val_ll = 0;
682 val_lr = 0;
683 val_rl = 0x80000;
684 val_rr = 0x80000;
685 break;
686
687 case MPEG_SOUND_KARAOKE:
688 val_ll = 0x80001;
689 val_lr = 0x7ffff;
690 val_rl = 0x7ffff;
691 val_rr = 0x80001;
692 break;
693 }
694
695#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
696 mas_writemem(MAS_BANK_D0, MAS_D0_OUT_LL, &val_ll, 1); /* LL */
697 mas_writemem(MAS_BANK_D0, MAS_D0_OUT_LR, &val_lr, 1); /* LR */
698 mas_writemem(MAS_BANK_D0, MAS_D0_OUT_RL, &val_rl, 1); /* RL */
699 mas_writemem(MAS_BANK_D0, MAS_D0_OUT_RR, &val_rr, 1); /* RR */
700#elif CONFIG_HWCODEC == MAS3507D
701 mas_writemem(MAS_BANK_D1, 0x7f8, &val_ll, 1); /* LL */
702 mas_writemem(MAS_BANK_D1, 0x7f9, &val_lr, 1); /* LR */
703 mas_writemem(MAS_BANK_D1, 0x7fa, &val_rl, 1); /* RL */
704 mas_writemem(MAS_BANK_D1, 0x7fb, &val_rr, 1); /* RR */
705#endif
706}
707#endif /* !SIMULATOR */
708
622#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F) 709#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
623unsigned long mdb_shape_shadow = 0; 710unsigned long mdb_shape_shadow = 0;
624unsigned long loudness_shadow = 0; 711unsigned long loudness_shadow = 0;
@@ -766,7 +853,14 @@ void mpeg_sound_set(int setting, int value)
766 break; 853 break;
767#endif 854#endif
768 case SOUND_CHANNELS: 855 case SOUND_CHANNELS:
769 mpeg_sound_channel_config(value); 856 channel_configuration = value;
857 set_channel_config();
858 break;
859
860 case SOUND_STEREO_WIDTH:
861 stereo_width = value;
862 if (channel_configuration == MPEG_SOUND_CUSTOM)
863 set_channel_config();
770 break; 864 break;
771 } 865 }
772#endif /* SIMULATOR */ 866#endif /* SIMULATOR */
@@ -799,82 +893,6 @@ int mpeg_val2phys(int setting, int value)
799#endif 893#endif
800} 894}
801 895
802void mpeg_sound_channel_config(int configuration)
803{
804#ifdef SIMULATOR
805 (void)configuration;
806#else
807 unsigned long val_ll = 0x80000;
808 unsigned long val_lr = 0;
809 unsigned long val_rl = 0;
810 unsigned long val_rr = 0x80000;
811
812 switch(configuration)
813 {
814 case MPEG_SOUND_STEREO:
815 val_ll = 0x80000;
816 val_lr = 0;
817 val_rl = 0;
818 val_rr = 0x80000;
819 break;
820
821 case MPEG_SOUND_MONO:
822 val_ll = 0xc0000;
823 val_lr = 0xc0000;
824 val_rl = 0xc0000;
825 val_rr = 0xc0000;
826 break;
827
828 case MPEG_SOUND_MONO_LEFT:
829 val_ll = 0x80000;
830 val_lr = 0x80000;
831 val_rl = 0;
832 val_rr = 0;
833 break;
834
835 case MPEG_SOUND_MONO_RIGHT:
836 val_ll = 0;
837 val_lr = 0;
838 val_rl = 0x80000;
839 val_rr = 0x80000;
840 break;
841
842 case MPEG_SOUND_STEREO_NARROW:
843 val_ll = 0xa0000;
844 val_lr = 0xe0000;
845 val_rl = 0xe0000;
846 val_rr = 0xa0000;
847 break;
848
849 case MPEG_SOUND_STEREO_WIDE:
850 val_ll = 0x80000;
851 val_lr = 0x40000;
852 val_rl = 0x40000;
853 val_rr = 0x80000;
854 break;
855
856 case MPEG_SOUND_KARAOKE:
857 val_ll = 0x80001;
858 val_lr = 0x7ffff;
859 val_rl = 0x7ffff;
860 val_rr = 0x80001;
861 break;
862 }
863
864#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
865 mas_writemem(MAS_BANK_D0, MAS_D0_OUT_LL, &val_ll, 1); /* LL */
866 mas_writemem(MAS_BANK_D0, MAS_D0_OUT_LR, &val_lr, 1); /* LR */
867 mas_writemem(MAS_BANK_D0, MAS_D0_OUT_RL, &val_rl, 1); /* RL */
868 mas_writemem(MAS_BANK_D0, MAS_D0_OUT_RR, &val_rr, 1); /* RR */
869#else
870 mas_writemem(MAS_BANK_D1, 0x7f8, &val_ll, 1); /* LL */
871 mas_writemem(MAS_BANK_D1, 0x7f9, &val_lr, 1); /* LR */
872 mas_writemem(MAS_BANK_D1, 0x7fa, &val_rl, 1); /* RL */
873 mas_writemem(MAS_BANK_D1, 0x7fb, &val_rr, 1); /* RR */
874#endif
875#endif
876}
877
878#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F) 896#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
879/* This function works by telling the decoder that we have another 897/* This function works by telling the decoder that we have another
880 crystal frequency than we actually have. It will adjust its internal 898 crystal frequency than we actually have. It will adjust its internal
@@ -901,7 +919,7 @@ void mpeg_set_pitch(int pitch)
901#endif 919#endif
902 920
903void mp3_init(int volume, int bass, int treble, int balance, int loudness, 921void mp3_init(int volume, int bass, int treble, int balance, int loudness,
904 int avc, int channel_config, 922 int avc, int channel_config, int stereo_width,
905 int mdb_strength, int mdb_harmonics, 923 int mdb_strength, int mdb_harmonics,
906 int mdb_center, int mdb_shape, bool mdb_enable, 924 int mdb_center, int mdb_shape, bool mdb_enable,
907 bool superbass) 925 bool superbass)
@@ -914,6 +932,7 @@ void mp3_init(int volume, int bass, int treble, int balance, int loudness,
914 (void)loudness; 932 (void)loudness;
915 (void)avc; 933 (void)avc;
916 (void)channel_config; 934 (void)channel_config;
935 (void)stereo_width;
917 (void)mdb_strength; 936 (void)mdb_strength;
918 (void)mdb_harmonics; 937 (void)mdb_harmonics;
919 (void)mdb_center; 938 (void)mdb_center;
@@ -1015,8 +1034,6 @@ void mp3_init(int volume, int bass, int treble, int balance, int loudness,
1015 1034
1016 mas_writereg(MAS_REG_KPRESCALE, 0xe9400); 1035 mas_writereg(MAS_REG_KPRESCALE, 0xe9400);
1017 dac_enable(true); 1036 dac_enable(true);
1018
1019 mpeg_sound_channel_config(channel_config);
1020#endif 1037#endif
1021 1038
1022#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F) 1039#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
@@ -1031,9 +1048,10 @@ void mp3_init(int volume, int bass, int treble, int balance, int loudness,
1031 mpeg_sound_set(SOUND_TREBLE, treble); 1048 mpeg_sound_set(SOUND_TREBLE, treble);
1032 mpeg_sound_set(SOUND_BALANCE, balance); 1049 mpeg_sound_set(SOUND_BALANCE, balance);
1033 mpeg_sound_set(SOUND_VOLUME, volume); 1050 mpeg_sound_set(SOUND_VOLUME, volume);
1051 mpeg_sound_set(SOUND_CHANNELS, channel_config);
1052 mpeg_sound_set(SOUND_STEREO_WIDTH, stereo_width);
1034 1053
1035#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F) 1054#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
1036 mpeg_sound_channel_config(channel_config);
1037 mpeg_sound_set(SOUND_LOUDNESS, loudness); 1055 mpeg_sound_set(SOUND_LOUDNESS, loudness);
1038 mpeg_sound_set(SOUND_AVC, avc); 1056 mpeg_sound_set(SOUND_AVC, avc);
1039 mpeg_sound_set(SOUND_MDB_STRENGTH, mdb_strength); 1057 mpeg_sound_set(SOUND_MDB_STRENGTH, mdb_strength);