From 9afce4d35997ce0883474d3f978aa570b7233f03 Mon Sep 17 00:00:00 2001 From: Peter D'Hoye Date: Sat, 21 Oct 2006 14:47:55 +0000 Subject: Disk spindown control during jpeg slideshow: for times below 10s, keep the disk spinning, for longer times spin down the disk immediately after loading the picture. Inspired by #FS5653 (Paul Jam / Gwen Roelants) and Jens Arnold git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11299 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugin.c | 1 + apps/plugin.h | 3 ++- apps/plugins/jpeg.c | 63 +++++++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 54 insertions(+), 13 deletions(-) (limited to 'apps') diff --git a/apps/plugin.c b/apps/plugin.c index 38fdaa8f35..bc8419d313 100644 --- a/apps/plugin.c +++ b/apps/plugin.c @@ -472,6 +472,7 @@ static const struct plugin_api rockbox_api = { wheel_status, wheel_send_events, #endif + ata_spindown, }; int plugin_load(const char* plugin, void* parameter) diff --git a/apps/plugin.h b/apps/plugin.h index 461c0d816a..609f4cc65b 100644 --- a/apps/plugin.h +++ b/apps/plugin.h @@ -105,7 +105,7 @@ #define PLUGIN_MAGIC 0x526F634B /* RocK */ /* increase this every time the api struct changes */ -#define PLUGIN_API_VERSION 32 +#define PLUGIN_API_VERSION 33 /* update this to latest version if a change to the api struct breaks backwards compatibility (and please take the opportunity to sort in any @@ -552,6 +552,7 @@ struct plugin_api { int (*wheel_status)(void); void (*wheel_send_events)(bool send); #endif + void (*ata_spindown)(int seconds); }; /* plugin header */ diff --git a/apps/plugins/jpeg.c b/apps/plugins/jpeg.c index ce2f55cb24..716599aec1 100644 --- a/apps/plugins/jpeg.c +++ b/apps/plugins/jpeg.c @@ -165,7 +165,11 @@ static struct plugin_api* rb; #define INLINE static inline #define ENDIAN_SWAP16(n) n /* only for poor little endian machines */ -static int slideshow_enabled = false; +static int slideshow_enabled = false; /* run slideshow */ +static int running_slideshow = false; /* loading image because of slideshw */ +#ifndef SIMULATOR +static int immediate_ata_off = false; /* power down disk after loading */ +#endif static int button_timeout = HZ*5; /**************** begin JPEG code ********************/ @@ -174,7 +178,7 @@ INLINE unsigned range_limit(int value) { #if CONFIG_CPU == SH7034 unsigned tmp; - asm ( /* Note: Uses knowledge that only the low byte of the result is used */ + asm ( /* Note: Uses knowledge that only low byte of result is used */ "mov #-128,%[t] \n" "sub %[t],%[v] \n" /* value -= -128; equals value += 128; */ "extu.b %[v],%[t] \n" @@ -2092,7 +2096,7 @@ int show_menu(void) /* return 1 to quit */ static const struct menu_item items[] = { { "Quit", NULL }, { "Toggle Slideshow Mode", NULL }, - { "Change Slideshow Timeout", NULL }, + { "Change Slideshow Time", NULL }, { "Show Playback Menu", NULL }, { "Return", NULL }, }; @@ -2135,7 +2139,7 @@ int show_menu(void) /* return 1 to quit */ case 20: result = 11; break; default: result = (button_timeout/HZ)-1; break; } - rb->set_option("Slideshow Timeout", &result, INT, + rb->set_option("Slideshow Time", &result, INT, timeout , 12, NULL); switch (result) { @@ -2151,6 +2155,27 @@ int show_menu(void) /* return 1 to quit */ case 4: break; } + +#ifndef SIMULATOR + /* change ata spindown time based on slideshow time setting */ + immediate_ata_off = false; + rb->ata_spindown(rb->global_settings->disk_spindown); + + if (slideshow_enabled) + { + if(button_timeout/HZ < 10) + { + /* slideshow times < 10s keep disk spinning */ + rb->ata_spindown(0); + } + else if (!rb->mp3_is_playing()) + { + /* slideshow times > 10s and not playing: ata_off after load */ + immediate_ata_off = true; + } + } +#endif + rb->lcd_clear_display(); rb->menu_exit(m); return 0; @@ -2169,6 +2194,8 @@ int scroll_bmp(struct t_disp* pdisp) button = rb->button_get_w_tmo(button_timeout); else button = rb->button_get(true); + running_slideshow = false; + switch(button) { case JPEG_LEFT: @@ -2271,6 +2298,7 @@ int scroll_bmp(struct t_disp* pdisp) case BUTTON_NONE: if (!slideshow_enabled) break; + running_slideshow = true; if (entries > 0) return change_filename(DIR_NEXT); break; @@ -2340,7 +2368,7 @@ int scroll_bmp(struct t_disp* pdisp) void cb_progess(int current, int total) { rb->yield(); /* be nice to the other threads */ - if(!slideshow_enabled) + if(!running_slideshow) { rb->scrollbar(0, LCD_HEIGHT-8, LCD_WIDTH, 8, total, 0, current, HORIZONTAL); @@ -2461,7 +2489,7 @@ struct t_disp* get_image(struct jpeg* p_jpg, int ds) buf += size; buf_size -= size; - if(!slideshow_enabled) + if(!running_slideshow) { rb->snprintf(print, sizeof(print), "decoding %d*%d", p_jpg->x_size/ds, p_jpg->y_size/ds); @@ -2491,7 +2519,7 @@ struct t_disp* get_image(struct jpeg* p_jpg, int ds) } time = *rb->current_tick - time; - if(!slideshow_enabled) + if(!running_slideshow) { rb->snprintf(print, sizeof(print), " %d.%02d sec ", time/HZ, time%HZ); rb->lcd_getstringsize(print, &w, &h); /* centered in progress bar */ @@ -2630,7 +2658,7 @@ int load_and_show(char* filename) } } - if(!slideshow_enabled) + if(!running_slideshow) { #ifdef HAVE_LCD_COLOR rb->lcd_set_foreground(LCD_WHITE); @@ -2650,13 +2678,19 @@ int load_and_show(char* filename) rb->read(fd, buf_jpeg, filesize); rb->close(fd); - if(!slideshow_enabled) + if(!running_slideshow) { rb->snprintf(print, sizeof(print), "decoding markers"); rb->lcd_puts(0, 2, print); rb->lcd_update(); } - +#ifndef SIMULATOR + else if(immediate_ata_off) + { + /* running slideshow and time is long enough: power down disk */ + rb->ata_sleep(); + } +#endif rb->memset(&jpg, 0, sizeof(jpg)); /* clear info struct */ /* process markers, unstuffing */ @@ -2673,7 +2707,7 @@ int load_and_show(char* filename) default_huff_tbl(&jpg); /* use default */ build_lut(&jpg); /* derive Huffman and other lookup-tables */ - if(!slideshow_enabled) + if(!running_slideshow) { rb->snprintf(print, sizeof(print), "image %dx%d", jpg.x_size, jpg.y_size); rb->lcd_puts(0, 2, print); @@ -2700,7 +2734,7 @@ int load_and_show(char* filename) set_view(p_disp, cx, cy); - if(!slideshow_enabled) + if(!running_slideshow) { rb->snprintf(print, sizeof(print), "showing %dx%d", p_disp->width, p_disp->height); @@ -2840,6 +2874,11 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) }while (condition != PLUGIN_OK && condition != PLUGIN_USB_CONNECTED && condition != PLUGIN_ERROR); +#ifndef SIMULATOR + /* set back ata spindown time in case we changed it */ + rb->ata_spindown(rb->global_settings->disk_spindown); +#endif + #ifdef CONFIG_BACKLIGHT /* reset backlight settings */ rb->backlight_set_timeout(rb->global_settings->backlight_timeout); -- cgit v1.2.3