? patch_line_in.txt ? firmware/mp3_playback_withold.c Index: apps/main.c =================================================================== RCS file: /cvsroot/rockbox/apps/main.c,v retrieving revision 1.160 diff -u -b -r1.160 main.c --- apps/main.c 17 Dec 2005 10:13:29 -0000 1.160 +++ apps/main.c 4 Jan 2006 12:49:17 -0000 @@ -177,7 +177,10 @@ global_settings.mdb_center, global_settings.mdb_shape, global_settings.mdb_enable, - global_settings.superbass); + global_settings.superbass, + global_settings.decoder_scale, + global_settings.line_in_scale + ); audio_init(); button_clear_queue(); /* Empty the keyboard buffer */ #if CONFIG_CODEC == SWCODEC @@ -358,7 +361,10 @@ global_settings.mdb_center, global_settings.mdb_shape, global_settings.mdb_enable, - global_settings.superbass); + global_settings.superbass, + global_settings.decoder_scale, + global_settings.line_in_scale + ); audio_init(); #if (CONFIG_CODEC == SWCODEC) sound_settings_apply(); Index: apps/settings.c =================================================================== RCS file: /cvsroot/rockbox/apps/settings.c,v retrieving revision 1.348 diff -u -b -r1.348 settings.c --- apps/settings.c 22 Dec 2005 13:31:14 -0000 1.348 +++ apps/settings.c 4 Jan 2006 12:49:21 -0000 @@ -492,6 +492,11 @@ {4, S_O(brightness), 9, "brightness", NULL }, #endif +#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) + {8, S_O(line_in_scale), 0, "LineInVol", NULL }, /* 0..200% */ + {8, S_O(decoder_scale), 100, "DecoderVol", NULL }, /* 0..200% */ +#endif + /* If values are just added to the end, no need to bump the version. */ /* new stuff to be added at the end */ @@ -858,6 +863,8 @@ sound_set(SOUND_MDB_SHAPE, global_settings.mdb_shape); sound_set(SOUND_MDB_ENABLE, global_settings.mdb_enable); sound_set(SOUND_SUPERBASS, global_settings.superbass); + sound_set(SOUND_LINE_IN_SCALE, global_settings.line_in_scale); + sound_set(SOUND_DECODER_SCALE, global_settings.decoder_scale); #endif } @@ -1445,6 +1452,8 @@ global_settings.mdb_shape = sound_default(SOUND_MDB_SHAPE); global_settings.mdb_enable = sound_default(SOUND_MDB_ENABLE); global_settings.superbass = sound_default(SOUND_SUPERBASS); + global_settings.line_in_scale = sound_default(SOUND_LINE_IN_SCALE); + global_settings.decoder_scale = sound_default(SOUND_DECODER_SCALE); #endif global_settings.contrast = lcd_default_contrast(); global_settings.wps_file[0] = '\0'; Index: apps/settings.h =================================================================== RCS file: /cvsroot/rockbox/apps/settings.h,v retrieving revision 1.187 diff -u -b -r1.187 settings.h --- apps/settings.h 22 Dec 2005 23:48:31 -0000 1.187 +++ apps/settings.h 4 Jan 2006 12:49:22 -0000 @@ -176,6 +176,8 @@ int mdb_harmonics; /* 0-100% */ int mdb_center; /* 20-300Hz */ int mdb_shape; /* 50-300Hz */ + int line_in_scale; /* 0-200% */ + int decoder_scale; /* 0-200% */ bool mdb_enable; /* true/false */ bool superbass; /* true/false */ Index: apps/sound_menu.c =================================================================== RCS file: /cvsroot/rockbox/apps/sound_menu.c,v retrieving revision 1.91 diff -u -b -r1.91 sound_menu.c --- apps/sound_menu.c 7 Dec 2005 23:07:02 -0000 1.91 +++ apps/sound_menu.c 4 Jan 2006 12:49:24 -0000 @@ -105,6 +105,16 @@ return set_sound(str(LANG_TREBLE), &global_settings.treble, SOUND_TREBLE); } +static bool line_in_scale(void) +{ + return set_sound(str(LANG_LINE_IN_SCALE), &global_settings.line_in_scale, SOUND_LINE_IN_SCALE); +} + +static bool decoder_scale(void) +{ + return set_sound(str(LANG_DECODER_SCALE), &global_settings.decoder_scale, SOUND_DECODER_SCALE); +} + #if CONFIG_CODEC == SWCODEC static bool crossfeed(void) { @@ -389,6 +399,8 @@ { ID2P(LANG_MDB_HARMONICS), mdb_harmonics }, { ID2P(LANG_MDB_CENTER), mdb_center }, { ID2P(LANG_MDB_SHAPE), mdb_shape }, + { ID2P(LANG_DECODER_SCALE), decoder_scale }, + { ID2P(LANG_LINE_IN_SCALE), line_in_scale }, #endif }; Index: apps/lang/deutsch.lang =================================================================== RCS file: /cvsroot/rockbox/apps/lang/deutsch.lang,v retrieving revision 1.92 diff -u -b -r1.92 deutsch.lang --- apps/lang/deutsch.lang 6 Dec 2005 13:27:00 -0000 1.92 +++ apps/lang/deutsch.lang 4 Jan 2006 12:49:29 -0000 @@ -3459,3 +3459,15 @@ eng: "Mode:" voice: "" new: "Modus:" + +id: LANG_LINE_IN_SCALE +desc: in sound_settings line_in_scale +eng: "Line-In Volume" +voice: +new: "Line-In Lautstärke" + +id: LANG_DECODER_SCALE +desc: in sound_settings decoder_scale +eng: "Decoder Volume" +voice: +new: "Dekoderlautstärke" Index: apps/lang/english.lang =================================================================== RCS file: /cvsroot/rockbox/apps/lang/english.lang,v retrieving revision 1.209 diff -u -b -r1.209 english.lang --- apps/lang/english.lang 22 Dec 2005 10:43:35 -0000 1.209 +++ apps/lang/english.lang 4 Jan 2006 12:49:32 -0000 @@ -3557,3 +3557,14 @@ voice: "Brightness" new: +id: LANG_LINE_IN_SCALE +desc: in sound_settings line_in_volume +eng: "Line-In Volume" +voice: "Line In Volume" +new: + +id: LANG_DECODER_SCALE +desc: in sound_settings decoder_volume +eng: "Decoder Volume" +voice: "Decoder Volume" +new: Index: apps/recorder/recording.c =================================================================== RCS file: /cvsroot/rockbox/apps/recorder/recording.c,v retrieving revision 1.100 diff -u -b -r1.100 recording.c --- apps/recorder/recording.c 18 Dec 2005 10:02:41 -0000 1.100 +++ apps/recorder/recording.c 4 Jan 2006 12:49:34 -0000 @@ -148,6 +148,16 @@ #endif } +int get_line_in_gain_left(void) +{ + return global_settings.rec_left_gain; +} + +int get_line_in_gain_right(void) +{ + return global_settings.rec_right_gain; +} + static const char* const fmtstr[] = { "%d %s", /* no decimals */ Index: firmware/mp3_playback.c =================================================================== RCS file: /cvsroot/rockbox/firmware/mp3_playback.c,v retrieving revision 1.48 diff -u -b -r1.48 mp3_playback.c --- firmware/mp3_playback.c 6 Nov 2005 23:12:11 -0000 1.48 +++ firmware/mp3_playback.c 4 Jan 2006 12:49:35 -0000 @@ -27,6 +27,7 @@ #include "mpeg.h" /* ToDo: remove crosslinks */ #include "mp3_playback.h" #include "sound.h" +#include "audio.h" #ifndef SIMULATOR #include "i2c.h" #include "mas.h" @@ -259,8 +260,10 @@ SCR0 |= 0x20; } +enum LineInMode { LimKeep = -1, LimOff, LimOn }; + #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) -static void init_playback(void) +static void init_playback( enum LineInMode lim ) { unsigned long val; int rc; @@ -282,13 +285,26 @@ mas_readmem(MAS_BANK_D0, MAS_D0_APP_RUNNING, &val, 1); } while(val); - /* Enable the D/A Converter */ - shadow_codec_reg0 = 0x0001; + switch(lim) + { + extern int get_line_in_gain_left(void); + extern int get_line_in_gain_right(void); + case LimOff: /* no line-in */ + shadow_codec_reg0 = MAS_DAC_ENABLE; /* Enable the D/A Converter only, ADC(line-in/mic) off*/ + case LimKeep: /* at least enable DAC */ + shadow_codec_reg0 |= MAS_DAC_ENABLE; /* do not change the ADC settings, but enable DAC */ mas_codec_writereg(0x0, shadow_codec_reg0); + break; - /* ADC scale 0%, DSP scale 100% */ - mas_codec_writereg(6, 0x0000); - mas_codec_writereg(7, 0x4000); + case LimOn: /* we want line-in (from ADC) mixed into output signal: */ + audio_set_recording_gain( get_line_in_gain_left() /*MAS_LINE_IN_dB(6)*/ /* global_settings.rec_left_gain*/ , + get_line_in_gain_left() /*MAS_LINE_IN_dB(6)*/ /* global_settings.rec_right_gain*/ , + AUDIO_GAIN_LINEIN); /* enables ADC and DAC and writes shadow reg */ + break; + + default: + break; + } #ifdef HAVE_SPDIF_OUT val = 0x09; /* Disable SDO and SDI, low impedance S/PDIF outputs */ @@ -328,7 +344,7 @@ int avc, int channel_config, int stereo_width, int mdb_strength, int mdb_harmonics, int mdb_center, int mdb_shape, bool mdb_enable, - bool superbass) + bool superbass, int decoder_scale, int line_in_scale ) { #ifdef SIMULATOR (void)volume; @@ -345,6 +361,8 @@ (void)mdb_shape; (void)mdb_enable; (void)superbass; + (void)decoder_scale; + (void)line_in_scale; #else #if CONFIG_CODEC == MAS3507D unsigned long val; @@ -356,6 +374,14 @@ (void)mdb_shape; (void)mdb_enable; (void)superbass; + (void)decoder_scale; + (void)line_in_scale; +#endif + +#if CONFIG_CODEC == MAS3587F +#define MASNO "MAS3587F" +#elif CONFIG_CODEC == MAS3539F +#define MASNO "MAS3539F" #endif setup_sci0(); @@ -367,20 +393,14 @@ #if CONFIG_CODEC == MAS3507D mas_reset(); -#elif CONFIG_CODEC == MAS3587F - or_b(0x08, &PAIORH); /* output for /PR */ - init_playback(); +#elif CONFIG_CODEC == MAS3587F || CONFIG_CODEC == MAS3539F - mas_version_code = mas_readver(); - DEBUGF("MAS3587 derivate %d, version %c%d\n", - (mas_version_code & 0xf000) >> 12, - 'A' + ((mas_version_code & 0x0f00) >> 8), mas_version_code & 0xff); -#elif CONFIG_CODEC == MAS3539F or_b(0x08, &PAIORH); /* output for /PR */ - init_playback(); + + init_playback(line_in_scale > 0 ? LimOn : LimOff); mas_version_code = mas_readver(); - DEBUGF("MAS3539 derivate %d, version %c%d\n", + DEBUGF(MASNO "derivate %d, version %c%d\n", mas_no, (mas_version_code & 0xf000) >> 12, 'A' + ((mas_version_code & 0x0f00) >> 8), mas_version_code & 0xff); #endif @@ -461,6 +481,8 @@ sound_set(SOUND_MDB_SHAPE, mdb_shape); sound_set(SOUND_MDB_ENABLE, mdb_enable); sound_set(SOUND_SUPERBASS, superbass); + sound_set(SOUND_LINE_IN_SCALE, line_in_scale); + sound_set(SOUND_DECODER_SCALE, decoder_scale); #endif #endif /* !SIMULATOR */ @@ -490,7 +512,7 @@ void mp3_play_init(void) { #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) - init_playback(); + init_playback(LimKeep); #endif playing = false; paused = true; @@ -596,7 +618,7 @@ int avc, int channel_config, int stereo_width, int mdb_strength, int mdb_harmonics, int mdb_center, int mdb_shape, bool mdb_enable, - bool superbass) + bool superbass, int decoder_scale, int line_in_scale ) { /* a dummy */ (void)volume; @@ -613,7 +635,8 @@ (void)mdb_shape; (void)mdb_enable; (void)superbass; - + (void)decoder_scale; + (void)line_in_scale paused = false; playing = false; #ifndef SIMULATOR Index: firmware/sound.c =================================================================== RCS file: /cvsroot/rockbox/firmware/sound.c,v retrieving revision 1.22 diff -u -b -r1.22 sound.c --- firmware/sound.c 7 Dec 2005 23:07:02 -0000 1.22 +++ firmware/sound.c 4 Jan 2006 12:49:37 -0000 @@ -20,6 +20,7 @@ #include #include "config.h" #include "sound.h" +#include "audio.h" #ifndef SIMULATOR #include "i2c.h" #include "mas.h" @@ -86,6 +87,8 @@ [SOUND_LEFT_GAIN] = {"dB", 1, 1, 0, 15, 8, NULL}, [SOUND_RIGHT_GAIN] = {"dB", 1, 1, 0, 15, 8, NULL}, [SOUND_MIC_GAIN] = {"dB", 1, 1, 0, 15, 2, NULL}, + [SOUND_LINE_IN_SCALE] = {"%", 0, 5, 0, 200, 0, sound_set_line_in_scale}, + [SOUND_DECODER_SCALE] = {"%", 0, 5, 30, 200,100, sound_set_decoder_scale}, #elif defined(HAVE_UDA1380) [SOUND_LEFT_GAIN] = {"dB", 1, 1, 0, 8, 8, NULL}, [SOUND_RIGHT_GAIN] = {"dB", 1, 1, 0, 8, 8, NULL}, @@ -491,6 +494,52 @@ #endif } +void sound_set_line_in_scale(int value) +{ + extern int get_line_in_gain_left(void); + extern int get_line_in_gain_right(void); + + if(!audio_is_initialized) + return; +#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) + unsigned tmp = (unsigned)(value * MAS_MIX_SCALE_0DB / 100/*%*/) << 8; + mas_codec_writereg(MAS_REG_MIX_ADC_SCALE, MIN(tmp, (MAS_MIX_SCALE_MAX << 8))); + if( tmp == MAS_MIX_SCALE_OFF ) + { + if ( shadow_codec_reg0 & MAS_ADC_ENABLE_LR ) // ADC on at all? -> switch if off (power, noise) + mas_codec_writereg(0x0, shadow_codec_reg0 &= ~MAS_ADC_ENABLE_LR ); /* only DAC, not ADC */ + } + else if (!(shadow_codec_reg0 & MAS_ADC_ENABLE_LR ) ) // ADC/Line-In disabled? + audio_set_recording_gain( get_line_in_gain_left() /*MAS_LINE_IN_dB(6)*/ /* global_settings.rec_left_gain*/ , + get_line_in_gain_left() /*MAS_LINE_IN_dB(6)*/ /* global_settings.rec_right_gain*/ , + AUDIO_GAIN_LINEIN); /* enables ADC and DAC and writes shadow reg */ +#elif CONFIG_CODEC == MAS3507D + (void)value; +#elif defined(HAVE_UDA1380) + (void)value; +#elif (CONFIG_CPU == PP5020) + (void)value; +#endif +} + +void sound_set_decoder_scale(int value) +{ + if(!audio_is_initialized) + return; +#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) + unsigned tmp = (unsigned)(value * MAS_MIX_SCALE_0DB / 100/*%*/) << 8; + mas_codec_writereg(MAS_REG_MIX_DSP_SCALE, MIN(tmp, (MAS_MIX_SCALE_MAX << 8))); +// mas_codec_writereg(MAS_REG_MIX_DSP_SCALE, tmp); +#elif CONFIG_CODEC == MAS3507D + (void)value; +#elif defined(HAVE_UDA1380) + (void)value; +#elif (CONFIG_CPU == PP5020) + (void)value; +#endif +} + + void sound_set_channels(int value) { if(!audio_is_initialized) Index: firmware/export/mas.h =================================================================== RCS file: /cvsroot/rockbox/firmware/export/mas.h,v retrieving revision 1.5 diff -u -b -r1.5 mas.h --- firmware/export/mas.h 29 Aug 2005 21:15:20 -0000 1.5 +++ firmware/export/mas.h 4 Jan 2006 12:49:38 -0000 @@ -31,6 +31,25 @@ #define MAS_ADR 0x3c #define MAS_DEV_WRITE (MAS_ADR | 0x00) #define MAS_DEV_READ (MAS_ADR | 0x01) + +#define MAS_MIX_SCALE_OFF 0x00 +#define MAS_MIX_SCALE_0DB 0x40 +#define MAS_MIX_SCALE_DOUBLE 0x7F //? not 0x80 ? at least datasheet says so.. +#define MAS_MIX_SCALE_MAX MAS_MIX_SCALE_DOUBLE + +#define MAS_REG_MIX_ADC_SCALE 0x0006 +#define MAS_REG_MIX_DSP_SCALE 0x0007 + +#define MAS_LINE_IN_0DB 0x2 /* 0-15, 2 is 0 dB */ +#define MAS_LINE_IN_DBSTEPS 2 / 3 /* / 1,5 , 1,5dB steps*/ +#define MAS_LINE_IN_dB(db) (MAS_LINE_IN_0DB + db * MAS_LINE_IN_DBSTEPS ) + +#define MAS_DAC_ENABLE (1 << 0) +#define MAS_ADC_ENABLE_RIGHT (1 << 1) +#define MAS_ADC_ENABLE_LEFT (1 << 2) +#define MAS_ADC_ENABLE_LR (MAS_ADC_ENABLE_RIGHT | MAS_ADC_ENABLE_LEFT) +#define MAS_ADC_ENABLE_MIC (1 << 3) // otherwise Line-In + #else #define MAS_ADR 0x3a #define MAS_DEV_WRITE (MAS_ADR | 0x00) Index: firmware/export/mp3_playback.h =================================================================== RCS file: /cvsroot/rockbox/firmware/export/mp3_playback.h,v retrieving revision 1.15 diff -u -b -r1.15 mp3_playback.h --- firmware/export/mp3_playback.h 29 Aug 2005 21:15:20 -0000 1.15 +++ firmware/export/mp3_playback.h 4 Jan 2006 12:49:38 -0000 @@ -29,7 +29,7 @@ int avc, int channel_config, int stereo_width, int mdb_strength, int mdb_harmonics, int mdb_center, int mdb_shape, bool mdb_enable, - bool superbass); + bool superbass, int decoder_scale, int line_in_scale); /* exported just for mpeg.c, to keep the recording there */ #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) Index: firmware/export/sound.h =================================================================== RCS file: /cvsroot/rockbox/firmware/export/sound.h,v retrieving revision 1.9 diff -u -b -r1.9 sound.h --- firmware/export/sound.h 7 Dec 2005 23:07:02 -0000 1.9 +++ firmware/export/sound.h 4 Jan 2006 12:49:38 -0000 @@ -41,7 +41,10 @@ SOUND_RIGHT_GAIN, SOUND_MIC_GAIN, #endif -#if defined(HAVE_UDA1380) +#if CONFIG_CODEC == MAS3587F + SOUND_LINE_IN_SCALE, + SOUND_DECODER_SCALE, +#elif defined(HAVE_UDA1380) SOUND_ADC_LEFT_GAIN, SOUND_ADC_RIGHT_GAIN, #endif @@ -81,6 +84,8 @@ void sound_set_mdb_shape(int value); void sound_set_mdb_enable(int value); void sound_set_superbass(int value); +void sound_set_line_in_scale(int value); +void sound_set_decoder_scale(int value); #endif /* (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) */ void sound_set(int setting, int value);