diff options
| author | Michael Sevakis <jethead71@rockbox.org> | 2011-02-10 10:26:07 +0000 |
|---|---|---|
| committer | Michael Sevakis <jethead71@rockbox.org> | 2011-02-10 10:26:07 +0000 |
| commit | edfff8a5efb1bca75f8b49c3ad3dd151653d39c8 (patch) | |
| tree | 88d2c99f09f107489f67250403aa7e9c1ccdb26f | |
| parent | 6f9d2ad130701ec6b54ed90885c6972dbef79d27 (diff) | |
| download | rockbox-edfff8a5efb1bca75f8b49c3ad3dd151653d39c8.zip rockbox-edfff8a5efb1bca75f8b49c3ad3dd151653d39c8.tar.gz rockbox-edfff8a5efb1bca75f8b49c3ad3dd151653d39c8.tar.bz2 rockbox-edfff8a5efb1bca75f8b49c3ad3dd151653d39c8.tar.xz | |
audio_peek_track should copy the struct mp3entry instead of pointing directly into the buffer. Despite the dire warning, caller does in fact yield/sleep and its usage is too nonlocalized to control that reliably.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29275 a1c6a512-1295-4272-9138-f99709370657
| -rw-r--r-- | apps/gui/skin_engine/skin_tokens.c | 14 | ||||
| -rw-r--r-- | apps/playback.c | 13 | ||||
| -rw-r--r-- | firmware/export/audio.h | 2 |
3 files changed, 16 insertions, 13 deletions
diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c index ddc2221..f455999 100644 --- a/apps/gui/skin_engine/skin_tokens.c +++ b/apps/gui/skin_engine/skin_tokens.c @@ -563,17 +563,15 @@ static struct mp3entry* get_mp3entry_from_offset(int offset, char **filename) fname = playlist_peek(offset, filename_buf, sizeof(filename_buf)); *filename = (char*)fname; #if CONFIG_CODEC == SWCODEC -#if defined(HAVE_TC_RAMCACHE) && defined(HAVE_DIRCACHE) static struct mp3entry tempid3; - if (tagcache_fill_tags(&tempid3, fname)) - { - pid3 = &tempid3; - } - else + if ( +#if defined(HAVE_TC_RAMCACHE) && defined(HAVE_DIRCACHE) + tagcache_fill_tags(&tempid3, fname) || #endif + audio_peek_track(&tempid3, offset) + ) { - if (!audio_peek_track(&pid3, offset)) - pid3 = NULL; + pid3 = &tempid3; } #endif } diff --git a/apps/playback.c b/apps/playback.c index 3a7faa3..a99a223 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -628,8 +628,8 @@ struct mp3entry* audio_next_track(void) return NULL; } -/* gets a pointer to the id3 data, Not thread safe!, DON'T yield()/sleep() */ -bool audio_peek_track(struct mp3entry** id3, int offset) +/* gets a copy of the id3 data */ +bool audio_peek_track(struct mp3entry* id3, int offset) { int next_idx; int new_offset = ci.new_track + wps_offset + offset; @@ -640,8 +640,13 @@ bool audio_peek_track(struct mp3entry** id3, int offset) if (tracks[next_idx].id3_hid >= 0) { - return bufgetdata(tracks[next_idx].id3_hid, 0, (void**)id3) - == sizeof(struct mp3entry); + struct mp3entry *id3src; + if (bufgetdata(tracks[next_idx].id3_hid, 0, (void**)&id3src) + == sizeof(struct mp3entry)) + { + copy_mp3entry(id3, id3src); + return true; + } } return false; } diff --git a/firmware/export/audio.h b/firmware/export/audio.h index 34bcfb6..910791c 100644 --- a/firmware/export/audio.h +++ b/firmware/export/audio.h @@ -60,7 +60,7 @@ void audio_ff_rewind(long newpos); void audio_flush_and_reload_tracks(void); struct mp3entry* audio_current_track(void); struct mp3entry* audio_next_track(void); -bool audio_peek_track(struct mp3entry** id3, int offset); +bool audio_peek_track(struct mp3entry* id3, int offset); #ifdef HAVE_DISK_STORAGE void audio_set_buffer_margin(int setting); #endif |