2 // C++ Implementation: playlist
4 // Author: Oliver Groß <z.o.gross@gmx.de>, (C) 2008
6 // Copyright: See COPYING file that comes with this distribution
14 QPlaylist::QPlaylist(QClient
* parent
) : QObject(parent
), m_Connection(0) {
15 connect(parent
, SIGNAL(connectionChanged(xmmsc_connection_t
*)),
16 this, SLOT(setConnection(xmmsc_connection_t
*)));
19 QPlaylist::~QPlaylist() {
22 void QPlaylist::loadedCallback(xmmsc_result_t
*, void * instance
) {
24 static_cast<QPlaylist
*>(instance
)->reset();
26 //xmmsc_result_unref(result);
29 void QPlaylist::changedCallback(xmmsc_result_t
* result
, void * instance
) {
31 QPlaylist
* playlist
= static_cast<QPlaylist
*>(instance
);
32 xmms_playlist_changed_actions_t type
;
33 xmmsc_result_get_dict_entry_uint(result
, "type", (quint32
*)(&type
));
36 case XMMS_PLAYLIST_CHANGED_ADD
:
40 xmmsc_result_get_dict_entry_uint(result
, "id", &id
);
41 emit playlist
->entryAboutToBeInserted(playlist
->m_IDList
.size(), id
);
42 playlist
->m_IDList
<< id
;
43 // emit playlist->entryAppended(id);
44 emit playlist
->entryInserted(playlist
->m_IDList
.size(), id
);
47 case XMMS_PLAYLIST_CHANGED_INSERT
:
51 xmmsc_result_get_dict_entry_uint(result
, "position", &position
);
52 xmmsc_result_get_dict_entry_uint(result
, "id", &id
);
53 emit playlist
->entryAboutToBeInserted(position
, id
);
54 playlist
->m_IDList
.insert(position
, id
);
55 emit playlist
->entryInserted(position
, id
);
58 case XMMS_PLAYLIST_CHANGED_UPDATE
:
60 quint32 position
, oldid
;
62 xmmsc_result_get_dict_entry_uint(result
, "position", &position
);
63 oldid
= playlist
->m_IDList
[position
];
64 xmmsc_result_get_dict_entry_uint(result
, "id", &playlist
->m_IDList
[position
]);
65 emit playlist
->entryUpdated(position
, oldid
);
68 case XMMS_PLAYLIST_CHANGED_REMOVE
:
72 xmmsc_result_get_dict_entry_uint(result
, "position", &position
);
73 id
= playlist
->m_IDList
[position
];
74 emit playlist
->entryAboutToBeRemoved(position
, id
);
75 playlist
->m_IDList
.removeAt(position
);
76 emit playlist
->entryRemoved(position
, id
);
79 case XMMS_PLAYLIST_CHANGED_MOVE
:
83 xmmsc_result_get_dict_entry_uint(result
, "position", &from
);
84 xmmsc_result_get_dict_entry_uint(result
, "newposition", &from
);
85 playlist
->m_IDList
.move(from
, to
);
86 emit playlist
->entryMoved(from
, to
);
89 case XMMS_PLAYLIST_CHANGED_SORT
:
90 case XMMS_PLAYLIST_CHANGED_SHUFFLE
:
91 case XMMS_PLAYLIST_CHANGED_CLEAR
:
98 //xmmsc_result_unref(result);
101 void QPlaylist::fillIDListCallback(xmmsc_result_t
* result
, void * instance
) {
103 QPlaylist
* playlist
= static_cast<QPlaylist
*>(instance
);
107 xmmsc_result_t
* i
= result
;
108 while (xmmsc_result_list_valid(i
)) {
109 xmmsc_result_get_uint(i
, &buffer
);
110 playlist
->m_IDList
<< buffer
;
111 xmmsc_result_list_next(i
);
114 emit playlist
->reseted();
116 //xmmsc_result_unref(result);
119 void QPlaylist::currentPosCallback(xmmsc_result_t
* result
, void * instance
) {
121 QPlaylist
* playlist
= static_cast<QPlaylist
*>(instance
);
122 xmmsc_result_get_uint(result
, &playlist
->m_Position
);
123 emit playlist
->currentChanged(playlist
->m_Position
);
125 //xmmsc_result_unref(result);
128 void QPlaylist::setConnection(xmmsc_connection_t
* connection
) {
129 if (m_Connection
== connection
)
134 disconnectNotifierUnref(xmmsc_broadcast_playlist_loaded(m_Connection
));
135 disconnectNotifierUnref(xmmsc_broadcast_playlist_changed(m_Connection
));
136 disconnectNotifierUnref(xmmsc_broadcast_playlist_current_pos(m_Connection
));
139 m_Connection
= connection
;
146 connectNotifierUnref(xmmsc_broadcast_playlist_loaded(m_Connection
), loadedCallback
, this);
147 connectNotifierUnref(xmmsc_broadcast_playlist_changed(m_Connection
), changedCallback
, this);
148 connectNotifierUnref(xmmsc_broadcast_playlist_current_pos(m_Connection
), currentPosCallback
, this);
150 connectNotifierUnref(xmmsc_playlist_list_entries(m_Connection
, NULL
), fillIDListCallback
, this);
151 connectNotifierUnref(xmmsc_playlist_current_pos(m_Connection
, NULL
), currentPosCallback
, this);
155 emit
currentChanged(0);
159 void QPlaylist::reset() {
163 connectNotifierUnref(xmmsc_playlist_list_entries(m_Connection
, NULL
), fillIDListCallback
, this);
164 connectNotifierUnref(xmmsc_playlist_current_pos(m_Connection
, NULL
), currentPosCallback
, this);
169 void QPlaylist::append(quint32 id
) {
170 xmmsc_result_unref(xmmsc_playlist_add_id(m_Connection
, NULL
, id
));
173 void QPlaylist::append(QString url
) {
174 xmmsc_result_unref(xmmsc_playlist_add_url(m_Connection
, NULL
, url
.toAscii().data()));
177 void QPlaylist::append(QStringList urls
) {
178 foreach(QString i
, urls
)
182 void QPlaylist::append(QList
<quint32
> ids
) {
183 foreach(quint32 i
, ids
)
187 void QPlaylist::appendRecursive(QString directory
) {
188 xmmsc_result_unref(xmmsc_playlist_radd(m_Connection
, NULL
, directory
.toAscii().data()));
191 void QPlaylist::insert(quint32 id
, quint32 position
) {
192 xmmsc_result_unref(xmmsc_playlist_insert_id(m_Connection
, NULL
, position
, id
));
195 void QPlaylist::insert(QString url
, quint32 position
) {
196 xmmsc_result_unref(xmmsc_playlist_insert_url(m_Connection
, NULL
, position
, url
.toAscii().data()));
199 void QPlaylist::insert(QList
<quint32
> ids
, quint32 position
) {
200 if (ids
.count() == 0)
203 QList
<quint32
>::iterator i
= ids
.end();
206 insert(*i
, position
);
208 while (i
!= ids
.begin());
211 void QPlaylist::insert(QStringList urls
, quint32 position
) {
212 if (urls
.count() == 0)
215 QStringList::iterator i
= urls
.end();
218 insert(*i
, position
);
220 while (i
!= urls
.begin());
223 void QPlaylist::remove(quint32 position
) {
224 xmmsc_result_unref(xmmsc_playlist_remove_entry(m_Connection
, NULL
, position
));
227 void QPlaylist::move(quint32 from
, quint32 to
) {
228 xmmsc_result_unref(xmmsc_playlist_move_entry(m_Connection
, NULL
, from
, to
));
231 void QPlaylist::clear() {
232 xmmsc_result_unref(xmmsc_playlist_clear(m_Connection
, NULL
));
235 /* void QPlaylist::sort(QStringList properties) {
236 xmmsc_result_unref(xmmsc_playlist_sort(m_Connection, "Default"));
239 void QPlaylist::randomize() {
240 xmmsc_result_unref(xmmsc_playlist_shuffle(m_Connection
, NULL
));
243 void QPlaylist::setNext(quint32 position
) {
244 xmmsc_result_unref(xmmsc_playlist_set_next(m_Connection
, position
));