diff options
-rw-r--r-- | contrib/pianobar.1 | 4 | ||||
-rw-r--r-- | src/main.c | 11 | ||||
-rw-r--r-- | src/main.h | 1 | ||||
-rw-r--r-- | src/player.c | 9 | ||||
-rw-r--r-- | src/player.h | 2 | ||||
-rw-r--r-- | src/settings.c | 3 | ||||
-rw-r--r-- | src/settings.h | 2 |
7 files changed, 23 insertions, 9 deletions
diff --git a/contrib/pianobar.1 b/contrib/pianobar.1 index d5f1ad7..5efaca1 100644 --- a/contrib/pianobar.1 +++ b/contrib/pianobar.1 @@ -295,6 +295,10 @@ Keep a history of the last n songs (5, by default). You can rate these songs. Icon for loved songs. .TP +.B max_player_errors = 5 +Amount of song download errors in a row after pianobar stops playback. + +.TP .B partner_password = AC7IBG09A3DTSYM4R41UJWL07VLN8JI7 .TP @@ -300,8 +300,15 @@ static void BarMainPlayerCleanup (BarApp_t *app, pthread_t *playerThread) { pthread_cond_destroy (&app->player.pauseCond); pthread_mutex_destroy (&app->player.pauseMutex); - /* don't continue playback if thread reports error */ - if (threadRet != (void *) PLAYER_RET_OK) { + if (threadRet == (void *) PLAYER_RET_OK) { + app->playerErrors = 0; + } else if (threadRet == (void *) PLAYER_RET_SOFTFAIL) { + ++app->playerErrors; + if (app->playerErrors >= app->settings.maxPlayerErrors) { + /* don't continue playback if thread reports too many error */ + app->curStation = NULL; + } + } else { app->curStation = NULL; } @@ -42,6 +42,7 @@ typedef struct { PianoStation_t *curStation; char doQuit; BarReadlineFds_t input; + unsigned int playerErrors; } BarApp_t; #endif /* _MAIN_H */ diff --git a/src/player.c b/src/player.c index 16c94dc..939b326 100644 --- a/src/player.c +++ b/src/player.c @@ -489,7 +489,7 @@ void *BarPlayerThread (void *data) { default: BarUiMsg (player->settings, MSG_ERR, "Unsupported audio format!\n"); - ret = (void *) PLAYER_RET_ERR; + ret = (void *) PLAYER_RET_HARDFAIL; goto cleanup; break; } @@ -528,15 +528,14 @@ void *BarPlayerThread (void *data) { } if (player->aoError) { - ret = (void *) PLAYER_RET_ERR; + ret = (void *) PLAYER_RET_HARDFAIL; } /* Pandora sends broken audio url’s sometimes (“bad request”). ignore them. */ - if (wRet != WAITRESS_RET_OK && wRet != WAITRESS_RET_CB_ABORT && - wRet != WAITRESS_RET_BAD_REQUEST) { + if (wRet != WAITRESS_RET_OK && wRet != WAITRESS_RET_CB_ABORT) { BarUiMsg (player->settings, MSG_ERR, "Cannot access audio file: %s\n", WaitressErrorToStr (wRet)); - ret = (void *) PLAYER_RET_ERR; + ret = (void *) PLAYER_RET_SOFTFAIL; } cleanup: diff --git a/src/player.h b/src/player.h index d0eac22..d107e41 100644 --- a/src/player.h +++ b/src/player.h @@ -107,7 +107,7 @@ struct audioPlayer { WaitressHandle_t waith; }; -enum {PLAYER_RET_OK = 0, PLAYER_RET_ERR = 1}; +enum {PLAYER_RET_OK = 0, PLAYER_RET_HARDFAIL = 1, PLAYER_RET_SOFTFAIL = 2}; void *BarPlayerThread (void *data); unsigned int BarPlayerCalcScale (float); diff --git a/src/settings.c b/src/settings.c index e801de8..d90a7d7 100644 --- a/src/settings.c +++ b/src/settings.c @@ -125,6 +125,7 @@ void BarSettingsRead (BarSettings_t *settings) { settings->autoselect = true; settings->history = 5; settings->volume = 0; + settings->maxPlayerErrors = 5; settings->sortOrder = BAR_SORT_NAME_AZ; settings->loveIcon = strdup (" <3"); settings->banIcon = strdup (" </3"); @@ -243,6 +244,8 @@ void BarSettingsRead (BarSettings_t *settings) { settings->eventCmd = strdup (val); } else if (streq ("history", key)) { settings->history = atoi (val); + } else if (streq ("max_player_errors", key)) { + settings->maxPlayerErrors = atoi (val); } else if (streq ("sort", key)) { size_t i; static const char *mapping[] = {"name_az", diff --git a/src/settings.h b/src/settings.h index 392ea58..819f8cb 100644 --- a/src/settings.h +++ b/src/settings.h @@ -84,7 +84,7 @@ typedef struct { typedef struct { bool autoselect; - unsigned int history; + unsigned int history, maxPlayerErrors; int volume; BarStationSorting_t sortOrder; PianoAudioQuality_t audioQuality; |