[player] Store item-ids in history to allow start of playback from the

previously played items in dacp
This commit is contained in:
chme 2015-10-03 09:01:26 +02:00
parent b19a7280b9
commit 199b765a7d
4 changed files with 36 additions and 32 deletions

View File

@ -967,6 +967,7 @@ dacp_reply_cue_play(struct evhttp_request *req, struct evbuffer *evbuf, char **u
const char *cuequery;
const char *param;
uint32_t id;
uint32_t item_id;
uint32_t pos;
int clear;
struct player_history *history;
@ -1018,6 +1019,7 @@ dacp_reply_cue_play(struct evhttp_request *req, struct evbuffer *evbuf, char **u
dacp_propset_shufflestate(param, NULL);
id = 0;
item_id = 0;
pos = 0;
param = evhttp_find_header(query, "index");
if (param)
@ -1041,7 +1043,7 @@ dacp_reply_cue_play(struct evhttp_request *req, struct evbuffer *evbuf, char **u
if (history->count > pos)
{
pos = (history->start_index + history->count - pos - 1) % MAX_HISTORY_COUNT;
id = history->id[pos];
item_id = history->item_id[pos];
}
else
{
@ -1060,7 +1062,7 @@ dacp_reply_cue_play(struct evhttp_request *req, struct evbuffer *evbuf, char **u
/* If playing from history queue, the pos holds the id of the item to play */
if (hist)
ret = player_playback_start_byitemid(id, &id); //TODO [queue/history] id does not hold the queueitemid but the dbmfiid
ret = player_playback_start_byitemid(item_id, &id);
else
ret = player_playback_start_bypos(pos, &id);

View File

@ -650,7 +650,7 @@ mpd_command_currentsong(struct evbuffer *evbuf, int argc, char **argv, char **er
return 0;
}
ret = mpd_add_mediainfo_byid(evbuf, status.id, status.queueitem_id, status.pos_pl);
ret = mpd_add_mediainfo_byid(evbuf, status.id, status.item_id, status.pos_pl);
if (ret < 0)
{
ret = asprintf(errmsg, "Error adding media info for file with id: %d", status.id);
@ -839,11 +839,11 @@ mpd_command_status(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
"nextsong: %d\n"
"nextsongid: %d\n",
status.pos_pl,
status.queueitem_id,
status.item_id,
(status.pos_ms / 1000), (status.len_ms / 1000),
(status.pos_ms / 1000.0),
status.next_pos_pl,
status.next_queueitem_id);
status.next_item_id);
}
if (filescanner_scanning())

View File

@ -87,7 +87,7 @@ struct player_source
uint32_t id;
/* Item-Id of the file/item in the queue */
uint32_t queueitem_id;
uint32_t item_id;
/* Length of the file/item in milliseconds */
uint32_t len_ms;
@ -794,7 +794,7 @@ player_history_get(void)
* Add the song with the given id to the list of previously played songs
*/
static void
history_add(uint32_t id)
history_add(uint32_t id, uint32_t item_id)
{
unsigned int cur_index;
unsigned int next_index;
@ -813,6 +813,7 @@ history_add(uint32_t id)
history->start_index = (history->start_index + 1) % MAX_HISTORY_COUNT;
history->id[next_index] = id;
history->item_id[next_index] = item_id;
if (history->count < MAX_HISTORY_COUNT)
history->count++;
@ -1145,7 +1146,7 @@ source_new(struct queue_item *item)
ps = (struct player_source *)calloc(1, sizeof(struct player_source));
ps->id = queueitem_id(item);
ps->queueitem_id = queueitem_item_id(item);
ps->item_id = queueitem_item_id(item);
ps->data_kind = queueitem_data_kind(item);
ps->media_kind = queueitem_media_kind(item);
ps->len_ms = queueitem_len(item);
@ -1458,7 +1459,7 @@ source_check(void)
#ifdef LASTFM
worker_execute(scrobble_cb, &id, sizeof(int), 8);
#endif
history_add(cur_playing->id);
history_add(cur_playing->id, cur_playing->item_id);
/* Stop playback */
if (!cur_playing->play_next)
@ -1523,12 +1524,12 @@ source_read(uint8_t *buf, int len, uint64_t rtptime)
DPRINTF(E_DBG, L_PLAYER, "New file\n");
item = queue_next(queue, cur_streaming->queueitem_id, shuffle, repeat, 1);
item = queue_next(queue, cur_streaming->item_id, shuffle, repeat, 1);
if (ret < 0)
{
DPRINTF(E_LOG, L_PLAYER, "Error reading source %d\n", cur_streaming->id);
queue_remove_byitemid(queue, cur_streaming->queueitem_id);
queue_remove_byitemid(queue, cur_streaming->item_id);
}
if (item)
@ -2185,13 +2186,13 @@ get_status(struct player_command *cmd)
status->status = PLAY_PAUSED;
status->id = cur_streaming->id;
status->queueitem_id = cur_streaming->queueitem_id;
status->item_id = cur_streaming->item_id;
pos = last_rtptime + AIRTUNES_V2_PACKET_SAMPLES - cur_streaming->stream_start;
status->pos_ms = (pos * 1000) / 44100;
status->len_ms = cur_streaming->len_ms;
status->pos_pl = queue_index_byitemid(queue, cur_streaming->queueitem_id, 0);
status->pos_pl = queue_index_byitemid(queue, cur_streaming->item_id, 0);
break;
@ -2231,15 +2232,15 @@ get_status(struct player_command *cmd)
status->len_ms = ps->len_ms;
status->id = ps->id;
status->queueitem_id = ps->queueitem_id;
status->pos_pl = queue_index_byitemid(queue, ps->queueitem_id, 0);
status->item_id = ps->item_id;
status->pos_pl = queue_index_byitemid(queue, ps->item_id, 0);
item_next = queue_next(queue, ps->queueitem_id, shuffle, repeat, 0);
item_next = queue_next(queue, ps->item_id, shuffle, repeat, 0);
if (item_next)
{
status->next_id = queueitem_id(item_next);
status->next_queueitem_id = queueitem_item_id(item_next);
status->next_pos_pl = queue_index_byitemid(queue, status->next_queueitem_id, 0);
status->next_item_id = queueitem_item_id(item_next);
status->next_pos_pl = queue_index_byitemid(queue, status->next_item_id, 0);
}
else
{
@ -2315,7 +2316,7 @@ playback_stop(struct player_command *cmd)
ps_playing = source_now_playing();
if (ps_playing)
{
history_add(ps_playing->id);
history_add(ps_playing->id, ps_playing->item_id);
}
source_stop();
@ -2577,7 +2578,7 @@ playback_start_bypos(struct player_command *cmd)
if (ps_playing)
{
qii = queue_get_bypos(queue, ps_playing->queueitem_id, offset, shuffle);
qii = queue_get_bypos(queue, ps_playing->item_id, offset, shuffle);
}
else
{
@ -2606,7 +2607,7 @@ playback_prev_bh(struct player_command *cmd)
/* Only add to history if playback started. */
if (cur_streaming->output_start > cur_streaming->stream_start)
history_add(cur_streaming->id);
history_add(cur_streaming->id, cur_streaming->item_id);
/* Compute the playing time in seconds for the current song. */
if (cur_streaming->output_start > cur_streaming->stream_start)
@ -2619,7 +2620,7 @@ playback_prev_bh(struct player_command *cmd)
DPRINTF(E_DBG, L_PLAYER, "Skipping song played %d sec\n", pos_sec);
if (pos_sec < 3)
{
item = queue_prev(queue, cur_streaming->queueitem_id, shuffle, repeat);
item = queue_prev(queue, cur_streaming->item_id, shuffle, repeat);
if (!item)
{
playback_abort();
@ -2677,9 +2678,9 @@ playback_next_bh(struct player_command *cmd)
/* Only add to history if playback started. */
if (cur_streaming->output_start > cur_streaming->stream_start)
history_add(cur_streaming->id);
history_add(cur_streaming->id, cur_streaming->item_id);
item = queue_next(queue, cur_streaming->queueitem_id, shuffle, repeat, 0);
item = queue_next(queue, cur_streaming->item_id, shuffle, repeat, 0);
if (!item)
{
playback_abort();
@ -3281,7 +3282,7 @@ shuffle_set(struct player_command *cmd)
case 1:
if (!shuffle)
{
cur_id = cur_streaming ? cur_streaming->queueitem_id : 0;
cur_id = cur_streaming ? cur_streaming->item_id : 0;
queue_shuffle(queue, cur_id);
}
/* FALLTHROUGH*/
@ -3314,7 +3315,7 @@ playerqueue_get_bypos(struct player_command *cmd)
item_id = 0;
if (ps)
{
item_id = ps->queueitem_id;
item_id = ps->item_id;
}
qi = queue_new_bypos(queue, item_id, count, shuffle);
@ -3352,7 +3353,7 @@ playerqueue_add(struct player_command *cmd)
if (shuffle)
{
cur_id = cur_streaming ? cur_streaming->queueitem_id : 0;
cur_id = cur_streaming ? cur_streaming->item_id : 0;
queue_shuffle(queue, cur_id);
}
@ -3374,7 +3375,7 @@ playerqueue_add_next(struct player_command *cmd)
items = cmd->arg.queue_add_param.items;
cur_id = cur_streaming ? cur_streaming->queueitem_id : 0;
cur_id = cur_streaming ? cur_streaming->item_id : 0;
queue_add_after(queue, items, cur_id);
@ -3407,7 +3408,7 @@ playerqueue_move_bypos(struct player_command *cmd)
return -1;
}
queue_move_bypos(queue, ps_playing->queueitem_id, cmd->arg.ps_pos[0], cmd->arg.ps_pos[1], shuffle);
queue_move_bypos(queue, ps_playing->item_id, cmd->arg.ps_pos[0], cmd->arg.ps_pos[1], shuffle);
cur_plversion++;
@ -3438,7 +3439,7 @@ playerqueue_remove_bypos(struct player_command *cmd)
}
DPRINTF(E_DBG, L_PLAYER, "Removing item from position %d\n", pos);
queue_remove_bypos(queue, ps_playing->queueitem_id, pos, shuffle);
queue_remove_bypos(queue, ps_playing->item_id, pos, shuffle);
return 0;
}

View File

@ -54,7 +54,7 @@ struct player_status {
/* Id of the playing file/item in the files database */
uint32_t id;
/* Item-Id of the playing file/item in the queue */
uint32_t queueitem_id;
uint32_t item_id;
/* Elapsed time in ms of playing item */
uint32_t pos_ms;
/* Length in ms of playing item */
@ -64,7 +64,7 @@ struct player_status {
/* Item id of next item in playlist */
uint32_t next_id;
/* Item-Id of the next file/item in the queue */
uint32_t next_queueitem_id;
uint32_t next_item_id;
/* Playlist position of next item */
int next_pos_pl;
};
@ -81,6 +81,7 @@ struct player_history
/* Circular buffer of song ids previously played by forked-daapd */
uint32_t id[MAX_HISTORY_COUNT];
uint32_t item_id[MAX_HISTORY_COUNT];
};