summaryrefslogtreecommitdiff
path: root/src/ui_act.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui_act.c')
-rw-r--r--src/ui_act.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/ui_act.c b/src/ui_act.c
index 0c9ed1b..2cc3197 100644
--- a/src/ui_act.c
+++ b/src/ui_act.c
@@ -23,10 +23,14 @@ THE SOFTWARE.
/* functions responding to user's keystrokes */
+#ifndef __FreeBSD__
+#define _POSIX_C_SOURCE 200112L /* pthread_kill() */
+#endif
+
#include <string.h>
#include <unistd.h>
-#include <pthread.h>
#include <assert.h>
+#include <signal.h>
#include "ui.h"
#include "ui_readline.h"
@@ -49,10 +53,9 @@ THE SOFTWARE.
static inline void BarUiDoSkipSong (struct audioPlayer *player) {
assert (player != NULL);
- player->doQuit = 1;
- /* unlocking an unlocked mutex is forbidden by some implementations */
- pthread_mutex_trylock (&player->pauseMutex);
- pthread_mutex_unlock (&player->pauseMutex);
+ if (player->mode != PLAYER_FINISHED_PLAYBACK && player->mode != PLAYER_FREED) {
+ pthread_cancel (player->thread);
+ }
}
/* transform station if necessary to allow changes like rename, rate, ...
@@ -344,9 +347,12 @@ BarUiActCallback(BarUiActMoveSong) {
/* pause
*/
BarUiActCallback(BarUiActPause) {
- /* already locked => unlock/unpause */
- if (pthread_mutex_trylock (&app->player.pauseMutex) == EBUSY) {
- pthread_mutex_unlock (&app->player.pauseMutex);
+ if (app->player.paused) {
+ pthread_kill (app->player.thread, BAR_PLAYER_SIGCONT);
+ app->player.paused = false;
+ } else {
+ pthread_kill (app->player.thread, BAR_PLAYER_SIGSTOP);
+ app->player.paused = true;
}
}
@@ -489,8 +495,9 @@ BarUiActCallback(BarUiActSelectQuickMix) {
/* quit
*/
BarUiActCallback(BarUiActQuit) {
- app->doQuit = 1;
+ /* cancels player thread */
BarUiDoSkipSong (&app->player);
+ app->doQuit = 1;
}
/* song history