mirror of
https://github.com/owntone/owntone-server.git
synced 2024-12-25 14:45:55 -05:00
fixes for playqueue-contents
This commit is contained in:
parent
5f307c7ce1
commit
8036a5a6d3
@ -1140,12 +1140,17 @@ playqueuecontents_add_source(struct evbuffer *songlist, uint32_t source_id, int
|
|||||||
|
|
||||||
song = evbuffer_new();
|
song = evbuffer_new();
|
||||||
if (!song)
|
if (!song)
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_DACP, "Could not allocate song evbuffer for playqueue-contents\n");
|
DPRINTF(E_LOG, L_DACP, "Could not allocate song evbuffer for playqueue-contents\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
mfi = db_file_fetch_byid(source_id);
|
mfi = db_file_fetch_byid(source_id);
|
||||||
|
if (!mfi)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_DACP, "Could not fetch file id %d\n", source_id);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
dmap_add_container(song, "ceQs", 16);
|
dmap_add_container(song, "ceQs", 16);
|
||||||
dmap_add_raw_uint32(song, 1); /* Database */
|
dmap_add_raw_uint32(song, 1); /* Database */
|
||||||
dmap_add_raw_uint32(song, plid);
|
dmap_add_raw_uint32(song, plid);
|
||||||
@ -1167,14 +1172,13 @@ playqueuecontents_add_source(struct evbuffer *songlist, uint32_t source_id, int
|
|||||||
|
|
||||||
ret = evbuffer_add_buffer(songlist, song);
|
ret = evbuffer_add_buffer(songlist, song);
|
||||||
evbuffer_free(song);
|
evbuffer_free(song);
|
||||||
if (mfi)
|
free_mfi(mfi, 0);
|
||||||
free_mfi(mfi, 0);
|
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_DACP, "Could not add song to songlist for playqueue-contents\n");
|
DPRINTF(E_LOG, L_DACP, "Could not add song to songlist for playqueue-contents\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1246,10 +1250,9 @@ static void dacp_reply_playqueuecontents(struct evhttp_request *req, struct evbu
|
|||||||
{
|
{
|
||||||
start_index = (history->start_index + history->count - abs(span)) % MAX_HISTORY_COUNT;
|
start_index = (history->start_index + history->count - abs(span)) % MAX_HISTORY_COUNT;
|
||||||
}
|
}
|
||||||
for (i = 0; i < history->count && i < abs(span); i++)
|
for (n = 0; n < history->count && n < abs(span); n++)
|
||||||
{
|
{
|
||||||
n++;
|
ret = playqueuecontents_add_source(songlist, history->id[(start_index + n) % MAX_HISTORY_COUNT], (n + 1), status.plid);
|
||||||
ret = playqueuecontents_add_source(songlist, history->buffer[(start_index + i) % MAX_HISTORY_COUNT], (n + i + 1), status.plid);
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_DACP, "Could not add song to songlist for playqueue-contents\n");
|
DPRINTF(E_LOG, L_DACP, "Could not add song to songlist for playqueue-contents\n");
|
||||||
@ -1286,6 +1289,7 @@ static void dacp_reply_playqueuecontents(struct evhttp_request *req, struct evbu
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Playlists are hist, curr and main. */
|
||||||
playlists = evbuffer_new();
|
playlists = evbuffer_new();
|
||||||
if (!playlists)
|
if (!playlists)
|
||||||
{
|
{
|
||||||
|
88
src/player.c
88
src/player.c
@ -1448,11 +1448,23 @@ player_history_get(void)
|
|||||||
static void
|
static void
|
||||||
history_add(uint32_t id)
|
history_add(uint32_t id)
|
||||||
{
|
{
|
||||||
unsigned int next_index = (history->start_index + history->count) % MAX_HISTORY_COUNT;
|
unsigned int cur_index;
|
||||||
|
unsigned int next_index;
|
||||||
|
|
||||||
|
/* Check if the current song is already the last in the history to avoid duplicates */
|
||||||
|
cur_index = (history->start_index + history->count - 1) % MAX_HISTORY_COUNT;
|
||||||
|
if (id == history->id[cur_index])
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_PLAYER, "Current playing/streaming song already in history\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Calculate the next index and update the start-index and count for the id-buffer */
|
||||||
|
next_index = (history->start_index + history->count) % MAX_HISTORY_COUNT;
|
||||||
if (next_index == history->start_index && history->count > 0)
|
if (next_index == history->start_index && history->count > 0)
|
||||||
history->start_index = (history->start_index + 1) % MAX_HISTORY_COUNT;
|
history->start_index = (history->start_index + 1) % MAX_HISTORY_COUNT;
|
||||||
|
|
||||||
history->buffer[next_index] = id;
|
history->id[next_index] = id;
|
||||||
|
|
||||||
if (history->count < MAX_HISTORY_COUNT)
|
if (history->count < MAX_HISTORY_COUNT)
|
||||||
history->count++;
|
history->count++;
|
||||||
@ -1471,20 +1483,20 @@ source_read(uint8_t *buf, int len, uint64_t rtptime)
|
|||||||
nbytes = 0;
|
nbytes = 0;
|
||||||
new = 0;
|
new = 0;
|
||||||
while (nbytes < len)
|
while (nbytes < len)
|
||||||
{
|
|
||||||
if (new)
|
|
||||||
{
|
{
|
||||||
DPRINTF(E_DBG, L_PLAYER, "New file\n");
|
if (new)
|
||||||
|
{
|
||||||
|
DPRINTF(E_DBG, L_PLAYER, "New file\n");
|
||||||
|
|
||||||
new = 0;
|
new = 0;
|
||||||
|
|
||||||
// add song to the played history
|
// add song to the played history
|
||||||
history_add(cur_streaming->id);
|
history_add(cur_streaming->id);
|
||||||
|
|
||||||
ret = source_next(0);
|
ret = source_next(0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EVBUFFER_LENGTH(audio_buf) == 0)
|
if (EVBUFFER_LENGTH(audio_buf) == 0)
|
||||||
{
|
{
|
||||||
@ -2295,15 +2307,15 @@ playback_stop(struct player_command *cmd)
|
|||||||
pb_timer_fd = -1;
|
pb_timer_fd = -1;
|
||||||
|
|
||||||
if (cur_playing)
|
if (cur_playing)
|
||||||
{
|
{
|
||||||
history_add(cur_playing->id);
|
history_add(cur_playing->id);
|
||||||
source_stop(cur_playing);
|
source_stop(cur_playing);
|
||||||
}
|
}
|
||||||
else if (cur_streaming)
|
else if (cur_streaming)
|
||||||
{
|
{
|
||||||
history_add(cur_streaming->id);
|
history_add(cur_streaming->id);
|
||||||
source_stop(cur_streaming);
|
source_stop(cur_streaming);
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_playing = NULL;
|
cur_playing = NULL;
|
||||||
cur_streaming = NULL;
|
cur_streaming = NULL;
|
||||||
@ -2622,15 +2634,17 @@ playback_prev_bh(struct player_command *cmd)
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (cur_playing)
|
if (cur_playing)
|
||||||
{
|
{
|
||||||
history_add(cur_playing->id);
|
if (cur_playing->end > cur_playing->stream_start)
|
||||||
source_stop(cur_playing);
|
history_add(cur_playing->id);
|
||||||
}
|
source_stop(cur_playing);
|
||||||
|
}
|
||||||
else if (cur_streaming)
|
else if (cur_streaming)
|
||||||
{
|
{
|
||||||
history_add(cur_streaming->id);
|
if (cur_streaming->end > cur_streaming->stream_start)
|
||||||
source_stop(cur_streaming);
|
history_add(cur_streaming->id);
|
||||||
}
|
source_stop(cur_streaming);
|
||||||
|
}
|
||||||
|
|
||||||
ret = source_prev();
|
ret = source_prev();
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -2660,15 +2674,17 @@ playback_next_bh(struct player_command *cmd)
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (cur_playing)
|
if (cur_playing)
|
||||||
{
|
{
|
||||||
history_add(cur_playing->id);
|
if (cur_playing->end > cur_playing->stream_start)
|
||||||
source_stop(cur_playing);
|
history_add(cur_playing->id);
|
||||||
}
|
source_stop(cur_playing);
|
||||||
|
}
|
||||||
else if (cur_streaming)
|
else if (cur_streaming)
|
||||||
{
|
{
|
||||||
history_add(cur_streaming->id);
|
if (cur_streaming->end > cur_streaming->stream_start)
|
||||||
source_stop(cur_streaming);
|
history_add(cur_streaming->id);
|
||||||
}
|
source_stop(cur_streaming);
|
||||||
|
}
|
||||||
|
|
||||||
ret = source_next(1);
|
ret = source_next(1);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
@ -96,7 +96,7 @@ struct player_history
|
|||||||
unsigned int count;
|
unsigned int count;
|
||||||
|
|
||||||
/* Circular buffer of song ids previously played by forked-daapd */
|
/* Circular buffer of song ids previously played by forked-daapd */
|
||||||
uint32_t buffer[MAX_HISTORY_COUNT];
|
uint32_t id[MAX_HISTORY_COUNT];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user