1 /*
2 * %kadu copyright begin%
3 * Copyright 2011, 2013 Bartosz Brachaczek (b.brachaczek@gmail.com)
4 * Copyright 2011, 2013, 2014 Rafał Przemysław Malinowski (rafal.przemyslaw.malinowski@gmail.com)
5 * %kadu copyright end%
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation; either version 2 of
10 * the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include "plugins/mediaplayer/mediaplayer.h"
22
23 #include "mpd-mediaplayer.h"
24
25 #include "configuration/configuration.h"
26
MPDMediaPlayer(QObject * parent)27 MPDMediaPlayer::MPDMediaPlayer(QObject *parent) :
28 QObject(parent)
29 {
30 }
31
~MPDMediaPlayer()32 MPDMediaPlayer::~MPDMediaPlayer()
33 {
34 }
35
setConfiguration(Configuration * configuration)36 void MPDMediaPlayer::setConfiguration(Configuration *configuration)
37 {
38 m_configuration = configuration;
39 }
40
init()41 void MPDMediaPlayer::init()
42 {
43 Config = MPDConfig(m_configuration);
44 }
45
mpdConnect()46 mpd_connection * MPDMediaPlayer::mpdConnect()
47 {
48 const char *host = Config.host().toUtf8().constData();
49 unsigned int port = Config.port().toUInt();
50 unsigned int timeout = Config.timeout().toUInt();
51
52 return mpd_connection_new(host, port, timeout * 1000);
53 }
54
getTitle()55 QString MPDMediaPlayer::getTitle()
56 {
57 mpd_connection *con = mpdConnect();
58 if (!con)
59 return QString();
60
61 QString title;
62 mpd_status *status = mpd_run_status(con);
63 if (status)
64 {
65 int position = mpd_status_get_song_pos(status);
66
67 mpd_song *song = mpd_run_get_queue_song_pos(con, position);
68 if (song)
69 {
70 title = QString::fromUtf8(mpd_song_get_tag(song, MPD_TAG_TITLE, 0));
71 mpd_song_free(song);
72 }
73 mpd_status_free(status);
74 }
75 mpd_connection_free(con);
76
77 return title;
78 }
79
getArtist()80 QString MPDMediaPlayer::getArtist()
81 {
82 mpd_connection *con = mpdConnect();
83 if (!con)
84 return QString();
85
86 QString artist;
87 mpd_status *status = mpd_run_status(con);
88 if (status)
89 {
90 int position = mpd_status_get_song_pos(status);
91
92 mpd_song *song = mpd_run_get_queue_song_pos(con, position);
93 if (song)
94 {
95 artist = QString::fromUtf8(mpd_song_get_tag(song, MPD_TAG_ARTIST, 0));
96 mpd_song_free(song);
97 }
98 mpd_status_free(status);
99 }
100 mpd_connection_free(con);
101
102 return artist;
103 }
104
getAlbum()105 QString MPDMediaPlayer::getAlbum()
106 {
107 mpd_connection *con = mpdConnect();
108 if (!con)
109 return QString();
110
111 QString album;
112 mpd_status *status = mpd_run_status(con);
113 if (status)
114 {
115 int position = mpd_status_get_song_pos(status);
116
117 mpd_song *song = mpd_run_get_queue_song_pos(con, position);
118 if (song)
119 {
120 album = QString::fromUtf8(mpd_song_get_tag(song, MPD_TAG_ALBUM, 0));
121 mpd_song_free(song);
122 }
123 mpd_status_free(status);
124 }
125 mpd_connection_free(con);
126
127 return album;
128 }
129
getFile()130 QString MPDMediaPlayer::getFile()
131 {
132 mpd_connection *con = mpdConnect();
133 if (!con)
134 return QString();
135
136 QString file;
137 mpd_status *status = mpd_run_status(con);
138 if (NULL != status)
139 {
140 int position = mpd_status_get_song_pos(status);
141
142 mpd_song *song = mpd_run_get_queue_song_pos(con, position);
143 if (NULL != song)
144 {
145 file = mpd_song_get_uri(song);
146 file = file.right(file.length() - file.lastIndexOf('/') - 1);
147 mpd_song_free(song);
148 }
149 mpd_status_free(status);
150 }
151 mpd_connection_free(con);
152
153 return file;
154 }
155
getLength()156 int MPDMediaPlayer::getLength()
157 {
158 mpd_connection *con = mpdConnect();
159 if (!con)
160 return 0;
161
162 int length = 0;
163 mpd_status *status = mpd_run_status(con);
164 if (status)
165 {
166 int position = mpd_status_get_song_pos(status);
167
168 mpd_song *song = mpd_run_get_queue_song_pos(con, position);
169 if (song)
170 {
171 length = mpd_song_get_duration(song);
172 mpd_song_free(song);
173 }
174 mpd_status_free(status);
175 }
176 mpd_connection_free(con);
177
178 return length * 1000;
179 }
180
getCurrentPos()181 int MPDMediaPlayer::getCurrentPos()
182 {
183 mpd_connection *con = mpdConnect();
184 if (!con)
185 return 0;
186
187 int pos = 0;
188 mpd_status *status = mpd_run_status(con);
189 if (status)
190 {
191 pos = mpd_status_get_elapsed_ms(status);
192 mpd_status_free(status);
193 }
194 mpd_connection_free(con);
195
196 return pos;
197 }
198
isPlaying()199 bool MPDMediaPlayer::isPlaying()
200 {
201 mpd_connection *con = mpdConnect();
202 if (!con)
203 return false;
204
205 mpd_status *status = mpd_run_status(con);
206 if (!status)
207 {
208 mpd_connection_free(con);
209 return false;
210 }
211
212 bool ret = (mpd_status_get_state(status) == MPD_STATE_PLAY);
213 mpd_status_free(status);
214 mpd_connection_free(con);
215
216 return ret;
217 }
218
isActive()219 bool MPDMediaPlayer::isActive()
220 {
221 mpd_connection *con = mpdConnect();
222 if (!con)
223 return false;
224
225 bool ret = (mpd_connection_get_error(con) == MPD_ERROR_SUCCESS);
226 mpd_connection_free(con);
227
228 return ret;
229 }
230
getPlayListTitles()231 QStringList MPDMediaPlayer::getPlayListTitles()
232 {
233 mpd_connection *con = mpdConnect();
234 if (!con)
235 return QStringList();
236
237 QStringList playlist;
238 mpd_song *song;
239 mpd_send_list_queue_meta(con);
240 while ((song = mpd_recv_song(con)) != 0)
241 {
242 playlist << QString::fromUtf8(mpd_song_get_tag(song, MPD_TAG_TITLE, 0));
243 mpd_song_free(song);
244 }
245 mpd_connection_free(con);
246
247 return playlist;
248 }
249
getPlayListFiles()250 QStringList MPDMediaPlayer::getPlayListFiles()
251 {
252 mpd_connection *con = mpdConnect();
253 if (!con)
254 return QStringList();
255
256 QStringList playlistFiles;
257 mpd_song *song;
258 mpd_send_list_queue_meta(con);
259 while ((song = mpd_recv_song(con)) != NULL)
260 {
261 QString file = QString::fromUtf8(mpd_song_get_uri(song));
262 // get only filename without directories
263 file = file.right(file.length() - file.lastIndexOf('/') - 1);
264 playlistFiles << file;
265 mpd_song_free(song);
266 }
267 mpd_connection_free(con);
268
269 return playlistFiles;
270 }
271
getPlayerName()272 QString MPDMediaPlayer::getPlayerName()
273 {
274 return QStringLiteral("mpd");
275 }
276
getPlayerVersion()277 QString MPDMediaPlayer::getPlayerVersion()
278 {
279 QString version(tr("Unknown"));
280 mpd_connection *con = mpdConnect();
281 if (!con)
282 return version;
283
284 const unsigned *ver = mpd_connection_get_server_version(con);
285 if (ver)
286 version = QString::number(ver[0]) + '.' + QString::number(ver[1]) + '.' + QString::number(ver[2]);
287 mpd_connection_free(con);
288
289 return version;
290 }
291
nextTrack()292 void MPDMediaPlayer::nextTrack()
293 {
294 mpd_connection *con = mpdConnect();
295 if (!con)
296 return;
297
298 mpd_run_next(con);
299 mpd_connection_free(con);
300 }
301
prevTrack()302 void MPDMediaPlayer::prevTrack()
303 {
304 mpd_connection *con = mpdConnect();
305 if (!con)
306 return;
307
308 mpd_run_previous(con);
309 mpd_connection_free(con);
310 }
311
play()312 void MPDMediaPlayer::play()
313 {
314 mpd_connection *con = mpdConnect();
315 if (!con)
316 return;
317
318 mpd_status *status = mpd_run_status(con);
319 if (status)
320 {
321 mpd_state state = mpd_status_get_state(status);
322 if (state == MPD_STATE_PAUSE || state == MPD_STATE_STOP)
323 mpd_run_play(con);
324
325 mpd_status_free(status);
326 }
327 mpd_connection_free(con);
328 }
329
stop()330 void MPDMediaPlayer::stop()
331 {
332 mpd_connection *con = mpdConnect();
333 if (!con)
334 return;
335
336 mpd_status *status = mpd_run_status(con);
337 if (status)
338 {
339 mpd_state state = mpd_status_get_state(status);
340 if (state == MPD_STATE_PLAY || state == MPD_STATE_PAUSE)
341 mpd_run_stop(con);
342
343 mpd_status_free(status);
344 }
345 mpd_connection_free(con);
346 }
347
pause()348 void MPDMediaPlayer::pause()
349 {
350 mpd_connection *con = mpdConnect();
351 if (!con)
352 return;
353
354 mpd_status *status = mpd_run_status(con);
355 if (status)
356 {
357 if (mpd_status_get_state(status) == MPD_STATE_PLAY)
358 mpd_run_pause(con, true);
359
360 mpd_status_free(status);
361 }
362 mpd_connection_free(con);
363 }
364
setVolume(int vol)365 void MPDMediaPlayer::setVolume(int vol)
366 {
367 mpd_connection *con = mpdConnect();
368 if (!con)
369 return;
370
371 mpd_run_set_volume(con, vol);
372 mpd_connection_free(con);
373 }
374
incrVolume()375 void MPDMediaPlayer::incrVolume()
376 {
377 mpd_connection *con = mpdConnect();
378 if (!con)
379 return;
380
381 mpd_status *status = mpd_run_status(con);
382 if (status)
383 {
384 int oldVolume = mpd_status_get_volume(status);
385 int newVolume = oldVolume + 10;
386 mpd_status_free(status);
387
388 if (newVolume > 100)
389 newVolume = 100;
390 mpd_run_set_volume(con, newVolume);
391 }
392 mpd_connection_free(con);
393 }
394
decrVolume()395 void MPDMediaPlayer::decrVolume()
396 {
397 mpd_connection *con = mpdConnect();
398 if (!con)
399 return;
400
401 mpd_status *status = mpd_run_status(con);
402 if (status)
403 {
404 int oldVolume = mpd_status_get_volume(status);
405 int newVolume = oldVolume - 10;
406 mpd_status_free(status);
407
408 if (newVolume < 0)
409 newVolume = 0;
410 mpd_send_set_volume(con, newVolume);
411 }
412 mpd_connection_free(con);
413 }
414
415 #include "moc_mpd-mediaplayer.cpp"
416