1
0
Fork 0
forked from len0rd/rockbox

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
This commit is contained in:
Peter D'Hoye 2006-10-21 14:47:55 +00:00
parent e918edc48b
commit 9afce4d359
3 changed files with 54 additions and 13 deletions

View file

@ -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)

View file

@ -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 */

View file

@ -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);