42
42
#include "xmms/magic.h"
44
44
static void xmms_playlist_destroy (xmms_object_t *object);
45
static void xmms_playlist_shuffle (xmms_playlist_t *playlist, gchar *plname, xmms_error_t *err);
46
static void xmms_playlist_clear (xmms_playlist_t *playlist, gchar *plname, xmms_error_t *err);
47
static void xmms_playlist_sort (xmms_playlist_t *playlist, gchar *plname, GList *property, xmms_error_t *err);
48
static GList * xmms_playlist_list_entries (xmms_playlist_t *playlist, gchar *plname, xmms_error_t *err);
45
static void xmms_playlist_shuffle (xmms_playlist_t *playlist, const gchar *plname, xmms_error_t *err);
46
static void xmms_playlist_clear (xmms_playlist_t *playlist, const gchar *plname, xmms_error_t *err);
47
static void xmms_playlist_sort (xmms_playlist_t *playlist, const gchar *plname, xmmsv_t *property, xmms_error_t *err);
48
static GList * xmms_playlist_list_entries (xmms_playlist_t *playlist, const gchar *plname, xmms_error_t *err);
49
static gchar *xmms_playlist_current_active (xmms_playlist_t *playlist, xmms_error_t *err);
49
50
static void xmms_playlist_destroy (xmms_object_t *object);
50
gboolean xmms_playlist_remove (xmms_playlist_t *playlist, gchar *plname, guint pos, xmms_error_t *err);
51
static gboolean xmms_playlist_remove_unlocked (xmms_playlist_t *playlist, const gchar *plname, xmmsc_coll_t *plcoll, guint pos, xmms_error_t *err);
52
static gboolean xmms_playlist_move (xmms_playlist_t *playlist, gchar *plname, guint pos, guint newpos, xmms_error_t *err);
53
static guint xmms_playlist_set_current_position_rel (xmms_playlist_t *playlist, gint32 pos, xmms_error_t *error);
54
static guint xmms_playlist_set_current_position_do (xmms_playlist_t *playlist, guint32 pos, xmms_error_t *err);
56
static gboolean xmms_playlist_insert_url (xmms_playlist_t *playlist, gchar *plname, guint32 pos, gchar *url, xmms_error_t *error);
57
static gboolean xmms_playlist_insert_id (xmms_playlist_t *playlist, gchar *plname, guint32 pos, xmms_medialib_entry_t file, xmms_error_t *error);
58
static gboolean xmms_playlist_insert_collection (xmms_playlist_t *playlist, gchar *plname, guint32 pos, xmmsc_coll_t *coll, GList *order, xmms_error_t *error);
59
static void xmms_playlist_radd (xmms_playlist_t *playlist, gchar *plname, gchar *path, xmms_error_t *error);
61
static void xmms_playlist_load (xmms_playlist_t *, gchar *, xmms_error_t *);
63
static xmmsc_coll_t *xmms_playlist_get_coll (xmms_playlist_t *playlist, const gchar *plname, xmms_error_t *error);
51
gboolean xmms_playlist_remove (xmms_playlist_t *playlist, const gchar *plname, guint pos, xmms_error_t *err);
52
static gboolean xmms_playlist_remove_unlocked (xmms_playlist_t *playlist, const gchar *plname, xmmsv_coll_t *plcoll, guint pos, xmms_error_t *err);
53
static gboolean xmms_playlist_move (xmms_playlist_t *playlist, const gchar *plname, guint pos, guint newpos, xmms_error_t *err);
54
static gint xmms_playlist_set_current_position_rel (xmms_playlist_t *playlist, gint32 pos, xmms_error_t *error);
55
static gint xmms_playlist_set_current_position_do (xmms_playlist_t *playlist, guint32 pos, xmms_error_t *err);
57
static gboolean xmms_playlist_insert_url (xmms_playlist_t *playlist, const gchar *plname, guint32 pos, const gchar *url, xmms_error_t *error);
58
static gboolean xmms_playlist_insert_id (xmms_playlist_t *playlist, const gchar *plname, guint32 pos, xmms_medialib_entry_t file, xmms_error_t *error);
59
static gboolean xmms_playlist_insert_collection (xmms_playlist_t *playlist, const gchar *plname, guint32 pos, xmmsv_coll_t *coll, xmmsv_t *order, xmms_error_t *error);
60
static void xmms_playlist_radd (xmms_playlist_t *playlist, const gchar *plname, const gchar *path, xmms_error_t *error);
61
static void xmms_playlist_rinsert (xmms_playlist_t *playlist, const gchar *plname, guint32 pos, const gchar *path, xmms_error_t *error);
63
static void xmms_playlist_load (xmms_playlist_t *, const gchar *, xmms_error_t *);
65
static xmmsv_coll_t *xmms_playlist_get_coll (xmms_playlist_t *playlist, const gchar *plname, xmms_error_t *error);
64
66
static const gchar *xmms_playlist_canonical_name (xmms_playlist_t *playlist, const gchar *plname);
65
static gint xmms_playlist_coll_get_currpos (xmmsc_coll_t *plcoll);
66
static gint xmms_playlist_coll_get_size (xmmsc_coll_t *plcoll);
67
static gint xmms_playlist_coll_get_currpos (xmmsv_coll_t *plcoll);
68
static gint xmms_playlist_coll_get_size (xmmsv_coll_t *plcoll);
68
static void xmms_playlist_update_queue (xmms_playlist_t *playlist, const gchar *plname, xmmsc_coll_t *coll);
69
static void xmms_playlist_update_partyshuffle (xmms_playlist_t *playlist, const gchar *plname, xmmsc_coll_t *coll);
70
static void xmms_playlist_update_queue (xmms_playlist_t *playlist, const gchar *plname, xmmsv_coll_t *coll);
71
static void xmms_playlist_update_partyshuffle (xmms_playlist_t *playlist, const gchar *plname, xmmsv_coll_t *coll);
71
73
static void xmms_playlist_current_pos_msg_send (xmms_playlist_t *playlist, GTree *dict);
72
74
static GTree * xmms_playlist_current_pos_msg_new (xmms_playlist_t *playlist, guint32 pos, const gchar *plname);
74
76
XMMS_CMD_DEFINE (load, xmms_playlist_load, xmms_playlist_t *, NONE, STRING, NONE);
75
XMMS_CMD_DEFINE3 (insert_url, xmms_playlist_insert_url, xmms_playlist_t *, NONE, STRING, UINT32, STRING);
76
XMMS_CMD_DEFINE3 (insert_id, xmms_playlist_insert_id, xmms_playlist_t *, NONE, STRING, UINT32, UINT32);
77
XMMS_CMD_DEFINE4 (insert_coll, xmms_playlist_insert_collection, xmms_playlist_t *, NONE, STRING, UINT32, COLL, STRINGLIST);
77
XMMS_CMD_DEFINE3 (insert_url, xmms_playlist_insert_url, xmms_playlist_t *, NONE, STRING, INT32, STRING);
78
XMMS_CMD_DEFINE3 (insert_id, xmms_playlist_insert_id, xmms_playlist_t *, NONE, STRING, INT32, INT32);
79
XMMS_CMD_DEFINE4 (insert_coll, xmms_playlist_insert_collection, xmms_playlist_t *, NONE, STRING, INT32, COLL, LIST);
78
80
XMMS_CMD_DEFINE (shuffle, xmms_playlist_shuffle, xmms_playlist_t *, NONE, STRING, NONE);
79
XMMS_CMD_DEFINE (remove, xmms_playlist_remove, xmms_playlist_t *, NONE, STRING, UINT32);
80
XMMS_CMD_DEFINE3 (move, xmms_playlist_move, xmms_playlist_t *, NONE, STRING, UINT32, UINT32);
81
XMMS_CMD_DEFINE (remove, xmms_playlist_remove, xmms_playlist_t *, NONE, STRING, INT32);
82
XMMS_CMD_DEFINE3 (move, xmms_playlist_move, xmms_playlist_t *, NONE, STRING, INT32, INT32);
81
83
XMMS_CMD_DEFINE (add_url, xmms_playlist_add_url, xmms_playlist_t *, NONE, STRING, STRING);
82
XMMS_CMD_DEFINE (add_id, xmms_playlist_add_id, xmms_playlist_t *, NONE, STRING, UINT32);
84
XMMS_CMD_DEFINE (add_id, xmms_playlist_add_id, xmms_playlist_t *, NONE, STRING, INT32);
83
85
XMMS_CMD_DEFINE (add_idlist, xmms_playlist_add_idlist, xmms_playlist_t *, NONE, STRING, COLL);
84
XMMS_CMD_DEFINE3 (add_coll, xmms_playlist_add_collection, xmms_playlist_t *, NONE, STRING, COLL, STRINGLIST);
86
XMMS_CMD_DEFINE3 (add_coll, xmms_playlist_add_collection, xmms_playlist_t *, NONE, STRING, COLL, LIST);
85
87
XMMS_CMD_DEFINE (clear, xmms_playlist_clear, xmms_playlist_t *, NONE, STRING, NONE);
86
XMMS_CMD_DEFINE (sort, xmms_playlist_sort, xmms_playlist_t *, NONE, STRING, STRINGLIST);
88
XMMS_CMD_DEFINE (sort, xmms_playlist_sort, xmms_playlist_t *, NONE, STRING, LIST);
87
89
XMMS_CMD_DEFINE (list_entries, xmms_playlist_list_entries, xmms_playlist_t *, LIST, STRING, NONE);
88
90
XMMS_CMD_DEFINE (current_pos, xmms_playlist_current_pos, xmms_playlist_t *, DICT, STRING, NONE);
89
91
XMMS_CMD_DEFINE (current_active, xmms_playlist_current_active, xmms_playlist_t *, STRING, NONE, NONE);
90
XMMS_CMD_DEFINE (set_pos, xmms_playlist_set_current_position, xmms_playlist_t *, UINT32, UINT32, NONE);
91
XMMS_CMD_DEFINE (set_pos_rel, xmms_playlist_set_current_position_rel, xmms_playlist_t *, UINT32, INT32, NONE);
92
XMMS_CMD_DEFINE (set_pos, xmms_playlist_set_current_position, xmms_playlist_t *, INT32, INT32, NONE);
93
XMMS_CMD_DEFINE (set_pos_rel, xmms_playlist_set_current_position_rel, xmms_playlist_t *, INT32, INT32, NONE);
92
94
XMMS_CMD_DEFINE (radd, xmms_playlist_radd, xmms_playlist_t *, NONE, STRING, STRING);
95
XMMS_CMD_DEFINE3 (rinsert, xmms_playlist_rinsert, xmms_playlist_t *, NONE, STRING, INT32, STRING);
94
97
#define XMMS_PLAYLIST_CHANGED_MSG(type, id, name) xmms_playlist_changed_msg_send (playlist, xmms_playlist_changed_msg_new (playlist, type, id, name))
95
98
#define XMMS_PLAYLIST_CURRPOS_MSG(pos, name) xmms_playlist_current_pos_msg_send (playlist, xmms_playlist_current_pos_msg_new (playlist, pos, name))
892
942
* @returns TRUE on success and FALSE otherwise.
895
xmms_playlist_insert_id (xmms_playlist_t *playlist, gchar *plname, guint32 pos,
896
xmms_medialib_entry_t file, xmms_error_t *err)
945
xmms_playlist_insert_id (xmms_playlist_t *playlist, const gchar *plname,
946
guint32 pos, xmms_medialib_entry_t file,
949
if (!xmms_medialib_check_id (file)) {
950
xmms_error_set (err, XMMS_ERROR_NOENT,
951
"That is not a valid medialib id!");
955
xmms_playlist_insert_entry (playlist, plname, pos, file, err);
961
xmms_playlist_insert_collection (xmms_playlist_t *playlist, const gchar *plname,
962
guint32 pos, xmmsv_coll_t *coll,
963
xmmsv_t *order, xmms_error_t *err)
967
res = xmms_collection_query_ids (playlist->colldag, coll, 0, 0, order, err);
970
xmmsv_t *val = (xmmsv_t*) res->data;
972
xmmsv_get_int (val, &id);
973
xmms_playlist_insert_id (playlist, plname, pos, id, err);
976
res = g_list_delete_link (res, res);
980
/* FIXME: detect errors? */
985
* Insert an entry at a given position in the playlist without
991
xmms_playlist_insert_entry (xmms_playlist_t *playlist, const gchar *plname,
992
guint32 pos, xmms_medialib_entry_t file,
901
xmmsc_coll_t *plcoll;
903
if (!xmms_medialib_check_id (file)) {
904
xmms_error_set (err, XMMS_ERROR_NOENT,
905
"That is not a valid medialib id!");
998
xmmsv_coll_t *plcoll;
909
1000
g_mutex_lock (playlist->mutex);
920
1011
xmms_error_set (err, XMMS_ERROR_GENERIC,
921
1012
"Could not insert entry outside of playlist!");
922
1013
g_mutex_unlock (playlist->mutex);
925
xmmsc_coll_idlist_insert (plcoll, pos, file);
1016
xmmsv_coll_idlist_insert (plcoll, pos, file);
927
1018
/** propagate the MID ! */
928
1019
dict = xmms_playlist_changed_msg_new (playlist, XMMS_PLAYLIST_CHANGED_INSERT, file, plname);
929
g_tree_insert (dict, (gpointer) "position",
930
xmms_object_cmd_value_int_new (pos));
1020
g_tree_insert (dict, (gpointer) "position", xmmsv_new_int (pos));
931
1021
xmms_playlist_changed_msg_send (playlist, dict);
933
1023
/** update position once client is familiar with the new item. */
934
1024
currpos = xmms_playlist_coll_get_currpos (plcoll);
935
1025
if (pos <= currpos) {
936
xmms_playlist_set_current_position_do (playlist, currpos + 1, err);
1027
xmms_collection_set_int_attr (plcoll, "position", currpos);
1028
XMMS_PLAYLIST_CURRPOS_MSG (currpos, plname);
939
1031
g_mutex_unlock (playlist->mutex);
944
xmms_playlist_insert_collection (xmms_playlist_t *playlist, gchar *plname,
945
guint32 pos, xmmsc_coll_t *coll, GList *order,
950
res = xmms_collection_query_ids (playlist->colldag, coll, 0, 0, order, err);
953
xmms_object_cmd_value_t *val = (xmms_object_cmd_value_t*)res->data;
954
xmms_playlist_insert_id (playlist, plname, pos, val->value.int32, err);
955
xmms_object_cmd_value_unref (val);
957
res = g_list_delete_link (res, res);
960
/* FIXME: detect errors? */