forked from len0rd/rockbox
Flush and reload preloaded tracks if playlist changes
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2259 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
faf31f0b30
commit
62bec9e0d2
3 changed files with 65 additions and 6 deletions
|
|
@ -415,6 +415,8 @@ void randomise_playlist( unsigned int seed )
|
||||||
playlist.indices[candidate] = playlist.indices[count];
|
playlist.indices[candidate] = playlist.indices[count];
|
||||||
playlist.indices[count] = store;
|
playlist.indices[count] = store;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mpeg_flush_and_reload_tracks();
|
||||||
}
|
}
|
||||||
|
|
||||||
static int compare(const void* p1, const void* p2)
|
static int compare(const void* p1, const void* p2)
|
||||||
|
|
@ -451,6 +453,8 @@ void sort_playlist(bool start_current)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mpeg_flush_and_reload_tracks();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -----------------------------------------------------------------
|
/* -----------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,7 @@ extern void bitswap(unsigned short *data, int length);
|
||||||
#define MPEG_NEXT 5
|
#define MPEG_NEXT 5
|
||||||
#define MPEG_PREV 6
|
#define MPEG_PREV 6
|
||||||
#define MPEG_FF_REWIND 7
|
#define MPEG_FF_REWIND 7
|
||||||
|
#define MPEG_FLUSH_RELOAD 8
|
||||||
#define MPEG_NEED_DATA 100
|
#define MPEG_NEED_DATA 100
|
||||||
#define MPEG_SWAP_DATA 101
|
#define MPEG_SWAP_DATA 101
|
||||||
#define MPEG_TRACK_CHANGE 102
|
#define MPEG_TRACK_CHANGE 102
|
||||||
|
|
@ -662,11 +663,15 @@ static int add_track_to_tag_list(char *filename)
|
||||||
/* If next_track is true, opens the next track, if false, opens prev track */
|
/* If next_track is true, opens the next track, if false, opens prev track */
|
||||||
static int new_file(int steps)
|
static int new_file(int steps)
|
||||||
{
|
{
|
||||||
|
int start = num_tracks_in_memory() - 1;
|
||||||
|
|
||||||
|
if (start < 0)
|
||||||
|
start = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
char *trackname;
|
char *trackname;
|
||||||
int index;
|
|
||||||
|
|
||||||
trackname = playlist_peek( steps );
|
trackname = playlist_peek( start + steps );
|
||||||
if ( !trackname )
|
if ( !trackname )
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
|
@ -690,13 +695,11 @@ static int new_file(int steps)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
index = playlist_next(steps);
|
|
||||||
|
|
||||||
/* skip past id3v2 tag (to an even byte) */
|
/* skip past id3v2 tag (to an even byte) */
|
||||||
lseek(mpeg_file,
|
lseek(mpeg_file,
|
||||||
id3tags[new_tag_idx]->id3.id3v2len & ~1,
|
id3tags[new_tag_idx]->id3.id3v2len & ~1,
|
||||||
SEEK_SET);
|
SEEK_SET);
|
||||||
id3tags[new_tag_idx]->id3.index = index;
|
id3tags[new_tag_idx]->id3.index = steps;
|
||||||
id3tags[new_tag_idx]->id3.offset = 0;
|
id3tags[new_tag_idx]->id3.offset = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -717,6 +720,14 @@ static void stop_playing(void)
|
||||||
remove_all_tags();
|
remove_all_tags();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void update_playlist(void)
|
||||||
|
{
|
||||||
|
int index;
|
||||||
|
|
||||||
|
index = playlist_next(id3tags[tag_read_idx]->id3.index);
|
||||||
|
id3tags[tag_read_idx]->id3.index = index;
|
||||||
|
}
|
||||||
|
|
||||||
static void track_change(void)
|
static void track_change(void)
|
||||||
{
|
{
|
||||||
DEBUGF("Track change\n");
|
DEBUGF("Track change\n");
|
||||||
|
|
@ -728,6 +739,8 @@ static void track_change(void)
|
||||||
remove_current_tag();
|
remove_current_tag();
|
||||||
|
|
||||||
current_track_counter++;
|
current_track_counter++;
|
||||||
|
|
||||||
|
update_playlist();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mpeg_thread(void)
|
static void mpeg_thread(void)
|
||||||
|
|
@ -876,7 +889,7 @@ static void mpeg_thread(void)
|
||||||
else {
|
else {
|
||||||
reset_mp3_buffer();
|
reset_mp3_buffer();
|
||||||
remove_all_tags();
|
remove_all_tags();
|
||||||
|
|
||||||
/* Open the next file */
|
/* Open the next file */
|
||||||
if (mpeg_file >= 0)
|
if (mpeg_file >= 0)
|
||||||
close(mpeg_file);
|
close(mpeg_file);
|
||||||
|
|
@ -894,6 +907,7 @@ static void mpeg_thread(void)
|
||||||
play_pending = true;
|
play_pending = true;
|
||||||
|
|
||||||
current_track_counter++;
|
current_track_counter++;
|
||||||
|
update_playlist();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -926,6 +940,7 @@ static void mpeg_thread(void)
|
||||||
play_pending = true;
|
play_pending = true;
|
||||||
|
|
||||||
current_track_counter++;
|
current_track_counter++;
|
||||||
|
update_playlist();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -1069,6 +1084,38 @@ static void mpeg_thread(void)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case MPEG_FLUSH_RELOAD: {
|
||||||
|
int numtracks = num_tracks_in_memory();
|
||||||
|
bool reload_track = false;
|
||||||
|
|
||||||
|
if (numtracks > 1)
|
||||||
|
{
|
||||||
|
/* Reload songs */
|
||||||
|
int next = (tag_read_idx+1) & MAX_ID3_TAGS_MASK;
|
||||||
|
|
||||||
|
/* Reset the buffer */
|
||||||
|
mp3buf_write = mp3buf_swapwrite = id3tags[next]->mempos;
|
||||||
|
|
||||||
|
close(mpeg_file);
|
||||||
|
remove_all_non_current_tags();
|
||||||
|
mpeg_file = -1;
|
||||||
|
reload_track = true;
|
||||||
|
}
|
||||||
|
else if (numtracks == 1 && mpeg_file < 0)
|
||||||
|
{
|
||||||
|
reload_track = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(reload_track && new_file(1) >= 0)
|
||||||
|
{
|
||||||
|
/* Tell ourselves that we want more data */
|
||||||
|
queue_post(&mpeg_queue, MPEG_NEED_DATA, 0);
|
||||||
|
filling = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case MPEG_SWAP_DATA:
|
case MPEG_SWAP_DATA:
|
||||||
free_space_left = mp3buf_write - mp3buf_swapwrite;
|
free_space_left = mp3buf_write - mp3buf_swapwrite;
|
||||||
|
|
||||||
|
|
@ -1442,6 +1489,13 @@ void mpeg_ff_rewind(int change)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mpeg_flush_and_reload_tracks(void)
|
||||||
|
{
|
||||||
|
#ifndef SIMULATOR
|
||||||
|
queue_post(&mpeg_queue, MPEG_FLUSH_RELOAD, NULL);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
bool mpeg_is_playing(void)
|
bool mpeg_is_playing(void)
|
||||||
{
|
{
|
||||||
return is_playing;
|
return is_playing;
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ void mpeg_resume(void);
|
||||||
void mpeg_next(void);
|
void mpeg_next(void);
|
||||||
void mpeg_prev(void);
|
void mpeg_prev(void);
|
||||||
void mpeg_ff_rewind(int change);
|
void mpeg_ff_rewind(int change);
|
||||||
|
void mpeg_flush_and_reload_tracks(void);
|
||||||
bool mpeg_is_playing(void);
|
bool mpeg_is_playing(void);
|
||||||
void mpeg_sound_set(int setting, int value);
|
void mpeg_sound_set(int setting, int value);
|
||||||
int mpeg_sound_min(int setting);
|
int mpeg_sound_min(int setting);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue