diff --git a/apps/main.c b/apps/main.c index 15bb73e971..d51b606d86 100644 --- a/apps/main.c +++ b/apps/main.c @@ -47,6 +47,7 @@ #include "sprintf.h" #include "font.h" #include "language.h" +#include "wps-display.h" char appsversion[]=APPSVERSION; @@ -68,6 +69,7 @@ void init(void) show_logo(); settings_reset(); settings_load(); + wps_load(ROCKBOX_DIR "/default.wps", false); font_load(ROCKBOX_DIR "/default.fnt"); lang_load(ROCKBOX_DIR "/default.lng"); sleep(HZ/2); @@ -147,6 +149,7 @@ void init(void) } settings_load(); + wps_load(ROCKBOX_DIR "/default.wps", false); font_load(ROCKBOX_DIR "/default.fnt"); lang_load(ROCKBOX_DIR "/default.lng"); diff --git a/apps/settings.c b/apps/settings.c index 067cc3eae4..f03c1e888b 100644 --- a/apps/settings.c +++ b/apps/settings.c @@ -45,8 +45,9 @@ #include "icons.h" #include "font.h" #endif - #include "lang.h" +#include "language.h" +#include "wps-display.h" struct user_settings global_settings; char rockboxdir[] = ROCKBOX_DIR; /* config/font/data file directory */ @@ -112,6 +113,9 @@ modified unless the header & checksum test fails. Rest of config block, only saved to disk: +0xB8 (char[20]) WPS file +0xCC (char[20]) Lang file +0xE0 (char[20]) Font file 0xF4 (int) Playlist first index 0xF8 (int) Playlist shuffle seed 0xFC (char[260]) Resume playlist (path/to/dir or path/to/playlist.m3u) @@ -313,6 +317,9 @@ int settings_save( void ) memcpy(&config_block[0x24], &global_settings.total_uptime, 4); + strncpy(&config_block[0xb8], global_settings.wps_file, MAX_FILENAME); + strncpy(&config_block[0xcc], global_settings.lang_file, MAX_FILENAME); + strncpy(&config_block[0xe0], global_settings.font_file, MAX_FILENAME); memcpy(&config_block[0xF4], &global_settings.resume_first_index, 4); memcpy(&config_block[0xF8], &global_settings.resume_seed, 4); @@ -345,6 +352,8 @@ int settings_save( void ) void settings_apply(void) { + char buf[64]; + mpeg_sound_set(SOUND_BASS, global_settings.bass); mpeg_sound_set(SOUND_TREBLE, global_settings.treble); mpeg_sound_set(SOUND_BALANCE, global_settings.balance); @@ -367,6 +376,24 @@ void settings_apply(void) #ifdef HAVE_CHARGE_CTRL charge_restart_level = global_settings.discharge ? CHARGE_RESTART_LO : CHARGE_RESTART_HI; #endif + + if ( global_settings.wps_file[0] ) { + snprintf(buf, sizeof buf, ROCKBOX_DIR "/%s.wps", + global_settings.wps_file); + wps_load(buf, false); + } +#ifdef HAVE_LCD_BITMAP + if ( global_settings.font_file[0] ) { + snprintf(buf, sizeof buf, ROCKBOX_DIR "/%s.fnt", + global_settings.font_file); + font_load(buf); + } +#endif + if ( global_settings.lang_file[0] ) { + snprintf(buf, sizeof buf, ROCKBOX_DIR "/%s.lng", + global_settings.lang_file); + lang_load(buf); + } } /* @@ -473,6 +500,9 @@ void settings_load(void) memcpy(&global_settings.resume_first_index, &config_block[0xF4], 4); memcpy(&global_settings.resume_seed, &config_block[0xF8], 4); + strncpy(global_settings.wps_file, &config_block[0xb8], MAX_FILENAME); + strncpy(global_settings.lang_file, &config_block[0xcc], MAX_FILENAME); + strncpy(global_settings.font_file, &config_block[0xe0], MAX_FILENAME); strncpy(global_settings.resume_file, &config_block[0xFC], MAX_PATH); global_settings.resume_file[MAX_PATH]=0; } diff --git a/apps/settings.h b/apps/settings.h index f5609fe75c..c2f5c925fb 100644 --- a/apps/settings.h +++ b/apps/settings.h @@ -25,6 +25,8 @@ #define ROCKBOX_DIR "/.rockbox" +#define MAX_FILENAME 20 + /* data structures */ #define RESUME_OFF 0 @@ -75,6 +77,9 @@ struct user_settings int resume_seed; /* random seed for playlist shuffle */ int resume_first_index; /* first index of playlist */ unsigned char resume_file[MAX_PATH+1]; /* playlist name (or dir) */ + unsigned char font_file[MAX_FILENAME+1]; /* last font */ + unsigned char wps_file[MAX_FILENAME+1]; /* last wps */ + unsigned char lang_file[MAX_FILENAME+1]; /* last language */ /* misc options */ diff --git a/apps/tree.c b/apps/tree.c index e5c515f06b..6e52942b45 100644 --- a/apps/tree.c +++ b/apps/tree.c @@ -658,6 +658,26 @@ bool pageupdown(int* ds, int* dc, int numentries, int tree_max_on_screen ) } #endif +static void storefile(char* filename, char* setting, int maxlen) +{ + int len = strlen(filename); + int extlen = 0; + char* ptr = filename + len; + + while (*ptr != '.') { + extlen++; + ptr--; + } + + if (strcmp(ROCKBOX_DIR, currdir) || (len > maxlen-extlen)) + return; + + strncpy(setting, filename, len-extlen); + setting[len-extlen]=0; + + settings_save(); +} + bool dirbrowse(char *root) { int numentries=0; @@ -771,6 +791,7 @@ bool dirbrowse(char *root) int seed = current_tick; bool play = false; int start_index=0; + lcd_stop_scroll(); switch ( file->attr & TREE_ATTR_MASK ) { case TREE_ATTR_M3U: @@ -802,7 +823,9 @@ bool dirbrowse(char *root) case TREE_ATTR_WPS: snprintf(buf, sizeof buf, "%s/%s", currdir, file->name); - wps_load_custom(buf); + wps_load(buf,true); + storefile(file->name, global_settings.wps_file, + MAX_FILENAME); restore = true; break; @@ -824,6 +847,10 @@ bool dirbrowse(char *root) snprintf(buf, sizeof buf, "%s/%s", currdir, file->name); if(!lang_load(buf)) { + storefile(file->name, + global_settings.lang_file, + MAX_FILENAME); + lcd_clear_display(); #ifdef HAVE_LCD_CHARCELLS lcd_puts(0, 0, str(LANG_LANGUAGE_LOADED)); @@ -849,6 +876,9 @@ bool dirbrowse(char *root) snprintf(buf, sizeof buf, "%s/%s", currdir, file->name); font_load(buf); + storefile(file->name, global_settings.font_file, + MAX_FILENAME); + lcd_getstringsize("A", &fw, &fh); tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh; /* make sure cursor is on screen */ diff --git a/apps/wps-display.c b/apps/wps-display.c index 3f94a09b9e..b629a06c4e 100644 --- a/apps/wps-display.c +++ b/apps/wps-display.c @@ -111,20 +111,13 @@ static void wps_format(char* fmt) } } -bool wps_load_custom(char* file) +bool wps_load(char* file, bool display) { char buffer[FORMAT_BUFFER_SIZE]; int fd; - bool special = true; wps_loaded = true; - /* default wps file? */ - if (!file) { - file = WPS_CONFIG; - special = false; - } - fd = open(file, O_RDONLY); if (-1 != fd) @@ -139,7 +132,7 @@ bool wps_load_custom(char* file) close(fd); - if ( special ) { + if ( display ) { int i; lcd_clear_display(); #ifdef HAVE_LCD_BITMAP @@ -640,8 +633,6 @@ void wps_display(struct mp3entry* id3) else { if (!wps_loaded) { - wps_load_custom(NULL); - if ( !format_buffer[0] ) { #ifdef HAVE_LCD_BITMAP wps_format("%s%fp\n" diff --git a/apps/wps-display.h b/apps/wps-display.h index a62817edad..439660e831 100644 --- a/apps/wps-display.h +++ b/apps/wps-display.h @@ -24,7 +24,7 @@ bool wps_refresh(struct mp3entry* id3, int ffwd_offset, bool refresh_scroll); void wps_display(struct mp3entry* id3); -bool wps_load_custom(char* file); +bool wps_load(char* file, bool display); #ifdef HAVE_LCD_CHARCELLS bool draw_player_progress(struct mp3entry* id3, int ff_rewind_count); diff --git a/firmware/font.c b/firmware/font.c index 72c7085b7a..6f5156cc73 100644 --- a/firmware/font.c +++ b/firmware/font.c @@ -125,8 +125,6 @@ struct font* font_load(char *path) char copyright[256+1]; struct font* pf = &font_ui; - memset(pf, 0, sizeof(struct font)); - /* open and read entire font file*/ fd = open(path, O_RDONLY|O_BINARY); if (fd < 0) { @@ -134,6 +132,8 @@ struct font* font_load(char *path) return NULL; } + memset(pf, 0, sizeof(struct font)); + /* currently, font loading replaces earlier font allocation*/ freeptr = (unsigned char *)(((int)mbuf + 3) & ~3);