diff options
-rw-r--r-- | src/decode.c | 20 | ||||
-rw-r--r-- | src/player.c | 29 | ||||
-rw-r--r-- | src/player.h | 3 | ||||
-rw-r--r-- | src/playerData.c | 1 | ||||
-rw-r--r-- | src/playlist.c | 4 |
5 files changed, 36 insertions, 21 deletions
diff --git a/src/decode.c b/src/decode.c index 8ed5776f9..ce94833e8 100644 --- a/src/decode.c +++ b/src/decode.c @@ -75,6 +75,8 @@ static void stopDecode(DecoderControl * dc) static void quitDecode(PlayerControl * pc, DecoderControl * dc) { + int pid; + stopDecode(dc); pc->state = PLAYER_STATE_STOP; dc->seek = 0; @@ -82,6 +84,10 @@ static void quitDecode(PlayerControl * pc, DecoderControl * dc) pc->stop = 0; pc->pause = 0; kill(getppid(), SIGUSR1); + + pid = decode_pid; + if (pid > 0) + kill(pid, SIGSTOP); } static int calculateCrossFadeChunks(PlayerControl * pc, AudioFormat * af) @@ -396,6 +402,14 @@ static void decodeStart(PlayerControl * pc, OutputBuffer * cb, static int decoderInit(PlayerControl * pc, OutputBuffer * cb, DecoderControl * dc) { + int pid; + + pid = decode_pid; + if (pid > 0) { + kill(pid, SIGCONT); + return 0; + } + blockSignals(); getPlayerData()->playerControl.decode_pid = 0; decode_pid = fork(); @@ -691,10 +705,8 @@ void decode(void) dc->stop = 0; dc->start = 1; - if (decode_pid <= 0) { - if (decoderInit(pc, cb, dc) < 0) - return; - } + if (decoderInit(pc, cb, dc) < 0) + return; decodeParent(pc, dc, cb); } diff --git a/src/player.c b/src/player.c index e2dc21064..beff9b389 100644 --- a/src/player.c +++ b/src/player.c @@ -110,6 +110,14 @@ void player_sigChldHandler(int pid, int status) int playerInit(void) { + int pid; + + pid = player_pid; + if (pid > 0) { + kill(pid, SIGCONT); + return 0; + } + blockSignals(); player_pid = fork(); if (player_pid==0) @@ -155,9 +163,6 @@ int playerInit(void) } else if (pc->cycleLogFiles) { cycle_log_files(); pc->cycleLogFiles = 0; - } else if (pc->quit) { - pc->quit = 0; - break; } else my_usleep(10000); } @@ -177,20 +182,18 @@ int playerInit(void) return 0; } -int playerQuit(int fd) +int playerWait(int fd) { - PlayerControl *pc = &(getPlayerData()->playerControl); + int pid; if (playerStop(fd) < 0) return -1; playerCloseAudio(); - if (player_pid > 0) { - pc->quit = 1; - while (player_pid > 0 && pc->quit) - my_usleep(1000); - } + pid = player_pid; + if (pid > 0) + kill(pid, SIGSTOP); return 0; } @@ -212,7 +215,7 @@ int playerPlay(int fd, Song * song) pathcpy_trunc(pc->utf8url, getSongUrl(song)); pc->play = 1; - if (player_pid == 0 && playerInit() < 0) { + if (playerInit() < 0) { pc->play = 0; return -1; } @@ -245,8 +248,10 @@ void playerKill(void) int pid; pid = player_pid; - if (pid > 0) + if (pid > 0) { + kill(pid, SIGCONT); kill(pid, SIGTERM); + } } int playerPause(int fd) diff --git a/src/player.h b/src/player.h index ce7eebc9b..de44f8e64 100644 --- a/src/player.h +++ b/src/player.h @@ -57,7 +57,6 @@ #define PLAYER_METADATA_STATE_WRITE 2 typedef struct _PlayerControl { - volatile mpd_sint8 quit; volatile mpd_sint8 stop; volatile mpd_sint8 play; volatile mpd_sint8 pause; @@ -122,7 +121,7 @@ int getPlayerError(void); int playerInit(void); -int playerQuit(int fd); +int playerWait(int fd); int queueSong(Song * song); diff --git a/src/playerData.c b/src/playerData.c index e4506c1e7..30ff6d6d6 100644 --- a/src/playerData.c +++ b/src/playerData.c @@ -118,7 +118,6 @@ void initPlayerData(void) buffered_chunks * sizeof(mpd_sint8)); buffer->acceptMetadata = 0; - playerData_pd->playerControl.quit = 0; playerData_pd->playerControl.stop = 0; playerData_pd->playerControl.pause = 0; playerData_pd->playerControl.play = 0; diff --git a/src/playlist.c b/src/playlist.c index f6ae8ab51..8b2bc1f42 100644 --- a/src/playlist.c +++ b/src/playlist.c @@ -788,7 +788,7 @@ int deleteFromPlaylist(int fd, int song) && playlist.current == songOrder) { /*if(playlist.current>=playlist.length) return playerStop(fd); else return playPlaylistOrderNumber(fd,playlist.current); */ - playerQuit(STDERR_FILENO); + playerWait(STDERR_FILENO); playlist_noGoToNext = 1; } @@ -829,7 +829,7 @@ void deleteASongFromPlaylist(Song * song) int stopPlaylist(int fd) { DEBUG("playlist: stop\n"); - if (playerQuit(fd) < 0) + if (playerWait(fd) < 0) return -1; playlist.queued = -1; playlist_state = PLAYLIST_STATE_STOP; |