Merge branch 'v0.20.x'

This commit is contained in:
Max Kellermann 2018-10-29 23:06:32 +01:00
commit 9b6a2589e5
5 changed files with 14 additions and 16 deletions

6
NEWS
View File

@ -49,6 +49,12 @@ ver 0.21 (not yet released)
* build with Meson instead of autotools * build with Meson instead of autotools
* use GTest instead of cppunit * use GTest instead of cppunit
ver 0.20.23 (not yet released)
* protocol
- emit "player" idle event when restarting the current song
* fix broken float to s32 conversion
* new clang crash bug workaround
ver 0.20.22 (2018/10/23) ver 0.20.22 (2018/10/23)
* protocol * protocol
- add tag fallbacks for AlbumArtistSort, ArtistSort - add tag fallbacks for AlbumArtistSort, ArtistSort

View File

@ -30,15 +30,7 @@
* exist? This function attempts to recognize exceptions thrown by * exist? This function attempts to recognize exceptions thrown by
* various input plugins. * various input plugins.
*/ */
#ifndef __clang__
/* the "pure" attribute must be disabled because it triggers a clang
bug, wrongfully leading to std::terminate() even though the
function catches all exceptions thrown by std::rethrow_exception();
this can be reproduced with clang 7 from Android NDK r18b and on
clang 6 on FreeBSD
(https://github.com/MusicPlayerDaemon/MPD/issues/373) */
gcc_pure gcc_pure
#endif
bool bool
IsFileNotFound(std::exception_ptr e) noexcept; IsFileNotFound(std::exception_ptr e) noexcept;

View File

@ -34,7 +34,8 @@ struct FloatToIntegerSampleConvert {
typedef typename SrcTraits::long_type SL; typedef typename SrcTraits::long_type SL;
typedef typename DstTraits::value_type DV; typedef typename DstTraits::value_type DV;
static constexpr SV factor = 1 << (DstTraits::BITS - 1); static constexpr SV factor = uintmax_t(1) << (DstTraits::BITS - 1);
static_assert(factor > 0, "Wrong factor");
gcc_const gcc_const
static DV Convert(SV src) noexcept { static DV Convert(SV src) noexcept {
@ -53,7 +54,8 @@ struct IntegerToFloatSampleConvert {
typedef typename SrcTraits::value_type SV; typedef typename SrcTraits::value_type SV;
typedef typename DstTraits::value_type DV; typedef typename DstTraits::value_type DV;
static constexpr DV factor = 0.5 / (1 << (SrcTraits::BITS - 2)); static constexpr DV factor = 1.0 / FloatToIntegerSampleConvert<F, Traits>::factor;
static_assert(factor > 0, "Wrong factor");
gcc_const gcc_const
static DV Convert(SV src) noexcept { static DV Convert(SV src) noexcept {

View File

@ -291,14 +291,10 @@ PlayerControl::LockSeek(std::unique_ptr<DetachedSong> song, SongTime t)
assert(song != nullptr); assert(song != nullptr);
{
const std::lock_guard<Mutex> protect(mutex); const std::lock_guard<Mutex> protect(mutex);
SeekLocked(std::move(song), t); SeekLocked(std::move(song), t);
} }
idle_add(IDLE_PLAYER);
}
void void
PlayerControl::SetCrossFade(FloatDuration duration) noexcept PlayerControl::SetCrossFade(FloatDuration duration) noexcept
{ {

View File

@ -606,6 +606,8 @@ Player::SeekDecoder() noexcept
pc.outputs.Cancel(); pc.outputs.Cancel();
} }
idle_add(IDLE_PLAYER);
if (!dc.IsSeekableCurrentSong(*pc.next_song)) { if (!dc.IsSeekableCurrentSong(*pc.next_song)) {
/* the decoder is already decoding the "next" song - /* the decoder is already decoding the "next" song -
stop it and start the previous song again */ stop it and start the previous song again */