aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/dbUtils.c5
-rw-r--r--src/decoder/ffmpeg_decoder_plugin.c38
-rw-r--r--src/queue.c4
3 files changed, 40 insertions, 7 deletions
diff --git a/src/dbUtils.c b/src/dbUtils.c
index 527628833..858854f28 100644
--- a/src/dbUtils.c
+++ b/src/dbUtils.c
@@ -256,6 +256,7 @@ visitTag(struct client *client, struct strset *set,
struct song *song, enum tag_type tagType)
{
struct tag *tag = song->tag;
+ bool found = false;
if (tagType == LOCATE_TAG_FILE_TYPE) {
song_print_uri(client, song);
@@ -268,10 +269,12 @@ visitTag(struct client *client, struct strset *set,
for (unsigned i = 0; i < tag->num_items; i++) {
if (tag->items[i]->type == tagType) {
strset_add(set, tag->items[i]->value);
+ found = true;
}
}
- strset_add(set, "");
+ if (!found)
+ strset_add(set, "");
}
struct list_tags_data {
diff --git a/src/decoder/ffmpeg_decoder_plugin.c b/src/decoder/ffmpeg_decoder_plugin.c
index 99fbc2108..41c4648b8 100644
--- a/src/decoder/ffmpeg_decoder_plugin.c
+++ b/src/decoder/ffmpeg_decoder_plugin.c
@@ -56,7 +56,7 @@ struct ffmpeg_context {
struct ffmpeg_stream {
/** hack - see url_to_struct() */
- char url[8];
+ char url[64];
struct decoder *decoder;
struct input_stream *input;
@@ -141,8 +141,28 @@ ffmpeg_find_audio_stream(const AVFormatContext *format_context)
return -1;
}
+/**
+ * Append the suffix of the original URI to the virtual stream URI.
+ * Without this, libavformat cannot detect some of the codecs
+ * (e.g. "shorten").
+ */
+static void
+append_uri_suffix(struct ffmpeg_stream *stream, const char *uri)
+{
+ assert(stream != NULL);
+ assert(uri != NULL);
+
+ char *base = g_path_get_basename(uri);
+
+ const char *suffix = strrchr(base, '.');
+ if (suffix != NULL && suffix[1] != 0)
+ g_strlcat(stream->url, suffix, sizeof(stream->url));
+
+ g_free(base);
+}
+
static bool
-ffmpeg_helper(struct input_stream *input,
+ffmpeg_helper(const char *uri, struct input_stream *input,
bool (*callback)(struct ffmpeg_context *ctx),
struct ffmpeg_context *ctx)
{
@@ -155,6 +175,9 @@ ffmpeg_helper(struct input_stream *input,
};
bool ret;
+ if (uri != NULL)
+ append_uri_suffix(&stream, uri);
+
stream.input = input;
if (ctx && ctx->decoder) {
stream.decoder = ctx->decoder; //are we in decoding loop ?
@@ -362,7 +385,8 @@ ffmpeg_decode(struct decoder *decoder, struct input_stream *input)
ctx.input = input;
ctx.decoder = decoder;
- ffmpeg_helper(input, ffmpeg_decode_internal, &ctx);
+ ffmpeg_helper(decoder_get_uri(decoder), input,
+ ffmpeg_decode_internal, &ctx);
}
#if LIBAVFORMAT_VERSION_INT >= ((52<<16)+(31<<8)+0)
@@ -435,7 +459,7 @@ ffmpeg_stream_tag(struct input_stream *is)
ctx.decoder = NULL;
ctx.tag = tag_new();
- ret = ffmpeg_helper(is, ffmpeg_tag_internal, &ctx);
+ ret = ffmpeg_helper(NULL, is, ffmpeg_tag_internal, &ctx);
if (!ret) {
tag_free(ctx.tag);
ctx.tag = NULL;
@@ -469,6 +493,7 @@ static const char *const ffmpeg_suffixes[] = {
};
static const char *const ffmpeg_mime_types[] = {
+ "application/m4a",
"application/mp4",
"application/octet-stream",
"application/ogg",
@@ -481,9 +506,12 @@ static const char *const ffmpeg_mime_types[] = {
"audio/16sv",
"audio/aac",
"audio/ac3",
+ "audio/aiff"
"audio/amr",
"audio/basic",
"audio/flac",
+ "audio/m4a",
+ "audio/mp4",
"audio/mpeg",
"audio/musepack",
"audio/ogg",
@@ -502,6 +530,7 @@ static const char *const ffmpeg_mime_types[] = {
"audio/x-flac",
"audio/x-gsm",
"audio/x-mace",
+ "audio/x-matroska",
"audio/x-monkeys-audio",
"audio/x-mpeg",
"audio/x-ms-wma",
@@ -514,6 +543,7 @@ static const char *const ffmpeg_mime_types[] = {
"audio/x-pn-multirate-realaudio",
"audio/x-speex",
"audio/x-tta"
+ "audio/x-voc",
"audio/x-wav",
"audio/x-wma",
"audio/x-wv",
diff --git a/src/queue.c b/src/queue.c
index 56449bb3f..d847f1138 100644
--- a/src/queue.c
+++ b/src/queue.c
@@ -46,14 +46,14 @@ queue_next_order(const struct queue *queue, unsigned order)
if (queue->single)
{
- if (queue->repeat)
+ if (queue->repeat && !queue->consume)
return order;
else
return -1;
}
if (order + 1 < queue->length)
return order + 1;
- else if (queue->repeat)
+ else if (queue->repeat && (order > 0 || !queue->consume))
/* restart at first song */
return 0;
else