From 56274fd016faf5ddd9fb0e1d8ec470e4d2070721 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 6 Sep 2007 01:07:49 +0000 Subject: Once again get rid of busy waiting and use SIGSTOP for pause The problems I had were related to the OSS driver and USB device I was using. The problems existed even with the old busy-waiting scheme enabled. OSS - Bithead USB => bad ALSA - Bithead USB => OK OSS - Onboard i8x0 => OK ALSA - Onboard i8x0 => OK bad - slow shutdown, pauses, dropped audio after pause/resume git-svn-id: https://svn.musicpd.org/mpd/trunk@6861 09075e82-0dd4-0310-85a5-a0d7c8717e4f --- src/decode.c | 14 ++++++++++---- src/player.c | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/decode.c b/src/decode.c index c66d67fe0..bf3e1cb25 100644 --- a/src/decode.c +++ b/src/decode.c @@ -71,6 +71,7 @@ static void stopDecode(DecoderControl * dc) { if (decode_pid > 0 && (dc->start || dc->state != DECODE_STATE_STOP)) { dc->stop = 1; + kill(decode_pid, SIGCONT); while (decode_pid > 0 && dc->stop) my_usleep(10000); } @@ -126,7 +127,8 @@ static int calculateCrossFadeChunks(PlayerControl * pc, AudioFormat * af) ERROR("problems opening audio device while playing \"%s\"\n", pc->utf8url); \ quitDecode(pc,dc); \ return; \ - } \ + } else if (decode_pid > 0) { \ + kill(decode_pid, SIGCONT); }\ if (pause) { \ dropBufferedAudio(); \ closeAudioDevice(); \ @@ -238,6 +240,8 @@ static int decodeSeek(PlayerControl * pc, DecoderControl * dc, pc->state = PLAYER_STATE_PAUSE; \ } else { \ if (openAudioDevice(NULL) >= 0) { \ + if (decode_pid > 0) \ + kill(decode_pid, SIGCONT); \ pc->state = PLAYER_STATE_PLAY; \ } else { \ pathcpy_trunc(pc->erroredUrl, pc->utf8url); \ @@ -579,9 +583,11 @@ static void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * race conditions and weirdness */ end = cb->end; - if (pause) - my_usleep(10000); - else if (cb->begin != end && cb->begin != next) { + if (pause) { + if (decode_pid) + kill(decode_pid, SIGSTOP); + kill(getpid(), SIGSTOP); + } else if (cb->begin != end && cb->begin != next) { if (doCrossFade == 1 && next >= 0 && ((next > cb->begin && (fadePosition = next - cb->begin) diff --git a/src/player.c b/src/player.c index c53a6ae1d..d73b0a0e1 100644 --- a/src/player.c +++ b/src/player.c @@ -231,6 +231,8 @@ int playerPlay(int fd, Song * song) } resetPlayerMetadata(); + if (player_pid > 0 && pc->state == PLAYER_STATE_PAUSE) + kill(player_pid, SIGCONT); while (player_pid > 0 && pc->play) my_usleep(1000); @@ -243,6 +245,8 @@ int playerStop(int fd) if (player_pid > 0 && pc->state != PLAYER_STATE_STOP) { pc->stop = 1; + if (pc->state == PLAYER_STATE_PAUSE) + kill(player_pid, SIGCONT); while (player_pid > 0 && pc->stop) my_usleep(1000); } @@ -270,6 +274,8 @@ int playerPause(int fd) if (player_pid > 0 && pc->state != PLAYER_STATE_STOP) { pc->pause = 1; + if (player_pid > 0 && pc->state == PLAYER_STATE_PAUSE) + kill(player_pid, SIGCONT); while (player_pid > 0 && pc->pause) my_usleep(1000); } @@ -377,6 +383,8 @@ void playerCloseAudio(void) if (playerStop(STDERR_FILENO) < 0) return; pc->closeAudio = 1; + if (pc->state == PLAYER_STATE_PAUSE) + kill(player_pid, SIGCONT); while (player_pid > 0 && pc->closeAudio) my_usleep(1000); } @@ -422,6 +430,8 @@ void playerQueueLock(void) PlayerControl *pc = &(getPlayerData()->playerControl); if (player_pid > 0 && pc->queueLockState == PLAYER_QUEUE_UNLOCKED) { + if (pc->state == PLAYER_STATE_PAUSE) + kill(player_pid, SIGCONT); pc->lockQueue = 1; while (player_pid > 0 && pc->lockQueue) my_usleep(1000); @@ -433,6 +443,8 @@ void playerQueueUnlock(void) PlayerControl *pc = &(getPlayerData()->playerControl); if (player_pid > 0 && pc->queueLockState == PLAYER_QUEUE_LOCKED) { + if (pc->state == PLAYER_STATE_PAUSE) + kill(player_pid, SIGCONT); pc->unlockQueue = 1; while (player_pid > 0 && pc->unlockQueue) my_usleep(1000); @@ -464,6 +476,8 @@ int playerSeek(int fd, Song * song, float time) resetPlayerMetadata(); pc->seekWhere = time; pc->seek = 1; + if (player_pid > 0 && pc->state == PLAYER_STATE_PAUSE) + kill(player_pid, SIGCONT); while (player_pid > 0 && pc->seek) my_usleep(1000); } -- cgit v1.2.3