From a61617f2b278fe3e0ea14b26980f2a98950fcdc3 Mon Sep 17 00:00:00 2001 From: Björn Stenberg Date: Wed, 26 Jun 2002 21:27:17 +0000 Subject: Added mpeg_next() and mpeg_prev() (Yusef Napora) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@1205 a1c6a512-1295-4272-9138-f99709370657 --- firmware/mpeg.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- firmware/mpeg.h | 2 ++ 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/firmware/mpeg.c b/firmware/mpeg.c index 5f717d60f0..2cc5e2feb8 100644 --- a/firmware/mpeg.c +++ b/firmware/mpeg.c @@ -38,9 +38,12 @@ #define MPEG_STOP 2 #define MPEG_PAUSE 3 #define MPEG_RESUME 4 +#define MPEG_NEXT 5 +#define MPEG_PREV 6 #define MPEG_NEED_DATA 100 extern char* peek_next_track(int type); +extern char* peek_prev_track(int type); #ifndef ARCHOS_RECORDER static unsigned int bass_table[] = @@ -311,11 +314,16 @@ void IMIA1(void) TSR1 &= ~0x01; } -static int new_file(void) +/* If next_track is true, opens the next track, if false, opens prev track */ +static int new_file(bool next_track) { char *trackname; - trackname = peek_next_track(0); + if (next_track) + trackname = peek_next_track(0); + else + trackname = peek_prev_track(0); + if ( !trackname ) return -1; @@ -419,6 +427,56 @@ static void mpeg_thread(void) start_dma(); break; + case MPEG_NEXT: + DEBUGF("MPEG_NEXT\n"); + /* stop the current stream */ + play_pending = false; + playing = false; + stop_dma(); + + reset_mp3_buffer(); + /* Open the next file */ + if (mpeg_file >= 0) + close(mpeg_file); + if (new_file(true) < 0) { + DEBUGF("Finished Playing!\n"); + filling = false; + } else { + /* Make it read more data */ + filling = true; + queue_post(&mpeg_queue, MPEG_NEED_DATA, 0); + + /* Tell the file loading code that we want to start playing + as soon as we have some data */ + play_pending = true; + } + break; + + case MPEG_PREV: + DEBUGF("MPEG_PREV\n"); + /* stop the current stream */ + play_pending = false; + playing = false; + stop_dma(); + + reset_mp3_buffer(); + /* Open the next file */ + if (mpeg_file >= 0) + close(mpeg_file); + if (new_file(false) < 0) { + DEBUGF("Finished Playing!\n"); + filling = false; + } else { + /* Make it read more data */ + filling = true; + queue_post(&mpeg_queue, MPEG_NEED_DATA, 0); + + /* Tell the file loading code that we want to start playing + as soon as we have some data */ + play_pending = true; + } + break; + case MPEG_NEED_DATA: free_space_left = mp3buf_read - mp3buf_write; @@ -486,7 +544,7 @@ static void mpeg_thread(void) boundary */ mp3buf_write = (mp3buf_write + 1) & 0xfffffffe; - if(new_file() < 0) + if(new_file(1) < 0) { /* No more data to play */ DEBUGF("Finished playing\n"); @@ -569,6 +627,16 @@ void mpeg_resume(void) queue_post(&mpeg_queue, MPEG_RESUME, NULL); } +void mpeg_next(void) +{ + queue_post(&mpeg_queue, MPEG_NEXT, NULL); +} + +void mpeg_prev(void) +{ + queue_post(&mpeg_queue, MPEG_PREV, NULL); +} + void mpeg_volume(int percent) { int volume; diff --git a/firmware/mpeg.h b/firmware/mpeg.h index 54b760c151..063ab3f2e9 100644 --- a/firmware/mpeg.h +++ b/firmware/mpeg.h @@ -24,6 +24,8 @@ void mpeg_play(char* trackname); void mpeg_stop(void); void mpeg_pause(void); void mpeg_resume(void); +void mpeg_next(void); +void mpeg_prev(void); void mpeg_volume(int percent); void mpeg_bass(int percent); void mpeg_treble(int percent); -- cgit v1.2.3