diff options
-rw-r--r-- | doc/protocol.xml | 11 | ||||
-rw-r--r-- | src/command.c | 12 | ||||
-rw-r--r-- | src/playlist.c | 23 | ||||
-rw-r--r-- | src/playlist.h | 4 | ||||
-rw-r--r-- | src/playlist_control.c | 4 | ||||
-rw-r--r-- | src/playlist_state.c | 14 | ||||
-rw-r--r-- | src/queue.c | 11 | ||||
-rw-r--r-- | src/queue.h | 4 |
8 files changed, 49 insertions, 34 deletions
diff --git a/doc/protocol.xml b/doc/protocol.xml index fc833f7bf..3dcfedeb5 100644 --- a/doc/protocol.xml +++ b/doc/protocol.xml @@ -218,7 +218,7 @@ </listitem> <listitem> <para> - <varname>smartstop</varname>: + <varname>single</varname>: <returnvalue>0 or 1</returnvalue> </para> </listitem> @@ -408,18 +408,19 @@ </para> </listitem> </varlistentry> - <varlistentry id="command_smartstop"> + <varlistentry id="command_single"> <term> <cmdsynopsis> - <command>smartstop</command> + <command>single</command> <arg choice="req"><replaceable>STATE</replaceable></arg> </cmdsynopsis> </term> <listitem> <para> - Sets smartstop state to <varname>STATE</varname>, + Sets single state to <varname>STATE</varname>, <varname>STATE</varname> should be 0 or 1. - When smartstop is activated, playback is stopped after current song. + When single is activated, playback is stopped after current song, or + song is repeated if the 'repeat' mode is enabled. </para> </listitem> </varlistentry> diff --git a/src/command.c b/src/command.c index 82b088587..69fbe514f 100644 --- a/src/command.c +++ b/src/command.c @@ -59,7 +59,7 @@ #define COMMAND_STATUS_VOLUME "volume" #define COMMAND_STATUS_STATE "state" #define COMMAND_STATUS_REPEAT "repeat" -#define COMMAND_STATUS_SMARTSTOP "smartstop" +#define COMMAND_STATUS_SINGLE "single" #define COMMAND_STATUS_RANDOM "random" #define COMMAND_STATUS_PLAYLIST "playlist" #define COMMAND_STATUS_PLAYLIST_LENGTH "playlistlength" @@ -470,7 +470,7 @@ handle_status(struct client *client, COMMAND_STATUS_VOLUME ": %i\n" COMMAND_STATUS_REPEAT ": %i\n" COMMAND_STATUS_RANDOM ": %i\n" - COMMAND_STATUS_SMARTSTOP ": %i\n" + COMMAND_STATUS_SINGLE ": %i\n" COMMAND_STATUS_PLAYLIST ": %li\n" COMMAND_STATUS_PLAYLIST_LENGTH ": %i\n" COMMAND_STATUS_CROSSFADE ": %i\n" @@ -478,7 +478,7 @@ handle_status(struct client *client, volume_level_get(), getPlaylistRepeatStatus(&g_playlist), getPlaylistRandomStatus(&g_playlist), - getPlaylistSmartstopStatus(&g_playlist), + getPlaylistSingleStatus(&g_playlist), getPlaylistVersion(&g_playlist), getPlaylistLength(&g_playlist), (int)(getPlayerCrossFade() + 0.5), @@ -1096,7 +1096,7 @@ handle_repeat(struct client *client, G_GNUC_UNUSED int argc, char *argv[]) } static enum command_return -handle_smartstop(struct client *client, G_GNUC_UNUSED int argc, char *argv[]) +handle_single(struct client *client, G_GNUC_UNUSED int argc, char *argv[]) { int status; @@ -1109,7 +1109,7 @@ handle_smartstop(struct client *client, G_GNUC_UNUSED int argc, char *argv[]) return COMMAND_RETURN_ERROR; } - setPlaylistSmartstopStatus(&g_playlist, status); + setPlaylistSingleStatus(&g_playlist, status); return COMMAND_RETURN_OK; } @@ -1623,7 +1623,7 @@ static const struct command commands[] = { { "seekid", PERMISSION_CONTROL, 2, 2, handle_seekid }, { "setvol", PERMISSION_CONTROL, 1, 1, handle_setvol }, { "shuffle", PERMISSION_CONTROL, 0, 1, handle_shuffle }, - { "smartstop", PERMISSION_CONTROL, 1, 1, handle_smartstop }, + { "single", PERMISSION_CONTROL, 1, 1, handle_single }, { "stats", PERMISSION_READ, 0, 0, handle_stats }, { "status", PERMISSION_READ, 0, 0, handle_status }, #ifdef ENABLE_SQLITE diff --git a/src/playlist.c b/src/playlist.c index 0ec46492a..776308db0 100644 --- a/src/playlist.c +++ b/src/playlist.c @@ -262,9 +262,9 @@ getPlaylistRandomStatus(const struct playlist *playlist) } bool -getPlaylistSmartstopStatus(const struct playlist *playlist) +getPlaylistSingleStatus(const struct playlist *playlist) { - return playlist->queue.smartstop; + return playlist->queue.single; } void setPlaylistRepeatStatus(struct playlist *playlist, bool status) @@ -292,12 +292,15 @@ static void orderPlaylist(struct playlist *playlist) queue_restore_order(&playlist->queue); } -void setPlaylistSmartstopStatus(struct playlist *playlist, bool status) +void setPlaylistSingleStatus(struct playlist *playlist, bool status) { - playlist->queue.smartstop = status; + if (status == playlist->queue.single) + return; + + playlist->queue.single = status; /* if the last song is currently being played, the "next song" - might change when repeat mode is toggled */ + might change when single mode is toggled */ playlist_update_queued_song(playlist, playlist_get_queued_song(playlist)); @@ -359,8 +362,14 @@ int getPlaylistNextSong(const struct playlist *playlist) { if (playlist->current >= 0) { - if (playlist->queue.smartstop == 1) - return -1; + if (playlist->queue.single == 1) + { + if (playlist->queue.repeat == 1) + return queue_order_to_position(&playlist->queue, + playlist->current); + else + return -1; + } if (playlist->current + 1 < (int)queue_length(&playlist->queue)) return queue_order_to_position(&playlist->queue, playlist->current + 1); diff --git a/src/playlist.h b/src/playlist.h index 4e11ec421..17862b335 100644 --- a/src/playlist.h +++ b/src/playlist.h @@ -180,9 +180,9 @@ getPlaylistRandomStatus(const struct playlist *playlist); void setPlaylistRandomStatus(struct playlist *playlist, bool status); bool -getPlaylistSmartstopStatus(const struct playlist *playlist); +getPlaylistSingleStatus(const struct playlist *playlist); -void setPlaylistSmartstopStatus(struct playlist *playlist, bool status); +void setPlaylistSingleStatus(struct playlist *playlist, bool status); int getPlaylistCurrentSong(const struct playlist *playlist); diff --git a/src/playlist_control.c b/src/playlist_control.c index 90aab5f29..9e31c07ab 100644 --- a/src/playlist_control.c +++ b/src/playlist_control.c @@ -152,8 +152,8 @@ nextSongInPlaylist(struct playlist *playlist) next_order = queue_next_order(&playlist->queue, playlist->current); if (next_order < 0) { - /* cancel smartstop */ - playlist->queue.smartstop = false; + /* cancel single */ + playlist->queue.single = false; /* no song after this one: stop playback */ stopPlaylist(playlist); return; diff --git a/src/playlist_state.c b/src/playlist_state.c index 6d1756eed..f5b1456d7 100644 --- a/src/playlist_state.c +++ b/src/playlist_state.c @@ -34,7 +34,7 @@ #define PLAYLIST_STATE_FILE_STATE "state: " #define PLAYLIST_STATE_FILE_RANDOM "random: " #define PLAYLIST_STATE_FILE_REPEAT "repeat: " -#define PLAYLIST_STATE_FILE_SMARTSTOP "smartstop: " +#define PLAYLIST_STATE_FILE_SINGLE "single: " #define PLAYLIST_STATE_FILE_CURRENT "current: " #define PLAYLIST_STATE_FILE_TIME "time: " #define PLAYLIST_STATE_FILE_CROSSFADE "crossfade: " @@ -72,8 +72,8 @@ playlist_state_save(FILE *fp, const struct playlist *playlist) playlist->queue.random); fprintf(fp, "%s%i\n", PLAYLIST_STATE_FILE_REPEAT, playlist->queue.repeat); - fprintf(fp, "%s%i\n", PLAYLIST_STATE_FILE_SMARTSTOP, - playlist->queue.smartstop); + fprintf(fp, "%s%i\n", PLAYLIST_STATE_FILE_SINGLE, + playlist->queue.single); fprintf(fp, "%s%i\n", PLAYLIST_STATE_FILE_CROSSFADE, (int)(getPlayerCrossFade())); fprintf(fp, "%s\n", PLAYLIST_STATE_FILE_PLAYLIST_BEGIN); @@ -139,13 +139,13 @@ playlist_state_restore(FILE *fp, struct playlist *playlist) setPlaylistRepeatStatus(playlist, true); } else setPlaylistRepeatStatus(playlist, false); - } else if (g_str_has_prefix(buffer, PLAYLIST_STATE_FILE_SMARTSTOP)) { + } else if (g_str_has_prefix(buffer, PLAYLIST_STATE_FILE_SINGLE)) { if (strcmp - (&(buffer[strlen(PLAYLIST_STATE_FILE_SMARTSTOP)]), + (&(buffer[strlen(PLAYLIST_STATE_FILE_SINGLE)]), "1") == 0) { - setPlaylistSmartstopStatus(playlist, true); + setPlaylistSingleStatus(playlist, true); } else - setPlaylistSmartstopStatus(playlist, false); + setPlaylistSingleStatus(playlist, false); } else if (g_str_has_prefix(buffer, PLAYLIST_STATE_FILE_CROSSFADE)) { setPlayerCrossFade(atoi (& diff --git a/src/queue.c b/src/queue.c index 28da0e5a3..21d4884c6 100644 --- a/src/queue.c +++ b/src/queue.c @@ -40,8 +40,13 @@ queue_next_order(const struct queue *queue, unsigned order) { assert(order < queue->length); - if (queue->smartstop) - return -1; + if (queue->single) + { + if (queue->repeat) + return order; + else + return -1; + } if (order + 1 < queue->length) return order + 1; else if (queue->repeat) @@ -277,7 +282,7 @@ queue_init(struct queue *queue, unsigned max_length) queue->version = 1; queue->repeat = false; queue->random = false; - queue->smartstop = false; + queue->single = false; queue->items = g_new(struct queue_item, max_length); queue->order = g_malloc(sizeof(queue->order[0]) * diff --git a/src/queue.h b/src/queue.h index 63b71d199..452084ce8 100644 --- a/src/queue.h +++ b/src/queue.h @@ -81,8 +81,8 @@ struct queue { reached? */ bool repeat; - /** stop playing after that song. */ - bool smartstop; + /** play only current song. */ + bool single; /** play back songs in random order? */ bool random; |