aboutsummaryrefslogtreecommitdiffstats
path: root/src/player_error.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/player_error.c')
-rw-r--r--src/player_error.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/player_error.c b/src/player_error.c
new file mode 100644
index 000000000..4c7f7b9de
--- /dev/null
+++ b/src/player_error.c
@@ -0,0 +1,53 @@
+#include "player_error.h"
+#include "os_compat.h"
+#include "log.h"
+#include "path.h"
+
+enum player_error player_errno;
+Song *player_errsong;
+
+void player_clearerror(void)
+{
+ player_errno = PLAYER_ERROR_NONE;
+ player_errsong = NULL;
+}
+
+void player_seterror(enum player_error err, Song *song)
+{
+ if (player_errno)
+ ERROR("Clobbering existing error: %s\n", player_strerror());
+ player_errno = err;
+ player_errsong = song;
+}
+
+const char *player_strerror(void)
+{
+ /* static OK here, only one user in main task */
+ static char error[MPD_PATH_MAX + 64]; /* still too much */
+ char path_max_tmp[MPD_PATH_MAX];
+ *error = '\0'; /* likely */
+
+ switch (player_errno) {
+ case PLAYER_ERROR_NONE: break;
+ case PLAYER_ERROR_FILE:
+ snprintf(error, sizeof(error), "problems decoding \"%s\"",
+ get_song_url(path_max_tmp, player_errsong));
+ break;
+ case PLAYER_ERROR_AUDIO:
+ strcpy(error, "problems opening audio device");
+ break;
+ case PLAYER_ERROR_SYSTEM:
+ strcpy(error, "system error occured");
+ break;
+ case PLAYER_ERROR_UNKTYPE:
+ snprintf(error, sizeof(error), "file type of \"%s\" is unknown",
+ get_song_url(path_max_tmp, player_errsong));
+ case PLAYER_ERROR_FILENOTFOUND:
+ snprintf(error, sizeof(error),
+ "file \"%s\" does not exist or is inaccessible",
+ get_song_url(path_max_tmp, player_errsong));
+ break;
+ }
+ return *error ? error : NULL;
+}
+