[dacp] Keep the now playing item in the queue when calling (#353)

playqueueedit_clear
This commit is contained in:
chme 2017-02-11 09:28:35 +01:00 committed by ejurgensen
parent 98348b8fe9
commit 3896f61d06
6 changed files with 40 additions and 17 deletions

View File

@ -4811,23 +4811,42 @@ db_queue_cleanup()
#undef Q_TMPL #undef Q_TMPL
} }
/*
* Removes all items from the queue except the item give by 'keep_item_id' (if 'keep_item_id' > 0).
*
* @param keep_item_id item-id (e. g. the now playing item) to be left in the queue
*/
int int
db_queue_clear() db_queue_clear(uint32_t keep_item_id)
{ {
char *query;
int ret; int ret;
query = sqlite3_mprintf("DELETE FROM queue where id <> %d;", keep_item_id);
db_transaction_begin(); db_transaction_begin();
ret = db_query_run("DELETE FROM queue;", 0, 0); ret = db_query_run(query, 1, 0);
if (ret < 0) if (ret < 0)
{ {
db_transaction_rollback(); db_transaction_rollback();
return ret;
} }
else
if (keep_item_id)
{ {
db_transaction_end(); query = sqlite3_mprintf("UPDATE queue SET pos = 0 AND shuffle_pos = 0 where id = %d;", keep_item_id);
queue_inc_version_and_notify(); ret = db_query_run(query, 1, 0);
} }
if (ret < 0)
{
db_transaction_rollback();
return ret;
}
db_transaction_end();
queue_inc_version_and_notify();
return ret; return ret;
} }

View File

@ -735,7 +735,7 @@ int
db_queue_cleanup(); db_queue_cleanup();
int int
db_queue_clear(); db_queue_clear(uint32_t keep_item_id);
int int
db_queue_delete_byitemid(uint32_t item_id); db_queue_delete_byitemid(uint32_t item_id);

View File

@ -1013,7 +1013,7 @@ dacp_reply_cue_play(struct evhttp_request *req, struct evbuffer *evbuf, char **u
{ {
player_playback_stop(); player_playback_stop();
db_queue_clear(); db_queue_clear(0);
} }
} }
@ -1137,7 +1137,7 @@ dacp_reply_cue_clear(struct evhttp_request *req, struct evbuffer *evbuf, char **
player_playback_stop(); player_playback_stop();
db_queue_clear(); db_queue_clear(0);
dmap_add_container(evbuf, "cacr", 24); /* 8 + len */ dmap_add_container(evbuf, "cacr", 24); /* 8 + len */
dmap_add_int(evbuf, "mstt", 200); /* 12 */ dmap_add_int(evbuf, "mstt", 200); /* 12 */
@ -1268,7 +1268,7 @@ dacp_reply_playspec(struct evhttp_request *req, struct evbuffer *evbuf, char **u
if (status.status != PLAY_STOPPED) if (status.status != PLAY_STOPPED)
player_playback_stop(); player_playback_stop();
db_queue_clear(); db_queue_clear(0);
if (plid > 0) if (plid > 0)
ret = db_queue_add_by_playlistid(plid, status.shuffle, status.item_id); ret = db_queue_add_by_playlistid(plid, status.shuffle, status.item_id);
@ -1747,6 +1747,7 @@ static void
dacp_reply_playqueueedit_clear(struct evhttp_request *req, struct evbuffer *evbuf, char **uri, struct evkeyvalq *query) dacp_reply_playqueueedit_clear(struct evhttp_request *req, struct evbuffer *evbuf, char **uri, struct evkeyvalq *query)
{ {
const char *param; const char *param;
struct player_status status;
param = evhttp_find_header(query, "mode"); param = evhttp_find_header(query, "mode");
@ -1758,7 +1759,10 @@ dacp_reply_playqueueedit_clear(struct evhttp_request *req, struct evbuffer *evbu
if (strcmp(param,"0x68697374") == 0) if (strcmp(param,"0x68697374") == 0)
player_queue_clear_history(); player_queue_clear_history();
else else
db_queue_clear(); {
player_get_status(&status);
db_queue_clear(status.item_id);
}
dmap_add_container(evbuf, "cacr", 24); /* 8 + len */ dmap_add_container(evbuf, "cacr", 24); /* 8 + len */
dmap_add_int(evbuf, "mstt", 200); /* 12 */ dmap_add_int(evbuf, "mstt", 200); /* 12 */
@ -1810,7 +1814,7 @@ dacp_reply_playqueueedit_add(struct evhttp_request *req, struct evbuffer *evbuf,
if ((mode == 1) || (mode == 2)) if ((mode == 1) || (mode == 2))
{ {
player_playback_stop(); player_playback_stop();
db_queue_clear(); db_queue_clear(0);
} }
editquery = evhttp_find_header(query, "query"); editquery = evhttp_find_header(query, "query");

View File

@ -613,7 +613,7 @@ fullrescan(void *arg, int *ret)
starttime = time(NULL); starttime = time(NULL);
player_playback_stop(); player_playback_stop();
db_queue_clear(); db_queue_clear(0);
db_purge_all(); // Clears files, playlists, playlistitems, inotify and groups db_purge_all(); // Clears files, playlists, playlistitems, inotify and groups
for (i = 0; sources[i]; i++) for (i = 0; sources[i]; i++)
@ -696,7 +696,7 @@ initscan()
clear_queue_disabled = cfg_getbool(cfg_getsec(cfg, "mpd"), "clear_queue_on_stop_disable"); clear_queue_disabled = cfg_getbool(cfg_getsec(cfg, "mpd"), "clear_queue_on_stop_disable");
if (!clear_queue_disabled) if (!clear_queue_disabled)
{ {
db_queue_clear(); db_queue_clear(0);
} }
for (i = 0; sources[i]; i++) for (i = 0; sources[i]; i++)

View File

@ -1626,7 +1626,7 @@ mpd_command_clear(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
DPRINTF(E_DBG, L_MPD, "Failed to stop playback\n"); DPRINTF(E_DBG, L_MPD, "Failed to stop playback\n");
} }
db_queue_clear(); db_queue_clear(0);
return 0; return 0;
} }
@ -1648,7 +1648,7 @@ mpd_command_delete(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
// If argv[1] is ommited clear the whole queue // If argv[1] is ommited clear the whole queue
if (argc < 2) if (argc < 2)
{ {
db_queue_clear(); db_queue_clear(0);
return 0; return 0;
} }

View File

@ -1696,7 +1696,7 @@ playback_abort(void)
source_stop(); source_stop();
if (!clear_queue_on_stop_disabled) if (!clear_queue_on_stop_disabled)
db_queue_clear(); db_queue_clear(0);
status_update(PLAY_STOPPED); status_update(PLAY_STOPPED);
@ -2052,7 +2052,7 @@ playback_start_id(void *arg, int *retval)
if (player_state == PLAY_STOPPED) if (player_state == PLAY_STOPPED)
{ {
db_queue_clear(); db_queue_clear(0);
ret = db_queue_add_by_fileid(cmdarg->id, 0, 0); ret = db_queue_add_by_fileid(cmdarg->id, 0, 0);
if (ret < 0) if (ret < 0)