diff --git a/src/mpdclient.c b/src/mpdclient.c
index 97cf78b3d19df3b341519cab5a7c9acd217b55f9..59b0ad45ff504c8c47959e708220747b2b50b907 100644 (file)
--- a/src/mpdclient.c
+++ b/src/mpdclient.c
/* ncmpc (Ncurses MPD Client)
- * (c) 2004-2009 The Music Player Daemon Project
+ * (c) 2004-2010 The Music Player Daemon Project
* Project homepage: http://musicpd.org
* This program is free software; you can redistribute it and/or modify
mpdclient_update(struct mpdclient *c)
{
struct mpd_connection *connection = mpdclient_get_connection(c);
- bool retval;
c->volume = -1;
/* check if the playlist needs an update */
if (c->playlist.version != mpd_status_get_queue_version(c->status)) {
+ bool retval;
+
if (c->source == NULL)
- c->events |= MPD_IDLE_PLAYLIST;
+ c->events |= MPD_IDLE_QUEUE;
if (!playlist_is_empty(&c->playlist))
retval = mpdclient_playlist_update_changes(c);
else
retval = mpdclient_playlist_update(c);
- } else
- retval = true;
+ if (!retval)
+ return false;
+ }
/* update the current song */
- if (!c->song || mpd_status_get_song_id(c->status)) {
+ if (!c->song || mpd_status_get_song_id(c->status) >= 0) {
c->song = playlist_get_song(&c->playlist,
mpd_status_get_song_pos(c->status));
}
- return retval;
+ return true;
}
struct mpd_connection *
}
}
+static struct mpd_status *
+mpdclient_recv_status(struct mpdclient *c)
+{
+ struct mpd_status *status;
+
+ assert(c->connection != NULL);
+
+ status = mpd_recv_status(c->connection);
+ if (status == NULL) {
+ mpdclient_handle_error(c);
+ return NULL;
+ }
+
+ if (c->status != NULL)
+ mpd_status_free(c->status);
+ return c->status = status;
+}
/****************************************************************************/
/*** MPD Commands **********************************************************/
struct mpd_connection *connection;
int length, current;
- if (c->status == NULL)
+ if (!mpdclient_is_playing(c))
return false;
length = mpd_status_get_queue_length(c->status);
current = mpd_status_get_song_pos(c->status);
- if (current < 0 ||
- (mpd_status_get_state(c->status) != MPD_STATE_PLAY &&
- mpd_status_get_state(c->status) != MPD_STATE_PAUSE) ||
- mpd_status_get_queue_length(c->status) < 2)
+ if (current < 0 || mpd_status_get_queue_length(c->status) < 2)
return true;
connection = mpdclient_get_connection(c);
/* receive the new status, store it in the mpdclient struct */
- status = mpd_recv_status(connection);
+ status = mpdclient_recv_status(c);
if (status == NULL)
- return mpdclient_handle_error(c);
-
- if (c->status != NULL)
- mpd_status_free(c->status);
- c->status = status;
+ return false;
if (!mpd_response_finish(connection))
return mpdclient_handle_error(c);
reducing the UI latency */
playlist_clear(&c->playlist);
c->playlist.version = mpd_status_get_queue_version(status);
+ c->song = NULL;
}
c->events |= MPD_IDLE_QUEUE;
!mpd_response_next(connection))
return mpdclient_handle_error(c);
- c->events |= MPD_IDLE_PLAYLIST;
+ c->events |= MPD_IDLE_QUEUE;
- status = mpd_recv_status(connection);
- if (status != NULL) {
- if (c->status != NULL)
- mpd_status_free(c->status);
- c->status = status;
- }
+ status = mpdclient_recv_status(c);
+ if (status == NULL)
+ return false;
if (!mpd_response_next(connection))
return mpdclient_handle_error(c);
!mpd_command_list_end(connection))
return mpdclient_handle_error(c);
- c->events |= MPD_IDLE_PLAYLIST;
+ c->events |= MPD_IDLE_QUEUE;
- status = mpd_recv_status(connection);
- if (status != NULL) {
- if (c->status != NULL)
- mpd_status_free(c->status);
- c->status = status;
- }
+ status = mpdclient_recv_status(c);
+ if (status == NULL)
+ return false;
if (!mpd_response_finish(connection))
return mpdclient_handle_error(c);
!mpd_command_list_end(connection))
return mpdclient_handle_error(c);
- c->events |= MPD_IDLE_PLAYLIST;
+ c->events |= MPD_IDLE_QUEUE;
- status = mpd_recv_status(connection);
- if (status != NULL) {
- if (c->status != NULL)
- mpd_status_free(c->status);
- c->status = status;
- }
+ status = mpdclient_recv_status(c);
+ if (status == NULL)
+ return false;
if (!mpd_response_finish(connection))
return mpdclient_handle_error(c);
}
bool
-mpdclient_cmd_move(struct mpdclient *c, gint old_index, gint new_index)
+mpdclient_cmd_move(struct mpdclient *c, unsigned dest_pos, unsigned src_pos)
{
- struct mpd_connection *connection = mpdclient_get_connection(c);
- const struct mpd_song *song1, *song2;
+ struct mpd_connection *connection;
struct mpd_status *status;
- if (connection == NULL)
- return false;
+ if (dest_pos == src_pos)
+ return true;
- if (old_index == new_index || new_index < 0 ||
- (guint)new_index >= c->playlist.list->len)
+ connection = mpdclient_get_connection(c);
+ if (connection == NULL)
return false;
- song1 = playlist_get(&c->playlist, old_index);
- song2 = playlist_get(&c->playlist, new_index);
-
- /* send the delete command to mpd; at the same time, get the
+ /* send the "move" command to MPD; at the same time, get the
new status (to verify the playlist id) */
if (!mpd_command_list_begin(connection, false) ||
- !mpd_send_swap_id(connection, mpd_song_get_id(song1),
- mpd_song_get_id(song2)) ||
+ !mpd_send_move(connection, src_pos, dest_pos) ||
!mpd_send_status(connection) ||
!mpd_command_list_end(connection))
return mpdclient_handle_error(c);
- c->events |= MPD_IDLE_PLAYLIST;
+ c->events |= MPD_IDLE_QUEUE;
- status = mpd_recv_status(connection);
- if (status != NULL) {
- if (c->status != NULL)
- mpd_status_free(c->status);
- c->status = status;
- }
+ status = mpdclient_recv_status(c);
+ if (status == NULL)
+ return false;
if (!mpd_response_finish(connection))
return mpdclient_handle_error(c);
c->playlist.version = mpd_status_get_queue_version(status);
/* swap songs in the local playlist */
- playlist_swap(&c->playlist, old_index, new_index);
+ playlist_move(&c->playlist, dest_pos, src_pos);
}
return true;