Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d4db873716 | ||
|
|
de0752fd56 | ||
|
|
4204d4928b | ||
|
|
05de0ecec3 | ||
|
|
b05beb000f | ||
|
|
093abaad29 | ||
|
|
e84e4169f9 | ||
|
|
cd6c5cfd4c | ||
|
|
b855f2fcc2 | ||
|
|
ba69ade024 | ||
|
|
a546bfe7d9 | ||
|
|
25deae6cc7 | ||
|
|
62000670e3 | ||
|
|
ac49043fbb | ||
|
|
37a7ca7f14 |
9
NEWS
9
NEWS
@@ -1,3 +1,12 @@
|
||||
ver 0.19.19 (2016/08/23)
|
||||
* decoder
|
||||
- ffmpeg: bug fix for FFmpeg 3.1 support
|
||||
- wildmidi: support libWildMidi 0.4
|
||||
* output
|
||||
- pulse: support 32 bit, 24 bit and floating point playback
|
||||
* support non-x86 NetBSD
|
||||
* fix clang 3.9 warnings
|
||||
|
||||
ver 0.19.18 (2016/08/05)
|
||||
* decoder
|
||||
- ffmpeg: fix crash with older FFmpeg versions (< 3.0)
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
AC_PREREQ(2.60)
|
||||
|
||||
AC_INIT(mpd, 0.19.18, musicpd-dev-team@lists.sourceforge.net)
|
||||
AC_INIT(mpd, 0.19.19, musicpd-dev-team@lists.sourceforge.net)
|
||||
|
||||
VERSION_MAJOR=0
|
||||
VERSION_MINOR=19
|
||||
VERSION_REVISION=18
|
||||
VERSION_REVISION=19
|
||||
VERSION_EXTRA=0
|
||||
|
||||
AC_CONFIG_SRCDIR([src/Main.cxx])
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
#include <utility>
|
||||
#include <cstdint>
|
||||
|
||||
#if defined(__GNUC__) && !GCC_CHECK_VERSION(4,7) && !defined(__clang__)
|
||||
#if GCC_OLDER_THAN(4,7)
|
||||
/* std::chrono::duration operators are "constexpr" since gcc 4.7 */
|
||||
#define chrono_constexpr gcc_pure
|
||||
#else
|
||||
|
||||
@@ -28,19 +28,36 @@
|
||||
#define GCC_VERSION 0
|
||||
#endif
|
||||
|
||||
#ifdef __clang__
|
||||
# define CLANG_VERSION GCC_MAKE_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__)
|
||||
#elif defined(__GNUC__)
|
||||
# define CLANG_VERSION 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Are we building with the specified version of gcc (not clang or any
|
||||
* other compiler) or newer?
|
||||
*/
|
||||
#define GCC_CHECK_VERSION(major, minor) \
|
||||
(defined(__GNUC__) && GCC_VERSION >= GCC_MAKE_VERSION(major, minor, 0))
|
||||
(CLANG_VERSION == 0 && \
|
||||
GCC_VERSION >= GCC_MAKE_VERSION(major, minor, 0))
|
||||
|
||||
/**
|
||||
* Are we building with clang (any version) or at least the specified
|
||||
* gcc version?
|
||||
*/
|
||||
#define CLANG_OR_GCC_VERSION(major, minor) \
|
||||
(CLANG_VERSION > 0 || GCC_CHECK_VERSION(major, minor))
|
||||
|
||||
/**
|
||||
* Are we building with gcc (not clang or any other compiler) and a
|
||||
* version older than the specified one?
|
||||
*/
|
||||
#define GCC_OLDER_THAN(major, minor) \
|
||||
(defined(__GNUC__) && !defined(__clang__) && \
|
||||
(GCC_VERSION > 0 && CLANG_VERSION == 0 && \
|
||||
GCC_VERSION < GCC_MAKE_VERSION(major, minor, 0))
|
||||
|
||||
#ifdef __clang__
|
||||
# define CLANG_VERSION GCC_MAKE_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__)
|
||||
# if __clang_major__ < 3
|
||||
# error Sorry, your clang version is too old. You need at least version 3.1.
|
||||
# endif
|
||||
@@ -56,10 +73,9 @@
|
||||
* Are we building with the specified version of clang or newer?
|
||||
*/
|
||||
#define CLANG_CHECK_VERSION(major, minor) \
|
||||
(defined(__clang__) && \
|
||||
CLANG_VERSION >= GCC_MAKE_VERSION(major, minor, 0))
|
||||
(CLANG_VERSION >= GCC_MAKE_VERSION(major, minor, 0))
|
||||
|
||||
#if GCC_CHECK_VERSION(4,0)
|
||||
#if CLANG_OR_GCC_VERSION(4,0)
|
||||
|
||||
/* GCC 4.x */
|
||||
|
||||
@@ -119,7 +135,7 @@
|
||||
|
||||
#endif
|
||||
|
||||
#if GCC_CHECK_VERSION(4,3)
|
||||
#if CLANG_OR_GCC_VERSION(4,3)
|
||||
|
||||
#define gcc_hot __attribute__((hot))
|
||||
#define gcc_cold __attribute__((cold))
|
||||
@@ -131,7 +147,7 @@
|
||||
|
||||
#endif /* ! GCC_UNUSED >= 40300 */
|
||||
|
||||
#if GCC_CHECK_VERSION(4,6) && !defined(__clang__)
|
||||
#if GCC_CHECK_VERSION(4,6)
|
||||
#define gcc_flatten __attribute__((flatten))
|
||||
#else
|
||||
#define gcc_flatten
|
||||
@@ -140,7 +156,7 @@
|
||||
#ifndef __cplusplus
|
||||
/* plain C99 has "restrict" */
|
||||
#define gcc_restrict restrict
|
||||
#elif GCC_CHECK_VERSION(4,0)
|
||||
#elif CLANG_OR_GCC_VERSION(4,0)
|
||||
/* "__restrict__" is a GCC extension for C++ */
|
||||
#define gcc_restrict __restrict__
|
||||
#else
|
||||
@@ -158,7 +174,7 @@
|
||||
#define final
|
||||
#endif
|
||||
|
||||
#if defined(__clang__) || GCC_CHECK_VERSION(4,8)
|
||||
#if CLANG_OR_GCC_VERSION(4,8)
|
||||
#define gcc_alignas(T, fallback) alignas(T)
|
||||
#else
|
||||
#define gcc_alignas(T, fallback) gcc_aligned(fallback)
|
||||
|
||||
@@ -46,7 +46,7 @@ StatsVisitTag(DatabaseStats &stats, StringSet &artists, StringSet &albums,
|
||||
for (const auto &item : tag) {
|
||||
switch (item.type) {
|
||||
case TAG_ARTIST:
|
||||
#if defined(__clang__) || GCC_CHECK_VERSION(4,8)
|
||||
#if CLANG_OR_GCC_VERSION(4,8)
|
||||
artists.emplace(item.value);
|
||||
#else
|
||||
artists.insert(item.value);
|
||||
@@ -54,7 +54,7 @@ StatsVisitTag(DatabaseStats &stats, StringSet &artists, StringSet &albums,
|
||||
break;
|
||||
|
||||
case TAG_ALBUM:
|
||||
#if defined(__clang__) || GCC_CHECK_VERSION(4,8)
|
||||
#if CLANG_OR_GCC_VERSION(4,8)
|
||||
albums.emplace(item.value);
|
||||
#else
|
||||
albums.insert(item.value);
|
||||
|
||||
@@ -749,7 +749,7 @@ UpnpDatabase::VisitUniqueTags(const DatabaseSelection &selection,
|
||||
|
||||
const char *value = dirent.tag.GetValue(tag);
|
||||
if (value != nullptr) {
|
||||
#if defined(__clang__) || GCC_CHECK_VERSION(4,8)
|
||||
#if CLANG_OR_GCC_VERSION(4,8)
|
||||
values.emplace(value);
|
||||
#else
|
||||
values.insert(value);
|
||||
|
||||
@@ -547,6 +547,10 @@ FfmpegDecode(Decoder &decoder, InputStream &input,
|
||||
AtScopeExit(&codec_context) {
|
||||
avcodec_free_context(&codec_context);
|
||||
};
|
||||
|
||||
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 25, 0) /* FFmpeg 3.1 */
|
||||
avcodec_parameters_to_context(codec_context, av_stream.codecpar);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
const SampleFormat sample_format =
|
||||
|
||||
@@ -65,6 +65,24 @@ wildmidi_finish(void)
|
||||
WildMidi_Shutdown();
|
||||
}
|
||||
|
||||
static DecoderCommand
|
||||
wildmidi_output(Decoder &decoder, midi *wm)
|
||||
{
|
||||
#ifdef LIBWILDMIDI_VER_MAJOR
|
||||
/* WildMidi 0.4 has switched from "char*" to "int8_t*" */
|
||||
int8_t buffer[4096];
|
||||
#else
|
||||
/* pre 0.4 */
|
||||
char buffer[4096];
|
||||
#endif
|
||||
|
||||
int length = WildMidi_GetOutput(wm, buffer, sizeof(buffer));
|
||||
if (length <= 0)
|
||||
return DecoderCommand::STOP;
|
||||
|
||||
return decoder_data(decoder, nullptr, buffer, length, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
wildmidi_file_decode(Decoder &decoder, Path path_fs)
|
||||
{
|
||||
@@ -94,18 +112,11 @@ wildmidi_file_decode(Decoder &decoder, Path path_fs)
|
||||
|
||||
DecoderCommand cmd;
|
||||
do {
|
||||
char buffer[4096];
|
||||
int len;
|
||||
|
||||
info = WildMidi_GetInfo(wm);
|
||||
if (info == nullptr)
|
||||
break;
|
||||
|
||||
len = WildMidi_GetOutput(wm, buffer, sizeof(buffer));
|
||||
if (len <= 0)
|
||||
break;
|
||||
|
||||
cmd = decoder_data(decoder, nullptr, buffer, len, 0);
|
||||
cmd = wildmidi_output(decoder, wm);
|
||||
|
||||
if (cmd == DecoderCommand::SEEK) {
|
||||
unsigned long seek_where =
|
||||
|
||||
@@ -111,7 +111,7 @@ AllocatedPath::ChopSeparators()
|
||||
while (l >= 2 && PathTraitsFS::IsSeparator(p[l - 1])) {
|
||||
--l;
|
||||
|
||||
#if GCC_CHECK_VERSION(4,7) && !defined(__clang__)
|
||||
#if GCC_CHECK_VERSION(4,7)
|
||||
value.pop_back();
|
||||
#else
|
||||
value.erase(value.end() - 1, value.end());
|
||||
|
||||
@@ -216,7 +216,7 @@ SmbclientNeighborExplorer::Run()
|
||||
prev = i;
|
||||
} else {
|
||||
/* can't see it anymore: move to "lost" */
|
||||
#if defined(__clang__) || GCC_CHECK_VERSION(4,7)
|
||||
#if CLANG_OR_GCC_VERSION(4,7)
|
||||
lost.splice_after(lost.before_begin(), list, prev);
|
||||
#else
|
||||
/* the forward_list::splice_after() lvalue
|
||||
|
||||
@@ -545,7 +545,6 @@ pulse_output_open(AudioOutput *ao, AudioFormat &audio_format,
|
||||
Error &error)
|
||||
{
|
||||
PulseOutput *po = (PulseOutput *)ao;
|
||||
pa_sample_spec ss;
|
||||
|
||||
assert(po->mainloop != nullptr);
|
||||
|
||||
@@ -575,11 +574,30 @@ pulse_output_open(AudioOutput *ao, AudioFormat &audio_format,
|
||||
return false;
|
||||
}
|
||||
|
||||
/* MPD doesn't support the other pulseaudio sample formats, so
|
||||
we just force MPD to send us everything as 16 bit */
|
||||
audio_format.format = SampleFormat::S16;
|
||||
/* Use the sample formats that our version of PulseAudio and MPD
|
||||
have in common, otherwise force MPD to send 16 bit */
|
||||
|
||||
pa_sample_spec ss;
|
||||
|
||||
switch (audio_format.format) {
|
||||
case SampleFormat::FLOAT:
|
||||
ss.format = PA_SAMPLE_FLOAT32NE;
|
||||
break;
|
||||
case SampleFormat::S32:
|
||||
ss.format = PA_SAMPLE_S32NE;
|
||||
break;
|
||||
case SampleFormat::S24_P32:
|
||||
ss.format = PA_SAMPLE_S24_32NE;
|
||||
break;
|
||||
case SampleFormat::S16:
|
||||
ss.format = PA_SAMPLE_S16NE;
|
||||
break;
|
||||
default:
|
||||
audio_format.format = SampleFormat::S16;
|
||||
ss.format = PA_SAMPLE_S16NE;
|
||||
break;
|
||||
}
|
||||
|
||||
ss.format = PA_SAMPLE_S16NE;
|
||||
ss.rate = audio_format.sample_rate;
|
||||
ss.channels = audio_format.channels;
|
||||
|
||||
|
||||
@@ -153,7 +153,7 @@ public:
|
||||
HttpdOutput(EventLoop &_loop);
|
||||
~HttpdOutput();
|
||||
|
||||
#if defined(__clang__) || GCC_CHECK_VERSION(4,7)
|
||||
#if CLANG_OR_GCC_VERSION(4,7)
|
||||
constexpr
|
||||
#endif
|
||||
static HttpdOutput *Cast(AudioOutput *ao) {
|
||||
|
||||
@@ -137,7 +137,7 @@ CompositeStorage::Directory::Make(const char *uri)
|
||||
Directory *directory = this;
|
||||
while (*uri != 0) {
|
||||
const std::string name = NextSegment(uri);
|
||||
#if defined(__clang__) || GCC_CHECK_VERSION(4,8)
|
||||
#if CLANG_OR_GCC_VERSION(4,8)
|
||||
auto i = directory->children.emplace(std::move(name),
|
||||
Directory());
|
||||
#else
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
/* well-known big-endian */
|
||||
# define IS_LITTLE_ENDIAN false
|
||||
# define IS_BIG_ENDIAN true
|
||||
#elif defined(__APPLE__)
|
||||
#elif defined(__APPLE__) || defined(__NetBSD__)
|
||||
/* compile-time check for MacOS */
|
||||
# include <machine/endian.h>
|
||||
# if BYTE_ORDER == LITTLE_ENDIAN
|
||||
|
||||
@@ -75,7 +75,7 @@ TagSet::InsertUnique(const Tag &src, TagType type, const char *value,
|
||||
else
|
||||
builder.AddItem(type, value);
|
||||
CopyTagMask(builder, src, group_mask);
|
||||
#if defined(__clang__) || GCC_CHECK_VERSION(4,8)
|
||||
#if CLANG_OR_GCC_VERSION(4,8)
|
||||
emplace(builder.Commit());
|
||||
#else
|
||||
insert(builder.Commit());
|
||||
|
||||
@@ -91,7 +91,7 @@ calc_hash(TagType type, const char *p)
|
||||
return hash ^ type;
|
||||
}
|
||||
|
||||
#if defined(__clang__) || GCC_CHECK_VERSION(4,7)
|
||||
#if CLANG_OR_GCC_VERSION(4,7)
|
||||
constexpr
|
||||
#endif
|
||||
static inline TagPoolSlot *
|
||||
|
||||
@@ -84,7 +84,7 @@ ContainerAttributeOffset(const A C::*p)
|
||||
* Cast the given pointer to a struct member to its parent structure.
|
||||
*/
|
||||
template<class C, class A>
|
||||
#if defined(__clang__) || GCC_CHECK_VERSION(4,7)
|
||||
#if CLANG_OR_GCC_VERSION(4,7)
|
||||
constexpr
|
||||
#endif
|
||||
static inline C &
|
||||
@@ -97,7 +97,7 @@ ContainerCast(A &a, A C::*member)
|
||||
* Cast the given pointer to a struct member to its parent structure.
|
||||
*/
|
||||
template<class C, class A>
|
||||
#if defined(__clang__) || GCC_CHECK_VERSION(4,7)
|
||||
#if CLANG_OR_GCC_VERSION(4,7)
|
||||
constexpr
|
||||
#endif
|
||||
static inline const C &
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#if defined(__clang__) || GCC_CHECK_VERSION(4,7)
|
||||
#if CLANG_OR_GCC_VERSION(4,7)
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wstrict-aliasing"
|
||||
#endif
|
||||
@@ -114,7 +114,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
#if defined(__clang__) || GCC_VERSION >= 40700
|
||||
#if CLANG_OR_GCC_VERSION(4,7)
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user