/** @brief Cached data */
static unsigned flags;
+/** @brief Map of hashes to queud data */
+static hash *queuemap;
+
struct queue_entry *dcgi_queue;
struct queue_entry *dcgi_playing;
struct queue_entry *dcgi_recent;
int dcgi_enabled;
int dcgi_random_enabled;
+static void queuemap_add(struct queue_entry *q) {
+ if(!queuemap)
+ queuemap = hash_new(sizeof (struct queue_entry *));
+ for(; q; q = q->next)
+ hash_add(queuemap, q->id, &q, HASH_INSERT_OR_REPLACE);
+}
+
/** @brief Fetch cachable data */
void dcgi_lookup(unsigned want) {
unsigned need = want ^ (flags & want);
struct queue_entry *r, *rnext;
-#if 0
- const char *dir, *re;
-#endif
char *rs;
if(!dcgi_client || !need)
return;
- if(need & DCGI_QUEUE)
+ if(need & DCGI_QUEUE) {
disorder_queue(dcgi_client, &dcgi_queue);
- if(need & DCGI_PLAYING)
+ queuemap_add(dcgi_queue);
+ }
+ if(need & DCGI_PLAYING) {
disorder_playing(dcgi_client, &dcgi_playing);
+ queuemap_add(dcgi_playing);
+ }
if(need & DCGI_NEW)
disorder_new_tracks(dcgi_client, &dcgi_new, &dcgi_nnew, 0);
if(need & DCGI_RECENT) {
dcgi_recent = r;
r = rnext;
}
+ queuemap_add(dcgi_recent);
}
if(need & DCGI_VOLUME)
disorder_get_volume(dcgi_client,
&dcgi_volume_left, &dcgi_volume_right);
-#if 0
- /* DCGI_FILES and DCGI_DIRS are looking obsolete now */
- if(need & (DCGI_FILES|DCGI_DIRS)) {
- if(!(dir = cgi_get("directory")))
- dir = "";
- re = cgi_get("regexp");
- if(need & DCGI_DIRS)
- if(disorder_directories(dcgi_client, dir, re,
- &dirs, &ndirs))
- ndirs = 0;
- if(need & DCGI_FILES)
- if(disorder_files(dcgi_client, dir, re,
- &files, &nfiles))
- nfiles = 0;
- }
-#endif
if(need & DCGI_RIGHTS) {
dcgi_rights = RIGHT_READ; /* fail-safe */
if(!disorder_userinfo(dcgi_client, disorder_user(dcgi_client),
flags |= need;
}
+/** @brief Locate a track by ID */
+struct queue_entry *dcgi_findtrack(const char *id) {
+ struct queue_entry **qq;
+
+ if(queuemap && (qq = hash_find(queuemap, id)))
+ return *qq;
+ dcgi_lookup(DCGI_PLAYING);
+ if(queuemap && (qq = hash_find(queuemap, id)))
+ return *qq;
+ dcgi_lookup(DCGI_QUEUE);
+ if(queuemap && (qq = hash_find(queuemap, id)))
+ return *qq;
+ dcgi_lookup(DCGI_RECENT);
+ if(queuemap && (qq = hash_find(queuemap, id)))
+ return *qq;
+ return NULL;
+}
+
void dcgi_lookup_reset(void) {
/* Forget everything we knew */
flags = 0;
+ queuemap = 0;
dcgi_recent = 0;
dcgi_queue = 0;
dcgi_playing = 0;