diff options
author | 2013-10-16 22:43:52 +0200 | |
---|---|---|
committer | 2013-10-16 22:43:52 +0200 | |
commit | e93a9b2d9677b7ef3142a03f370ef545659b5773 (patch) | |
tree | 3005858226bb439a72c5cc852ee55b7ea52ec198 /plugins/gtkui/coverart.c | |
parent | c700c20bb67117dd57ff3130b1a1d46c53b8c626 (diff) |
gtkui: several fixes/improvements in playlist cover rendering
Diffstat (limited to 'plugins/gtkui/coverart.c')
-rw-r--r-- | plugins/gtkui/coverart.c | 56 |
1 files changed, 51 insertions, 5 deletions
diff --git a/plugins/gtkui/coverart.c b/plugins/gtkui/coverart.c index c3d93b8d..0e08d180 100644 --- a/plugins/gtkui/coverart.c +++ b/plugins/gtkui/coverart.c @@ -65,15 +65,19 @@ static void queue_add (const char *fname, int width, void (*callback) (void *user_data), void *user_data) { deadbeef->mutex_lock (mutex); load_query_t *q; - for (q = queue; q; q = q->next) { - if (!strcmp (q->fname, fname) && width == q->width) { - deadbeef->mutex_unlock (mutex); - return; // dupe + if (fname) { + for (q = queue; q; q = q->next) { + if (!strcmp (q->fname, fname) && width == q->width) { + deadbeef->mutex_unlock (mutex); + return; // dupe + } } } q = malloc (sizeof (load_query_t)); memset (q, 0, sizeof (load_query_t)); - q->fname = strdup (fname); + if (fname) { + q->fname = strdup (fname); + } q->width = width; q->callback = callback; q->user_data = user_data; @@ -138,6 +142,14 @@ loading_thread (void *none) { } } deadbeef->mutex_unlock (mutex); + if (!queue->fname) { + if (queue->callback) { + queue->callback (queue->user_data); + } + queue_pop (); + continue; + } + if (cache_min == -1) { trace ("coverart pixbuf cache overflow, waiting...\n"); usleep (500000); @@ -250,12 +262,46 @@ get_pixbuf (const char *fname, int width, void (*callback)(void *user_data), voi return NULL; } +void +queue_cover_callback (void (*callback)(void *user_data), void *user_data) { + queue_add (NULL, -1, callback, user_data); +} + GdkPixbuf * get_cover_art_callb (const char *fname, const char *artist, const char *album, int width, void (*callback) (void *user_data), void *user_data) { if (!coverart_plugin) { return NULL; } + + if (width == -1) { + char path[2048]; + coverart_plugin->make_cache_path (path, sizeof (path), album, artist, -1); + deadbeef->mutex_lock (mutex); + int i_largest = -1; + int size_largest = -1; + for (int i = 0; i < CACHE_SIZE; i++) { + if (!cache[i].pixbuf) { + continue; + } + if (!strcmp (cache[i].fname, path)) { + gettimeofday (&cache[i].tm, NULL); + if (cache[i].width > size_largest) { + size_largest = cache[i].width; + i_largest = i; + } + } + } + if (i_largest != -1) { + GdkPixbuf *pb = cache[i_largest].pixbuf; + g_object_ref (pb); + deadbeef->mutex_unlock (mutex); + return pb; + } + deadbeef->mutex_unlock (mutex); + return NULL; + } + cover_avail_info_t *dt = malloc (sizeof (cover_avail_info_t)); dt->width = width; dt->callback = callback; |