Code

meson.build: define _GNU_SOURCE for getaddrinfo() and sigaction() with glibc
[ncmpc.git] / src / playlist.h
index 946ca631c44b6138ec78d911f90510a9fb55894c..e0d8ca5718e650937f29306010ee22506afdc424 100644 (file)
@@ -1,8 +1,6 @@
-/*
- * $Id$
- *
- * (c) 2004 by Kalle Wallin <kaw@linux.se>
- * (c) 2008 Max Kellermann <max@duempel.org>
+/* ncmpc (Ncurses MPD Client)
+ * (c) 2004-2017 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
  * 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.
  */
 
 #ifndef MPDCLIENT_PLAYLIST_H
 #define MPDCLIENT_PLAYLIST_H
 
-#include "libmpdclient.h"
-
-#include <glib.h>
+#include "Compiler.h"
 
-struct mpdclient;
+#include <mpd/client.h>
 
-typedef struct mpdclient_playlist {
-       /* playlist id */
-       long long id;
+#include <assert.h>
+#include <glib.h>
 
-       /* true if the list is updated */
-       gboolean updated;
+struct mpdclient_playlist {
+       /* queue version number (obtained from mpd_status) */
+       unsigned version;
 
        /* the list */
-       GArray *list;
-} mpdclient_playlist_t;
+       GPtrArray *list;
+};
 
 void
 playlist_init(struct mpdclient_playlist *playlist);
@@ -47,16 +43,107 @@ void
 playlist_clear(struct mpdclient_playlist *playlist);
 
 /* free a playlist */
-gint mpdclient_playlist_free(mpdclient_playlist_t *playlist);
-
-struct mpd_song *playlist_lookup_song(struct mpdclient *c, gint id);
+gint
+mpdclient_playlist_free(struct mpdclient_playlist *playlist);
+
+static inline guint
+playlist_length(const struct mpdclient_playlist *playlist)
+{
+       assert(playlist != NULL);
+       assert(playlist->list != NULL);
+
+       return playlist->list->len;
+}
+
+static inline gboolean
+playlist_is_empty(const struct mpdclient_playlist *playlist)
+{
+       return playlist_length(playlist) == 0;
+}
+
+static inline struct mpd_song *
+playlist_get(const struct mpdclient_playlist *playlist, guint idx)
+{
+       assert(idx < playlist_length(playlist));
+
+       return g_ptr_array_index(playlist->list, idx);
+}
+
+static inline void
+playlist_append(struct mpdclient_playlist *playlist, const struct mpd_song *song)
+{
+       g_ptr_array_add(playlist->list, mpd_song_dup(song));
+}
+
+static inline void
+playlist_set(const struct mpdclient_playlist *playlist, guint idx,
+            const struct mpd_song *song)
+{
+       assert(idx < playlist_length(playlist));
+
+       g_ptr_array_index(playlist->list, idx) = mpd_song_dup(song);
+}
+
+static inline void
+playlist_replace(struct mpdclient_playlist *playlist, guint idx,
+                const struct mpd_song *song)
+{
+       mpd_song_free(playlist_get(playlist, idx));
+       playlist_set(playlist, idx, song);
+}
+
+static inline struct mpd_song *
+playlist_remove_reuse(struct mpdclient_playlist *playlist, guint idx)
+{
+       return g_ptr_array_remove_index(playlist->list, idx);
+}
+
+static inline void
+playlist_remove(struct mpdclient_playlist *playlist, guint idx)
+{
+       mpd_song_free(playlist_remove_reuse(playlist, idx));
+}
 
-struct mpd_song *playlist_get_song(struct mpdclient *c, gint index);
-
-gint playlist_get_index(struct mpdclient *c, struct mpd_song *song);
-
-gint playlist_get_index_from_id(struct mpdclient *c, gint id);
-
-gint playlist_get_index_from_file(struct mpdclient *c, gchar *filename);
+void
+playlist_move(struct mpdclient_playlist *playlist,
+             unsigned dest, unsigned src);
+
+const struct mpd_song *
+playlist_lookup_song(const struct mpdclient_playlist *playlist, unsigned id);
+
+const struct mpd_song *
+playlist_get_song(const struct mpdclient_playlist *playlist, gint index);
+
+gint
+playlist_get_index(const struct mpdclient_playlist *playlist,
+                  const struct mpd_song *song);
+
+gint
+playlist_get_index_from_id(const struct mpdclient_playlist *playlist,
+                          unsigned id);
+
+gint
+playlist_get_index_from_file(const struct mpdclient_playlist *playlist,
+                            const gchar *filename);
+
+static inline gint
+playlist_get_index_from_same_song(const struct mpdclient_playlist *playlist,
+                                 const struct mpd_song *song)
+{
+       return playlist_get_index_from_file(playlist, mpd_song_get_uri(song));
+}
+
+gcc_pure
+gint
+playlist_get_id_from_uri(const struct mpdclient_playlist *playlist,
+                        const gchar *uri);
+
+gcc_pure
+static inline gint
+playlist_get_id_from_same_song(const struct mpdclient_playlist *playlist,
+                              const struct mpd_song *song)
+{
+       return playlist_get_id_from_uri(playlist, mpd_song_get_uri(song));
+}
 
 #endif