aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 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;