diff -ur orig/firmware/drivers/mas.h firmware/drivers/mas.h --- orig/firmware/drivers/mas.h Wed Jun 26 15:39:49 2002 +++ firmware/drivers/mas.h Mon Jul 22 11:32:34 2002 @@ -60,6 +60,11 @@ #define MAS_REG_KPRESCALE 0xe7 #define MAS_REG_KBASS 0x6b #define MAS_REG_KTREBLE 0x6f +#define MAS_REG_KMDB_SWITCH 0x21 +#define MAS_REG_KMDB_STR 0x22 +#define MAS_REG_KMDB_HAR 0x23 +#define MAS_REG_KMDB_FC 0x24 +#define MAS_REG_KLOUDNESS 0x1e /* * MAS commands diff -ur orig/firmware/mpeg.c firmware/mpeg.c --- orig/firmware/mpeg.c Sun Jul 21 10:12:39 2002 +++ firmware/mpeg.c Mon Jul 22 11:54:48 2002 @@ -56,21 +56,30 @@ { "%", /* Volume */ "dB", /* Bass */ - "dB" /* Treble */ + "dB", /* Treble */ + "", /* Balance */ + "dB", /* Loudness */ + "%" /* Bass boost */ }; static int numdecimals[] = { 0, /* Volume */ 0, /* Bass */ - 0 /* Treble */ + 0, /* Treble */ + 0, /* Balance */ + 0, /* Loudness */ + 0 /* Bass boost */ }; static int minval[] = { 0, /* Volume */ 0, /* Bass */ - 0 /* Treble */ + 0, /* Treble */ + 0, /* Balance */ + 0, /* Loudness */ + 0 /* Bass boost */ }; static int maxval[] = @@ -78,11 +87,14 @@ 50, /* Volume */ #ifdef ARCHOS_RECORDER 24, /* Bass */ - 24 /* Treble */ + 24, /* Treble */ #else 30, /* Bass */ - 30 /* Treble */ + 30, /* Treble */ #endif + 100, /* Balance */ + 17, /* Loudness */ + 10 /* Bass boost */ }; static int defaultval[] = @@ -90,11 +102,14 @@ 70/2, /* Volume */ #ifdef ARCHOS_RECORDER 12+6, /* Bass */ - 12+6 /* Treble */ + 12+6, /* Treble */ #else 15+7, /* Bass */ - 15+7 /* Treble */ + 15+7, /* Treble */ #endif + 50, /* Balance */ + 0, /* Loudness */ + 0 /* Bass boost */ }; char *mpeg_sound_unit(int setting) @@ -965,6 +980,34 @@ set_prescaled_volume(); #endif break; + +#ifdef ARCHOS_RECORDER + case SOUND_SUPERBASS: + if (value) { + tmp = MAX(MIN(value * 10 * 1.2, 0x7f), 0); + mas_codec_writereg(MAS_REG_KMDB_STR, (tmp & 0xff) << 8); + tmp = 0x30; /* MDB_HAR: Space for experiment here */ + mas_codec_writereg(MAS_REG_KMDB_HAR, (tmp & 0xff) << 8); + tmp = 60 / 10; /* calculate MDB_FC, 60hz - experiment here, + this would depend on the earphones... + perhaps make it tunable? */ + mas_codec_writereg(MAS_REG_KMDB_FC, (tmp & 0xff) << 8); + tmp = 1.5 * tmp; /* calculate MDB_SHAPE */ + mas_codec_writereg(MAS_REG_KMDB_SWITCH, + ((tmp & 0xff) << 8) /* MDB_SHAPE */ + | 2); /* MDB_SWITCH enable */ + } else { + mas_codec_writereg(MAS_REG_KMDB_STR, 0); + mas_codec_writereg(MAS_REG_KMDB_HAR, 0); + mas_codec_writereg(MAS_REG_KMDB_SWITCH, 0); /* MDB_SWITCH disable */ + } + break; + + case SOUND_LOUDNESS: + tmp = MAX(MIN(value * 4, 0x44), 0); + mas_codec_writereg(MAS_REG_KLOUDNESS, (tmp & 0xff) << 8); + break; +#endif } #endif /* SIMULATOR */ } @@ -994,18 +1037,30 @@ result = value - 15; #endif break; + +#ifdef ARCHOS_RECORDER + case SOUND_LOUDNESS: + result = value; + break; + + case SOUND_SUPERBASS: + result = value * 10; + break; +#endif } return result; } -void mpeg_init(int volume, int bass, int treble) +void mpeg_init(int volume, int bass, int treble, int loudness, int bass_boost) { #ifdef SIMULATOR - volume = bass = treble; + volume = bass = treble = loudness = bass_boost; #else #ifdef ARCHOS_RECORDER int rc; unsigned long val; +#else + loudness = bass_boost; #endif setup_sci0(); @@ -1069,5 +1124,9 @@ mpeg_sound_set(SOUND_BASS, bass); mpeg_sound_set(SOUND_TREBLE, treble); mpeg_sound_set(SOUND_VOLUME, volume); +#ifdef ARCHOS_RECORDER + mpeg_sound_set(SOUND_LOUDNESS, loudness); + mpeg_sound_set(SOUND_SUPERBASS, bass_boost); +#endif #endif /* SIMULATOR */ } diff -ur orig/firmware/mpeg.h firmware/mpeg.h --- orig/firmware/mpeg.h Tue Jul 2 18:55:50 2002 +++ firmware/mpeg.h Mon Jul 22 09:22:06 2002 @@ -21,7 +21,7 @@ #include -void mpeg_init(int volume, int bass, int treble); +void mpeg_init(int volume, int bass, int treble, int loudness, int bass_boost); void mpeg_play(char* trackname); void mpeg_stop(void); void mpeg_pause(void); diff -ur orig/apps/debug_menu.c apps/debug_menu.c --- orig/apps/debug_menu.c Tue Jul 16 01:25:45 2002 +++ apps/debug_menu.c Mon Jul 22 11:57:40 2002 @@ -341,18 +341,97 @@ } #endif +/* Read MAS registers and display them */ +void dbg_mas(void) +{ + char buf[32]; + unsigned int addr = 0, r, i; + int button; + + lcd_clear_display(); + lcd_puts(0, 0, "MAS register read:"); + + while(1) + { + for (r = 0; r < 4; r++) { + i = mas_readreg(addr + r); + snprintf(buf, 30, "0x%02x: %08x", addr + r, i); + lcd_puts(1, r+1, buf); + } + + lcd_update(); + sleep(HZ/16); + + button = button_get(false); + + switch(button) + { + case BUTTON_DOWN: + addr += 4; + break; + case BUTTON_UP: + if (addr) { addr -= 4; } + break; + case BUTTON_LEFT: + return; + } + } +} + +#ifdef ARCHOS_RECORDER +void dbg_mas_codec(void) +{ + char buf[32]; + unsigned int addr = 0, r, i; + int button; + + lcd_clear_display(); + lcd_puts(0, 0, "MAS codec reg read:"); + + while(1) + { + for (r = 0; r < 4; r++) { + i = mas_codec_readreg(addr + r); + snprintf(buf, 30, "0x%02x: %08x", addr + r, i); + lcd_puts(1, r+1, buf); + } + + lcd_update(); + sleep(HZ/16); + + button = button_get(false); + + switch(button) + { + case BUTTON_DOWN: + addr += 4; + break; + case BUTTON_UP: + if (addr) { addr -= 4; } + break; + case BUTTON_LEFT: + return; + } + } +} +#endif + void debug_menu(void) { int m; struct menu_items items[] = { - { "Debug ports", dbg_ports }, + { "View I/O ports", dbg_ports }, #ifdef HAVE_LCD_BITMAP #ifdef HAVE_RTC - { "Debug RTC", dbg_rtc }, + { "View/clr RTC RAM", dbg_rtc }, #endif /* HAVE_RTC */ #endif /* HAVE_LCD_BITMAP */ - { "Debug OS", dbg_os }, + { "View OS stacks", dbg_os }, + { "View MAS regs", dbg_mas }, +#ifdef ARCHOS_RECORDER + { "View MAS codec", dbg_mas_codec }, +#endif }; m=menu_init( items, sizeof items / sizeof(struct menu_items) ); diff -ur orig/apps/main.c apps/main.c --- orig/apps/main.c Tue Jul 16 11:48:16 2002 +++ apps/main.c Mon Jul 22 09:22:33 2002 @@ -147,7 +147,9 @@ mpeg_init( global_settings.volume, global_settings.bass, - global_settings.treble ); + global_settings.treble, + global_settings.loudness, + global_settings.bass_boost ); usb_start_monitoring(); } diff -ur orig/apps/settings.c apps/settings.c --- orig/apps/settings.c Mon Jul 15 21:55:15 2002 +++ apps/settings.c Mon Jul 22 09:22:34 2002 @@ -209,7 +209,8 @@ rtc_config_block[0xe] = (unsigned char) ((global_settings.playlist_shuffle & 1) | - ((global_settings.mp3filter & 1) << 1)); + ((global_settings.mp3filter & 1) << 1) | + ((global_settings.sort_case & 1) << 2)); rtc_config_block[0xf] = (unsigned char) ((global_settings.scroll_speed << 3) | @@ -266,6 +267,7 @@ if (rtc_config_block[0xe] != 0xFF) { global_settings.playlist_shuffle = rtc_config_block[0xe] & 1; global_settings.mp3filter = (rtc_config_block[0xe] >> 1) & 1; + global_settings.sort_case = (rtc_config_block[0xe] >> 2) & 1; } c = rtc_config_block[0xf] >> 3; @@ -303,6 +305,7 @@ global_settings.backlight = DEFAULT_BACKLIGHT_SETTING; global_settings.wps_display = DEFAULT_WPS_DISPLAY; global_settings.mp3filter = true; + global_settings.sort_case = false; global_settings.playlist_shuffle = false; global_settings.total_boots = 0; global_settings.total_uptime = 0; diff -ur orig/apps/settings.h apps/settings.h --- orig/apps/settings.h Mon Jul 15 14:02:12 2002 +++ apps/settings.h Mon Jul 22 09:22:34 2002 @@ -52,8 +52,9 @@ /* misc options */ - int loop_playlist; /* do we return to top of playlist at end? */ - bool mp3filter; + int loop_playlist; /* do we return to top of playlist at end? */ + bool mp3filter; /* only display mp3/m3u files and dirs in directory? */ + bool sort_case; /* dir sort order: 0=case insensitive, 1=sensitive */ int scroll_speed; /* long texts scrolling speed: 1-20 */ bool playlist_shuffle; diff -ur orig/apps/settings_menu.c apps/settings_menu.c --- orig/apps/settings_menu.c Mon Jul 15 14:02:12 2002 +++ apps/settings_menu.c Mon Jul 22 09:22:34 2002 @@ -43,6 +43,11 @@ set_bool( "[MP3/M3U filter]", &global_settings.mp3filter ); } +static void sort_case(void) +{ + set_bool( "[Sort case sensitive]", &global_settings.sort_case ); +} + static void backlight_timer(void) { set_int( "[Backlight]", "s", &global_settings.backlight, @@ -68,6 +73,7 @@ struct menu_items items[] = { { "Shuffle", shuffle }, { "MP3/M3U filter", mp3_filter }, + { "Sort mode", sort_case }, { "Backlight Timer", backlight_timer }, { "Scroll speed", scroll_speed }, { "While Playing", wps_set }, diff -ur orig/apps/sound_menu.c apps/sound_menu.c --- orig/apps/sound_menu.c Mon Jul 15 14:02:12 2002 +++ apps/sound_menu.c Mon Jul 22 11:48:03 2002 @@ -118,13 +118,29 @@ set_sound("Treble", &global_settings.treble, SOUND_TREBLE); } +#ifdef ARCHOS_RECORDER +static void loudness(void) +{ + set_sound("Loudness", &global_settings.loudness, SOUND_LOUDNESS); +}; + +static void bass_boost(void) +{ + set_sound("Bass boost", &global_settings.bass_boost, SOUND_SUPERBASS); +}; +#endif /* ARCHOS_RECORDER */ + void sound_menu(void) { int m; struct menu_items items[] = { { "Volume", volume }, { "Bass", bass }, - { "Treble", treble } + { "Treble", treble }, +#ifdef ARCHOS_RECORDER + { "Loudness", loudness }, + { "Bass Boost", bass_boost } +#endif }; m=menu_init( items, sizeof items / sizeof(struct menu_items) ); diff -ur orig/apps/tree.c apps/tree.c --- orig/apps/tree.c Wed Jul 17 14:25:04 2002 +++ apps/tree.c Mon Jul 22 09:22:34 2002 @@ -114,7 +114,10 @@ struct entry* e2 = *(struct entry**)p2; if (( e1->attr & ATTR_DIRECTORY ) == ( e2->attr & ATTR_DIRECTORY )) - return strncasecmp(e1->name, e2->name, TREE_MAX_FILENAMELEN); + if (global_settings.sort_case) + return strncmp(e1->name, e2->name, TREE_MAX_FILENAMELEN); + else + return strncasecmp(e1->name, e2->name, TREE_MAX_FILENAMELEN); else return ( e2->attr & ATTR_DIRECTORY ) - ( e1->attr & ATTR_DIRECTORY ); }