1
0
Fork 0
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:
Hardeep Sidhu 2002-09-10 08:50:40 +00:00
parent faf31f0b30
commit 62bec9e0d2
3 changed files with 65 additions and 6 deletions

View file

@ -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();
} }
/* ----------------------------------------------------------------- /* -----------------------------------------------------------------

View file

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

View file

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