Code

doc: Updated manpage.
[ncmpc.git] / src / player_command.c
index 3b8476daf3924b08aec875c17ac8c74f5a7c876e..2455c83e58cdb74b5645730c0a91590c5c0e073b 100644 (file)
@@ -1,5 +1,5 @@
 /* ncmpc (Ncurses MPD Client)
- * (c) 2004-2009 The Music Player Daemon Project
+ * (c) 2004-2010 The Music Player Daemon Project
  * Project homepage: http://musicpd.org
 
  * This program is free software; you can redistribute it and/or modify
@@ -37,13 +37,12 @@ commit_seek(struct mpdclient *c)
        if (seek_id < 0)
                return;
 
-       if (!mpdclient_is_connected(c)) {
+       connection = mpdclient_get_connection(c);
+       if (connection == NULL) {
                seek_id = -1;
                return;
        }
 
-       connection = mpdclient_get_connection(c);
-
        if (c->song != NULL && (unsigned)seek_id == mpd_song_get_id(c->song))
                if (!mpd_run_seek_id(connection, seek_id, seek_target_time))
                        mpdclient_handle_error(c);
@@ -83,11 +82,26 @@ cancel_seek_timer(void)
        }
 }
 
+static bool
+setup_seek(struct mpdclient *c)
+{
+       if (!mpdclient_is_playing(c))
+               return false;
+
+       if (seek_id != (int)mpd_status_get_song_id(c->status)) {
+               seek_id = mpd_status_get_song_id(c->status);
+               seek_target_time = mpd_status_get_elapsed_time(c->status);
+       }
+
+       schedule_seek_timer(c);
+
+       return true;
+}
+
 bool
 handle_player_command(struct mpdclient *c, command_t cmd)
 {
        struct mpd_connection *connection;
-       const struct mpd_song *song;
 
        if (!mpdclient_is_connected(c) || c->status == NULL)
                return false;
@@ -102,12 +116,18 @@ handle_player_command(struct mpdclient *c, command_t cmd)
                */
        case CMD_PAUSE:
                connection = mpdclient_get_connection(c);
+               if (connection == NULL)
+                       break;
+
                if (!mpd_run_pause(connection,
                                   mpd_status_get_state(c->status) != MPD_STATE_PAUSE))
                        mpdclient_handle_error(c);
                break;
        case CMD_STOP:
                connection = mpdclient_get_connection(c);
+               if (connection == NULL)
+                       break;
+
                if (!mpd_run_stop(connection))
                        mpdclient_handle_error(c);
                break;
@@ -115,43 +135,44 @@ handle_player_command(struct mpdclient *c, command_t cmd)
                mpdclient_cmd_crop(c);
                break;
        case CMD_SEEK_FORWARD:
-               song = mpdclient_get_current_song(c);
-               if (song != NULL) {
-                       if (seek_id != (int)mpd_song_get_id(song)) {
-                               seek_id = mpd_song_get_id(song);
-                               seek_target_time = mpd_status_get_elapsed_time(c->status);
-                       }
-                       seek_target_time+=options.seek_time;
-                       if (seek_target_time > (int)mpd_status_get_total_time(c->status))
-                               seek_target_time = mpd_status_get_total_time(c->status);
-                       schedule_seek_timer(c);
-               }
+               if (!setup_seek(c))
+                       break;
+
+               seek_target_time += options.seek_time;
+               if (seek_target_time > (int)mpd_status_get_total_time(c->status))
+                       seek_target_time = mpd_status_get_total_time(c->status);
                break;
+
        case CMD_TRACK_NEXT:
                connection = mpdclient_get_connection(c);
+               if (connection == NULL)
+                       break;
+
                if (!mpd_run_next(connection))
                        mpdclient_handle_error(c);
                break;
        case CMD_SEEK_BACKWARD:
-               song = mpdclient_get_current_song(c);
-               if (song != NULL) {
-                       if (seek_id != (int)mpd_song_get_id(song)) {
-                               seek_id = mpd_song_get_id(c->song);
-                               seek_target_time = mpd_status_get_elapsed_time(c->status);
-                       }
-                       seek_target_time-=options.seek_time;
-                       if (seek_target_time < 0)
-                               seek_target_time=0;
-                       schedule_seek_timer(c);
-               }
+               if (!setup_seek(c))
+                       break;
+
+               seek_target_time -= options.seek_time;
+               if (seek_target_time < 0)
+                       seek_target_time = 0;
                break;
+
        case CMD_TRACK_PREVIOUS:
                connection = mpdclient_get_connection(c);
+               if (connection == NULL)
+                       break;
+
                if (!mpd_run_previous(connection))
                        mpdclient_handle_error(c);
                break;
        case CMD_SHUFFLE:
                connection = mpdclient_get_connection(c);
+               if (connection == NULL)
+                       break;
+
                if (mpd_run_shuffle(connection))
                        screen_status_message(_("Shuffled playlist"));
                else
@@ -159,35 +180,53 @@ handle_player_command(struct mpdclient *c, command_t cmd)
                break;
        case CMD_CLEAR:
                connection = mpdclient_get_connection(c);
+               if (connection == NULL)
+                       break;
+
                if (mpdclient_cmd_clear(c))
                        screen_status_message(_("Cleared playlist"));
                break;
        case CMD_REPEAT:
                connection = mpdclient_get_connection(c);
+               if (connection == NULL)
+                       break;
+
                if (!mpd_run_repeat(connection,
                                    !mpd_status_get_repeat(c->status)))
                        mpdclient_handle_error(c);
                break;
        case CMD_RANDOM:
                connection = mpdclient_get_connection(c);
+               if (connection == NULL)
+                       break;
+
                if (!mpd_run_random(connection,
                                    !mpd_status_get_random(c->status)))
                        mpdclient_handle_error(c);
                break;
        case CMD_SINGLE:
                connection = mpdclient_get_connection(c);
+               if (connection == NULL)
+                       break;
+
                if (!mpd_run_single(connection,
                                    !mpd_status_get_single(c->status)))
                        mpdclient_handle_error(c);
                break;
        case CMD_CONSUME:
                connection = mpdclient_get_connection(c);
+               if (connection == NULL)
+                       break;
+
                if (!mpd_run_consume(connection,
                                     !mpd_status_get_consume(c->status)))
                        mpdclient_handle_error(c);
                break;
        case CMD_CROSSFADE:
                connection = mpdclient_get_connection(c);
+               if (connection == NULL)
+                       break;
+
                if (!mpd_run_crossfade(connection,
                                       mpd_status_get_crossfade(c->status) > 0
                                       ? 0 : options.crossfade_time))