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:
parent
e918edc48b
commit
9afce4d359
3 changed files with 54 additions and 13 deletions
|
@ -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)
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue