X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fplaylist.c;h=c95f447080d7dab9bafa61afd556f22afc7f74de;hb=a35dc03de529843d2a974dec4d487a95a14ae00a;hp=76a448ba2fbc460e9e4a4418e48996b05106451b;hpb=fe8895120e565f83f18fb3c0af7a0bbbc881e5d9;p=ncmpc.git diff --git a/src/playlist.c b/src/playlist.c index 76a448b..c95f447 100644 --- a/src/playlist.c +++ b/src/playlist.c @@ -1,38 +1,30 @@ -/* - * $Id$ - * - * (c) 2004 by Kalle Wallin - * (c) 2008 Max Kellermann - * +/* ncmpc (Ncurses MPD Client) + * (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 * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ + + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ #include "playlist.h" -#include "mpdclient.h" -#include "ncmpc.h" #include -#define ENABLE_PLCHANGES - -#define MPD_ERROR(c) (c==NULL || c->connection==NULL || c->connection->error) - void playlist_init(struct mpdclient_playlist *playlist) { - playlist->id = 0; + playlist->version = 0; playlist->list = g_ptr_array_sized_new(1024); } @@ -41,44 +33,70 @@ playlist_clear(struct mpdclient_playlist *playlist) { guint i; + playlist->version = 0; + for (i = 0; i < playlist->list->len; ++i) { struct mpd_song *song = playlist_get(playlist, i); - mpd_freeSong(song); + mpd_song_free(song); } g_ptr_array_set_size(playlist->list, 0); } gint -mpdclient_playlist_free(mpdclient_playlist_t *playlist) +mpdclient_playlist_free(struct mpdclient_playlist *playlist) { if (playlist->list != NULL) { playlist_clear(playlist); g_ptr_array_free(playlist->list, TRUE); } - memset(playlist, 0, sizeof(mpdclient_playlist_t)); + memset(playlist, 0, sizeof(*playlist)); return 0; } -struct mpd_song * -playlist_get_song(mpdclient_t *c, gint idx) +const struct mpd_song * +playlist_get_song(const struct mpdclient_playlist *playlist, gint idx) { - if (idx < 0 || (guint)idx >= c->playlist.list->len) + if (idx < 0 || (guint)idx >= playlist_length(playlist)) return NULL; - return playlist_get(&c->playlist, idx); + return playlist_get(playlist, idx); } -struct mpd_song * -playlist_lookup_song(mpdclient_t *c, gint id) +void +playlist_move(struct mpdclient_playlist *playlist, + unsigned dest, unsigned src) { - guint i; + struct mpd_song *song; + + assert(playlist != NULL); + assert(src < playlist_length(playlist)); + assert(dest < playlist_length(playlist)); + assert(src != dest); + + song = playlist_get(playlist, src); + + if (src < dest) { + memmove(&playlist->list->pdata[src], + &playlist->list->pdata[src + 1], + sizeof(playlist->list->pdata[0]) * (dest - src)); + playlist->list->pdata[dest] = song; + } else { + memmove(&playlist->list->pdata[dest + 1], + &playlist->list->pdata[dest], + sizeof(playlist->list->pdata[0]) * (src - dest)); + playlist->list->pdata[dest] = song; + } +} - for (i = 0; i < c->playlist.list->len; ++i) { - struct mpd_song *song = playlist_get(&c->playlist, i); - if (song->id == id) +const struct mpd_song * +playlist_lookup_song(const struct mpdclient_playlist *playlist, unsigned id) +{ + for (guint i = 0; i < playlist_length(playlist); ++i) { + struct mpd_song *song = playlist_get(playlist, i); + if (mpd_song_get_id(song) == id) return song; } @@ -86,12 +104,24 @@ playlist_lookup_song(mpdclient_t *c, gint id) } gint -playlist_get_index(mpdclient_t *c, struct mpd_song *song) +playlist_get_index(const struct mpdclient_playlist *playlist, + const struct mpd_song *song) { - guint i; + for (guint i = 0; i < playlist_length(playlist); ++i) { + if (playlist_get(playlist, i) == song) + return (gint)i; + } + + return -1; +} - for (i = 0; i < c->playlist.list->len; ++i) { - if (playlist_get(&c->playlist, i) == song) +gint +playlist_get_index_from_id(const struct mpdclient_playlist *playlist, + unsigned id) +{ + for (guint i = 0; i < playlist_length(playlist); ++i) { + const struct mpd_song *song = playlist_get(playlist, i); + if (mpd_song_get_id(song) == id) return (gint)i; } @@ -99,13 +129,13 @@ playlist_get_index(mpdclient_t *c, struct mpd_song *song) } gint -playlist_get_index_from_id(mpdclient_t *c, gint id) +playlist_get_index_from_file(const struct mpdclient_playlist *playlist, + const gchar *filename) { - guint i; + for (guint i = 0; i < playlist_length(playlist); ++i) { + const struct mpd_song *song = playlist_get(playlist, i); - for (i = 0; i < c->playlist.list->len; ++i) { - struct mpd_song *song = playlist_get(&c->playlist, i); - if (song->id == id) + if (strcmp(mpd_song_get_uri(song), filename) == 0) return (gint)i; } @@ -113,14 +143,14 @@ playlist_get_index_from_id(mpdclient_t *c, gint id) } gint -playlist_get_index_from_file(mpdclient_t *c, gchar *filename) +playlist_get_id_from_uri(const struct mpdclient_playlist *playlist, + const gchar *uri) { - guint i; + for (guint i = 0; i < playlist_length(playlist); ++i) { + const struct mpd_song *song = playlist_get(playlist, i); - for (i = 0; i < c->playlist.list->len; ++i) { - struct mpd_song *song = playlist_get(&c->playlist, i); - if(strcmp(song->file, filename) == 0) - return (gint)i; + if (strcmp(mpd_song_get_uri(song), uri) == 0) + return mpd_song_get_id(song); } return -1;