/* * Copyright 2016 (c) Anna Schumaker. * * NOTE: The playlist_iter type is defined in include/core/playlists/playlist.h */ #ifndef OCARINA_CORE_PLAYLISTS_ITERATOR_H #define OCARINA_CORE_PLAYLISTS_ITERATOR_H #include /* Called to set the playlist iterator to a specific position. */ static inline playlist_iter playlist_iter_get(struct playlist *playlist, unsigned int n) { return playlist ? g_queue_peek_nth_link(&playlist->pl_tracks, n) : NULL; } /* Called to advance the requested playlist iterator. */ static inline playlist_iter playlist_iter_next(playlist_iter iter) { return g_list_next(iter); } /* Called to get a pointer to the track at the requested iterator. */ static inline struct track *playlist_iter_track(playlist_iter iter) { return iter ? iter->data : NULL; } /* Called to find the playlist index of the requested iterator. */ static inline int playlist_iter_index(struct playlist *playlist, playlist_iter iter) { return (playlist && iter) ? g_queue_link_index(&playlist->pl_tracks, iter) : -1; } /* Called to iterate over the entire playlist. */ #define playlist_for_each(playlist, it) \ for (it = playlist_iter_get(playlist, 0); it; it = playlist_iter_next(it)) /* Called to set the index of the current track. */ static inline bool playlist_current_set(struct playlist *playlist, unsigned int n) { if (playlist) playlist->pl_current = playlist_iter_get(playlist, n); return playlist && playlist->pl_current; } /* Called to advance the current track. */ static inline bool playlist_current_next(struct playlist *playlist) { if (playlist) playlist->pl_current = playlist_iter_next(playlist->pl_current); return playlist && playlist->pl_current; } /* Called to rewind the current track. */ static inline bool playlist_current_previous(struct playlist *playlist) { if (playlist) playlist->pl_current = g_list_previous(playlist->pl_current); return playlist && playlist->pl_current; } /* Called to get a pointer to the current track. */ static inline struct track *playlist_current_track(struct playlist *playlist) { return playlist ? playlist_iter_track(playlist->pl_current) : NULL; } /* Called to get the playlist index of the current track. */ static inline int playlist_current_index(struct playlist *playlist) { return playlist ? playlist_iter_index(playlist, playlist->pl_current) : -1; } /* Called to find the nth track on a playlist. */ static inline struct track *playlist_at(struct playlist *playlist, unsigned int n) { return playlist_iter_track(playlist_iter_get(playlist, n)); } #endif /* OCARINA_CORE_PLAYLISTS_ITERATOR_H */