Signed-off-by: Ali Polatel <a...@exherbo.org> --- Makefile.am | 11 +--- src/lmc.c | 208 ++++++++++++++++++++++++----------------------------- src/lmc.h | 2 +- src/mpdscribble.c | 31 +++++--- 4 files changed, 118 insertions(+), 134 deletions(-)
diff --git a/Makefile.am b/Makefile.am index 3bb8922..22ad1c3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -9,12 +9,6 @@ EXTRA_DIST = autogen.sh bin_PROGRAMS = src/mpdscribble -libmpdclient_SOURCES = \ - src/libmpdclient/str_pool.c src/libmpdclient/str_pool.h \ - src/libmpdclient/resolver.c src/libmpdclient/resolver.h \ - src/libmpdclient/song.c src/libmpdclient/song.h \ - src/libmpdclient/libmpdclient.c src/libmpdclient/libmpdclient.h - src_mpdscribble_SOURCES = \ src/mpdscribble.c \ src/compat.h \ @@ -26,8 +20,7 @@ src_mpdscribble_SOURCES = \ src/file.c src/file.h \ src/journal.c src/journal.h \ src/lmc.c src/lmc.h \ - src/log.c src/log.h \ - $(libmpdclient_SOURCES) + src/log.c src/log.h if HAVE_CURL src_mpdscribble_SOURCES += src/http_client_curl.c @@ -42,7 +35,7 @@ AM_CPPFLAGS = $(libmpdclient_CFLAGS) \ $(libgthread_CFLAGS) \ $(libgcrypt_CFLAGS) \ $(libglib_CFLAGS) \ - -I$(srcdir)/src -I$(srcdir)/src/libmpdclient + -I$(srcdir)/src LDADD = $(libmpdclient_LIBS) \ $(libcurl_LIBS) $(libsoup_LIBS) \ $(libgthread_LIBS) \ diff --git a/src/lmc.c b/src/lmc.c index d973d19..9f60b82 100644 --- a/src/lmc.c +++ b/src/lmc.c @@ -23,6 +23,7 @@ #include "compat.h" #include <glib.h> +#include <mpd/client.h> #include <assert.h> #include <stdbool.h> @@ -31,7 +32,8 @@ #include <string.h> #include <unistd.h> -static mpd_Connection *g_mpd = NULL; +static struct mpd_connection *g_mpd = NULL; +static const unsigned *g_version = NULL; static bool idle_supported, idle_notified; static int last_id = -1; static struct mpd_song *current_song; @@ -53,11 +55,14 @@ lmc_schedule_idle(void); static void lmc_failure(void) { - char *msg = g_strescape(g_mpd->errorStr, NULL); + char *msg; - g_warning("mpd error (%i): %s\n", g_mpd->error, msg); + assert(g_mpd != NULL); + msg = g_strescape(mpd_connection_get_error_message(g_mpd), NULL); + + g_warning("mpd error (%i): %s\n", mpd_connection_get_error(g_mpd), msg); g_free(msg); - mpd_closeConnection(g_mpd); + mpd_connection_free(g_mpd); g_mpd = NULL; } @@ -73,8 +78,9 @@ lmc_reconnect(G_GNUC_UNUSED gpointer data) password = g_strndup(g_host, at - g_host); } - g_mpd = mpd_newConnection(host, g_port, 10); - if (g_mpd->error) { + if ((g_mpd = mpd_connection_new(host, g_port, 10)) == NULL) + g_error("Error creating mpd connection: out of memory\n"); + if (mpd_connection_get_error(g_mpd) != MPD_ERROR_SUCCESS) { lmc_failure(); g_free(password); return true; @@ -85,19 +91,20 @@ lmc_reconnect(G_GNUC_UNUSED gpointer data) if (password) { g_debug("sending MPD password\n"); - mpd_sendPasswordCommand(g_mpd, password); - mpd_finishCommand(g_mpd); + if (!mpd_run_password(g_mpd, password)) { + lmc_failure(); + g_free(password); + return true; + } g_free(password); } - if (g_mpd->error) { - lmc_failure(); - return true; - } - - g_message("connected to mpd %i.%i.%i at %s:%i\n", - g_mpd->version[0], g_mpd->version[1], g_mpd->version[2], - host, g_port); + if ((g_version = mpd_connection_get_server_version(g_mpd)) != NULL) + g_message("connected to mpd %i.%i.%i at %s:%i\n", + g_version[0], g_version[1], g_version[2], + host, g_port); + else + g_message("connected to mpd unknown at %s:%i\n", host, g_port); lmc_schedule_update(); @@ -136,12 +143,12 @@ void lmc_disconnect(void) g_source_remove(idle_source_id); if (g_mpd) { - mpd_closeConnection(g_mpd); + mpd_connection_free(g_mpd); g_mpd = NULL; } if (current_song != NULL) { - mpd_freeSong(current_song); + mpd_song_free(current_song); current_song = NULL; } } @@ -149,75 +156,60 @@ void lmc_disconnect(void) static int lmc_current(struct mpd_song **song_r, int *elapsed_r) { - mpd_Status *status; int state; - struct mpd_InfoEntity *entity; + struct mpd_status *status; + struct mpd_song *song; assert(g_mpd != NULL); - mpd_sendCommandListOkBegin(g_mpd); - mpd_sendStatusCommand(g_mpd); - mpd_sendCurrentSongCommand(g_mpd); - mpd_sendCommandListEnd(g_mpd); - - status = mpd_getStatus(g_mpd); - if (!status) { + if (!mpd_command_list_begin(g_mpd, true) || + !mpd_send_status(g_mpd) || + !mpd_send_current_song(g_mpd) || + !mpd_command_list_end(g_mpd)) { lmc_failure(); - return MPD_STATUS_STATE_UNKNOWN; + return MPD_STATE_UNKNOWN; } - if (status->error) { - /* FIXME: clearing stuff doesn't seem to help, it keeps printing the - same error over and over, so just let's just ignore these errors - for now. */ - // warning ("mpd status error: %s\n", status->error); - // mpd_executeCommand(g_mpd, "clearerror"); - mpd_clearError(g_mpd); + status = mpd_recv_status(g_mpd); + if (!status) { + lmc_failure(); + return MPD_STATE_UNKNOWN; } - state = status->state; - *elapsed_r = status->elapsedTime; + state = mpd_status_get_state(status); + *elapsed_r = mpd_status_get_elapsed_time(status); - mpd_freeStatus(status); + mpd_status_free(status); - if (state != MPD_STATUS_STATE_PLAY) { - mpd_finishCommand(g_mpd); + if (state != MPD_STATE_PLAY) { + if (!mpd_response_finish(g_mpd)) { + lmc_failure(); + return MPD_STATE_UNKNOWN; + } return state; } - if (g_mpd->error) { + if (!mpd_response_next(g_mpd)) { lmc_failure(); - return MPD_STATUS_STATE_UNKNOWN; - } - - mpd_nextListOkCommand(g_mpd); - - while ((entity = mpd_getNextInfoEntity(g_mpd)) != NULL - && entity->type != MPD_INFO_ENTITY_TYPE_SONG) { - mpd_freeInfoEntity(entity); + return MPD_STATE_UNKNOWN; } - if (entity == NULL) { - mpd_finishCommand(g_mpd); - return MPD_STATUS_STATE_UNKNOWN; + song = mpd_recv_song(g_mpd); + if (song == NULL) { + if (!mpd_response_finish(g_mpd)) + lmc_failure(); + return MPD_STATE_UNKNOWN; } - if (g_mpd->error) { - mpd_freeInfoEntity(entity); + if (!mpd_response_finish(g_mpd)) { + mpd_song_free(song); lmc_failure(); - return MPD_STATUS_STATE_UNKNOWN; + return MPD_STATE_UNKNOWN; } - mpd_finishCommand(g_mpd); - if (g_mpd->error) { - mpd_freeInfoEntity(entity); - lmc_failure(); - return MPD_STATUS_STATE_UNKNOWN; - } - - *song_r = mpd_songDup(entity->info.song); - mpd_freeInfoEntity(entity); - return MPD_STATUS_STATE_PLAY; + *song_r = mpd_song_dup(song); + mpd_song_free(song); + return MPD_STATE_PLAY; } /** @@ -228,11 +220,12 @@ lmc_update(G_GNUC_UNUSED gpointer data) { struct mpd_song *prev; int state, elapsed = -1; + const char *artist, *title; prev = current_song; state = lmc_current(¤t_song, &elapsed); - if (state == MPD_STATUS_STATE_PAUSE) { + if (state == MPD_STATE_PAUSE) { if (!was_paused) song_paused(); was_paused = true; @@ -244,39 +237,39 @@ lmc_update(G_GNUC_UNUSED gpointer data) } return true; - } else if (state != MPD_STATUS_STATE_PLAY) { + } else if (state != MPD_STATE_PLAY) { current_song = NULL; last_id = -1; was_paused = false; - } else if (current_song->artist == NULL || - current_song->title == NULL) { - if (current_song->id != last_id) { + } else if (((artist = mpd_song_get_tag(current_song, MPD_TAG_ARTIST, 0)) == NULL) || + ((title = mpd_song_get_tag(current_song, MPD_TAG_TITLE, 0)) == NULL)) { + if ((int)mpd_song_get_id(current_song) != last_id) { g_message("new song detected with tags missing (%s)\n", - current_song->file); - last_id = current_song->id; + mpd_song_get_uri(current_song)); + last_id = mpd_song_get_id(current_song); } - mpd_freeSong(current_song); + mpd_song_free(current_song); current_song = NULL; } if (was_paused) { - if (current_song != NULL && current_song->id == last_id) + if (current_song != NULL && (int)mpd_song_get_id(current_song) == last_id) song_continued(); was_paused = false; } /* submit the previous song */ if (prev != NULL && - (current_song == NULL || prev->id != current_song->id)) + (current_song == NULL || mpd_song_get_id(prev) != mpd_song_get_id(current_song))) song_ended(prev); if (current_song != NULL) { - if (current_song->id != last_id) { + if ((int)mpd_song_get_id(current_song) != last_id) { /* new song. */ song_started(current_song); - last_id = current_song->id; + last_id = mpd_song_get_id(current_song); } else { /* still playing the previous song */ @@ -285,7 +278,7 @@ lmc_update(G_GNUC_UNUSED gpointer data) } if (prev != NULL) - mpd_freeSong(prev); + mpd_song_free(prev); if (g_mpd == NULL) { lmc_schedule_reconnect(); @@ -311,18 +304,6 @@ lmc_schedule_update(void) lmc_update, NULL); } -static void -lmc_idle_callback(G_GNUC_UNUSED struct _mpd_Connection *connection, - unsigned flags, G_GNUC_UNUSED void *userdata) -{ - assert(g_mpd == connection); - - /* we only care about the "player" event */ - - if (flags & IDLE_PLAYER) - idle_notified = true; -} - static gboolean lmc_idle(G_GNUC_UNUSED GIOChannel *source, G_GNUC_UNUSED GIOCondition condition, @@ -330,31 +311,30 @@ lmc_idle(G_GNUC_UNUSED GIOChannel *source, { assert(idle_source_id != 0); assert(g_mpd != NULL); - assert(g_mpd->error == MPD_ERROR_SUCCESS); + assert(mpd_connection_get_error(g_mpd) == MPD_ERROR_SUCCESS); idle_source_id = 0; /* an even on the MPD connection socket: end idle mode and query result */ - mpd_stopIdle(g_mpd); + if ((idle_notified = mpd_recv_idle(g_mpd, false)) == 0) { + if ((mpd_connection_get_error(g_mpd) == MPD_ERROR_SERVER) && + (mpd_connection_get_server_error(g_mpd) == MPD_SERVER_ERROR_UNKNOWN_CMD)) { + /* MPD does not recognize the "idle" command - disable + it for this connection */ - if (g_mpd->error == MPD_ERROR_ACK && - g_mpd->errorCode == MPD_ACK_ERROR_UNKNOWN_CMD) { - /* MPD does not recognize the "idle" command - disable - it for this connection */ + g_message("MPD does not support the 'idle' command - " + "falling back to polling\n"); - g_message("MPD does not support the 'idle' command - " - "falling back to polling\n"); - - idle_supported = false; - lmc_schedule_update(); - return false; - } - - if (g_mpd->error != MPD_ERROR_SUCCESS) { - lmc_failure(); - lmc_schedule_reconnect(); - return false; + idle_supported = false; + lmc_schedule_update(); + return false; + } + if (mpd_connection_get_error(g_mpd) != MPD_ERROR_SUCCESS) { + lmc_failure(); + lmc_schedule_reconnect(); + return false; + } } if (idle_notified) @@ -370,6 +350,7 @@ lmc_idle(G_GNUC_UNUSED GIOChannel *source, static void lmc_schedule_idle(void) { + int sock; GIOChannel *channel; assert(idle_source_id == 0); @@ -377,9 +358,9 @@ lmc_schedule_idle(void) idle_notified = false; - mpd_startIdle(g_mpd, lmc_idle_callback, NULL); - if (g_mpd->error == MPD_ERROR_ACK && - g_mpd->errorCode == MPD_ACK_ERROR_UNKNOWN_CMD) { + if ((!mpd_send_idle_mask(g_mpd, MPD_IDLE_PLAYER)) && + (mpd_connection_get_error(g_mpd) == MPD_ERROR_SERVER) && + (mpd_connection_get_server_error(g_mpd) == MPD_SERVER_ERROR_UNKNOWN_CMD)) { /* MPD does not recognize the "idle" command - disable it for this connection */ @@ -391,7 +372,7 @@ lmc_schedule_idle(void) return; } - if (g_mpd->error != MPD_ERROR_SUCCESS) { + if (mpd_connection_get_error(g_mpd) != MPD_ERROR_SUCCESS) { lmc_failure(); lmc_schedule_reconnect(); return; @@ -399,7 +380,8 @@ lmc_schedule_idle(void) /* add a GLib watch on the libmpdclient socket */ - channel = g_io_channel_unix_new(g_mpd->sock); + sock = mpd_connection_get_fd(g_mpd); + channel = g_io_channel_unix_new(sock); idle_source_id = g_io_add_watch(channel, G_IO_IN, lmc_idle, NULL); g_io_channel_unref(channel); } diff --git a/src/lmc.h b/src/lmc.h index 1d32a55..4b92fd4 100644 --- a/src/lmc.h +++ b/src/lmc.h @@ -21,7 +21,7 @@ #ifndef LMC_H #define LMC_H -#include <libmpdclient/libmpdclient.h> +#include <mpd/client.h> #include <stdio.h> void lmc_connect(char *host, int port); diff --git a/src/mpdscribble.c b/src/mpdscribble.c index 347285b..b7a81d3 100644 --- a/src/mpdscribble.c +++ b/src/mpdscribble.c @@ -95,19 +95,26 @@ static bool song_repeated(const struct mpd_song *song, int elapsed, int prev_elapsed) { return elapsed < 60 && prev_elapsed > elapsed && - played_long_enough(prev_elapsed - elapsed, song->time); + played_long_enough(prev_elapsed - elapsed, mpd_song_get_duration(song)); } static void song_changed(const struct mpd_song *song) { + const char *artist, *title, *album, *musicbrainz_trackid; + + artist = mpd_song_get_tag(song, MPD_TAG_ARTIST, 0); + title = mpd_song_get_tag(song, MPD_TAG_TITLE, 0); + album = mpd_song_get_tag(song, MPD_TAG_ALBUM, 0); + musicbrainz_trackid = mpd_song_get_tag(song, MPD_TAG_MUSICBRAINZ_TRACKID, 0); + g_message("new song detected (%s - %s), id: %i, pos: %i\n", - song->artist, song->title, song->id, song->pos); + artist, title, mpd_song_get_id(song), mpd_song_get_pos(song)); g_timer_start(timer); - as_now_playing(song->artist, song->title, song->album, - song->musicbrainz_trackid, - song->time); + as_now_playing(artist, title, album, + musicbrainz_trackid, + mpd_song_get_duration(song)); } /** @@ -173,16 +180,18 @@ song_ended(const struct mpd_song *song) { int elapsed = g_timer_elapsed(timer, NULL); - if (!played_long_enough(elapsed, song->time)) + if (!played_long_enough(elapsed, mpd_song_get_duration(song))) return; /* FIXME: libmpdclient doesn't have any way to fetch the musicbrainz id. */ - as_songchange(song->file, song->artist, - song->title, - song->album, song->musicbrainz_trackid, - song->time > - 0 ? song->time : (int) + as_songchange(mpd_song_get_uri(song), + mpd_song_get_tag(song, MPD_TAG_ARTIST, 0), + mpd_song_get_tag(song, MPD_TAG_TITLE, 0), + mpd_song_get_tag(song, MPD_TAG_ALBUM, 0), + mpd_song_get_tag(song, MPD_TAG_MUSICBRAINZ_TRACKID, 0), + mpd_song_get_duration(song) > + 0 ? (int)mpd_song_get_duration(song) : (int) g_timer_elapsed(timer, NULL), NULL);
------------------------------------------------------------------------------ This SF.Net email is sponsored by the Verizon Developer Community Take advantage of Verizon's best-in-class app development support A streamlined, 14 day to market process makes app distribution fast and easy Join now and get one step closer to millions of Verizon customers http://p.sf.net/sfu/verizon-dev2dev
_______________________________________________ Musicpd-dev-team mailing list Musicpd-dev-team@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/musicpd-dev-team