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
This commit is contained in:
14
src/player.c
14
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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user