From b10989830c2c9b365ed24fe018a9f1129e9e3f91 Mon Sep 17 00:00:00 2001 From: Linus Nielsen Feltzing Date: Mon, 9 Sep 2002 15:13:33 +0000 Subject: [PATCH] Added channel configuration git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2243 a1c6a512-1295-4272-9138-f99709370657 --- apps/settings.h | 1 + apps/sound_menu.c | 12 +++++- firmware/mpeg.c | 99 +++++++++++++++++++++++++++++++++++++++++------ firmware/mpeg.h | 9 ++++- 4 files changed, 107 insertions(+), 14 deletions(-) diff --git a/apps/settings.h b/apps/settings.h index 82b087e79c..2fab75b437 100644 --- a/apps/settings.h +++ b/apps/settings.h @@ -57,6 +57,7 @@ struct user_settings int loudness; /* loudness eq: 0-100 0=off 100=max */ int bass_boost; /* bass boost eq: 0-100 0=off 100=max */ int avc; /* auto volume correct: 0=disable, 1=2s 2=4s 3=8s */ + int channel_config; /* Stereo, Mono, Mono left, Mono right */ /* device settings */ diff --git a/apps/sound_menu.c b/apps/sound_menu.c index 24da3f5555..70a40e6691 100644 --- a/apps/sound_menu.c +++ b/apps/sound_menu.c @@ -185,12 +185,21 @@ static Menu bass_boost(void) static Menu avc(void) { char* names[] = { "off", "2s ", "4s ", "8s " }; - set_option("[AV decay time]", &global_settings.avc, names, 4 ); + set_option("AV decay time", &global_settings.avc, names, 4 ); mpeg_sound_set(SOUND_AVC, global_settings.avc); return MENU_OK; } #endif /* ARCHOS_RECORDER */ +static Menu chanconf(void) +{ + char *names[] = {"Stereo ", "Mono ", "Mono Left ", "Mono Right" }; + set_option("Channel configuration", + &global_settings.channel_config, names, 4 ); + mpeg_sound_set(SOUND_CHANNELS, global_settings.channel_config); + return MENU_OK; +} + Menu sound_menu(void) { int m; @@ -200,6 +209,7 @@ Menu sound_menu(void) { "Bass", bass }, { "Treble", treble }, { "Balance", balance }, + { "Channels", chanconf }, #ifdef HAVE_MAS3587F { "Loudness", loudness }, { "Bass Boost", bass_boost }, diff --git a/firmware/mpeg.c b/firmware/mpeg.c index 6fd411282d..821cd8db7e 100644 --- a/firmware/mpeg.c +++ b/firmware/mpeg.c @@ -65,7 +65,9 @@ static char *units[] = "dB", /* Treble */ "%", /* Balance */ "dB", /* Loudness */ - "%" /* Bass boost */ + "%", /* Bass boost */ + "", /* AVC */ + "" /* Channels */ }; static int numdecimals[] = @@ -75,7 +77,9 @@ static int numdecimals[] = 0, /* Treble */ 0, /* Balance */ 0, /* Loudness */ - 0 /* Bass boost */ + 0, /* Bass boost */ + 0, /* AVC */ + 0 /* Channels */ }; static int minval[] = @@ -85,7 +89,9 @@ static int minval[] = 0, /* Treble */ -50, /* Balance */ 0, /* Loudness */ - 0 /* Bass boost */ + 0, /* Bass boost */ + 0, /* AVC */ + 0 /* Channels */ }; static int maxval[] = @@ -100,7 +106,9 @@ static int maxval[] = #endif 50, /* Balance */ 17, /* Loudness */ - 10 /* Bass boost */ + 10, /* Bass boost */ + 0, /* AVC */ + 3 /* Channels */ }; static int defaultval[] = @@ -115,7 +123,9 @@ static int defaultval[] = #endif 0, /* Balance */ 0, /* Loudness */ - 0 /* Bass boost */ + 0, /* Bass boost */ + 0, /* AVC */ + 0 /* Channels */ }; char *mpeg_sound_unit(int setting) @@ -1603,6 +1613,9 @@ void mpeg_sound_set(int setting, int value) mas_codec_writereg(MAS_REG_KAVC, tmp); break; #endif + case SOUND_CHANNELS: + mpeg_sound_channel_config(value); + break; } #endif /* SIMULATOR */ } @@ -1650,6 +1663,72 @@ int mpeg_val2phys(int setting, int value) return result; } +void mpeg_sound_channel_config(int configuration) +{ + unsigned long val_on = 0x80000; + unsigned long val_off = 0; + + switch(configuration) + { + case MPEG_SOUND_STEREO: + val_on = 0x80000; +#ifdef HAVE_MAS3587F + mas_writemem(MAS_BANK_D0, 0x7fc, &val_on, 1); /* LL */ + mas_writemem(MAS_BANK_D0, 0x7fd, &val_off, 1); /* LR */ + mas_writemem(MAS_BANK_D0, 0x7fe, &val_off, 1); /* RL */ + mas_writemem(MAS_BANK_D0, 0x7ff, &val_on, 1); /* RR */ +#else + mas_writemem(MAS_BANK_D1, 0x7f8, &val_on, 1); /* LL */ + mas_writemem(MAS_BANK_D1, 0x7f9, &val_off, 1); /* LR */ + mas_writemem(MAS_BANK_D1, 0x7fa, &val_off, 1); /* RL */ + mas_writemem(MAS_BANK_D1, 0x7fb, &val_on, 1); /* RR */ +#endif + break; + case MPEG_SOUND_MONO: + val_on = 0xc0000; +#ifdef HAVE_MAS3587F + mas_writemem(MAS_BANK_D0, 0x7fc, &val_on, 1); /* LL */ + mas_writemem(MAS_BANK_D0, 0x7fd, &val_on, 1); /* LR */ + mas_writemem(MAS_BANK_D0, 0x7fe, &val_on, 1); /* RL */ + mas_writemem(MAS_BANK_D0, 0x7ff, &val_on, 1); /* RR */ +#else + mas_writemem(MAS_BANK_D1, 0x7f8, &val_on, 1); /* LL */ + mas_writemem(MAS_BANK_D1, 0x7f9, &val_on, 1); /* LR */ + mas_writemem(MAS_BANK_D1, 0x7fa, &val_on, 1); /* RL */ + mas_writemem(MAS_BANK_D1, 0x7fb, &val_on, 1); /* RR */ +#endif + break; + case MPEG_SOUND_MONO_LEFT: + val_on = 0x80000; +#ifdef HAVE_MAS3587F + mas_writemem(MAS_BANK_D0, 0x7fc, &val_on, 1); /* LL */ + mas_writemem(MAS_BANK_D0, 0x7fd, &val_on, 1); /* LR */ + mas_writemem(MAS_BANK_D0, 0x7fe, &val_off, 1); /* RL */ + mas_writemem(MAS_BANK_D0, 0x7ff, &val_off, 1); /* RR */ +#else + mas_writemem(MAS_BANK_D1, 0x7f8, &val_on, 1); /* LL */ + mas_writemem(MAS_BANK_D1, 0x7f9, &val_on, 1); /* LR */ + mas_writemem(MAS_BANK_D1, 0x7fa, &val_off, 1); /* RL */ + mas_writemem(MAS_BANK_D1, 0x7fb, &val_off, 1); /* RR */ +#endif + break; + case MPEG_SOUND_MONO_RIGHT: + val_on = 0xc0000; +#ifdef HAVE_MAS3587F + mas_writemem(MAS_BANK_D0, 0x7fc, &val_off, 1); /* LL */ + mas_writemem(MAS_BANK_D0, 0x7fd, &val_off, 1); /* LR */ + mas_writemem(MAS_BANK_D0, 0x7fe, &val_on, 1); /* RL */ + mas_writemem(MAS_BANK_D0, 0x7ff, &val_on, 1); /* RR */ +#else + mas_writemem(MAS_BANK_D1, 0x7f8, &val_off, 1); /* LL */ + mas_writemem(MAS_BANK_D1, 0x7f9, &val_off, 1); /* LR */ + mas_writemem(MAS_BANK_D1, 0x7fa, &val_on, 1); /* RL */ + mas_writemem(MAS_BANK_D1, 0x7fb, &val_on, 1); /* RR */ +#endif + break; + } +} + void mpeg_init(int volume, int bass, int treble, int balance, int loudness, int bass_boost, int avc) { #ifdef SIMULATOR @@ -1676,10 +1755,7 @@ void mpeg_init(int volume, int bass, int treble, int balance, int loudness, int if(rc < 0) panicf("mas_ctrl_r: %d", rc); - /* Max volume on both ears */ - val = 0x80000; - mas_writemem(MAS_BANK_D0,0x7fc,&val,1); - mas_writemem(MAS_BANK_D0,0x7ff,&val,1); + mpeg_sound_channel_config(MPEG_SOUND_STEREO); /* Enable the D/A Converter */ mas_codec_writereg(0x0, 0x0001); @@ -1755,9 +1831,8 @@ void mpeg_init(int volume, int bass, int treble, int balance, int loudness, int mas_writereg(MAS_REG_KPRESCALE, 0xe9400); dac_config(0x04); /* DAC on, all else off */ - val = 0x80000; - mas_writemem(MAS_BANK_D1, 0x7f8, &val, 1); - mas_writemem(MAS_BANK_D1, 0x7fb, &val, 1); + mpeg_sound_channel_config(MPEG_SOUND_STEREO); + #endif mpeg_sound_set(SOUND_BASS, bass); diff --git a/firmware/mpeg.h b/firmware/mpeg.h index 69110b34ec..9565e34b42 100644 --- a/firmware/mpeg.h +++ b/firmware/mpeg.h @@ -34,6 +34,7 @@ void mpeg_sound_set(int setting, int value); int mpeg_sound_min(int setting); int mpeg_sound_max(int setting); int mpeg_sound_default(int setting); +void mpeg_sound_channel_config(int configuration); int mpeg_val2phys(int setting, int value); char *mpeg_sound_unit(int setting); int mpeg_sound_numdecimals(int setting); @@ -47,6 +48,12 @@ bool mpeg_has_changed_track(void); #define SOUND_LOUDNESS 4 #define SOUND_SUPERBASS 5 #define SOUND_AVC 6 -#define SOUND_NUMSETTINGS 7 +#define SOUND_CHANNELS 7 +#define SOUND_NUMSETTINGS 8 + +#define MPEG_SOUND_STEREO 0 +#define MPEG_SOUND_MONO 1 +#define MPEG_SOUND_MONO_LEFT 2 +#define MPEG_SOUND_MONO_RIGHT 3 #endif