[dacp] Start playback from selected song in shuffle mode (#379)
This commit is contained in:
parent
3a35a51cb9
commit
3f10dac2f7
17
src/db.c
17
src/db.c
|
@ -5069,10 +5069,11 @@ db_queue_delete_byposrelativetoitem(uint32_t pos, uint32_t item_id, char shuffle
|
||||||
*
|
*
|
||||||
* @param item_id Queue item id
|
* @param item_id Queue item id
|
||||||
* @param pos_to target position in the queue (zero-based)
|
* @param pos_to target position in the queue (zero-based)
|
||||||
|
* @þaram shuffle If 1 move item in the shuffle queue
|
||||||
* @return 0 on success, -1 on failure
|
* @return 0 on success, -1 on failure
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
db_queue_move_byitemid(uint32_t item_id, int pos_to)
|
db_queue_move_byitemid(uint32_t item_id, int pos_to, char shuffle)
|
||||||
{
|
{
|
||||||
char *query;
|
char *query;
|
||||||
int pos_from;
|
int pos_from;
|
||||||
|
@ -5081,7 +5082,7 @@ db_queue_move_byitemid(uint32_t item_id, int pos_to)
|
||||||
db_transaction_begin();
|
db_transaction_begin();
|
||||||
|
|
||||||
// Find item with the given item_id
|
// Find item with the given item_id
|
||||||
pos_from = db_queue_get_pos(item_id, 0);
|
pos_from = db_queue_get_pos(item_id, shuffle);
|
||||||
if (pos_from < 0)
|
if (pos_from < 0)
|
||||||
{
|
{
|
||||||
db_transaction_rollback();
|
db_transaction_rollback();
|
||||||
|
@ -5089,7 +5090,11 @@ db_queue_move_byitemid(uint32_t item_id, int pos_to)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update pos for all items after the item with given item_id
|
// Update pos for all items after the item with given item_id
|
||||||
|
if (shuffle)
|
||||||
|
query = sqlite3_mprintf("UPDATE queue SET shuffle_pos = shuffle_pos - 1 WHERE shuffle_pos > %d;", pos_from);
|
||||||
|
else
|
||||||
query = sqlite3_mprintf("UPDATE queue SET pos = pos - 1 WHERE pos > %d;", pos_from);
|
query = sqlite3_mprintf("UPDATE queue SET pos = pos - 1 WHERE pos > %d;", pos_from);
|
||||||
|
|
||||||
ret = db_query_run(query, 1, 0);
|
ret = db_query_run(query, 1, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
|
@ -5098,7 +5103,11 @@ db_queue_move_byitemid(uint32_t item_id, int pos_to)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update pos for all items from the given pos_to
|
// Update pos for all items from the given pos_to
|
||||||
|
if (shuffle)
|
||||||
|
query = sqlite3_mprintf("UPDATE queue SET shuffle_pos = shuffle_pos + 1 WHERE shuffle_pos >= %d;", pos_to);
|
||||||
|
else
|
||||||
query = sqlite3_mprintf("UPDATE queue SET pos = pos + 1 WHERE pos >= %d;", pos_to);
|
query = sqlite3_mprintf("UPDATE queue SET pos = pos + 1 WHERE pos >= %d;", pos_to);
|
||||||
|
|
||||||
ret = db_query_run(query, 1, 0);
|
ret = db_query_run(query, 1, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
|
@ -5107,7 +5116,11 @@ db_queue_move_byitemid(uint32_t item_id, int pos_to)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update item with the given item_id
|
// Update item with the given item_id
|
||||||
|
if (shuffle)
|
||||||
|
query = sqlite3_mprintf("UPDATE queue SET shuffle_pos = %d where id = %d;", pos_to, item_id);
|
||||||
|
else
|
||||||
query = sqlite3_mprintf("UPDATE queue SET pos = %d where id = %d;", pos_to, item_id);
|
query = sqlite3_mprintf("UPDATE queue SET pos = %d where id = %d;", pos_to, item_id);
|
||||||
|
|
||||||
ret = db_query_run(query, 1, 0);
|
ret = db_query_run(query, 1, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
|
|
2
src/db.h
2
src/db.h
|
@ -750,7 +750,7 @@ int
|
||||||
db_queue_delete_byposrelativetoitem(uint32_t pos, uint32_t item_id, char shuffle);
|
db_queue_delete_byposrelativetoitem(uint32_t pos, uint32_t item_id, char shuffle);
|
||||||
|
|
||||||
int
|
int
|
||||||
db_queue_move_byitemid(uint32_t item_id, int pos_to);
|
db_queue_move_byitemid(uint32_t item_id, int pos_to, char shuffle);
|
||||||
|
|
||||||
int
|
int
|
||||||
db_queue_move_bypos(int pos_from, int pos_to);
|
db_queue_move_bypos(int pos_from, int pos_to);
|
||||||
|
|
|
@ -984,7 +984,7 @@ dacp_queueitem_add(const char *query, const char *queuefilter, const char *sort,
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (status.shuffle)
|
if (status.shuffle && mode != 1)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return id;
|
return id;
|
||||||
|
@ -1797,6 +1797,7 @@ dacp_reply_playqueueedit_add(struct evhttp_request *req, struct evbuffer *evbuf,
|
||||||
int ret;
|
int ret;
|
||||||
int quirkyquery;
|
int quirkyquery;
|
||||||
struct db_queue_item *queue_item;
|
struct db_queue_item *queue_item;
|
||||||
|
struct player_status status;
|
||||||
|
|
||||||
mode = 1;
|
mode = 1;
|
||||||
|
|
||||||
|
@ -1879,6 +1880,14 @@ dacp_reply_playqueueedit_add(struct evhttp_request *req, struct evbuffer *evbuf,
|
||||||
|
|
||||||
if (queue_item)
|
if (queue_item)
|
||||||
{
|
{
|
||||||
|
player_get_status(&status);
|
||||||
|
|
||||||
|
if (status.shuffle)
|
||||||
|
{
|
||||||
|
DPRINTF(E_DBG, L_DACP, "Start shuffle queue with item %d\n", queue_item->id);
|
||||||
|
db_queue_move_byitemid(queue_item->id, 0, status.shuffle);
|
||||||
|
}
|
||||||
|
|
||||||
DPRINTF(E_DBG, L_DACP, "Song queue built, starting playback at index %d\n", queue_item->pos);
|
DPRINTF(E_DBG, L_DACP, "Song queue built, starting playback at index %d\n", queue_item->pos);
|
||||||
ret = player_playback_start_byitem(queue_item);
|
ret = player_playback_start_byitem(queue_item);
|
||||||
free_queue_item(queue_item, 0);
|
free_queue_item(queue_item, 0);
|
||||||
|
|
|
@ -1841,7 +1841,7 @@ mpd_command_moveid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
|
||||||
return ACK_ERROR_ARG;
|
return ACK_ERROR_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = db_queue_move_byitemid(songid, to_pos);
|
ret = db_queue_move_byitemid(songid, to_pos, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
ret = asprintf(errmsg, "Failed to move song with id '%s' to index '%s'", argv[1], argv[2]);
|
ret = asprintf(errmsg, "Failed to move song with id '%s' to index '%s'", argv[1], argv[2]);
|
||||||
|
|
Loading…
Reference in New Issue