2 // C++ Implementation: medialib
4 // Author: Oliver Groß <z.o.gross@gmx.de>, (C) 2008
6 // Copyright: See COPYING file that comes with this distribution
13 QMedialib::QMedialib(QClient
* parent
) : QObject(parent
), m_Connection(0) {
14 connect(parent
, SIGNAL(connectionChanged(xmmsc_connection_t
*)),
15 this, SLOT(setConnection(xmmsc_connection_t
*)));
18 QMedialib::~QMedialib() {
20 foreach(QPlaylist
* i
, m_Playlists
)
25 void QMedialib::playlistChangedCallback(xmmsc_result_t
* result
, void * instance
) {
27 QMedialib
* medialib
= static_cast<QMedialib
*>(instance
);
29 xmmsc_result_get_dict_entry_string(result
, "name", &strBuffer
);
30 QString name
= strBuffer
;
31 QPlaylist::changedCallback(result
, medialib
->m_Playlists
[name
]);
35 void QMedialib::currentPosCallback(xmmsc_result_t
* result
, void * instance
) {
37 QMedialib
* medialib
= static_cast<QMedialib
*>(instance
);
39 QPlaylist::currentPosCallback(result
, medialib
->m_ActivePlaylist
);
41 //xmmsc_result_unref(result);
44 void QMedialib::activePlaylistCallback(xmmsc_result_t
* result
, void * instance
) {
46 QMedialib
* medialib
= static_cast<QMedialib
*>(instance
);
48 xmmsc_result_get_string(result
, &strBuffer
);
49 medialib
->m_ActivePlaylist
= medialib
->m_Playlists
[QString(strBuffer
)];
51 emit medialib
->activePlaylistChanged();
53 //xmmsc_result_unref(result);
56 void QMedialib::fillPlaylists(xmmsc_result_t
* result
, void * instance
) {
58 QMedialib
* medialib
= static_cast<QMedialib
*>(instance
);
62 xmmsc_result_t
* i
= result
;
63 while (xmmsc_result_list_valid(i
)) {
64 xmmsc_result_get_string(i
, &strBuffer
);
65 medialib
->m_Playlists
.insert(QString(strBuffer
), new QPlaylist((QClient
*)(medialib
->parent()), QString(strBuffer
)));
66 xmmsc_result_list_next(i
);
68 emit medialib
->playlistsReseted();
72 void QMedialib::collectionChangedCallback(xmmsc_result_t
* result
, void * instance
) {
74 QMedialib
* medialib
= static_cast<QMedialib
*>(instance
);
76 xmms_collection_changed_actions_t type
;
77 xmmsc_result_get_dict_entry_int(result
, "type", (qint32
*)(&type
));
81 xmmsc_result_get_dict_entry_string(result
, "namespace", &strBuffer
);
82 QString collNamespace
= strBuffer
;
84 xmmsc_result_get_dict_entry_string(result
, "name", &strBuffer
);
85 QString collName
= strBuffer
;
87 //currently we only support playlists
88 if (QString(collNamespace
) != "Playlists")
92 case XMMS_COLLECTION_CHANGED_ADD
:
93 medialib
->m_Playlists
.insert(collName
, new QPlaylist((QClient
*)(medialib
->parent()), collName
));
94 emit medialib
->collectionAdded(collName
);
96 case XMMS_COLLECTION_CHANGED_RENAME
:
97 xmmsc_result_get_dict_entry_string(result
, "newname", &strBuffer
);
99 QString collNewName
= strBuffer
;
100 medialib
->m_Playlists
.insert(collNewName
, medialib
->m_Playlists
.take(collName
));
102 emit medialib
->collectionRenamed(collName
, collNewName
);
105 case XMMS_COLLECTION_CHANGED_UPDATE
:
106 emit medialib
->collectionUpdated(collName
);
108 case XMMS_COLLECTION_CHANGED_REMOVE
:
109 if (medialib
->m_Playlists
.contains(collName
)) {
110 delete medialib
->m_Playlists
.take(collName
);
111 emit medialib
->collectionRemoved(collName
);
120 void QMedialib::recievedMediaInfoCallback(xmmsc_result_t
* result
, void * instance
) {
122 QMedialib
* medialib
= static_cast<QMedialib
*>(instance
);
126 xmmsc_result_get_dict_entry_int(result
, "id", &id
);
127 MediaInfo
* newMediaInfo
= new MediaInfo();
129 xmmsc_result_get_dict_entry_string(result
, "genre", &strBuffer
);
130 newMediaInfo
->genre
= strBuffer
;
131 xmmsc_result_get_dict_entry_string(result
, "album", &strBuffer
);
132 newMediaInfo
->album
= strBuffer
;
133 xmmsc_result_get_dict_entry_string(result
, "artist", &strBuffer
);
134 newMediaInfo
->artist
= strBuffer
;
135 xmmsc_result_get_dict_entry_string(result
, "title", &strBuffer
);
136 newMediaInfo
->title
= strBuffer
;
138 xmmsc_result_get_dict_entry_int(result
, "duration", &intBuffer
);
139 newMediaInfo
->duration
= intBuffer
;
140 xmmsc_result_get_dict_entry_int(result
, "channels", &intBuffer
);
141 newMediaInfo
->channels
= intBuffer
;
142 xmmsc_result_get_dict_entry_int(result
, "samplerate", &intBuffer
);
143 newMediaInfo
->sampleRate
= intBuffer
;
144 xmmsc_result_get_dict_entry_int(result
, "sample_format", &intBuffer
);
145 newMediaInfo
->sampleFormat
= intBuffer
;
147 medialib
->m_CachedMedia
.insert(id
, newMediaInfo
);
148 emit medialib
->mediaInfoReady(id
);
150 xmmsc_result_unref(result
);
153 void QMedialib::setConnection(xmmsc_connection_t
* connection
) {
154 if (m_Connection
== connection
)
159 disconnectNotifierUnref(xmmsc_broadcast_playlist_loaded(m_Connection
));
160 disconnectNotifierUnref(xmmsc_broadcast_playlist_changed(m_Connection
));
161 disconnectNotifierUnref(xmmsc_broadcast_playlist_current_pos(m_Connection
));
162 disconnectNotifierUnref(xmmsc_broadcast_collection_changed(m_Connection
));
165 m_Connection
= connection
;
169 connectNotifierUnref(xmmsc_broadcast_playlist_loaded(m_Connection
), activePlaylistCallback
, this);
170 connectNotifierUnref(xmmsc_broadcast_playlist_changed(m_Connection
), playlistChangedCallback
, this);
171 connectNotifierUnref(xmmsc_broadcast_playlist_current_pos(m_Connection
), currentPosCallback
, this);
172 connectNotifierUnref(xmmsc_broadcast_collection_changed(m_Connection
), collectionChangedCallback
, this);
174 connectNotifierUnref(xmmsc_playlist_list(m_Connection
), fillPlaylists
, this);
180 void QMedialib::setActivePlaylist(QString name
) {
181 xmmsc_result_unref(xmmsc_playlist_load(m_Connection
, name
.toAscii().data()));
184 void QMedialib::clearMediaInfo() {
185 foreach (MediaInfo
* i
, m_CachedMedia
)
187 m_CachedMedia
.clear();
190 void QMedialib::removeMediaInfo(quint32 id
) {
191 delete m_CachedMedia
.take(id
);
194 bool QMedialib::checkMediaInfo(quint32 id
) {
195 if (m_CachedMedia
.contains(id
))
198 requestMediaInfo(id
);
203 void QMedialib::requestMediaInfo(quint32 id
) {
204 connectNotifierUnref(xmmsc_medialib_get_info(m_Connection
, id
), recievedMediaInfoCallback
, this);