worked out mpd error handling

This commit is contained in:
Rachel Lambda Samuelsson 2021-01-27 23:39:47 +01:00
parent 787ddd67b1
commit 3b20394635

View File

@ -14,14 +14,17 @@
#include <X11/Xutil.h> #include <X11/Xutil.h>
/* TODO image metadata images /* TODO image metadata images
TODO handle disconnection errors
TODO fix stutter on resize */ TODO fix stutter on resize */
/* mpd globals */ /* mpd globals */
struct mpd_connection* connection = 0; struct mpd_connection* connection = 0;
int mpd_fd = 0; int mpd_fd = 0;
char* mpd_db_dir = 0; char* mpd_db_dir = 0;
char* mpd_host = 0;
unsigned mpd_port = 0;
unsigned mpd_timeout = 0;
/* x globals */
Display* xdisplay; Display* xdisplay;
int xscreen; int xscreen;
Visual* xvisual; Visual* xvisual;
@ -29,7 +32,9 @@ Colormap xcolormap;
int xdepth; int xdepth;
Window xwindow; Window xwindow;
GC gc; GC gc;
unsigned int ww = 256, wh = 256;
/* imlib globals */
Imlib_Updates im_updates; Imlib_Updates im_updates;
Imlib_Image im_buffer, im_image = 0; Imlib_Image im_buffer, im_image = 0;
Imlib_Color_Range range; Imlib_Color_Range range;
@ -37,11 +42,13 @@ char* im_image_path;
int im_w, im_h; int im_w, im_h;
/* print to stderr and exit */
void die(const char* msg) { void die(const char* msg) {
fprintf(stderr, "FATAL: %s\n", msg); fprintf(stderr, "FATAL: %s\n", msg);
exit(1); exit(1);
} }
/* print to stderr */
void warn(const char* msg) { void warn(const char* msg) {
fprintf(stderr, "WARNING: %s\n", msg); fprintf(stderr, "WARNING: %s\n", msg);
} }
@ -73,7 +80,6 @@ char* asprintf(const char* fmt, ...) {
return ret; return ret;
} }
/* currently only works once... why? */
void set_window_name(char* name) { void set_window_name(char* name) {
int len = strlen(name); int len = strlen(name);
@ -123,14 +129,14 @@ void imlib_update(char* path) {
} }
void imlib_render(int up_w, int up_h) { void imlib_render(void) {
if (!im_image || !im_image_path) if (!im_image || !im_image_path)
return; return;
imlib_blend_image_onto_image(im_image, 0, imlib_blend_image_onto_image(im_image, 0,
0, 0, im_w, im_h, 0, 0, im_w, im_h,
0, 0, up_w, up_h); 0, 0, ww, wh);
imlib_render_image_on_drawable(0, 0); imlib_render_image_on_drawable(0, 0);
@ -213,13 +219,35 @@ void update_mpd_song(void) {
mpd_song_free(song); mpd_song_free(song);
} }
/* check and handle errors */
void mpd_check_error(void) {
switch (mpd_connection_get_error(connection)) {
case MPD_ERROR_OOM:
case MPD_ERROR_ARGUMENT:
case MPD_ERROR_SYSTEM:
die(mpd_connection_get_error_message(connection));
case MPD_ERROR_SERVER:
case MPD_ERROR_MALFORMED:
warn(mpd_connection_get_error_message(connection));
case MPD_ERROR_RESOLVER:
case MPD_ERROR_CLOSED:
while(mpd_connection_get_error(connection) != MPD_ERROR_SUCCESS) {
warn("Unable to connect to mpd, retrying in 5 seconds");
sleep(5);
mpd_connection_free(connection);
connection = mpd_connection_new(mpd_host, mpd_port, mpd_timeout);
if (!connection)
die("Unable to allocate memory for mpd_connection struct");
}
printf("Successfully connected to mpd again!\n");
}
}
int main(int argc, char** argv) { int main(int argc, char** argv) {
/* parse args */ /* parse args */
char* mpd_host = 0;
unsigned mpd_port = 0;
unsigned mpd_timeout = 0;
while (*++argv) { while (*++argv) {
if (!strcmp(*argv, "-d")) if (!strcmp(*argv, "-d"))
mpd_db_dir = *++argv; mpd_db_dir = *++argv;
@ -269,7 +297,7 @@ int main(int argc, char** argv) {
Window xparent = XRootWindow(xdisplay, xscreen); Window xparent = XRootWindow(xdisplay, xscreen);
unsigned int ww = 256, wh = 256, x = 0, y = 0; unsigned x = 0, y = 0;
unsigned int border_width = 0; unsigned int border_width = 0;
/* are these two needed when border_width is 0? */ /* are these two needed when border_width is 0? */
unsigned int border_color = BlackPixel(xdisplay, xscreen); unsigned int border_color = BlackPixel(xdisplay, xscreen);
@ -334,8 +362,10 @@ int main(int argc, char** argv) {
/* get currently playing song before waiting for new ones */ /* get currently playing song before waiting for new ones */
update_mpd_song(); update_mpd_song();
imlib_render();
mpd_fd = mpd_connection_get_fd(connection); mpd_fd = mpd_connection_get_fd(connection);
mpd_check_error();
int xfd = ConnectionNumber(xdisplay); int xfd = ConnectionNumber(xdisplay);
@ -350,8 +380,8 @@ int main(int argc, char** argv) {
} }
}; };
if(!mpd_send_idle_mask(connection, MPD_IDLE_PLAYER)) mpd_send_idle_mask(connection, MPD_IDLE_PLAYER);
die("Unable to send idle to mpd"); mpd_check_error();
/* mpd event loop */ /* mpd event loop */
while (1) { while (1) {
@ -381,14 +411,18 @@ int main(int argc, char** argv) {
/* break; */ /* break; */
} }
} }
imlib_render(ww, wh); imlib_render();
} }
/* MPD event loop */ /* MPD event loop */
if (fds[1].revents & POLLIN) { if (fds[1].revents & POLLIN) {
mpd_run_noidle(connection); mpd_run_noidle(connection);
mpd_check_error();
update_mpd_song(); update_mpd_song();
imlib_render(ww, wh); imlib_render();
mpd_send_idle_mask(connection, MPD_IDLE_PLAYER); mpd_send_idle_mask(connection, MPD_IDLE_PLAYER);
mpd_check_error();
} }
} }
} }