Implement consume, single mode.
[libmpd.git] / src / libmpd-player.c
blob170b9308436da8c7607876cd32ef6acf58ba989d
1 /* libmpd (high level libmpdclient library)
2 * Copyright (C) 2004-2009 Qball Cow <qball@sarine.nl>
3 * Project homepage: http://gmpcwiki.sarine.nl/
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include <stdio.h>
21 #include <stdlib.h>
22 #define __USE_GNU
24 #include <string.h>
25 #include <stdarg.h>
26 #include <config.h>
27 #include "debug_printf.h"
28 #include "libmpd.h"
29 #include "libmpd-internal.h"
31 int mpd_player_get_state(MpdObj * mi)
33 if (!mpd_check_connected(mi)) {
34 debug_printf(DEBUG_WARNING, "not connected\n");
35 return MPD_NOT_CONNECTED;
37 if (mpd_status_check(mi) != MPD_OK) {
38 debug_printf(DEBUG_WARNING, "Failed to get status\n");
39 return MPD_STATUS_FAILED;
41 return mi->status->state;
43 int mpd_player_get_next_song_id(MpdObj *mi)
45 if (!mpd_check_connected(mi)) {
46 debug_printf(DEBUG_WARNING, "not connected\n");
47 return MPD_NOT_CONNECTED;
49 if (mpd_status_check(mi) != MPD_OK) {
50 debug_printf(DEBUG_ERROR, "Failed to get status\n");
51 return MPD_STATUS_FAILED;
53 /* check if in valid state */
54 if (mpd_player_get_state(mi) != MPD_PLAYER_PLAY &&
55 mpd_player_get_state(mi) != MPD_PLAYER_PAUSE) {
56 return MPD_PLAYER_NOT_PLAYING;
58 /* just to be sure check */
59 if (!mi->status->playlistLength) {
60 return MPD_PLAYLIST_EMPTY;
62 return mi->status->nextsongid;
64 int mpd_player_get_next_song_pos(MpdObj *mi)
66 if (!mpd_check_connected(mi)) {
67 debug_printf(DEBUG_WARNING, "not connected\n");
68 return MPD_NOT_CONNECTED;
70 if (mpd_status_check(mi) != MPD_OK) {
71 debug_printf(DEBUG_ERROR, "Failed to get status\n");
72 return MPD_STATUS_FAILED;
74 /* check if in valid state */
75 if (mpd_player_get_state(mi) != MPD_PLAYER_PLAY &&
76 mpd_player_get_state(mi) != MPD_PLAYER_PAUSE) {
77 return MPD_PLAYER_NOT_PLAYING;
79 /* just to be sure check */
80 if (!mi->status->playlistLength) {
81 return MPD_PLAYLIST_EMPTY;
83 return mi->status->nextsong;
85 int mpd_player_get_current_song_id(MpdObj * mi)
87 if (!mpd_check_connected(mi)) {
88 debug_printf(DEBUG_WARNING, "not connected\n");
89 return MPD_NOT_CONNECTED;
91 if (mpd_status_check(mi) != MPD_OK) {
92 debug_printf(DEBUG_ERROR, "Failed to get status\n");
93 return MPD_STATUS_FAILED;
95 /* check if in valid state */
96 if (mpd_player_get_state(mi) != MPD_PLAYER_PLAY &&
97 mpd_player_get_state(mi) != MPD_PLAYER_PAUSE) {
98 return MPD_PLAYER_NOT_PLAYING;
100 /* just to be sure check */
101 if (!mi->status->playlistLength) {
102 return MPD_PLAYLIST_EMPTY;
104 return mi->status->songid;
107 int mpd_player_get_current_song_pos(MpdObj * mi)
109 if (!mpd_check_connected(mi)) {
110 debug_printf(DEBUG_WARNING, "not connected\n");
111 return MPD_NOT_CONNECTED;
113 if (mpd_status_check(mi)!= MPD_OK) {
114 debug_printf(DEBUG_ERROR, "Failed to get status\n");
115 return MPD_STATUS_FAILED;
117 /* check if in valid state */
118 if (mpd_player_get_state(mi) != MPD_PLAYER_PLAY &&
119 mpd_player_get_state(mi) != MPD_PLAYER_PAUSE) {
120 return MPD_PLAYER_NOT_PLAYING;
122 /* just to be sure check */
123 if (!mi->status->playlistLength) {
124 return MPD_PLAYLIST_EMPTY;
126 return mi->status->song;
129 int mpd_player_play_id(MpdObj * mi, int id)
131 debug_printf(DEBUG_INFO, "trying to play id: %i\n", id);
132 if (!mpd_check_connected(mi)) {
133 debug_printf(DEBUG_WARNING, "not connected\n");
134 return MPD_NOT_CONNECTED;
136 if (mpd_lock_conn(mi)) {
137 debug_printf(DEBUG_WARNING, "lock failed\n");
138 return MPD_LOCK_FAILED;
141 mpd_sendPlayIdCommand(mi->connection, id);
142 mpd_finishCommand(mi->connection);
145 mpd_unlock_conn(mi);
146 if (mpd_status_update(mi)) {
147 return MPD_STATUS_FAILED;
149 return MPD_OK;
152 int mpd_player_play(MpdObj * mi)
154 return mpd_player_play_id(mi, -1);
157 int mpd_player_stop(MpdObj * mi)
159 if (!mpd_check_connected(mi)) {
160 debug_printf(DEBUG_WARNING, "not connected\n");
161 return MPD_NOT_CONNECTED;
163 if (mpd_lock_conn(mi)) {
164 debug_printf(DEBUG_WARNING, "lock failed\n");
165 return MPD_LOCK_FAILED;
168 mpd_sendStopCommand(mi->connection);
169 mpd_finishCommand(mi->connection);
172 mpd_unlock_conn(mi);
173 if (mpd_status_update(mi)) {
174 return MPD_STATUS_FAILED;
176 return MPD_OK;
179 int mpd_player_next(MpdObj * mi)
181 if (!mpd_check_connected(mi)) {
182 debug_printf(DEBUG_WARNING, "not connected\n");
183 return MPD_NOT_CONNECTED;
185 if (mpd_lock_conn(mi)) {
186 debug_printf(DEBUG_WARNING, "lock failed\n");
187 return MPD_LOCK_FAILED;
190 mpd_sendNextCommand(mi->connection);
191 mpd_finishCommand(mi->connection);
194 mpd_unlock_conn(mi);
195 if (mpd_status_update(mi)) {
196 return MPD_STATUS_FAILED;
198 return MPD_OK;
201 int mpd_player_prev(MpdObj * mi)
203 if (!mpd_check_connected(mi)) {
204 debug_printf(DEBUG_WARNING, "not connected\n");
205 return MPD_NOT_CONNECTED;
207 if (mpd_lock_conn(mi)) {
208 debug_printf(DEBUG_WARNING, "lock failed\n");
209 return MPD_LOCK_FAILED;
212 mpd_sendPrevCommand(mi->connection);
213 mpd_finishCommand(mi->connection);
216 mpd_unlock_conn(mi);
217 if (mpd_status_update(mi)) {
218 return MPD_STATUS_FAILED;
220 return MPD_OK;
224 int mpd_player_pause(MpdObj * mi)
226 if (!mpd_check_connected(mi)) {
227 debug_printf(DEBUG_WARNING, "not connected\n");
228 return MPD_NOT_CONNECTED;
230 if (mpd_lock_conn(mi)) {
231 debug_printf(DEBUG_WARNING, "lock failed\n");
232 return MPD_LOCK_FAILED;
235 if (mpd_player_get_state(mi) == MPD_PLAYER_PAUSE) {
236 mpd_sendPauseCommand(mi->connection, 0);
237 mpd_finishCommand(mi->connection);
238 } else if (mpd_player_get_state(mi) == MPD_PLAYER_PLAY) {
239 mpd_sendPauseCommand(mi->connection, 1);
240 mpd_finishCommand(mi->connection);
244 mpd_unlock_conn(mi);
245 if (mpd_status_update(mi)) {
246 return MPD_STATUS_FAILED;
248 return MPD_OK;
251 int mpd_player_seek(MpdObj * mi, int sec)
253 int cur_song = mpd_player_get_current_song_pos(mi);
254 if (cur_song < 0) {
255 debug_printf(DEBUG_ERROR, "mpd_player_get_current_song_pos returned error\n");
256 return cur_song;
258 if (!mpd_check_connected(mi)) {
259 debug_printf(DEBUG_WARNING, "not connected\n");
260 return MPD_NOT_CONNECTED;
262 if (mpd_lock_conn(mi)) {
263 debug_printf(DEBUG_WARNING, "lock failed\n");
264 return MPD_LOCK_FAILED;
267 debug_printf(DEBUG_INFO, "seeking in song %i to %i sec\n", cur_song, sec);
269 mpd_sendSeekCommand(mi->connection, cur_song, sec);
270 mpd_finishCommand(mi->connection);
273 mpd_unlock_conn(mi);
274 if (mpd_status_update(mi)) {
275 return MPD_STATUS_FAILED;
277 return MPD_OK;
280 int mpd_player_get_consume(MpdObj * mi)
282 if (!mpd_check_connected(mi)) {
283 debug_printf(DEBUG_WARNING, "not connected\n");
284 return MPD_NOT_CONNECTED;
286 if (mpd_status_check(mi) != MPD_OK) {
287 debug_printf(DEBUG_WARNING, "Failed grabbing status\n");
288 return MPD_NOT_CONNECTED;
290 return mi->status->consume;
292 int mpd_player_set_single(MpdObj * mi, int single)
294 if (!mpd_check_connected(mi)) {
295 debug_printf(DEBUG_WARNING, "not connected\n");
296 return MPD_NOT_CONNECTED;
298 if (mpd_lock_conn(mi)) {
299 debug_printf(DEBUG_WARNING, "lock failed\n");
300 return MPD_LOCK_FAILED;
302 mpd_sendSingleCommand(mi->connection, single);
303 mpd_finishCommand(mi->connection);
305 mpd_unlock_conn(mi);
306 mpd_status_queue_update(mi);
307 return MPD_OK;
309 int mpd_player_get_single(MpdObj * mi)
311 if (!mpd_check_connected(mi)) {
312 debug_printf(DEBUG_WARNING, "not connected\n");
313 return MPD_NOT_CONNECTED;
315 if (mpd_status_check(mi) != MPD_OK) {
316 debug_printf(DEBUG_WARNING, "Failed grabbing status\n");
317 return MPD_NOT_CONNECTED;
319 return mi->status->single;
321 int mpd_player_set_consume(MpdObj * mi, int consume)
323 if (!mpd_check_connected(mi)) {
324 debug_printf(DEBUG_WARNING, "not connected\n");
325 return MPD_NOT_CONNECTED;
327 if (mpd_lock_conn(mi)) {
328 debug_printf(DEBUG_WARNING, "lock failed\n");
329 return MPD_LOCK_FAILED;
331 mpd_sendConsumeCommand(mi->connection, consume);
332 mpd_finishCommand(mi->connection);
334 mpd_unlock_conn(mi);
335 mpd_status_queue_update(mi);
336 return MPD_OK;
340 int mpd_player_get_repeat(MpdObj * mi)
342 if (!mpd_check_connected(mi)) {
343 debug_printf(DEBUG_WARNING, "not connected\n");
344 return MPD_NOT_CONNECTED;
346 if (mpd_status_check(mi) != MPD_OK) {
347 debug_printf(DEBUG_WARNING, "Failed grabbing status\n");
348 return MPD_NOT_CONNECTED;
350 return mi->status->repeat;
354 int mpd_player_set_repeat(MpdObj * mi, int repeat)
356 if (!mpd_check_connected(mi)) {
357 debug_printf(DEBUG_WARNING, "not connected\n");
358 return MPD_NOT_CONNECTED;
360 if (mpd_lock_conn(mi)) {
361 debug_printf(DEBUG_WARNING, "lock failed\n");
362 return MPD_LOCK_FAILED;
364 mpd_sendRepeatCommand(mi->connection, repeat);
365 mpd_finishCommand(mi->connection);
367 mpd_unlock_conn(mi);
368 mpd_status_queue_update(mi);
369 return MPD_OK;
374 int mpd_player_get_random(MpdObj * mi)
376 if (!mpd_check_connected(mi)) {
377 debug_printf(DEBUG_WARNING, "not connected\n");
378 return MPD_NOT_CONNECTED;
380 if (mpd_status_check(mi) != MPD_OK) {
381 debug_printf(DEBUG_WARNING, "Failed grabbing status\n");
382 return MPD_NOT_CONNECTED;
384 return mi->status->random;
388 int mpd_player_set_random(MpdObj * mi, int random)
390 if (!mpd_check_connected(mi)) {
391 debug_printf(DEBUG_WARNING, "not connected\n");
392 return MPD_NOT_CONNECTED;
394 if (mpd_lock_conn(mi)) {
395 debug_printf(DEBUG_WARNING, "lock failed\n");
396 return MPD_LOCK_FAILED;
398 mpd_sendRandomCommand(mi->connection, random);
399 mpd_finishCommand(mi->connection);
401 mpd_unlock_conn(mi);
402 mpd_status_queue_update(mi);
403 return MPD_OK;