From 89eca9eebcec92efaf7bf5ecada3af4fbf540c9f Mon Sep 17 00:00:00 2001 From: "J. Alexander Treuman" Date: Mon, 4 Jun 2007 22:29:55 +0000 Subject: [PATCH] Don't kill the player process (and effectively the decode process) when completely stopped. Instead, send them SIGSTOP to pause the process until they're needed again. Then send them SIGCONT instead of re-spawning them. git-svn-id: https://svn.musicpd.org/mpd/trunk@6485 09075e82-0dd4-0310-85a5-a0d7c8717e4f --- src/decode.c | 20 ++++++++++++++++---- src/player.c | 29 +++++++++++++++++------------ src/player.h | 3 +-- src/playerData.c | 1 - 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;