From 396ddd9fd79e458d1107f4065ce072eef99b6bce Mon Sep 17 00:00:00 2001 From: Thomas Martitz Date: Sat, 5 Mar 2011 18:05:26 +0000 Subject: Android: Support embedded albumart in the widget. This is achieved by writing the jpeg out to a temporary file. This approach can probably be also used to support embedded albumart in pictureflow. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29522 a1c6a512-1295-4272-9138-f99709370657 --- apps/hosted/notification.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) (limited to 'apps') diff --git a/apps/hosted/notification.c b/apps/hosted/notification.c index faa1247860..443200698c 100644 --- a/apps/hosted/notification.c +++ b/apps/hosted/notification.c @@ -21,11 +21,13 @@ #include #include +#include #include "notification.h" #include "appevents.h" #include "metadata.h" #include "albumart.h" #include "misc.h" +#include "thread.h" #include "debug.h" extern JNIEnv *env_ptr; @@ -66,8 +68,36 @@ static void track_changed_callback(void *param) album = e->NewStringUTF(env_ptr, id3->album ?: ""); albumart = NULL; - if (find_albumart(id3, buf, sizeof(buf), &dim)) + if (id3->embed_albumart && id3->albumart.type == AA_TYPE_JPG) + { /* extract albumart to a temporary file using mmap() */ + snprintf(buf, sizeof(buf), "/sdcard/rockbox/.temp_albumart_%d.jpg", + thread_self()); + int dst_fd = creat(buf, 0666); + if (dst_fd >= 0) + { + int src_fd = open(id3->path, O_RDONLY); + off_t o_pos = id3->albumart.pos; + off_t pa_pos = o_pos & ~(sysconf(_SC_PAGE_SIZE) - 1); + if (src_fd >= 0) + { /* align to page boundary */ + int pos_diff = o_pos - pa_pos; + unsigned char* p = mmap(NULL, id3->albumart.size + pos_diff, + PROT_READ, MAP_SHARED, src_fd, pa_pos); + if (p != MAP_FAILED) + { + write(dst_fd, p + pos_diff, id3->albumart.size); + munmap(p, id3->albumart.size + pos_diff); + albumart = e->NewStringUTF(env_ptr, buf); + } + close(src_fd); + } + close(dst_fd); + } + } + else if (find_albumart(id3, buf, sizeof(buf), &dim)) + { albumart = e->NewStringUTF(env_ptr, buf); + } e->CallVoidMethod(env_ptr, NotificationManager_instance, updateNotification, title, artist, album, albumart); @@ -82,6 +112,12 @@ static void track_finished_callback(void *param) JNIEnv e = *env_ptr; e->CallVoidMethod(env_ptr, NotificationManager_instance, finishNotification); + + /* delete temporary albumart file */ + char buf[MAX_PATH]; + snprintf(buf, sizeof(buf), "/sdcard/rockbox/.temp_albumart_%d.jpg", + thread_self()); + unlink(buf); } void notification_init(void) -- cgit v1.2.3