Commit 89eca9ee authored by J. Alexander Treuman's avatar J. Alexander Treuman

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
parent 4734a2e2
......@@ -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);
}
......@@ -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)
......
......@@ -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);
......
......@@ -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;
......
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment