Merge pull request #233 from chme/mpdstop

Do not start playback after adding songs to the queue using mpd clients
This commit is contained in:
ejurgensen 2016-03-20 08:58:35 +01:00
commit 3fba838337
7 changed files with 63 additions and 70 deletions

View File

@ -217,6 +217,11 @@ mpd {
# and will need additional configuration in the MPD client to work).
# Set to 0 to disable serving artwork over http.
# http_port = 0
# By default forked-daapd will - like iTunes - clear the playqueue if playback stops.
# Setting clear_queue_on_stop_disable to true will keep the playlist like MPD does.
# Note that some dacp clients do not show the playqueue if playback is stopped.
# clear_queue_on_stop_disable = false
}
# SQLite configuration (allows to modify the operation of the SQLite databases)

View File

@ -139,6 +139,7 @@ static cfg_opt_t sec_mpd[] =
{
CFG_INT("port", 6600, CFGF_NONE),
CFG_INT("http_port", 0, CFGF_NONE),
CFG_BOOL("clear_queue_on_stop_disable", cfg_false, CFGF_NONE),
CFG_END()
};

View File

@ -1015,7 +1015,7 @@ dacp_reply_cue_play(struct evhttp_request *req, struct evbuffer *evbuf, char **u
return;
}
player_queue_add(items);
player_queue_add(items, NULL);
}
else
{
@ -1068,6 +1068,9 @@ dacp_reply_cue_play(struct evhttp_request *req, struct evbuffer *evbuf, char **u
{
/* Play from Up Next queue */
pos += status.pos_pl;
if (status.status == PLAY_STOPPED && pos > 0)
pos--;
}
}
@ -1253,7 +1256,7 @@ dacp_reply_playspec(struct evhttp_request *req, struct evbuffer *evbuf, char **u
player_playback_stop();
player_queue_clear();
player_queue_add(items);
player_queue_add(items, NULL);
player_queue_plid(plid);
if (shuffle)
@ -1564,9 +1567,6 @@ dacp_reply_playqueuecontents(struct evhttp_request *req, struct evbuffer *evbuf,
{
player_get_status(&status);
/* Get queue and make songlist only if playing or paused */
if (status.status != PLAY_STOPPED)
{
queue = player_queue_get_bypos(abs(span));
if (queue)
{
@ -1587,7 +1587,6 @@ dacp_reply_playqueuecontents(struct evhttp_request *req, struct evbuffer *evbuf,
queue_free(queue);
}
}
}
/* Playlists are hist, curr and main. */
playlists = evbuffer_new();
@ -1787,7 +1786,7 @@ dacp_reply_playqueueedit_add(struct evhttp_request *req, struct evbuffer *evbuf,
}
else
{
player_queue_add(items);
player_queue_add(items, NULL);
}
}
else

View File

@ -1604,13 +1604,7 @@ mpd_command_add(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
return ACK_ERROR_UNKNOWN;
}
player_queue_add(items);
ret = player_playback_start(NULL);
if (ret < 0)
{
DPRINTF(E_LOG, L_MPD, "Could not start playback\n");
}
player_queue_add(items, NULL);
return 0;
}
@ -1625,6 +1619,7 @@ static int
mpd_command_addid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
{
struct queue_item *items;
uint32_t item_id;
int ret;
if (argc < 2)
@ -1652,20 +1647,11 @@ mpd_command_addid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
}
player_queue_add(items);
player_queue_add(items, &item_id);
//TODO [queue] Get queue-item-id for mpd-command addid
evbuffer_add_printf(evbuf,
"addid: %s\n"
"Id: %d\n",
argv[1],
0); //ps->id);
ret = player_playback_start(NULL);
if (ret < 0)
{
DPRINTF(E_LOG, L_MPD, "Could not start playback\n");
}
item_id);
return 0;
}
@ -2362,13 +2348,7 @@ mpd_command_load(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
return ACK_ERROR_UNKNOWN;
}
player_queue_add(items);
ret = player_playback_start(NULL);
if (ret < 0)
{
DPRINTF(E_LOG, L_MPD, "Could not start playback\n");
}
player_queue_add(items, NULL);
return 0;
}
@ -2628,13 +2608,7 @@ mpd_command_findadd(struct evbuffer *evbuf, int argc, char **argv, char **errmsg
return ACK_ERROR_UNKNOWN;
}
player_queue_add(items);
ret = player_playback_start(NULL);
if (ret < 0)
{
DPRINTF(E_LOG, L_MPD, "Could not start playback\n");
}
player_queue_add(items, NULL);
return 0;
}
@ -3263,13 +3237,7 @@ mpd_command_searchadd(struct evbuffer *evbuf, int argc, char **argv, char **errm
return ACK_ERROR_UNKNOWN;
}
player_queue_add(items);
ret = player_playback_start(NULL);
if (ret < 0)
{
DPRINTF(E_LOG, L_MPD, "Could not start playback\n");
}
player_queue_add(items, NULL);
return 0;
}

View File

@ -165,6 +165,8 @@ struct playerqueue_add_param
{
struct queue_item *items;
int pos;
uint32_t *item_id_ptr;
};
struct playerqueue_move_param
@ -242,6 +244,9 @@ static struct event *exitev;
static struct event *cmdev;
static pthread_t tid_player;
/* Config values */
static int clear_queue_on_stop_disabled;
/* Player status */
static enum play_status player_state;
static enum repeat_mode repeat;
@ -2165,10 +2170,11 @@ playback_abort(void)
source_stop();
playerqueue_clear(NULL);
evbuffer_drain(audio_buf, evbuffer_get_length(audio_buf));
if (!clear_queue_on_stop_disabled)
playerqueue_clear(NULL);
status_update(PLAY_STOPPED);
metadata_purge();
@ -2196,6 +2202,7 @@ get_status(struct player_command *cmd)
status->plid = cur_plid;
status->plversion = cur_plversion;
status->playlistlength = queue_count(queue);
switch (player_state)
{
@ -2273,7 +2280,6 @@ get_status(struct player_command *cmd)
status->next_pos_pl = 0;
}
status->playlistlength = queue_count(queue);
break;
}
@ -3376,8 +3382,10 @@ playerqueue_add(struct player_command *cmd)
{
struct queue_item *items;
uint32_t cur_id;
uint32_t *item_id;
items = cmd->arg.queue_add_param.items;
item_id = cmd->arg.queue_add_param.item_id_ptr;
queue_add(queue, items);
@ -3387,6 +3395,9 @@ playerqueue_add(struct player_command *cmd)
queue_shuffle(queue, cur_id);
}
if (item_id)
*item_id = queueitem_item_id(items);
cur_plid = 0;
cur_plversion++;
@ -3422,6 +3433,7 @@ static int
playerqueue_move_bypos(struct player_command *cmd)
{
struct player_source *ps_playing;
uint32_t item_id;
DPRINTF(E_DBG, L_PLAYER, "Moving song from position %d to be the next song after %d\n",
cmd->arg.queue_move_param.from_pos, cmd->arg.queue_move_param.to_pos);
@ -3430,11 +3442,13 @@ playerqueue_move_bypos(struct player_command *cmd)
if (!ps_playing)
{
DPRINTF(E_LOG, L_PLAYER, "Can't move item, no playing item found\n");
return -1;
DPRINTF(E_DBG, L_PLAYER, "No playing item found for move by pos\n");
item_id = 0;
}
else
item_id = ps_playing->item_id;
queue_move_bypos(queue, ps_playing->item_id, cmd->arg.queue_move_param.from_pos, cmd->arg.queue_move_param.to_pos, shuffle);
queue_move_bypos(queue, item_id, cmd->arg.queue_move_param.from_pos, cmd->arg.queue_move_param.to_pos, shuffle);
cur_plversion++;
@ -3478,6 +3492,7 @@ playerqueue_remove_bypos(struct player_command *cmd)
{
int pos;
struct player_source *ps_playing;
uint32_t item_id;
pos = cmd->arg.intval;
if (pos < 1)
@ -3490,12 +3505,14 @@ playerqueue_remove_bypos(struct player_command *cmd)
if (!ps_playing)
{
DPRINTF(E_LOG, L_PLAYER, "Can't remove item at pos %d, no playing item found\n", pos);
return -1;
DPRINTF(E_DBG, L_PLAYER, "No playing item for remove by pos\n");
item_id = 0;
}
else
item_id = ps_playing->item_id;
DPRINTF(E_DBG, L_PLAYER, "Removing item from position %d\n", pos);
queue_remove_bypos(queue, ps_playing->item_id, pos, shuffle);
queue_remove_bypos(queue, item_id, pos, shuffle);
cur_plversion++;
@ -4209,7 +4226,7 @@ player_queue_get_byindex(int index, int count)
* Appends the given media items to the queue
*/
int
player_queue_add(struct queue_item *items)
player_queue_add(struct queue_item *items, uint32_t *item_id)
{
struct player_command cmd;
int ret;
@ -4219,6 +4236,7 @@ player_queue_add(struct queue_item *items)
cmd.func = playerqueue_add;
cmd.func_bh = NULL;
cmd.arg.queue_add_param.items = items;
cmd.arg.queue_add_param.item_id_ptr = item_id;
ret = sync_command(&cmd);
@ -4576,6 +4594,8 @@ player_init(void)
player_exit = 0;
clear_queue_on_stop_disabled = cfg_getbool(cfg_getsec(cfg, "mpd"), "clear_queue_on_stop_disable");
dev_autoselect = 1;
dev_list = NULL;

View File

@ -161,7 +161,7 @@ struct queue *
player_queue_get_byindex(int pos, int count);
int
player_queue_add(struct queue_item *items);
player_queue_add(struct queue_item *items, uint32_t *item_id);
int
player_queue_add_next(struct queue_item *items);

View File

@ -336,7 +336,7 @@ queueitem_get_bypos(struct queue *queue, unsigned int item_id, unsigned int pos,
return NULL;
i = 0;
for (item = item_base; item != queue->head && i < pos; item = item_next(item, shuffle))
for (item = item_base; i < pos; item = item_next(item, shuffle))
{
i++;
}