diff options
| author | bakkeby <[email protected]> | 2019-10-10 23:09:07 +0200 |
|---|---|---|
| committer | bakkeby <[email protected]> | 2019-10-10 23:09:07 +0200 |
| commit | ed1c509df3faf757a5b46bae0cfa59035977b50c (patch) | |
| tree | fcfc75bba17b651ebe2b27786933675c1cfbd489 /patch | |
| parent | 703e9da1108cb3d69314bdd979b8ec9141a28618 (diff) | |
| download | dwm-flexipatch-ed1c509df3faf757a5b46bae0cfa59035977b50c.tar.gz dwm-flexipatch-ed1c509df3faf757a5b46bae0cfa59035977b50c.zip | |
Adding mdpcontrol patch
Diffstat (limited to 'patch')
| -rw-r--r-- | patch/include.c | 4 | ||||
| -rw-r--r-- | patch/include.h | 4 | ||||
| -rw-r--r-- | patch/mdpcontrol.c | 140 | ||||
| -rw-r--r-- | patch/mdpcontrol.h | 2 |
4 files changed, 150 insertions, 0 deletions
diff --git a/patch/include.c b/patch/include.c index d881deb..e86b053 100644 --- a/patch/include.c +++ b/patch/include.c @@ -68,6 +68,10 @@ #include "maximize.c" #endif +#if MDPCONTROL_PATCH +#include "mdpcontrol.c" +#endif + #if MOVESTACK_PATCH #include "movestack.c" #endif diff --git a/patch/include.h b/patch/include.h index 65feac9..c38f849 100644 --- a/patch/include.h +++ b/patch/include.h @@ -68,6 +68,10 @@ #include "maximize.h" #endif +#if MDPCONTROL_PATCH +#include "mdpcontrol.h" +#endif + #if MOVESTACK_PATCH #include "movestack.h" #endif diff --git a/patch/mdpcontrol.c b/patch/mdpcontrol.c new file mode 100644 index 0000000..b0d7352 --- /dev/null +++ b/patch/mdpcontrol.c @@ -0,0 +1,140 @@ +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <regex.h> + +#include <mpd/client.h> + +#define MPDHOST "localhost" +#define MPDPORT 6600 + +struct mpd_connection *get_conn(){ + struct mpd_connection *conn; + + conn = mpd_connection_new(MPDHOST, MPDPORT, 1000); + + if(mpd_connection_get_error(conn) != MPD_ERROR_SUCCESS){ + fprintf(stderr, "Could not connect to mpd: %s\n", mpd_connection_get_error_message(conn)); + + mpd_connection_free(conn); + return NULL; + } + + return conn; +} + +void mpdchange(const Arg *direction){ + struct mpd_connection *conn; + + conn = get_conn(); + + if(conn == NULL){ + return; + } + + if(direction->i > 0){ + mpd_run_next(conn); + } + else{ + mpd_run_previous(conn); + } + + mpd_connection_free(conn); +} + +char *get_regerror(int errcode, regex_t *compiled){ + size_t length = regerror(errcode, compiled, NULL, 0); + char *buffer = malloc(length); + (void) regerror(errcode, compiled, buffer, length); + + return buffer; +} + +void mpdcontrol(){ + struct mpd_connection *conn; + struct mpd_status *status; + struct mpd_song *song; + enum mpd_state state; + + const char *filename; + + regex_t expr; + + conn = get_conn(); + + if(conn == NULL){ + return; + } + + status = mpd_run_status(conn); + + if(status == NULL){ + fprintf(stderr, "Could not get mpd status: %s\n", mpd_status_get_error(status)); + + mpd_status_free(status); + mpd_connection_free(conn); + return; + } + + state = mpd_status_get_state(status); + + if(state == MPD_STATE_STOP || state == MPD_STATE_PAUSE){ + mpd_run_play(conn); + mpd_status_free(status); + mpd_connection_free(conn); + } + else if(state != MPD_STATE_UNKNOWN){ //playing some music + song = mpd_run_current_song(conn); + + if(song == NULL){ + fprintf(stderr, "Error fetching current song!\n"); + + mpd_song_free(song); + mpd_status_free(status); + mpd_connection_free(conn); + return; + } + + filename = mpd_song_get_uri(song); + + int errcode = regcomp(&expr, "^[[:alnum:]]+://", REG_EXTENDED|REG_NOSUB); + if(errcode != 0){ + char *err = get_regerror(errcode, &expr); + fprintf(stderr, "Could not compile regexp: %s\n", err); + + mpd_song_free(song); + mpd_status_free(status); + mpd_connection_free(conn); + free(err); + regfree(&expr); + return; + } + + int matchcode = regexec(&expr, filename, 0, NULL, 0); + + if(matchcode == 0){ + if(strstr(filename, "file://") == filename){ //match just at the start of the filename + //this means that mpd is playing a file outside the music_dir, + //but on disk, so we can safely pause + mpd_run_toggle_pause(conn); + } + else{ + mpd_run_stop(conn); + } + } + else if(matchcode == REG_NOMATCH){ + mpd_run_toggle_pause(conn); + } + else{ + char *err = get_regerror(matchcode, &expr); + fprintf(stderr, "Error while matching regexp: %s\n", err); + + free(err); + } + + regfree(&expr); + mpd_song_free(song); + mpd_status_free(status); + mpd_connection_free(conn); + } +}
\ No newline at end of file diff --git a/patch/mdpcontrol.h b/patch/mdpcontrol.h new file mode 100644 index 0000000..b8825d4 --- /dev/null +++ b/patch/mdpcontrol.h @@ -0,0 +1,2 @@ +static void mpdchange(const Arg *direction); +static void mpdcontrol();
\ No newline at end of file |
