Since pc->current_song denotes the song which the decoder should use
next, we should move it to DecoderControl.  This removes one internal
PlayerControl struct access from the decoder code.

Also add pc.next_song, which is manipulated by the playlist code, and
gets copied to dc.next_song as soon as the decoder is started.
---

 src/decode.c |   25 ++++++++++++++-----------
 src/decode.h |    1 +
 src/player.c |    5 ++---
 src/player.h |    2 +-
 4 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/src/decode.c b/src/decode.c
index 6b57239..00ab157 100644
--- a/src/decode.c
+++ b/src/decode.c
@@ -105,7 +105,7 @@ static int waitOnDecode(int *decodeWaitedOn)
                player_wakeup_decoder();
 
        if (dc.error != DECODE_ERROR_NOERROR) {
-               pc.errored_song = pc.current_song;
+               pc.errored_song = dc.next_song;
                pc.error = PLAYER_ERROR_FILE;
                quitDecode();
                return -1;
@@ -127,10 +127,11 @@ static int decodeSeek(int *decodeWaitedOn, int *next)
 
        if (dc.state == DECODE_STATE_STOP ||
            dc.error != DECODE_ERROR_NOERROR ||
-           dc.current_song != pc.current_song) {
+           dc.current_song != pc.next_song) {
                stopDecode();
                *next = -1;
                ob_clear();
+               dc.next_song = pc.next_song;
                dc.error = DECODE_ERROR_NOERROR;
                dc.start = 1;
                waitOnDecode(decodeWaitedOn);
@@ -178,11 +179,11 @@ static void processDecodeInput(int *pause_r, unsigned int 
*bbp_r,
                                pc.state = PLAYER_STATE_PLAY;
                        } else {
                                char tmp[MPD_PATH_MAX];
-                               pc.errored_song = pc.current_song;
+                               pc.errored_song = dc.next_song;
                                pc.error = PLAYER_ERROR_AUDIO;
                                ERROR("problems opening audio device "
                                      "while playing \"%s\"\n",
-                                     get_song_url(tmp, pc.current_song));
+                                     get_song_url(tmp, dc.next_song));
                                *pause_r = -1;
                        }
                }
@@ -213,7 +214,7 @@ static void decodeStart(void)
        char path_max_fs[MPD_PATH_MAX];
        char path_max_utf8[MPD_PATH_MAX];
 
-       if (!get_song_url(path_max_utf8, pc.current_song)) {
+       if (!get_song_url(path_max_utf8, dc.next_song)) {
                dc.error = DECODE_ERROR_FILE;
                goto stop_no_close;
        }
@@ -223,7 +224,7 @@ static void decodeStart(void)
        } else
                pathcpy_trunc(path_max_fs, path_max_utf8);
 
-       dc.current_song = pc.current_song; /* NEED LOCK */
+       dc.current_song = dc.next_song; /* NEED LOCK */
        if (openInputStream(&inStream, path_max_fs) < 0) {
                dc.error = DECODE_ERROR_FILE;
                goto stop_no_close;
@@ -306,7 +307,7 @@ static void decodeStart(void)
        }
 
        if (ret < 0 || ret == DECODE_ERROR_UNKTYPE) {
-               pc.errored_song = pc.current_song;
+               pc.errored_song = dc.next_song;
                if (ret != DECODE_ERROR_UNKTYPE)
                        dc.error = DECODE_ERROR_FILE;
                else
@@ -439,11 +440,11 @@ static void decodeParent(void)
                                decodeWaitedOn = 0;
                                if(openAudioDevice(&(ob.audioFormat))<0) {
                                        char tmp[MPD_PATH_MAX];
-                                       pc.errored_song = pc.current_song;
+                                       pc.errored_song = dc.next_song;
                                        pc.error = PLAYER_ERROR_AUDIO;
                                        ERROR("problems opening audio device "
                                              "while playing \"%s\"\n",
-                                             get_song_url(tmp, 
pc.current_song));
+                                             get_song_url(tmp, dc.next_song));
                                        break;
                                } else {
                                        player_wakeup_decoder();
@@ -460,7 +461,7 @@ static void decodeParent(void)
                        }
                        else if(dc.state!=DECODE_STATE_START) {
                                /* the decoder failed */
-                               pc.errored_song = pc.current_song;
+                               pc.errored_song = dc.next_song;
                                pc.error = PLAYER_ERROR_FILE;
                                break;
                        }
@@ -478,6 +479,8 @@ static void decodeParent(void)
                        /* the decoder has finished the current song;
                           make it decode the next song */
                        next = ob.end;
+                       dc.next_song = pc.next_song;
+                       dc.error = DECODE_ERROR_NOERROR;
                        dc.start = 1;
                        pc.queueState = PLAYER_QUEUE_DECODE;
                        wakeup_main_task();
@@ -596,7 +599,7 @@ static void decodeParent(void)
 void decode(void)
 {
        ob_clear();
-
+       dc.next_song = pc.next_song;
        dc.error = DECODE_ERROR_NOERROR;
        dc.seek = 0;
        dc.stop = 0;
diff --git a/src/decode.h b/src/decode.h
index 8ee2a09..990f5e5 100644
--- a/src/decode.h
+++ b/src/decode.h
@@ -50,6 +50,7 @@ typedef struct _DecoderControl {
        volatile double seekWhere;
        AudioFormat audioFormat;
        Song *current_song;
+       Song *volatile next_song;
        volatile float totalTime;
 } DecoderControl;
 
diff --git a/src/player.c b/src/player.c
index bdce70b..61b380b 100644
--- a/src/player.c
+++ b/src/player.c
@@ -18,7 +18,6 @@
 
 #include "player.h"
 #include "path.h"
-#include "decode.h"
 #include "command.h"
 #include "log.h"
 #include "playerData.h"
@@ -101,7 +100,7 @@ int playerWait(int fd)
 static void set_current_song(Song *song)
 {
        pc.fileTime = song->tag ? song->tag->time : 0;
-       pc.current_song = song;
+       pc.next_song = song;
 }
 
 int playerPlay(int fd, Song * song)
@@ -279,7 +278,7 @@ int playerSeek(int fd, Song * song, float seek_time)
                return -1;
        }
 
-       if (pc.current_song != song)
+       if (pc.next_song != song)
                set_current_song(song);
 
        if (pc.error == PLAYER_ERROR_NOERROR) {
diff --git a/src/player.h b/src/player.h
index 031aef5..db8f44d 100644
--- a/src/player.h
+++ b/src/player.h
@@ -63,7 +63,7 @@ typedef struct _PlayerControl {
        volatile float totalTime;
        volatile float elapsedTime;
        volatile float fileTime;
-       Song *current_song;
+       Song *volatile next_song;
        Song *errored_song;
        volatile mpd_sint8 queueState;
        volatile mpd_sint8 queueLockState;


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Musicpd-dev-team mailing list
Musicpd-dev-team@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/musicpd-dev-team

Reply via email to