forked from len0rd/rockbox
iRiver: more robust folder skip routines + folder navigation on main unit via
either PLAY+LEFT/RIGHT or short then long LEFT/RIGHT git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7810 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
b060d3a520
commit
00928af4dd
5 changed files with 74 additions and 30 deletions
|
|
@ -1659,15 +1659,7 @@ static void initiate_dir_change(int direction)
|
||||||
if(!playlist_next_dir(direction))
|
if(!playlist_next_dir(direction))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Detect if disk is spinning.. */
|
queue_post(&audio_queue, AUDIO_PLAY, 0);
|
||||||
if (filling) {
|
|
||||||
queue_post(&audio_queue, AUDIO_PLAY, 0);
|
|
||||||
} else {
|
|
||||||
new_track = 0;
|
|
||||||
ci.reload_codec = true;
|
|
||||||
if (!pcmbuf_is_crossfade_enabled())
|
|
||||||
pcmbuf_flush_audio();
|
|
||||||
}
|
|
||||||
|
|
||||||
codec_track_changed();
|
codec_track_changed();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,9 @@ void audio_set_track_unbuffer_event(void (*handler)(struct mp3entry *id3,
|
||||||
void audio_invalidate_tracks(void);
|
void audio_invalidate_tracks(void);
|
||||||
void voice_init(void);
|
void voice_init(void);
|
||||||
|
|
||||||
|
extern void audio_next_dir(void);
|
||||||
|
extern void audio_prev_dir(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -130,6 +130,8 @@
|
||||||
|
|
||||||
#define PLAYLIST_DISPLAY_COUNT 10
|
#define PLAYLIST_DISPLAY_COUNT 10
|
||||||
|
|
||||||
|
static bool changing_dir = false;
|
||||||
|
|
||||||
static struct playlist_info current_playlist;
|
static struct playlist_info current_playlist;
|
||||||
static char now_playing[MAX_PATH+1];
|
static char now_playing[MAX_PATH+1];
|
||||||
|
|
||||||
|
|
@ -2072,6 +2074,7 @@ int playlist_next(int steps)
|
||||||
{
|
{
|
||||||
char dir[MAX_PATH+1];
|
char dir[MAX_PATH+1];
|
||||||
|
|
||||||
|
changing_dir = true;
|
||||||
if (steps > 0)
|
if (steps > 0)
|
||||||
{
|
{
|
||||||
if (!get_next_directory(dir))
|
if (!get_next_directory(dir))
|
||||||
|
|
@ -2089,19 +2092,20 @@ int playlist_next(int steps)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!get_previous_directory(dir))
|
if (!get_previous_directory(dir))
|
||||||
{
|
|
||||||
/* start playing previous directory */
|
|
||||||
if (playlist_create(dir, NULL) != -1)
|
|
||||||
{
|
{
|
||||||
ft_build_playlist(tree_get_context(), 0);
|
/* start playing previous directory */
|
||||||
if (global_settings.playlist_shuffle)
|
if (playlist_create(dir, NULL) != -1)
|
||||||
playlist_shuffle(current_tick, -1);
|
{
|
||||||
playlist_start(current_playlist.amount-1,0);
|
ft_build_playlist(tree_get_context(), 0);
|
||||||
index = current_playlist.amount-1;
|
if (global_settings.playlist_shuffle)
|
||||||
|
playlist_shuffle(current_tick, -1);
|
||||||
|
playlist_start(current_playlist.amount-1,0);
|
||||||
|
index = current_playlist.amount-1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
changing_dir = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return index;
|
return index;
|
||||||
|
|
@ -2154,9 +2158,22 @@ int playlist_next(int steps)
|
||||||
bool playlist_next_dir(int direction)
|
bool playlist_next_dir(int direction)
|
||||||
{
|
{
|
||||||
char dir[MAX_PATH+1];
|
char dir[MAX_PATH+1];
|
||||||
|
bool result;
|
||||||
|
int res;
|
||||||
|
|
||||||
if (((direction > 0) && !get_next_directory(dir)) ||
|
/* not to mess up real playlists */
|
||||||
((direction < 0) && !get_previous_directory(dir)))
|
if(!current_playlist.in_ram)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(changing_dir)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
changing_dir = true;
|
||||||
|
if(direction > 0)
|
||||||
|
res = get_next_directory(dir);
|
||||||
|
else
|
||||||
|
res = get_previous_directory(dir);
|
||||||
|
if (!res)
|
||||||
{
|
{
|
||||||
if (playlist_create(dir, NULL) != -1)
|
if (playlist_create(dir, NULL) != -1)
|
||||||
{
|
{
|
||||||
|
|
@ -2164,13 +2181,17 @@ bool playlist_next_dir(int direction)
|
||||||
if (global_settings.playlist_shuffle)
|
if (global_settings.playlist_shuffle)
|
||||||
playlist_shuffle(current_tick, -1);
|
playlist_shuffle(current_tick, -1);
|
||||||
playlist_start(0,0);
|
playlist_start(0,0);
|
||||||
return true;
|
result = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return false;
|
result = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return false;
|
result = false;
|
||||||
|
|
||||||
|
changing_dir = false;
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get resume info for current playing song. If return value is -1 then
|
/* Get resume info for current playing song. If return value is -1 then
|
||||||
|
|
|
||||||
36
apps/wps.c
36
apps/wps.c
|
|
@ -52,6 +52,7 @@
|
||||||
#include "sound.h"
|
#include "sound.h"
|
||||||
#include "onplay.h"
|
#include "onplay.h"
|
||||||
#include "abrepeat.h"
|
#include "abrepeat.h"
|
||||||
|
#include "playback.h"
|
||||||
|
|
||||||
#define FF_REWIND_MAX_PERCENT 3 /* cap ff/rewind step size at max % of file */
|
#define FF_REWIND_MAX_PERCENT 3 /* cap ff/rewind step size at max % of file */
|
||||||
/* 3% of 30min file == 54s step size */
|
/* 3% of 30min file == 54s step size */
|
||||||
|
|
@ -64,9 +65,6 @@ static struct mp3entry* id3 = NULL;
|
||||||
static struct mp3entry* nid3 = NULL;
|
static struct mp3entry* nid3 = NULL;
|
||||||
static char current_track_path[MAX_PATH+1];
|
static char current_track_path[MAX_PATH+1];
|
||||||
|
|
||||||
void audio_next_dir(void);
|
|
||||||
void audio_prev_dir(void);
|
|
||||||
|
|
||||||
/* set volume
|
/* set volume
|
||||||
return true if screen restore is needed
|
return true if screen restore is needed
|
||||||
return false otherwise
|
return false otherwise
|
||||||
|
|
@ -337,6 +335,8 @@ long wps_show(void)
|
||||||
long restoretimer = 0; /* timer to delay screen redraw temporarily */
|
long restoretimer = 0; /* timer to delay screen redraw temporarily */
|
||||||
bool exit = false;
|
bool exit = false;
|
||||||
bool update_track = false;
|
bool update_track = false;
|
||||||
|
unsigned long right_lastclick = 0;
|
||||||
|
unsigned long left_lastclick = 0;
|
||||||
|
|
||||||
id3 = nid3 = NULL;
|
id3 = nid3 = NULL;
|
||||||
current_track_path[0] = '\0';
|
current_track_path[0] = '\0';
|
||||||
|
|
@ -555,11 +555,29 @@ long wps_show(void)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* fast forward / rewind */
|
/* fast forward / rewind */
|
||||||
case WPS_FFWD:
|
|
||||||
case WPS_REW:
|
|
||||||
#ifdef WPS_RC_FFWD
|
#ifdef WPS_RC_FFWD
|
||||||
case WPS_RC_FFWD:
|
case WPS_RC_FFWD:
|
||||||
|
#endif
|
||||||
|
case WPS_FFWD:
|
||||||
|
#ifdef WPS_NEXT_DIR
|
||||||
|
if (current_tick - right_lastclick < HZ)
|
||||||
|
{
|
||||||
|
audio_next_dir();
|
||||||
|
right_lastclick = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef WPS_RC_REW
|
||||||
case WPS_RC_REW:
|
case WPS_RC_REW:
|
||||||
|
#endif
|
||||||
|
case WPS_REW:
|
||||||
|
#ifdef WPS_PREV_DIR
|
||||||
|
if (current_tick - left_lastclick < HZ)
|
||||||
|
{
|
||||||
|
audio_prev_dir();
|
||||||
|
left_lastclick = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
ffwd_rew(button);
|
ffwd_rew(button);
|
||||||
break;
|
break;
|
||||||
|
|
@ -577,6 +595,7 @@ long wps_show(void)
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
left_lastclick = current_tick;
|
||||||
|
|
||||||
#ifdef AB_REPEAT_ENABLE
|
#ifdef AB_REPEAT_ENABLE
|
||||||
/* if we're in A/B repeat mode and the current position
|
/* if we're in A/B repeat mode and the current position
|
||||||
|
|
@ -604,13 +623,19 @@ long wps_show(void)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifdef WPS_NEXT_DIR
|
||||||
#ifdef WPS_RC_NEXT_DIR
|
#ifdef WPS_RC_NEXT_DIR
|
||||||
case WPS_RC_NEXT_DIR:
|
case WPS_RC_NEXT_DIR:
|
||||||
|
#endif
|
||||||
|
case WPS_NEXT_DIR:
|
||||||
audio_next_dir();
|
audio_next_dir();
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef WPS_PREV_DIR
|
||||||
#ifdef WPS_RC_PREV_DIR
|
#ifdef WPS_RC_PREV_DIR
|
||||||
case WPS_RC_PREV_DIR:
|
case WPS_RC_PREV_DIR:
|
||||||
|
#endif
|
||||||
|
case WPS_PREV_DIR:
|
||||||
audio_prev_dir();
|
audio_prev_dir();
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -628,6 +653,7 @@ long wps_show(void)
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
right_lastclick = current_tick;
|
||||||
|
|
||||||
#ifdef AB_REPEAT_ENABLE
|
#ifdef AB_REPEAT_ENABLE
|
||||||
/* if we're in A/B repeat mode and the current position is
|
/* if we're in A/B repeat mode and the current position is
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,8 @@
|
||||||
#define WPS_ID3 (BUTTON_MODE | BUTTON_ON)
|
#define WPS_ID3 (BUTTON_MODE | BUTTON_ON)
|
||||||
#define WPS_CONTEXT (BUTTON_SELECT | BUTTON_REPEAT)
|
#define WPS_CONTEXT (BUTTON_SELECT | BUTTON_REPEAT)
|
||||||
#define WPS_QUICK (BUTTON_MODE | BUTTON_REPEAT)
|
#define WPS_QUICK (BUTTON_MODE | BUTTON_REPEAT)
|
||||||
|
#define WPS_NEXT_DIR (BUTTON_RIGHT | BUTTON_ON)
|
||||||
|
#define WPS_PREV_DIR (BUTTON_LEFT | BUTTON_ON)
|
||||||
|
|
||||||
#define WPS_RC_NEXT_DIR (BUTTON_RC_BITRATE | BUTTON_REL)
|
#define WPS_RC_NEXT_DIR (BUTTON_RC_BITRATE | BUTTON_REL)
|
||||||
#define WPS_RC_PREV_DIR (BUTTON_RC_SOURCE | BUTTON_REL)
|
#define WPS_RC_PREV_DIR (BUTTON_RC_SOURCE | BUTTON_REL)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue