summaryrefslogtreecommitdiff
path: root/streamer.c
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2011-04-07 22:22:23 +0200
committerGravatar waker <wakeroid@gmail.com>2011-04-07 22:22:23 +0200
commit923fef543f48ad09e1ab0049bfc7b3686ea254dc (patch)
treee7b53717867f7791e6321dd284925c2d26da2136 /streamer.c
parentd59be35ebb660d61e2856266d8d6d1188e1f2f5b (diff)
streamer: auto-reassign decoder plugin if the current was not found
Diffstat (limited to 'streamer.c')
-rw-r--r--streamer.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/streamer.c b/streamer.c
index bbce3995..eaa1f10a 100644
--- a/streamer.c
+++ b/streamer.c
@@ -598,6 +598,7 @@ streamer_set_current (playItem_t *it) {
if (from) {
plug_trigger_event_trackinfochanged (from);
}
+ pl_lock ();
const char *decoder_id = pl_find_meta (it, ":DECODER");
const char *filetype = pl_find_meta (it, ":FILETYPE");
if (!decoder_id && filetype && !strcmp (filetype, "content")) {
@@ -652,6 +653,29 @@ streamer_set_current (playItem_t *it) {
if (decoder_id) {
DB_decoder_t *dec = NULL;
dec = plug_get_decoder_for_id (decoder_id);
+ if (!dec) {
+ // find new decoder by file extension
+ const char *fname = pl_find_meta (it, ":URI");
+ const char *ext = strrchr (fname, '.');
+ if (ext) {
+ ext++;
+ DB_decoder_t **decs = plug_get_decoder_list ();
+ for (int i = 0; decs[i]; i++) {
+ const char **exts = decs[i]->exts;
+ if (exts) {
+ for (int j = 0; exts[j]; j++) {
+ if (!strcasecmp (exts[j], ext)) {
+ fprintf (stderr, "streamer: %s : changed decoder plugin to %s\n", fname, decs[i]->plugin.id);
+ pl_replace_meta (it, ":DECODER", decs[i]->plugin.id);
+ pl_replace_meta (it, ":FILETYPE", ext);
+ dec = decs[i];
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
if (dec) {
trace ("\033[0;33minit decoder for %s (%s)\033[37;0m\n", pl_find_meta (it, ":URI"), decoder_id);
new_fileinfo = dec->open (0);
@@ -685,6 +709,7 @@ streamer_set_current (playItem_t *it) {
}
}
else {
+ pl_unlock ();
trace ("no decoder in playitem!\n");
it->played = 1;
streamer_buffering = 0;
@@ -699,6 +724,7 @@ streamer_set_current (playItem_t *it) {
}
return -1;
}
+ pl_unlock ();
success:
mutex_lock (decodemutex);
if (new_fileinfo) {
@@ -1052,8 +1078,10 @@ streamer_thread (void *ctx) {
mutex_lock (decodemutex);
DB_decoder_t *dec = NULL;
+ pl_lock ();
const char *decoder_id = pl_find_meta (streaming_track, ":DECODER");
dec = plug_get_decoder_for_id (decoder_id);
+ pl_unlock ();
if (dec) {
fileinfo = dec->open (0);
if (fileinfo && dec->init (fileinfo, DB_PLAYITEM (streaming_track)) != 0) {