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