renamed smartstop to single and changed behavior
When single mode is enabled, after current song it stops playback, or it replay same song if repeat mode is activated.
This commit is contained in:
parent
e46722b2eb
commit
e7519829ac
@ -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>
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
(&
|
||||
|
11
src/queue.c
11
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]) *
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user