Commit 3a901098 authored by Max Kellermann's avatar Max Kellermann

Merge tag 'v0.21.6'

release v0.21.6
parents a6609712 808dd7cc
...@@ -2,22 +2,28 @@ ver 0.22 (not yet released) ...@@ -2,22 +2,28 @@ ver 0.22 (not yet released)
* input * input
- ffmpeg: allow partial reads - ffmpeg: allow partial reads
ver 0.21.6 (not yet released) ver 0.21.6 (2019/03/17)
* protocol * protocol
- allow loading playlists specified as absolute filesystem paths - allow loading playlists specified as absolute filesystem paths
- fix negated filter expressions with multiple tag values - fix negated filter expressions with multiple tag values
- fix "list" with filter expression - fix "list" with filter expression
- omit empty playlist names in "listplaylists"
* input * input
- cdio_paranoia: fix build failure due to missing #include - cdio_paranoia: fix build failure due to missing #include
* decoder * decoder
- opus: fix replay gain when there are no other tags - opus: fix replay gain when there are no other tags
- opus: fix seeking to beginning of song
- vorbis: fix Tremor conflict resulting in crash
* output * output
- pulse: work around error with unusual channel count - pulse: work around error with unusual channel count
- osx: fix build failure
* playlist * playlist
- flac: fix use-after-free bug - flac: fix use-after-free bug
* support abstract sockets on Linux * support abstract sockets on Linux
* Windows * Windows
- remove the unused libwinpthread-1.dll dependency - remove the unused libwinpthread-1.dll dependency
* Android
- enable SLES power saving mode
ver 0.21.5 (2019/02/22) ver 0.21.5 (2019/02/22)
* protocol * protocol
......
...@@ -134,7 +134,9 @@ LoadPlaylistFileInfo(PlaylistInfo &info, ...@@ -134,7 +134,9 @@ LoadPlaylistFileInfo(PlaylistInfo &info,
const auto *const name_fs_end = const auto *const name_fs_end =
FindStringSuffix(name_fs_str, FindStringSuffix(name_fs_str,
PATH_LITERAL(PLAYLIST_FILE_SUFFIX)); PATH_LITERAL(PLAYLIST_FILE_SUFFIX));
if (name_fs_end == nullptr) if (name_fs_end == nullptr ||
/* no empty playlist names (raw file name = ".m3u") */
name_fs_end == name_fs_str)
return false; return false;
FileInfo fi; FileInfo fi;
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "OggVisitor.hxx" #include "OggVisitor.hxx"
#include <stdexcept> #include <stdexcept>
#include <utility>
void void
OggVisitor::EndStream() OggVisitor::EndStream()
...@@ -51,7 +52,13 @@ OggVisitor::ReadNextPage() ...@@ -51,7 +52,13 @@ OggVisitor::ReadNextPage()
inline void inline void
OggVisitor::HandlePacket(const ogg_packet &packet) OggVisitor::HandlePacket(const ogg_packet &packet)
{ {
const bool _post_seek = std::exchange(post_seek, false);
if (packet.b_o_s) { if (packet.b_o_s) {
if (_post_seek)
/* ignore the BOS packet after seeking */
return;
EndStream(); EndStream();
has_stream = true; has_stream = true;
OnOggBeginning(packet); OnOggBeginning(packet);
...@@ -97,4 +104,6 @@ OggVisitor::PostSeek() ...@@ -97,4 +104,6 @@ OggVisitor::PostSeek()
/* find the next Ogg page and feed it into the stream */ /* find the next Ogg page and feed it into the stream */
sync.ExpectPageSeekIn(stream); sync.ExpectPageSeekIn(stream);
post_seek = true;
} }
...@@ -39,6 +39,14 @@ class OggVisitor { ...@@ -39,6 +39,14 @@ class OggVisitor {
bool has_stream = false; bool has_stream = false;
/**
* This is true after seeking; its one-time effect is to
* ignore the BOS packet, just in case we have been seeking to
* the beginning of the file, because that would disrupt
* playback.
*/
bool post_seek = false;
public: public:
explicit OggVisitor(Reader &reader) explicit OggVisitor(Reader &reader)
:sync(reader), stream(0) {} :sync(reader), stream(0) {}
......
libflac_dep = dependency('flac', version: '>= 1.2', required: get_option('flac')) libflac_dep = dependency('flac', version: '>= 1.2', required: get_option('flac'))
libopus_dep = dependency('opus', required: get_option('opus')) libopus_dep = dependency('opus', required: get_option('opus'))
libvorbis_dep = dependency('vorbis', required: get_option('vorbis'))
libvorbisidec_dep = dependency('vorbisidec', required: get_option('tremor')) if get_option('tremor').enabled()
# no libvorbis if Tremor was explicitly enabled
libvorbis_dep = dependency('', required: false)
else
libvorbis_dep = dependency('vorbis', required: get_option('vorbis'))
endif
if libvorbis_dep.found()
# no Tremor if libvorbis is used
libvorbisidec_dep = dependency('', required: false)
else
# attempt to auto-detect Tremor only if libvorbis was disabled or not found
libvorbisidec_dep = dependency('vorbisidec', required: get_option('tremor'))
endif
if get_option('vorbis').enabled() and get_option('tremor').enabled() if get_option('vorbis').enabled() and get_option('tremor').enabled()
error('Cannot build both, the Vorbis decoder AND the Tremor (Vorbis fixed-point) decoder') error('Cannot build both, the Vorbis decoder AND the Tremor (Vorbis fixed-point) decoder')
......
...@@ -76,7 +76,10 @@ if is_darwin ...@@ -76,7 +76,10 @@ if is_darwin
audiounit_dep = declare_dependency( audiounit_dep = declare_dependency(
link_args: [ link_args: [
'-framework', 'AudioUnit', '-framework', 'CoreAudio', '-framework', 'CoreServices', '-framework', 'AudioUnit', '-framework', 'CoreAudio', '-framework', 'CoreServices',
] ],
dependencies: [
boost_dep,
],
) )
else else
audiounit_dep = dependency('', required: false) audiounit_dep = dependency('', required: false)
......
...@@ -229,6 +229,14 @@ SlesOutput::Open(AudioFormat &audio_format) ...@@ -229,6 +229,14 @@ SlesOutput::Open(AudioFormat &audio_format)
SL_ANDROID_KEY_STREAM_TYPE, SL_ANDROID_KEY_STREAM_TYPE,
&stream_type, &stream_type,
sizeof(stream_type)); sizeof(stream_type));
/* MPD doesn't care much about latency, so let's
configure power saving mode */
SLuint32 performance_mode = SL_ANDROID_PERFORMANCE_POWER_SAVING;
(*android_config)->SetConfiguration(android_config,
SL_ANDROID_KEY_PERFORMANCE_MODE,
&performance_mode,
sizeof(performance_mode));
} }
result = play_object.Realize(false); result = play_object.Realize(false);
......
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