Commit e2a574e2 authored by Max Kellermann's avatar Max Kellermann

Merge branch 'v0.17.x'

Conflicts: src/locate.c
parents 1536b5a9 ba6ef53e
...@@ -11,6 +11,7 @@ ver 0.17.2 (2012/??/??) ...@@ -11,6 +11,7 @@ ver 0.17.2 (2012/??/??)
- fluidsynth: stop playback at end of file - fluidsynth: stop playback at end of file
- fluidsynth: check MIDI file format while scanning - fluidsynth: check MIDI file format while scanning
- fluidsynth: add sample rate setting - fluidsynth: add sample rate setting
- wavpack: support all APEv2 tags
* output: * output:
- httpd: use monotonic clock, avoid hiccups after system clock adjustment - httpd: use monotonic clock, avoid hiccups after system clock adjustment
- httpd: fix throttling bug after resuming playback - httpd: fix throttling bug after resuming playback
...@@ -23,7 +24,8 @@ ver 0.17.2 (2012/??/??) ...@@ -23,7 +24,8 @@ ver 0.17.2 (2012/??/??)
* state_file: save song priorities * state_file: save song priorities
* player: disable cross-fading in "single" mode * player: disable cross-fading in "single" mode
* update: fix unsafe readlink() usage * update: fix unsafe readlink() usage
* configure.ac:
- don't auto-detect the vorbis encoder when Tremor is enabled
ver 0.17.1 (2012/07/31) ver 0.17.1 (2012/07/31)
* protocol: * protocol:
......
...@@ -1021,6 +1021,11 @@ if test x$enable_tremor = xyes; then ...@@ -1021,6 +1021,11 @@ if test x$enable_tremor = xyes; then
AC_MSG_WARN(["OggTremor detected, could not enable Vorbis."]) AC_MSG_WARN(["OggTremor detected, could not enable Vorbis."])
fi fi
enable_vorbis=no enable_vorbis=no
if test x$enable_vorbis_encoder = xauto; then
AC_MSG_WARN([OggTremor detected, disabling the Vorbis encoder plugin.])
enable_vorbis_encoder=no
fi
fi fi
MPD_AUTO_PKG(vorbis, VORBIS, [vorbis vorbisfile ogg], MPD_AUTO_PKG(vorbis, VORBIS, [vorbis vorbisfile ogg],
......
...@@ -124,11 +124,10 @@ void flac_metadata_common_cb(const FLAC__StreamMetadata * block, ...@@ -124,11 +124,10 @@ void flac_metadata_common_cb(const FLAC__StreamMetadata * block,
case FLAC__METADATA_TYPE_VORBIS_COMMENT: case FLAC__METADATA_TYPE_VORBIS_COMMENT:
if (flac_parse_replay_gain(&rgi, block)) if (flac_parse_replay_gain(&rgi, block))
replay_gain_db = decoder_replay_gain(data->decoder, &rgi); replay_gain_db = decoder_replay_gain(data->decoder, &rgi);
if (flac_parse_mixramp(&mixramp_start, &mixramp_end, block)) {
g_debug("setting mixramp_tags"); if (flac_parse_mixramp(&mixramp_start, &mixramp_end, block))
decoder_mixramp(data->decoder, replay_gain_db, decoder_mixramp(data->decoder, replay_gain_db,
mixramp_start, mixramp_end); mixramp_start, mixramp_end);
}
if (data->tag != NULL) if (data->tag != NULL)
flac_vorbis_comments_to_tag(data->tag, NULL, flac_vorbis_comments_to_tag(data->tag, NULL,
......
...@@ -365,11 +365,10 @@ static void mp3_parse_id3(struct mp3_data *data, size_t tagsize, ...@@ -365,11 +365,10 @@ static void mp3_parse_id3(struct mp3_data *data, size_t tagsize,
replay_gain_db = decoder_replay_gain(data->decoder, &rgi); replay_gain_db = decoder_replay_gain(data->decoder, &rgi);
data->found_replay_gain = true; data->found_replay_gain = true;
} }
if (parse_id3_mixramp(&mixramp_start, &mixramp_end, id3_tag)) {
g_debug("setting mixramp_tags"); if (parse_id3_mixramp(&mixramp_start, &mixramp_end, id3_tag))
decoder_mixramp(data->decoder, replay_gain_db, decoder_mixramp(data->decoder, replay_gain_db,
mixramp_start, mixramp_end); mixramp_start, mixramp_end);
}
} }
id3_tag_delete(id3_tag); id3_tag_delete(id3_tag);
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "utils.h" #include "utils.h"
#include "tag_table.h" #include "tag_table.h"
#include "tag_handler.h" #include "tag_handler.h"
#include "tag_ape.h"
#include <wavpack/wavpack.h> #include <wavpack/wavpack.h>
#include <glib.h> #include <glib.h>
...@@ -38,21 +39,6 @@ ...@@ -38,21 +39,6 @@
#define ERRORLEN 80 #define ERRORLEN 80
static const struct tag_table wavpack_tags[] = {
{ "artist", TAG_ARTIST },
{ "album", TAG_ALBUM },
{ "title", TAG_TITLE },
{ "track", TAG_TRACK },
{ "name", TAG_NAME },
{ "genre", TAG_GENRE },
{ "date", TAG_DATE },
{ "composer", TAG_COMPOSER },
{ "performer", TAG_PERFORMER },
{ "comment", TAG_COMMENT },
{ "disc", TAG_DISC },
{ NULL, TAG_NUM_OF_ITEM_TYPES }
};
/** A pointer type for format converter function. */ /** A pointer type for format converter function. */
typedef void (*format_samples_t)( typedef void (*format_samples_t)(
int bytes_per_sample, int bytes_per_sample,
...@@ -321,7 +307,17 @@ wavpack_scan_file(const char *fname, ...@@ -321,7 +307,17 @@ wavpack_scan_file(const char *fname,
WavpackGetNumSamples(wpc) / WavpackGetNumSamples(wpc) /
WavpackGetSampleRate(wpc)); WavpackGetSampleRate(wpc));
for (const struct tag_table *i = wavpack_tags; i->name != NULL; ++i) /* the WavPack format implies APEv2 tags, which means we can
reuse the mapping from tag_ape.c */
for (unsigned i = 0; i < TAG_NUM_OF_ITEM_TYPES; ++i) {
const char *name = tag_item_names[i];
if (name != NULL)
wavpack_scan_tag_item(wpc, name, (enum tag_type)i,
handler, handler_ctx);
}
for (const struct tag_table *i = ape_tags; i->name != NULL; ++i)
wavpack_scan_tag_item(wpc, i->name, i->type, wavpack_scan_tag_item(wpc, i->name, i->type,
handler, handler_ctx); handler, handler_ctx);
......
...@@ -202,7 +202,6 @@ dc_mixramp_start(struct decoder_control *dc, char *mixramp_start) ...@@ -202,7 +202,6 @@ dc_mixramp_start(struct decoder_control *dc, char *mixramp_start)
g_free(dc->mixramp_start); g_free(dc->mixramp_start);
dc->mixramp_start = mixramp_start; dc->mixramp_start = mixramp_start;
g_debug("mixramp_start = %s", mixramp_start ? mixramp_start : "NULL");
} }
void void
...@@ -212,7 +211,6 @@ dc_mixramp_end(struct decoder_control *dc, char *mixramp_end) ...@@ -212,7 +211,6 @@ dc_mixramp_end(struct decoder_control *dc, char *mixramp_end)
g_free(dc->mixramp_end); g_free(dc->mixramp_end);
dc->mixramp_end = mixramp_end; dc->mixramp_end = mixramp_end;
g_debug("mixramp_end = %s", mixramp_end ? mixramp_end : "NULL");
} }
void void
...@@ -222,5 +220,4 @@ dc_mixramp_prev_end(struct decoder_control *dc, char *mixramp_prev_end) ...@@ -222,5 +220,4 @@ dc_mixramp_prev_end(struct decoder_control *dc, char *mixramp_prev_end)
g_free(dc->mixramp_prev_end); g_free(dc->mixramp_prev_end);
dc->mixramp_prev_end = mixramp_prev_end; dc->mixramp_prev_end = mixramp_prev_end;
g_debug("mixramp_prev_end = %s", mixramp_prev_end ? mixramp_prev_end : "NULL");
} }
...@@ -487,7 +487,6 @@ decoder_task(gpointer arg) ...@@ -487,7 +487,6 @@ decoder_task(gpointer arg)
switch (dc->command) { switch (dc->command) {
case DECODE_COMMAND_START: case DECODE_COMMAND_START:
g_debug("clearing mixramp tags");
dc_mixramp_start(dc, NULL); dc_mixramp_start(dc, NULL);
dc_mixramp_prev_end(dc, dc->mixramp_end); dc_mixramp_prev_end(dc, dc->mixramp_end);
dc->mixramp_end = NULL; /* Don't free, it's copied above. */ dc->mixramp_end = NULL; /* Don't free, it's copied above. */
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#include "tag_handler.h" #include "tag_handler.h"
#include "ape.h" #include "ape.h"
static const struct tag_table ape_tags[] = { const struct tag_table ape_tags[] = {
{ "album artist", TAG_ALBUM_ARTIST }, { "album artist", TAG_ALBUM_ARTIST },
{ "year", TAG_DATE }, { "year", TAG_DATE },
{ NULL, TAG_NUM_OF_ITEM_TYPES } { NULL, TAG_NUM_OF_ITEM_TYPES }
......
...@@ -20,10 +20,14 @@ ...@@ -20,10 +20,14 @@
#ifndef MPD_TAG_APE_H #ifndef MPD_TAG_APE_H
#define MPD_TAG_APE_H #define MPD_TAG_APE_H
#include "tag_table.h"
#include <stdbool.h> #include <stdbool.h>
struct tag_handler; struct tag_handler;
extern const struct tag_table ape_tags[];
/** /**
* Scan the APE tags of a file. * Scan the APE tags of a file.
* *
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment