#include "plugin.h" #include "lib/configfile.h" #include "lib/oldmenuapi.h" #include "mpeg_settings.h" extern struct plugin_api* rb; struct mpeg_settings settings; static struct mpeg_settings old_settings; #define SETTINGS_VERSION 2 #define SETTINGS_MIN_VERSION 1 #define SETTINGS_FILENAME "mpegplayer.cfg" static struct configdata config[] = { {TYPE_ENUM, 0, 2, &settings.showfps, "Show FPS", (char *[]){ "No", "Yes" }, NULL}, {TYPE_ENUM, 0, 2, &settings.limitfps, "Limit FPS", (char *[]){ "No", "Yes" }, NULL}, {TYPE_ENUM, 0, 2, &settings.skipframes, "Skip frames", (char *[]){ "No", "Yes" }, NULL}, #if defined(TOSHIBA_GIGABEAT_F) || defined(SANSA_E200) {TYPE_INT, 0, INT_MAX, &settings.displayoptions, "Display options", NULL, NULL}, #endif }; enum mpeg_menu_ids { __MPEG_OPTION_START = -1, #if defined(TOSHIBA_GIGABEAT_F) || defined(SANSA_E200) MPEG_OPTION_DISPLAY_SETTINGS, #endif MPEG_OPTION_DISPLAY_FPS, MPEG_OPTION_LIMIT_FPS, MPEG_OPTION_SKIP_FRAMES, MPEG_OPTION_QUIT, }; static const struct opt_items noyes[2] = { { "No", -1 }, { "Yes", -1 }, }; #if defined(TOSHIBA_GIGABEAT_F) || defined(SANSA_E200) static bool set_option_dithering(void) { int val = (settings.displayoptions & LCD_YUV_DITHER) ? 1 : 0; rb->set_option("Dithering", &val, INT, noyes, 2, NULL); settings.displayoptions = (settings.displayoptions & ~LCD_YUV_DITHER) | ((val != 0) ? LCD_YUV_DITHER : 0); rb->lcd_yuv_set_options(settings.displayoptions); return false; } static void display_options(void) { static const struct menu_item items[] = { { "Dithering", set_option_dithering }, }; int m = menu_init(rb, items, ARRAYLEN(items), NULL, NULL, NULL, NULL); menu_run(m); menu_exit(m); } #endif /* #ifdef TOSHIBA_GIGABEAT_F */ bool mpeg_menu(void) { int m; int result; int menu_quit=0; static const struct menu_item items[] = { #if defined(TOSHIBA_GIGABEAT_F) || defined(SANSA_E200) [MPEG_OPTION_DISPLAY_SETTINGS] = { "Display Options", NULL }, #endif [MPEG_OPTION_DISPLAY_FPS] = { "Display FPS", NULL }, [MPEG_OPTION_LIMIT_FPS] = { "Limit FPS", NULL }, [MPEG_OPTION_SKIP_FRAMES] = { "Skip frames", NULL }, [MPEG_OPTION_QUIT] = { "Quit mpegplayer", NULL }, }; m = menu_init(rb, items, ARRAYLEN(items), NULL, NULL, NULL, NULL); rb->button_clear_queue(); while (!menu_quit) { result=menu_show(m); switch(result) { #if defined(TOSHIBA_GIGABEAT_F) || defined(SANSA_E200) case MPEG_OPTION_DISPLAY_SETTINGS: display_options(); break; #endif case MPEG_OPTION_DISPLAY_FPS: rb->set_option("Display FPS",&settings.showfps,INT, noyes, 2, NULL); break; case MPEG_OPTION_LIMIT_FPS: rb->set_option("Limit FPS",&settings.limitfps,INT, noyes, 2, NULL); break; case MPEG_OPTION_SKIP_FRAMES: rb->set_option("Skip frames",&settings.skipframes,INT, noyes, 2, NULL); break; case MPEG_OPTION_QUIT: default: menu_quit=1; if (result == MENU_ATTACHED_USB) result = MPEG_OPTION_QUIT; break; } } menu_exit(m); rb->lcd_clear_display(); rb->lcd_update(); return (result==MPEG_OPTION_QUIT); } void init_settings(void) { /* Set the default settings */ settings.showfps = 0; /* Do not show FPS */ settings.limitfps = 1; /* Limit FPS */ settings.skipframes = 1; /* Skip frames */ #if defined(TOSHIBA_GIGABEAT_F) || defined(SANSA_E200) settings.displayoptions = 0; /* No visual effects */ #endif configfile_init(rb); if (configfile_load(SETTINGS_FILENAME, config, sizeof(config)/sizeof(*config), SETTINGS_MIN_VERSION ) < 0) { /* If the loading failed, save a new config file (as the disk is already spinning) */ configfile_save(SETTINGS_FILENAME, config, sizeof(config)/sizeof(*config), SETTINGS_VERSION); } /* Keep a copy of the saved version of the settings - so we can check if the settings have changed when we quit */ old_settings = settings; #if defined(TOSHIBA_GIGABEAT_F) || defined(SANSA_E200) rb->lcd_yuv_set_options(settings.displayoptions); #endif } void save_settings(void) { /* Save the user settings if they have changed */ if (rb->memcmp(&settings,&old_settings,sizeof(settings))!=0) { configfile_save(SETTINGS_FILENAME, config, sizeof(config)/sizeof(*config), SETTINGS_VERSION); /* Store the settings in old_settings - to check for future changes */ old_settings = settings; } }