summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2012-05-17 20:50:47 +0200
committerGravatar waker <wakeroid@gmail.com>2012-05-17 20:50:47 +0200
commit816d87e1d38dc0fecbe1fa47794b2d7a18d2e321 (patch)
tree6753620029a94976bf27d474156723dd2f403813
parentaf55e42f2422f8734bc80fb8a58eba80b29937ef (diff)
fixed many calls to pl_find_meta[_raw] being called without pl_lock;
added debug pl_ensure_lock function which asserts when pl_lock is not set when it is required; added new API functions for thread-safe metadata access
-rw-r--r--deadbeef.h11
-rw-r--r--playlist.c20
-rw-r--r--playlist.h15
-rw-r--r--plmeta.c45
-rw-r--r--pltmeta.c13
-rw-r--r--plugins.c5
-rw-r--r--plugins/gtkui/gtkui.c6
-rw-r--r--plugins/gtkui/plcommon.c12
-rw-r--r--plugins/gtkui/trkproperties.c18
-rw-r--r--plugins/lastfm/lastfm.c93
-rw-r--r--plugins/mpgmad/mpgmad.c23
-rw-r--r--plugins/shellexec/shellexec.c2
-rw-r--r--streamer.c4
13 files changed, 194 insertions, 73 deletions
diff --git a/deadbeef.h b/deadbeef.h
index 73452c4e..6de9e9d0 100644
--- a/deadbeef.h
+++ b/deadbeef.h
@@ -61,6 +61,7 @@ extern "C" {
// api version history:
// 9.9 -- devel
+// 1.4 -- deadbeef-0.5.5
// 1.3 -- deadbeef-0.5.3
// 1.2 -- deadbeef-0.5.2
// 1.1 -- deadbeef-0.5.1
@@ -750,10 +751,20 @@ typedef struct {
void (*metacache_unref) (const char *str);
// this function must return original un-overriden value (ignoring the keys prefixed with '!')
+ // it's not thread-safe, and must be used under the same conditions as the
+ // pl_find_meta
const char *(*pl_find_meta_raw) (DB_playItem_t *it, const char *key);
// ******* new 1.3 APIs ********
int (*streamer_dsp_chain_save) (void);
+
+ // ******* new 1.4 APIs ********
+ int (*pl_get_meta) (DB_playItem_t *it, const char *key, char *val, int size);
+ int (*pl_get_meta_raw) (DB_playItem_t *it, const char *key, char *val, int size);
+ int (*plt_get_meta) (ddb_playlist_t *handle, const char *key, char *val, int size);
+
+ // fast way to test if a field exists in playitem
+ int (*pl_meta_exists) (DB_playItem_t *it, const char *key);
} DB_functions_t;
// NOTE: an item placement must be selected like this
diff --git a/playlist.c b/playlist.c
index 11a280c1..d50bff77 100644
--- a/playlist.c
+++ b/playlist.c
@@ -55,7 +55,7 @@
#define DISABLE_LOCKING 0
#define DEBUG_LOCKING 0
-//#define DETECT_PL_LOCK_RC 1
+#define DETECT_PL_LOCK_RC 1
// file format revision history
// 1.1->1.2 changelog:
@@ -186,7 +186,7 @@ pl_lock (void) {
#if !DISABLE_LOCKING
mutex_lock (mutex);
#if DETECT_PL_LOCK_RC
- pl_lock_tid = pthread_self();
+ pl_lock_tid = pthread_self ();
tids[ntids++] = pl_lock_tid;
#endif
@@ -1170,10 +1170,12 @@ error:
playItem_t *
plt_insert_cue (playlist_t *plt, playItem_t *after, playItem_t *origin, int numsamples, int samplerate) {
trace ("pl_insert_cue numsamples=%d, samplerate=%d\n", numsamples, samplerate);
+ pl_lock ();
const char *fname = pl_find_meta_raw (origin, ":URI");
int len = strlen (fname);
char cuename[len+5];
strcpy (cuename, fname);
+ pl_unlock ();
strcpy (cuename+len, ".cue");
DB_FILE *fp = vfs_fopen (cuename);
if (!fp) {
@@ -3812,3 +3814,17 @@ int
plt_is_fast_mode (playlist_t *plt) {
return plt->fast_mode;
}
+
+void
+pl_ensure_lock (void) {
+#if DETECT_PL_LOCK_RC
+ pthread_t tid = pthread_self ();
+ for (int i = 0; i < ntids; i++) {
+ if (tids[i] == tid) {
+ return;
+ }
+ }
+ fprintf (stderr, "\033[0;31mnon-thread-safe playlist access function was called outside of pl_lock. please make a backtrace and post a bug. thank you.\033[37;0m\n");
+ assert(0);
+#endif
+}
diff --git a/playlist.h b/playlist.h
index fefb3943..06966bde 100644
--- a/playlist.h
+++ b/playlist.h
@@ -454,4 +454,19 @@ plt_set_fast_mode (playlist_t *plt, int fast);
int
plt_is_fast_mode (playlist_t *plt);
+void
+pl_ensure_lock (void);
+
+int
+pl_get_meta (playItem_t *it, const char *key, char *val, int size);
+
+int
+pl_get_meta_raw (playItem_t *it, const char *key, char *val, int size);
+
+int
+pl_meta_exists (playItem_t *it, const char *key);
+
+int
+plt_get_meta (playlist_t *handle, const char *key, char *val, int size);
+
#endif // __PLAYLIST_H
diff --git a/plmeta.c b/plmeta.c
index cf17f341..4b8e9a8a 100644
--- a/plmeta.c
+++ b/plmeta.c
@@ -190,14 +190,13 @@ pl_delete_meta (playItem_t *it, const char *key) {
const char *
pl_find_meta (playItem_t *it, const char *key) {
- pl_lock ();
+ pl_ensure_lock ();
DB_metaInfo_t *m = it->meta;
if (key && key[0] == ':') {
// try to find an override
while (m) {
if (m->key[0] == '!' && !strcasecmp (key+1, m->key+1)) {
- pl_unlock ();
return m->value;
}
m = m->next;
@@ -207,27 +206,23 @@ pl_find_meta (playItem_t *it, const char *key) {
m = it->meta;
while (m) {
if (!strcasecmp (key, m->key)) {
- pl_unlock ();
return m->value;
}
m = m->next;
}
- pl_unlock ();
return NULL;
}
const char *
pl_find_meta_raw (playItem_t *it, const char *key) {
- pl_lock ();
+ pl_ensure_lock ();
DB_metaInfo_t *m = it->meta;
while (m) {
if (!strcasecmp (key, m->key)) {
- pl_unlock ();
return m->value;
}
m = m->next;
}
- pl_unlock ();
return NULL;
}
@@ -303,3 +298,39 @@ pl_delete_all_meta (playItem_t *it) {
}
UNLOCK;
}
+
+int
+pl_get_meta (playItem_t *it, const char *key, char *val, int size) {
+ *val = 0;
+ pl_lock ();
+ const char *v = pl_find_meta (it, key);
+ if (!val) {
+ pl_unlock ();
+ return 0;
+ }
+ strncpy (val, v, size);
+ pl_unlock ();
+ return 1;
+}
+
+int
+pl_get_meta_raw (playItem_t *it, const char *key, char *val, int size) {
+ *val = 0;
+ pl_lock ();
+ const char *v = pl_find_meta_raw (it, key);
+ if (!val) {
+ pl_unlock ();
+ return 0;
+ }
+ strncpy (val, v, size);
+ pl_unlock ();
+ return 1;
+}
+
+int
+pl_meta_exists (playItem_t *it, const char *key) {
+ pl_lock ();
+ const char *v = pl_find_meta (it, key);
+ pl_unlock ();
+ return v ? 1 : 0;
+}
diff --git a/pltmeta.c b/pltmeta.c
index e2e6cd04..63c7279c 100644
--- a/pltmeta.c
+++ b/pltmeta.c
@@ -234,3 +234,16 @@ plt_delete_all_meta (playlist_t *it) {
UNLOCK;
}
+int
+plt_get_meta (playlist_t *handle, const char *key, char *val, int size) {
+ *val = 0;
+ LOCK;
+ const char *v = plt_find_meta (handle, key);
+ if (!v) {
+ UNLOCK;
+ return 0;
+ }
+ strncpy (val, v, size);
+ UNLOCK;
+ return 1;
+}
diff --git a/plugins.c b/plugins.c
index 522930de..c5f56c4f 100644
--- a/plugins.c
+++ b/plugins.c
@@ -331,6 +331,11 @@ static DB_functions_t deadbeef_api = {
.pl_find_meta_raw = (const char *(*) (DB_playItem_t *it, const char *key))pl_find_meta_raw,
// ******* new 1.3 APIs ********
.streamer_dsp_chain_save = streamer_dsp_chain_save,
+ // ******* new 1.4 APIs ********
+ .pl_get_meta = (int (*) (DB_playItem_t *it, const char *key, char *val, int size))pl_get_meta,
+ .pl_get_meta_raw = (int (*) (DB_playItem_t *it, const char *key, char *val, int size))pl_get_meta_raw,
+ .plt_get_meta = (int (*) (ddb_playlist_t *handle, const char *key, char *val, int size))plt_get_meta,
+ .pl_meta_exists = (int (*) (DB_playItem_t *it, const char *key))pl_meta_exists,
};
DB_functions_t *deadbeef = &deadbeef_api;
diff --git a/plugins/gtkui/gtkui.c b/plugins/gtkui/gtkui.c
index 7ded4f6d..b96eb301 100644
--- a/plugins/gtkui/gtkui.c
+++ b/plugins/gtkui/gtkui.c
@@ -192,9 +192,9 @@ update_songinfo (gpointer ctx) {
}
}
const char *spaused = deadbeef->get_output ()->state () == OUTPUT_STATE_PAUSED ? _("Paused | ") : "";
- const char *filetype = deadbeef->pl_find_meta (track, ":FILETYPE");
- if (!filetype) {
- filetype = "-";
+ char filetype[20];
+ if (!deadbeef->pl_get_meta (track, ":FILETYPE", filetype, sizeof (filetype))) {
+ strcpy (filetype, "-");
}
snprintf (sbtext_new, sizeof (sbtext_new), _("%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"), spaused, filetype, sbitrate, samplerate, bitspersample, mode, minpos, secpos, t, deadbeef->pl_getcount (PL_MAIN), totaltime_str);
}
diff --git a/plugins/gtkui/plcommon.c b/plugins/gtkui/plcommon.c
index 406b2f16..f0c36a24 100644
--- a/plugins/gtkui/plcommon.c
+++ b/plugins/gtkui/plcommon.c
@@ -256,8 +256,16 @@ main_reload_metadata_activate
DdbListview *ps = DDB_LISTVIEW (g_object_get_data (G_OBJECT (menuitem), "ps"));
DB_playItem_t *it = deadbeef->pl_get_first (PL_MAIN);
while (it) {
- const char *decoder_id = deadbeef->pl_find_meta (it, ":DECODER");
- if (deadbeef->pl_is_selected (it) && deadbeef->is_local_file (deadbeef->pl_find_meta (it, ":URI")) && decoder_id) {
+ deadbeef->pl_lock ();
+ char decoder_id[100];
+ const char *dec = deadbeef->pl_find_meta (it, ":DECODER");
+ if (dec) {
+ strncpy (decoder_id, dec, sizeof (decoder_id));
+ }
+ int match = deadbeef->pl_is_selected (it) && deadbeef->is_local_file (deadbeef->pl_find_meta (it, ":URI")) && dec;
+ deadbeef->pl_unlock ();
+
+ if (match) {
uint32_t f = deadbeef->pl_get_item_flags (it);
if (!(f & DDB_IS_SUBTRACK)) {
f &= ~DDB_TAG_MASK;
diff --git a/plugins/gtkui/trkproperties.c b/plugins/gtkui/trkproperties.c
index 590bf1fa..75b1f256 100644
--- a/plugins/gtkui/trkproperties.c
+++ b/plugins/gtkui/trkproperties.c
@@ -107,6 +107,7 @@ get_field_value (char *out, int size, const char *key, const char *(*getter)(DB_
return 0;
}
char *p = out;
+ deadbeef->pl_lock ();
const char **prev = malloc (sizeof (const char *) * numtracks);
memset (prev, 0, sizeof (const char *) * numtracks);
for (int i = 0; i < numtracks; i++) {
@@ -142,6 +143,7 @@ get_field_value (char *out, int size, const char *key, const char *(*getter)(DB_
break;
}
}
+ deadbeef->pl_unlock ();
if (size <= 1) {
gchar *prev = g_utf8_prev_char (out-4);
strcpy (prev, "...");
@@ -491,8 +493,9 @@ static gboolean
set_progress_cb (void *ctx) {
DB_playItem_t *track = ctx;
GtkWidget *progressitem = lookup_widget (progressdlg, "progresstitle");
- const char *fname = deadbeef->pl_find_meta_raw (track, ":URI");
- gtk_entry_set_text (GTK_ENTRY (progressitem), fname);
+ deadbeef->pl_lock ();
+ gtk_entry_set_text (GTK_ENTRY (progressitem), deadbeef->pl_find_meta_raw (track, ":URI"));
+ deadbeef->pl_unlock ();
deadbeef->pl_item_unref (track);
return FALSE;
}
@@ -504,8 +507,15 @@ write_meta_worker (void *ctx) {
break;
}
DB_playItem_t *track = tracks[t];
- const char *decoder_id = deadbeef->pl_find_meta_raw (track, ":DECODER");
- if (track && decoder_id) {
+ deadbeef->pl_lock ();
+ const char *dec = deadbeef->pl_find_meta_raw (track, ":DECODER");
+ char decoder_id[100];
+ if (dec) {
+ strncpy (decoder_id, dec, sizeof (decoder_id));
+ }
+ int match = track && dec;
+ deadbeef->pl_unlock ();
+ if (match) {
int is_subtrack = deadbeef->pl_get_item_flags (track) & DDB_IS_SUBTRACK;
if (is_subtrack) {
continue;
diff --git a/plugins/lastfm/lastfm.c b/plugins/lastfm/lastfm.c
index 8ab6c5f8..1e4fec70 100644
--- a/plugins/lastfm/lastfm.c
+++ b/plugins/lastfm/lastfm.c
@@ -49,6 +49,8 @@ static uintptr_t lfm_cond;
static int lfm_stopthread;
static intptr_t lfm_tid;
+#define META_FIELD_SIZE 200
+
DB_plugin_t *
lastfm_load (DB_functions_t *api) {
deadbeef = api;
@@ -317,50 +319,41 @@ fail:
}
static int
-lfm_fetch_song_info (DB_playItem_t *song, const char **a, const char **t, const char **b, float *l, const char **n, const char **m) {
+lfm_fetch_song_info (DB_playItem_t *song, char *a, char *t, char *b, float *l, char *n, char *m) {
if (deadbeef->conf_get_int ("lastfm.prefer_album_artist", 0)) {
- *a = deadbeef->pl_find_meta (song, "band");
- if (!(*a)) {
- *a = deadbeef->pl_find_meta (song, "album artist");
- }
- if (!(*a)) {
- *a = deadbeef->pl_find_meta (song, "albumartist");
- }
- if (!(*a)) {
- *a = deadbeef->pl_find_meta (song, "artist");
+ if (!deadbeef->pl_get_meta (song, "band", a, META_FIELD_SIZE)) {
+ if (!deadbeef->pl_get_meta (song, "album artist", a, META_FIELD_SIZE)) {
+ if (!deadbeef->pl_get_meta (song, "albumartist", a, META_FIELD_SIZE)) {
+ if (!deadbeef->pl_get_meta (song, "artist", a, META_FIELD_SIZE)) {
+ return -1;
+ }
+ }
+ }
}
}
else {
- *a = deadbeef->pl_find_meta (song, "artist");
- if (!(*a)) {
- *a = deadbeef->pl_find_meta (song, "band");
- }
- if (!(*a)) {
- *a = deadbeef->pl_find_meta (song, "album artist");
- }
- if (!(*a)) {
- *a = deadbeef->pl_find_meta (song, "albumartist");
+ if (!deadbeef->pl_get_meta (song, "artist", a, META_FIELD_SIZE)) {
+ if (!deadbeef->pl_get_meta (song, "band", a, META_FIELD_SIZE)) {
+ if (!deadbeef->pl_get_meta (song, "album artist", a, META_FIELD_SIZE)) {
+ if (!deadbeef->pl_get_meta (song, "albumartist", a, META_FIELD_SIZE)) {
+ return -1;
+ }
+ }
+ }
}
}
- if (!*a) {
- return -1;
- }
- *t = deadbeef->pl_find_meta (song, "title");
- if (!*t) {
+ if (!deadbeef->pl_get_meta (song, "title", t, META_FIELD_SIZE)) {
return -1;
}
- *b = deadbeef->pl_find_meta (song, "album");
- if (!*b) {
- *b = "";
+ if (!deadbeef->pl_get_meta (song, "album", b, META_FIELD_SIZE)) {
+ *b = 0;
}
*l = deadbeef->pl_get_item_duration (song);
- *n = deadbeef->pl_find_meta (song, "track");
- if (!*n) {
- *n = "";
+ if (!deadbeef->pl_get_meta (song, "track", n, META_FIELD_SIZE)) {
+ *n = 0;
}
- *m = deadbeef->pl_find_meta (song, "mbid");
- if (!*m) {
- *m = "";
+ if (!deadbeef->pl_get_meta (song, "mbid", m, META_FIELD_SIZE)) {
+ *m = 0;
}
return 0;
}
@@ -443,12 +436,12 @@ lfm_format_uri (int subm, DB_playItem_t *song, char *out, int outl, time_t start
return -1;
}
int sz = outl;
- const char *a; // artist
- const char *t; // title
- const char *b; // album
+ char a[META_FIELD_SIZE]; // artist
+ char t[META_FIELD_SIZE]; // title
+ char b[META_FIELD_SIZE]; // album
float l; // duration
- const char *n; // tracknum
- const char *m; // muzicbrainz id
+ char n[META_FIELD_SIZE]; // tracknum
+ char m[META_FIELD_SIZE]; // muzicbrainz id
char ka[6] = "a";
char kt[6] = "t";
@@ -466,7 +459,7 @@ lfm_format_uri (int subm, DB_playItem_t *song, char *out, int outl, time_t start
strcpy (km+1, ka+1);
}
- if (lfm_fetch_song_info (song, &a, &t, &b, &l, &n, &m) == 0) {
+ if (lfm_fetch_song_info (song, a, t, b, &l, n, m) == 0) {
// trace ("playtime: %f\nartist: %s\ntitle: %s\nalbum: %s\nduration: %f\ntracknum: %s\n---\n", song->playtime, a, t, b, l, n);
}
else {
@@ -559,9 +552,8 @@ lastfm_songchanged (ddb_event_trackchange_t *ev, uintptr_t data) {
#endif
- if (!deadbeef->pl_find_meta (ev->from, "artist")
- || !deadbeef->pl_find_meta (ev->from, "title")
-// || !deadbeef->pl_find_meta (ev->from, "album")
+ if (!deadbeef->pl_meta_exists (ev->from, "artist")
+ || !deadbeef->pl_meta_exists (ev->from, "title")
) {
trace ("lfm: not enough metadata for submission, artist=%s, title=%s, album=%s\n", deadbeef->pl_find_meta (ev->from, "artist"), deadbeef->pl_find_meta (ev->from, "title"), deadbeef->pl_find_meta (ev->from, "album"));
return 0;
@@ -876,11 +868,14 @@ lastfm_stop (void) {
static int
lfm_action_lookup (DB_plugin_action_t *action, DB_playItem_t *it)
{
- const char *artist = deadbeef->pl_find_meta (it, "artist");
- const char *title = deadbeef->pl_find_meta (it, "title");
-
- if (!title || !artist)
+ char artist[META_FIELD_SIZE];
+ if (!deadbeef->pl_get_meta (it, "artist", artist, sizeof (artist))) {
+ return 0;
+ }
+ char title[META_FIELD_SIZE];
+ if (!deadbeef->pl_get_meta (it, "title", title, sizeof (title))) {
return 0;
+ }
char eartist [strlen (artist) * 3 + 1];
char etitle [strlen (title) * 3 + 1];
@@ -925,9 +920,10 @@ static DB_plugin_action_t lookup_action = {
static DB_plugin_action_t *
lfm_get_actions (DB_playItem_t *it)
{
+ deadbeef->pl_lock ();
if (!it ||
- !deadbeef->pl_find_meta (it, "artist") ||
- !deadbeef->pl_find_meta (it, "title"))
+ !deadbeef->pl_meta_exists (it, "artist") ||
+ !deadbeef->pl_meta_exists (it, "title"))
{
love_action.flags |= DB_ACTION_DISABLED;
lookup_action.flags |= DB_ACTION_DISABLED;
@@ -937,6 +933,7 @@ lfm_get_actions (DB_playItem_t *it)
love_action.flags &= ~DB_ACTION_DISABLED;
lookup_action.flags &= ~DB_ACTION_DISABLED;
}
+ deadbeef->pl_unlock ();
return &lookup_action;
}
diff --git a/plugins/mpgmad/mpgmad.c b/plugins/mpgmad/mpgmad.c
index 32f4022f..0e06bbeb 100644
--- a/plugins/mpgmad/mpgmad.c
+++ b/plugins/mpgmad/mpgmad.c
@@ -793,7 +793,9 @@ cmp3_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
mpgmad_info_t *info = (mpgmad_info_t *)_info;
_info->plugin = &plugin;
memset (&info->buffer, 0, sizeof (info->buffer));
+ deadbeef->pl_lock ();
info->buffer.file = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!info->buffer.file) {
return -1;
}
@@ -1357,15 +1359,20 @@ cmp3_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) {
deadbeef->plt_set_item_duration (plt, it, buffer.duration);
deadbeef->fclose (fp);
- const char *cuesheet = deadbeef->pl_find_meta (it, "cuesheet");
- if (cuesheet) {
- DB_playItem_t *last = deadbeef->plt_insert_cue_from_buffer (plt, after, it, cuesheet, strlen (cuesheet), buffer.totalsamples-buffer.delay-buffer.padding, buffer.samplerate);
- if (last) {
- deadbeef->pl_item_unref (it);
- deadbeef->pl_item_unref (last);
- return last;
+ deadbeef->pl_lock ();
+ {
+ const char *cuesheet = deadbeef->pl_find_meta (it, "cuesheet");
+ if (cuesheet) {
+ DB_playItem_t *last = deadbeef->plt_insert_cue_from_buffer (plt, after, it, cuesheet, strlen (cuesheet), buffer.totalsamples-buffer.delay-buffer.padding, buffer.samplerate);
+ deadbeef->pl_unlock ();
+ if (last) {
+ deadbeef->pl_item_unref (it);
+ deadbeef->pl_item_unref (last);
+ return last;
+ }
}
}
+ deadbeef->pl_unlock ();
// FIXME! bad numsamples passed to cue
@@ -1383,7 +1390,9 @@ cmp3_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) {
int
cmp3_read_metadata (DB_playItem_t *it) {
+ deadbeef->pl_lock ();
DB_FILE *fp = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!fp) {
return -1;
}
diff --git a/plugins/shellexec/shellexec.c b/plugins/shellexec/shellexec.c
index b419a4c9..7d49c2d6 100644
--- a/plugins/shellexec/shellexec.c
+++ b/plugins/shellexec/shellexec.c
@@ -103,7 +103,9 @@ shx_callback (Shx_action_t *action, DB_playItem_t *it)
static DB_plugin_action_t *
shx_get_plugin_actions (DB_playItem_t *it)
{
+ deadbeef->pl_lock ();
int is_local = it ? deadbeef->is_local_file (deadbeef->pl_find_meta (it, ":URI")) : 1;
+ deadbeef->pl_unlock ();
Shx_action_t *action;
for (action = actions; action; action = (Shx_action_t *)action->parent.next)
diff --git a/streamer.c b/streamer.c
index 2a5d22bc..53993d9c 100644
--- a/streamer.c
+++ b/streamer.c
@@ -813,7 +813,9 @@ streamer_set_current (playItem_t *it) {
pl_item_ref (i);
int res = -1;
while (i) {
+ pl_lock ();
pl_replace_meta (it, "!URI", pl_find_meta_raw (i, ":URI"));
+ pl_unlock ();
res = streamer_set_current (it);
if (!res) {
pl_item_unref (i);
@@ -2244,6 +2246,7 @@ streamer_notify_order_changed (int prev_order, int new_order) {
playItem_t *curr = playing_track;
if (curr) {
+ pl_lock ();
const char *alb = pl_find_meta_raw (curr, "album");
const char *art = pl_find_meta_raw (curr, "artist");
playItem_t *next = curr->prev[PL_MAIN];
@@ -2256,6 +2259,7 @@ streamer_notify_order_changed (int prev_order, int new_order) {
break;
}
}
+ pl_unlock ();
}
streamer_unlock ();
}