Merge branch 'v0.20.x'

This commit is contained in:
Max Kellermann 2018-03-15 20:07:11 +01:00
commit b7dc3fae7c
9 changed files with 50 additions and 14 deletions

View File

@ -31,3 +31,8 @@ The following people have contributed code to MPD:
Jean-Francois Dockes <jf@dockes.org> Jean-Francois Dockes <jf@dockes.org>
Yue Wang <yuleopen@gmail.com> Yue Wang <yuleopen@gmail.com>
Matthew Leon Grinshpun <ml@matthewleon.com> Matthew Leon Grinshpun <ml@matthewleon.com>
Dimitris Papastamos <sin@2f30.org>
Florian Schlichting <fsfs@debian.org>
François Revol <revol@free.fr>
Jacob Vosmaer <contact@jacobvosmaer.nl>
Thomas Guillem <thomas@gllm.fr>

2
NEWS
View File

@ -34,6 +34,8 @@ ver 0.21 (not yet released)
ver 0.20.19 (not yet released) ver 0.20.19 (not yet released)
* protocol * protocol
- validate absolute seek time, reject negative values - validate absolute seek time, reject negative values
* input
- mms: fix lockup bug and a crash bug
* macOS: fix crash bug * macOS: fix crash bug
ver 0.20.18 (2018/02/24) ver 0.20.18 (2018/02/24)

View File

