[queue] Remove queue_info and queue_item_info structs

This commit is contained in:
chme 2015-10-03 08:24:13 +02:00
parent 35df9455b9
commit ba3385b0ec
6 changed files with 240 additions and 201 deletions

View File

@ -822,7 +822,7 @@ find_first_song_id(const char *query)
static int
make_queue_byquery(struct queue_item **head, const char *query, const char *queuefilter, const char *sort, int quirk)
dacp_queueitem_make(struct queue_item **head, const char *query, const char *queuefilter, const char *sort, int quirk)
{
struct media_file_info *mfi;
struct query_params qp;
@ -942,7 +942,7 @@ make_queue_byquery(struct queue_item **head, const char *query, const char *queu
qp.sort = S_ARTIST;
}
items = queue_make(&qp);
items = queueitem_make_byquery(&qp);
if (qp.filter)
free(qp.filter);
@ -994,7 +994,7 @@ dacp_reply_cue_play(struct evhttp_request *req, struct evbuffer *evbuf, char **u
{
sort = evhttp_find_header(query, "sort");
ret = make_queue_byquery(&items, cuequery, NULL, sort, 0);
ret = dacp_queueitem_make(&items, cuequery, NULL, sort, 0);
if (ret < 0)
{
DPRINTF(E_LOG, L_DACP, "Could not build song queue\n");
@ -1215,9 +1215,9 @@ dacp_reply_playspec(struct evhttp_request *req, struct evbuffer *evbuf, char **u
items = NULL;
if (plid > 0)
items = queue_make_pl(plid);
items = queueitem_make_byplid(plid);
else if (pos > 0)
items = queue_make_item(pos);
items = queueitem_make_byid(pos);
if (!items)
{
@ -1474,11 +1474,13 @@ dacp_reply_playqueuecontents(struct evhttp_request *req, struct evbuffer *evbuf,
struct evbuffer *playlists;
struct player_status status;
struct player_history *history;
struct queue_info *queue;
struct queue *queue;
struct queue_item *item;
const char *param;
size_t songlist_length;
size_t playlist_length;
int span;
int count;
int i;
int n;
int ret;
@ -1549,10 +1551,12 @@ dacp_reply_playqueuecontents(struct evhttp_request *req, struct evbuffer *evbuf,
queue = player_queue_get_bypos(abs(span));
if (queue)
{
i = queue->start_pos;
for (n = 0; (n < queue->count) && (n < abs(span)); n++)
i = 0;
count = queue_count(queue);
for (n = 0; (n < count) && (n < abs(span)); n++)
{
ret = playqueuecontents_add_source(songlist, queue->queue[n].dbmfi_id, (n + i + 1), status.plid);
item = queue_get_byindex(queue, n, 0);
ret = playqueuecontents_add_source(songlist, queueitem_id(item), (n + i + 1), status.plid);
if (ret < 0)
{
DPRINTF(E_LOG, L_DACP, "Could not add song to songlist for playqueue-contents\n");
@ -1561,7 +1565,7 @@ dacp_reply_playqueuecontents(struct evhttp_request *req, struct evbuffer *evbuf,
return;
}
}
queue_info_free(queue);
queue_free(queue);
}
}
}
@ -1730,7 +1734,7 @@ dacp_reply_playqueueedit_add(struct evhttp_request *req, struct evbuffer *evbuf,
if (!querymodifier || (strcmp(querymodifier, "containers") != 0))
{
quirkyquery = (mode == 1) && strstr(editquery, "dmap.itemid:") && ((!queuefilter) || strstr(queuefilter, "(null)"));
ret = make_queue_byquery(&items, editquery, queuefilter, sort, quirkyquery);
ret = dacp_queueitem_make(&items, editquery, queuefilter, sort, quirkyquery);
}
else
{
@ -1745,7 +1749,7 @@ dacp_reply_playqueueedit_add(struct evhttp_request *req, struct evbuffer *evbuf,
}
snprintf(modifiedquery, sizeof(modifiedquery), "playlist:%d", plid);
ret = make_queue_byquery(&items, NULL, modifiedquery, sort, 0);
ret = dacp_queueitem_make(&items, NULL, modifiedquery, sort, 0);
}
if (ret < 0)

View File

@ -1508,7 +1508,7 @@ mpd_command_stop(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
}
static struct queue_item *
make_queue_bypath(char *path, int recursive)
mpd_queueitem_make(char *path, int recursive)
{
struct query_params qp;
struct queue_item *items;
@ -1532,7 +1532,7 @@ make_queue_bypath(char *path, int recursive)
DPRINTF(E_DBG, L_PLAYER, "Out of memory\n");
}
items = queue_make(&qp);
items = queueitem_make_byquery(&qp);
sqlite3_free(qp.filter);
return items;
@ -1557,7 +1557,7 @@ mpd_command_add(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
return ACK_ERROR_ARG;
}
items = make_queue_bypath(argv[1], 1);
items = mpd_queueitem_make(argv[1], 1);
if (!items)
{
@ -1604,7 +1604,7 @@ mpd_command_addid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
DPRINTF(E_LOG, L_MPD, "Adding at a specified position not supported for 'addid', adding songs at end of queue.\n");
}
items = make_queue_bypath(argv[1], 0);
items = mpd_queueitem_make(argv[1], 0);
if (!items)
{
@ -1758,9 +1758,11 @@ mpd_command_deleteid(struct evbuffer *evbuf, int argc, char **argv, char **errms
static int
mpd_command_playlistid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
{
struct queue_info *queue;
struct queue *queue;
struct queue_item *item;
uint32_t songid;
int pos_pl;
int count;
int i;
int ret;
@ -1787,17 +1789,19 @@ mpd_command_playlistid(struct evbuffer *evbuf, int argc, char **argv, char **err
return 0;
}
pos_pl = queue->start_pos;
for (i = 0; i < queue->count; i++)
pos_pl = 0;
count = queue_count(queue);
for (i = 0; i < count; i++)
{
if (songid == 0 || songid == queue->queue[i].item_id)
item = queue_get_byindex(queue, i, 0);
if (songid == 0 || songid == queueitem_item_id(item))
{
ret = mpd_add_mediainfo_byid(evbuf, queue->queue[i].dbmfi_id, queue->queue[i].item_id, pos_pl);
ret = mpd_add_mediainfo_byid(evbuf, queueitem_id(item), queueitem_item_id(item), pos_pl);
if (ret < 0)
{
ret = asprintf(errmsg, "Error adding media info for file with id: %d", queue->queue[i].dbmfi_id);
ret = asprintf(errmsg, "Error adding media info for file with id: %d", queueitem_id(item));
queue_info_free(queue);
queue_free(queue);
if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n");
@ -1808,7 +1812,7 @@ mpd_command_playlistid(struct evbuffer *evbuf, int argc, char **argv, char **err
pos_pl++;
}
queue_info_free(queue);
queue_free(queue);
return 0;
}
@ -1824,7 +1828,8 @@ mpd_command_playlistid(struct evbuffer *evbuf, int argc, char **argv, char **err
static int
mpd_command_playlistinfo(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
{
struct queue_info *queue;
struct queue *queue;
struct queue_item *item;
int start_pos;
int end_pos;
int count;
@ -1864,15 +1869,17 @@ mpd_command_playlistinfo(struct evbuffer *evbuf, int argc, char **argv, char **e
return 0;
}
pos_pl = queue->start_pos;
for (i = 0; i < queue->count; i++)
pos_pl = start_pos;
count = queue_count(queue);
for (i = 0; i < count; i++)
{
ret = mpd_add_mediainfo_byid(evbuf, queue->queue[i].dbmfi_id, queue->queue[i].item_id, pos_pl);
item = queue_get_byindex(queue, i, 0);
ret = mpd_add_mediainfo_byid(evbuf, queueitem_id(item), queueitem_item_id(item), pos_pl);
if (ret < 0)
{
ret = asprintf(errmsg, "Error adding media info for file with id: %d", queue->queue[i].dbmfi_id);
ret = asprintf(errmsg, "Error adding media info for file with id: %d", queueitem_id(item));
queue_info_free(queue);
queue_free(queue);
if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n");
@ -1882,7 +1889,7 @@ mpd_command_playlistinfo(struct evbuffer *evbuf, int argc, char **argv, char **e
pos_pl++;
}
queue_info_free(queue);
queue_free(queue);
return 0;
}
@ -1894,8 +1901,10 @@ mpd_command_playlistinfo(struct evbuffer *evbuf, int argc, char **argv, char **e
static int
mpd_command_plchanges(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
{
struct queue_info *queue;
struct queue *queue;
struct queue_item *item;
int pos_pl;
int count;
int i;
int ret;
@ -1911,15 +1920,17 @@ mpd_command_plchanges(struct evbuffer *evbuf, int argc, char **argv, char **errm
return 0;
}
pos_pl = queue->start_pos;
for (i = 0; i < queue->count; i++)
pos_pl = 0;
count = queue_count(queue);
for (i = 0; i < count; i++)
{
ret = mpd_add_mediainfo_byid(evbuf, queue->queue[i].dbmfi_id, queue->queue[i].item_id, pos_pl);
item = queue_get_byindex(queue, i, 0);
ret = mpd_add_mediainfo_byid(evbuf, queueitem_id(item), queueitem_item_id(item), pos_pl);
if (ret < 0)
{
ret = asprintf(errmsg, "Error adding media info for file with id: %d", queue->queue[i].dbmfi_id);
ret = asprintf(errmsg, "Error adding media info for file with id: %d", queueitem_id(item));
queue_info_free(queue);
queue_free(queue);
if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n");
@ -1929,7 +1940,7 @@ mpd_command_plchanges(struct evbuffer *evbuf, int argc, char **argv, char **errm
pos_pl++;
}
queue_info_free(queue);
queue_free(queue);
return 0;
}
@ -2174,7 +2185,7 @@ mpd_command_load(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
//TODO If a second parameter is given only add the specified range of songs to the playqueue
items = queue_make_pl(pli->id);
items = queueitem_make_byplid(pli->id);
if (!items)
{
@ -2442,7 +2453,7 @@ mpd_command_findadd(struct evbuffer *evbuf, int argc, char **argv, char **errmsg
mpd_get_query_params_find(argc - 1, argv + 1, &qp);
items = queue_make(&qp);
items = queueitem_make_byquery(&qp);
if (!items)
{
@ -2916,7 +2927,7 @@ mpd_command_searchadd(struct evbuffer *evbuf, int argc, char **argv, char **errm
mpd_get_query_params_search(argc - 1, argv + 1, &qp);
items = queue_make(&qp);
items = queueitem_make_byquery(&qp);
if (!items)
{

View File

@ -155,7 +155,7 @@ struct playerqueue_get_param
int pos;
int count;
struct queue_info *queue;
struct queue *queue;
};
struct playerqueue_add_param
@ -1138,17 +1138,17 @@ source_now_playing()
* Creates a new player source for the given queue item
*/
static struct player_source *
source_new(struct queue_item_info *item)
source_new(struct queue_item *item)
{
struct player_source *ps;
ps = (struct player_source *)calloc(1, sizeof(struct player_source));
ps->id = item->dbmfi_id;
ps->queueitem_id = item->item_id;
ps->data_kind = item->data_kind;
ps->media_kind = item->media_kind;
ps->len_ms = item->len_ms;
ps->id = queueitem_id(item);
ps->queueitem_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);
ps->play_next = NULL;
return ps;
@ -1326,10 +1326,11 @@ source_play()
* Stream-start and output-start values are set to the given start position.
*/
static int
source_open(struct queue_item_info *qii, uint64_t start_pos, int seek)
source_open(struct queue_item *qii, uint64_t start_pos, int seek)
{
struct player_source *ps;
struct media_file_info *mfi;
uint32_t id;
int ret;
if (cur_streaming && cur_streaming->end == 0)
@ -1338,17 +1339,18 @@ source_open(struct queue_item_info *qii, uint64_t start_pos, int seek)
return -1;
}
mfi = db_file_fetch_byid(qii->dbmfi_id);
id = queueitem_id(qii);
mfi = db_file_fetch_byid(id);
if (!mfi)
{
DPRINTF(E_LOG, L_PLAYER, "Couldn't fetch file id %d\n", qii->dbmfi_id);
DPRINTF(E_LOG, L_PLAYER, "Couldn't fetch file id %d\n", id);
return -1;
}
if (mfi->disabled)
{
DPRINTF(E_DBG, L_PLAYER, "File id %d is disabled, skipping\n", qii->dbmfi_id);
DPRINTF(E_DBG, L_PLAYER, "File id %d is disabled, skipping\n", id);
free_mfi(mfi, 0);
return -1;
@ -1490,7 +1492,7 @@ source_read(uint8_t *buf, int len, uint64_t rtptime)
int ret;
int nbytes;
char *silence_buf;
struct queue_item_info *item;
struct queue_item *item;
if (!cur_streaming)
return 0;
@ -2154,7 +2156,7 @@ get_status(struct player_command *cmd)
struct timespec ts;
struct player_source *ps;
struct player_status *status;
struct queue_item_info *item_next;
struct queue_item *item_next;
uint64_t pos;
int ret;
@ -2235,9 +2237,9 @@ get_status(struct player_command *cmd)
item_next = queue_next(queue, ps->queueitem_id, shuffle, repeat, 0);
if (item_next)
{
status->next_id = item_next->dbmfi_id;
status->next_queueitem_id = item_next->item_id;
status->next_pos_pl = queue_index_byitemid(queue, item_next->item_id, 0);
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);
}
else
{
@ -2397,12 +2399,12 @@ playback_start_bh(struct player_command *cmd)
}
static int
playback_start_item(struct player_command *cmd, struct queue_item_info *qii)
playback_start_item(struct player_command *cmd, struct queue_item *qii)
{
uint32_t *dbmfi_id;
struct raop_device *rd;
struct player_source *ps_playing;
struct queue_item_info *item;
struct queue_item *item;
int ret;
dbmfi_id = cmd->arg.playback_start_param.id_ptr;
@ -2540,7 +2542,7 @@ static int
playback_start_byitemid(struct player_command *cmd)
{
int item_id;
struct queue_item_info *qii;
struct queue_item *qii;
item_id = cmd->arg.playback_start_param.id;
@ -2553,7 +2555,7 @@ static int
playback_start_byindex(struct player_command *cmd)
{
int pos;
struct queue_item_info *qii;
struct queue_item *qii;
pos = cmd->arg.playback_start_param.pos;
@ -2567,7 +2569,7 @@ playback_start_bypos(struct player_command *cmd)
{
int offset;
struct player_source *ps_playing;
struct queue_item_info *qii;
struct queue_item *qii;
offset = cmd->arg.playback_start_param.pos;
@ -2590,7 +2592,7 @@ playback_prev_bh(struct player_command *cmd)
{
int ret;
int pos_sec;
struct queue_item_info *item;
struct queue_item *item;
/*
* The upper half is playback_pause, therefor the current playing item is
@ -2661,7 +2663,7 @@ static int
playback_next_bh(struct player_command *cmd)
{
int ret;
struct queue_item_info *item;
struct queue_item *item;
/*
* The upper half is playback_pause, therefor the current playing item is
@ -3301,7 +3303,7 @@ static int
playerqueue_get_bypos(struct player_command *cmd)
{
int count;
struct queue_info *qi;
struct queue *qi;
struct player_source *ps;
int item_id;
@ -3315,7 +3317,7 @@ playerqueue_get_bypos(struct player_command *cmd)
item_id = ps->queueitem_id;
}
qi = queue_info_new_bypos(queue, item_id, count, shuffle);
qi = queue_new_bypos(queue, item_id, count, shuffle);
cmd->arg.queue_get_param.queue = qi;
@ -3327,12 +3329,12 @@ playerqueue_get_byindex(struct player_command *cmd)
{
int pos;
int count;
struct queue_info *qi;
struct queue *qi;
pos = cmd->arg.queue_get_param.pos;
count = cmd->arg.queue_get_param.count;
qi = queue_info_new_byindex(queue, pos, count, 0);
qi = queue_new_byindex(queue, pos, count, 0);
cmd->arg.queue_get_param.queue = qi;
return 0;
@ -4053,7 +4055,7 @@ player_shuffle_set(int enable)
* @param count max number of media items to return
* @return queue info
*/
struct queue_info *
struct queue *
player_queue_get_bypos(int count)
{
struct player_command cmd;
@ -4085,7 +4087,7 @@ player_queue_get_bypos(int count)
* @param count max number of media items to return
* @return queue info
*/
struct queue_info *
struct queue *
player_queue_get_byindex(int index, int count)
{
struct player_command cmd;

View File

@ -161,10 +161,10 @@ int
player_shuffle_set(int enable);
struct queue_info *
struct queue *
player_queue_get_bypos(int count);
struct queue_info *
struct queue *
player_queue_get_byindex(int pos, int count);
int

View File

@ -31,12 +31,24 @@
/*
* Internal representation of an item in a queue. It links to the previous and the next item
* in the queue for shuffle on/off. Only the queue_item_info can be exposed.
* in the queue for shuffle on/off. To access the properties use the queueitem_* functions.
*/
struct queue_item
{
/* Identifies the item in the db and the queue */
struct queue_item_info qii;
/* Item-Id is a unique id for this queue item. If the same item appears multiple
times in the queue each corresponding queue item has its own id. */
unsigned int item_id;
/* Id of the file/item in the files database */
uint32_t id;
/* Length of the item in ms */
unsigned int len_ms;
/* Data type of the item */
enum data_kind data_kind;
/* Media type of the item */
enum media_kind media_kind;
/* Link to the previous/next item in the queue */
struct queue_item *next;
@ -183,29 +195,74 @@ item_prev(struct queue_item *item, char shuffle)
* If no item is found for the given id, it returns -1.
*/
int
queueitem_pos(struct queue_item *item, uint32_t dbmfi_id)
queueitem_pos(struct queue_item *item, uint32_t id)
{
struct queue_item *temp;
int pos;
if (dbmfi_id == 0 || item->qii.dbmfi_id == dbmfi_id)
if (id == 0 || item->id == id)
return 0;
pos = 1;
for (temp = item->next; (temp != item) && temp->qii.dbmfi_id != dbmfi_id; temp = temp->next)
for (temp = item->next; (temp != item) && temp->id != id; temp = temp->next)
{
pos++;
}
if (temp == item)
{
// Item with given dbmfi_id does not exists
// Item with given (database) id does not exists
return -1;
}
return pos;
}
/*
* Returns the id of the item/file in the files database table
*/
uint32_t
queueitem_id(struct queue_item *item)
{
return item->id;
}
/*
* Returns the queue-item-id
*/
unsigned int
queueitem_item_id(struct queue_item *item)
{
return item->item_id;
}
/*
* Returns the length of the item in milliseconds
*/
unsigned int
queueitem_len(struct queue_item *item)
{
return item->len_ms;
}
/*
* Returns the data-kind
*/
enum data_kind
queueitem_data_kind(struct queue_item *item)
{
return item->data_kind;
}
/*
* Returns the media-kind
*/
enum media_kind
queueitem_media_kind(struct queue_item *item)
{
return item->media_kind;
}
/*
* Returns the item with the given item_id in the queue
*
@ -218,7 +275,7 @@ queueitem_get_byitemid(struct queue *queue, int item_id)
{
struct queue_item *item;
for (item = queue->head->next; item != queue->head && item->qii.item_id != item_id; item = item->next)
for (item = queue->head->next; item != queue->head && item->item_id != item_id; item = item->next)
{
// Iterate through the queue until the item with item_id is found
}
@ -297,7 +354,7 @@ queueitem_get_bypos(struct queue *queue, unsigned int item_id, unsigned int pos,
* @param item_id The unique id of the item in the queue
* @return Item with the given item_id or NULL if not found
*/
struct queue_item_info *
struct queue_item *
queue_get_byitemid(struct queue *queue, unsigned int item_id)
{
struct queue_item *item;
@ -307,7 +364,7 @@ queue_get_byitemid(struct queue *queue, unsigned int item_id)
if (!item)
return NULL;
return &item->qii;
return item;
}
/*
@ -318,7 +375,7 @@ queue_get_byitemid(struct queue *queue, unsigned int item_id)
* @param shuffle Play queue (shuffle = 0) or shuffle queue (shuffle = 1)
* @return Item at index in the queue or NULL if not found
*/
struct queue_item_info *
struct queue_item *
queue_get_byindex(struct queue *queue, unsigned int index, char shuffle)
{
struct queue_item *item;
@ -328,7 +385,7 @@ queue_get_byindex(struct queue *queue, unsigned int index, char shuffle)
if (!item)
return NULL;
return &item->qii;
return item;
}
/*
@ -343,7 +400,7 @@ queue_get_byindex(struct queue *queue, unsigned int index, char shuffle)
* @param shuffle If 0 the position in the play-queue, 1 the position in the shuffle-queue
* @return Item at position in the queue or NULL if not found
*/
struct queue_item_info *
struct queue_item *
queue_get_bypos(struct queue *queue, unsigned int item_id, unsigned int pos, char shuffle)
{
struct queue_item *item;
@ -353,7 +410,7 @@ queue_get_bypos(struct queue *queue, unsigned int item_id, unsigned int pos, cha
if (!item)
return NULL;
return &item->qii;
return item;
}
/*
@ -373,7 +430,7 @@ queue_index_byitemid(struct queue *queue, unsigned int item_id, char shuffle)
int pos;
pos = 0;
for (item = item_next(queue->head, shuffle); item != queue->head && item->qii.item_id != item_id; item = item_next(item, shuffle))
for (item = item_next(queue->head, shuffle); item != queue->head && item->item_id != item_id; item = item_next(item, shuffle))
{
pos++;
}
@ -395,7 +452,7 @@ queue_index_byitemid(struct queue *queue, unsigned int item_id, char shuffle)
* @param reshuffle If 1 and repeat mode is "repeat all" reshuffles the queue on wrap around
* @return The next item
*/
struct queue_item_info *
struct queue_item *
queue_next(struct queue *queue, unsigned int item_id, char shuffle, enum repeat_mode r_mode, int reshuffle)
{
struct queue_item *item;
@ -407,7 +464,7 @@ queue_next(struct queue *queue, unsigned int item_id, char shuffle, enum repeat_
return NULL;
if (r_mode == REPEAT_SONG && item != queue->head)
return &item->qii;
return item;
item = item_next(item, shuffle);
@ -422,7 +479,7 @@ queue_next(struct queue *queue, unsigned int item_id, char shuffle, enum repeat_
if (item == queue->head)
return NULL;
return &item->qii;
return item;
}
/*
@ -434,7 +491,7 @@ queue_next(struct queue *queue, unsigned int item_id, char shuffle, enum repeat_
* @param r_mode Repeat mode
* @return The previous item
*/
struct queue_item_info *
struct queue_item *
queue_prev(struct queue *queue, unsigned int item_id, char shuffle, enum repeat_mode r_mode)
{
struct queue_item *item;
@ -446,7 +503,7 @@ queue_prev(struct queue *queue, unsigned int item_id, char shuffle, enum repeat_
return NULL;
if (r_mode == REPEAT_SONG && item != queue->head)
return &item->qii;
return item;
item = item_prev(item, shuffle);
@ -459,11 +516,11 @@ queue_prev(struct queue *queue, unsigned int item_id, char shuffle, enum repeat_
if (item == queue->head)
return NULL;
return &item->qii;
return item;
}
/*
* Creates a new queue-info for the given queue.
* Creates a new queue with a copy of the items of the given queue.
*
* The given number of items (count) are copied from the play-queue (shuffle = 0) or shuffle-queue (shuffle = 1)
* starting with the item at the given index (0-based).
@ -474,19 +531,20 @@ queue_prev(struct queue *queue, unsigned int item_id, char shuffle, enum repeat_
* @param index Index of the first item in the queue
* @param count Maximum number of items to copy (if 0 all remaining items after index)
* @param shuffle If 0 the play-queue, if 1 the shuffle queue
* @return A new queue-info with the specified items
* @return A new queue with the specified items
*/
struct queue_info *
queue_info_new_byindex(struct queue *queue, unsigned int index, unsigned int count, char shuffle)
struct queue *
queue_new_byindex(struct queue *queue, unsigned int index, unsigned int count, char shuffle)
{
struct queue_info *qi;
struct queue_item_info *qii;
struct queue_item *item_base;
struct queue *qi;
struct queue_item *qii;
struct queue_item *item;
unsigned int i;
int i;
unsigned int qlength;
int qii_size;
qi = queue_new();
qlength = queue_count(queue);
qii_size = qlength - index;
@ -495,39 +553,37 @@ queue_info_new_byindex(struct queue *queue, unsigned int index, unsigned int cou
if (qii_size <= 0)
{
return NULL;
return qi;
}
item_base = queueitem_get_byindex(queue, index, shuffle);
item = queueitem_get_byindex(queue, index, shuffle);
if (!item_base)
if (!item)
return NULL;
qi = malloc(sizeof(struct queue_info));
qii = malloc(qii_size * sizeof(struct queue_item_info));
i = 0;
for (item = item_base; item != queue->head && i < qii_size; item = item_next(item, shuffle))
for (; item != queue->head && i < qii_size; item = item_next(item, shuffle))
{
qii[i].dbmfi_id = item->qii.dbmfi_id;
qii[i].item_id = item->qii.item_id;
qii[i].len_ms = item->qii.len_ms;
qii[i].data_kind = item->qii.data_kind;
qii[i].media_kind = item->qii.media_kind;
qii = malloc(sizeof(struct queue_item));
qii->id = item->id;
qii->item_id = item->item_id;
qii->len_ms = item->len_ms;
qii->data_kind = item->data_kind;
qii->media_kind = item->media_kind;
qii->next = qii;
qii->prev = qii;
qii->shuffle_next = qii;
qii->shuffle_prev = qii;
queue_add(qi, qii);
i++;
}
qi->count = i;
qi->length = qlength;
qi->start_pos = index;
qi->queue = qii;
return qi;
}
/*
* Creates a new queue-info for the given queue.
* Creates a new queue with a copy of the items of the given queue.
*
* The given number of items (count) are copied from the play-queue (shuffle = 0) or shuffle-queue (shuffle = 1)
* starting after the item with the given item_id. The item with item_id is excluded, therefor the first item
@ -539,13 +595,13 @@ queue_info_new_byindex(struct queue *queue, unsigned int index, unsigned int cou
* @param item_id The unique id of the item in the queue
* @param count Maximum number of items to copy (if 0 all remaining items after index)
* @param shuffle If 0 the play-queue, if 1 the shuffle queue
* @return A new queue-info with the specified items
* @return A new queue with the specified items
*/
struct queue_info *
queue_info_new_bypos(struct queue *queue, unsigned int item_id, unsigned int count, char shuffle)
struct queue *
queue_new_bypos(struct queue *queue, unsigned int item_id, unsigned int count, char shuffle)
{
int pos;
struct queue_info *qi;
struct queue *qi;
pos = queue_index_byitemid(queue, item_id, shuffle);
@ -554,21 +610,11 @@ queue_info_new_bypos(struct queue *queue, unsigned int item_id, unsigned int cou
else
pos = pos + 1; // exclude the item with the given item-id
qi = queue_info_new_byindex(queue, pos, count, shuffle);
qi = queue_new_byindex(queue, pos, count, shuffle);
return qi;
}
/*
* Frees the queue info
*/
void
queue_info_free(struct queue_info *qi)
{
free(qi->queue);
free(qi);
}
/*
* Adds items to the queue after the given item
*
@ -598,11 +644,11 @@ queue_add_afteritem(struct queue *queue, struct queue_item *item_new, struct que
// Set item-id for all new items
queue->last_inserted_item_id++;
item_new->qii.item_id = queue->last_inserted_item_id;
item_new->item_id = queue->last_inserted_item_id;
for (item = item_new->next; item != item_new; item = item->next)
{
queue->last_inserted_item_id++;
item->qii.item_id = queue->last_inserted_item_id;
item->item_id = queue->last_inserted_item_id;
}
// Add items into the queue
@ -872,7 +918,7 @@ queue_reset_and_find(struct queue *queue, unsigned int item_id)
temp->shuffle_next = temp->next;
temp->shuffle_prev = temp->prev;
if (temp->qii.item_id == item_id)
if (temp->item_id == item_id)
item = temp;
}
@ -1006,16 +1052,16 @@ queue_item_new(struct db_media_file_info *dbmfi)
return NULL;
}
item->qii.dbmfi_id = id;
item->qii.len_ms = len_ms;
item->qii.data_kind = data_kind;
item->qii.media_kind = media_kind;
item->id = id;
item->len_ms = len_ms;
item->data_kind = data_kind;
item->media_kind = media_kind;
return item;
}
struct queue_item *
queue_make(struct query_params *qp)
queueitem_make_byquery(struct query_params *qp)
{
struct db_media_file_info dbmfi;
struct queue_item *item_head;
@ -1082,7 +1128,7 @@ queue_make(struct query_params *qp)
* @return List of items for all playlist items
*/
struct queue_item *
queue_make_pl(int plid)
queueitem_make_byplid(int plid)
{
struct query_params qp;
struct queue_item *item;
@ -1096,19 +1142,19 @@ queue_make_pl(int plid)
qp.sort = S_NONE;
qp.idx_type = I_NONE;
item = queue_make(&qp);
item = queueitem_make_byquery(&qp);
return item;
}
/*
* Makes a queue-item for the item/file with the given id (dbmfi_id)
* Makes a queue-item for the item/file with the given id
*
* @param dbmfi_id Id of the item/file
* @param id Id of the item/file in the db
* @return List of items containing only the item with the given id
*/
struct queue_item *
queue_make_item(uint32_t dbmfi_id)
queueitem_make_byid(uint32_t id)
{
struct query_params qp;
struct queue_item *item;
@ -1121,10 +1167,10 @@ queue_make_item(uint32_t dbmfi_id)
qp.offset = 0;
qp.limit = 0;
qp.sort = S_NONE;
snprintf(buf, sizeof(buf), "f.id = %" PRIu32, dbmfi_id);
snprintf(buf, sizeof(buf), "f.id = %" PRIu32, id);
qp.filter = buf;
item = queue_make(&qp);
item = queueitem_make_byquery(&qp);
return item;
}

View File

@ -22,42 +22,6 @@ struct queue;
*/
struct queue_item;
/*
* External representation of an item in a queue
*/
struct queue_item_info
{
/* Item-Id is a unique id for this queue item. If the same item appears multiple
times in the queue each corresponding queue item has its own id. */
unsigned int item_id;
/* Id of the file/item in the files database */
unsigned int dbmfi_id;
/* Length of the item in ms */
unsigned int len_ms;
/* Data type of the item */
enum data_kind data_kind;
/* Media type of the item */
enum media_kind media_kind;
};
/*
* External representation of a queue
*/
struct queue_info
{
// The number of items in the queue
unsigned int length;
// The position (0-based) in the queue for the first item in the queue array
unsigned int start_pos;
// The number of items in the queue array
unsigned int count;
// The queue array (array of items infos)
struct queue_item_info *queue;
};
struct queue *
queue_new();
@ -69,34 +33,46 @@ unsigned int
queue_count(struct queue *queue);
int
queueitem_pos(struct queue_item *item, uint32_t dbmfi_id);
queueitem_pos(struct queue_item *item, uint32_t id);
struct queue_item_info *
uint32_t
queueitem_id(struct queue_item *item);
unsigned int
queueitem_item_id(struct queue_item *item);
unsigned int
queueitem_len(struct queue_item *item);
enum data_kind
queueitem_data_kind(struct queue_item *item);
enum media_kind
queueitem_media_kind(struct queue_item *item);
struct queue_item *
queue_get_byitemid(struct queue *queue, unsigned int item_id);
struct queue_item_info *
struct queue_item *
queue_get_byindex(struct queue *queue, unsigned int index, char shuffle);
struct queue_item_info *
struct queue_item *
queue_get_bypos(struct queue *queue, unsigned int item_id, unsigned int pos, char shuffle);
int
queue_index_byitemid(struct queue *queue, unsigned int item_id, char shuffle);
struct queue_item_info *
struct queue_item *
queue_next(struct queue *queue, unsigned int item_id, char shuffle, enum repeat_mode r_mode, int reshuffle);
struct queue_item_info *
struct queue_item *
queue_prev(struct queue *queue, unsigned int item_id, char shuffle, enum repeat_mode r_mode);
struct queue_info *
queue_info_new_byindex(struct queue *queue, unsigned int index, unsigned int count, char shuffle);
struct queue *
queue_new_byindex(struct queue *queue, unsigned int index, unsigned int count, char shuffle);
struct queue_info *
queue_info_new_bypos(struct queue *queue, unsigned int item_id, unsigned int count, char shuffle);
void
queue_info_free(struct queue_info *qi);
struct queue *
queue_new_bypos(struct queue *queue, unsigned int item_id, unsigned int count, char shuffle);
void
queue_add(struct queue *queue, struct queue_item *item);
@ -123,12 +99,12 @@ void
queue_shuffle(struct queue *queue, unsigned int item_id);
struct queue_item *
queue_make(struct query_params *qp);
queueitem_make_byquery(struct query_params *qp);
struct queue_item *
queue_make_pl(int plid);
queueitem_make_byplid(int plid);
struct queue_item *
queue_make_item(uint32_t dbmfi_id);
queueitem_make_byid(uint32_t id);
#endif /* SRC_QUEUE_H_ */