diff options
author | Jens Arnold <amiconn@rockbox.org> | 2005-01-12 00:24:15 +0000 |
---|---|---|
committer | Jens Arnold <amiconn@rockbox.org> | 2005-01-12 00:24:15 +0000 |
commit | 76b257fd40217013b3107148090c2062f06097e5 (patch) | |
tree | edb08fb3b29d3fc930c7f48c6404dbde421d8a27 /firmware/mp3_playback.c | |
parent | 01c484c5d27906f30f7fd9f2cc3f1d9073269c95 (diff) | |
download | rockbox-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.c | 186 |
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 | ||
626 | int channel_configuration = MPEG_SOUND_STEREO; | ||
627 | int stereo_width = 100; | ||
628 | |||
629 | #ifndef SIMULATOR | ||
630 | static 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) |
623 | unsigned long mdb_shape_shadow = 0; | 710 | unsigned long mdb_shape_shadow = 0; |
624 | unsigned long loudness_shadow = 0; | 711 | unsigned 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 | ||
802 | void 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 | ||
903 | void mp3_init(int volume, int bass, int treble, int balance, int loudness, | 921 | void 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); |