diff options
| -rw-r--r-- | src/main.c | 15 | ||||
| -rw-r--r-- | src/main.h | 2 | ||||
| -rw-r--r-- | src/player.c | 13 | 
3 files changed, 20 insertions, 10 deletions
| @@ -259,7 +259,7 @@ static void BarMainStartPlayback (BarApp_t *app, pthread_t *playerThread) {  		pthread_mutex_init (&app->player.pauseMutex, NULL);  		pthread_cond_init (&app->player.pauseCond, NULL); -		assert (interrupted == NULL); +		assert (interrupted == &app->doQuit);  		interrupted = &app->player.interrupted;  		/* throw event */ @@ -306,7 +306,7 @@ static void BarMainPlayerCleanup (BarApp_t *app, pthread_t *playerThread) {  	memset (&app->player, 0, sizeof (app->player));  	assert (interrupted == &app->player.interrupted); -	interrupted = NULL; +	interrupted = &app->doQuit;  }  /*	print song duration @@ -355,12 +355,16 @@ static void BarMainLoop (BarApp_t *app) {  	while (!app->doQuit) {  		/* song finished playing, clean up things/scrobble song */  		if (app->player.mode == PLAYER_FINISHED) { +			if (app->player.interrupted != 0) { +				app->doQuit = 1; +			}  			BarMainPlayerCleanup (app, &playerThread);  		}  		/* check whether player finished playing and start playing new  		 * song */ -		if (app->player.mode == PLAYER_DEAD && app->curStation != NULL) { +		if (app->player.mode == PLAYER_DEAD && app->curStation != NULL && +				!app->doQuit) {  			/* what's next? */  			if (app->playlist != NULL) {  				PianoSong_t *histsong = app->playlist; @@ -394,7 +398,7 @@ sig_atomic_t *interrupted = NULL;  static void intHandler (int signal) {  	if (interrupted != NULL) { -		*interrupted = 1; +		*interrupted += 1;  	}  } @@ -414,10 +418,11 @@ int main (int argc, char **argv) {  	/* save terminal attributes, before disabling echoing */  	BarTermInit (); -	BarMainSetupSigaction ();  	/* signals */  	signal (SIGPIPE, SIG_IGN); +	BarMainSetupSigaction (); +	interrupted = &app.doQuit;  	/* init some things */  	gcry_check_version (NULL); @@ -40,7 +40,7 @@ typedef struct {  	PianoSong_t *playlist;  	PianoSong_t *songHistory;  	PianoStation_t *curStation; -	char doQuit; +	sig_atomic_t doQuit;  	BarReadlineFds_t input;  	unsigned int playerErrors;  } BarApp_t; diff --git a/src/player.c b/src/player.c index cd666fc..04b9d4a 100644 --- a/src/player.c +++ b/src/player.c @@ -114,12 +114,16 @@ void BarPlayerSetVolume (player_t * const player) {  	printError (player->settings, msg, ret); \  	return false; -/*	interrupt callback for blocking setup functions from openStream +/*	ffmpeg callback for blocking functions, returns 1 to abort function   */  static int intCb (void * const data) {  	player_t * const player = data;  	assert (player != NULL); -	if (player->interrupted != 0) { +	if (player->interrupted > 1) { +		/* got a sigint multiple times, quit pianobar (handled by main.c). */ +		player->doQuit = true; +		return 1; +	} else if (player->interrupted != 0) {  		/* the request is retried with the same player context */  		player->interrupted = 0;  		return 1; @@ -390,7 +394,7 @@ void *BarPlayerThread (void *data) {  	assert (data != NULL);  	player_t * const player = data; -	intptr_t pret = PLAYER_RET_OK; +	uintptr_t pret = PLAYER_RET_OK;  	bool retry;  	do { @@ -399,7 +403,8 @@ void *BarPlayerThread (void *data) {  			if (openFilter (player) && openDevice (player)) {  				player->mode = PLAYER_PLAYING;  				BarPlayerSetVolume (player); -				retry = play (player) == AVERROR_INVALIDDATA; +				retry = play (player) == AVERROR_INVALIDDATA && +						!player->interrupted;  			} else {  				/* filter missing or audio device busy */  				pret = PLAYER_RET_HARDFAIL; | 