@ -465,7 +465,7 @@ dnl ---------------------------------------------------------------------------
dnl Mandatory Libraries dnl Mandatory Libraries
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------
AX_BOOST_BASE([1.46],, [AC_MSG_ERROR([Boost not found])]) AX_BOOST_BASE([1.54],, [AC_MSG_ERROR([Boost not found])])
AC_ARG_ENABLE(icu, AC_ARG_ENABLE(icu,
AS_HELP_STRING([--enable-icu], AS_HELP_STRING([--enable-icu],

View File

@ -79,7 +79,10 @@
<para> <para>
If you need to tweak the configuration, you can create a file If you need to tweak the configuration, you can create a file
called <filename>mpd.conf</filename> on the data partition. called <filename>mpd.conf</filename> on the data partition
(the directory which is returned by Android's <ulink
url="https://developer.android.com/reference/android/os/Environment.html#getExternalStorageDirectory()">getExternalStorageDirectory()</ulink>
API function).
</para> </para>
</section> </section>
@ -111,7 +114,7 @@ cd mpd-version</programlisting>
<listitem> <listitem>
<para> <para>
<ulink url="http://www.boost.org/">Boost 1.46</ulink> <ulink url="http://www.boost.org/">Boost 1.54</ulink>
</para> </para>
</listitem> </listitem>

View File

@ -334,8 +334,8 @@ ffmpeg = FfmpegProject(
) )
curl = AutotoolsProject( curl = AutotoolsProject(
'http://curl.haxx.se/download/curl-7.58.0.tar.xz', 'http://curl.haxx.se/download/curl-7.59.0.tar.xz',
'6a813875243609eb75f37fa72044e4ad618b55ec15a4eafdac2df6a7e800e3e3', 'e44eaabdf916407585bf5c7939ff1161e6242b6b015d3f2f5b758b2a330461fc',
'lib/libcurl.a', 'lib/libcurl.a',
[ [
'--disable-shared', '--enable-static', '--disable-shared', '--enable-static',

View File

@ -37,8 +37,12 @@ ThreadInputStream::ThreadInputStream(const char *_plugin,
allocation.ForkCow(false); allocation.ForkCow(false);
} }
ThreadInputStream::~ThreadInputStream() noexcept void
ThreadInputStream::Stop() noexcept
{ {
if (!thread.IsDefined())
return;
{ {
const std::lock_guard<Mutex> lock(mutex); const std::lock_guard<Mutex> lock(mutex);
close = true; close = true;
@ -69,7 +73,7 @@ ThreadInputStream::ThreadFunc() noexcept
Open(); Open();
} catch (...) { } catch (...) {
postponed_exception = std::current_exception(); postponed_exception = std::current_exception();
cond.broadcast(); SetReady();
return; return;
} }

View File

@ -29,6 +29,7 @@
#include <exception> #include <exception>
#include <assert.h>
#include <stdint.h> #include <stdint.h>
/** /**
@ -39,6 +40,11 @@
* manages the thread and the buffer. * manages the thread and the buffer.
* *
* This works only for "streams": unknown length, no seeking, no tags. * This works only for "streams": unknown length, no seeking, no tags.
*
* The implementation must call Stop() before its destruction
* completes. This cannot be done in ~ThreadInputStream() because at
* this point, the class has been morphed back to #ThreadInputStream
* and the still-running thread will crash due to pure method call.
*/ */
class ThreadInputStream : public InputStream { class ThreadInputStream : public InputStream {
const char *const plugin; const char *const plugin;
@ -73,7 +79,12 @@ public:
const char *_uri, Mutex &_mutex, Cond &_cond, const char *_uri, Mutex &_mutex, Cond &_cond,
size_t _buffer_size) noexcept; size_t _buffer_size) noexcept;
virtual ~ThreadInputStream() noexcept; #ifndef NDEBUG
~ThreadInputStream() override {
/* Stop() must have been called already */
assert(!thread.IsDefined());
}
#endif
/** /**
* Initialize the object and start the thread. * Initialize the object and start the thread.
@ -87,6 +98,12 @@ public:
size_t Read(void *ptr, size_t size) override final; size_t Read(void *ptr, size_t size) override final;
protected: protected:
/**
* Stop the thread and free the buffer. This must be called
* before destruction of this object completes.
*/
void Stop() noexcept;
void SetMimeType(const char *_mime) noexcept { void SetMimeType(const char *_mime) noexcept {
assert(thread.IsInside()); assert(thread.IsInside());

View File

@ -39,6 +39,10 @@ public:
MMS_BUFFER_SIZE) { MMS_BUFFER_SIZE) {
} }
~MmsInputStream() noexcept override {
Stop();
}
protected: protected:
virtual void Open() override; virtual void Open() override;
virtual size_t ThreadRead(void *ptr, size_t size) override; virtual size_t ThreadRead(void *ptr, size_t size) override;

View File

@ -46,19 +46,20 @@ pcm_dsd_to_dop(PcmBuffer &buffer, unsigned channels,
assert(audio_valid_channel_count(channels)); assert(audio_valid_channel_count(channels));
assert(_src.size % channels == 0); assert(_src.size % channels == 0);
const unsigned num_src_samples = _src.size; const size_t num_src_samples = _src.size;
const unsigned num_src_frames = num_src_samples / channels; const size_t num_src_frames = num_src_samples / channels;
/* this rounds down and discards the last odd frame; not /* this rounds down and discards up to 3 odd frames; not
elegant, but good enough for now */ elegant, but good enough for now */
const unsigned num_frames = num_src_frames / 2; const size_t num_dop_quads = num_src_frames / 4;
const unsigned num_samples = num_frames * channels; const size_t num_frames = num_dop_quads * 2;
const size_t num_samples = num_frames * channels;
uint32_t *const dest0 = (uint32_t *)buffer.GetT<uint32_t>(num_samples), uint32_t *const dest0 = (uint32_t *)buffer.GetT<uint32_t>(num_samples),
*dest = dest0; *dest = dest0;
auto src = _src.data; auto src = _src.data;
for (unsigned i = num_frames / 2; i > 0; --i) { for (size_t i = num_dop_quads; i > 0; --i) {
for (unsigned c = channels; c > 0; --c) { for (unsigned c = channels; c > 0; --c) {
/* each 24 bit sample has 16 DSD sample bits /* each 24 bit sample has 16 DSD sample bits
plus the magic 0x05 marker */ plus the magic 0x05 marker */