aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ. Alexander Treuman <jat@spatialrift.net>2007-06-04 22:29:55 +0000
committerJ. Alexander Treuman <jat@spatialrift.net>2007-06-04 22:29:55 +0000
commit89eca9eebcec92efaf7bf5ecada3af4fbf540c9f (patch)
tree0c6fc19a0e495694f652a91f6dc0cef3da98d2b1
parent4734a2e2b4d17ec4a03a1fdf08ed0f04bf8d431c (diff)
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
-rw-r--r--src/decode.c20
-rw-r--r--src/player.c29
-rw-r--r--src/player.h3
-rw-r--r--src/playerData.c1
-rw-r--r--src/playlist.c4
5 files changed, 36 insertions, 21 deletions
diff --git a/src/decode.c b/src/decode.c
index 8ed5776f..ce94833e 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 e2dc2106..beff9b38 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 ce7eebc9..de44f8e6 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 e4506c1e..30ff6d6d 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 f6ae8ab5..8b2bc1f4 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;