diff options
author | Warren Dukes <warren.dukes@gmail.com> | 2004-06-02 20:40:30 +0000 |
---|---|---|
committer | Warren Dukes <warren.dukes@gmail.com> | 2004-06-02 20:40:30 +0000 |
commit | 8fca32b12d00db3ebfbbceb8a51880e505b5a780 (patch) | |
tree | b5e09c4fe6583e003d1669d3a0efccd2d9fdc688 | |
parent | c9c6f1f07127b443d6ee9f35240cf8118537ff37 (diff) | |
download | mpd-8fca32b12d00db3ebfbbceb8a51880e505b5a780.tar.gz mpd-8fca32b12d00db3ebfbbceb8a51880e505b5a780.tar.xz mpd-8fca32b12d00db3ebfbbceb8a51880e505b5a780.zip |
fix a segfault when deleteing the last song in the playlist and sync'ing metadata from the player
git-svn-id: https://svn.musicpd.org/mpd/trunk@1306 09075e82-0dd4-0310-85a5-a0d7c8717e4f
-rw-r--r-- | src/playlist.c | 57 |
1 files changed, 30 insertions, 27 deletions
diff --git a/src/playlist.c b/src/playlist.c index 4c0737d1b..75b812338 100644 --- a/src/playlist.c +++ b/src/playlist.c @@ -71,21 +71,21 @@ typedef struct _Playlist { unsigned long version; } Playlist; -Playlist playlist; -int playlist_state = PLAYLIST_STATE_STOP; -int playlist_max_length; -int playlist_stopOnError; -int playlist_errorCount = 0; -int playlist_queueError; -int playlist_noGoToNext = 0; +static Playlist playlist; +static int playlist_state = PLAYLIST_STATE_STOP; +static int playlist_max_length; +static int playlist_stopOnError; +static int playlist_errorCount = 0; +static int playlist_queueError; +static int playlist_noGoToNext = 0; -int playlist_saveAbsolutePaths; +static int playlist_saveAbsolutePaths; -char * playlist_stateFile = NULL; +static char * playlist_stateFile = NULL; -void swapOrder(int a, int b); -int playPlaylistOrderNumber(FILE * fp, int orderNum); -void randomizeOrder(int start, int end); +static void swapOrder(int a, int b); +static int playPlaylistOrderNumber(FILE * fp, int orderNum); +static void randomizeOrder(int start, int end); void incrPlaylistVersion() { static unsigned long max = ((unsigned long)1<<BITS_FOR_VERSION)-1; @@ -93,6 +93,16 @@ void incrPlaylistVersion() { if(playlist.version>=max) playlist.version = 0; } +static void incrPlaylistCurrent() { + if(playlist.current < 0) return; + + if(playlist.current >= playlist.length-1) { + if(playlist.repeat) playlist.current = 0; + else playlist.current = -1; + } + else playlist.current++; +} + void initPlaylist() { char * test; @@ -628,12 +638,15 @@ int deleteFromPlaylist(FILE * fp, int song) { playerStop(stderr); playlist_noGoToNext = 1; } - else if(/*playlist_state!=PLAYLIST_STATE_STOP &&*/ - playlist.current>songOrder) { + + if(playlist.current>=playlist.length) { + incrPlaylistCurrent(); + } + else if(playlist.current>songOrder) { playlist.current--; } - if(/*playlist_state!=PLAYLIST_STATE_STOP && */playlist.queued>songOrder) { + if(playlist.queued>songOrder) { playlist.queued--; } @@ -745,7 +758,7 @@ void syncCurrentPlayerDecodeMetadata() { if(!songPlayer) return; - if(playlist_state!=PLAYLIST_STATE_PLAY); + if(playlist_state!=PLAYLIST_STATE_PLAY) return; song = playlist.songs[playlist.order[playlist.current]]; @@ -775,7 +788,7 @@ int currentSongInPlaylist(FILE * fp) { syncPlaylistWithQueue(0); - if(playlist.current<playlist.length) { + if(playlist.current>= 0 && playlist.current<playlist.length) { return playPlaylistOrderNumber(fp,playlist.current); } else return stopPlaylist(fp);; @@ -783,16 +796,6 @@ int currentSongInPlaylist(FILE * fp) { return 0; } -void incrPlaylistCurrent() { - if(playlist.current >= playlist.length || (!playlist.repeat && - playlist.current == playlist.length-1)) - { - playlist.current = -1; - } - else if(playlist.current == playlist.length-1) playlist.current = 0; - else if(playlist.current >= 0) playlist.current++; -} - int nextSongInPlaylist(FILE * fp) { if(playlist_state!=PLAYLIST_STATE_PLAY) return 0; |