Compare commits

...

8929 Commits

Author SHA1 Message Date
Max Kellermann
566787f041 release v0.21.26 2020-09-21 15:14:43 +02:00
Max Kellermann
79b2366387 archive/iso9660: fix odd seeking bug (assertion failure)
Skip the beginning of a sector if the last seek was odd, and clear the
buffer on seek.
2020-09-21 15:11:21 +02:00
Max Kellermann
5acea014b0 archive/iso9660: remove unused macro CEILING() 2020-09-21 15:11:17 +02:00
Max Kellermann
b72801abf3 util/ByteOrder: add FromLE16S() 2020-09-21 11:15:45 +02:00
Desuwa
23d5a2b862 Support opus header gain tags and match opus playback volume to other tracks when ReplayGain is enabled. 2020-09-21 10:51:06 +02:00
Rosen Penev
7715311117 fix double promotions
Found with -Wdouble-promotion

Signed-off-by: Rosen Penev <rosenp@gmail.com>
2020-09-21 09:13:51 +02:00
Max Kellermann
4c1cfca95b db/update/InotifyUpdate: pass path by value to recursive_watch_subdirectories() 2020-09-17 14:18:29 +02:00
Max Kellermann
e113ce9621 db/update/InotifyUpdate: obey .mpdignore files
Closes https://github.com/MusicPlayerDaemon/MPD/issues/846
2020-09-17 14:17:17 +02:00
Max Kellermann
e8213220e2 db/update/InotifyUpdate: split the WatchDirectory constructor 2020-09-16 21:08:22 +02:00
Max Kellermann
83f9d2a963 db/update/InotifyUpdate: use class DirectoryReader 2020-09-16 21:02:07 +02:00
Max Kellermann
bf97ebf89f db/update/InotifyUpdate: convert pointer to reference 2020-09-16 20:59:41 +02:00
Max Kellermann
5b22d27cbb db/update/InotifyUpdate: remove commented log call 2020-09-16 20:59:40 +02:00
Max Kellermann
e907ff43ae command/file, storage/{nfs,smbclient}: use PathTraitsFS::IsSpecialFilename()
Eliminate some duplicate code.
2020-09-16 20:57:46 +02:00
Max Kellermann
b18fc3a8d0 db/update/InotifySource: use auto 2020-09-16 20:40:27 +02:00
Max Kellermann
a8e23c4140 db/update/InotifySource: add noexcept 2020-09-16 20:40:06 +02:00
Max Kellermann
fc3861b421 db/update/InotifyQueue: add noexcept 2020-09-16 20:40:03 +02:00
Max Kellermann
e81bb5d8f1 db/update/Inotify*: include cleanup 2020-09-16 20:39:44 +02:00
Max Kellermann
32f4f15831 player/Thread: call OnPlayerSync() in SeekDecoder()
This fixes a spurious "single" mode bug which occurs when using "play"
or "seek" to start playback on the song that is currently paused: in
that case, the main thread never queues the next song, and at the end
of the song, the player thread exits Run(), stopping playback, and
after that, the main thread starts the next song without considering
"single" mode.

By calling OnPlayerSync(), we ensure that the main thread gets a
chance to queue the next song before the player thread exits the Run()
loop.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/850
2020-09-16 20:36:19 +02:00
Max Kellermann
e29c06b718 player/Thread: add another code comment explaining OnPlayerSync() 2020-09-16 20:12:52 +02:00
Max Kellermann
d9d511f33e player/Thread: update function name in comment 2020-09-16 20:12:05 +02:00
Max Kellermann
c61a3b8d13 LogBackend: change the initial log_threshold to DEFAULT
The log levels have always been very confusing (and badly named), but
this was most confusing: if there's a log level called "default", why
is it not the default?

Closes https://github.com/MusicPlayerDaemon/MPD/issues/926
2020-09-16 17:17:34 +02:00
Max Kellermann
e10b867fe6 decoder/ffmpeg: add "hls+http://" to the list of supported protocols 2020-09-16 16:36:07 +02:00
Max Kellermann
43e230f543 decoder/ffmpeg: remove "rtsp://" from the list of supported protocols
FFmpeg implements RTSP as a demuxer, not as a protocol handler.  Thus,
avio_open() cannot be used, and our input plugin cannot handle RTSP.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/930
2020-09-16 16:32:31 +02:00
Max Kellermann
b2ae5298a7 archive/iso9660: implement seeking 2020-09-07 21:13:28 +02:00
Max Kellermann
17dd21ac7f archive/iso9660: fix unaligned reads
Oh the horror!  This plugin cannot possibly ever have worked.  It was
broken from the start, when it was added in commit 37796699cf nearly
twelve (!) years ago.

The plugin would always read at sector boundaries, so it could only
ever work at multiples of 2 kB.
2020-09-07 21:08:46 +02:00
Max Kellermann
1a5e0ef7c9 test/test_archive_iso9660.sh: use an odd chunk size to trigger bug
This makes the unit test fail.  D'oh!
2020-09-07 20:53:46 +02:00
Max Kellermann
979a7a1dcc test/run_input: add option --chunk-size 2020-09-07 20:52:37 +02:00
Max Kellermann
962cf32ba7 test/run_input: pass FileDescriptor to dump_input_stream() 2020-09-07 20:14:39 +02:00
Max Kellermann
ae23682372 system/FileDescriptor: add method FullWrite() 2020-09-07 20:13:43 +02:00
Max Kellermann
540919f256 *: use nullptr instead of NULL 2020-09-07 20:08:27 +02:00
Max Kellermann
398281cd76 io/FileDescriptor: add method FullRead() 2020-09-07 20:07:47 +02:00
Max Kellermann
88446ccde9 test/run_filter: use Filter::Flush() 2020-09-07 20:07:40 +02:00
Max Kellermann
6238cc0734 test/run_filter: pass ConstBuffer<void> to FullWrite() 2020-09-07 20:07:33 +02:00
Max Kellermann
fd4823c507 test/run_filter: fix error message 2020-09-07 20:07:29 +02:00
Max Kellermann
68bcfd8bf0 test/run_filter: check for partial writes 2020-09-07 20:07:24 +02:00
Max Kellermann
1d332746af test/run_filter: move code to WriteOrThrow() 2020-09-07 20:07:18 +02:00
Max Kellermann
f3e133c617 test/run_filter: use class FileDescriptor 2020-09-07 20:07:13 +02:00
Max Kellermann
1678a6eb59 test/run_filter: ensure that partial frames will not get passed to the filter 2020-09-07 20:07:08 +02:00
Max Kellermann
b4dc2c07d5 test/run_filter: move the buffer into the loop 2020-09-07 20:07:03 +02:00
Max Kellermann
d7838950d8 test/run_input: use WithBufferedOutputStream() 2020-09-07 20:04:13 +02:00
Max Kellermann
2e93a83dd5 test/run_input: convert pointer to reference 2020-09-07 20:02:12 +02:00
Max Kellermann
db8b419b8c archive/iso9660: free iso9660_stat_t as early as possible 2020-09-04 18:17:24 +02:00
Max Kellermann
990f631cbc archive/bzip2: make variables more local 2020-09-04 18:02:22 +02:00
Max Kellermann
db46d84458 archive/bzip2: move the eof check out of the ScopeUnlock 2020-09-04 18:01:29 +02:00
Max Kellermann
9e6c4f8d80 archive/bzip2: throw on unexpected input EOF
Don't silently return 0 when there is no more data, because this may
crash the caller.  And flush output even if input EOF has been reached.
2020-09-04 17:54:53 +02:00
Max Kellermann
41b47f95c5 archive/bzip2: simplify bz_stream initializer 2020-09-04 17:52:04 +02:00
Max Kellermann
15939fd87c archive/bzip2: fold Open() into constructor 2020-09-04 17:51:41 +02:00
Max Kellermann
f63c343f68 archive/bzip2: reorder fields to improve packing 2020-09-04 17:51:22 +02:00
Max Kellermann
1a516e7744 archive/bzip2: add override 2020-09-04 17:51:21 +02:00
Max Kellermann
5c9d97775f python/build/libs.py: update Boost to 1.74.0 2020-09-04 14:49:11 +02:00
Max Kellermann
64aadcd13f python/build/libs.py: update CURL to 7.72.0 2020-09-04 14:48:40 +02:00
Max Kellermann
1f6a7d6462 archive/zzip: fix crash on corrupt ZIP file
Sometimes, zzip_file_read() returns 0 even though the end of the file
was not reached.  This causes assertion failures in
DecoderBridge::Read().

Closes https://github.com/MusicPlayerDaemon/MPD/issues/935
2020-09-04 14:34:54 +02:00
Max Kellermann
e44b953d9a archive/zzip: use zzip_ssize_t to avoid integer overflows 2020-09-04 14:33:44 +02:00
Max Kellermann
6c85020630 archive/zzip: add override 2020-09-04 14:33:44 +02:00
Max Kellermann
9d910320f3 archive/zzip: pass std::shared_ptr as template parameter
This eliminates a tiny amount of overhead because the compiler can
choose how to pass the parameter.
2020-09-04 14:33:44 +02:00
Max Kellermann
c53074efc9 archive/zzip: add explicit 2020-09-04 14:33:11 +02:00
Max Kellermann
3b51c53eca win32/build.py: add -D_FORTIFY_SOURCE=0
This fixes the Windows build.  Linking failed because some packages
(e.g. libFLAC) default to enabling `_FORTIFY_SOURCE`, which is broken
in recent mingw versions
(https://github.com/msys2/MINGW-packages/issues/5803).
2020-09-04 14:33:11 +02:00
Max Kellermann
0aa0ffb67b decoder/sndfile: allow partial reads at end of file
While libsndfile doesn't like partial reads in the middle of a file
(see commit 95ac6071b9), it allows partial reads at the end of a file.
It doesn't pay attention to the file size when issuing a read.

Commit ecb67a1ed1 (MPD 0.18.12) was a regression: previously,
partial reads at the end of a file were possible, but switching to
decoder_read_full() made this an error condition.  This way, a portion
at the end of each file was lost, leading to corruption with gapless
playback (https://github.com/MusicPlayerDaemon/MPD/issues/936).

This fix switches to the newly introduced function
decoder_read_much(), which does the same as the code before commit
ecb67a1ed1.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/936
2020-09-04 13:35:00 +02:00
Max Kellermann
33f70931dd decoder/API: add decoder_read_much() 2020-09-04 13:35:00 +02:00
Max Kellermann
8830ea319f decoder/API: add noexcept 2020-09-04 13:35:00 +02:00
Max Kellermann
cbcdc73f9a system/ByteOrder: add noexcept 2020-08-14 16:36:24 +02:00
Max Kellermann
4f6c54ecb3 output/osx: catch kAudioDevicePropertyHogMode errors
Our AudioObjectGetPropertyDataT() wrapper throws exception on error,
and calling it from OSXOutput::Disable() can cause MPD crash due to
std::terminate().

Closes https://github.com/MusicPlayerDaemon/MPD/issues/932
2020-08-14 16:33:43 +02:00
Max Kellermann
2bdf1b2284 test/meson.build: add explicit dependency from run_output on libevent.a
We could exclude that feature if neither ALSA nor httpd are enabled,
but that's too complicated for this small debug program.
2020-08-14 14:40:39 +02:00
Rosen Penev
c876d6a51c lib/icu: fix build without libc iconv support
Need to check for it in iconv.h. Otherwise meson prefixes a __builtin variant in the check.
2020-07-23 14:09:43 +02:00
Max Kellermann
3c745b4bc6 neighbor/smbclient: remove obsolete commented code 2020-07-20 18:13:38 +02:00
Max Kellermann
3a08a6ad72 doc/plugins.rst: document sample formats for OpenSLES 2020-07-20 15:27:41 +02:00
Max Kellermann
448b397cb8 output/sles: support floating point samples
According to https://developer.android.com/ndk/guides/audio/opensl/android-extensions

This feature was mentioned in https://github.com/MusicPlayerDaemon/MPD/issues/922
2020-07-20 15:23:50 +02:00
Max Kellermann
64a1386eb6 output/sles: move SampleFormat selection to switch/case block 2020-07-20 14:47:36 +02:00
Max Kellermann
77c2efe171 python/build/libs.py: update CURL to 7.71.1 2020-07-20 12:37:54 +02:00
Max Kellermann
587c0f6232 python/build/libs.py: update FFmpeg to 4.3.1 2020-07-20 12:37:16 +02:00
Max Kellermann
64e8abf203 python/build/libs.py: update libvorbis to 1.3.7 2020-07-20 12:34:16 +02:00
Max Kellermann
6c40d2a656 python/build/libs.py: update libmpdclient to 2.19 2020-07-20 12:32:19 +02:00
Max Kellermann
cf674e9273 input/Init: downgrade PluginUnconfigured to LogLevel::DEBUG
`LogLevel::INFO` is logged by default, but this message shall only
appear with `--verbose`.

This finally solves https://github.com/MusicPlayerDaemon/MPD/issues/430
2020-07-16 13:19:14 +02:00
Max Kellermann
9bda0379af increment version number to 0.21.26 2020-07-16 12:53:22 +02:00
Max Kellermann
c67372f8af release v0.21.25 2020-07-06 21:41:53 +02:00
Max Kellermann
00789de7d4 db/upnp/Object: root nodes are allowed to omit parent_id and name
This fixes compatibility with Plex DLNA.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/851
2020-07-06 21:36:30 +02:00
Max Kellermann
5ece9685c2 PluginUnavailable: backport class PluginUnconfigured from master
Stop bothering people about the Tidal/Qobuz plugins.
2020-07-06 21:08:22 +02:00
Max Kellermann
e7c5a42821 Log: add Log() and LogFormat() overloads with std::exception_ptr
Make LogError()/FormatError() wrappers for those.  Now we can log
exceptions with a lower level.
2020-07-06 21:08:04 +02:00
Max Kellermann
36e6079c57 Log: make LogLevel the first parameter
Prepare for templated functions.
2020-07-06 21:07:26 +02:00
Max Kellermann
e5f23678ca Log: use GetFullMessage() to print exceptions
Print all nested exceptions on a single line to avoid confusion.
2020-07-06 21:07:16 +02:00
Max Kellermann
749ad7cd83 PluginUnavailable: inherit the base class constructor 2020-07-06 20:40:25 +02:00
Max Kellermann
0b59f4eaee doc/plugins.rst: merge redundant nfs:// documentation 2020-07-06 20:37:58 +02:00
Max Kellermann
402663de74 doc/plugins.rst: more markup 2020-07-06 20:34:04 +02:00
Max Kellermann
eaa66c7ee3 doc/plugins.rst: add smb:// with password example
Closes https://github.com/MusicPlayerDaemon/MPD/issues/864
2020-07-06 20:32:41 +02:00
Max Kellermann
996714d6ff doc/plugins.rst: more markup 2020-07-06 20:32:11 +02:00
Max Kellermann
fe48e5596f command/storage: automatically scan new mounts
Closes https://github.com/MusicPlayerDaemon/MPD/issues/841
2020-07-06 20:23:41 +02:00
Max Kellermann
d7744d2b8e command/storage: check if storage is already mounted
Mounting one storage URI twice on different mount points can lead to
conflicts with the database cache file, and it doesn't make a lot of
sense.

But most importantly, our udisks storage plugin will unmount the disk
from the kernel VFS, and if two exist, they will compete with each
others.  We could (and should) fix this in the udisks storage plugin,
but for now, this workaround is good enough (and useful).
2020-07-06 18:02:47 +02:00
Max Kellermann
33ee35ab92 command/storage: check if mount point is busy
When mounting something over a directory that is already a mount
point, CompositeStorage::Mount() silently overwrites the previously
mounted storage, disposing it.  After that, SimpleDatabase::Mount()
will fail and handle_mount() will roll back the
CompositeStorage::Mount() command, effectively unmounting what was
there before (and also leaking memory).

Closes https://github.com/MusicPlayerDaemon/MPD/issues/918
2020-07-06 17:49:38 +02:00
Max Kellermann
5b291ff768 db/update/Walk: pass concatenated .mpdignore URI to storage.MapUTF8()
Fixes the "Unrecognized URI" error with the udisks storage plugin,
which is caused by the kludge in UdisksStorage::MapUTF8().
2020-07-06 17:19:38 +02:00
Max Kellermann
39d6816a6d neighbor/upnp: roll back changes if DoOpen() fails 2020-07-06 16:23:58 +02:00
Max Kellermann
6517b2d2ac neighbor/upnp: remove D-Bus filter and match in Close()
Fixes use-after-free crash bug during MPD shutdown.
2020-07-06 16:15:18 +02:00
Max Kellermann
bfdf13dca3 decoder/Plugin: allow scan_{file,stream}() to throw
Bug #915 is about an I/O exception thrown where none was allowed,
leading to crash via std::terminate().  However, instead of catching
and logging the error inside the decoder plugin, it should be able to
propagate the I/O error to the MPD core, so MPD can avoid trying other
decoder plugins.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/915
2020-07-06 14:13:34 +02:00
Max Kellermann
daefc61aa4 output/osx: postpone start until the end of Play()
Wait until there is data in the ring buffer.
2020-07-02 15:26:38 +02:00
Max Kellermann
6fed6e50e4 output/osx: merge some duplicate code 2020-07-02 15:25:51 +02:00
Max Kellermann
bc9e074822 output/osx: postpone start until the first Play() call
Wait until there is some data; don't let our render callback be
invoked without any data.
2020-07-02 15:21:54 +02:00
Max Kellermann
8047102542 output/osx: don't restart AudioUnit at the end of Cancel()
We shouldn't restart the AudioUnit while the ring buffer is empty, or
else our render callback may emit noise.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/771
2020-07-02 15:20:43 +02:00
Max Kellermann
fe5b81e180 output/osx: check started in Close() and Cancel() 2020-07-02 15:19:40 +02:00
Max Kellermann
f032925c2d output/osx: add started flag
This will keep track of AudioOutputUnitStart() and
AudioOutputUnitStop().  This will provide some separation between "not
(yet) (re)started" and "paused".
2020-07-02 15:18:37 +02:00
Max Kellermann
8125a5dddb output/osx: don't uninitialize AudioUnit if restart fails
This shall be done by Close(), which will be called automatically
after an error.
2020-07-02 15:10:03 +02:00
Max Kellermann
154170e475 output/osx: clear pause flag only after successful AudioOutputUnitStart() 2020-07-02 15:08:59 +02:00
Max Kellermann
fb83936feb apple/AudioUnit: add AudioUnitSetPropertyT() 2020-07-02 14:59:40 +02:00
Max Kellermann
db8bf52f7d apple/AudioObject: add AudioObjectGetStringProperty() 2020-07-02 13:50:05 +02:00
Max Kellermann
756f0b8027 apple: build static library
Move build rules from src/output/plugins/meson.build
2020-07-02 13:49:54 +02:00
Max Kellermann
b1fba8d3d7 apple/AudioObject: add missing inline 2020-07-02 13:49:52 +02:00
Max Kellermann
e606044271 apple/AudioUnit: library wrapping AudioUnit*() functions 2020-07-01 23:02:22 +02:00
Max Kellermann
bcbb3371ff apple/AudioUnit: rename to AudioObject.hxx 2020-07-01 22:49:03 +02:00
Max Kellermann
de632882d1 output/osx: move code to FindAudioDeviceByName() 2020-07-01 22:48:12 +02:00
Max Kellermann
745e492d15 output/osx: use [[maybe_unused]] 2020-07-01 22:41:00 +02:00
Max Kellermann
c5dc615efe output/osx: use IsDigitASCII() 2020-07-01 22:39:54 +02:00
Max Kellermann
beeb02025e output/osx: use range-based for 2020-07-01 22:06:36 +02:00
Max Kellermann
cdf7062597 apple/AudioUnit: wrapper functions for AudioObject properties 2020-07-01 22:05:11 +02:00
Max Kellermann
346084da1e apple/Throw: new helper library replacing osx_os_status_to_cstring() 2020-07-01 22:05:11 +02:00
Max Kellermann
bbceb5eb91 output/osx: silently ignore some errors in osx_output_set_device() 2020-07-01 22:05:11 +02:00
Max Kellermann
90d85319c2 apple/ErrorRef: new library wrapping CFErrorRef 2020-07-01 22:05:10 +02:00
Max Kellermann
3d03683e7d output: use StringIsEqual() 2020-07-01 22:04:26 +02:00
Max Kellermann
d8a74802d1 apple/StringRef: new library wrapping CFStringRef 2020-07-01 22:01:53 +02:00
Max Kellermann
191919d1b1 output/osx: remove trailing newline from exception messages 2020-07-01 22:01:51 +02:00
Max Kellermann
df38e7565b util/HugeAllocator: import std::swap() 2020-07-01 21:56:58 +02:00
Max Kellermann
cb49a03fd7 util/HugeAllocator: add noexcept 2020-07-01 21:56:54 +02:00
Max Kellermann
faee5bbb78 decoder/opus: implement End Trimming (RFC7845 4.4)
Closes https://github.com/MusicPlayerDaemon/MPD/issues/867
2020-07-01 21:26:34 +02:00
Max Kellermann
7befab7e83 decoder/opus: keep track of the granulepos
Will be needed for End Trimming (RFC7845 4.4,
https://github.com/MusicPlayerDaemon/MPD/issues/867).
2020-07-01 21:21:06 +02:00
Max Kellermann
4244e61214 decoder/opus: simplify indentation in HandleAudio() 2020-07-01 21:19:52 +02:00
Max Kellermann
46eab05045 decoder/opus: allocate buffer only in the first chained song
Fixes memory leak.  That's what we get for
2020-07-01 21:07:49 +02:00
Max Kellermann
5ca137c73c decoder/opus: add API docs 2020-07-01 20:55:18 +02:00
Max Kellermann
760238fe16 decoder/opus: apply pre-skip (RFC7845 4.2)
Fixes the first part of
https://github.com/MusicPlayerDaemon/MPD/issues/867
2020-07-01 20:44:53 +02:00
Max Kellermann
a99b4abae8 decoder/OpusHead: return pre-skip 2020-07-01 17:51:07 +02:00
Max Kellermann
472881cb95 util/ByteOrder: remove redundant inline keywords from constexpr functions 2020-07-01 17:50:34 +02:00
Max Kellermann
c4efc37ad8 system/ByteOrder: move to util/ 2020-07-01 17:49:57 +02:00
Max Kellermann
691b6a236e output/osx: improve sample rate selection
The formula in osx_output_score_sample_rate() to detect multiples of
the source sample rate was broken: when given a 44.1 kHz input file,
it preferred 16 kHz over 48 kHz, because its `frac_portion(16)=0.75`
is smaller than `frac_portion(48)=0.91`.

That formula, introduced by commit 40a1ebee29, looks completely
wrong.  It doesn't do what the code comment pretends it does.

Instead of using that `frac_portion` to calculate a score, this patch
adds to the score only if `frac_portion` is nearly `0` or `1`.  This
means that the factor is nearly integer.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/904
2020-07-01 17:38:08 +02:00
Max Kellermann
5c7243d3ad output/osx: make several fields const 2020-07-01 17:35:39 +02:00
Max Kellermann
44cfdff39a output/osx: make variables more local 2020-07-01 17:35:33 +02:00
Max Kellermann
5eedda691a output/osx: make more AudioObjectPropertyAddress instances static constexpr 2020-07-01 17:35:19 +02:00
Max Kellermann
a30d5e1b6a output/osx: make AudioObjectPropertyAddress variables static constexpr 2020-07-01 17:34:12 +02:00
Max Kellermann
8ef09a0a71 output/osx: don't use C99 designated initializers
Fixes `-Wpedantic`.
2020-07-01 17:34:06 +02:00
Max Kellermann
e8044663b3 output/{alsa,osx}: use ConstBuffer::empty() 2020-07-01 17:32:37 +02:00
Max Kellermann
8444c33514 output/osx: don't use variable-length arrays 2020-07-01 17:31:46 +02:00
Max Kellermann
2b7328b434 output/osx: fix coding style 2020-07-01 17:11:02 +02:00
Max Kellermann
ca705e1e37 python/build/meson.py: set BOOST_ROOT for Meson 0.54
Commit
08224dafcb
changed Meson to require BOOST_ROOT for cross builds.
2020-07-01 16:55:28 +02:00
Max Kellermann
d9f9b3df10 input/file: detect premature end of file
A bug report (https://github.com/MusicPlayerDaemon/MPD/issues/912)
suggests that on Linux, reading on `cifs` files may rarely return 0 (=
end of file) before the end of the file has really been reached.  But
that's just a theory which I need to validate, so this runtime check
shall catch this condition before the assertion in
DecoderBridge::Read() crashes MPD.  Let's see.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/912
2020-07-01 15:14:27 +02:00
Max Kellermann
a43ee97746 util/UriUtil: strip credentials from smb:// URIs
Closes https://github.com/MusicPlayerDaemon/MPD/issues/910
2020-06-22 22:48:56 +02:00
Max Kellermann
43c32372e7 util/UriUtil: make schemes array static 2020-06-22 22:48:07 +02:00
Max Kellermann
5716cde1fb queue/PlaylistEdit: fix crash in SetSongIdRange() while playing
An assertion failure in UpdateQueuedSong() could trigger because the
`prev` parameter is always `nullptr`, but `queued` may be set.  And in
fact, calling UpdateQueuedSong() is only necessary when the queued
song was edited, to re-queue it with the new range.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/901
2020-06-11 07:07:02 +02:00
Max Kellermann
b7a99b4a4b increment version number to 0.21.25 2020-06-11 06:29:08 +02:00
Max Kellermann
24741c5d06 release v0.21.24 2020-06-10 22:48:50 +02:00
Max Kellermann
6b3a282db4 lib/curl/Request: don't enable CURLOPT_NETRC on Windows
Our Windows build is built with `--disable-netrc`, and that makes
CURLOPT_NETRC fail, causing failures with all streams.  D'oh!

Closes https://github.com/MusicPlayerDaemon/MPD/issues/886
2020-06-10 22:46:42 +02:00
Max Kellermann
7583cfe9b7 {android,win32}/build.py: enable the GME decoder plugin
Closes https://github.com/MusicPlayerDaemon/MPD/issues/891
2020-06-10 21:33:29 +02:00
Max Kellermann
aafc9ce75b decoder/gme: use class NarrowPath() for Windows compatibility 2020-06-10 21:22:00 +02:00
Max Kellermann
fea326530b decoder/gme: simplify LoadGmeAndM3u() by moving code to ReplaceSuffix() 2020-06-10 21:20:49 +02:00
Max Kellermann
8925cc17d8 decoder/gme: use StringAfterPrefix() 2020-06-10 21:11:08 +02:00
Max Kellermann
14412c867f add a few IWYU pragmas 2020-06-10 21:10:33 +02:00
Max Kellermann
c5cc256bf2 decoder/gme: use Path::GetSuffix() 2020-06-10 21:02:07 +02:00
Max Kellermann
563c7318f9 fs/AllocatedPath: add method GetSuffix() 2020-06-10 21:00:41 +02:00
Max Kellermann
e92129f449 doc/protocol.rst: clarify the term "UNIX time"
Closes https://github.com/MusicPlayerDaemon/MPD/issues/893
2020-06-10 20:42:42 +02:00
Max Kellermann
374cc51f77 decoder/Bridge: add flag to make initial seek errors fatal
When the client wants to seek, but the decoder has already finished
decoding the current song, the player restarts the decoder with an
initial seek at the new position.  When this initial seek fails, MPD
pretends nothing has happened and plays this song from the start.

With this new flag, a restarted decoder marks the initial seek as
"essential" and fails the decoder if that seek fails.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/895
2020-06-10 17:49:10 +02:00
Rosen Penev
1008d5f67c use cwchar include
Needed for std::wmemchr under libcxx

Signed-off-by: Rosen Penev <rosenp@gmail.com>
2020-05-30 13:22:04 +02:00
Shen-Ta Hsieh
8e07ea7ad8 src/db: fitting libmpdclient interface 2020-05-29 19:00:16 +02:00
Max Kellermann
d751df0a73 storage/State: disable -Wcomma to work around Boost compiler warning 2020-05-28 14:00:31 +02:00
Max Kellermann
2c084781b0 output/openal: disable -Wdeprecated-declarations on Apple 2020-05-28 13:59:52 +02:00
Max Kellermann
ae7d550a01 meson.build: remove -Wall -Wextra, to be set by Meson 2020-05-28 13:19:34 +02:00
Max Kellermann
30d97fe8a0 meson.build: fix the WildMidi check when the feature is disabled
Fixes regression from commit 69f09648a4
2020-05-27 16:06:49 +02:00
Max Kellermann
5cb0080052 meson.build: default to warning_level=2
This branch isn't yet ready for level 3 (`-Wpedantic`) due to several
C++ violations (e.g. variable length arrays).  These are already
cleaned up in the master branch (0.22).
2020-05-27 15:57:13 +02:00
Max Kellermann
8e4ca23727 lib/ffmpeg/Time: replace C99 compound literal with C++ initializer list 2020-05-27 15:54:34 +02:00
Max Kellermann
bdc861f058 util/TemplateString: remove extra semicolon 2020-05-27 15:46:55 +02:00
Rosen Penev
8925040262 remove some more extra semicolons
Signed-off-by: Rosen Penev <rosenp@gmail.com>
2020-05-27 15:36:53 +02:00
Max Kellermann
c065950ced .travis.yml: disable zzip on OS X to fix Travis-CI build failure 2020-05-27 15:31:34 +02:00
Max Kellermann
257a77fa35 {android,win32}/build.py: build libmodplug and WildMidi
Closes https://github.com/MusicPlayerDaemon/MPD/issues/866
2020-05-27 15:03:49 +02:00
Max Kellermann
4e5d6e560b decoder/modplug: assume ModPlug is built as static library on Windows 2020-05-27 15:03:46 +02:00
Max Kellermann
d276d8eda2 decoder/wildmidi: assume WildMidi is built as static library on Windows 2020-05-27 15:03:35 +02:00
Max Kellermann
ebcb5e9368 decoder/wildmidi: use NarrowPath, fixing the Windows build 2020-05-27 15:03:33 +02:00
Max Kellermann
69f09648a4 meson.build: attempt to detect WildMidi using pkg-config
The WildMidi project added the pkg-config file in version 0.3.3, but
unfortunately, Debian still doesn't ship it 4 years later:

 https://bugs.debian.org/916631

However, for cross-compiling, the pkg-config file is very helpful.
2020-05-27 15:03:16 +02:00
Max Kellermann
9adda30c38 NEWS: move two lines below Windows/Android 2020-05-27 14:33:43 +02:00
Max Kellermann
d2d4a0251e .gitignore: add emacs lsp-mode files 2020-05-26 21:07:56 +02:00
Max Kellermann
f7b6431b6f meson.build: work around Meson bug detecting strndup() on Windows
Work around Meson bug https://github.com/mesonbuild/meson/issues/3672
2020-05-26 20:50:56 +02:00
Max Kellermann
03b9bd3a9e python/build/libs.py: update FFmpeg to 4.2.3 2020-05-26 18:54:56 +02:00
Max Kellermann
61aed60f6d python/build/libs.py: update CURL to 7.70.0 2020-05-07 14:18:55 +02:00
Max Kellermann
2cc323c9fe python/build/libs.py: update Boost to 1.73.0 2020-05-07 14:18:21 +02:00
Max Kellermann
f24ab120ee android/build.py: use -fpic instead of -fPIC on ARM/Aarch64
Sync with the Android NDK build scripts.
2020-05-07 13:58:36 +02:00
Max Kellermann
68349bc55c android/build.py: use -mfpu=vfpv3-d16 on ARMv7
This flag is used by the Android NDK build scripts as well, and this
fixes a build failure (assembler error) with FFmpeg and NDK r21.
2020-05-07 13:50:33 +02:00
Max Kellermann
209364adf2 db/simple: fix crash when mounting twice
The `db->close()` call was a `nullptr` dereference because the `db`
variable had already been moved.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/839
2020-05-05 18:57:29 +02:00
Max Kellermann
24afdee35c command/all: "tagtypes" requires no permissions
The command is used to configure the client's connection, and this
shouldn't require any permissions.  The client should be able to do
that before sending a password.
2020-04-30 13:08:09 +02:00
Max Kellermann
7aea285361 Revert "Fix unsafe float comparison."
This reverts commit a5273d6992.  It was
wrong and broke the MixRamp unit test.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/844
2020-04-30 06:57:36 +02:00
Rosen Penev
47a7707df1 Math.hxx: fix wrong macro name
_GLIBCXX_USE_C99_MATH_TR1 is the correct one.

_GLIBCXX_USE_C99_MATH is always defined.
2020-04-29 23:20:04 +02:00
Max Kellermann
6fdae1139f increment version number to 0.21.24 2020-04-29 23:20:04 +02:00
Max Kellermann
6c240f667c release v0.21.23 2020-04-23 17:46:20 +02:00
Max Kellermann
3040ddb5ec lib/nfs/FileReader: use struct stat64 on Windows 32-bit
libnfs is compiled with `-D_FILE_OFFSET_BITS=64`, but Meson decides
not to enable this mode.  We could force this mode, but then again,
these days, nobody should be using 32-bit Windows ... so this is a
kludge only for debugging with 32-bit WINE.
2020-04-23 17:32:34 +02:00
Max Kellermann
fdb28eb0c4 fs/NarrowPath: preserve nullptr in Path operator
Fixes Path::IsNull() checks on Windows.
2020-04-23 17:10:28 +02:00
Max Kellermann
7ded244a61 lib/nfs/Connection: pass POLLHUP and POLLERR to nfs_service() 2020-04-23 16:58:53 +02:00
Max Kellermann
8ed533acf3 event/SocketMonitor: handle epoll_ctl()=EBADF/ENOENT in Schedule()
This fixes a freeze bug in the NFS input/storage plugins: when libnfs
auto-reconnets after a failure, it installs the new socket on the same
file descriptor number.  MPD's attempt to unregister the old socket by
calling SocketMonitor::Steal() from NfsConnection::ScheduleSocket()
fails because the new/old socket number is not registered in epoll, so
epoll_ctl() returns ENOENT.  The problem is that it left
`scheduled_flags`, and so subsequent Schedule() calls will use
`EPOLL_CTL_MOD`, which will fail again and again.  Instead, we need to
use `EPOLL_CTL_ADD` to register the new socket.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/806

Closes https://github.com/MusicPlayerDaemon/MPD/issues/756
2020-04-23 16:58:26 +02:00
Max Kellermann
a27580d0cc lib/nfs/Connection: don't pass HANGUP to Schedule()
This flag is output-only.
2020-04-23 15:21:04 +02:00
Max Kellermann
905db05cf9 zeroconf/AvahiPoll: don't pass ERROR|HANGUP to Schedule()
These flags are output-only.
2020-04-23 15:19:24 +02:00
Max Kellermann
4242aee21e event/SocketMonitor: remove HANGUP|ERROR from ScheduleRead()
These flags are output-only.  Using them here is misleading.
2020-04-23 15:18:18 +02:00
Max Kellermann
e71bd2a08b event/PollGroupWinSelect: make EVENT_{READ,WRITE} static 2020-04-23 15:10:57 +02:00
Max Kellermann
e53a4d0a9e lib/nfs/FileReader: reset state in OnNfsCallback()
The object's state is `IDLE` when OnNfsCallback() gets invoked, so
let's use the start of the method to reset the `state` field.
2020-04-23 14:54:52 +02:00
Max Kellermann
159389164a lib/nfs/FileReader: set state=IDLE before invoking callback
Fixes assertion failure if the callback fails.
2020-04-23 14:51:43 +02:00
geneticdrift
0a92fbc18e tag/Fallback: add tag fallback for AlbumSort
Closes https://github.com/MusicPlayerDaemon/MPD/issues/832
2020-04-22 22:00:38 +02:00
Max Kellermann
138c29320b gme: adapt to API change in the upcoming version 0.7.0
Closes https://github.com/MusicPlayerDaemon/MPD/issues/833
2020-04-22 21:53:00 +02:00
Max Kellermann
8f00dbea45 lib/icu/Compare: add Windows implementation
Using CompareStringEx() and FindNLSStringEx().

Implements a missing piece for
https://github.com/MusicPlayerDaemon/MPD/issues/820
2020-04-22 21:42:12 +02:00
Max Kellermann
f3fd2eb618 lib/icu/Compare: use AllocatedString::Clone() 2020-04-22 21:39:13 +02:00
Max Kellermann
fc92db83cf lib/icu/Collate: use NORM_IGNORECASE instead of LINGUISTIC_IGNORECASE
LINGUISTIC_IGNORECASE is unimplemented on Wine, but since we don't
have any locale support (yet), and we're using LOCALE_NAME_INVARIANT,
NORM_IGNORECASE should essentially be the same, so why bother.
2020-04-22 21:39:13 +02:00
Max Kellermann
3b0f8d5516 lib/icu/CaseFold: remove Windows implementation
Reverts commit fb3564fbe7

LCMapStringEx() doesn't do what I imagined it would do 5 years ago.
D'oh!

Closes https://github.com/MusicPlayerDaemon/MPD/issues/820
2020-04-22 19:32:36 +02:00
Rosen Penev
a5273d6992 Fix unsafe float comparison.
Switching == to >= should be safe here since the next if is the opposite.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
2020-04-22 18:21:40 +02:00
Thomas Guillem
b18074f899 storage/curl: fix path comparison when the server escapes differently
Unescape the base path and the path coming from the server (href) to fix the
comparison when the server uses different escaped characters.

The outputted name need to be unescaped. Doing that before or after the
HrefToEscapedName() call should not change the current behavior.
2020-04-15 13:50:12 +02:00
Thomas Guillem
3d8067a041 storage/curl: fix href when file has a '&' char
If the file name is "Hello & bye", 3 CharacterData events will be sent with the
State::HREF state:
 - "Hello%20"
 - "&"
 - "%20bye"

Reproduced with files hosted on an apache2 DAV server: 2.4.38-3+deb10u3.
2020-04-15 13:18:16 +02:00
Florian Heese
f6fe001fa9 Added missing channel order setups for ALSA 2020-04-15 13:13:09 +02:00
Max Kellermann
32a5bf043b player/Thread: drain outputs at end of song in "single" mode
Without this, the Pause() call would drop the ring buffers and would
skip a considerable portion of the end of the song.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/824
2020-04-14 16:07:03 +02:00
Max Kellermann
8d2079482f Merge branch 'lkj' of git://github.com/neheb/MPD into v0.21.x 2020-04-14 13:12:42 +02:00
Max Kellermann
c331c75fde increment version number to 0.21.23 2020-04-14 13:12:36 +02:00
Rosen Penev
6080c3b4ba Math.hxx: move cmath include out of define
The _GLIBCXX_USE_C99_MATH macro is defined in glibcxx by c++config.h, which
gets included by every header. Which means a header needs to be present.

(cherry picked from commit 79e9aff338)
2020-04-09 14:24:06 -07:00
Max Kellermann
5ccfcffcc1 release v0.21.22 2020-04-02 17:48:56 +02:00
Max Kellermann
afe2aaa5f6 fs/io/GzipOutputStream: increase buffer size to 16 kB
Reduce I/O overhead.
2020-04-02 17:17:58 +02:00
Max Kellermann
9b11caa0e6 fs/io/BufferedReader: larger default buffer (4 kB -> 16 kB)
Reduce I/O overhead.
2020-04-02 17:17:27 +02:00
Max Kellermann
a689b881d3 test/meson.build: work around linker failure due to statically linked CURL 2020-04-02 17:16:05 +02:00
Max Kellermann
e94c436264 src/event/meson.build: depend in libnet.a
The event library uses various libnet.a classes,
e.g. SocketDescriptor.
2020-04-02 17:16:05 +02:00
Max Kellermann
bad829509e test/ShutdownHandler: add inline to work around Windows linker problems 2020-04-02 17:16:05 +02:00
Max Kellermann
9c66b0414a test/*: fix Windows build using class FromNarrowPath 2020-04-02 17:16:05 +02:00
Max Kellermann
4d453a8313 fs/NarrowPath: add class FromNarrowPath
Move code from ParseCommandLine().
2020-04-02 17:15:34 +02:00
Max Kellermann
61d7b436a2 fs/NarrowPath: un-inline Windows constructor 2020-04-02 16:27:44 +02:00
Max Kellermann
cdddaf21b0 db/simple/Directory: optimize GetName() using the parent's path
This method gets called a lot during MPD startup, via FindChild() and
directory_load_subdir(), so this is worth optimizing at the expense of
code readability.

This speeds up MPD startup by 10%.
2020-04-02 16:12:08 +02:00
Max Kellermann
b267ba5f0a tag/Pool: enlarge hash table
This consumes more memory (plus 48 kB on 32 bit systems), but reduces
the number of hash collisions, speeding up MPD startup with large
databases.
2020-04-02 15:45:35 +02:00
Max Kellermann
8270043053 Revert "decoder/ffmpeg: copy the AVPacket in ffmpeg_send_packet()"
This reverts commit eb192137d6.

This is no longer necessary because we require FFmpeg 3.1 or newer
since MPD 0.21.2.

This fixes a deprecation warning because the implicit AVPacket copy
constructor copies the deprecated attribute `convergence_duration`.
2020-04-01 17:30:28 +02:00
Max Kellermann
c00ce42bca python/build/libs.py: update libmpdclient to 2.18 2020-04-01 17:17:30 +02:00
Max Kellermann
3852ddbbce .travis.yml: install more packages on OSX
Enable lots of plugins for better CI coverage.
2020-04-01 16:37:45 +02:00
Max Kellermann
672bc3ab67 time/Convert: fix GetTimeZoneOffset() on Windows
Was using the wrong parameter.
2020-04-01 16:21:29 +02:00
Max Kellermann
62229f14da test/time: add test for LocalTime(), GmTime() 2020-04-01 16:21:29 +02:00
Max Kellermann
a4c925c8d7 test/meson.build: move TestTime to time/ 2020-04-01 16:12:01 +02:00
Max Kellermann
60610e90b1 test/net/TestIPv[46]Address: fix Windows build errors 2020-04-01 16:09:24 +02:00
Max Kellermann
90184e0ce7 python/build/libs.py: update CURL to 7.69.1 2020-04-01 15:49:16 +02:00
Max Kellermann
9c3e1d450a fs/io/GunzipReader: increase buffer size to 64 kB
Reduces I/O overhead while reading a compressed database file.
2020-03-31 15:07:39 +02:00
Thomas Guillem
60f2116202 android/Settings: remove the EXPIRIMENTAL text
Using MPD from Android since quite some times now. I consider it very stable
now.
2020-03-26 17:31:31 +01:00
Thomas Guillem
4ff2532330 android: add TV support
TODO: Not sure the app could be accepted on the play store without a valid
banner.
2020-03-26 17:31:20 +01:00
Thomas Guillem
9c15760c4d android/Main: handle API26 NotificationChannel
This seems to be required on recent Android versions (tested with Android 10).
This is also required for android TV services (cf. next commit).

This is done using Java reflection so that the project doesn't depend on
android compat libs.
2020-03-26 17:30:55 +01:00
Max Kellermann
e1c43ec65f Merge branch 'ucl' of git://github.com/neheb/MPD into v0.21.x 2020-03-26 17:28:21 +01:00
Thomas Guillem
4dd10894ba lib/curl/Request: fix Exception "error" on Android
Apparently, it's not possible to change CURLOPT_NETRC on Android.
2020-03-26 17:26:14 +01:00
Rosen Penev
608d7ec1e7 [clang-tidy] change integer prefixes to uppercase
Found with readability-uppercase-literal-suffix

Signed-off-by: Rosen Penev <rosenp@gmail.com>
2020-03-26 17:25:20 +01:00
Max Kellermann
8474599ed6 lib/curl/Easy: add method Unpause() 2020-03-26 17:22:10 +01:00
Max Kellermann
ab39f64fc0 lib/curl/Easy: add setter functions 2020-03-26 17:21:30 +01:00
Max Kellermann
185fbca282 lib/curl/Global: make ReadInfo() private 2020-03-26 17:20:10 +01:00
Max Kellermann
6e3b2fd844 lib/curl/Global: remove redundant API docs 2020-03-26 17:20:06 +01:00
Max Kellermann
dab39dc778 lib/curl: fix coding style 2020-03-26 17:19:48 +01:00
Max Kellermann
8cd5e79fbd event/*, ...: make GetEventLoop() const 2020-03-26 17:19:13 +01:00
Max Kellermann
1de3ac6c78 lib/curl/Init: add const overloads 2020-03-26 17:18:27 +01:00
Max Kellermann
abe06a5fa6 lib/curl/Init: add noexcept 2020-03-26 17:18:23 +01:00
Rosen Penev
85c27840a3 treewide: use boost::lround when std::round is unavailable
This is the case with uClibc-ng currently.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
(cherry picked from commit 769cd0ee9f0cf8ceb026aa751b5d4a390bb5dbdc)
(changed define to match master)
2020-03-25 18:54:15 -07:00
Thomas Guillem
81c16273c5 output/sles: use the AndroidMixerPlugin 2020-03-25 20:08:53 +01:00
Thomas Guillem
801ae86b5d mixer: add AndroidMixerPlugin 2020-03-25 20:07:26 +01:00
Thomas Guillem
5619fd0bba android: Context: add GetAudioManager 2020-03-25 20:07:25 +01:00
Thomas Guillem
200258c7c3 android: add AudioManager 2020-03-25 20:07:24 +01:00
Max Kellermann
5418bb49fb android/Context: add noexcept 2020-03-25 20:07:18 +01:00
Max Kellermann
3449c14ff5 java/Object: rename class Object to GlobalObject 2020-03-25 20:07:15 +01:00
kowalcj0
36a89e8fe7 Support RSS feeds with application/xml MIME-type 2020-03-22 10:49:38 +01:00
Max Kellermann
8e6a21a9c2 increment version number to 0.21.22 2020-03-22 10:48:53 +01:00
Max Kellermann
c560ec8ea6 release v0.21.21 2020-03-19 15:22:28 +01:00
Max Kellermann
56c234b410 raise default "max_connections" value to 100
Documentation says the limit is 5, but it was really 10 (at least
since 2004).  But since MPD wants to promote using many small clients
idling around, and these clients consume only very few resources, it
seems reasonable to raise this limit's default value.
2020-03-19 13:30:46 +01:00
Max Kellermann
82743dfd02 playlist/asx: concatenate multiple CharacterData fragments
Similar to c45f113856
2020-03-12 21:07:37 +01:00
Max Kellermann
33694642bd playlist/asx: add State::TAG 2020-03-12 20:42:16 +01:00
Max Kellermann
c71242d743 playlist/asx: use tag_table to convert element name to TagType 2020-03-12 20:40:18 +01:00
Max Kellermann
c45f113856 playlist/xspf: concatenate multiple CharacterData fragments
Closes https://github.com/MusicPlayerDaemon/MPD/issues/781
2020-03-12 08:02:58 +01:00
Max Kellermann
e0a8fd398c playlist/xspf: add State::TAG 2020-03-12 08:00:54 +01:00
Max Kellermann
3e97058151 playlist/xspf: move location.empty() check to _start_element() 2020-03-11 20:54:53 +01:00
Max Kellermann
51b1dd8672 playlist/xspf: use tag_table to convert element name to TagType 2020-03-11 20:51:47 +01:00
Max Kellermann
98a7d8da6c playlist/xspf: use C++11 initializer 2020-03-11 20:51:10 +01:00
Max Kellermann
acb29f792f tag/Mask: fix yet another typo, this time in Unset()
Similar to commits e8f2f98048 and
ff1ff1e54a

Closes https://github.com/MusicPlayerDaemon/MPD/issues/783
2020-03-11 20:34:02 +01:00
Max Kellermann
cd364023ae .travis.yml: rename "matrix" to "jobs"
Travis has changed the canonical name for this a while ago.

(Now really.  The last commit for this was empty.)
2020-03-07 09:31:46 +01:00
Max Kellermann
8d34a1cfc6 archive/iso9660: skip empty filenames
Aparently, libcdio sometimes returns empty filenames, causing MPD
crashes.  This shouldn't really happen, and I consider this a libcdio
bug - but if it happens, people blame MPD, so let's add a check.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/776
2020-03-07 09:30:56 +01:00
Max Kellermann
73a1f078a6 archive/iso9660: use IsSpecialFilename() 2020-03-07 09:30:56 +01:00
Max Kellermann
b7ce452308 fs/Traits: add IsSpecialFilename()
Merge some duplicate code in a central library.
2020-03-07 09:30:56 +01:00
Max Kellermann
5faf76051d .travis.yml: force updating homebrew on OSX
Workaround for Travis failures as described in
 https://travis-ci.community/t/macos-build-fails-because-of-homebrew-bundle-unknown-command/7296/18
2020-03-07 09:30:56 +01:00
Max Kellermann
5fe70a3417 .travis.yml: rename "matrix" to "jobs"
Travis has changed the canonical name for this a while ago.
2020-03-07 09:30:56 +01:00
Thomas Klausner
7a68b1e71f Adapt SolarisOutputPlugin.cxx to be usable on NetBSD. 2020-02-29 10:05:29 +01:00
Thomas Klausner
d5468dfe89 Add missing header.
Fixes
../src/time/ISO8601.cxx:67:24: error: use of undeclared identifier 'strtoul'
        unsigned long value = strtoul(s, &endptr, 10);
                              ^
../src/time/ISO8601.cxx:77:14: error: use of undeclared identifier 'strtoul'
                        minutes = strtoul(s, &endptr, 10);
                                  ^

on NetBSD with clang 9.0.0.
2020-02-29 10:04:54 +01:00
John Regan
976372ff63 gme: check for empty metadata strings instead of nullptr
Using libgme 0.6.2 on macOS, it appears that gme_info_t strings can be
empty, which creates weird track titles: (001/050)

This adds an additional check for an empty string.
2020-02-25 20:12:08 +01:00
Max Kellermann
9abb686eeb increment version number to 0.21.21 2020-02-16 20:48:46 +01:00
Max Kellermann
f24bcc7f42 release v0.21.20 2020-02-16 20:43:35 +01:00
Max Kellermann
89800324cb .travis.yml: use GTest 1.8.0 instead of HEAD
Fixes strange C++11 compatibility problems during GTest installation:

 /tmp/gtest-20200216-20679-mu1044/googletest/include/gtest/internal/gtest-internal.h:1249:1: error: unknown type name 'constexpr'
 constexpr bool TypedTestCaseIsDeprecated() { return true; }

 /tmp/gtest-20200216-20679-mu1044/googletest/include/gtest/internal/gtest-internal.h:1249:11: error: expected unqualified-id
 constexpr bool TypedTestCaseIsDeprecated() { return true; }

 /tmp/gtest-20200216-20679-mu1044/googletest/include/gtest/internal/gtest-internal.h:1254:1: error: unknown type name 'constexpr'
 constexpr bool RegisterTypedTestCase_P_IsDeprecated() { return true; }
2020-02-16 20:33:15 +01:00
Rosen Penev
050e30418c Fix travis
pip is bugged on arm64 and s390x. Add --no-cache-dir to fix. For
consistency, it doesn't hurt to add everywhere.
2020-02-16 19:29:30 +01:00
Max Kellermann
5397d18ed9 protocol/ArgParser: cast seek offset to SignedSongTime
"The issue is that ParseCommandArgSignedSongTime parses with
SongTime::FromS, not SignedSongTime::FromS, before casting back to a
SignedSongTime for the return. With x86 overflow rules this doesn't
matter, but on ARM the first cast turns negative values to zero."

Closes https://github.com/MusicPlayerDaemon/MPD/issues/757
2020-02-10 09:18:37 +01:00
Max Kellermann
42eb69f46f test/meson.build: restore -Wno-missing-declarations for GTest
This is still needed for GTest 1.8.0 (Travis / Ubuntu Bionic).
2020-02-04 22:06:51 +01:00
Max Kellermann
f1ad21d2bf test/meson.build: add -Wno-unused-command-line-argument for clang 9+ 2020-02-04 16:35:44 +01:00
Max Kellermann
535a099a27 test/meson.build: drop obsolete gtest warning suppressions 2020-02-04 16:32:13 +01:00
Max Kellermann
50003f6ad2 decoder/ffmpeg: add two more missing commas 2020-02-04 16:30:05 +01:00
Rosen Penev
0914644d2b add missing comma
Found with bugprone-suspicious-missing-comma

Signed-off-by: Rosen Penev <rosenp@gmail.com>
2020-02-04 16:29:23 +01:00
Max Kellermann
5ad6e7fec5 decoder/{audio,snd}file: handle MIME type "audio/wav" 2020-02-01 11:26:57 +01:00
Rosen Penev
0bb943ba3e FfmpegDecoderPlugin: add WAV support 2020-02-01 11:24:51 +01:00
Rosen Penev
80a0cf694f MadDecoderPlugin: fix bad printf format
max_frames is size_t, not unsigned long. Fixes GCC warning.
2020-01-31 21:21:39 +01:00
Max Kellermann
0c9e25b3c4 NEWS: add missing line 2020-01-25 20:09:16 +01:00
Max Kellermann
943a67c805 decoder/ogg: need to sync small files while looking for EOS
When calling OggSeekFindEOS() from inside a OggVisitor callback, then
the #InputStream may be in the middle of an Ogg packet, and the newly
initialized #ogg_sync_state will not be able to load it without the
help of ogg_sync_pageseek().  By passing "synced=false" to
OggSeekFindEOS(), we force the use of ogg_sync_pageseek() even when
not actually seeking.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/719
2020-01-25 20:07:11 +01:00
Max Kellermann
881d91f86b lib/xiph/OggFind: add parameter "synced" 2020-01-25 20:07:10 +01:00
Max Kellermann
54d57fdcc2 test/DumpDecoderClient: dump the seekable flag 2020-01-25 20:07:09 +01:00
Max Kellermann
f6f30d6d64 increment version number to 0.21.20 2020-01-25 20:06:58 +01:00
Max Kellermann
4013fa15b9 release v0.21.19 2020-01-17 15:49:02 +01:00
Max Kellermann
ac1b844c15 android/AndroidManifest.xml: increase targetSdkVersion to 28
Google Play refuses uploads with a lower targetSdkVersion.
2020-01-17 15:48:43 +01:00
Max Kellermann
b8614048d4 python/build/libs.py: update Boost to 1.72.0 2020-01-17 15:33:13 +01:00
Max Kellermann
aed0d13591 python/build/libs.py: update expat to 2.2.9 2020-01-17 15:33:13 +01:00
Max Kellermann
9d02103ebe python/build/libs.py: disable various CURL features we don't use 2020-01-17 15:33:13 +01:00
Max Kellermann
61784c2144 python/build/libs.py: update CURL to 7.68.0 2020-01-17 15:19:46 +01:00
Max Kellermann
7059215795 python/build/libs.py: update FFmpeg to 4.2.2 2020-01-17 15:19:00 +01:00
Max Kellermann
2190cc7927 python/build/libs.py: update FLAC to 1.3.3 2020-01-17 15:17:21 +01:00
Max Kellermann
75dc9506c2 python/build/libs.py: update libmpdclient to 2.17 2020-01-17 15:16:20 +01:00
Max Kellermann
4f11fa0d41 config/File: allow overriding top-level settings in includes
Remove the error message and instead erase the old setting if the
"repeatable" flag is not set.

https://github.com/MusicPlayerDaemon/MPD/issues/684
2020-01-17 14:58:40 +01:00
Max Kellermann
ce7ec2b3f5 meson.build: add -f{function,data}-sections to C++ as well
By accident, this was only enabled for C.
2020-01-14 17:48:48 +01:00
Max Kellermann
fada4aa529 NEWS: mention the Android build fix 2020-01-12 13:08:37 +01:00
Max Kellermann
aa0e121ade android/build.py: support x86_64 builds 2020-01-12 13:03:18 +01:00
Max Kellermann
b4700039fd android/build.py: drop -lmstackrealign
This flag doesn't appear to work, and since we never had a problem
without the flag, implementing Google's recommendation is useless.
2020-01-12 13:03:18 +01:00
Max Kellermann
ab41c16eb5 android/build.py: add -Wl,--exclude-libs=ALL
Don't export the symbols of all those static libraries.  Most
importantly, don't export the whole libc++ ABI.
2020-01-12 12:47:40 +01:00
Max Kellermann
04101f37b8 android/build.py: add -fno-faddrsig and -lmstackrealign 2020-01-12 12:41:37 +01:00
Max Kellermann
8c31370534 android/build.py: drop --sysroot, -isystem, -L, ...
These appear to be no longer necessary (tested with NDK r20b).

Closes https://github.com/android/ndk/issues/951
2020-01-12 12:11:09 +01:00
Max Kellermann
2306b0d78c android/build.py: append API level to LLVM triple
This implicitly defines __ANDROID_API__, which means we can drop the
"-D__ANDROID_API__=" parameter.

This is recommended on
https://android.googlesource.com/platform/ndk/+/ndk-release-r20/docs/BuildSystemMaintainers.md
2020-01-12 12:02:12 +01:00
Max Kellermann
cb1a9045e6 android/build.py: drop "-none" from llvm_triple
It's not mentioned on
https://developer.android.com/ndk/guides/other_build_systems
2020-01-12 11:51:20 +01:00
Max Kellermann
e92af06664 android/build.py: remove obsolete dict key android_api_level 2020-01-12 11:49:10 +01:00
Max Kellermann
af20a1c994 pulse: obey Pulse's maximum sample rate (fixes DSD128 playback)
Closes https://github.com/MusicPlayerDaemon/MPD/issues/708
2020-01-12 07:58:17 +01:00
Max Kellermann
756560eac3 .travis.yml: add ARM64 build (for NEON optimizations) 2020-01-01 18:36:59 +01:00
Jacob Vosmaer
dca0519336 Clang: only use [[fallthrough]] in C++ files
It appears that [[fallthrough]] is valid in C++ but not in C. And
in some Clang versions (e.g. Clang 11 on macOS), Clang is pedantic
about this and considers it an error to use [[fallthrough]] in a
.c file such as src/util/format.c.

This changes makes gcc_fallthrough a no-op under Clang in C files.
2019-12-31 13:54:09 +01:00
Max Kellermann
b9a7f30443 .travis.yml: add s390x build (big-endian) 2019-12-24 16:47:07 +01:00
Max Kellermann
32a17a997a increment version number to 0.21.19 2019-12-24 16:41:13 +01:00
Max Kellermann
bf41d1ad2b release v0.21.18 2019-12-24 16:13:16 +01:00
Max Kellermann
d27e534a85 time/ISO8601: fix Windows build failure
Caused by 2bc127bb43
2019-12-24 16:12:52 +01:00
Max Kellermann
6d54928d7c Revert "lib/curl/Global: remove lower bound on timeouts"
This reverts commit 4475b8ca04.  Further
testing revealed that the threaded resolver still uses a timeout of
0ms.  This revert however lowers the bound to a minimum of 1ms instead
of 10ms.
2019-12-24 16:09:26 +01:00
Max Kellermann
0dffe05bf7 input/curl: remove unnecessary InvalidateSockets() call
Like fe598e7d30
2019-12-24 11:41:52 +01:00
Max Kellermann
9ef1f10319 .travis.yml: install brew packages using addons/homebrew 2019-12-24 11:20:54 +01:00
Max Kellermann
23fcfdbd2a .travis.yml: remove "brew update"
The packages from the Travis image are good enough, and this speeds up
the Travis build.
2019-12-24 11:20:29 +01:00
Max Kellermann
3401d26d4c .travis.yml: switch to xcode9.4, the current default 2019-12-24 10:20:04 +01:00
Max Kellermann
256753ea46 .travis.yml: disable Homebrew analytics
Don't bother sending analytics data for a CI runner.  This adds
traffic but doesn't bring anybody any benefit.
2019-12-24 10:19:25 +01:00
Max Kellermann
76cd5f8595 .travis.yml: cache Homebrew on osx 2019-12-24 10:17:37 +01:00
Max Kellermann
5684025847 .travis.yml: change "cache" yaml syntax 2019-12-24 10:17:35 +01:00
Max Kellermann
744bd1eadc time/ISO8601: refactor ParseTimeOfDay() to parse one by one
This prepares the migration away from strptime() for Windows
portability.

But the real reason I'm doing this is that strptime() on Apple is
buggy: strptime("14", "%H%M%S") (without separating colons) succeeds
even though only the hour has been parsed.  This fixes recent Travis
failures in the ParseISO8601() unit test.
2019-12-24 10:15:03 +01:00
Max Kellermann
2bc127bb43 time/ISO8601: move code to ParseTimeOfDay() 2019-12-24 10:15:01 +01:00
Max Kellermann
7770298a65 util/Compiler.h: use [[fallthrough]] on clang
Older clang versions don't support the GCC __attribute__ syntax.  For
those, don't use anything at all, and new clang versions shall use the
standard syntax.
2019-12-24 08:04:48 +01:00
Max Kellermann
fa50cdb39e .travis.yml: escape dollar signs in MATRIX_EVAL
Expand $PATH at evaluation and not at assignment, which fixes the
problem that /usr/lib/ccache was added to $PATH between the
MATRIX_EVAL assignment and its evaluation.
2019-12-24 07:51:55 +01:00
Max Kellermann
816ef12088 .travis.yml: add Ubuntu Bionic build 2019-12-23 18:12:04 +01:00
Max Kellermann
5ff786e59c .travis.yml: enable ccache on Linux 2019-12-23 18:10:58 +01:00
Max Kellermann
80fe88e8f6 .travis.yml: enable ccache on osx 2019-12-23 18:10:52 +01:00
Max Kellermann
a1afe9afc6 util/Compiler.h: add gcc_fallthrough
Works around build failures with ccache which may feed processed code
to GCC, which doesn't have the "fall through" code comments.
2019-12-23 17:53:57 +01:00
Max Kellermann
fe598e7d30 lib/curl/Global: remove InvalidateSockets() call from Remove()
curl_multi_remove_handle() calls our socket function, and there's no
need to call curl_multi_socket_action().
2019-12-23 14:52:46 +01:00
Max Kellermann
4475b8ca04 lib/curl/Global: remove lower bound on timeouts
This was a problem 9 years ago, and apparently, it has been fixed long
ago.
2019-12-23 14:50:51 +01:00
Max Kellermann
a714bdb0ce lib/curl: drop support for CURL versions older than 7.32.0
For simplicity, this commit removes a workaround for an old CURL bug.
2019-12-23 14:41:06 +01:00
Max Kellermann
087874620f test/RunCurl: new debug program 2019-12-23 14:26:56 +01:00
Max Kellermann
f1116c9258 event/Loop: remove bogus assertion
Can fail if somebody calls Break().
2019-12-23 14:20:09 +01:00
Max Kellermann
d01fb6730a storage/curl: move start call out of the constructor
This can cause request completion in the I/O thread before this
constructor returns, leaving the object in an abstract state, causing
a crash due to pure virtual method call.  We should not start the
request until this object is fully constructed.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/665
2019-12-23 13:37:58 +01:00
Max Kellermann
7bfe6a3304 test/run_storage: add command "stat" 2019-12-22 19:54:31 +01:00
Max Kellermann
9a577f8060 event/MultiSocketMonitor: add workaround for /dev/null
The ALSA "null" driver opens /dev/null and returns the file handle
from snd_pcm_poll_descriptors(), but /dev/null cannot be used with
epoll, the epoll_ctl() system call returns -EPERM.  This means that
the ALSA output hangs, eventually freezing the whole MPD process.

This commit adds a workaround to the MultiSocketMonitor class which is
used by the ALSA output plugin.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/695
2019-12-22 12:08:44 +01:00
Max Kellermann
d75a0d714e event/MultiSocketMonitor: remove unnecessary friend declaration 2019-12-22 12:08:44 +01:00
Max Kellermann
9be3a1554e event/MultiSocketMonitor: remove duplicate IdleMonitor::Schedule() call
SetReady() does this already.
2019-12-22 12:08:10 +01:00
Max Kellermann
7764719513 event/MultiSocketMonitor: un-inline AddSocket() 2019-12-22 12:00:12 +01:00
Max Kellermann
dcbb9fe07c event/Loop: round timeout up to avoid unnecessary wakeups 2019-12-22 11:58:31 +01:00
Max Kellermann
e3b347820a event/MultiSocketMonitor: use std::exchange() 2019-12-20 13:42:35 +01:00
Max Kellermann
a84bf5a92e event/MultiSocketMonitor: AddSocket() returns bool 2019-12-18 17:50:21 +01:00
Max Kellermann
732bdc800d event/SocketMonitor: Schedule() returns bool 2019-12-18 17:46:33 +01:00
Max Kellermann
a8661b5931 increment version number to 0.21.18 2019-12-18 16:49:04 +01:00
Max Kellermann
5680a3a4b7 release v0.21.17 2019-12-16 23:32:44 +01:00
Max Kellermann
15ce8eb487 time/ISO8601: support omitting field separators
Closes https://github.com/MusicPlayerDaemon/MPD/issues/685
2019-12-16 23:31:29 +01:00
Max Kellermann
b7744be208 song/Filter: try ParseISO8601() first
Prepare for allowing ISO8601 time stamps without delimiters, such as
20191216, and prevent them from being interpreted as numeric UNIX time
stamps.
2019-12-16 23:31:29 +01:00
Max Kellermann
63c5d66016 time/ISO8601: support omitting minutes 2019-12-16 23:24:43 +01:00
Max Kellermann
d09bd9178f time/ISO8601: support omitting seconds 2019-12-16 23:24:43 +01:00
Max Kellermann
7d8b1860c3 time/ISO8601: support time zone offset 2019-12-16 23:24:43 +01:00
Max Kellermann
b06825829b time/ISO8601: allow omitting the "Z" suffix
And allow "Z" suffix after date.
2019-12-16 23:24:43 +01:00
Max Kellermann
ba4cd47fd8 time/ISO8601: allow omitting the time of day 2019-12-16 23:24:43 +01:00
Max Kellermann
bbe403f141 test/TestISO8601: unit test for time/ISO8601 2019-12-16 23:24:43 +01:00
Max Kellermann
5df2707d98 time/ISO8601: ParseISO8601() returns precision 2019-12-16 23:24:43 +01:00
Max Kellermann
4859ea468f time/ISO8601: implement with strptime(), without ParseTimePoint()
Prepare for adding more flexible parsing.
2019-12-16 23:24:43 +01:00
Max Kellermann
2a8830db70 time/Convert: fallback TimeGm() implementation
Move code from Parser.cxx.
2019-12-16 23:24:38 +01:00
Max Kellermann
fed9b6fd74 time/Parser: use TimeGm() 2019-12-16 23:03:31 +01:00
Max Kellermann
b02890eb8a time/Parser: explicitly initialize struct tm before strptime()
This is recommended by the strptime() manpage, because strptime() does
not initialize/set attributes which were not specified in the format
string.
2019-12-16 23:03:25 +01:00
Max Kellermann
da882a6eb6 time/Convert: include sys/time.h for struct timeval
Closes https://github.com/MusicPlayerDaemon/MPD/issues/562
2019-12-16 23:03:21 +01:00
Max Kellermann
aeb89aa9d6 time/ISO8601: forward-declare StringBuffer 2019-12-16 23:02:59 +01:00
Max Kellermann
f885807ecc time/Convert: update copyright 2019-12-16 23:02:58 +01:00
Max Kellermann
b826fd71f0 time/Convert: mention exceptions 2019-12-16 23:02:57 +01:00
Max Kellermann
ae35df1126 zeroconf/AvahiPoll: move TimevalToChrono() to time/Convert.cxx 2019-12-16 23:02:45 +01:00
Max Kellermann
80e55f6bfc time/Convert: add noexcept 2019-12-16 23:02:40 +01:00
Max Kellermann
e7411c0c4b time/Convert: add pure attributes 2019-12-16 23:02:38 +01:00
Max Kellermann
e9af692973 util/Time*: move to time/ 2019-12-16 23:02:14 +01:00
Max Kellermann
0cf90ee8b6 decoder/mad: work around bogus -Wuninitialized in GCC 10 2019-12-16 23:01:31 +01:00
Max Kellermann
dc3c0c8866 pcm/Convert, ...: add missing include for std::runtime_error 2019-12-16 22:52:50 +01:00
Max Kellermann
1c46bb1ba6 lib/gcrypt/MD5: add missing include for uint8_t 2019-12-16 22:52:22 +01:00
Max Kellermann
2e8f42c6ad util/StringBuffer: use std::size_t instead of size_t 2019-12-16 22:51:23 +01:00
Jacob Vosmaer
2b301ffd2c lib/xiph: add missing meson dependency 2019-12-16 17:11:14 +01:00
Jacob Vosmaer
ef0765ca10 input: add missing boost meson dependency 2019-12-16 17:11:14 +01:00
Naglis Jonaitis
9766ac6db3 Fix typo in documentation 2019-12-16 17:09:45 +01:00
Max Kellermann
32799ff682 archive/zzip: improve error reporting
Most importantly, this commit translates ZZIP_ENOENT to
std::system_error(ENOENT) so IsFileNotFound() returns true and
find_stream_art() can suppress the log line.
2019-12-04 12:33:42 +01:00
Max Kellermann
ce093be12c system/Error: add FormatFileNotFound() 2019-12-04 12:33:38 +01:00
Max Kellermann
2c276770f0 util/PrintException, ...: update copyright 2019-12-04 12:33:36 +01:00
Max Kellermann
75a592f629 system/Error: move code to IsErrno() 2019-12-04 12:33:33 +01:00
Max Kellermann
13ce07d181 output/shout: declare metadata as UTF-8
Apparently, Icecast defaults to ISO-8859-1 for MP3:

 http://icecast.org/docs/icecast-2.4.0/config-file.html#mountsettings

This change forces Icecast to UTF-8 without having to configure it in
Icecast's configuration file.
2019-11-06 16:05:22 +01:00
Max Kellermann
d659c7df19 python/build/libs: update CURL to 7.66.0 2019-11-04 14:27:00 +01:00
Max Kellermann
f8403a1d29 python/build/libs: update FFmpeg to 4.2.1 2019-11-04 14:26:05 +01:00
Max Kellermann
ebb952c4ad neighbor/meson.build: disable if -Ddatabase=false
Fixes yet another build failure (which however only affects the 0.22
branch).

Closes https://github.com/MusicPlayerDaemon/MPD/issues/666
2019-11-04 14:18:48 +01:00
Max Kellermann
bea3b954a5 meson.build, SongUpdate: disable db-specific archive code if -Ddatabase=false
Fixes another build failure.
2019-11-04 14:15:48 +01:00
Max Kellermann
129d8e89b9 lib/sqlite: disable if -Ddatabase=false
Fixes build failure in StickerCommands.cxx.
2019-11-04 14:10:03 +01:00
Niklas Haas
65778a3774 output/Jack: mark ports as terminal
This is the correct thing to do for ports from which a signal ultimately
"originates", such as is the case with mpd.
2019-10-29 10:07:44 +01:00
kaliko
d9841668ff doc/user.rst: update build dependencies on Debian Buster 2019-10-28 15:20:05 +01:00
Max Kellermann
85d27cbcb9 increment version number to 0.21.17 2019-10-16 14:20:28 +02:00
Max Kellermann
9b95e65bd9 release v0.21.16 2019-10-16 11:58:36 +02:00
Max Kellermann
12a86c4975 queue/PlaylistEdit: fix relative destination offset when moving a range
Commit 13208bf5a7 added range support to
the `move` command, but applied the wrong offset to the `to` variable.
When the source range is before the current song, and the song thus
gets decremented by the range size, then the final destination offset
must also be decremented by the range size.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/663
2019-10-15 17:00:16 +02:00
Max Kellermann
0b9435858b storage/curl: unescape file names from PROPFIND
This is the last missing piece for https://github.com/MusicPlayerDaemon/MPD/issues/662
2019-10-15 16:49:17 +02:00
Max Kellermann
f0386459ee storage/curl: follow redirects for collections without trailing slash 2019-10-15 16:42:39 +02:00
Max Kellermann
e98d4670b8 storage/curl: work around different case in hex digits 2019-10-15 16:26:53 +02:00
Max Kellermann
56cc42b752 storage/curl: use MapUTF8() to reuse existing escaping code
Commit 29f78b18b1 continued.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/662
2019-10-15 16:26:53 +02:00
Max Kellermann
ead208987d storage/curl: unescape URI in MapToRelativeUTF8() 2019-10-15 16:26:49 +02:00
Max Kellermann
364acc8949 lib/curl/Escape: add CurlUnescape() 2019-10-15 13:39:02 +02:00
Max Kellermann
a8f4d2b6fc storage/curl: move code to EscapeUriPath() 2019-10-15 13:24:06 +02:00
Max Kellermann
0eb113e7c6 lib/curl/String: OO wrapper for allocated strings returned from CURL 2019-10-15 13:13:39 +02:00
Andre Heider
96a9670c69 lib/icu: fix build with iconv() 2019-10-07 13:34:04 +02:00
Max Kellermann
dcc5ce6792 storage/curl: request the "resourcetype" property to fix update
Without requesting the property, "good" WebDAV servers would not send
it, and so MPD could never recognize a directory, failing the database
update.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/660
2019-10-07 12:44:48 +02:00
Max Kellermann
23d08820a2 db/update/Walk: fix crash when music_directory is not a directory
Add a runtime sanity check to avoid the assertion failure.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/660
2019-10-07 12:24:25 +02:00
Max Kellermann
b9b906ab20 increment version number to 0.21.16 2019-10-07 12:24:25 +02:00
Max Kellermann
964804a4c2 release v0.21.15 2019-09-25 21:24:15 +02:00
Max Kellermann
92495d2b0b decoder/mpcdec: fix bogus ReplayGain values
Apparently, libmpcdec sets gain/peak variables to zero if they are not
present.  This clashes with our formula and results in bogus values
which cause noise during playback.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/640
2019-09-13 19:52:11 +02:00
Max Kellermann
9270829b5b ReplayGainInfo: move more code to a function 2019-09-13 19:50:49 +02:00
Max Kellermann
b6243a9945 decoder/mpcdec: merge duplicate code 2019-09-13 19:50:43 +02:00
Max Kellermann
496f88653d ReplayGainInfo: add static method Undefined() 2019-09-13 19:46:39 +02:00
Max Kellermann
5ef645df97 NEWS: add missing line for 818b7e0641 2019-09-08 12:54:16 +02:00
Max Kellermann
bf49c9e4e2 decoder/{dsf,dsdiff}: precalculate bit rate 2019-09-08 12:52:02 +02:00
Max Kellermann
0da9c91af2 decoder/{dsf,dsdiff}: fix displayed bit rate
The formula did not consider the channel count.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/639
2019-09-08 12:45:05 +02:00
Max Kellermann
193e637dd9 python/build/libs: update Boost to 1.71.0 2019-09-01 13:03:50 +02:00
Max Kellermann
928bee933d python/build/libs: update expat to 2.2.7 2019-09-01 13:02:56 +02:00
Max Kellermann
4d1720c886 python/build/libs: update CURL to 7.65.3 2019-09-01 13:02:04 +02:00
Max Kellermann
8f8ed87327 python/build/libs: update FFmpeg to 4.2 2019-09-01 13:00:26 +02:00
Max Kellermann
28a441c977 python/build/libs: update Opus to 1.3.1 2019-09-01 12:59:17 +02:00
Max Kellermann
8cf50b08f2 python/build/libs: update libogg to 1.3.4 2019-09-01 12:58:26 +02:00
Max Kellermann
818b7e0641 output/solaris: include sys/stropts.h only on Solaris
This header had been available for a long time on Linux, but was
removed in glibc 2.30.  This commit moves the `#include` line inside
the `#ifdef __sun` block and adds a fake declaration of `I_FLUSH` for
the Linux build.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/630
2019-08-22 11:41:12 +02:00
Max Kellermann
e70f40fac1 increment version number to 0.21.15 2019-08-22 11:40:17 +02:00
Max Kellermann
bc89ca92b4 release v0.21.14 2019-08-21 10:47:53 +02:00
Max Kellermann
b968e1b6de output/Thread: add missing return in exception handler 2019-08-21 10:20:17 +02:00
Max Kellermann
6c9f9c136b command/all: don't create new Response instance in exception handler
The new Response instance in the `catch` block didn't have the
`command` attribute set, so the error response didn't indicate which
command had failed, which however is required in the MPD protocol.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/628
2019-08-20 20:31:36 +02:00
Max Kellermann
9bff5f9e36 client/Process, command/all: add noexcept
Clarify that those can't throw, preparing for the next commit.
2019-08-20 20:28:15 +02:00
Max Kellermann
2bf26a2ff8 command/all: remove obsolete prototype 2019-08-20 20:28:10 +02:00
Max Kellermann
e33b50d9c5 command/all: simplify return from command_process() 2019-08-20 20:26:07 +02:00
Max Kellermann
21fa44c0d5 command/all: catch all exceptions 2019-08-20 20:23:54 +02:00
Max Kellermann
44444e1b89 decoder/Thread: on late SEEK, start decoder at seek position
Previously, a bogus value (whatever happened to be still in
`start_time`) was used.
2019-08-20 20:15:08 +02:00
Max Kellermann
ca450663d0 decoder/Control: work around crash after SEEK was too late
See code comment.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/629
2019-08-20 20:01:53 +02:00
Max Kellermann
f3d16f6d1b output/Thread: fix typo in comment 2019-08-13 13:08:40 +02:00
Max Kellermann
4464cdcc67 doc/protocol.rst: add missing newline to "albumart" example
This was missing in commit 0f488dcecf
2019-08-12 20:20:17 +02:00
Fredrik Noring
2d61e526de decoder/sidplay: Fix date field to have year but not company or author
Field 2 is called <released>, formerly used as <copyright>[1][2]. It is
formatted <year><space><company or author or group>, where <year> may be
<YYYY>, <YYY?>, <YY??> or <YYYY-YY>, for example "1987", "199?", "19??"
or "1985-87". The <company or author or group> may be for example Rob
Hubbard. A full field may be for example "1987 Rob Hubbard".

This change splits the <released> field at the first <space>, to retain
the <year> part.

The 51823 SID files in High Voltage SID Collection (HVSC) version 71
have the following distribution of dates:

    333 19??         11 1990-92       6 1995-99       2 2006-08
    827 198?         88 1990-93    2140 1996        530 2007
     32 1982         69 1990-94       9 1996-97      15 2007-08
      1 1982-83      49 1990-95       2 1996-98       2 2007-09
    255 1983       3467 1991          5 1996-99       1 2007-10
    677 1984         75 1991-92    1840 1997        430 2008
    775 1985         65 1991-93       4 1997-98      23 2008-09
      3 1985-86      10 1991-94    1276 1998          1 2008-12
     10 1985-87      35 1991-97       4 1998-99     631 2009
    943 1986       3320 1992        865 1999          1 2009-10
     12 1986-87      26 1992-93      24 200?        645 2010
      5 1986-89      59 1992-94     590 2000          1 2010-12
   2083 1987          1 1992-96       4 2000-01     538 2011
     31 1987-88    2996 1993        727 2001          1 2011-12
     44 1987-89      42 1993-94     875 2002        651 2012
   2510 1988         12 1993-95       2 2002-04     811 2013
    129 1988-89       2 1993-97     844 2003        790 2014
     91 1988-90    2737 1994          3 2003-05     740 2015
     58 1988-91      16 1994-95     842 2004        792 2016
   3466 1989         20 1994-96       2 2004-05     775 2017
     95 1989-90      17 1994-97     707 2005        638 2018
    150 1989-91    2271 1995          1 2005-06     284 2019
   1077 199?          2 1995-96       2 2005-07
   2834 1990          4 1995-97     785 2006
    119 1990-91       2 1995-98       6 2006-07

References:

[1] https://www.hvsc.c64.org/download/C64Music/DOCUMENTS/SID_file_format.txt
[2] https://hvsc.c64.org/info
2019-08-10 10:50:51 +02:00
Fredrik Noring
7723c481db decoder/sidplay: Fix windows-1252 to utf-8 string conversion
High Voltage SID Collection (HVSC) metadata fields are encoded in
windows-1252, as described in DOCUMENTS/SID_file_format.txt:

https://www.hvsc.c64.org/download/C64Music/DOCUMENTS/SID_file_format.txt

If utf-8 transcoding fails, or the ICU library is unavailable, fall
back to plain ASCII and replace other characters with '?'.
2019-08-10 10:45:02 +02:00
Fredrik Noring
0ed10542cc decoder/sidplay: Fix song length initialisation during container scan
The song length was previously undetermined.
2019-08-09 15:39:36 +02:00
Max Kellermann
ab830f9afd increment version number to 0.21.14 2019-08-09 15:38:01 +02:00
Max Kellermann
d4d2bc072e release v0.21.13 2019-08-06 11:35:42 +02:00
Max Kellermann
bcccc8f66c output/jack: use jack_free() for Windows compatibility 2019-08-06 11:34:56 +02:00
Max Kellermann
848c63e2d5 output/jack: use std::atomic_bool for "shutdown" and "pause"
Without this, the compiler may optimize accesses away.
2019-08-06 11:34:00 +02:00
Max Kellermann
f6d0310f9c output/jack: use SIZE_MAX instead of (size_t)-1 2019-08-06 11:33:52 +02:00
Max Kellermann
3ef043392c input/cdio_paranoia: drop support for libcdio-paranoia older than 10.2+0.93+1
Version 10.2+0.93+1 was released five years ago in 2014 and is the
first version to feature cdio_cddap_free_messages().  There is no way
to check the libcdio-paranoia version at compile time, so let's just
remove support for older versions instead of attempting to fix the
cdio_cddap_free_messages() check at build time.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/613
2019-08-06 11:09:36 +02:00
Max Kellermann
864d6f312d Revert "decoder/mad: use MAD_F_MIN and MAD_F_MAX"
This reverts commit f7ed7446ae.  It was
a bad idea, because MAD_F_MIN and MAD_F_MAX do not represent the
clamping limits, but the theoretical minimum and maximum values of the
mad_fixed_t data type.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/617
2019-08-05 13:07:41 +02:00
Max Kellermann
f44c67de09 increment version number to 0.21.13 2019-08-05 13:05:54 +02:00
Max Kellermann
ae19bda1f2 release v0.21.12 2019-08-03 12:48:20 +02:00
Max Kellermann
f2d8fd769d player/Thread: don't restart unseekable song after failed seek attempt
The check IsSeekableCurrentSong() was added by commit
44b200240f in version 0.20.19, but it
caused a regression: by doing the branch only if the current song is
seekable, the player would restart the current song if it was not
seekable, and later the initial seek would fail; but we already know
it's not seekable, and so we should fail early.
2019-08-03 12:30:10 +02:00
Max Kellermann
9661062ae2 decoder/mad: pass const reference to RecoverFrameError() 2019-08-03 11:59:41 +02:00
Max Kellermann
2a07354cad decoder/mad: change integers to size_t 2019-08-03 11:44:02 +02:00
Max Kellermann
fc18fd571c decoder/mad: return from SynthAndSubmit() early 2019-08-03 11:42:05 +02:00
Max Kellermann
51abed9732 decoder/mad: pass mad_pcm to mad_fixed_to_24_buffer() 2019-08-03 11:40:06 +02:00
Max Kellermann
d00afc912c decoder/mad: eliminate the loop in SubmitPCM()
libmad has a hard-coded maximum PCM buffer size; if we make our
output_buffer just as large, we can avoid the loop, because any
possible size will fit.
2019-08-03 11:36:05 +02:00
Max Kellermann
9d0fe725eb decoder/mad: rename a few misnamed methods 2019-08-03 11:32:42 +02:00
Max Kellermann
8a432c9b7f decoder/mad: move code to LoadNextFrame() 2019-08-03 11:32:06 +02:00
Max Kellermann
187204f03c decoder/mad: move code to HandleCurrentFrame() 2019-08-03 11:32:06 +02:00
Max Kellermann
5e5fadb5f2 decoder/mad: remove unnecessary initializers
These will not be used until they are initialized in SyncAndSend().
2019-08-03 08:49:26 +02:00
Max Kellermann
952c793235 decoder/mad: subtract libmad decoder delay from LAME encoder padding
Apparently, libmad not only inserts 529 samples of silence at the
beginning of the file, but also removes them at the end.

This solves the last piece of
https://github.com/MusicPlayerDaemon/MPD/issues/601

Closes https://github.com/MusicPlayerDaemon/MPD/issues/601
2019-08-03 08:35:00 +02:00
Max Kellermann
3e3d8c7f9d decoder/mad: pad the input buffer with zero bytes and end of file
libmad requires padding the input buffer with "MAD_BUFFER_GUARD" zero
bytes at the end of the file, or else it is unable to decode the last
frame.

This fixes yet another bug which prevented this plugin from decoding
the last frame, see
https://github.com/MusicPlayerDaemon/MPD/issues/601
2019-08-03 08:32:27 +02:00
Max Kellermann
9b99a9897a decoder/mad: don't count the Xing/LAME metadata frame
The Xing/LAME frame indicates how many frames there are, but that
excludes the initial Xing/LAME frame.  Therefore, it should not be
counted.

This fixes an off-by-one bug which caused the last frame to be
skipped, fixing one part of
https://github.com/MusicPlayerDaemon/MPD/issues/601
2019-08-03 08:25:48 +02:00
Max Kellermann
4f56fdc397 decoder/mad: make "current_frame" zero-based
Increment "current_frame" after processing the frame.
2019-08-03 08:24:25 +02:00
Max Kellermann
c87d6825ec decoder/mad: add API documentation 2019-08-03 08:07:30 +02:00
Max Kellermann
00830a20e3 decoder/mad: convert to class, make almost everything private 2019-08-03 07:52:51 +02:00
Max Kellermann
d39d2874b4 decoder/mad: move code to methods RunDecoder(), RunScan() 2019-08-03 07:49:41 +02:00
Max Kellermann
a0a74951b8 decoder/mad: eliminate attribute "bit_rate"
This also fixes a bug which caused the bit rate to not update after
seeking.
2019-08-03 00:38:45 +02:00
Max Kellermann
779a6855ff decoder/mad: add noexcept 2019-08-03 00:28:59 +02:00
Max Kellermann
f7ed7446ae decoder/mad: use MAD_F_MIN and MAD_F_MAX 2019-08-03 00:27:59 +02:00
Max Kellermann
9d44a6d2ae decoder/mad: use Clamp() 2019-08-03 00:26:57 +02:00
Max Kellermann
10da9ee7ba decoder/mad: refactor local variables in FillBuffer() 2019-08-02 23:19:11 +02:00
Max Kellermann
f9eff31205 decoder/mad: use sizeof(input_buffer) 2019-08-02 23:19:11 +02:00
Max Kellermann
1d74a029a2 decoder/mad: simplify variable initialization in FillBuffer() 2019-08-02 23:19:11 +02:00
Max Kellermann
6b8ca514bb decoder/mad: fix broken log message
Broken since commit f8bfea8bae
2019-08-02 22:58:16 +02:00
Max Kellermann
f51e555154 decoder/mad: change "mp3_" suffix to "mad_" 2019-08-02 22:49:55 +02:00
Max Kellermann
61a3c69a06 decoder/mad: make enums strictly-typed 2019-08-02 22:49:55 +02:00
Max Kellermann
089615a01e decoder/mad: include cleanup 2019-08-02 22:49:55 +02:00
Max Kellermann
52bee8f81f util/StaticFifoBuffer: add GetAvailable() 2019-08-02 22:49:55 +02:00
Max Kellermann
adc25e648f util/StaticFifoBuffer: add constexpr 2019-08-02 22:49:33 +02:00
Max Kellermann
31da8eac9b util/StaticFifoBuffer: add noexcept 2019-08-02 22:49:05 +02:00
Max Kellermann
e00464435b util/Compiler.h: move compiler version checks to meson.build 2019-08-02 15:53:16 +02:00
Diomendius
b81138bda1 Fix JACK plugin outputting only to left channel
The JACK output plugin would not correctly upmix mono input files when exactly 2 output ports were configured. This fixes that.
2019-08-02 15:52:20 +02:00
Max Kellermann
6de088140b lib/xiph/OggVisitor: invoke OnOggPacket() with the "E_O_S" packet
The "end of stream" packet is not special; it contains normal data,
and thus we should pass it to OnOggPacket().

This fixes one part of https://github.com/MusicPlayerDaemon/MPD/issues/601
2019-08-02 14:04:08 +02:00
Max Kellermann
86d0534638 lib/xiph/OggVisitor: more API documentation 2019-08-02 13:56:00 +02:00
Max Kellermann
1033dbca2b playlist/Song: add missing includes 2019-07-29 11:31:30 +02:00
Max Kellermann
b955334882 decoder/opus: ignore case in replay gain tag names
Closes https://github.com/MusicPlayerDaemon/MPD/issues/604
2019-07-29 10:40:37 +02:00
Max Kellermann
90ea3bf985 playlist/Song: support backslash in relative URIs
Closes https://github.com/MusicPlayerDaemon/MPD/issues/607
2019-07-29 09:58:53 +02:00
Max Kellermann
83b0871248 test/test_translate_song: remove unused variable "s1" 2019-07-29 09:52:57 +02:00
Max Kellermann
d8aec4b2dc test/run_decoder: catch StopDecoder
This exception is usually thrown by class DecoderBridge, but the Opus
plugin (ab)uses it as well, so we need to catch it.
2019-07-12 17:49:12 +02:00
Max Kellermann
39b302dcad increment version number to 0.21.12 2019-07-12 17:22:20 +02:00
Max Kellermann
f6125f0c35 release v0.21.11 2019-07-03 15:16:27 +02:00
Max Kellermann
f780ac418a output/alsa: log when generating silence due to slow decoder
MPD used to do that when this code lived in the player thread, but it
was removed by commit 98a7c62d7a4f716d90af6d78e18d1a3b10bc54b3; and
the replacement code in the ALSA output plugin didn't have it.
2019-06-28 18:15:30 +02:00
Max Kellermann
61a72a5d13 output/alsa: schedule a timer to generate silence
Without this timer, DispatchSockets() may disable the
MultiSocketMonitor and if Play() doesn't get called soon, it never
gets a chance to generate silence.  However if Play() gets called,
generating silence isn't necessary anymore...

Resulting from this misdesign (added by commit ccafe3f3cf in 0.21.3),
the silence generator didn't work reliably.
2019-06-28 18:04:49 +02:00
Max Kellermann
0c0a354753 output/alsa: add a new flag "waiting" for xrun management
In DispatchSockets(), when there was not enough data, but enough for
current playback, the method would disable the "active" flag so the
next Play() call would re-enable the MultiSocketMonitor.

This was an abuse of the flag which could result in a crash
in Cancel(), because that method asserts that the period_buffer is
empty, which it may be not.

The solution is to add anther flag called "waiting" which shares some
behavior with the old flag.
2019-06-28 18:04:49 +02:00
Max Kellermann
3c5f860fb8 output/alsa: Cancel() also affects "active" (documentation) 2019-06-28 18:04:49 +02:00
Max Kellermann
3da1fa88d0 output/alsa: fix comment typo 2019-06-28 18:04:49 +02:00
Max Kellermann
fac15aaffb output/alsa: fix comment typo 2019-06-28 14:39:54 +02:00
Max Kellermann
c926021599 output/alsa: always redo DrainInternal() after writing
Draining isn't finished just because the period_buffer has run empty.
It is only finished after snd_pcm_drain() has succeeded.
2019-06-28 09:10:16 +02:00
Max Kellermann
543776d9c9 output/alsa: check PCM state before calling snd_pcm_drain()
Apparently, if snd_pcm_drain() returns EAGAIN, it does not actually
want to be called again; the next call will snd_pcm_drain() will also
return EAGAIN, forever, even though the PCM state has meanwhile
switched to SND_PCM_STATE_SETUP.  This causes a busy loop; to fix
this, we should always check snd_pcm_state() to see if draining is
really required.
2019-06-28 08:55:25 +02:00
Max Kellermann
8bf3f9b874 input/tidal: deprecated because Tidal has changed the protocol
See https://github.com/MusicPlayerDaemon/MPD/issues/545
2019-06-26 23:14:07 +02:00
Max Kellermann
f07f8f7d88 decoder/wildmidi: add fallbacks for libwildmidi<0.4
Fix build breakage from commit ea639269d8
2019-06-26 23:13:23 +02:00
Max Kellermann
39b40ac1fd decoder/wildmidi: remove unused variable wildmidi_domain 2019-06-26 23:10:20 +02:00
Max Kellermann
ea639269d8 decoder/wildmidi: throw PluginUnavailable on WildMidi_Init() error
Closes https://github.com/MusicPlayerDaemon/MPD/issues/589
2019-06-26 22:40:27 +02:00
Max Kellermann
0abaa3ecc5 decoder/wildmidi: throw PluginUnavailable if config file does not exist
This makes the configuration error more visible, possibly addressing
one part of https://github.com/MusicPlayerDaemon/MPD/issues/589
2019-06-26 22:38:40 +02:00
Max Kellermann
c4d3efe71d decoder/List: handle exception PluginUnavailable 2019-06-26 22:02:54 +02:00
Max Kellermann
85e82e3d4d decoder/List: annotate exceptions thrown by DecoderPlugin::Init() 2019-06-26 22:01:45 +02:00
Max Kellermann
f44011519c meson.build: increase protocol version to 0.21.11
Commit 1eae9339f2 added support for
multiple "groups" in the "list" command, and this change allows
clients to detect that this behavior, which had been documented for
several years, is now implemented properly.
2019-06-18 15:35:38 +02:00
Max Kellermann
2c3eeb7194 MusicChunk: pad MusicChunkInfo to a multiple of 8 bytes
Workaround for a regression caused by commit
a06bf388d9, revealing a problem with
discarding odd numer of frames in the DSD_U32 and DoP converters,
causing distortions with DSD_U32 and DoP on 32 bit CPUs.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/469
2019-06-17 21:24:32 +02:00
Max Kellermann
79839db3a3 output/oss: return early if PcmExport::Export() returns empty array
This can happen if the DoP converter doesn't get enough source samples
for one destination quad.  This isn't a critical bug, because the OSS
plugin doesn't support DoP yet, but it's good to be prepared.
2019-06-17 21:07:30 +02:00
Max Kellermann
d478bdda8e pcm/Export: document that Export() may return an empty buffer 2019-06-17 21:07:29 +02:00
Max Kellermann
1eae9339f2 db/Interface: CollectUniqueTags() allows multiple "groups"
Instead of passing tag and group, pass an array of tags.  To support a
nested return value, return a nested std::map of std::maps.  Each key
specifies the tag value, and each value may be another nesting level.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/408
2019-06-16 10:39:29 +02:00
Max Kellermann
923c1b6220 doc/include: remove obsolete DocBook fragment 2019-06-11 09:29:20 +02:00
Max Kellermann
09884e608b increment version number to 0.21.11 2019-06-11 09:29:05 +02:00
Max Kellermann
e239009295 release v0.21.10 2019-06-05 22:32:32 +02:00
Max Kellermann
3fae2150f5 decoder/OpusReader: return StringView
Since we now don't duplicate all items, we can easily remove the 64kB
limit from OpusReader::ReadString() and instead silently ignore and
skip all strings which are longer than 4 kB.

This fixes a tag duplication bug with Opus file containing a very long
`METADATA_BLOCK_PICTURE` tag, which occurred because the Opus plugin
returned false after parsing all tags, and then the MPD core fell back
to FFmpeg which scanned the tags again.
2019-06-05 22:19:35 +02:00
cathugger
f9ca2f52c1 output/httpd: reject some well-known request paths
Return `404 not found` for some common well-known paths, as clients requesting them usually do that automatically and don't expect endless audio stram.

Closes #572
2019-06-05 21:53:46 +02:00
cathugger
4b81cf0c2c output/httpd: use strncmp instead of memcmp
memcmp use may result in out of bounds access
2019-06-05 21:53:46 +02:00
Max Kellermann
e7acbf112c output/httpd: fix indent 2019-06-05 21:53:43 +02:00
Max Kellermann
304d45b551 Revert "player/Thread: remove unnecessary "pipe" check"
This reverts commit ff3e2c0514.  The
check was necessary, after all, because this is what checked whether
the decoder had finished the current or the next song.

> The "queued" flag can only possibly be set if the decoder is still
> decoding the current song or if the decoder is stopped.

That was wrong because ProcessCommand() sets `queued=true` and also
starts the decoder (if it was idle).

> This is also what the following assert() checks.

That was also wrong, because the assert() has two conditions.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/566
2019-05-31 17:23:12 +02:00
Max Kellermann
0f488dcecf doc/protocol.rst: binary responses do have a newline after all
Closes https://github.com/MusicPlayerDaemon/MPD/issues/568
2019-05-31 16:47:41 +02:00
Max Kellermann
17039aec70 doc/user.rst: more heading corrections
According to http://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html#sections
2019-05-31 16:30:06 +02:00
Max Kellermann
fb6cb07912 doc/developer.rst: remove outdated section about the clang static analyzer 2019-05-31 16:27:43 +02:00
Max Kellermann
e9e0e02db3 doc/user.rst: use ".. note:" 2019-05-31 16:26:52 +02:00
Max Kellermann
03507037e8 increment version number to 0.21.10 2019-05-31 16:16:56 +02:00
Max Kellermann
66a8fac25e release v0.21.9 2019-05-20 17:10:58 +02:00
Max Kellermann
1b902e00b4 doc/protocol.rst: several clarifications
Closes https://github.com/MusicPlayerDaemon/MPD/issues/340
2019-05-20 17:06:20 +02:00
Max Kellermann
923e66738c player/Thread: fix "single" mode race condition
If the decoder finishes decoding the current song between the two
IsIdle() checks, MPD stops playback instead of starting the decoder
for the next song.

This is usually not visible problem, because the main thread restarts
it via playlist::ResumePlayback(), but that way it, ignores "single"
mode.

As a workaround, this commit adds another "queued" check which
re-enters the player loop and checks again whether to start the
decoder.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/556
2019-05-20 16:22:01 +02:00
Max Kellermann
ff3e2c0514 player/Thread: remove unnecessary "pipe" check
The "queued" flag can only possibly be set if the decoder is still
decoding the current song or if the decoder is stopped.  This is also
what the following assert() checks.  This check was not necessary.
2019-05-20 16:20:59 +02:00
Max Kellermann
6922a2f55e input/buffered: check error in IsAvailable() 2019-05-17 12:43:45 +02:00
Max Kellermann
ca5a400dbe input/buffered: rethrow read_error in Check() 2019-05-16 22:08:33 +02:00
Max Kellermann
63fe4d1d17 input/buffered: wake up client thread on seek error 2019-05-16 22:05:25 +02:00
Max Kellermann
ca06d9d3bf input/buffered: fix deadlock bug 2019-05-16 21:11:03 +02:00
Max Kellermann
ed2db04f43 doc/mpd.conf.5: remove ALSA specific documentation
ALSA is just one out of many output plugins, and detailed plugin
documentation should only live in the user manual, without having
duplicates in the (brief) manpage.

Also move "mixer_type" to the "optional audio output parameters"
section; it is a generic option, not specific to ALSA.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/552
2019-05-13 22:51:48 +02:00
Max Kellermann
de0afa0e08 doc/mpd.conf.5: fix section indent 2019-05-13 22:51:45 +02:00
Max Kellermann
f0d3227d7b doc/protocol.rst: add references to audio_output_format 2019-05-13 22:46:23 +02:00
Max Kellermann
fb07a7cecc doc/user.rst: move audio format spec to section "Global Audio Format" 2019-05-13 22:39:49 +02:00
Max Kellermann
c6b08a4d48 doc/user.rst: add reference to audio_output_format 2019-05-13 22:39:44 +02:00
Max Kellermann
040e87ad8d doc/user.rst: more markup 2019-05-13 22:36:19 +02:00
Max Kellermann
d5521ead56 doc/user.rst: add missing space 2019-05-13 22:36:19 +02:00
Max Kellermann
f8468451c9 android/AndroidManifest.xml: increment versionCode after hotfix upload 2019-05-04 13:25:05 +02:00
Max Kellermann
65df6ca14e android/Settings: request READ_EXTERNAL_STORAGE permission
Using this API function requires SDK level 23.
2019-05-04 07:29:41 +02:00
Max Kellermann
36dec47bf7 android/build.py: link ARMv7 binary with libunwind
Fixes nullptr dereference when an exception gets thrown because there
is no ".eh_frame" section for unwinding.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/543
2019-05-03 20:15:50 +02:00
Max Kellermann
478cedcadf increment version number to 0.21.9 2019-05-03 20:15:33 +02:00
Max Kellermann
cabcbb059d release v0.21.8 2019-04-23 14:35:14 +02:00
Max Kellermann
5e21b2db3c doc/protocol.rst: "list file" is deprecated
Closes https://github.com/MusicPlayerDaemon/MPD/issues/526
2019-04-23 14:29:42 +02:00
Max Kellermann
3a0d6d96c1 input/smbclient: wrap in MaybeBufferedInputStream
This enables the input buffer for remote files and caches file
contents in MPD.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/376
2019-04-23 14:08:27 +02:00
Max Kellermann
f39d2d33c0 python/build/libs.py: upgrade Boost to 1.70.0 2019-04-23 14:08:27 +02:00
Max Kellermann
ead3dc6a92 LocateUri: pass URI plugin kind, optionally disables plugin verify
Commit b3a458338a added a LocateUri()
call to several playlist commands, which applied InputPlugin URI
scheme verification to playlist URIs.  This broke the SoundCloud
playlist plugin which uses "soundcloud://" URIs for which no input
plugin exists.

This commit allows the caller to specify the kind of plugin which
shall be used to verify the URI.  Right now, only "input" is
implemented; "storage" uses the "input" verification for now; and
"playlist" has no verification at all (for now).

Closes https://github.com/MusicPlayerDaemon/MPD/issues/528
2019-04-18 10:03:15 +02:00
Max Kellermann
7d814cc899 neighbor/smbclient: fix double smbc_closedir() call
There is already one call in ReadServers(), which is the correct place
to do it.
2019-04-18 09:40:56 +02:00
Max Kellermann
f5b4606c09 .travis.yml: switch to another PPA for a newer ninja version
Fixes Travis failure with Meson 0.50:

 ERROR: Could not detect Ninja v1.5 or newer
2019-04-18 09:40:30 +02:00
Max Kellermann
d6dbf64efb CommandLine: fix another build failure with -Ddatabase=false
Split several printf() calls to make it easier to deal with all those
#ifdefs.
2019-04-18 09:20:12 +02:00
Eugene Gorodinsky
8d18b4c24b Fix meson.build to work properly with '-Ddatabase=false' 2019-04-18 08:55:13 +02:00
Max Kellermann
fe8621906d systemd: add user socket unit
Copy the system socket unit to the "user" directory.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/530
2019-04-10 16:37:13 +02:00
Max Kellermann
b4fcbdb235 systemd/socket: use %t instead of hard-coding /run
This allows using the file as a user unit, where "%t" maps to
"$XDG_RUNTIME_DIR".

Proposed in https://github.com/MusicPlayerDaemon/MPD/issues/530
2019-04-10 16:34:40 +02:00
Max Kellermann
f4b5a28596 doc/protocol: mention that stickers are only implemented for songs
Closes https://github.com/MusicPlayerDaemon/MPD/issues/524
2019-04-10 16:33:17 +02:00
Max Kellermann
6cbd77fc57 doc/protocol.rst: mention "in seconds" where it was missing
Closes https://github.com/MusicPlayerDaemon/MPD/issues/523
2019-04-10 16:30:26 +02:00
cotko
1bc78e9f2c Fid move doc args 2019-04-10 13:16:58 +02:00
Max Kellermann
cb6282e0a7 doc/developer.rst: remove mailing list, refer to GitHub instead 2019-04-10 11:36:03 +02:00
Max Kellermann
f6941f9a44 event/SocketMonitor: don't cancel if OnSocketReady() returns false
Expect OnSocketReady() to cancel events.  If it returns false, the
SocketMonitor may be destructed already.  This fixes a use-after-free
bug in the "httpd" output plugin.
2019-04-04 10:24:58 +02:00
Max Kellermann
d2eb4df8fc event/{Fully,}BufferedSocket: add more API documentation 2019-04-04 10:24:58 +02:00
Max Kellermann
df33a898d7 zeroconf/Bonjour: fix OnSocketReady() return value
Keep the SocketMonitor registered.  This wrong return value was added
6 years ago in commit 72cf8dd8a0, andd
apparently, nobody ever noticed.
2019-04-04 10:24:29 +02:00
Max Kellermann
325c7b8e8b output/httpd: close client connection on error
This missing piece probably never really hurt, because
HttpdClient::OnSocketClosed() would be called right after a socket
error, but it's better to be explicit about closing on error.
2019-04-04 09:39:22 +02:00
Max Kellermann
380656d8c9 output/httpd: add missing mutex lock 2019-04-03 22:53:03 +02:00
Max Kellermann
9111bc2c21 output/httpd: add more API documentation about locking 2019-04-03 22:49:25 +02:00
Max Kellermann
37b54179d8 net/IPv[46]Address: add cast to void* to fix GCC9 build failure
Fixes:

 src/net/IPv4Address.hxx: In member function 'constexpr IPv4Address::operator SocketAddress() const':
 src/net/IPv4Address.hxx:171:24: error: a reinterpret_cast is not a constant expression
   171 |   return SocketAddress((const struct sockaddr *)&address,
       |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 src/net/IPv6Address.hxx: In member function 'constexpr IPv6Address::operator SocketAddress() const':
 src/net/IPv6Address.hxx:138:24: error: a reinterpret_cast is not a constant expression
   138 |   return SocketAddress((const struct sockaddr *)&address,
       |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Closes https://github.com/MusicPlayerDaemon/MPD/issues/522
2019-04-03 16:59:53 +02:00
Max Kellermann
511826763a increment version number to 0.21.8 2019-04-03 12:27:18 +02:00
Max Kellermann
ef10354d06 release v0.21.7 2019-04-03 12:18:29 +02:00
Max Kellermann
158458db5f python/build/libs.py: upgrade libnfs to 4.0.0 2019-04-03 11:37:33 +02:00
Max Kellermann
e183ab5cf8 python/build/libs.py: upgrade CURL to 7.64.1 2019-04-03 11:35:13 +02:00
Max Kellermann
fef839e2a9 python/build/libs.py: upgrade FFmpeg to 4.1.3 2019-04-03 11:34:32 +02:00
Max Kellermann
9776e43bbe android/AndroidManifest.xml: update version number 2019-04-03 11:28:59 +02:00
Max Kellermann
5201147ab1 input/curl: use std::throw_with_nested() instead of logging the exception
Let the caller decide what to do with the original exception.
2019-03-29 17:34:51 +01:00
Max Kellermann
fb7daa0d05 input/smbclient: use std::throw_with_nested() to construct PluginUnavailable
Preserve the original exception.
2019-03-29 17:32:23 +01:00
Max Kellermann
2e9f3d8b9f decoder/HybridDSD: downgrade log message to "debug"
This plugin is interesting only for a tiny fraction of MPD users, so
let's not spam everybody else's log with it.
2019-03-29 17:15:48 +01:00
Max Kellermann
976731ab6c command/playlist: invoke the RemoteTagScanner on all newly added songs
Closes https://github.com/MusicPlayerDaemon/MPD/issues/234
2019-03-29 17:01:31 +01:00
François Revol
0d8942e64a Haiku: remove redundant calls to delete_sem()
Fixes #184.

Semaphores are kernel-managed objects, calling delete_sem() twice is not more
dangerous than calling close() twice on an fd though, it would just return
an error.
2019-03-29 14:33:49 +01:00
François Revol
37a0f04712 Haiku: add version info to the resources like win32 does 2019-03-29 14:33:27 +01:00
François Revol
cde9348009 Haiku: fix adding resources
The custom_command was run in src/haiku/ and created a file with only resources inside.

Since xres edits the file in-place and meson doesn't like it, we have to run a shell script for now.
Maybe later I'll add proper support in meson.
2019-03-29 14:32:59 +01:00
François Revol
095e6e6ad4 Haiku: meson.build: fix linking (missing libs) 2019-03-29 14:32:19 +01:00
François Revol
9d0bf5e95c Haiku: fix build 2019-03-29 14:32:06 +01:00
Max Kellermann
8b327f1d9b filter/AutoConvert: implement Flush() 2019-03-24 22:42:06 +01:00
Max Kellermann
aef0507abb filter/Filter: fix typo in API doc 2019-03-24 22:34:11 +01:00
Max Kellermann
6bab3bcfea test/RunChromaprint: add missing override 2019-03-20 13:30:13 +01:00
Max Kellermann
a854595886 event/ServerSocket: runtime error if abstract sockets are unavailable 2019-03-20 13:09:16 +01:00
Max Kellermann
8fc3c5c612 event/ServerSocket: add HAVE_UN check to AddAbstract()
Closes https://github.com/MusicPlayerDaemon/MPD/issues/510
2019-03-20 13:06:09 +01:00
Max Kellermann
4f408bd952 event/ServerSocket, doc, ...: refer to AF_LOCAL as "local socket"
.. and not "UNIX domain socket.  Be consistent about the naming.
2019-03-20 12:57:26 +01:00
Max Kellermann
7de8fd04a4 doc/plugins.rst: add the Haiku plugin and mark it as unmaintained 2019-03-18 18:24:51 +01:00
Max Kellermann
8158bd218c doc/plugins.rst: add filter plugin reference 2019-03-18 18:05:18 +01:00
Max Kellermann
aa1d867b72 doc/user.rst: document the "filters" setting 2019-03-18 17:05:23 +01:00
Max Kellermann
34c8242133 doc/user.rst: add more links 2019-03-18 17:01:55 +01:00
Max Kellermann
e22bdee808 win32/res/meson.build: drop tilde suffix from version number before splitting
MPD sometimes uses version numbers like "0.22~git" to mark unreleased
versions.  That makes the win32 resource compiler unhappy, because it
expects numbers only.
2019-03-18 09:58:40 +01:00
Jörg Krause
7f87de783f src/lib/gcrypt/meson.build: use dependency() for quering linker flags
Since version 0.49.0 the Meson build system has native support for
finding and using the gcrypt library using the `dependency()` function.

`dependency()` has the advantage over `find_library()` as it queries the
required linker flags for proper linking with external libraries, e.g.
libgpg-error.

As the latest released version 1.8.4 of libgcrypt does not
provide a .pc file, using `libgcrypt-config` is the only way to query
the required linker flags.

Unfortunately, there is an issue when cross compiling mpd and the user does not
define `libgcrypt-config` in the cross file. If the user sets the qobuz feature
to `auto` and the target does not have libgcrypt installed, the Meson
build system will falsly assume libgcrypt is available for the target as
it uses the native `libgcrypt-config` on the host and pretend is has
found the library.

Therefore, we still rely on `find_library()` to workaround this buggy
behavior. This way, if qobuz feature detection is set to `auto`, the
feature is disabled in case there is no target libgcrypt available.

Fixes building mpd statically with the qobuz feature enabled. Otherwise
the build fails with undefined references because of the missing libgpg-error
dependency:

```
/sysroot/usr/lib/libgcrypt.a(libgcrypt_la-visibility.o): In function `gcry_strerror':
visibility.c:(.text+0x14): undefined reference to `gpg_strerror'
```
2019-03-18 09:12:19 +01:00
Jörg Krause
c66389a453 meson.build: require Meson 0.49.0
Meson 0.49.0 adds native support for `libgcrypt-config` which is
necessary for detecting libgcrypt dependencies, as the latest
version 1.8.4 of libgcrypt does not provide a .pc file.
2019-03-18 09:11:46 +01:00
Max Kellermann
b63c1a2144 increment version number to 0.21.7 2019-03-18 09:11:16 +01:00
Max Kellermann
808dd7cc54 release v0.21.6 2019-03-17 23:52:13 +01:00
Max Kellermann
62a129c18f PlaylistFile: ignore empty playlist names
Closes https://github.com/MusicPlayerDaemon/MPD/issues/465 and
https://github.com/MusicPlayerDaemon/MPD/pull/466
2019-03-17 23:46:36 +01:00
Max Kellermann
c18cd941aa lib/xiph: disable Tremor detection if libvorbis was found
And disable libvorbis detection if Tremor was explicitly enabled.

This fixes a crash bug caused by libvorbis/Tremor ABI conflict caused
by commit 4f7d52dbf2
2019-03-17 23:36:52 +01:00
Max Kellermann
6d12c22653 decoder/ogg: ignore the BOS packet after seek to the beginning of song
Previously, MPD would skip the current song after attempting to seek
to its beginnig, because that was a seek to offset 0.  At offset 0,
MPD will see the BOS packet again, which results in throwing
StopDecoder in MPDOpusDecoder::OnOggEnd().

Closes https://github.com/MusicPlayerDaemon/MPD/issues/470
2019-03-17 23:14:59 +01:00
Max Kellermann
b76d78e6ae output/sles: enable power saving mode 2019-03-17 18:04:40 +01:00
Jacob Vosmaer
0a6e484b1a output/plugins/OSXOutputPlugin: add boost meson dependency 2019-03-17 16:59:24 +01:00
Max Kellermann
0bb71f1f20 output/pulse: use pa_channel_map_init_extend() instead of _auto()
Unlike pa_channel_map_init_auto(), pa_channel_map_init_extend() does
not fail if there is no valid mapping for the given channel count, but
instead maps additional "AUX" channels.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/493
2019-03-16 14:03:10 +01:00
Max Kellermann
1aa7cdd602 decoder/opus: fix replay gain when there are no other tags
The `tag_builder.empty()` check was wrong for the SubmitReplayGain()
call.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/497
2019-03-16 13:55:19 +01:00
Max Kellermann
a4b8a0d801 doc/protocol.rst: clarify filter expressions with multiple tag values
Clarification for https://github.com/MusicPlayerDaemon/MPD/issues/505
2019-03-16 13:23:44 +01:00
Max Kellermann
3bf521d5ca song/TagSongFilter: apply negation properly to multiple tag values
The old implementation didn't make a lot of sense; the "!=" operator
was not actually the opposite of "==".

Closes https://github.com/MusicPlayerDaemon/MPD/issues/505
2019-03-16 13:23:02 +01:00
Max Kellermann
0acb55cde5 song/StringFilter: remove obsolete #if 2019-03-16 13:23:02 +01:00
Max Kellermann
6b89fd6100 song/StringFilter: make MatchWithoutNegation() public 2019-03-16 13:23:02 +01:00
Max Kellermann
52ce39dc3e test/TestSongFilter: unit test for song filters
A few of those tests fail due to bugs.
2019-03-16 13:23:02 +01:00
Max Kellermann
7a3e15d8e5 test/meson.build: add section for filter tests 2019-03-16 13:23:02 +01:00
Max Kellermann
cf66a60c60 test/MakeTag: add noexcept 2019-03-16 13:23:02 +01:00
Max Kellermann
9b26d451e4 test/MakeTag: remove static 2019-03-16 13:23:02 +01:00
Max Kellermann
137ffba1b4 test/test_translate_song: move MakeTag() to header 2019-03-16 13:23:02 +01:00
Max Kellermann
5c5dc1b7c0 meson.build: increase protocol version to 0.21.6
There is a minor new feature (commit 713c1f2ba9) and clients might be
interested in detecting it by the protocol version.
2019-03-16 13:23:02 +01:00
Max Kellermann
9e9418294a song/TagSongFilter: eliminate Match(TagItem) 2019-03-15 20:28:27 +01:00
Max Kellermann
b850eb74b7 song/TagSongFilter: add code comments 2019-03-15 19:54:29 +01:00
Max Kellermann
67d73a2aee song/TagSongFilter: improve lambda indent 2019-03-15 19:54:16 +01:00
Max Kellermann
fde9a470dd song/TagSongFilter: eliminate the std::fill_n() call 2019-03-15 19:35:58 +01:00
Max Kellermann
8d1f30e55b tag/Fallback: add API documentation 2019-03-15 19:23:10 +01:00
Max Kellermann
ddd2b60489 doc/protocol.rst: add missing operators to example expressions 2019-03-15 19:14:06 +01:00
Max Kellermann
8777737861 doc/protocol.rst: use double backticks for tag names 2019-03-15 19:11:30 +01:00
Max Kellermann
cb71f6dd04 doc/protocol.rst: clarify the meaning of the any tag type 2019-03-15 19:09:55 +01:00
Max Kellermann
1881b0e975 song/TagSongFilter: rename MatchNN() to Match()
The "NN" suffix used to mean "no negation", but that's not how it's
implemented today.
2019-03-15 19:06:56 +01:00
Max Kellermann
98b29f6d1c meson.build: remove the libwinpthread-1.dll dependency on Windows
Closes https://github.com/MusicPlayerDaemon/MPD/issues/507
2019-03-14 20:07:06 +01:00
Max Kellermann
59fdfd25cb command/database: fix "list" with filter expression
Disable the 0.11 compatibility mode if the only argument is a filter
expression.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/506
2019-03-14 19:50:09 +01:00
Max Kellermann
0d98677212 playlist/flac: copy the URI to fix use-after-free bug
Closes https://github.com/MusicPlayerDaemon/MPD/issues/508
2019-03-14 19:30:33 +01:00
Max Kellermann
38f0c16904 system/UniqueFileDescriptor: add CreatePipeNonBlock() 2019-02-27 23:30:56 +01:00
Max Kellermann
4fbf6b6c95 net/StaticSocketAddress: remove GetAddress() 2019-02-27 23:26:59 +01:00
Max Kellermann
1f8ff48168 net/StaticSocketAddress: add GetLocalRaw() 2019-02-27 23:26:00 +01:00
Max Kellermann
20b6e0d684 net/SocketDescriptor: add SetTcpUserTimeout() 2019-02-27 23:22:12 +01:00
Max Kellermann
713c1f2ba9 Merge branch 'feature/playlist' of git://github.com/miccoli/MPD 2019-02-27 13:49:22 +01:00
Stefano Miccoli
a149bc4c5d update protocol documentation for new semantics of playlist abs. name 2019-02-26 00:12:09 +01:00
Stefano Miccoli
b3a458338a allow loading playlists specified as absolute filesystem paths
implement for the "load" command the same logic used for the "add"
command: local clients can load playlist specified as absolute paths.

For relative paths the old logic is preserved: first look for a stored
playlist, then look in the music directory.
2019-02-26 00:12:09 +01:00
Max Kellermann
44422b2b2f event/ServerSocket, config/Net: abstract socket support 2019-02-25 13:08:33 +01:00
Max Kellermann
f10afd38b5 NEWS: mention the cdio_paranoia build failure fix 2019-02-25 13:08:33 +01:00
Thomas Zander
4c50a5e0b3 Ensure SEEK_SET is set on systems where stdio.h is not pulled in by accident. 2019-02-23 18:04:00 +01:00
Max Kellermann
f255a485b7 increment version number to 0.21.6 2019-02-22 15:28:03 +01:00
Max Kellermann
1930d5774d release v0.21.5 2019-02-22 15:23:33 +01:00
Max Kellermann
7220a76be0 doc/plugins.rst: document udisks2/policykit rule 2019-02-22 15:22:20 +01:00
Max Kellermann
83f7610dd1 storage/udisks2: move empty string check out of the fallback block in MapUTF8()
Even if the LocalStorage is available, return the "udisks://" URI when
the MapUTF8() parameter is an empty string.  This fixes the mount URI
in the state file.
2019-02-22 15:07:40 +01:00
Max Kellermann
30e0644722 db/simple: call ReturnSong() on mounted database
Fixes a memory leak, or an assertion failure in the debug build.
2019-02-22 14:52:13 +01:00
Max Kellermann
3ada464020 db/simple: use C++11 initializer 2019-02-22 14:52:01 +01:00
Max Kellermann
d5983dd362 storage/udisks2: use the relative path
Closes #487
2019-02-22 14:41:56 +01:00
Max Kellermann
98258acc37 storage/udisks2: pass Path to SetMountPoint() 2019-02-22 14:41:56 +01:00
Max Kellermann
8002bc752f NEWS: mention the udisks2 AlreadyMounted fix 2019-02-22 14:41:56 +01:00
Max Kellermann
834ad7a58f TagPrint: omit tags which were disabled by the client
Closes #471
2019-02-22 13:05:38 +01:00
Max Kellermann
e8f2f98048 tag/Mask: fix another typo, this time in operator^=
Similar to commit ff1ff1e54a
2019-02-22 12:44:36 +01:00
Max Kellermann
c672b60d07 build/pkg-config.sh: add comment 2019-02-22 12:39:59 +01:00
Max Kellermann
ea269c9c92 python/build/libs.py: upgrade CURL to 7.64.0 2019-02-22 12:10:06 +01:00
Max Kellermann
1fe3a77640 python/build/libs.py: upgrade FFmpeg to 4.1.1 2019-02-22 12:09:35 +01:00
Max Kellermann
bbaeea1ab7 storage/udisks2: use existing mount point if already mounted
Fixes the "org.freedesktop.UDisks2.Error.AlreadyMounted" error.

Closes #485
2019-02-21 13:32:03 +01:00
Max Kellermann
0a3aee9d82 storage/udisks2: move code to SetMountPoint() 2019-02-21 13:31:59 +01:00
Max Kellermann
2434020971 storage/udisks2: adjust lambda indent 2019-02-21 13:31:57 +01:00
Max Kellermann
41e0eb7378 lib/dbus/udisks2: parse the MountPoints property 2019-02-21 13:28:26 +01:00
Max Kellermann
6adf964c81 lib/dbus/ReadIter: add dbus_message_iter_get_fixed_array() wrapper 2019-02-21 12:56:05 +01:00
Max Kellermann
b59f37bc0a db/simple/Directory: close the Database in destructor
Fixes assertion failure.
2019-02-20 22:50:15 +01:00
Max Kellermann
cf2d171ccc db/simple: reorder checks in assert() to fix assertion failure
`light_song.Get()` could cause an assertion failure because the
`Manual<>` object must not be used if uninitialized.

Regression by commit ebc006ab52
2019-02-20 21:24:01 +01:00
Max Kellermann
cc28a7b67f Main: create Database on stack, move to Instance after Open() succeeded
This fixes use-after-free bug in SimpleDatabase::Close(), accessing
the `root` object which was already freed by the `catch` block in
Open().

By having the Database on the stack first, we can avoid calling
Close() on the failed-to-open Database from Instance's destructor.

Closes #482
2019-02-20 20:50:28 +01:00
Max Kellermann
8b5c33cecd Instance: use std::unique_ptr<> to manage the Database pointer 2019-02-20 20:48:20 +01:00
Max Kellermann
6c28adbcd2 db/Plugin: use std::unique_ptr<> to manage Database pointers 2019-02-20 20:43:31 +01:00
Max Kellermann
2125e3ed57 db/simple/Directory: add noexcept 2019-02-20 20:39:49 +01:00
Max Kellermann
3da7ecfadf mixer/pulse: add missing ParseFloat() check 2019-02-20 19:27:13 +01:00
Max Kellermann
5bb02bbd39 mixer/pulse: move volume_scale_factor up to improve struct packing 2019-02-20 19:25:55 +01:00
Max Kellermann
f11aa09f7c mixer/pulse: add const to volume_scale_factor 2019-02-20 19:25:53 +01:00
Max Kellermann
02eb4752d3 mixer/pulse: use C++11 initializer 2019-02-20 19:25:45 +01:00
Max Kellermann
d9c3215584 mixer/pulse: rename scale to scale_volume
Make it less generic, to avoid clashes.
2019-02-20 19:23:11 +01:00
Clément Pit-Claudel
110e6d026b mixer/pulse: Add a new 'scale' parameter to allow volumes above 100
Closes GH-479.
2019-02-17 16:14:52 -05:00
Max Kellermann
c0f57b8a8b net/IPv[46]Address: update copyright 2019-02-19 13:00:45 +01:00
Max Kellermann
57633fbcb3 net/AllocatedSocketAddress: add methods IsV6Any(), IsV4Mapped() 2019-02-19 12:51:24 +01:00
Max Kellermann
864c87e6c0 net/SocketAddress: add method GetLocalPath() 2019-02-19 12:50:40 +01:00
Max Kellermann
1a516cf3c0 net/AllocatedSocketAddress: add method GetLocalRaw() 2019-02-19 12:43:16 +01:00
Max Kellermann
5c25499c5e lib/cdio/Paranoia: add method GetDiscSectorRange() 2019-02-19 12:40:36 +01:00
Max Kellermann
da4bb4c298 fs/io/OutputStream: update include guard 2019-02-19 12:39:29 +01:00
Max Kellermann
5b8ff61799 fs/io/BufferedOutputStream: add WithBufferedOutputStream() 2019-02-19 12:37:53 +01:00
Max Kellermann
56bded07b1 system/UniqueFileDescriptor: import std::swap 2019-02-19 12:36:54 +01:00
Max Kellermann
db144a43ad system/Open: add OpenWriteOnly(), OpenDirectory() 2019-02-19 12:16:41 +01:00
Max Kellermann
5965f62b56 system/EpollFD: include cleanup 2019-02-19 11:51:52 +01:00
Max Kellermann
05aa9f72a9 util/StringView: add SkipPrefix(), RemoveSuffix() 2019-02-19 11:51:32 +01:00
Max Kellermann
281461f0f0 nfs: work around assertion failure on exception during program init
Closes #477
2019-02-15 18:33:58 +01:00
Max Kellermann
f70eb63879 Instance: eliminate FinishShutdownUpdate(), move code to destructor 2019-02-15 18:20:11 +01:00
Max Kellermann
99c23cf139 Instance: eliminate ShutdownDatabase(), move code to destructor
Destruct automatically, even if leaving the scope due to exception
being thrown.
2019-02-15 18:04:23 +01:00
Max Kellermann
9aa75e738c Merge branch 'protocol-doc-typo' of git://github.com/mxjeff/MPD 2019-02-15 18:03:49 +01:00
Max Kellermann
e9c45a9140 playlist/Registry: add RAII class 2019-02-05 23:03:29 +01:00
Max Kellermann
a065c6e6b9 Main: use AtScopeExit() to call DeinitFS() 2019-02-05 23:02:50 +01:00
Max Kellermann
feb5ff9bd2 Mapper: remove empty function mapper_finish() 2019-02-05 23:01:09 +01:00
Max Kellermann
92ec3f0881 valgrind.suppressions: add GObject/libgcrypt/libsmbclient suppressions 2019-02-05 22:53:02 +01:00
Max Kellermann
98c47d9d36 Instance: remove FinishShutdownPartitions()
The list of partitions is cleared automatically.
2019-02-05 22:53:02 +01:00
Max Kellermann
6c67408944 event/Loop: add flag alive
This replaces the old `dead` flag which was unreliable; it was `false`
if the EventThread was not yet started, which could cause deadlocks in
BlockingCall().
2019-02-05 22:38:45 +01:00
Max Kellermann
261a816b21 command/AllCommands: remove empty function command_finish() 2019-02-05 22:15:41 +01:00
Max Kellermann
7a23c123c8 decoder/List: add RAII class 2019-02-05 22:12:22 +01:00
Max Kellermann
e85b24bee0 decoder/List: add noexcept 2019-02-05 22:11:51 +01:00
Max Kellermann
9e73ea77b4 input/Init: add RAII class 2019-02-05 22:07:49 +01:00
Max Kellermann
b0739eca87 test/ConfigGlue: merge duplicate code from various debug programs 2019-02-05 21:56:20 +01:00
Max Kellermann
848f6aa5ab Main: stop io_thread and rtio_thread automatically
They will be stopped by ~EventThread() when the `Instance` is deleted.
2019-02-05 21:49:59 +01:00
Max Kellermann
c9ba4f3f9c archive/List: add RAII class 2019-02-05 21:40:07 +01:00
Max Kellermann
c0e9246a66 archive/List: add noexcept 2019-02-05 21:38:46 +01:00
Max Kellermann
096c23f27d unix/SignalHandlers: add RAII class 2019-02-05 21:36:51 +01:00
Max Kellermann
40bde1eac9 unix/SignalHandlers: add noexcept 2019-02-05 21:36:35 +01:00
Max Kellermann
4b55ed17a9 LogInit: add noexcept 2019-02-05 21:36:35 +01:00
kaliko
4f757a5add Fixed protocol documentation
* "lsinfo" argument is optional
 * "tagtypes disable" arguments are mandatory (typo)
2019-02-03 10:38:34 +01:00
Max Kellermann
674c137e5f NEWS: mention the TagMask typo fix 2019-02-02 15:17:25 +01:00
kaliko
ff1ff1e54a Fixed typo in TagMask 2019-02-02 15:14:31 +01:00
Yue Wang
42b22187c8 [OSXOutput] Throw an error when device not found
Currently it falls back to system default device (either internal speaker or headphone) when device not found. 
I believe it is a better to fail in this case, to make it better aligned with platforms (such as alsa).
2019-01-25 19:50:27 -08:00
Max Kellermann
cfe22502ab fs/io/StdioOutputStream: add noexcept 2019-01-22 09:03:49 +01:00
Max Kellermann
d77b0c7dcd net/SocketAddress: add constexpr 2019-01-22 08:42:35 +01:00
Max Kellermann
5cf889b676 util/WStringView: add missing include 2019-01-22 08:38:03 +01:00
Max Kellermann
ffc36d5255 input/buffered: implement seeking to end of file
Previously, a seek to the end of the file would cause an assertion
failure in SparseMap::Check() because the given offset was invalid.

Closes #453
2019-01-22 07:42:00 +01:00
Max Kellermann
0126276e2f FileCommands: log irregular errors while looking for cover art 2019-01-21 22:21:11 +01:00
Max Kellermann
58d6ddab9e FileCommands: catch all exceptions 2019-01-21 22:19:32 +01:00
Max Kellermann
05db6934eb FileCommands: fix deadlock in "albumart" command
Must lock the mutex before calling any of the unprotected InputStream methods.

Closes #462
2019-01-21 22:16:46 +01:00
Max Kellermann
02c68c5cdb net/HostParser: add noexcept 2019-01-21 21:20:43 +01:00
Max Kellermann
b02fee7309 util/PrintException: support "const char *" 2019-01-21 21:19:35 +01:00
Max Kellermann
424f75c9e1 util/OffsetPointer: remove redundant inline keywords from constexpr functions 2019-01-21 21:19:09 +01:00
Max Kellermann
f6e1176f97 util/CharUtil: remove redundant inline keywords from constexpr functions 2019-01-21 21:18:23 +01:00
Max Kellermann
e4700c0a27 util/Cast: remove redundant inline keywords from constexpr functions 2019-01-21 21:17:58 +01:00
Max Kellermann
cf23fd8774 fs/io/FileOutputStream: add constructor with directory fd 2019-01-21 21:10:02 +01:00
Max Kellermann
dee8872395 fs/io/FileOutputStream: move code to Open() 2019-01-21 21:09:34 +01:00
Max Kellermann
4ba9357a9c input/CdioParanoia: C++ wrappers for libcdio types 2019-01-21 20:20:20 +01:00
Max Kellermann
48ec09ab1e test/net/TestIPv4Address: make literal unsigned to work around -Wsign-compare 2019-01-21 14:39:24 +01:00
Max Kellermann
754f4048a8 output/shout: evaluate tls option only if TLS is enabled in libshout
Fixes build failure after commit
0cea67ee70
2019-01-21 14:36:43 +01:00
Max Kellermann
037bb07d08 db/VHelper: include DetachedSong.hxx to fix GCC 9 build failure
GCC 9's libstdc++ is unable to use forward-declared types as
std::vector item because the compiler wants to resolve `noexcept()` on
the item destructor.
2019-01-21 14:34:12 +01:00
Max Kellermann
87635c5268 input/CdioParanoia: use the new function names 2019-01-21 14:18:55 +01:00
Max Kellermann
528b4338f4 input/CdioParanoia: use cdio_cddap_free_messages() on recent library versions 2019-01-21 14:16:51 +01:00
Max Kellermann
c780b8bba9 input/CdioParanoia: remove useless cdda_messages() call 2019-01-21 12:36:59 +01:00
Max Kellermann
ca34f3250b input/CdioParanoia: detect libcdio version at compile time
libcdio_paranoia was split from libcdio in version 90, and at the same
time, the header was moved from cdio/paranoia.h to
cdio/paranoia/paranoia.h.  We can easily detect this version at
compile time which is faster than configure time.
2019-01-21 12:14:13 +01:00
Max Kellermann
6a68e1c3f3 test/net/TestIPv6Address: work around failure on macOS 2019-01-21 12:13:52 +01:00
Max Kellermann
85f77ec81d test/net/TestLocalSocketAddress: can't use strcmp() if the string isn't null-terminated. 2019-01-21 12:12:36 +01:00
Max Kellermann
37debed0b8 python/build/libs.py: upgrade Boost to 1.69.0 2019-01-21 10:19:46 +01:00
Max Kellermann
008383f24a python/build/libs.py: upgrade CURL to 7.63.0 2019-01-21 10:11:50 +01:00
Jörg Krause
4f7d52dbf2 meson: add fixed-point Vorbis (Tremor) decoder support
Re-add build support for the fixed-point Vorbis (Tremor) decoder, which
was dropped when switching from Autotools to Meson.

Note, that it is not possible to build both, the Vorbis and the Tremor
decoder.

Closes: #405
2019-01-21 08:35:17 +01:00
Max Kellermann
c7848da8f2 input/CdioParanoia: add const to pointer 2019-01-20 22:03:49 +01:00
Max Kellermann
10a6c5c57d input/CdioParanoia: make variables more local 2019-01-20 21:59:57 +01:00
Max Kellermann
2cc2bab309 test/net: new unit tests 2019-01-20 21:05:21 +01:00
Max Kellermann
701fd1d939 net/IPv4Address: fix comment typo 2019-01-20 21:05:12 +01:00
Max Kellermann
d1bdea8edb Merge branch 'shout_tls' of git://github.com/JakobOvrum/MPD 2019-01-20 21:03:42 +01:00
Jakob Ovrum
0cea67ee70 shout output plugin: add support for TLS 2019-01-19 17:36:14 +01:00
Thomas Klausner
3a0480a482 Add missing include of stdlib.h.
Closes https://github.com/MusicPlayerDaemon/MPD/issues/456
2019-01-15 16:52:40 +01:00
Max Kellermann
1fa99da3c2 net/IPv[46]Address: make the initializers even more portable
Similar to 5a5229b499: use more C++14
constexpr.
2019-01-14 19:21:07 +01:00
James D. Smith
22d669da18 Add APE mapping for album artist.
"De-facto" field mappings are available at http://wiki.hydrogenaud.io/index.php?title=Tag_Mapping.
2019-01-14 19:15:42 +01:00
Thomas Zander
772681f23d Fix link_args for mDNSResponder on non-darwin platforms 2019-01-13 14:09:14 +01:00
Max Kellermann
1862a98a44 increment version number to 0.21.5 2019-01-04 19:31:07 +01:00
Max Kellermann
4634b94c83 release v0.21.4 2019-01-04 19:22:21 +01:00
Max Kellermann
6e04a327b4 android/AndroidManifest.xml: increment version number to 0.21.4 2019-01-04 19:22:14 +01:00
Max Kellermann
7ec887eea2 Merge branch 'add-meson-dependencies' of git://github.com/jacobvosmaer/MPD 2019-01-04 19:06:49 +01:00
Max Kellermann
1477b64d4f Merge branch 'patch-2' of git://github.com/HyShai/MPD
Closes #343
2019-01-04 19:04:52 +01:00
Max Kellermann
a2c108f5ef NEWS: mention the Haiku build fix 2019-01-04 19:03:53 +01:00
Zoltán Mizsei
f546e76490 Build fix. This struct is the same on Haiku and on Linux, still gcc
fails on it. This fixes.
2019-01-04 19:01:27 +01:00
Zoltán Mizsei
2568bc3957 Haiku is "haiku". 2019-01-04 18:59:49 +01:00
Max Kellermann
7104ac963b util/AllocatedArray: import std::swap 2018-12-28 17:18:41 +01:00
Max Kellermann
2cb36590b2 util/AllocatedArray: add noexcept 2018-12-28 17:17:28 +01:00
Max Kellermann
af7b928d7c output/httpd/Page: remove obsolete API documentation 2018-12-28 17:16:12 +01:00
Max Kellermann
c0d8a9b07a output/httpd/Page: add noexcept 2018-12-28 17:15:28 +01:00
Max Kellermann
5b0d23d553 output/httpd/IcyMetaDataServer: add noexcept 2018-12-28 17:14:27 +01:00
Max Kellermann
ab30695bd1 output/httpd: add noexcept 2018-12-28 17:06:01 +01:00
Max Kellermann
53a4de35c4 util/DynamicFifoBuffer: add noexcept 2018-12-28 17:06:01 +01:00
Max Kellermann
22e6d95c4b remove libwrap support
libwrap is an obscure artefact from a past long ago, when source IP
address meant something.

And its API is "interesting"; it requires the application to expose
two global variables `allow_severity` and `deny_severity`.  This led
to bug #437.  I don't want to declare those variables; instead, I'd
like to remove libwrap support.

Closes #437
2018-12-28 14:16:02 +01:00
Max Kellermann
1c7bd7d5c4 db/update/InotifyQueue: check for ACK_ERROR_UPDATE_ALREADY
Since commit cc64c715a2, UpdateService::Enqueue() throws
ProtocolError(ACK_ERROR_UPDATE_ALREADY) instead of returning 0.
2018-12-28 14:02:41 +01:00
Max Kellermann
3c4ed9cbe3 db/update/InotifyQueue: catch UpdateService::Enqueue() exceptions 2018-12-28 14:00:58 +01:00
Max Kellermann
2677b90244 db/update/InotifyQueue: add noexcept 2018-12-28 14:00:55 +01:00
Max Kellermann
1b20fa441d db/update/InotifyQueue: update code comment 2018-12-28 14:00:10 +01:00
HyShai
18c042d4cf remove non-block call
This is similar to b177bffa6a, in that it fixes the Windows issue of connecting to the open socket. Also, the listen_socket is set to AcceptNonBlock after the connection anyways.
2018-12-18 15:23:40 -05:00
Max Kellermann
98f92d828a NEWS: mention the "ICY" -> "HTTP/1.1" change 2018-12-14 09:26:59 +01:00
HyShai
76268773b5 change HTTP Version to a valid version 2018-12-14 01:51:54 -05:00
Jacob Vosmaer
87542e3080 Add missing pcre_dep in src/song/meson.build 2018-12-09 17:21:38 +01:00
Jacob Vosmaer
66f5b0fed7 Add boost_dep in subdir meson.build files 2018-12-09 17:20:47 +01:00
Max Kellermann
5cb603983e alsa/NonBlock: throw on snd_pcm_poll_descriptors_revents() error
This function is sparsely documented and a look at the bluez-alsa
source code shows that implementations make undocumented assumptions
on the `struct pollfd` array parameter which can lead to strange
effects.
2018-12-04 18:00:52 +01:00
Max Kellermann
9c5790ab1d doc/user.rst: more markup 2018-11-20 22:06:42 +01:00
Max Kellermann
4b7078297d db/upnp: use the generic ::CollectUniqueTags() function
This function implements the "group" feature on top of the
Database::Visit() method.
2018-11-19 20:08:10 +01:00
Max Kellermann
841694ccf2 db/Interface: document CollectUniqueTags() 2018-11-19 19:40:00 +01:00
Max Kellermann
12f4a8255a Main: use DatabasePlugin::RequireStorage() 2018-11-19 19:39:37 +01:00
Max Kellermann
bda77ffc5b db/Interface: remove IsPlugin(), use dynamic_cast instead 2018-11-19 19:38:20 +01:00
Max Kellermann
ed9ece5ea3 db/Interface: make the constructor protected 2018-11-19 19:38:20 +01:00
Max Kellermann
ce49d99c2f check.h: remove obsolete header
Since we switched from autotools to Meson in commit
94592c1406, we don't need to include
`config.h` early to properly enable large file support.  Meson passes
the required macros on the compiler command line instead of defining
them in `config.h`.

This means we can include `config.h` at any time, whenever we want to
check its macros, and there are no ordering constraints.
2018-11-19 16:33:49 +01:00
Max Kellermann
2e450bbf95 src/thread/meson.build: detect pthread_setname_np()
This compile-time check got lost during the Meson transition.
2018-11-19 16:33:14 +01:00
Max Kellermann
303b3071e4 db/UniqueTags: remove pure attribute because function may throw 2018-11-19 11:32:53 +01:00
Max Kellermann
eb6d5f34fc db/UniqueTags: include cleanup 2018-11-19 11:11:45 +01:00
Max Kellermann
f80126959d meson.build: increment PROTOCOL_VERSION to 0.21.4
This version should have been incremented in 0.21.2 because this
version added new search operators.  In 0.21.4, we'll have more
protocol bug fixes which may be important for clients to know.
2018-11-19 11:11:45 +01:00
Max Kellermann
4fb4f6d1b7 increment version number to 0.21.4 2018-11-19 09:58:05 +01:00
Max Kellermann
43df4a7500 release v0.21.3 2018-11-16 13:27:58 +01:00
Max Kellermann
4cdcaa8630 output/alsa: don't call snd_pcm_drain() if nothing was written
Works around a problem where MPD goes into a busy loop because
snd_pcm_drain() always returns `-EAGAIN` without making any progress
(fixes #425).

This problem was triggered by snd_pcm_drain() after snd_pcm_cancel()
and snd_pcm_prepare(), but without submitting any data with
snd_pcm_writei().

I believe this is a kernel bug: in non-blocking mode, the kernel's
snd_pcm_drain() function returns early.  In this mode, it only checks
whether snd_pcm_drain_done() has been called already, but
snd_pcm_drain_done() is never called if no data was submitted.

In blocking mode, the following `for` loop detects this condition, so
snd_pcm_drain_done() is not necessary, but without this extra check,
we get `-EAGAIN` forever.
2018-11-16 12:49:37 +01:00
Volodymyr Medvid
04f632296f test/meson.build: run_storage depends on event lib
test/run_storage.cxx depends on EventThread/EventLoop from libevent.a.
Depend on it explicitly. This addresses build failure with
-Dtest=true -Dcurl=disabled -Ddbus=disabled
2018-11-15 19:01:43 +02:00
Max Kellermann
7c8dbcfaac doc/protocol.rst: song position is 0-based 2018-11-15 12:34:23 +01:00
Max Kellermann
436ba3c96c output/alsa: drain the whole ring_buffer, not just one period
This fixes a problem which caused a failure with snd_pcm_writei()
because snd_pcm_drain() had already been called in the previous
iteration.  This commit makes sure that snd_pcm_drain() is only called
after the final snd_pcm_writei() call.

This fixes discarded samples at the end of playback.
2018-11-14 13:35:17 +01:00
Max Kellermann
5d12f52873 output/alsa: clear error after reopening device
When a playback error has occurred, MPD would never recover until one
restarts MPD.
2018-11-14 13:20:54 +01:00
Max Kellermann
a8bf8ede01 event/Thread: reduce the RTIO timer slack to 10us
MPD's default is 100ms, which is too long for the real-time I/O
thread.  The OutputThread has 100us, but the real-time I/O thread
might have tighter deadlines.

This change has currently no effect (I believe), because nobody uses
timers on the RTIO thread.
2018-11-14 12:11:57 +01:00
Max Kellermann
8682183bc3 LogInit: default to journal if MPD was started as systemd service 2018-11-14 12:07:22 +01:00
Max Kellermann
94c31d0da9 doc/mpdconf.example: no, logging is not disabled without log_file 2018-11-14 12:07:22 +01:00
Max Kellermann
464a4cbeec python/build/libs.py: upgrade FFmpeg to 4.1 2018-11-14 11:50:51 +01:00
Max Kellermann
9f0cbf418a python/build/libs.py: upgrade CURL to 7.62.0 2018-11-14 11:50:51 +01:00
Max Kellermann
b477f86c92 output/alsa: don't lock the mutex in CancelInternal()
CancelInternal() doesn't need to be protected because it is called
synchronously from Cancel().
2018-11-14 11:50:51 +01:00
Max Kellermann
020371f145 output/alsa: wake up the client thread after generating silence
Fixes a theoretical race condition which could occur in Drain() (but
was extremely unlikely).
2018-11-14 11:48:55 +01:00
Max Kellermann
ccafe3f3cf output/alsa: don't generate silence if ALSA-PCM buffer has enough data
If our `ring_buffer` is smaller than the ALSA-PCM buffer (if the
latter has more than the 4 periods we allocate), it can happen that
the start threshold is crossed and ALSA switches to
`SND_PCM_STATE_RUNNING`, but the `ring_buffer` is empty.  In this
case, MPDD will generate silence, even though the ALSA-PCM buffer has
enough data.  This causes stuttering (#420).

This commit amends an older workaround for a similar problem (commit
e08598e7e2) by adding a snd_pcm_avail()
check, and only generate silence if there is less than one period of
data in the ALSA-PCM buffer.

Fixes #420
2018-11-14 11:17:59 +01:00
Max Kellermann
3830748de5 output/alsa: clear the period_buffer in LockCaughtError()
The method Cancel() assumes that the `period_buffer` must be empty
when `active==false`, but that is not the case when Play() fails.

Of course the assertion in Cancel() is not 100% correct, but I decided
to rather fix this in LockCaughtError() because the `period_buffer`
should only be accessed from within the RTIO thread, and this is the
only code path where `active` can be set to `false` with a non-empty
`period_buffer`.

Fixes #423
2018-11-14 10:24:08 +01:00
Max Kellermann
1a43f5145d output/alsa: throw on snd_pcm_writei() error while draining
This implements real error handling, and avoids calling
CancelInternal() from this code path.
2018-11-14 10:08:29 +01:00
Max Kellermann
7f143a83c1 output/alsa: fix wrong use of errno
alsa-lib doesn't set errno, it returns errors as negative integers.
2018-11-14 10:07:23 +01:00
Max Kellermann
6ccc254179 output/alsa: throw after snd_pcm_drain() error 2018-11-14 10:04:10 +01:00
Max Kellermann
7db2450447 output/alsa: refactor the drain EAGAIN workaround 2018-11-14 10:00:50 +01:00
Max Kellermann
6c2a6a65e0 output/alsa: remove snd_pcm_state() check from DrainInternal()
This check was added 9 years ago in commit
4dc25d3908 to work around a dmix bug
which I assume has been fixed long ago.

Removing this fixes another corner case: if draining is requested
before the start threshold is reached, the PCM is still in
SND_PCM_STATE_PREPARED but not yet SND_PCM_STATE_RUNNING, which means
the submitted data will never be played.  This corner case is
realistic when playing songs shorter than the ALSA buffer (if the
buffer is very large).
2018-11-14 09:48:24 +01:00
Max Kellermann
4247a757b3 output/alsa: call snd_pcm_prepare() if draining is requested early
This fixes a corner case which has probably never occurred and
probably never will: if Cancel() is called, and then Play() followed
by Drain(), the plugin should really play that data.  However
currently, this never happens, because snd_pcm_prepare() is never
called.
2018-11-14 09:43:14 +01:00
Max Kellermann
57e34823d8 increment version number to 0.21.3 2018-11-12 13:59:17 +01:00
Max Kellermann
3c93decdf0 release v0.21.2 2018-11-12 13:33:04 +01:00
Max Kellermann
89e7a5018d doc/protocol.rst: explain song positions vs ids 2018-11-12 13:19:10 +01:00
Max Kellermann
7235b46e5e doc/protocol.rst: rename "current playlist" to "queue" 2018-11-12 13:12:29 +01:00
Max Kellermann
0852226a48 doc/protocol.rst: deprecated close and kill 2018-11-12 13:03:09 +01:00
Max Kellermann
e20d215abf doc/protocol.rst: more markup 2018-11-12 13:01:43 +01:00
Max Kellermann
e4b9b67e24 doc/protocol.rst: deprecation 2018-11-12 12:57:53 +01:00
Max Kellermann
685b78828d doc/protocol.rst: mention that unknown lines may be omitted 2018-11-12 12:57:45 +01:00
Max Kellermann
060908d5c4 song/Filter: add operator "contains"
Closes #410
2018-11-12 12:49:01 +01:00
Max Kellermann
0b0f4c61f1 doc/protocol.rst: remove documentation about == matching substrings
I added this sentence in commit
5271e81ebe, but this was merely
documented the legacy status quo, which has always been undocumented
for old-style filters.

But for new filters, using "==" for sub strings was a surprising
"feature", which I removed in commit
ac0852b4e3.
2018-11-12 12:45:40 +01:00
Max Kellermann
228bf7eb09 output/thread: cancel the AudioOutputSource() instead of closing it
This fixes the assertion failure due to calling
AudioOutputSource::Close() twice.
2018-11-12 12:24:25 +01:00
Max Kellermann
5eaf2b8fc3 output/control: always close the AudioOutputSource in RELEASE
Fixes a crash bug with `always_on` outputs which occurs because the
`AudioOutputSource` still has a pointer to an outdated `MusicChunk`.

Fixes #415
2018-11-12 12:21:59 +01:00
Max Kellermann
e097fef79e output/control: add command RELEASE
With the new command, the decision to pause or close the output moves
into the output thread.
2018-11-12 12:09:37 +01:00
Max Kellermann
9a813cd3b1 output/Thread: update comment 2018-11-12 12:09:02 +01:00
Max Kellermann
1c60c8e014 output/Filtered: catch Drain() exceptions in CloseOutput() 2018-11-12 12:05:54 +01:00
Max Kellermann
eddda95900 output/interface: document that Drain() may throw 2018-11-12 12:04:42 +01:00
Max Kellermann
72184dccfc song/StringFilter: support regular expressions with "=~" and "!~"
This feature requires `libpcre`.
2018-11-11 12:55:35 +01:00
Max Kellermann
fee75dc766 {output,mixer}/alsa: use snd_pcm_poll_descriptors_revents()
This call was missing, causing very high CPU usage when the ALSA
output plugin was used with dmix.

Closes #391
2018-11-11 12:37:29 +01:00
Max Kellermann
ba5c856f15 events/MultiSocketMonitor: add method ForEachResult() 2018-11-11 12:37:28 +01:00
Max Kellermann
12308a0f55 lib/alsa/NonBlock: move the functions into a class managing the state 2018-11-11 12:37:25 +01:00
Max Kellermann
a958abde2f Merge branch 'fix_362' of git://github.com/miccoli/MPD 2018-11-11 12:37:13 +01:00
Max Kellermann
583208db7e output/httpd: fix nullptr dereference crash bug
When `metadata_sent` is `false`, the plugin assumes there is metadata
which must be sent, even if no metadata page was passed to the plugin.
Initializing it to `true` avoids dereferencing this `nullptr`.

Fixes #412
2018-11-08 09:37:18 +01:00
Max Kellermann
7b5ba15170 song/Filter: move code to ParseStringFilter() 2018-11-08 00:02:10 +01:00
Max Kellermann
d5e0d49f86 song/{Tag,Uri}SongFilter: pass StringFilter&& to constructor 2018-11-07 23:57:42 +01:00
Max Kellermann
73b22d82aa song/StringFilter: move negated flag from containing class 2018-11-07 23:47:31 +01:00
Max Kellermann
db51cc4e02 lib/zlib/meson.build: add zlib_dep to declare_dependency
Fixes potential compiler error when zlib is installed in a
non-standard directory.
2018-11-07 23:32:23 +01:00
Max Kellermann
be8a52a914 NEWS: mention the ENABLE_ZLIB fix 2018-11-07 23:26:33 +01:00
Max Kellermann
ad597a8ff0 lib/zlib/meson.build: define ENABLE_ZLIB
Fixes #414
2018-11-07 23:24:58 +01:00
Max Kellermann
b1fe105904 output/Source: reset current_chunk in Open()
If the output is already open, the `current_chunk` pointer may be
bogus and out of sync with `SharedPipeConsumer::chunk`, leading to an
assertion failure in `SharedPipeConsumer::Consume()`.

Fixes #411
2018-11-07 00:17:48 +01:00
Max Kellermann
451b142e3a player/Thread: finish decoder startup before checking the buffer
This fixes a valgrind warning because `buffer_before_play`
initialization needs to know the audio format from the decoder.
2018-11-06 23:52:26 +01:00
Max Kellermann
2833625266 doc/user.rst: more markup 2018-11-06 22:38:34 +01:00
Max Kellermann
0464028872 doc/user.rst: add information about debug build 2018-11-06 22:38:24 +01:00
Max Kellermann
98985c03b0 check.h: remove obsolete ENABLE_LARGEFILE check
Meson always enables large file support on the compiler command line,
thus config.h doesn't need to be included anymore.  We'll remove the
whole `check.h` header soon.

Closes #409
2018-11-05 21:25:59 +01:00
Max Kellermann
793fd8c479 decoder/ffmpeg: eliminate GetSampleFormat() 2018-11-04 22:36:17 +01:00
Max Kellermann
6c602811df decoder/ffmepg: fill AudioFormat from AVCodecContext, not AVCodecParameters
`AVCodecParameters` contains values from the codec detected by
avformat_find_stream_info(), but after avcodec_open2(), a different
codec might be selected with a different `AVSampleFormat`.  This leads
to misinterpretation of data returned from FFmpeg, leading to random
noise or silence.

This was observed with FFmpeg 4.0.2 and a TS container file containing
MP2.  A mp3-float codec was detected returning `AV_SAMPLE_FMT_FLTP`,
but finally the `mpegaudiodec_fixed.c` was used, returning
`AV_SAMPLE_FMT_S16`.

By using the audio format from `AVCodecContext`, we ensure that MPD
and FFmpeg always agree on the actual audio format in the buffer.

This removes the FFmpeg bug workaround from commit e1b032cbad which I
assume is obsolete after 7 years.

Fixes #380
2018-11-04 22:30:50 +01:00
Stefano Miccoli
6d48a5684a clamp 'set_normalized_volume' to valid values also for ALSA softvol
ensure that valid mixer values are set also when the ALSA driver
does not report a valid dB range ('set_raw' fallback)

correct a bug in which volume is assumed to lie in [0..100]
instead of [0..1]
2018-11-04 22:21:56 +01:00
Max Kellermann
bd115a4008 decoder/ffmpeg: use AtScopeExit() to call av_packet_unref() 2018-11-04 22:01:33 +01:00
Max Kellermann
08272cdee2 decoder/ffmpeg: require FFmpeg 3.1 or later
Drop some compatibility code.
2018-11-04 21:55:06 +01:00
Max Kellermann
b14a5141a6 increment version number to 0.21.2 2018-11-04 19:47:04 +01:00
Max Kellermann
aa0e4500c6 release v0.21.1 2018-11-04 14:08:16 +01:00
Fabian Muscariello
4e6b8edf72 doc/protocol.rst: add missing backticks 2018-11-04 14:04:57 +01:00
Max Kellermann
ac0852b4e3 song/Filter: operator "==" never searches substrings in filter expressions
The protocol documentation says that the difference between `find` and
`search` is that `search` is case insensitive, but that's only half
the truth: `search` also searches for sub strings instead of matching
the whole string.  This part is undocumented and unfortunate, but at
this point, we can't change it.

However leaking this surprising behavior to the new filter expressions
was a bad idea; the "==" operator should never match substrings.  For
people who need that, we should add a new operator.
2018-11-04 13:57:34 +01:00
Max Kellermann
6fe43ed969 song/StringFilter: add flag substring
Prepare to stop using substrings for filter expressions.
2018-11-04 13:49:47 +01:00
Max Kellermann
b34bc06624 song/StringFilter: use std::string::operator== 2018-11-04 13:49:38 +01:00
Max Kellermann
08e41e60e5 meson.build: downgrade Boost 1.67 error to warning
Some Boost 1.67 packages apparently have a workaround for the bug, so
let them build MPD.
2018-11-04 12:45:22 +01:00
Max Kellermann
10ec478a9c meson.build: refuse to build with buggy Boost version 1.67 2018-11-04 12:31:49 +01:00
Max Kellermann
86f1074905 lib/xiph/meson.build: the Vorbis encoder requires the Vorbis decoder
Without the Vorbis decoder, `libvorbis` is never detected, leading to
linker failures when attempting to build the Vorbis encoder.
2018-11-04 12:21:23 +01:00
Max Kellermann
8e66b855a3 doc/protocol.rst: mention that sub-expressios must be enclosed in parantheses
Closes #399
2018-11-04 12:12:38 +01:00
Max Kellermann
e3bc85d7bf meson.build: require Meson 0.47.2
Meson 0.47.1 suffers from a bug which breaks linking the MPD
executable because the `-lpthread` flag is not propagated from our
`thread.a`.

See https://github.com/mesonbuild/meson/pull/3895

Closes #403
2018-11-04 11:54:40 +01:00
Max Kellermann
6f242836e6 lib/xiph/meson.build: fix typo, replace and with or
Fixes linker failure when building without FLAC support.

Closes #400
2018-11-04 11:36:28 +01:00
Max Kellermann
f2c926f3b6 zeroconf/glue: add fallback value for HOST_NAME_MAX
`HOST_NAME_MAX` is not a portable macro; it is undefined on some
systems.

Closes #402
2018-11-04 11:12:03 +01:00
Max Kellermann
aba18924ee win32/build.py: link libstdc++ and libcc statically
Fixes #404
2018-11-04 11:10:00 +01:00
Max Kellermann
aa6bef54dd python/build/zlib.py: build zlib as a static library
Fixes one part of #404
2018-11-04 11:10:00 +01:00
Max Kellermann
528f5b9cb9 song/Filter: allow escaping quotes in filter expressions
Closes #397
2018-11-02 19:15:08 +01:00
Max Kellermann
96ae0ec93a remove some autotools remains
Closes #396
2018-11-02 18:55:49 +01:00
Max Kellermann
5a5229b499 net/IPv[46]Address: make the initializers more portable
Thanks to C++14, we can declare and fill variables inside `constexpr`
functions.  This means me can stop make assumptions on the `struct`
layouts without losing `constexpr`.

Closes #393
2018-11-02 17:47:43 +01:00
Max Kellermann
bba22c9c8c system/FileDescriptor: check __linux__ instead of __linux
`__linux` is the deprecated non-standard macros which appears to be
not present at all on PowerPC.

Closes #398
2018-11-02 16:50:38 +01:00
Max Kellermann
694c437a2c NEWS: mention the FFmpeg build fix 2018-11-02 16:50:35 +01:00
Max Kellermann
587172efa3 Merge branch 'patch-1' of git://github.com/joerg-krause/MPD 2018-11-01 19:17:10 +01:00
Max Kellermann
2a926063b2 src/lib/ffmpeg/meson.build: copy dependencies into ffmpeg_dep
Apparently, Meson propagates the linker flags but not the compiler
flags from a `static_library`'s dependencies list.

Closes #392
2018-11-01 19:14:00 +01:00
Jörg Krause
d6f239e54f meson: fix typo in options plugins comment 2018-11-01 19:06:54 +01:00
Max Kellermann
b8989fafeb increment version number to 0.21.1 2018-11-01 17:23:47 +01:00
Max Kellermann
795789e79d release v0.21 2018-10-31 19:39:53 +01:00
Max Kellermann
cd8bc57c0d android/AndroidManifest.xml: increment version to 0.21 2018-10-31 19:39:41 +01:00
Max Kellermann
55b355618d android/apk/make-unsigned-apk.sh: pass -X to zip to avoid storing uids 2018-10-31 19:34:14 +01:00
Max Kellermann
ba25a5388e meson.build: use -funwind-tables only with clang 2018-10-31 19:30:01 +01:00
Max Kellermann
657ef48518 zeroconf/glue: use strstr() and std::string::replace() instead of std::regex_replace()
std::regex_replace() is heavily bloated and overkill for this feature.
2018-10-31 19:26:37 +01:00
Max Kellermann
b1d68fe995 NEWS: mention the zeroconf_name %h substitution 2018-10-31 19:26:17 +01:00
Max Kellermann
8a492c8f39 Merge branch 'bug516974' of git://github.com/fschlich/MPD 2018-10-31 19:20:41 +01:00
Max Kellermann
901a48c9a4 command/sticker: return ACK_ERROR_NO_EXIST for "no such sticker"
Closes #389
2018-10-31 19:19:07 +01:00
Max Kellermann
b0994bad31 AUTHORS: add 0.21 contributors 2018-10-31 17:59:54 +01:00
Max Kellermann
f5c9071494 *: copyright year 2018 2018-10-31 17:54:59 +01:00
Florian Schlichting
d1f85240a2 include hostname in zeroconf_name (fixes #387)
expand %h to the system hostname and default to a zeroconf string that
contains %h
2018-10-31 17:54:45 +01:00
Max Kellermann
2148d4bb31 fs/io/FileOutputStream: fix -Wcomment 2018-10-31 17:18:44 +01:00
Max Kellermann
e79d06d595 fs/io/FileOutputStream: don't use O_TMPFILE on Android
Fixes writing to Context.getCacheDir().
2018-10-31 17:12:21 +01:00
Max Kellermann
c60cf944f5 fs/io/FileOutputStream: add macro HAVE_O_TMPFILE 2018-10-31 17:10:52 +01:00
Max Kellermann
4b8ee58638 doc/user.rst: more markup 2018-10-31 15:34:33 +01:00
Max Kellermann
9305730993 doc/user.rst: use arm64 instead of armv7 in the example
All new hardware is arm64 anyway.
2018-10-31 15:26:24 +01:00
Max Kellermann
16bc97e9e5 doc/user.rst: add warning about outdated Debian packages 2018-10-31 15:22:35 +01:00
Max Kellermann
482c18982e doc/user.rst: use "apt" instead of the old "apt-get" 2018-10-31 15:17:22 +01:00
Max Kellermann
06ca08ce55 output/roar: remove
Bugs in libroar which broke the MPD build have been annoying me for
quite some time, and the newest bug has now hit my main build machine:

 https://github.com/MusicPlayerDaemon/MPD/issues/377

Problem is the usage of the typedef `_IO_off64_t` in libroar's
`vio_stdio.h`:

 int roar_vio_to_stdio_lseek (void *__cookie, _IO_off64_t *__pos, int __w);

This `_IO_off64_t` is an internal implementation detail of glibc and
was removed in version 2.28.  Nobody must ever use it.  Why the ****
did the RoarAudio developers use it?  Not using internal typedefs
isn't exactly rocket science.

This annoys me enough to finally remove the plugin.  Anyway, I've
never heard of anybody using RoarAudio, so my best guess is that
nobody will notice.
2018-10-31 15:03:28 +01:00
Max Kellermann
9fc00a817b Listen: use fs/XDG.hxx
This keeps one central place for the XDG switch.  Specifically, this
disables the XDG listener on Apple, where XDG is not supported.
2018-10-31 14:30:34 +01:00
Max Kellermann
f47696f5f8 fs/StandardDirectory: move USE_XDG to XDG.hxx 2018-10-31 13:39:20 +01:00
Max Kellermann
190006e9dc doc/plugins.rst: add missing :file: 2018-10-31 13:25:44 +01:00
Max Kellermann
30eaae10c1 doc/developer.rst: remove :option: markup 2018-10-31 13:24:52 +01:00
Max Kellermann
b878111404 doc/user.rst: more markup 2018-10-31 13:22:25 +01:00
Florian Schlichting
db21d7de0b fix compilation errors on Debian GNU/Hurd
Apparently on hurd-i386 __GLIBC__ is defined, but the pthread
implementation is special and cannot be used with constexpr. Hence
exclude __gnu_hurd__.
2018-10-31 12:24:34 +01:00
Max Kellermann
8454083efa doc/protocol.rst: "oneshot" was added to 0.21, not 0.20 2018-10-31 12:00:01 +01:00
Cotko
a0e5729117 doc/protocol.rst: footnote for oneshot arg 2018-10-31 03:16:05 +01:00
Cotko
534853cd32 doc/protocol.rst: add oneshot to the single command arguments 2018-10-31 03:12:35 +01:00
Max Kellermann
fb0ead1788 doc/meson.build: add missing dependency 2018-10-30 22:51:09 +01:00
Max Kellermann
32013ad4a6 doc/user.rst: remove invalid :option: tags 2018-10-30 22:34:59 +01:00
Max Kellermann
7352d6a38d doc/user.rst: improve plugin reference links 2018-10-30 22:33:52 +01:00
Max Kellermann
f649ec1fd8 doc/user.rst: move plugin reference to plugins.rst 2018-10-30 22:27:42 +01:00
Max Kellermann
56112a237c Listen: listen on $XDG_RUNTIME_DIR/mpd/socket by default 2018-10-30 22:14:54 +01:00
Max Kellermann
64da9399ca event/ServerSocket: allow mixing AddFD() with other Add*() methods 2018-10-30 22:14:53 +01:00
Max Kellermann
dd8e14e121 doc/conf.py: use the "classic" theme 2018-10-30 22:13:15 +01:00
Max Kellermann
09e2202cd6 doc/user.rst: remove redundant tags list, link to protocol documentation 2018-10-30 22:08:31 +01:00
Max Kellermann
fe7e1ae8aa doc/*.rst: revise captions and section types 2018-10-30 21:50:37 +01:00
Max Kellermann
aa07e8a8fe doc/user.rst: add links to "Listeners" 2018-10-30 21:33:22 +01:00
Max Kellermann
83d598bdfd doc/user.rst: add bind_to_address/port examples 2018-10-30 21:33:10 +01:00
Max Kellermann
0ec31b4aa4 Listen: eliminate listen_add_config_param() 2018-10-30 21:14:39 +01:00
Max Kellermann
a943f4063c event/ServerSocket: add AddFD() overload with AllocatedSocketAddress&& 2018-10-30 20:44:56 +01:00
Max Kellermann
ce9f09c69a event/ServerSocket: make AddAddress() a template 2018-10-30 20:43:52 +01:00
Max Kellermann
3ddc7a5353 event/ServerSocket: include cleanup 2018-10-30 20:19:07 +01:00
Max Kellermann
e575392b94 event/ServerSocket: use class IPv6Address 2018-10-30 20:19:04 +01:00
Max Kellermann
c6f61a699c event/ServerSocket: make OneServerSocket an inner class 2018-10-30 20:16:26 +01:00
Max Kellermann
0307b49f43 event/ServerSocket: make OnAccept() noexcept 2018-10-30 20:13:07 +01:00
Max Kellermann
413ab80295 event/ServerSocket: use C++11 initializer 2018-10-30 20:11:58 +01:00
Max Kellermann
daffefdb10 event/ServerSocket: pass UniqueSocketDescriptor to AddFD() 2018-10-30 20:05:57 +01:00
Max Kellermann
5fb21fbdb1 event/ServerSocket: add noexcept 2018-10-30 19:57:39 +01:00
Max Kellermann
f5857c4689 net/SocketUtil: update API documentation 2018-10-30 19:56:10 +01:00
Max Kellermann
2c388434dd meson.build: re-add -funwind-tables which got lost in v0.20.23 merge 2018-10-30 13:33:10 +01:00
Max Kellermann
c97469283c pcm: build dsd2pcm only if -Dtest=true 2018-10-30 13:31:43 +01:00
Max Kellermann
1f8d707082 python/build/meson.py: use toolchain.libs (for libc++) 2018-10-30 13:29:02 +01:00
Max Kellermann
9b1f44e758 LogInit: work around two Android compiler warnings 2018-10-30 13:23:10 +01:00
Max Kellermann
804ccddf7e pcm/Clamp: convert to constexpr 2018-10-30 00:08:25 +01:00
Max Kellermann
bb5918932b pcm/PcmUtils: rename to Clamp.hxx 2018-10-30 00:05:58 +01:00
Max Kellermann
aa77bc323f pcm/FloatConvert: make IntegerToFloatSampleConvert::Convert() constexpr 2018-10-29 23:52:25 +01:00
Max Kellermann
901229699e Merge tag 'v0.20.23'
release v0.20.23
2018-10-29 23:44:47 +01:00
Max Kellermann
637c96697f release v0.20.23 2018-10-29 23:31:17 +01:00
Max Kellermann
c92f0a1336 test/PcmFormat: add Float/32 bit test 2018-10-29 23:06:40 +01:00
Max Kellermann
8463441afe test/PcmFormat: rename FormatFloat to FormatFloat16 2018-10-29 23:06:37 +01:00
Max Kellermann
9b6a2589e5 Merge branch 'v0.20.x' 2018-10-29 23:06:32 +01:00
Max Kellermann
cc5fab28af pcm/FloatConvert: fix compile-time integer overflow for S32
The compile-time calculation for `factor` overflows because `1<<31`
cannot be represented by `int`.  By casting to `uintmax_t` first, we
can avoid this overflow.

Closes #380
2018-10-29 22:50:54 +01:00
Max Kellermann
a3f7127e72 pcm/FloatConvert: use FloatToIntegerSampleConvert::factor for IntegerToFloatSampleConvert::factor 2018-10-29 22:50:06 +01:00
Max Kellermann
b0a6a569df pcm/FloatConvert: add static_assert on the factor
This assertion currently fails for S32 due to integer overflow (#380).
2018-10-29 22:38:32 +01:00
Max Kellermann
92523f8cf2 input/CdioParanoia: parse_cdio_uri() returns CdioUri
The `bool` return value isn't used anymore, so we can just return the
parsed object instead of passing it as an output parameter.
2018-10-29 14:34:33 +01:00
Max Kellermann
e33c08357a input/CdioParanoia: rename struct cdio_uri to CdioUri 2018-10-29 14:34:30 +01:00
Max Kellermann
2dc5648e57 input/CdioParanoia: use StringAfterPrefixIgnoreCase() 2018-10-29 14:34:30 +01:00
Max Kellermann
d0349880da util/StringCompare: add StringAfterPrefixIgnoreCase() 2018-10-29 14:34:29 +01:00
iamsi
f178163217 Fix typo in build instructions 2018-10-29 13:32:53 +00:00
Max Kellermann
7aa1dceef6 player/Control: move IDLE_PLAYER to Player::SeekDecoder()
This emits the event even if PlayerControl::Play() is used to replay
the current song, which emits the missing "player" idle event.

Closes #381
2018-10-29 12:01:48 +01:00
Max Kellermann
a75d2fdd5a NEWS: mention the new clang crash bug workaround 2018-10-29 12:01:28 +01:00
Max Kellermann
f76544be4c db/update: catch all exceptions 2018-10-29 11:05:50 +01:00
Max Kellermann
1e6c445320 configure.ac: add -funwind-tables to work around clang bug
Replaces the workaround from commit
751fff07fb which fixed only one of many
crash locations.

See:

 https://github.com/MusicPlayerDaemon/MPD/issues/373
 https://github.com/android-ndk/ndk/issues/831
 https://bugs.llvm.org/show_bug.cgi?id=32611
2018-10-29 11:05:35 +01:00
Max Kellermann
e02c1adf79 increment version number to 0.20.23 2018-10-29 11:05:27 +01:00
Max Kellermann
889e4869f9 meson.build: install the SVG icon
This change from commit 61eff1cddf got
lost in the merge.
2018-10-26 15:54:59 +02:00
Max Kellermann
f77135f307 meson.build: install README, NEWS etc. 2018-10-26 15:54:14 +02:00
Max Kellermann
eeae9a04d3 input/Registry: add missing include 2018-10-25 09:21:13 +02:00
Max Kellermann
8bb35e7bb6 decoder/Thread: reimplement HasRemoteTagScanner() using the InputPlugin list 2018-10-25 09:09:21 +02:00
Max Kellermann
3e78c9ab48 input/Plugin: add attribute prefixes 2018-10-24 20:25:32 +02:00
Max Kellermann
9ec86acb9c decoder/Thread: enable output tags for Tidal and Qobuz
Fixes formatted paths in the `recorder` output, closing #345.
2018-10-24 16:38:26 +02:00
Max Kellermann
426bde3f75 decoder/Thread: move check to SongHasVolatileTags() 2018-10-24 16:32:41 +02:00
Max Kellermann
30e22b753b tag/Chromaprint: OO wrapper for a ChromaprintContext 2018-10-24 10:52:45 +02:00
Max Kellermann
f7141c9201 decoder/Control: convert to class, make various attributes private 2018-10-24 10:47:34 +02:00
Max Kellermann
c2a2573aa5 Merge tag 'v0.20.22'
release v0.20.22
2018-10-23 20:10:57 +02:00
Max Kellermann
9274bc15bc release v0.20.22 2018-10-23 19:52:37 +02:00
Max Kellermann
751fff07fb input/Error: work around clang bug leading to crash
Closes #373
2018-10-23 19:52:22 +02:00
Max Kellermann
f7d1408a1a android/build.py: improved libc++ linker flags (for NDK r18)
The flag `-stdlib=libc++` doesn't appear to work because it attempts
to load `libc++` and not `libc++_static`, and it omits `libc++abi`.
2018-10-23 19:32:25 +02:00
Max Kellermann
e4e14ef6b0 Makefile.am: include mpd.svg in source tarball 2018-10-23 18:48:01 +02:00
Max Kellermann
005e691339 decoder/fluidsynth: adapt to API change in version 2.0
Closes #360
2018-10-23 18:44:28 +02:00
Max Kellermann
61eff1cddf Makefile.am: install the SVG icon
Closes #366
2018-10-22 18:39:50 +02:00
Max Kellermann
c26703b7e6 SongFilter: check value.empty() after checking tag fallbacks
In this new order, a filter 'AlbumArtist ""' matches only on songs
which neither have `AlbumArtist` nor `Artist`.
2018-10-22 18:34:47 +02:00
Max Kellermann
66ab2de578 Merge branch 'v0.20.x' 2018-10-22 18:20:29 +02:00
Max Kellermann
db27bb76e2 db: fix broken command "list ... group"
Grouping in the "list" command was completely broken from the start,
unlike "count group".  I have no idea what I have been thinking when I
wrote commit ae178c77bd, but it didn't
make any sense.

This commit is a rewrite of the feature.

For clients to be able to detect this feature, this commit also
increments the protocol version.
2018-10-22 13:08:24 +02:00
Max Kellermann
7cfe929c36 db/Count: print empty group if song without grouped tag exists
Be consistent with "list" responses.
2018-10-22 12:42:18 +02:00
Max Kellermann
6c06244e83 db/Count: move code to tag/VisitCallback.hxx 2018-10-22 11:50:51 +02:00
Max Kellermann
53448e4633 tag/Fallback: add tag fallbacks for AlbumArtistSort, ArtistSort
Just like AlbumArtist falls back to Artist, AlbumArtistSort should
fall back tom AlbumArtist, ArtistSort and finally Artist.

Closes #355
2018-10-22 10:52:42 +02:00
Max Kellermann
21adc78713 SongFilter: use ApplyTagFallback() 2018-10-22 10:46:26 +02:00
Max Kellermann
0340b01392 db/Count: use ApplyTagFallback() 2018-10-22 10:46:26 +02:00
Max Kellermann
94aed92e9a tag/Set: move code to ApplyTagWithFallback() 2018-10-22 10:10:43 +02:00
Max Kellermann
6b9966e969 tag/Set: include cleanup 2018-10-22 10:09:56 +02:00
Max Kellermann
4bc5333995 tag/Set: use TagBuilder::AddItemUnchecked()
This improves the workaround from commit
b5ba94f1de and actually gives a useful
result for "list" with a disabled tag.
2018-10-22 10:06:04 +02:00
Max Kellermann
ff58b8d255 tag/Builder: move code to AddItemUnchecked() 2018-10-22 10:03:47 +02:00
Max Kellermann
e28d1e0f65 decoder/mad: convert Tag** parameter to just Tag* 2018-10-22 09:44:54 +02:00
Max Kellermann
a491d8ae24 decoder/mad: use class UniqueId3Tag 2018-10-22 09:44:50 +02:00
Max Kellermann
3cd5dd15f8 decoder/mad: don't initialize xing::frames 2018-10-22 09:44:48 +02:00
Max Kellermann
562ae44d38 decoder/mad: remove unused attribute from xing::magic 2018-10-22 09:44:46 +02:00
Max Kellermann
92541dedc0 Merge branch 'master' of git://github.com/skidoo23/MPD 2018-10-22 09:44:36 +02:00
Max Kellermann
3f3f0af543 python/build/libs.py: upgrade CURL to 7.61.1 2018-10-22 08:53:30 +02:00
Max Kellermann
850d208b7b python/build/libs.py: upgrade Opus to 1.3 2018-10-22 08:44:11 +02:00
Max Kellermann
da563940b4 python/build/libs.py: upgrade libmpdclient to 2.16 2018-10-22 08:32:32 +02:00
Max Kellermann
650a67dc38 decoder/mad: use mad_bit_skip() where appropriate 2018-10-19 20:24:16 +02:00
Max Kellermann
c63f24e58e decoder/audiofile: larger stack buffer to reduce overhead 2018-10-19 20:04:28 +02:00
Max Kellermann
3be8b02cc2 decoder/sndfile: make vio constexpr
Use `const_cast` to be able to pass it to sf_open_virtual() which has
a wrong parameter declaration.
2018-10-19 19:51:17 +02:00
Max Kellermann
bdfaea0c25 decoder/mad: move parse_id3_mixramp() to src/tag/Id3ReplayGain.cxx 2018-10-19 19:45:32 +02:00
Max Kellermann
ed5c0d6546 tag/Id3Scan: make struct id3_tag pointers const 2018-10-19 19:43:03 +02:00
Max Kellermann
86dc621086 tag/Rva2: make struct id3_tag pointers const 2018-10-19 19:41:59 +02:00
skidoo23
fbea965c70 tag: new tag Label 2018-10-17 20:33:03 +02:00
Max Kellermann
a2cd66ed6f doc: remove the DocBook protocol documentation, has been converted to Sphinx 2018-10-17 10:27:06 +02:00
Max Kellermann
68894e822a doc/index.rst: fix the converted protocol documentation
Fix links and lots of broken markup.
2018-10-17 10:17:41 +02:00
Max Kellermann
937f49f1e9 doc/index.rst: link the converted protocol documentation 2018-10-17 10:17:38 +02:00
Max Kellermann
ee59e20c28 Merge branch 'protocol2rst' of git://github.com/rain0r/MPD 2018-10-17 09:22:30 +02:00
Max Kellermann
01b6e1cbf2 test: use GTest instead of cppunit 2018-10-16 21:26:04 +02:00
Max Kellermann
eefc0f5d80 input/Error: add noexcept 2018-10-16 21:26:04 +02:00
Max Kellermann
1f94cea889 doc/meson.build: fix target for "upload" target 2018-10-16 15:28:37 +02:00
skidoo23
69749eb591 decoder/sidplay: fix typo to avoid linker error with meson (libsidplayfp) 2018-10-16 14:56:40 +02:00
Max Kellermann
94592c1406 build with Meson instead of autotools
So long, autotools!  This is my last MPD related project to migrate
away from it.  It has its strengths, but also very obvious weaknesses
and weirdnesses.  Today, many of its quirks are not needed anymore,
and are cumbersome and slow.  Now welcome our new Meson overlords!
2018-10-14 23:41:38 +02:00
Max Kellermann
13ce142df1 python/build/meson.py: generate windres line 2018-10-14 23:41:38 +02:00
Max Kellermann
89bf4c5fad python/build/meson.py: move two functions to the top level 2018-10-14 21:44:15 +02:00
skidoo23
f80ebf68b0 decoder/wavpack: fix warning 'unused variable is_dsd' when compiled with --enable-dsd=no 2018-10-12 01:02:34 +02:00
Max Kellermann
1155a29096 Merge branch 'cdda_set_cdspeed' of git://github.com/andrewbasterfield/MPD 2018-10-08 21:16:52 +02:00
Max Kellermann
030e603940 decoder/gme: fix include
Broken since commit 08f77c2b60
2018-10-07 22:33:52 +02:00
Andrew Basterfield
9c1bf9ac5f Remove some extraneous leftover debugging 2018-10-07 19:21:38 +01:00
Andrew Basterfield
5f8dac6822 Add some docs for CDParanoia extraction speed 2018-10-07 19:17:51 +01:00
Andrew Basterfield
2f07b8f482 Set cdrive speed hint for cdparanoia 2018-10-06 20:18:19 +01:00
Max Kellermann
6c40a27809 db/update/ExcludeList: fix variable name in #else block 2018-10-01 08:40:53 +02:00
Max Kellermann
8736a3533b db/update/ExcludeList: add missing #ifdef 2018-10-01 08:40:15 +02:00
Max Kellermann
608d232373 util/SliceBuffer: re-add line which got lost in the last commit 2018-09-23 19:33:34 +02:00
Max Kellermann
1702e98fdf util/SliceBuffer: move code to DiscardMemory() 2018-09-23 19:15:28 +02:00
Max Kellermann
2ec94c0497 player/Control: start thread on demand
Keep MPD's footprint small until playback is requested.
2018-09-23 17:32:34 +02:00
Max Kellermann
bf372e3e1f player/Control: move public methods up 2018-09-23 17:28:41 +02:00
Max Kellermann
0d971963fd player/Control: make several methods private 2018-09-23 17:27:42 +02:00
Max Kellermann
287cff40b9 player/Control: remove Lock(), Unlock() 2018-09-23 17:27:42 +02:00
Max Kellermann
0e0bc7976f player/Control: add LockGetSyncInfo() 2018-09-23 17:17:57 +02:00
Max Kellermann
8c638c50a3 player/Thread: remove obsolete buffered_before_play attribute 2018-09-23 16:50:04 +02:00
Max Kellermann
5b2374b949 player/Thread: calculate buffered_before_play based on a fixed duration
Previously, there was the setting `buffered_before_play` which
specified a percentage of the audio buffer, defaulting to `10%`.  That
was working well enough for quite some time, until high-quality audio
formats became common.

At 44.1 kHz, 16 bit stereo, MPD collected 2.3 seconds worth of data in
the buffer before starting playback.  With the same default settings
and 192 kHz, 24 bit stereo, that was only 0.27 seconds.

Making this depend on the byte size only leads to high latency at low
quality, and too little data at high quality.  The natural choice
would be to use a duration instead of a byte size, which should give
the same good experience with all audio formats.

Since the `buffered_before_play` configuration setting was not
understood well by users and caused more harm than good, this commit
deprecates it.  It has now no effect.
2018-09-23 15:46:29 +02:00
Max Kellermann
c1600bcf3d player/Thread: copy buffered_before_play 2018-09-23 15:46:27 +02:00
Max Kellermann
a82d864c91 config/File: print warning about deprecated options 2018-09-23 15:43:38 +02:00
Max Kellermann
dcac32a6c4 AudioFormat: add implicit cast to duration::rep
Fixes integer truncation bugs (closes #359).
2018-09-23 15:15:53 +02:00
Max Kellermann
5286477f73 Chrono: remove unnecessary typedef rep
It is already inherited by the base class, and we don't need to import
it explicitly.
2018-09-23 15:15:18 +02:00
Max Kellermann
2f3845ef51 player/Thread: remove buffered_before_play from decoder_wakeup_threshold formula
Simplify the formula, and I guess this makes the formula more
reliable.  Imagine somebody configured `buffered_before_play` larger
than 25%; then the decoder would be woken up all the time.  This
doesn't seem logical.  On the other hand, it's easy to understand that
the decoder should be woken up below 75% buffer fill.
2018-09-23 15:00:47 +02:00
Max Kellermann
1191025bbf player/Thread: add attribute decoder_wakeup_threshold
Calculate the value only once.
2018-09-22 19:56:00 +02:00
Max Kellermann
bfd261929e AudioFormat: remove obsolete method GetTimeToSize() 2018-09-22 19:39:20 +02:00
Max Kellermann
84de88841b player/CrossFade: use AudioFormat::SizeToTime() instead of GetTimeToSize() 2018-09-22 19:37:45 +02:00
Max Kellermann
224400074c player/CrossFade: use std::chrono::duration 2018-09-22 19:37:02 +02:00
Max Kellermann
863722545f player/CrossFade, ...: use lround() 2018-09-22 19:08:03 +02:00
Max Kellermann
d3d1d37782 AudioFormat: add TimeToSize(), SizeToTime() 2018-09-21 20:51:08 +02:00
Max Kellermann
1a2012a97e player/Control: convert total_play_time to FloatDuration 2018-09-21 20:50:15 +02:00
Max Kellermann
90f4e97751 decoder/Client: use std::chrono::duration<double> instead of raw double 2018-09-21 20:42:34 +02:00
Max Kellermann
d1bcd98f79 Chrono: add FloatDuration 2018-09-21 20:42:30 +02:00
Max Kellermann
39542de69d Chrono: add static method Cast() 2018-09-21 20:41:23 +02:00
Max Kellermann
1d00d55d53 player/Thread: stop buffering if buffer is full
Shouldn't ever happen, but who knows...
2018-09-21 19:05:25 +02:00
Max Kellermann
a190db0873 player/Thread: simplify loop condition 2018-09-21 18:58:38 +02:00
Max Kellermann
e3142312bb player/Control: convert to class 2018-09-21 18:12:28 +02:00
Max Kellermann
e5d1ac0bd0 player/Thread: move functions into PlayerControl 2018-09-21 18:09:14 +02:00
Max Kellermann
c0411fa412 decoder/Thread: add noexcept 2018-09-21 17:58:34 +02:00
Max Kellermann
781e690012 player/Thread: catch and log initialization errors 2018-09-21 17:35:32 +02:00
Max Kellermann
9a2d71341e player/Control: apply CamelCase to struct player_status 2018-09-21 17:22:35 +02:00
Max Kellermann
6db6d3c50c player/Thread: move StartPlayerThread() into PlayerControl 2018-09-21 17:14:19 +02:00
Max Kellermann
0e2c597884 MusicBuffer: remove noexcept from constructor
The `SliceBuffer` constructor can throw.
2018-09-21 17:11:52 +02:00
Max Kellermann
debdf9bb96 decoder/{Thread,Control,...}: rename source files, drop prefix 2018-09-21 17:01:24 +02:00
Max Kellermann
218d9383d7 decoder/Thread: move decoder_thread_start() into DecoderControl 2018-09-21 16:57:54 +02:00
Max Kellermann
af64bd5088 Thread/Thread: disallow copying 2018-09-21 16:55:09 +02:00
Max Kellermann
050f81c4fe Thread/Thread: document Start() exception 2018-09-21 16:53:52 +02:00
Rainer Hihn
6ebe772e2f Proposal for CMDSYN 2018-09-21 10:09:37 +02:00
Max Kellermann
c9ee6dd4ca doc/user.rst: document the sles output plugin 2018-09-11 20:44:54 +02:00
skidoo23
38b183fac2 user.rst: fixed typo state_file_interval 2018-09-11 16:35:57 +02:00
Max Kellermann
ab678787f4 java/Ref: API doc line breaks 2018-09-06 20:04:46 +02:00
Max Kellermann
23556585ca java/Ref: add LocalRef::GetEnv() 2018-09-06 20:04:40 +02:00
Max Kellermann
728e4e9a38 util/StringCompare: add StringEndsWithIgnoreCase(), StringStartsWithIgnoreCase() 2018-09-06 19:52:43 +02:00
Max Kellermann
2d6f9f9a9c Util/WStringAPI: non-Windows implementation of _wcs*cmp() 2018-09-06 19:49:45 +02:00
Max Kellermann
c2e2e5543e util/WStringAPI: add wcscoll() wrapper 2018-09-06 19:39:28 +02:00
Max Kellermann
349d8eb248 util/WStringCompare: add "noexcept" 2018-09-06 19:35:09 +02:00
Max Kellermann
94b96bde9b util/WStringCompare: wcpcpy() and wcsdup() are available on Android 2018-09-06 19:33:50 +02:00
Max Kellermann
45ffc864c5 util/StringCompare: add more function attributes 2018-09-06 19:23:13 +02:00
Max Kellermann
19d9ce260a fs/io/FileOutputStream: disallow copying 2018-09-03 14:36:01 +02:00
Max Kellermann
0701333ec1 db/proxy: forward filter as expression to server
This adds support for the full set of MPD 0.21 filter types.
2018-09-02 22:39:45 +02:00
Max Kellermann
a8e70f0901 db/proxy: forward sort and window to server 2018-09-02 17:51:30 +02:00
Max Kellermann
c7c32a3ce9 db/Print: move sort/window emulation code to class DatabaseVisitorHelper
That way, each plugin can decide to implement it better.
2018-09-02 17:37:02 +02:00
Max Kellermann
53170ca2f2 .travis.yml: install Boost 1.67 from a PPA
Apparently, Travis-CI will never upgrade its ancient Ubuntu Trusty,
so I have to get Boost from somewhere else.

Thanks to Martin Hierholzer for his PPA.
2018-09-02 17:28:01 +02:00
Max Kellermann
94694e0f33 db/simple: pass DatabaseSelection to WalkMount()
This passes the new `sort` and `window` attributes to the mounted
database.
2018-09-02 17:13:35 +02:00
Max Kellermann
a73176a1e9 db/Helpers: fix include guard 2018-09-02 12:32:33 +02:00
Max Kellermann
e6a974a93e db/Selection: add sort and window
Remove them as parameters from `db_selection_print()`.
2018-09-02 11:10:04 +02:00
Max Kellermann
9894967fcb db/Selection: move bool attribute to the end
May allow a better memory layout.
2018-09-02 11:10:04 +02:00
Max Kellermann
92da483ecd db/Selection: add noexcept 2018-09-02 11:10:04 +02:00
Max Kellermann
9cc960ac5e db/proxy: require MPD 0.19 2018-09-02 11:07:32 +02:00
Max Kellermann
18dd082f1e db/proxy: use ~0 instead of -1
No undefined behavior.
2018-09-02 11:06:08 +02:00
Max Kellermann
81b734be10 db/Interface: add "noexcept" 2018-09-02 10:20:48 +02:00
Max Kellermann
c59be7ced3 db/Interface: add more documentation about exceptions 2018-09-02 10:19:10 +02:00
Max Kellermann
c5c4d4a57e db/proxy: forward the audio format
Requires libmpdclient 2.15.
2018-09-02 08:38:23 +02:00
Max Kellermann
2d0b429b6a db/proxy: require libmpdclient 2.9 2018-09-02 08:21:11 +02:00
Max Kellermann
60620d9af5 db/Print: move variable i 2018-09-02 08:17:22 +02:00
Max Kellermann
15b2a4862e protocol/RangeArg: add Contains() 2018-09-02 08:17:22 +02:00
Max Kellermann
2915d2dd0f protocol/RangeArg: add IsAll() 2018-09-02 08:17:22 +02:00
Max Kellermann
590687fdea protocol/RangeArg: eliminate SetAll() 2018-09-02 08:17:22 +02:00
Max Kellermann
993f8d6a5e db/Print: pass RangeArg to db_selection_print() 2018-09-02 08:17:22 +02:00
Max Kellermann
68f824a186 protocol/ArgParser: move struct RangeArg to separate header 2018-09-02 08:17:22 +02:00
Max Kellermann
b9cca49e14 lib/dbus/ReadIter: switch off -Wshadow on GCC<8
GCC 6.3.0 emits bogus warnings like this:

 In file included from src/lib/dbus/UDisks2.cxx:22:0:
 src/lib/dbus/ReadIter.hxx: In instantiation of 'ODBus::ReadMessageIter::ForEachProperty(F&&)::<lambda(auto:2&&)> [with auto:2 = ODBus::ReadMessageIter; F = std::_Bind<void (*(std::reference_wrapper<UDisks2::Object>, std::_Placeholder<1>, std::_Placeholder<2>))(UDisks2::Object&, const char*, ODBus::ReadMessageIter&&) noexcept>]':
 src/lib/dbus/ReadIter.hxx:102:6:   required from 'ODBus::ReadMessageIter::ForEachRecurse(int, F&&)::<lambda(auto:1&&)> [with auto:1 = ODBus::ReadMessageIter&; F = ODBus::ReadMessageIter::ForEachProperty(F&&) [with F = std::_Bind<void (*(std::reference_wrapper<UDisks2::Object>, std::_Placeholder<1>, std::_Placeholder<2>))(UDisks2::Object&, const char*, ODBus::ReadMessageIter&&) noexcept>]::<lambda(auto:2&&)>]'
 src/lib/dbus/ReadIter.hxx:92:5:   required from 'void ODBus::ReadMessageIter::ForEach(int, F&&) [with F = ODBus::ReadMessageIter::ForEachRecurse(int, F&&) [with F = ODBus::ReadMessageIter::ForEachProperty(F&&) [with F = std::_Bind<void (*(std::reference_wrapper<UDisks2::Object>, std::_Placeholder<1>, std::_Placeholder<2>))(UDisks2::Object&, const char*, ODBus::ReadMessageIter&&) noexcept>]::<lambda(auto:2&&)>]::<lambda(auto:1&&)>]'
 src/lib/dbus/ReadIter.hxx:101:3:   required from 'void ODBus::ReadMessageIter::ForEachRecurse(int, F&&) [with F = ODBus::ReadMessageIter::ForEachProperty(F&&) [with F = std::_Bind<void (*(std::reference_wrapper<UDisks2::Object>, std::_Placeholder<1>, std::_Placeholder<2>))(UDisks2::Object&, const char*, ODBus::ReadMessageIter&&) noexcept>]::<lambda(auto:2&&)>]'
 src/lib/dbus/ReadIter.hxx:114:3:   required from 'void ODBus::ReadMessageIter::ForEachProperty(F&&) [with F = std::_Bind<void (*(std::reference_wrapper<UDisks2::Object>, std::_Placeholder<1>, std::_Placeholder<2>))(UDisks2::Object&, const char*, ODBus::ReadMessageIter&&) noexcept>]'
 src/lib/dbus/UDisks2.cxx:71:30:   required from here
 src/lib/dbus/ReadIter.hxx:114:53: error: declaration of 'ODBus::ReadMessageIter&& i' shadows a parameter [-Werror=shadow]
    ForEachRecurse(DBUS_TYPE_DICT_ENTRY, [&f](auto &&i){
                                                      ^
 src/lib/dbus/ReadIter.hxx:101:33: note: shadowed declaration is here
    ForEach(arg_type, [&f](auto &&i){
                                  ^
2018-09-02 08:17:21 +02:00
Max Kellermann
931b571e3d neighbor/udisks: add this-> to work around GCC 6 bug
Since `this` was captured, it does not need to be specified, but GCC 6
can't do it.  Since we want to support the standard compiler from
Debian Stretch (stable), we need to work around this problem:

 src/neighbor/plugins/UdisksNeighborPlugin.cxx:239:12: error: cannot call member function 'void UdisksNeighborExplorer::Insert(UDisks2::Object&&)' without object
       Insert(std::move(o));
       ~~~~~~^~~~~~~~~~~~~~

This fixes #300 which I previously thought was a different bug.
2018-09-02 08:12:51 +02:00
Rainer Hihn
b7b93bb67e First draft of the protocol as rst 2018-08-28 18:08:22 +02:00
Max Kellermann
35eca08d48 java/*: add noexcept 2018-08-28 13:27:28 +02:00
Max Kellermann
7137ca375a Merge branch 'v0.20.x' 2018-08-28 13:27:04 +02:00
Max Kellermann
282859a62a java/String: include cleanup 2018-08-28 13:07:28 +02:00
Max Kellermann
fbeb5eefdc java/Class: drop unnecessary namespace spec 2018-08-28 13:01:01 +02:00
Max Kellermann
85bada0505 java/Class: use DiscardException() in FindOptional()
Sometimes, the JVM returns a non-nullptr value with an exception
pending (seen on Android 1.6, maybe a Dalvik bug?).  Let's catch all
such cases.
2018-08-28 13:00:08 +02:00
Max Kellermann
fe2f7a3e5a configure.ac: add automake conditional "LINUX" 2018-08-22 16:09:40 +02:00
Max Kellermann
98eed1f5ab system/EpollFD: use class UniqueFileDescriptor 2018-08-22 16:09:40 +02:00
Max Kellermann
5d0a463f09 system/{Epoll,Event,Signal}FD: relicense to BSD-2 2018-08-22 15:40:45 +02:00
Max Kellermann
dd461400fb system/EPollFD: rename to EpollFD 2018-08-22 15:40:45 +02:00
Max Kellermann
b1390ec27f system/UniqueFileDescriptor: make the "int" constructor public 2018-08-22 15:40:45 +02:00
Max Kellermann
dda5516eec net/IPv6Address: pass reference to Cast() 2018-08-21 20:21:41 +02:00
Max Kellermann
adc5c5db88 net/IPv4Address: pass reference to Cast() 2018-08-21 20:16:57 +02:00
Max Kellermann
0642ce4795 fs/io/FileOutputStream: make linkat() mandatory on Linux 2018-08-21 19:02:03 +02:00
Max Kellermann
d11e1d5880 fs/io/FileOutputStream: add "noexcept" 2018-08-21 18:56:14 +02:00
Max Kellermann
b143477774 fs/io/BufferedReader: add "noexcept" to constructor 2018-08-21 18:52:57 +02:00
Max Kellermann
d092a88a93 system/Open: new UniqueFileDescriptor constructing library 2018-08-21 18:27:39 +02:00
Max Kellermann
ab7597b089 fs/io/FileReader: use class UniqueFileDescriptor 2018-08-21 18:26:36 +02:00
Max Kellermann
84df470008 fs/io/FileReader: use std::exchange() 2018-08-21 18:26:34 +02:00
Max Kellermann
5ca0b7a28f fs/io/FileReader: add "noexcept" 2018-08-21 18:26:09 +02:00
Max Kellermann
21d621e7ad fs/io/FileReader: simplify includes 2018-08-21 18:26:09 +02:00
Max Kellermann
d036e20826 system/FileDescriptor: add openat() wrapper 2018-08-21 18:15:37 +02:00
Max Kellermann
9151b84c25 net/AllocatedSocketAddress: convert operator== to template 2018-08-21 12:26:19 +02:00
Max Kellermann
5d7dd12f7a net/SocketDescriptor: add multicast methods 2018-08-21 11:37:19 +02:00
Max Kellermann
21783ff5f7 net/SocketDescriptor: remove unnecessary SO_REUSEPORT check 2018-08-21 11:35:29 +02:00
Max Kellermann
fd923d5d96 net/SocketDescriptor: add Shutdown() 2018-08-21 11:31:58 +02:00
Max Kellermann
ebf607eef8 net/SocketDescriptor: fix SOCK_NONBLOCK flag in CreateSocketPairNonBlock() 2018-08-21 11:27:15 +02:00
Max Kellermann
e092eadd8d net/SocketDescriptor: add "noexcept" 2018-08-21 11:08:34 +02:00
Max Kellermann
185148f57c net/SocketAddress: add cast to size_type 2018-08-21 11:06:05 +02:00
Max Kellermann
ede7434901 net/SocketAddress: add GetSteadyPart() 2018-08-21 10:57:46 +02:00
Max Kellermann
ba3b422ce5 net/SocketDescriptor: make accept4() mandatory on Linux 2018-08-21 10:53:54 +02:00
Max Kellermann
1f3ce380ed net/SocketAddress: reimplement GetPort() using IPv4Address::GetPort() 2018-08-21 10:49:55 +02:00
Max Kellermann
dfc1f6342a net/SocketAddress: add IsV4Mapped() 2018-08-21 10:48:37 +02:00
Max Kellermann
94092f1f90 net/SocketAddress: reimplement IsV6Any() using IPv6Address::IsAny() 2018-08-21 10:46:20 +02:00
Max Kellermann
a84b83f20f net/IPv6Address: new class 2018-08-21 10:39:54 +02:00
Max Kellermann
614e410fe7 net/Resolver: update copyright year 2018-08-21 10:30:24 +02:00
Max Kellermann
4a1e885c0a net/Resolver: replace with more advanced implementation
The new implementation is copied from another project and is
BSD-licensed.  It is exception-safe and can parse IPv6 scope ids with
interface names.
2018-08-21 08:26:12 +02:00
Max Kellermann
eee91aa4ea util/Exception: update copyright 2018-08-21 08:20:52 +02:00
Max Kellermann
855750c784 util/{Const,Writable}Buffer: add method SetEnd() 2018-08-21 08:20:17 +02:00
Max Kellermann
4f2163e76c system/FileDescriptor: include cleanup 2018-08-20 17:25:42 +02:00
Max Kellermann
eef66dee04 system/FileDescriptor: pass FileDescriptor to CheckDuplicate() 2018-08-20 17:23:14 +02:00
Max Kellermann
7ad440ca1c net/SocketDescriptor: make eventfd() and signalfd() mandatory on Linux 2018-08-20 17:16:07 +02:00
Max Kellermann
13b3e9e7b3 system/FileDescriptor: make inotify_init1() mandatory on Linux 2018-08-20 17:12:50 +02:00
Max Kellermann
8106929d60 system/FileDescriptor: add pipe2() wrapper 2018-08-20 17:05:29 +02:00
Max Kellermann
795baed3f5 system/FileDescriptor: make pipe2() mandatory on Linux 2018-08-20 17:04:43 +02:00
Max Kellermann
5487d40be9 system/FileDescriptor: add operator!= 2018-08-20 16:49:14 +02:00
Max Kellermann
5e512763d3 system/UniqueFileDescriptor: make the base class public 2018-08-20 16:38:27 +02:00
Max Kellermann
a65d02d3ae system/FileDescriptor: add "noexcept" 2018-08-20 16:34:47 +02:00
Max Kellermann
2156fc64f4 util/StringStrip: more API documentation 2018-08-20 16:30:46 +02:00
Max Kellermann
441440101d util/StringStrip: add more "nonnull" attributes 2018-08-20 16:28:43 +02:00
Max Kellermann
ec54754e22 Compiler.h: move to util/ 2018-08-20 16:19:17 +02:00
Max Kellermann
0ebba73cb8 net/SocketDescriptor: add method GetPeerCredentials() 2018-08-20 16:11:17 +02:00
Max Kellermann
50c7337965 net/SocketDescriptor: add GetType(), IsStream() 2018-08-20 16:06:58 +02:00
Max Kellermann
b5c569cd30 system/FileDescriptor: add IsPipe(), IsSocket() 2018-08-20 16:05:03 +02:00
Max Kellermann
11396d4fba net/SocketAddress: add method GetLocalRaw() 2018-08-20 15:59:17 +02:00
Max Kellermann
4c6ae4e9e8 net/IPv4Address: add various helper methods 2018-08-20 15:57:13 +02:00
Max Kellermann
9cb9154b08 net/IPv4Address: add struct sockaddr_in constructor 2018-08-20 15:57:13 +02:00
Max Kellermann
234a6193bb net/SocketAddress: make GetAddress() constexpr 2018-08-20 15:57:13 +02:00
Max Kellermann
2bf5f32224 net/IPv4Address: add API documentation 2018-08-20 15:50:25 +02:00
Max Kellermann
82d0f68acf net/IPv4Address: add static method ConstructInAddrBE() 2018-08-20 15:48:52 +02:00
Max Kellermann
616c8383c0 net/IPv4Address: check _WIN32 instead of WIN32 2018-08-20 15:48:49 +02:00
Max Kellermann
5de46268af net/IPv4Address: add "noexcept" 2018-08-20 15:43:35 +02:00
Max Kellermann
489e11072e util/WritableBuffer: add ConstBuffer cast operator 2018-08-20 15:36:50 +02:00
Max Kellermann
5e2af15e94 util/Manual: add static method Cast() 2018-08-20 15:35:43 +02:00
Max Kellermann
3fbb54e0a4 util/IterableSplitString: use operator==(nullptr_t) 2018-08-20 15:35:09 +02:00
Max Kellermann
fe6de14faf util/StringView: add ConstBuffer cast constructors 2018-08-20 15:34:07 +02:00
Max Kellermann
e85b9960f0 util/StringCompare: use StringAPI.hxx 2018-08-20 15:33:16 +02:00
Max Kellermann
75c836fbd9 util/StringAPI: use StringCompare() in StringIsEqual() 2018-08-20 15:31:09 +02:00
Max Kellermann
94b1025780 util/RuntimeError: fix typo 2018-08-20 15:22:24 +02:00
Max Kellermann
36ca9d01fb util/ForeignFifoBuffer: shift the buffer in MoveFrom() on demand
The API documentation says "move as much data as possible", and if
there is room at the head of the buffer, we should use that if the
room after the tail is not large enough.
2018-08-20 15:21:05 +02:00
Max Kellermann
3bceed1b53 util/ForeignFifoBuffer: add "noexcept" 2018-08-20 14:53:39 +02:00
Max Kellermann
90de2c4bd6 util/Exception: move code to NestCurrentException() 2018-08-20 14:52:54 +02:00
Max Kellermann
9d63c8220b util/Cast: reverse operands in ContainerAttributeOffset()
The result shall be positive.
2018-08-20 14:23:02 +02:00
Max Kellermann
edd9d16c84 util/Cast: move OffsetPointer() to OffsetPointer.hxx 2018-08-20 13:46:18 +02:00
Max Kellermann
ec373eba5d util/BindMethod: add "noexcept" 2018-08-20 13:45:41 +02:00
Max Kellermann
0dfb27b7e5 util/StringAPI: stpcpy() was added in Bionic API level 21 2018-08-20 13:31:23 +02:00
Thomas Guillem
735f62be0c storage/nfs: implement follow 2018-08-20 11:29:27 +02:00
Thomas Guillem
a04e01d5f5 lib/nfs/Connection: add Lstat 2018-08-20 11:29:11 +02:00
Max Kellermann
b03f05f28a configure.ac: require at least libnfs 1.11
This is the version in Debian Stretch (stable).
2018-08-20 11:28:30 +02:00
Max Kellermann
0b7d7fe069 Merge branch 'v0.20.x' 2018-08-20 11:27:56 +02:00
Max Kellermann
cf96135125 android/Main: remove SDK_INT diversion
MPD has minSdkVersion=21 which is above all the checks here.
2018-08-20 11:25:47 +02:00
Max Kellermann
1ff97783ea Makefile.am: use $(AM_V_GEN) and $(AM_V_at) 2018-08-20 11:22:56 +02:00
Max Kellermann
2bc42c6445 Makefile.am: use $(MKDIR_P) instead of "mkdir -p" 2018-08-20 11:13:25 +02:00
Max Kellermann
49372a222f Makefile.am: use $(@D)/$(@F) instead of $(dir/notdir ...) 2018-08-20 11:04:35 +02:00
Thomas Guillem
9127afbf3f lib/nfs/Connection: use nfs_stat64_async
Since nfs_stat_async is deprecated.
2018-08-20 10:51:24 +02:00
Max Kellermann
f2caac595a configure.ac: specify minimum libnfs version 1.9.5
This is the version in Debian Jessie (oldstable), a reasonable "old
enough" version to keep support for.
2018-08-20 10:51:24 +02:00
Max Kellermann
616abdda26 Merge branch 'v0.20.x' 2018-08-20 00:19:31 +02:00
Thomas Guillem
14d3a7ae83 android: use a gray notification icon 2018-08-20 00:07:35 +02:00
Thomas Guillem
f37ab5482b android: improve Settings UI and run mpd on boot
add 2 preferences to:
 - enable Wakelock when MPD is running (prevent suspend)
 - run MPD on boot

and display MPD logs
2018-08-20 00:07:18 +02:00
Thomas Guillem
ef38dbe5bf android: fix AndroidManifest.xml warnings
- <uses-permission> must be before <application>
 - specify allowBackup (default)
2018-08-20 00:07:18 +02:00
Thomas Guillem
54a5491b86 android: Main is now a service
- add Settings: Activity to start / stop MPD Service (Main).

- Main is a service that run in foreground with a notification. See
  Service.startForeground documentation for more details.

- Main.Client is used to control the service: start or stop it and also receive
  callbacks when service encounters an error, is killed, is started or is
  stopped.

- Main.start to start the service without any fallback.
2018-08-19 23:35:49 +02:00
Thomas Guillem
aff070bcbb android: add LogListener
A Java object to send logs on the android side.
2018-08-19 23:32:24 +02:00
Max Kellermann
5af2632d4f Makefile.am: use javac instead of javah to generate JNI header
javah is deprecated.
2018-08-19 23:27:12 +02:00
Max Kellermann
cc64c715a2 db/update/Service: Enqueue() throws on error 2018-08-19 23:15:52 +02:00
Max Kellermann
9999914c74 Main: throw exception instead of calling FatalError() 2018-08-19 23:13:29 +02:00
Max Kellermann
bd32a11016 config/Global: remove obsolete library 2018-08-19 23:08:41 +02:00
Max Kellermann
140aeea300 Main: allocate ConfigData on the stack 2018-08-19 23:08:23 +02:00
Max Kellermann
afd0fe666a config/Global: move config_global_check() to Check.cxx 2018-08-19 23:01:30 +02:00
Max Kellermann
4accc1f159 test/run_neighbor_explorer: allocate ConfigData on the stack 2018-08-19 22:41:58 +02:00
Max Kellermann
80839b5372 test/run_input: allocate ConfigData in class GlobalInit 2018-08-19 22:41:08 +02:00
Max Kellermann
dafa3f985a test/run_decoder: allocate ConfigData in class GlobalInit 2018-08-19 22:40:36 +02:00
Max Kellermann
f865e1393c test/dump_rva2: remove obsolete fake function config_get_string() 2018-08-19 22:39:22 +02:00
Max Kellermann
c99416fbe0 test/dump_playlist: allocate ConfigData on the stack 2018-08-19 22:36:52 +02:00
Max Kellermann
3caef29b93 test/DumpDatabase: allocate ConfigData on the stack 2018-08-19 22:34:10 +02:00
Max Kellermann
5f95c07305 config/Path: add InitPathParser()
Eliminate yet another access to the global ConfigData instance.
2018-08-19 22:29:39 +02:00
Max Kellermann
1a9659ef45 output/Init: pass global configuration in struct AudioOutputDefaults 2018-08-19 07:52:23 +02:00
Max Kellermann
aaa438e745 mixer/Type: mixer_type_parse() throws on error 2018-08-19 07:49:54 +02:00
Max Kellermann
4531e4cc55 filter/LoadChain: move code to class FilterFactory
Eliminate a use of GetGlobalConfig().
2018-08-18 20:57:02 +02:00
Max Kellermann
44a31357f4 android/AndroidManifest.xml: increase targetSdkVersion to 26 (required by Google Play) 2018-08-18 20:44:18 +02:00
Joshua Wise
29f78b18b1 storage/plugins/CurlStorage: URL-encode paths in CurlStorage::MapUTF8
When using a database that was not created with a WebDAV music_directory
(i.e., if using a remote database, on which updates happen locally) and
using the Curl storage plugin, MPD would previously send GET requests that
had unescaped spaces in them.  This change uses Curl's URL-encode API to
solve this.
2018-08-17 23:03:56 +02:00
Max Kellermann
147872fe97 lib/curl/Easy: add curl_easy_escape() wrapper 2018-08-17 23:02:49 +02:00
Max Kellermann
38edb58054 increment version number to 0.20.22 2018-08-17 23:02:13 +02:00
Max Kellermann
1ba35e1fd4 Merge tag 'v0.20.21'
release v0.20.21
2018-08-17 20:02:27 +02:00
Max Kellermann
98afae2520 release v0.20.21 2018-08-17 19:50:59 +02:00
Max Kellermann
ddc85c620f configure.ac: make the GIT_COMMIT command worktree-safe
`$srcdir/.git` doesn't exist if `$srcdir` is a worktree.
2018-08-17 19:50:53 +02:00
Max Kellermann
12bc625fe1 android/build.py: add aarch64 support 2018-08-17 19:20:25 +02:00
Max Kellermann
6b407356b9 configure.ac: set ANDROID_ABI=x86 for the Android-x86 build
This was missing in commit 8266ab5588 for #69.
2018-08-17 19:18:29 +02:00
Max Kellermann
a4e0b52468 configure.ac, Makefile.am: add variable ANDROID_ABI 2018-08-17 19:01:37 +02:00
Max Kellermann
98efb4f6d5 android: raise minSdkVersion to 21
The number of MPD installs on Android < 5.0 is negligible, and that
API version introduces lots of useful features for MPD.
2018-08-17 19:01:37 +02:00
Max Kellermann
36edb4886c android/build.py: add variable "android_api_level" 2018-08-17 19:01:37 +02:00
Max Kellermann
76290f786d python/build/meson.py: set "needs_exe_wrapper=true"
Prevent Meson from running Android-x86 binaries.  That will fail
because the Android standard libraries are most likely not installed.
2018-08-17 19:00:42 +02:00
Max Kellermann
c6299c26b5 python/build/libs.py: disable libnfs utils/examples 2018-08-17 18:32:07 +02:00
Max Kellermann
fb5f9baf9c android/build.py: enable libexpat for the "curl" storage plugin 2018-08-17 17:15:05 +02:00
Max Kellermann
dee591d970 python/build/libs.py: disable expat documentation 2018-08-17 17:13:39 +02:00
Joshua Wise
a5cc13b0c5 build: Add libexpat to the crosscompile build on Windows.
The Curl plugin requires libexpat in order to work these days, so we should
download and build it in order to get the plugin enabled on Windows.
2018-08-17 17:13:39 +02:00
Max Kellermann
aaf588aeaa python/libs: upgrade Boost to 1.68.0 2018-08-17 17:13:39 +02:00
Max Kellermann
533a3def9f Makefile.am: add missing $(CURL_CFLAGS) and $(EXPAT_CFLAGS)
Fixes problems with the Windows build because `-DCURL_STATICLIB` was
missing, causing error messages like:

 "undefined reference to `__imp_curl_slist_free_all'"
2018-08-17 17:06:03 +02:00
Max Kellermann
4ba3812baf Merge branch 'fchmod_fix' of git://github.com/1848/MPD 2018-08-14 23:14:10 +02:00
1848
4797357fa9 fixed setting unix socket permissions
first call fchmod() to prevent TOCTTOU, then apply permissions using
chmod()
2018-08-14 22:53:19 +02:00
Max Kellermann
f6b3a88723 Merge branch 'master' of git://github.com/skidoo23/MPD 2018-08-14 19:02:37 +02:00
Max Kellermann
fcf487f4e0 playlist/cue: support file type declaration "FLAC" (non-standard)
According to http://wiki.hydrogenaud.io/index.php?title=Cue_sheet FLAC
files should use the "WAVE" file type, but I recently encountered CUE
files declared as "FLAC" which could not be read by MPD.
2018-08-13 08:18:18 +02:00
skidoo23
82e8913c05 decoder/sidplay: support basic and kernal rom (libsidplayfp) 2018-08-12 14:25:11 +02:00
Max Kellermann
c46483a4ab tag/Config: support incremental "metadata_to_use" setting
With a "+" or "-" prefix, the "metadata_to_use" setting can manipulate
the existing default.  This way, one can enable `TAG_COMMENT` without
having to list all the other tags.
2018-08-10 18:46:47 +02:00
Max Kellermann
0f19108ce3 tag/Config: use SplitString() 2018-08-10 18:46:16 +02:00
Max Kellermann
4208fe29b5 tag/Mask: add method Unset() 2018-08-10 18:46:15 +02:00
Max Kellermann
1b593462d3 doc/user.rst: add tag links 2018-08-10 18:45:14 +02:00
Max Kellermann
0cf9c941af doc/user.rst: line breaks 2018-08-10 18:28:25 +02:00
Max Kellermann
c1b33533da event/ServerSocket: fix get_remote_uid() call
This call was broken since commit
9a5bcc6db0 because the
`UniqueSocketDescriptor` had already been moved.
2018-08-09 13:22:25 +02:00
Max Kellermann
66fcd25b7e command/sticker, sticker/song: embed struct sticker_song_find_data in namespace
Fixes `-Werror=odr`
2018-08-09 12:57:47 +02:00
Max Kellermann
01d3777574 decoder/Thread, ...: log all exceptions 2018-08-09 11:14:40 +02:00
Max Kellermann
87570cdd9b Merge branch 'HttpdOutputPlugin_socket' of git://github.com/1848/MPD 2018-08-08 16:57:24 +02:00
Max Kellermann
0ea6a2dd99 decoder/mpg123: remove obsolete const_cast hack 2018-08-07 22:52:38 +02:00
Max Kellermann
cacc1ffdad decoder/mpg123: use AtScopeExit() to call mpg123_delete() during scan 2018-08-07 22:48:11 +02:00
Max Kellermann
cfe34647e1 decoder/mpg123: use AtScopeExit() to call mpg123_delete() 2018-08-07 22:29:51 +02:00
1848
737267cedc Moved call to fchmod() on socket from OneServerSocket::Open() to socket_bind_listen() 2018-08-07 22:01:13 +02:00
1848
84054203af Use fchmod instead of chmod for unix sockets to prevent TOCTTOU 2018-08-07 21:30:25 +02:00
1848
0c1a899fbe Added unix socket support in HttpdOutputPlugin 2018-08-07 19:28:29 +02:00
1848
52521d02ea Added a function for generic address parsing
Changed listen_add_config_param() to use generic address parsing
2018-08-07 19:18:33 +02:00
Yue Wang
2127a482da Fix various bugs in OS X DSD playback
the most notable bugs are 

1. osx_output_set_device_format should use the target asbd rather than AudioFormat. This is because asbd's sample rate calculation reflects the real dop target rate of the DAC, white AudioFormat's sample rate is the original DSD format rate.

2. the original code value the highest rate that's the multiple of the target rate. This cause DOP always have the wrong rate chosen. This is also not necessary for PCM playback --- MPD's goal is bit perfect, and it's meaningless to raise to two or four times the PCM sample rate.

3.  if sample_rate cannot be synchronized, the test for falling back to PCM is wrong. If the file format is in DSD format such fallback is necessary, whatever the params.dop setting is.
2018-08-07 01:55:06 -07:00
Max Kellermann
7df0d3b7fc event/SignalMonitor: make SignalMonitorFinish() noexcept 2018-08-06 12:01:46 +02:00
Max Kellermann
fdd101c4c5 event/SignalMonitor: add noexcept 2018-08-06 12:00:49 +02:00
Max Kellermann
4218f56f6c system/SignalFD: add "noexcept" 2018-08-06 11:58:37 +02:00
Max Kellermann
dd18fe34a7 system/SignalFD: throw exception on error 2018-08-06 11:58:29 +02:00
Max Kellermann
5b09504a71 system/Event{FD,Pipe}: add "noexcept" 2018-08-06 11:57:40 +02:00
Max Kellermann
0c1a001622 system/Event{FD,Pipe}: throw exception on error 2018-08-06 11:49:38 +02:00
Max Kellermann
148c38fbb9 Main: use AtScopeExit() to delete the Instance 2018-08-06 11:42:46 +02:00
Max Kellermann
fbfefcc0a3 Main: call daemonize_finish() with AtScopeExit() 2018-08-06 10:47:06 +02:00
Max Kellermann
b4c517c501 song/AudioFormatFilter: add mask support 2018-08-02 21:34:29 +02:00
Max Kellermann
b39bc85e60 AudioFormat: add mask support to ToString() 2018-08-02 21:18:36 +02:00
Max Kellermann
603ce87ac2 AudioFormat: split the printf() calls in ToString()
Prepare for formatting masks.
2018-08-02 21:17:54 +02:00
Max Kellermann
4b16a8bf84 lib/icu: require at least version 50 2018-08-02 21:01:39 +02:00
Max Kellermann
ca4c81dd84 decoder/mikmod: require at least version 3.2 2018-08-02 20:45:14 +02:00
Max Kellermann
e9881bbfc8 configure.ac: detect libmikmod with pkg-config 2018-08-02 20:42:25 +02:00
Max Kellermann
69f4178bff decoder/ffmpeg: require at least version 11.12
This is the version in Debian Jessie (oldstable).
2018-08-02 20:18:19 +02:00
Max Kellermann
027e562f65 song/OptimizeFilter: optimization stage for filters 2018-08-02 19:42:53 +02:00
Max Kellermann
2d2120338b Makefile.am: add src/song/NotSongFilter.hxx 2018-08-02 19:29:53 +02:00
Max Kellermann
e5e623ffaa SongFilter: add class NotSongFilter 2018-08-02 19:22:55 +02:00
Max Kellermann
e47e3205b3 doc/protocol.xml: add missing parantheses 2018-08-02 19:22:55 +02:00
Max Kellermann
592d2ebd26 song/AudioFormatSongFilter: new filter type 2018-08-02 17:28:17 +02:00
Max Kellermann
299c809272 song/Filter: convert LOCATE_TAG_* macros to enum 2018-08-02 17:23:25 +02:00
Max Kellermann
d929d0c26f song/Filter: move each class into a separate source 2018-08-02 13:54:36 +02:00
Max Kellermann
90201e9970 DetachedSong, db/LightSong, SongFilter: move to src/song/ 2018-08-02 13:51:18 +02:00
Max Kellermann
a31da51fd9 lib/systemd/Watchdog: implement the systemd watchdog protocol 2018-08-02 11:15:35 +02:00
Max Kellermann
cf471e830f Merge branch 'v0.20.x' 2018-08-02 11:07:40 +02:00
Max Kellermann
906972973e case-insensitive URI scheme comparison
Required according to RFC 3986:

> An implementation should accept uppercase letters as equivalent to
> lowercase in scheme names

Closes #330
2018-08-02 11:01:45 +02:00
Max Kellermann
116edf5fce util/ASCII: add StringStartsWithCaseASCII() 2018-08-02 10:42:28 +02:00
Max Kellermann
8581013911 configure.ac: default to --disable-daemon on Windows
This typo was present since the option was added in commit ed001e0cfb
2018-08-02 10:27:13 +02:00
Max Kellermann
22192adbc8 lib/icu/Init: add class ScopeIcuInit 2018-08-02 10:17:31 +02:00
Max Kellermann
b8f3de693f lib/icu/Init: add "noexcept" 2018-08-02 10:17:04 +02:00
Max Kellermann
68c023cdd8 config/Path: simplify expression 2018-08-02 09:43:48 +02:00
Max Kellermann
b18b0bf328 config/Path: remove unnecessary IsNull() check
`AllocatedPath::FromUTF8Throw()` will never return a nulled instance.
2018-08-02 09:43:17 +02:00
Max Kellermann
2a2c5d50ff unix/PidFile: add "noexcept" 2018-08-01 20:27:56 +02:00
Max Kellermann
dfda0faac7 unix/{Daemon,PidFile}: throw exception on error
Don't use the bad `FatalError` library.
2018-08-01 20:20:29 +02:00
Max Kellermann
95acc4be07 Main: add "noexcept" 2018-08-01 20:16:40 +02:00
Max Kellermann
330a4cf573 Main: remove exception handler from mpd_main_after_fork()
Let MainOrThrow() forward it to mpd_main().
2018-08-01 20:15:54 +02:00
Max Kellermann
6ffbb151a0 Main: move log_deinit() call to mpd_main()
Deinitialize the logging library after the last exception handler,
because that one could still need it.

Use `AtScopeExit()` to ensure it's always called, even if an exception
was thrown.
2018-08-01 20:14:31 +02:00
Max Kellermann
271e49db5d Main: move code to MainOrThrow(), leaving exception handler in mpd_main() 2018-08-01 20:13:27 +02:00
Max Kellermann
8d2101ccb4 Main: move libdbus cleanup to class ODBus::ScopeInit 2018-08-01 19:24:50 +02:00
Max Kellermann
7aa8497546 SongFilter: implement the AND operator 2018-07-30 10:19:31 +02:00
Max Kellermann
7a8d5070f5 Songfilter: move code to ExpectWord() 2018-07-30 10:18:42 +02:00
Max Kellermann
8707ae6fd4 Songfilter: allow redundant parantheses 2018-07-30 10:00:44 +02:00
Max Kellermann
8786b61636 SongFilter: make ParseExpression() static 2018-07-30 09:57:04 +02:00
Max Kellermann
1b5faf5cbf SongFilter: move code from SongFilter to AndSongFilter 2018-07-29 18:39:47 +02:00
Max Kellermann
2da5b7cb65 Merge branch 'v0.20.x' 2018-07-29 18:33:39 +02:00
Max Kellermann
b1e073bacd python/build/libs.py: upgrade FFmpeg to 4.0.2 2018-07-29 18:29:48 +02:00
skidoo23
501e48daba configure.ac: Do not link libsidplayfp against libresid-builder 2018-07-29 18:22:03 +02:00
skidoo23
643ecd1edd configure.ac: clarify sidplay related info 2018-07-29 18:21:42 +02:00
Yue Wang
1e88e71b9a [OSXOutputPlugin] Fix a bug that the stream sample rate is missing
the code here tried to guard DSD features behind ENABLE_DSD. However, the sample rate setting should be shared between two scenarios. 

40a1ebee29 (diff-ce7ecec9ea9ca3df90d9c290cb3ef9d4R795)


The code runs fine if the dac supports the sample rate, as Mac OS  will use the device rate if stream rate is 0. 
However, when DAC is uncapable of processing the sample rate, a wrong rate (device rate) will be used for the stream rate.
2018-07-28 00:06:56 -07:00
Max Kellermann
e16fd4a09b input/qobuz: initialize the libgcrypt library 2018-07-26 18:26:46 +02:00
skidoo23
097e2b6c62 configure.ac: clarify sidplay related info 2018-07-26 18:19:00 +02:00
Max Kellermann
7db7568dcf lib/gcrypt/MD5: move code to util/HexFormat.cxx 2018-07-26 17:46:56 +02:00
Max Kellermann
409d3c7136 lib/gcrypt/MD5: return a StringBuffer 2018-07-26 17:45:45 +02:00
Max Kellermann
7f81375861 lib/gcrypt/MD5: move code to Hash.hxx 2018-07-26 12:14:31 +02:00
Max Kellermann
0de39a431b lib/gcrypt/MD5: relicense to BSD-2 2018-07-26 12:14:00 +02:00
skidoo23
54c20f6aa1 user.rst: update and fix sidplay links
Add link to more recent libsidplayfp and correct URL pointing to libsidplay2.
2018-07-25 14:46:23 +02:00
Max Kellermann
1726278ccc SongFilter: make several macros internal 2018-07-25 11:32:41 +02:00
Max Kellermann
8661a51aba SongFilter: make locate_parse_type() static 2018-07-25 11:30:56 +02:00
Max Kellermann
42ec67168a command/Database: don't use locate_parse_type() 2018-07-25 11:29:14 +02:00
Max Kellermann
91af2ebc2a command/Database: move code to handle_list_file() 2018-07-25 11:27:12 +02:00
Max Kellermann
f7fb8a33d7 db/Print: pass TagType to PrintUniqueTags() 2018-07-25 11:21:47 +02:00
Max Kellermann
0505cb8f7e db/Print: move code to PrintSongUris() 2018-07-25 11:18:45 +02:00
Max Kellermann
2cfccc1c34 SongFilter: make Item an interface
Prepare to allow more complex expressions.
2018-07-25 11:04:41 +02:00
Max Kellermann
438366effc SongFilter: move code to class StringFilter 2018-07-25 11:04:41 +02:00
Max Kellermann
29d5ad667c SongFilter: allow dash in tag name
Required for "modified-since".
2018-07-25 11:04:41 +02:00
Max Kellermann
235ddc0990 util/TimeISO8601: new utility library 2018-07-25 08:43:06 +02:00
Max Kellermann
517f5b1999 util/TimeConvert: new utility library 2018-07-25 08:34:52 +02:00
Max Kellermann
a8ac8b2563 TimePrint: remove unused time_t overload 2018-07-25 08:33:59 +02:00
Max Kellermann
78a65cf281 SongFilter: remove DetachedSong overloads
All DetachedSong instances should be converted to LightSong first,
which is a very cheap operation.
2018-07-25 07:43:05 +02:00
Max Kellermann
96017f58a5 decoder/ffmpeg: skip the av_probe_input_format() call
This is kind of a revert of commit
b2e3c0757b, which is not any longer
necessary since commit 0dd4b52b63
removed the last call to `av_open_input_stream()`.
2018-07-25 00:07:16 +02:00
Max Kellermann
c8e6f50d55 input/buffered: fix bogus offset after Seek()
Instead of copying the offset from our `input`, copy the requested
offset to our `offset` attribute.

By the time Seek() finishes, our input's offset may have advanced
already, having read some more data, thus giving us a bogus offset.

This fixes spurious decoder failues (closes #320).
2018-07-25 00:01:43 +02:00
Max Kellermann
9263d6d07d SongFilter: implement operator "!="
Closes #89
2018-07-24 23:24:42 +02:00
Max Kellermann
5271e81ebe SongFilter: new extensible filter syntax
Will allow more complex fitler expression, such as negation (#89).
2018-07-24 23:05:36 +02:00
Max Kellermann
a174159496 test/ParseSongFilter: new debug program 2018-07-24 23:04:47 +02:00
Max Kellermann
efb2051b30 SongFilter: add ToExpression() 2018-07-24 23:04:44 +02:00
Max Kellermann
a2b24cb5a2 SongFilter: pass std::string&& to Item constructor 2018-07-24 23:03:35 +02:00
Max Kellermann
a54f9ede2e SongFilter: use std::list::emplace_back() 2018-07-24 23:03:33 +02:00
Max Kellermann
05fb624031 doc/protocol.xml: group <arg> elements 2018-07-24 23:03:09 +02:00
Max Kellermann
2de98b652b doc/protocol.xml: move filter syntax to separate section 2018-07-24 22:36:03 +02:00
Max Kellermann
361ad92da9 doc/protocol.xml: improve find/search links 2018-07-24 22:36:00 +02:00
Max Kellermann
84ff71002e doc/user: remove the obsolete DocBook version
Was converted to reStructuredText / Sphinx in commit
8a689e68bc
2018-07-24 22:28:29 +02:00
Max Kellermann
7f1b134137 SongFilter: basic support for negated items
Not yet wired to the protocol.
2018-07-21 11:20:50 +02:00
Rasmus Steinke
504776a10f fix spelling 2018-07-21 08:14:53 +02:00
Rasmus Steinke
184b90bb88 fix wrong ref labels 2018-07-21 08:13:40 +02:00
Rasmus Steinke
cf85fcec79 fix wrong language type for code-blocks 2018-07-21 08:05:37 +02:00
Max Kellermann
b34fd905c8 SongFilter: simplify Parse() loop
Consume the ConstBuffer instead of iterating it.  This will allow
adding more complex parsers.
2018-07-21 07:36:42 +02:00
Max Kellermann
821f77325c SongFilter: Parse() throws exception on error 2018-07-21 07:24:42 +02:00
Max Kellermann
bd8cf7c53d SongFilter: make internal Parse() overload private 2018-07-21 07:21:27 +02:00
Max Kellermann
88c19c21ee SongFilter: remove obsolete prototype 2018-07-21 07:15:43 +02:00
Max Kellermann
40ec819330 SongFilter: make a few methods private 2018-07-21 07:15:09 +02:00
Max Kellermann
34dbd03be1 SongFilter: convert "tag" to "unsigned"
Having this as one-byte integer actually adds overhead and saves no
memory due to padding.
2018-07-21 07:04:01 +02:00
Rasmus Steinke
42d41647b5 fix wrong format of code sample 2018-07-20 23:50:14 +02:00
Rasmus Steinke
c91db14cef add missing formatting 2018-07-20 23:47:39 +02:00
Rasmus Steinke
10b925e7ac highlight actual tag_names 2018-07-20 23:42:45 +02:00
Max Kellermann
c9942846c9 doc: link the user manual in the TOC 2018-07-20 23:09:22 +02:00
Rasmus Steinke
6235cf066a fix missing paragraphs in tables 2018-07-20 20:25:24 +02:00
Rasmus Steinke
86979c8f04 Use correct headers 2018-07-20 16:06:26 +02:00
Rasmus Steinke
8a689e68bc Convert user documentation to restructuredText 2018-07-20 15:31:10 +02:00
Max Kellermann
b98263e86f fs/io/OutputStream: relicense under BSD-2 2018-07-19 14:02:37 +02:00
Max Kellermann
f30265a9ee config/File: support wildcards in "include" 2018-07-18 17:28:30 +02:00
Max Kellermann
fcbcec6856 fs/List: new library exporting ListWildcard() 2018-07-18 17:18:38 +02:00
Max Kellermann
b778fb38a9 util/StringAPI: add raw strcmp() wrapper 2018-07-18 17:18:34 +02:00
Max Kellermann
32290d5eb8 fs/Path: add method ToUTF8Throw() 2018-07-18 16:51:29 +02:00
Max Kellermann
f87265a4d5 fs/AllocatedPath: divert some methods to class Path
Eliminate duplicate code.
2018-07-18 16:51:29 +02:00
Max Kellermann
6448b31b11 util/StringAPI: add strpbrk() wrapper 2018-07-18 16:51:29 +02:00
Max Kellermann
998227cffc fs/CheckFile: remove variable path_utf8 2018-07-18 16:51:29 +02:00
Max Kellermann
09f743dc1a config/File: add directive "include_optional" 2018-07-18 13:10:36 +02:00
Max Kellermann
035f986a91 config/File: support absolute paths in "include" 2018-07-18 13:09:04 +02:00
Max Kellermann
b168a9d469 fs/Traits: add Apply() 2018-07-18 13:06:07 +02:00
Max Kellermann
2b1d6ad396 fs/{,Allocated}Path: add typedef Traits 2018-07-18 13:05:23 +02:00
Rasmus Steinke
641447bf9b remove remaining docbook syntax; update year in footer 2018-07-18 12:52:39 +02:00
Max Kellermann
06c2aef3c7 config/File: fix typo in comment 2018-07-18 12:39:39 +02:00
Max Kellermann
1caa0ef58d Makefile.am: upload Sphinx output 2018-07-18 12:36:58 +02:00
Max Kellermann
51951c9442 doc: remove developer.xml, was converted to Sphinx 2018-07-18 12:25:33 +02:00
Max Kellermann
104b8b4c4c doc: basic support for Sphinx
Migrating from DocBook to Sphinx.  Editing XML is really too
cumbersome.
2018-07-18 12:22:49 +02:00
Max Kellermann
3b95523e07 Merge branch 'sphinx' of git://github.com/carnager/MPD 2018-07-18 12:22:45 +02:00
Rasmus Steinke
3ca312bd4a convert developer docs to restructuredtext 2018-07-18 11:49:50 +02:00
Max Kellermann
d06ef76e58 config/File: implement the "include" directive
This is an experimental draft.  More needs to be done.
2018-07-18 11:27:41 +02:00
Max Kellermann
57729683b6 config/Data: pass new items by rvalue reference 2018-07-18 11:21:59 +02:00
Max Kellermann
9ff2606bb8 config/Data: use std::forward_list to manage params and blocks 2018-07-18 11:03:19 +02:00
Max Kellermann
fd80683ade decoder/mad: make "gapless_mp3_playback" a block option
Remove another dependency on the config/Global library.
2018-07-18 10:50:09 +02:00
Max Kellermann
49efb6071c config/Migrate: library to migrate deprecated settings 2018-07-18 10:25:02 +02:00
Max Kellermann
8df98932b1 config/Data: add methods AddParam(), AddBlock() 2018-07-18 10:17:45 +02:00
Max Kellermann
95481dda86 config/Global: remove unused function config_get_param() 2018-07-17 23:42:20 +02:00
Max Kellermann
1b4181d983 test/DumpDatabase: use struct ConfigData 2018-07-17 23:41:37 +02:00
Max Kellermann
113141bf2a StateFileConfig: add attribute "restore_paused" 2018-07-17 23:40:14 +02:00
Max Kellermann
bcc1e51097 StateFile: add struct StateFileConfig 2018-07-17 23:27:50 +02:00
Max Kellermann
e8a7c6cee3 config/Global: remove unused function config_get_block() 2018-07-17 23:14:47 +02:00
Max Kellermann
0c8ffa1ac3 output/MultipleOutputs: use struct ConfigData 2018-07-17 23:13:35 +02:00
Max Kellermann
4f678aa244 neighbor/Glue: use struct ConfigData 2018-07-17 23:11:33 +02:00
Max Kellermann
3a4a430f6c fs/Config: use struct ConfigData 2018-07-17 23:09:56 +02:00
Max Kellermann
36db40b224 client/Global: use struct ConfigData 2018-07-17 23:07:50 +02:00
Max Kellermann
426b9672cf db/Configured: use struct ConfigData 2018-07-17 23:06:17 +02:00
Max Kellermann
4d80419982 pcm/ConfiguredResampler: use struct ConfigData 2018-07-17 23:04:26 +02:00
Max Kellermann
3983caa2c8 Listen: use struct ConfigData 2018-07-17 23:02:53 +02:00
Max Kellermann
0b4e0b7bcb LogInit: use struct ConfigData 2018-07-17 23:02:06 +02:00
Max Kellermann
a9b8d5ecb6 Permission: use struct ConfigData 2018-07-17 23:00:42 +02:00
Max Kellermann
60b2338091 config/Global: remove unused function config_get_path() 2018-07-17 22:59:09 +02:00
Max Kellermann
d2594c6380 storage/Configured: use struct ConfigData 2018-07-17 22:57:08 +02:00
Max Kellermann
667daab056 config/Global: remove unused function config_get_unsigned() 2018-07-17 22:56:14 +02:00
Max Kellermann
2fc0a738ce Main: use struct ConfigData 2018-07-17 22:54:16 +02:00
Max Kellermann
86c531b37d config/Data: move std::chrono parsers from Global.hxx 2018-07-17 22:53:17 +02:00
Max Kellermann
a5b14a2ea7 Main: add local ConfigData reference 2018-07-17 22:48:43 +02:00
Max Kellermann
bf582bd969 ZeroconfGlue: use struct ConfigData 2018-07-17 22:44:16 +02:00
Max Kellermann
ad866f7a7d db/update/Config: use struct ConfigData 2018-07-17 22:41:28 +02:00
Max Kellermann
338a6f2a96 db/update/Walk: move UpdateConfig initialization to class UpdateService 2018-07-17 22:39:52 +02:00
Max Kellermann
c3aa53cc97 db/update/Walk: move configuration to struct UpdateConfig 2018-07-17 22:36:37 +02:00
Max Kellermann
24a86dce21 tag/Config: use struct ConfigData 2018-07-17 22:34:11 +02:00
Max Kellermann
0209bc4ba7 ReplayGainGlobal: use struct ConfigData 2018-07-17 22:32:56 +02:00
Max Kellermann
dd57b81989 PlaylistFile: use struct ConfigData 2018-07-17 22:31:33 +02:00
Max Kellermann
ffe6819966 config/Global: move value parser code to struct ConfigData 2018-07-17 22:28:08 +02:00
Max Kellermann
8af75c78f8 config/{Global,Block}: throw exception on parser error 2018-07-17 22:23:04 +02:00
Max Kellermann
696add259b config/Global: remove unused function config_find_block() 2018-07-17 22:15:10 +02:00
Max Kellermann
f18695eb45 test/run_output: use struct ConfigData 2018-07-17 22:12:56 +02:00
Max Kellermann
d6b0ecac1b test/run_filter: use struct ConfigData 2018-07-17 22:11:57 +02:00
Max Kellermann
61a119b607 playlist/Registry: use struct ConfigData 2018-07-17 22:10:32 +02:00
Max Kellermann
ea5096ac90 test/read_conf: use struct ConfigData 2018-07-17 22:08:48 +02:00
Max Kellermann
428c2ec0e3 test/read_conf: throw if setting is not configured 2018-07-17 22:08:08 +02:00
Max Kellermann
1a82981d07 test/read_conf: validate the setting name early 2018-07-17 22:07:05 +02:00
Max Kellermann
0ff0aca2e2 input/Init: use struct ConfigData 2018-07-17 22:05:27 +02:00
Max Kellermann
7b02c0224c filter/LoadChain: use struct ConfigData 2018-07-17 22:05:24 +02:00
Max Kellermann
57d77cc8a0 decoder/List: use struct ConfigData 2018-07-17 22:05:21 +02:00
Max Kellermann
9fe0585056 config/Global: add GetGlobalConfig() 2018-07-17 22:05:20 +02:00
Max Kellermann
8c366f0774 config/Data: automatic initialization 2018-07-17 22:05:18 +02:00
Max Kellermann
d6529d8c60 test/*: catch and print all exceptions 2018-07-17 21:58:39 +02:00
Max Kellermann
edb44a536a util/PrintException: new utility class 2018-07-17 21:58:07 +02:00
Max Kellermann
eeaaea802a config/Data: FindBlock() throws on error 2018-07-17 21:18:18 +02:00
Max Kellermann
15c36baefd config/Data: add method FindBlock() 2018-07-17 21:16:20 +02:00
Max Kellermann
33deb84aa1 config/Data: make getters const 2018-07-17 21:16:11 +02:00
Max Kellermann
b211d31a64 config/Data: add getter methods 2018-07-17 21:11:52 +02:00
Max Kellermann
5b192beaa5 config/Global: remove ConfigBlock::SetUsed() call, let caller do that
This fixes an old bug which caused the "unused" warnings to be
unreliable; only the first block in the list was marked as being
"used", no matter if it was really used, and the rest was never marked
as "used", suppressing all warnings for them.
2018-07-17 21:08:41 +02:00
Max Kellermann
ef38330d74 config/Block: add method SetUsed() 2018-07-17 21:06:15 +02:00
Max Kellermann
987b60ae73 config/Block: make "used" mutable 2018-07-17 21:05:55 +02:00
Max Kellermann
7db0f7c4da config/Param: remove unused "used" flag 2018-07-17 20:44:07 +02:00
Max Kellermann
a4eeaff63f config/File: move duplicate code to ExpectValueAndEnd() 2018-07-17 20:28:50 +02:00
Max Kellermann
7807ddae57 config/Param: allow moving the value 2018-07-17 20:27:52 +02:00
Max Kellermann
566af6827e config/Param: inline the constructor 2018-07-17 20:27:49 +02:00
Max Kellermann
bf046d895e config/Param: use C++11 initializers 2018-07-17 20:27:47 +02:00
Max Kellermann
af33a9f4b8 config/Block: allow moving name and value 2018-07-17 20:27:46 +02:00
Max Kellermann
e9a4570891 config/Block: use C++11 initializers 2018-07-17 20:16:19 +02:00
Max Kellermann
99d5b61698 fs/Path: add operator/(Path,Path)
Modeled after std::filesystem::operator/() from C++17.
2018-07-17 18:33:32 +02:00
Max Kellermann
79e89eb23b CommandLine: use constexpr Path instead of macros 2018-07-17 17:02:49 +02:00
Max Kellermann
d13a64455c config/File: use nested exception to annotate file name and line number 2018-07-16 20:00:29 +02:00
Max Kellermann
816603fd9a config/Config*: rename files, drop "Config" prefix 2018-07-16 19:50:07 +02:00
Max Kellermann
bf5f12a51f Merge branch 'patch-4' of git://github.com/Wang-Yue/MPD 2018-07-16 18:59:17 +02:00
Yue Wang
866821765a use uint_least32_t instead of long for timeout 2018-07-16 09:42:04 -07:00
Max Kellermann
c457d8e442 Merge branch 'can' of git://github.com/Wang-Yue/MPD 2018-07-16 18:14:04 +02:00
Yue Wang
c58dffa685 Implement Cancel() for OSXOutputPlugin 2018-07-16 09:06:07 -07:00
Max Kellermann
ba41690063 output/Interface: add method ChangeAudioFormat()
This is just the API design; there is no implementation yet, and no
caller.
2018-07-16 11:46:33 +02:00
Max Kellermann
86a37d0ed6 Main, pcm/SampleFormat, command/Error: remove obsolete GCC version checks 2018-07-16 11:04:05 +02:00
Max Kellermann
2fb5dbe62b output/alsa: use spsc_queue::reset()
This method was added in Boost 1.58.
2018-07-16 11:04:01 +02:00
Max Kellermann
d2835e2989 configure.ac: require Boost 1.58 2018-07-16 11:03:59 +02:00
Max Kellermann
543e8a98a7 m4: update various libraries from autoconf-archive 20170928
Not updating m4/ax_boost_base.m4 because the new version breaks
cross-compilation by adding -I/usr/include to BOOST_CPPFLAGS.
2018-07-16 11:03:58 +02:00
Max Kellermann
86b7890f67 Merge branch 'v0.20.x' 2018-07-16 11:03:53 +02:00
Max Kellermann
7393e1cba1 python/build/libs: upgrade libnfs to 3.0.0 2018-07-16 10:58:19 +02:00
Max Kellermann
ceee47fda8 python/build/libs: upgrade CURL to 7.61.0 2018-07-16 10:55:08 +02:00
Max Kellermann
9c6b52ccee Permission: add special permissions for local sockets
Closes #296
2018-07-15 22:27:35 +02:00
Yue Wang
79937c9495 Support timed_wait in microseconds level
Some Audio plugin (such as ALSA, and soon CoreAudio) already support microsecond level buffer time. However, current interval less than 1000 microseconds will cause a bug that the code treated as 0 ms.
2018-07-15 13:22:53 -07:00
Max Kellermann
a47ecf9cb1 doc/user: document client configuration
Moving some text from the manpage.  Oh, documentation is still a mess.
2018-07-15 21:56:41 +02:00
Max Kellermann
8aa2c57413 client: pass permission mask to constructor
Prepare for per-listener permissions.
2018-07-15 21:51:33 +02:00
Max Kellermann
524a7f4560 Listen: simplify code flow in listen_global_init() 2018-07-15 21:35:35 +02:00
Max Kellermann
56bfff5a57 event/ServerSocket: add method IsEmpty() 2018-07-15 21:35:35 +02:00
Yue Wang
1d30df9b15 Update OSXOutputPlugin.cxx
some device seems to have issue with setting kAudioDevicePropertyVolumeScalar  with kAudioObjectPropertyElementMaster. Use AudioToolbox 's kAudioHardwareServiceDeviceProperty_VirtualMasterVolume instead. 

Ideally, we should get the steoro channels first, and set the kAudioDevicePropertyVolumeScalar for each channel, which is doable as presented in https://github.com/cmus/cmus/blob/master/op/coreaudio.c. I will do a follow up PR after refactor PR.
2018-07-13 22:27:24 -07:00
Yue Wang
ef84e5c8fa further guard dop code by if (dop_enabled) 2018-07-13 16:36:29 -07:00
Yue Wang
6d2a30b860 Update OSXOutputPlugin.cxx
1 sec for pause is too long. we wait for the same amount of time as when ring buffer is not available for writing.
2018-07-13 16:14:59 -07:00
Yue Wang
9e0fa8e9ec Fix a copy and paste from diff bug. 2018-07-13 15:53:51 -07:00
Yue Wang
5e8e038811 Enclose pcm_export into the ENABLE_DSD guard. 2018-07-13 15:31:48 -07:00
Yue Wang
e61a804b80 Simplify audio format assignment code 2018-07-13 15:09:11 -07:00
Yue Wang
a9d6ad4759 Merge pull request #1 from Wang-Yue/patch-3
Remove sync_sample_rate option as it's no longer necessary
2018-07-13 13:01:34 -07:00
Yue Wang
987124610a Remove sync_sample_rate option as it's no longer necessary 2018-07-13 13:00:25 -07:00
Yue Wang
40a1ebee29 Enable OSX output plugin to set hardware sample rate and bit depth at the same time
This PR will fix #271.

special thanks to @coroner21 who contributed a nice way to score hardware supported format in #292

Also, The DSD related code are all guarded with ENABLE_DSD  flag.
2018-07-13 12:48:43 -07:00
Max Kellermann
d4ce9c0df2 system/FileDescriptor: no-op implementation of *CloseOnExec() on Windows
Fixes the NFS client build, closes #305.
2018-07-13 18:16:39 +02:00
Yue Wang
680fdb0338 enable macOS to use Hardware Mixer
- Update the mixer to set on device property instead of audio unit property. When user choose "hardware" as mixer type, they will be able to change the hardware device volume instead of the software (AudioUnit) volume. 
- We don't use square root scale in volume calculation as previous code did. This will make the volume level in line with system volume meter --- That is, MPD will have the same percentage volume reading compared to System Setting (Either in "System Preference" or in "Audio Midi Setup" app)
2018-07-10 15:51:32 -07:00
Max Kellermann
727078f65d decoder/flac: call TagHandler::OnAudioFormat() 2018-07-07 14:43:21 +02:00
Max Kellermann
d7f770ce73 decoder/flac: move flac_sample_format() to FlacAudioFormat.hxx 2018-07-07 14:40:02 +02:00
Max Kellermann
e1ddb63054 lib/xiph/FlacStreamMetadata: move code to Scan(FLAC__StreamMetadata_StreamInfo) 2018-07-07 14:33:53 +02:00
Max Kellermann
24b14c5aa5 decoder/flac: rename FlacMetadata.cxx to FlacStreamMetadata.cxx 2018-07-07 14:29:49 +02:00
Max Kellermann
2e116c9e28 lib/xiph/FlacMetadataChain: un-inline Read(InputStream) 2018-07-07 14:22:22 +02:00
Max Kellermann
37897d1550 decoder/flac: move class FlacMetadataChain to separate source 2018-07-07 14:18:00 +02:00
Max Kellermann
b153591790 decoder/flac: move FlacIOHandle.?xx to lib/xiph/ 2018-07-07 14:17:03 +02:00
Max Kellermann
ee5653338d decoder/flac: fix comment typo 2018-07-07 14:11:28 +02:00
Max Kellermann
032f47c0b0 lib/xiph/FlacMetadataIterator: disallow copying 2018-07-07 14:08:41 +02:00
Max Kellermann
1f4e4dd9b3 lib/xiph/FlacMetadataIterator: reuse default constructor 2018-07-07 14:08:18 +02:00
Max Kellermann
d43218ed16 lib/xiph/FlacMetadataIterator: proper CamelCase 2018-07-07 14:07:48 +02:00
Max Kellermann
3d43e4e954 decoder/flac: move class FLACMetadataIterator to separate source 2018-07-07 14:04:37 +02:00
Max Kellermann
b0d587ded7 decoder/flac: pass FLAC__Metadata_Chain* to FLACMetadataIterator ctor 2018-07-07 14:04:06 +02:00
Max Kellermann
1245b4a49f decoder/wavpack: merge duplicate code into Scan() 2018-07-07 13:54:02 +02:00
Max Kellermann
d4ce6049c9 decoder/wavpack: call TagHandler::OnAudioFormat() 2018-07-07 13:52:58 +02:00
Max Kellermann
c236a85c13 decoder/wavpack: add CheckAudioFormat(WavpackContext) 2018-07-07 13:48:49 +02:00
Max Kellermann
9cf43eef67 decoder/wildmidi: call TagHandler::OnAudioFormat() 2018-07-07 13:43:29 +02:00
Max Kellermann
ed6d0aa548 decoder/wildmidi: convert WILDMIDI_SAMPLE_RATE to AudioFormat 2018-07-07 13:36:18 +02:00
Max Kellermann
3d27fffc50 decoder/opus: call TagHandler::OnAudioFormat() 2018-07-07 13:34:32 +02:00
Max Kellermann
de0ee26432 decoder/sndfile: call TagHandler::OnAudioFormat() 2018-07-07 13:29:39 +02:00
Max Kellermann
45cccbce59 decoder/sndfile: use AtScopeExit()
Fixes memory leaks.
2018-07-07 13:27:26 +02:00
Max Kellermann
479de9c7cb decoder/sndfile: add CheckAudioFormat(SF_INFO) 2018-07-07 13:26:39 +02:00
Max Kellermann
60821232b9 decoder/audiofile: allocate AFvirtualfile with malloc()
afCloseFile() uses free(), so we need to use malloc().
2018-07-07 13:25:01 +02:00
Max Kellermann
9b4156a282 decoder/audiofile: add "noexcept" 2018-07-07 13:21:27 +02:00
Max Kellermann
89b1e27d2e decoder/audiofile: merge duplicate code into CheckAudioFormat(AFfilehandle) 2018-07-07 13:21:09 +02:00
Max Kellermann
1dcaf8f76a decoder/audiofile: call TagHandler::OnAudioFormat() 2018-07-07 13:18:06 +02:00
Max Kellermann
18508d1919 decoder/audiofile: merge audiofile_get_duration() into audiofile_scan_stream() 2018-07-07 13:16:38 +02:00
Max Kellermann
9f77d568e2 decoder/mad: call TagHandler::OnAudioFormat() 2018-07-07 13:10:39 +02:00
Max Kellermann
0d0569b9af decoder/mad: merge mad_decoder_total_file_time() into mad_decoder_scan_stream() 2018-07-07 13:09:23 +02:00
Max Kellermann
0f18e7baf9 decoder/mpg123: call TagHandler::OnAudioFormat() 2018-07-07 13:08:06 +02:00
Max Kellermann
d8b03d4927 decoder/ffmpeg: call TagHandler::OnAudioFormat() 2018-07-07 13:02:08 +02:00
Max Kellermann
72b6c09a73 db/simple: add an AudioFormat to each Song 2018-07-06 22:49:02 +02:00
Max Kellermann
c05bca6f2c tag/Handler: implement FullTagHandler::OnAudioFormat() 2018-07-06 22:46:03 +02:00
Max Kellermann
73c95d1fb2 TagFile: rename exported functions, use CamelCase
And specify whether generic tags are being scanned.
2018-07-06 22:33:35 +02:00
Max Kellermann
2c30e16371 db/simple/Song: remove obsolete comment 2018-07-06 21:50:53 +02:00
Max Kellermann
72437ca9e2 db/simple/Song: use C++11 initializers 2018-07-06 21:49:52 +02:00
Max Kellermann
9be14bbe82 doc/protocol.xml: document the lsinfo response 2018-07-06 21:36:28 +02:00
Max Kellermann
d47f37f23a doc/protocol.xml: add command hyperlinks 2018-07-06 21:36:28 +02:00
Max Kellermann
a22aed7acf doc/protocol.xml: update reference to Ack.hxx 2018-07-06 21:36:28 +02:00
Max Kellermann
38b58715ae .travis.yml: add build with GCC 8
Also test the newest available GCC version.
2018-07-06 21:31:02 +02:00
Max Kellermann
d88e00c0a4 .travis.yml: switch to GCC 6
After commit a72d1200fb, the Travis-CI
build fails, because we have been using GCC 5 there...  so let's
switch to GCC 6 to test the oldest possible GCC version.
2018-07-06 21:30:15 +02:00
Max Kellermann
a72d1200fb require GCC 6
Meanwhile, GCC 5 fails to compile MPD due to incomplete C++14
implementation.
2018-07-06 19:44:32 +02:00
Max Kellermann
9a29d02e7e Merge branch 'v0.20.x' 2018-07-06 19:43:01 +02:00
Max Kellermann
6f3c0d0a60 AudioFormat: include cleanup 2018-07-06 19:35:31 +02:00
Max Kellermann
466625f7ad input/curl: use new class HttpStatusError
This way, IsFileNotFound() can detect status 404.
2018-07-06 19:26:11 +02:00
Max Kellermann
b8259e604a db/update/{Walk,ExcludeList}: use InputStream to read .mpdignore
Supports .mpdignore on NFS/SMB and others (closes #290).
2018-07-06 19:19:04 +02:00
Max Kellermann
86e2075c63 lib/nfs/Connection: use new class NfsClientError
Allows callers to extract the NFS error code.
2018-07-06 19:17:34 +02:00
Max Kellermann
30900b2fe2 input/Error: new library providing IsFileNotFound() 2018-07-06 19:16:01 +02:00
Max Kellermann
fd7ae7ea4c input/Domain: remove obsolete variable 2018-07-06 19:13:53 +02:00
Max Kellermann
60d5bf0240 util/StringFormat: new utility library 2018-07-06 19:07:02 +02:00
Max Kellermann
41cdc4e14b input/Offset: add macro PRIoffset 2018-07-06 19:06:05 +02:00
Max Kellermann
87dfca0477 input/curl: remove obsolete Windows sprintf() fallback
See commit be137a191e
2018-07-06 19:05:09 +02:00
Max Kellermann
e1ee8e7812 util/FormatString: remove obsolete Windows fallback
Since 7d353bbe2a, _GNU_SOURCE is always
defined, which implies __USE_MINGW_ANSI_STDIO and thus switches to
the mingw implementations of the printf() family.  That's
standards-compliant, unlike Microsoft's CRT implementations.
2018-07-06 19:04:33 +02:00
Max Kellermann
63406efcd8 db/update/ExcludeList: allow comments only at start of line 2018-07-06 18:27:17 +02:00
Max Kellermann
d5c132fca0 db/update/ExcludeList: move code to ParseLine() 2018-07-06 18:25:27 +02:00
Max Kellermann
5f082a2739 output/httpd: remove broken DLNA support code
This code was added in 21851c0673 but
looks completely broken:

- the status code is "206 OK" but "206" would be "Partial Content"

- the "Content-Length" header has a bogus value

- the "Content-RangeX" parameter has different bogus values (why
  "Content-RangeX" anyway and not "Content-Range"?)

Apart from that, there are strange undocumented non-standard headers
which are probably there to work around bugs/expectations in one
broken proprietary client product.  But these days, MPD doesn't bend
over to support broken clients.  So let's kill this code.

Closes #304
2018-07-06 17:28:01 +02:00
Max Kellermann
45139f94bb db/LightSong: pass URI to constructor 2018-07-06 16:56:12 +02:00
Max Kellermann
80cb680fca db/LightSong: implicit initialization 2018-07-06 16:50:37 +02:00
Max Kellermann
b9ff6383a4 db/LightSong: make Tag a reference
This enforces the "not nullptr" rule.
2018-07-06 16:47:47 +02:00
Max Kellermann
ebc006ab52 db/simple: wrap LightSong in Manual<>
Prepare to make LightSong non-assignable.
2018-07-06 16:46:01 +02:00
Max Kellermann
86a02871fc decoder/vorbis: call TagHandler::OnAudioFormat() 2018-07-06 12:44:58 +02:00
Max Kellermann
e152e843d8 tag/Handler: add method OnAudioFormat() 2018-07-06 12:44:58 +02:00
Max Kellermann
9ff1ff75cb tag/Handler: add FullTagHandler constructor with want_mask 2018-07-06 12:44:58 +02:00
Max Kellermann
abea4a24ba tag/Handler: move WANT_DURATION|WANT_TAG to protected AddTagHandler() 2018-07-06 12:44:11 +02:00
Max Kellermann
3d3a1232b1 tag/Handler: convert to class with virtual methods 2018-07-05 19:07:05 +02:00
Max Kellermann
09d4176210 output/multiple: use WaitAll() in EnableDisable() 2018-06-23 19:23:56 +02:00
Max Kellermann
30d41e45e2 output/multiple: remove unnecessary IsBusy() check from WaitAll()
AudioOutputControl::WaitForCommand() doesn't need this check.
2018-06-23 19:23:18 +02:00
Max Kellermann
bd9a5021da notify: remove unused library 2018-06-23 19:15:26 +02:00
Max Kellermann
1624a5eb8d output/Control: add another Cond attribute, replacing audio_output_client_notify 2018-06-23 19:11:48 +02:00
Max Kellermann
1bca29f9e2 output/Control: rename "cond" to "wake_cond"
Prepare for adding another Cond attribute.
2018-06-23 19:10:23 +02:00
Max Kellermann
efb8a9bd2c player, decoder, output: wrap MusicPipe in std::shared_ptr/std::unique_ptr 2018-06-23 18:45:57 +02:00
Max Kellermann
82954d1d6f player/Thread: eliminate ClearAndReplacePipe()
Since commit e81b089612, this is the
same code as in ReplacePipe().
2018-06-23 18:44:48 +02:00
Max Kellermann
5a02324c09 MusicBuffer: make constructor explicit 2018-06-23 18:40:36 +02:00
Max Kellermann
eb93bebbc1 MusicBuffer: fix potential deadlock while cross-fading in Return() 2018-06-23 18:39:50 +02:00
Max Kellermann
2be905b2e2 MusicPipe: eliminate the unused MusicBuffer reference
This requires re-adding the reference to struct DecoderControl, which
was removed recently by commit
9f14e7a98d
2018-06-23 18:36:24 +02:00
Max Kellermann
076be809c2 Music{Pipe,Chunk}: use MusicChunkPtr for the list links 2018-06-23 17:58:42 +02:00
Max Kellermann
88f1233d7b MusicPipe, output/multiple: include cleanup 2018-06-23 17:44:32 +02:00
Max Kellermann
54d295c247 MusicChunkPtr: managed MusicChunk pointer
Make all uses of MusicChunk safe.
2018-06-22 23:11:52 +02:00
Max Kellermann
e81b089612 MusicPipe: automatically clear in destructor
We can implement this now that we have a MusicBuffer reference.
2018-06-22 23:09:13 +02:00
Max Kellermann
9f14e7a98d MusicPipe: add MusicBuffer reference
This tiny amount of overhead allows omitting the MusicBuffer in
Clear().
2018-06-22 22:59:44 +02:00
Max Kellermann
cb412b221c output/multiple: update API documentation 2018-06-22 22:59:30 +02:00
Max Kellermann
7d6a762845 python/build/libs.py: upgrade FFmpeg to 4.0.1 2018-06-22 22:35:27 +02:00
Max Kellermann
1ca1269a59 input/curl: use class MaybeBufferedInputStream
For remote files (not streams), this downloads as quickly as possible
to a large buffer instead of throttling the stream during playback.
Throttling can make the server impatient and it may then disconnect.

This is what Qobuz and Tidal do, and this commit attempts to solve
this by not letting the Qobuz/Tidal server wait (closes #241).
2018-06-22 22:33:16 +02:00
Max Kellermann
6681b14b71 input/MaybeBuffered: proxy InputStream implementation which auto-uses BufferedInputStream 2018-06-22 22:33:16 +02:00
Max Kellermann
12f2418445 input/buffered: proxy InputStream implementation which caches in a huge buffer 2018-06-22 22:33:16 +02:00
Max Kellermann
ae8a2ab652 util/SparseBuffer: new utility class 2018-06-22 22:18:26 +02:00
Max Kellermann
d0fbf6db59 input/Stream: remove attribute "cond", replace with handler interface
This adds a bit of overhead, but also adds flexibility to the API,
because arbitrary triggers may be invoked from that virtual method
implementation, not just Cond::signal().

The motivation for this is to make the handlers more dynamic, for the
upcoming buffering class utilizing ProxyInputStream.
2018-06-22 19:37:18 +02:00
Max Kellermann
01d8eb6290 input/rewind: move sources out of the "plugins" directory
This is not a plugin.
2018-06-22 19:31:06 +02:00
Max Kellermann
197968d65e input/Stream: mark qobuz:// and tidal:// as "seeking is expensive"
Those are loaded with the "curl" input plugin, and this one is
"expensive", because it needs to send a new HTTP request with Range
header for each seek.
2018-06-21 22:35:36 +02:00
Max Kellermann
2cb83a1f84 input/Stream: make "uri" const 2018-06-14 17:31:54 +02:00
Max Kellermann
d7c94e30c5 input/Stream: remove obsolete comment 2018-06-14 17:31:33 +02:00
Max Kellermann
510d2514a0 doc/user.xml: mention the cache_directory requirement for mounts 2018-06-05 22:10:28 +02:00
Max Kellermann
5217a74b7f storage/udisks: return file path in MapUTF8()
The absolute udisks:// URI is not usable with InputStream::Open(), and
thus we need to return the LocalStorage::MapUTF8() return value
instead.
2018-06-05 22:01:28 +02:00
Max Kellermann
cccf35d140 storage/udisks: add missing MountWait() call to MapFS() 2018-06-05 21:56:28 +02:00
Max Kellermann
249316c8fc storage/udisks: implement MapFS() 2018-06-05 21:54:50 +02:00
Max Kellermann
cd24449495 doc/user.xml: document the two udisks plugins 2018-06-05 21:35:30 +02:00
Max Kellermann
687834328c doc/user.xml: add section explaining storage/neighbor plugins and mounts 2018-06-05 21:35:30 +02:00
Max Kellermann
4d015aff30 doc/user.xml: rewrite the "Introduction" section with text from the website 2018-06-05 21:35:30 +02:00
Max Kellermann
ba8040d068 storage/udisks: new plugin
Documentation will follow soon.
2018-06-04 22:00:52 +02:00
Max Kellermann
5fa94d2a85 lib/dbus/AsyncRequest: add missing include 2018-06-04 22:00:52 +02:00
Max Kellermann
7eee79c145 neighbor/udisks: move code to class UDisks2::ParseObjects(ODBus::Message) 2018-06-04 21:50:34 +02:00
Max Kellermann
9626523420 neighbor/udisks: move code to class UDisks2::ParseObjects(ReadMessageIter) 2018-06-04 21:41:51 +02:00
Max Kellermann
0150131984 test/run_neighbor_explorer: make GlobalInit const 2018-06-04 17:44:31 +02:00
Max Kellermann
2ddd45e5e1 test/run_neighbor_explorer: use ShutdownHandler to catch SIGINT/SIGTERM 2018-06-04 17:42:47 +02:00
Max Kellermann
03c89c9cec neighbor/udisks: move ParseObject() to UDisks2.cxx 2018-06-04 17:23:55 +02:00
Max Kellermann
640de5518b neighbor/udisks: move struct UdisksObject to UDisks2.hxx 2018-06-04 17:23:55 +02:00
Max Kellermann
a92c694f1b neighbor/Iter: add missing include 2018-06-04 17:23:55 +02:00
Max Kellermann
a159299a4b lib/dbus/AsyncRequest: new helper class 2018-06-04 12:21:17 +02:00
Max Kellermann
d048545f1a lib/dbus/Connection: add DBusConnection& cast operator 2018-06-04 12:20:41 +02:00
Max Kellermann
aea6d354b7 lib/dbus/ObjectManager: use TypeTraits instead of CPP macro 2018-06-03 20:30:08 +02:00
Max Kellermann
d3793dfe5b lib/dbus/Types: add ObjectPathTypeTraits 2018-06-03 20:30:08 +02:00
Max Kellermann
234f8d287a lib/dbus/Types: rename _MakeStructTypeAsString to ConcatTypeAsString 2018-06-03 20:29:01 +02:00
Max Kellermann
8d49c2d028 neighbor/udisks: show only filesystems, hide raw drives 2018-06-03 20:20:37 +02:00
Max Kellermann
e560f6bc63 lib/dbus/ReadIter: add ForEachProperty() 2018-06-03 20:18:46 +02:00
Max Kellermann
fbfbc5682a lib/dbus/ReadIter: add ForEachRecurse() 2018-06-03 20:18:08 +02:00
Max Kellermann
d4141bf7f1 lib/dbus/ReadIter: add API documentation 2018-06-03 20:05:37 +02:00
Max Kellermann
6c81fa1ec5 neighbor/udisks: move code to ForEachInterface() 2018-06-03 14:47:12 +02:00
Max Kellermann
24874b8286 Merge branch 'v0.20.x' 2018-06-03 14:22:29 +02:00
Max Kellermann
b63664988f lib/dbus/Types: support DBUS_TYPE_DICT_ENTRY 2018-06-03 12:19:17 +02:00
Max Kellermann
eeb00ac45b util/TemplateString: new utility library 2018-06-03 12:13:47 +02:00
Max Kellermann
37e25f93d6 lib/dbus/Glue: move Connect()/Disconnect() calls to I/O thread 2018-06-03 12:08:37 +02:00
Max Kellermann
d58d65ebf0 lib/dbus/Glue: use private connection
Avoid interfering with libraries also using the shared connection.
2018-06-03 11:00:58 +02:00
Max Kellermann
adf2d3aff2 zeroconf/Avahi: move dbus_shutdown() call to the end of Main()
Calling dbus_shutdown() too early will break the "udisks2" neighbor
plugin.
2018-06-03 10:37:54 +02:00
Max Kellermann
32064a23c1 neighbor/udisks2: move Open()/Close() calls into the I/O thread
Fixes assertion failure.
2018-06-03 10:08:11 +02:00
Max Kellermann
c60b50b1ae neighbor/udisks2: use SafeSingleton for managing the ODBus::Glue instance
Allows other objects to use the same single instance as well.
2018-06-03 09:58:34 +02:00
Max Kellermann
f3ffdaf21f lib/dbus/Glue: singleton for global initialization 2018-06-03 09:28:04 +02:00
Max Kellermann
3aade67046 basic udisks2 support
To get udisks2 support started, this commit contains the configure.ac
option and a "neighbor" plugin which shows block devices.  Later, this
will allow mounting removable media with a new storage plugin.
2018-06-02 19:44:46 +02:00
Max Kellermann
dc111bbec2 odbus: import dbus-1 OO wrapper library
From a7cef404c1

To be used by upcoming code.
2018-06-02 19:15:56 +02:00
Max Kellermann
acd61a0e8e test/run_neighbor_explorer: dump NeighborGlue::GetList() after initialization 2018-06-02 19:15:36 +02:00
Christian Kröner
58590b71d1 Fix pause for OSX output plugin (delay one second) 2018-06-02 19:02:37 +02:00
Max Kellermann
8dcb1f805d db/proxy: support tags "ArtistSort", "AlbumArtistSort", "AlbumSort"
Closes #284
2018-05-28 20:14:07 +02:00
Max Kellermann
a8b9e5b9b9 db/proxy: add "password" setting
Closes #283
2018-05-28 20:01:08 +02:00
Max Kellermann
04f928e2b0 doc/user.xml: remove copy&paste fallout 2018-05-28 20:01:08 +02:00
Max Kellermann
c7a803c922 increment version number to 0.20.21 2018-05-28 19:46:54 +02:00
Max Kellermann
66a1e8b737 Merge tag 'v0.20.20'
release v0.20.20
2018-05-22 12:47:11 +02:00
Max Kellermann
ab197b6d43 release v0.20.20 2018-05-22 12:40:18 +02:00
Max Kellermann
16b0e53a36 android/AndroidManifest.xml: increment version number to 0.20.20 2018-05-22 12:40:11 +02:00
Max Kellermann
bc14a6038e Makefile.am: invoke javac with source/target 1.6
Fixes:

```
error: Source option 5 is no longer supported. Use 6 or later.
error: Target option 1.5 is no longer supported. Use 1.6 or later.
```
2018-05-22 12:37:01 +02:00
Max Kellermann
626329a1cc python/build/meson.py: create build_path if it does not exist 2018-05-22 12:31:37 +02:00
Max Kellermann
8bf250c228 python/build/libs: upgrade CURL to 7.60.0 2018-05-22 11:17:19 +02:00
Max Kellermann
62127bbb12 python/build/libs.py: add libmpdclient 2018-05-12 16:24:24 +02:00
Max Kellermann
786ac87b76 python/build: add support for Meson/ninja based projects 2018-05-12 15:00:17 +02:00
Max Kellermann
c76f4ac89b player/Thread: pause all outputs in single mode
This mostly affects the Pulse output plugin which needs to "cork" the
stream (closes #278).
2018-05-12 14:44:07 +02:00
Michal Koutenský
d495ec71a8 decoder/opus: add support for R128_ALBUM_GAIN tag 2018-05-07 10:57:03 +02:00
Max Kellermann
b763852f57 decoder/dsd: allow 4 MB ID3 tags
Closes #277
2018-05-07 10:53:48 +02:00
Max Kellermann
a8568d7246 Merge branch 'v0.20.x' 2018-05-03 20:15:11 +02:00
Max Kellermann
6522d2f722 decoder/{dsdiff,dsf}: support more MIME types
These are used by DSD-streaming servers.  For example, MiniDLNA uses
"audio/x-dsd".
2018-05-03 12:02:11 +02:00
Max Kellermann
ac61fd1d78 {input,output}/alsa: work around -Wswitch due to SND_PCM_STATE_PRIVATE1 2018-05-03 11:59:18 +02:00
Max Kellermann
c44d1566fa SongFilter: fix "modified-since" filter
Error message sent to client was "basic_string::_M_construct null not
valid" due to passing nullptr to the std::string constructor.

Regression caused by commit 386688b87a
2018-04-30 20:34:25 +02:00
Max Kellermann
80dc7c2f74 increment version number to 0.20.20 2018-04-30 20:32:36 +02:00
Max Kellermann
43a43c1e2b Merge tag 'v0.20.19'
release v0.20.19
2018-04-26 20:06:41 +02:00
Max Kellermann
7b94f0e36b release v0.20.19 2018-04-26 19:57:04 +02:00
Max Kellermann
504e8d564a android/AndroidManifest.xml: increment version number to 0.20.19 2018-04-26 19:56:39 +02:00
Max Kellermann
ac395429c3 db/proxy: implement the group_mask parameter in VisitUniqueTags()
Closes #258
2018-04-26 19:43:33 +02:00
Max Kellermann
388768b3a6 db/proxy: call mpd_search_cancel() after search error
Fixes "search already in progress" errors.
2018-04-26 19:41:19 +02:00
Max Kellermann
5c4169e64e python/build/libs.py: upgrade FFmpeg to 4.0 2018-04-26 19:16:16 +02:00
Max Kellermann
d40e9de2d2 python/build/libs.py: upgrade libvorbis to 1.3.6 2018-04-26 19:14:26 +02:00
Max Kellermann
e08598e7e2 output/alsa: don't submit silence if PCM is not yet running
See code comment.  Closes #260
2018-04-26 17:14:42 +02:00
Max Kellermann
d301a79dcf output/alsa: CopyRingToPeriodBuffer() returns bool 2018-04-26 16:44:23 +02:00
Max Kellermann
98d76627a5 output/alsa: disable events in Cancel()
Don't reactivate the PCM device immediately after Cancel() is
finished; if Cancel() gets called this may mean that new data may take
a while to produce, or no data at all will be produced because the
current song is being stopped.

Once new data is available, Play() will automatically reactivate the
PCM.

This fixes underruns when switching songs manually (closes #264).
2018-04-26 16:41:49 +02:00
Max Kellermann
8a809013f3 output/alsa: reset "active" on error
Use the "active" flag in PrepareSockets() instead of LockHasError().
2018-04-26 16:18:59 +02:00
Max Kellermann
485ed0b156 output/alsa: make the "active" attribute thread-safe 2018-04-26 16:18:52 +02:00
Max Kellermann
7d546f80f9 output/alsa: merge Activate() and UnlockActivate()
Prepare to make the "active" attribute thread-safe.
2018-04-26 16:18:18 +02:00
Max Kellermann
5dfdc15f93 output/alsa: rethrow errors in Drain() 2018-04-26 16:17:14 +02:00
Max Kellermann
a6e5873443 output/alsa: thread-safety documentation for attribute "active" 2018-04-26 15:54:15 +02:00
Max Kellermann
e2cf777538 output/alsa: simplify MultiSocketMonitor::GetEventLoop() calls 2018-04-26 15:54:01 +02:00
Max Kellermann
1e54297be8 lib/ffmpeg/Init: fix av_register_all() deprecation warning
av_register_all() was deprecated in
FFmpeg/FFmpeg@0694d87024
2018-04-25 21:35:33 +02:00
Max Kellermann
44b200240f player/Thread: never reuse decoder when switching radio streams
When switching to another song manually, the player checks if the
decoder is already decoding that song; if so, it will attempt to reuse
it by seeking it to the new position.  That however fails if the
decoder is not seekable (e.g. a radio stream) which leaves the user
unable to switch to that song with the bogus error message "Not
seekable".
2018-04-25 21:19:26 +02:00
Max Kellermann
9c61760713 output/alsa: remove obsolete comment, was moved to Alsa::PeriodBuffer::Allocate() 2018-04-10 15:42:29 +02:00
Max Kellermann
5f86c6d404 configure.ac: add missing "test"
Closes #256
2018-03-22 21:58:31 +01:00
kaliko
6edc834143 doc/protocol.xml: clarify how find behaves with albumartist 2018-03-22 16:34:09 +01:00
Max Kellermann
b7dc3fae7c Merge branch 'v0.20.x' 2018-03-15 20:08:13 +01:00
Max Kellermann
a2340c313f pcm/PcmDop: round down to the nearest multiple of 4 DSD bytes
There was a discrepancy between what was written to the buffer and the
size returned by pcm_dsd_to_dop(): the "for" loop uses num_frames/2,
rounding down, while the return value is num_samples which is
num_frames*channels, without rounding.  This could cause undefined
data at the end of the destination buffer if the source buffer size
was not aligned to multiples of 8 bytes (4 DSD bytes per channel).

The latter however can occur in the 0.21 branch after commit
a06bf388d9

Closes #233
2018-03-15 20:02:00 +01:00
Max Kellermann
37b07a5e7c pcm/PcmDop: use size_t 2018-03-15 20:00:14 +01:00
Max Kellermann
73013a3c04 input/thread: move code to Stop()
Fixes crash due to "pure virtual method called" in the "mms" input
plugin.  Closes #253
2018-03-15 19:29:55 +01:00
Max Kellermann
e8099f01b5 python/build/libs: upgrade CURL to 7.59.0 2018-03-15 11:24:50 +01:00
Max Kellermann
672bdd3a56 doc/user.xml: clarify where mpd.conf is read from on Android
Closes #247
2018-03-15 11:22:38 +01:00
Max Kellermann
c2c2c29658 input/thread: set InputStream::ready after Open() failure
Without setting the "ready" flag, the caller will wait in WaitReady()
forever, locking up MPD.  Closes #252
2018-03-14 13:15:03 +01:00
Michal Smucr
c745e14f47 Bump minimum required version of Boost to 1.54.
lockfree library used by ALSA output plugin is part of Boost from version 1.53,
so this can be theoretically the lowest required version, however
there are issues which are resolved from 1.54 onwards.
2018-03-09 09:23:48 +01:00
Christian Kröner
d84cd500bb Fix build with DSD disabled 2018-03-07 22:40:19 +01:00
Christian Kröner
5b456cadc4 Reset sample rate to initial state on OSX output 2018-03-07 22:38:09 +01:00
Christian Kröner
4be80982a4 Fix sample rate sync on Mac output for low rates 2018-03-07 21:32:21 +01:00
Christian Kröner
4d7f1f0c35 Implement Pause() for OSXOutput plugin 2018-03-07 11:59:43 +01:00
Christian Kröner
d3f097c7f1 Honor 'device "system"' setting for OSX output 2018-03-07 11:59:43 +01:00
Damien Cassou
a3d1b107f4 doc/protocol.xml: Add examples to the description of 'count' 2018-03-07 10:01:29 +01:00
Max Kellermann
e8f08cda53 AUTHORS: add various recent contributors 2018-03-05 19:23:36 +01:00
Max Kellermann
0ab6c176af doc/user.xml: mention that Tidal refuses to give us a token
Related to #196
2018-03-05 16:05:39 +01:00
Max Kellermann
5b0e8c6de0 Merge branch 'v0.20.x' 2018-03-05 11:13:42 +01:00
Max Kellermann
8266ab5588 android/build.py: support the x86 ABI
First commit for issue #69
2018-03-04 20:46:46 +01:00
Max Kellermann
ea552208fc android/build.py: add ABI parameter 2018-03-04 20:43:59 +01:00
Max Kellermann
e86015a72a android/build.py: convert ndk_arch to local variable 2018-03-04 20:32:50 +01:00
Max Kellermann
cf7ec2c9d3 doc/user.xml: add section about compiling for Android 2018-03-04 20:19:22 +01:00
Max Kellermann
dadd3ca671 protocol/ArgParser: disallow negative seek times
Instead of stopping playback (due to seek time overflow), reject the
seek command.  Closes #240

Relative negative values (with "seekcur") are still allowed, and MPD
will fix the resulting position if it turns out to be negative.  But
the "seek" and "seekid" commands use an unsigned time stamp which must
not be negative.
2018-03-04 11:46:11 +01:00
Christian Kröner
67274c018d Really hide hidden cmd opts from help printout. 2018-03-04 11:21:26 +01:00
Christian Kröner
79535212c8 Get rid of GCD on macOS which breaks debug builds
With Grand Central Dispatch used in Main.cxx, debug builds on macOS
crash as the IsInside() assertion gets triggered in the event loop. As
a simple fix, usage of GCD is removed. Plugging and unplugging
headphones or changes of the default output device was tested without
issues. Whatever the original commit tried to fix by GCD probably does
not need fixing anymore.
2018-03-04 10:43:55 +01:00
Max Kellermann
ef5f96a193 increment version number to 0.20.19 2018-03-04 10:42:05 +01:00
Christian Kröner
e89c421313 Initial support for DSD over PCM on macOS
From: Christian Kröner <ckroener@gmx.net>

This just copies the necessary bits and pieces from the ALSA plugin and applies them to OSXOutput based on dop config setting. It only changes the OSXOutput plugin as needed for DoP (further changes to support additionally e.g. integer mode or setting the physical device mode require rather a complete rewrite of the output plugin).

Fortunately the Core Audio API is by default bit perfect and supports DoP with minimal changes (setting the sampling rate accordingly after ensuring that the physical mode supports at least 24 bits per channel seems to be enough). This was tested on an Amanero Combo384 device hooked up to a ES9018 DAC.

USAGE (try only on DACs that support DoP):
- Add dop "yes" option to mpdconf
- Be sure to set at least 24bits per channel before playing some DSD file (using Audio-MIDI-Setup)
- Based on the dop setting, MPD will change the sample rate as required and output DoP signal to the DAC
- Hog mode is recommended to ensure that no other program will try to mix some output with the DoP stream (resulting in bad noise)
- Alternatively set the default output device to another device (e.g. the built-in output) to avoid having other audio interfere with DSD playback
2018-02-26 14:55:03 +01:00
cathugger
47d1d3c855 encoder/opus: add optional stream chaining support
support for chaining ogg opus streams to enable changing stream' metadata on the fly.
currently support is opt-in (enabled by additional option) because lots of clients can't handle this properly yet.
2018-02-25 15:27:08 +00:00
Patryk Hachuła
1628d801f9 playlist/Queue: add one-shot to single mode 2018-02-25 09:50:03 +01:00
Max Kellermann
1fb358249b Merge branch 'v0.20.x' 2018-02-24 23:18:25 +01:00
Max Kellermann
418f71ec0f net/Init: work around -Werror=unused-variable 2018-02-24 23:17:36 +01:00
Max Kellermann
b30a510b45 Merge tag 'v0.20.18'
release v0.20.18
2018-02-24 23:16:06 +01:00
Max Kellermann
0ebeaa9ac2 release v0.20.18 2018-02-24 22:55:06 +01:00
Max Kellermann
25cd47b8dc win32/build.py: enable libnfs
Now that all build failures have been fixed, we can enable the
feature.
2018-02-24 22:44:42 +01:00
Max Kellermann
cd48d981b5 storage/nfs: use PathTraitsFS::const_pointer_type 2018-02-24 22:44:42 +01:00
Max Kellermann
774d26b982 storage/nfs: assume UTF-8 when accessing NFS from Windows
Fixes two build failures with libnfs on Windows.
2018-02-24 22:44:42 +01:00
Max Kellermann
f3e683bd6f test/run_storage: fallback for %F on Windows 2018-02-24 22:44:42 +01:00
Max Kellermann
50ce0c0d9d test/run_storage: initialize WinSock 2018-02-24 22:44:34 +01:00
Max Kellermann
5b80711d75 Main: move WinSock initialization to class ScopeNetInit 2018-02-24 22:44:27 +01:00
Max Kellermann
666e456551 win32/build.py: add -DWINVER=0x0600 -D_WIN32_WINNT=0x0600
configure.ac sets this, but this wasn't used for compiling third-party
libraries.  This setting however is important for libnfs, which adds
fallback definitions for POLLIN and POLLOUT with bogus values.
2018-02-24 22:44:11 +01:00
Max Kellermann
31794ac376 lib/nfs/FileReader: move sys/stat.h to header because "struct stat" may be macro
It indeed is a macro on Windows.
2018-02-24 22:03:38 +01:00
Max Kellermann
2141fdf06e lib/nfs/Connection: use winsock2.h instead of poll.h on Windows 2018-02-24 22:02:42 +01:00
tpoeiras
3f3e0739c4 Fix curl storage plugin failure if the authentication method is different than basic. 2018-02-24 21:59:13 +01:00
Max Kellermann
ebed7e2147 playlist/cue/Parser: parse tags after "INDEX 01"
Instead of setting state=IGNORE_TRACK, ignore only the following
"INDEX" lines.

Correction for commit 8461d71b52.  Closes #227
2018-02-24 21:29:16 +01:00
Max Kellermann
53f5d4c710 android/build.py: disable libmad
Let FFmpeg do the MP3 decoding.  See commit
a4de96508d
2018-02-24 10:52:40 +01:00
Max Kellermann
139a4054c5 python/build/libs.py: remove duplicate FFmpeg option and fix typo
Closes #232
2018-02-24 10:52:09 +01:00
Max Kellermann
a4de96508d python/build/libs.py: re-enable FFmpeg MP3 decoder
libmad has been unmaintained for a long time, and it fails to build on
Windows.  I could go and fix libmad's broken configure script, but I
prefer to just assign MP3 decoding to FFmpeg for now.

Closes #228
2018-02-24 10:49:05 +01:00
Max Kellermann
a7582aaf15 python/build/libs.py: update FFmpeg to 3.4.2 2018-02-24 10:47:46 +01:00
Max Kellermann
c5c1c64a81 python/build/libs.py: add libnfs
Enable the NFS storage plugin on Android.

Closes #226
2018-02-20 22:47:17 +01:00
Max Kellermann
992c52ce7f python/build/autotools.py: add autoreconf support 2018-02-20 22:46:54 +01:00
FlashSystems
9f6af4f2cc Fix for bogus output of the albumart command on 32bit platforms.
read_stream_art uses PRIu64 unconditionally with the Format
method of a Respone instance to output a size_t typed value.
If size_t is 32bit the output is garbeled. This patch uses
offset_type and PRIoffset to make sure the format string
and the type of the output value always match.
2018-02-17 19:19:38 +01:00
Max Kellermann
60efdce5ff Merge branch 'v0.20.x' 2018-02-17 13:37:03 +01:00
Max Kellermann
026aef7465 decoder/flac: move the SubmitData() call out of the callback
This addresses two problems:

1. the libFLAC write callback had to send an error status to its
caller when SubmitData() returned a command; this disrupted libFLAC
and the resulting command could not be used for anything;

2. the libFLAC function FLAC__stream_decoder_seek_absolute() also
calls the write callback, but its result cannot be used, because
seeking is still in progress, so we lose all data from one FLAC frame.
By moving the SubmitData() call until after CommandFinished(), we
avoid losing this data.  This fixes another part of #113
2018-02-17 13:33:53 +01:00
Max Kellermann
b53a23b51b decoder/flac: call FlacSubmitToClient() again after seeking
See code comment.
2018-02-17 13:33:51 +01:00
Max Kellermann
2aad015392 decoder/flac: move code to FlacSubmitToClient() 2018-02-17 13:33:48 +01:00
Max Kellermann
986ec877b0 decoder/Bridge: truncate last chunk at the exact end_time
Instead of passing whole chunks to the MusicPipe and checking the
end_time after each chunk, truncate the last chunk if it would exceed
the end_time.  This requires keeping track of the absolute PCM frame
number.

This fixes a problem with gapless CUE song transitions: a small part
of the following song was always played twice.

Closes #113
2018-02-17 13:10:00 +01:00
Max Kellermann
a68f2cb9fa input/InputPlugin: add API documentation 2018-02-17 10:32:17 +01:00
Max Kellermann
5f5be823f3 input/RemoteTagScanner: add API documentation 2018-02-17 08:49:35 +01:00
Max Kellermann
03700ad37c test/DumpDecoderClient: use STDOUT_FILENO 2018-02-17 08:33:01 +01:00
Max Kellermann
6d01ee9284 test/DumpDecoderClient: convert static local to class attribute 2018-02-17 08:32:16 +01:00
Max Kellermann
cc3c1f31d0 test/DumpDecoderClient: convert to class 2018-02-17 08:31:19 +01:00
Max Kellermann
5909502a13 test/DumpDecoderClient: add API documentation 2018-02-17 08:30:12 +01:00
Max Kellermann
88bbd847e0 test/FakeDecoderAPI: rename to DumpDecoderClient 2018-02-17 08:27:03 +01:00
Max Kellermann
34d14df297 Makefile.am: remove obsolete dependencies on FakeDecoderAPI.cxx 2018-02-17 08:26:10 +01:00
Max Kellermann
bfc886cd54 decoder/Client: update API documentation 2018-02-17 08:20:07 +01:00
cathugger
c43ea74b30 encoder/opus: initialize granulepos to 0
it was uninitialized before
2018-02-17 01:22:17 +01:00
Max Kellermann
79981f3cda increment version number to 0.20.18 2018-02-17 01:21:46 +01:00
Max Kellermann
8624d8c144 doc/user.xml: example "ps" command for real-time scheduling check 2018-02-17 01:07:06 +01:00
Max Kellermann
420582ec5e .travis.yml: enable ccache 2018-02-17 00:30:32 +01:00
Max Kellermann
36207d9726 .travis.yml: add variable MATRIX_EVAL 2018-02-17 00:23:31 +01:00
Max Kellermann
855d1bc5a1 .travis.yml: switch to osx_image xcode9.3beta
The clang/libc++ version in the default xcode8 image is unable to
compile MPD due to incomplete C++14 support.
2018-02-17 00:23:30 +01:00
Max Kellermann
081d15a830 .travis.yml: use "matrix" 2018-02-16 23:21:14 +01:00
Max Kellermann
d29d186d62 output/alsa: use a new I/O thread with real-time scheduling
The normal I/O event thread can have a large latency, e.g. when
libgnutls loads all TLS CA certificates for a https connect.  This
makes it unreliable for the ALSA I/O notifications, and causes ring
buffer xruns.  To avoid interfering with high latency events such as
CURL's, we move the ALSA I/O events to a separate I/O thread which
also obtains real-time scheduling (if possible).

Closes #221
2018-02-16 22:38:55 +01:00
Max Kellermann
61f2ce67dd decoder/HybridDSD: implement seeking 2018-02-13 09:53:05 +01:00
Max Kellermann
60dbf1bea0 decoder/HybridDSD: calculate bit rate 2018-02-13 09:41:07 +01:00
Max Kellermann
58bb866e2d decoder/HybridDSD: add code comments 2018-02-13 09:29:58 +01:00
Max Kellermann
b2ec5d0f01 decoder/HybridDSD: new decoder plugin for Hybrid DSD 2018-02-13 00:00:00 +01:00
Max Kellermann
0c300bd4b4 test/run_decoder: add command-line option to read mpd.conf 2018-02-13 00:00:00 +01:00
Max Kellermann
53acb7bfcb test/run_decder: RAII-style global initialization 2018-02-13 00:00:00 +01:00
Max Kellermann
65bbb0e0aa Merge tag 'v0.20.17'
release v0.20.17
2018-02-11 13:22:43 +01:00
Max Kellermann
c2940a8385 release v0.20.17 2018-02-11 13:02:53 +01:00
Max Kellermann
bede564618 mixer/alsa: work around rounding error at volume 0
Due to rounding errors, a slightly negative value can be passed to
set_normalized_volume(), which will make the log10() call fail.
Actually, volume 0 is already failing because log10(0) is illegal.  So
let's fix this by implementing two corner cases: <=0 and >=100.

Closes #212
2018-02-10 09:07:51 +01:00
Max Kellermann
e0ca4b865a android: require SDK version 14
Closes #213.
2018-02-10 00:03:23 +01:00
Max Kellermann
31c206bf80 android/build.py: add -mfpu=vfp, explicitly disabling NEON
Apparently, clang defaults to NEON when ARMv7 is used.  Not all ARMv7
CPUs we target have NEON, so we need to disable that.
2018-02-10 00:00:57 +01:00
Max Kellermann
9187a08106 lib/curl: remove .netrc support on Android
Not needed on Android, and the implementation uses getpwuid_r() which
is unavailable on old Android versions.
2018-02-09 23:14:29 +01:00
Max Kellermann
3859a50466 python/build/libs.py: convert CURL edit to quilt patch 2018-02-09 23:14:27 +01:00
Max Kellermann
927071e085 python/build/project.py: add quilt support 2018-02-09 22:59:12 +01:00
Max Kellermann
6ba918b203 input/file: don't use posix_fadvise() on Android
Requires Android API 21, but we want to support older versions as
well.
2018-02-09 22:54:22 +01:00
Max Kellermann
e8b70dbca4 SongSave, queue/PlaylistState, tag/ReplayGain: use portable atof() wrappers
For Android pre-5.0 compatibility (#213).
2018-02-09 22:54:22 +01:00
Max Kellermann
0f8d223c7f protocol/ArgParser: move strtof()/strtod() switch to util/NumberParser.hxx 2018-02-09 22:54:22 +01:00
Max Kellermann
19a2885fd5 protocol/ArgParser: use strtod() instead of strtof() on Android
For Android pre-5.0 compatibility (#213).
2018-02-09 22:54:22 +01:00
Max Kellermann
b8a094470b python/build/libs.py: build only the library 2018-02-09 22:54:22 +01:00
Max Kellermann
2988bb77e8 python/build/project: allow trailing digit after letter in version number
For version numbers such as OpenSSH's, e.g.: "7.2p2"
2018-02-09 22:54:22 +01:00
Max Kellermann
738317bf34 doc/user: document MPD on Android
Closes #217
2018-02-09 19:11:39 +01:00
Max Kellermann
e46fbd0780 filter/convert: set the PcmConvert instance only if it was initialized
Fixes valgrind warning.
2018-02-09 19:05:45 +01:00
Max Kellermann
56b74ad990 filter/convert: add method IsActive() 2018-02-09 19:04:45 +01:00
Max Kellermann
6de92bb42b pcm/Order: fix size calculation with 8 channels
This was a buffer overflow bug which could cause MPD crahes when
playing back 8 channels with the ALSA output plugin.

Closes #216
2018-02-09 19:01:12 +01:00
Max Kellermann
c801936e53 db/update/Service: set the update thread name 2018-02-09 18:48:14 +01:00
Max Kellermann
817656504d thread/Util: implement system call wrapper for sched_setscheduler()
There is a POSIX definition for sched_setscheduler(), but Linux does
not implement that; instead of changing the process's scheduler, it
only affects one thread.  This has caused some confusion among
application developers and C library developers.

While glibc implements Linux semantics, Musl has made their
sched_setscheduler() function an always-failing no-op, causing the
error message "sched_setscheduler failed: Function not implemented".

 http://git.musl-libc.org/cgit/musl/commit/src/sched/sched_setscheduler.c?id=1e21e78bf7a5c24c217446d8760be7b7188711c2

Instead of relying on the C library which may be unreliable here, we
now roll our own system call wrapper.

Closes #218
2018-02-09 18:43:45 +01:00
Max Kellermann
6f00f97b66 thread/Util: rename ioprio_set() to linux_ioprio_set()
Juse in cas glibc gets a wrapper for the system call which would then
conflict with ours.
2018-02-09 18:43:45 +01:00
Max Kellermann
5acb978f8f increment version number to 0.20.17 2018-02-09 18:43:45 +01:00
Max Kellermann
5147654f6c SongFilter: fix "modified-since" filter
Error message sent to client was "basic_string::_M_construct null not
valid" due to passing nullptr to the std::string constructor.

Regression caused by commit 386688b87a
2018-02-09 13:19:26 +01:00
Max Kellermann
250b6a3d52 Merge tag 'v0.20.16'
release v0.20.16
2018-02-03 19:59:29 +01:00
Max Kellermann
975a4ae871 release v0.20.16 2018-02-03 19:55:07 +01:00
Max Kellermann
56aaf3c73e python/build/libs: upgrade CURL to 7.58.0 2018-02-03 19:46:31 +01:00
Max Kellermann
12fd1cad0c archive/iso9660: libcdio 2.0 compatibility
Closes #173
2018-02-03 19:32:31 +01:00
Max Kellermann
73ddbcc876 player/Thread: wake up the main thread after failed seek
Fixes deadlock bug.  Closes #210
2018-02-03 19:28:39 +01:00
Max Kellermann
e573cbf032 db/update/Queue: work around GCC7 -Wuninitialized 2018-02-01 19:53:42 +01:00
Max Kellermann
dead461542 lib/upnp/Init: enable IPv6 2018-01-31 18:15:46 +01:00
Max Kellermann
3d5da1ac73 lib/upnp/Init: use nullptr instead of 0 2018-01-31 18:14:26 +01:00
Max Kellermann
ec408ca6a6 output/pulse: fix crash during auto-detection
The PulseOutput needs to be "enabled" before WaitConnection() may be
called.

Closes #207
2018-01-30 10:06:36 +01:00
Max Kellermann
ce2b6dc84d RemoteTagCache: new glue class for integrating RemoteTagScanner
This commit also puts an instance of RemoteTagScanner into the
Instance class, and hooks it into the "add" and "addid" commands.
2018-01-30 00:05:57 +01:00
Max Kellermann
7d16d8c887 Listen: move ClientListener pointer to struct Partition 2018-01-29 23:53:52 +01:00
Max Kellermann
1df5c5a76e Listen: move class ClientListener to src/client/Listener.hxx 2018-01-29 23:48:16 +01:00
Max Kellermann
52da387a1d Main: move part of the shutdown code to Instance methods 2018-01-29 23:45:48 +01:00
Max Kellermann
c1221c5c87 Main: cancel the update on shutdown even if inotify is unavailable
Fixup for commit 681e012fb5
2018-01-29 23:37:56 +01:00
Max Kellermann
befd669075 Instance: rename Shutdown() to Break() 2018-01-29 23:31:41 +01:00
Max Kellermann
b6013a92e0 lib/curl/Request: merge two "try" blocks 2018-01-29 23:25:03 +01:00
Max Kellermann
19af364400 event/Thread: add "noexcept" 2018-01-29 23:11:15 +01:00
Max Kellermann
3fd9a86f3c event/Call: invoke function directly if the EventLoop is dead
Works around a deadlock bug which happens when waiting for an
EventLoop which isn't running anymore.
2018-01-29 23:06:43 +01:00
Max Kellermann
ce68701c0c event/Loop: add flag "dead" 2018-01-29 22:52:13 +01:00
Max Kellermann
6ea2cb3644 event/Thread: remove unused method StopAsync() 2018-01-29 22:50:21 +01:00
Max Kellermann
199c8aaa25 event/Loop: move code to HandleTimers() 2018-01-29 22:40:12 +01:00
Max Kellermann
9ce6828d72 filter/convert: call PcmConvert::Flush() only if initialized
Fixes another part of #208, the one which caused the bogus exception.
2018-01-29 22:35:28 +01:00
Max Kellermann
7ff5cf8372 filter/convert: add method IsActive() 2018-01-29 22:33:54 +01:00
Max Kellermann
eb771eaf0d output/Thread: re-lock the mutex after flush error
Fixes deadlock due to mutex double lock.
2018-01-29 22:30:56 +01:00
Max Kellermann
6908555ed3 filter/Observer: drop bogus "noexcept"
Closes #208.
2018-01-29 22:14:27 +01:00
Max Kellermann
3890bc5a96 event/Loop: add "noexcept" 2018-01-29 22:05:58 +01:00
Max Kellermann
2c65f986d6 event/EPoll: use C++11 initializer 2018-01-29 22:05:13 +01:00
Max Kellermann
ea402b765c event/WinSelect: pass const reference to copy constructor 2018-01-29 22:05:13 +01:00
Max Kellermann
497e0669ff event/PollResult: use size_t for size and index 2018-01-29 21:56:12 +01:00
Max Kellermann
13ac74e0a2 system/EPollFD: update API documentation 2018-01-29 21:49:27 +01:00
Max Kellermann
c2f23d92dc system/EPollFD: add "noexcept" 2018-01-29 21:48:39 +01:00
Max Kellermann
7027da3cd3 Instance: un-inline the destructor
Allows more forward declarations.
2018-01-29 18:43:10 +01:00
Max Kellermann
005bb59797 test/run_input: move code from Scan() to input/ScanTags.cxx 2018-01-29 16:57:44 +01:00
Max Kellermann
88bc3a9271 input/qobuz: implement InputPlugin::scan_tags() 2018-01-26 20:08:01 +01:00
Max Kellermann
2e32cf7b87 input/tidal: implement InputPlugin::scan_tags() 2018-01-26 20:08:01 +01:00
Max Kellermann
3ecf5fd442 test/run_input: add frontend for InputPlugin::scan_tags() 2018-01-26 20:08:01 +01:00
Max Kellermann
3e9c3c8ae8 input/Plugin: add method scan() with asynchronous callback class
To be used when a URL gets added.
2018-01-26 19:29:38 +01:00
Max Kellermann
ec31e8df1d input/qobuz: remove obsolete prototypes 2018-01-26 19:29:38 +01:00
Max Kellermann
b56bfbae26 input/tidal: add setting "audioquality" 2018-01-26 19:18:13 +01:00
Max Kellermann
f55b1415d4 input/qobuz: move code to ExtractQobuzTrackId() 2018-01-26 18:48:15 +01:00
Max Kellermann
67693c6ad0 input/qobuz: add setting "format_id" 2018-01-26 17:30:28 +01:00
Max Kellermann
fce061b544 input/tidal: move code to ExtractTidalTrackId() 2018-01-26 17:29:58 +01:00
Max Kellermann
93765fcb30 input/{tidal,qobuz}: remove unused list_base_hook 2018-01-26 16:56:56 +01:00
Max Kellermann
b221bd7472 input/qobuz: remove bogus "noexcept"
This change was missing in 47fa8c4cf6
2018-01-25 15:19:33 +01:00
Max Kellermann
fd0a5a1116 decoder/{dsdiff,dsf,mpg123,wavpack}: avoid exceptions in scan methods
The scan methods must be "noexcept".
2018-01-25 13:01:39 +01:00
Max Kellermann
47fa8c4cf6 input/{tidal,qobus}: add bogus "noexcept"
The CurlRequest constructor can throw exceptions, therefore we must
not use "noexcept".
2018-01-25 12:58:58 +01:00
Max Kellermann
7640609b41 input/tidal: retry if session is expired 2018-01-24 15:35:02 +01:00
Max Kellermann
e8e6357b73 input/tidal/Error: add method IsInvalidSession() 2018-01-24 15:34:59 +01:00
Max Kellermann
4398101706 input/tidal: parse subStatus in error responses 2018-01-24 15:34:57 +01:00
Max Kellermann
2e1481f49d input/tidal: add exception class TidalError
Allows catchers to inspect the HTTP status.
2018-01-24 15:34:54 +01:00
Max Kellermann
c7c087a0d2 input/tidal: add some debug logging 2018-01-24 15:29:30 +01:00
Max Kellermann
3461580b34 test/run_input: add option "--verbose" 2018-01-24 15:29:30 +01:00
Max Kellermann
fcfdeac1c7 test/test_translate_song: use std::to_string() 2018-01-24 13:38:44 +01:00
Max Kellermann
97f670658f util/StringFormat: new utility library 2018-01-24 13:28:28 +01:00
Max Kellermann
4324fb2fbe input/Offset: add macro PRIoffset 2018-01-24 13:26:43 +01:00
Max Kellermann
e4cb74cf7b input/curl: remove obsolete Windows sprintf() fallback
See commit be137a191e
2018-01-24 13:26:18 +01:00
Max Kellermann
be137a191e util/FormatString: remove obsolete Windows fallback
Since 7d353bbe2a, _GNU_SOURCE is always
defined, which implies __USE_MINGW_ANSI_STDIO and thus switches to
the mingw implementations of the printf() family.  That's
standards-compliant, unlike Microsoft's CRT implementations.
2018-01-24 13:22:43 +01:00
Max Kellermann
fe1f3df36e util/StringBuffer: add "noexcept" 2018-01-24 12:52:05 +01:00
Max Kellermann
4a330a4c33 input/qobuz: use class DelegateCurlResponseHandler to eliminate duplicate code 2018-01-24 11:33:01 +01:00
Max Kellermann
75e60669a7 input/tidal: include cleanup 2018-01-24 11:33:01 +01:00
Max Kellermann
db379c6172 player/Thread: remove bogus "noexcept" from play_chunk()
Closes #203
2018-01-24 11:21:28 +01:00
Max Kellermann
1da64fb79c lib/curl/Delegate: helper class for response body parsers
Eliminate duplicate code.
2018-01-23 16:48:43 +01:00
Max Kellermann
8b42fd0a28 Merge branch 'v0.20.x' 2018-01-23 16:45:57 +01:00
Max Kellermann
ea66cdd6a5 test/read_mixer: another kludge to work around -Wnull-dereference 2018-01-23 16:42:25 +01:00
Max Kellermann
f762e8034f test/NullMixerListener: new class to fix -Wnull-dereference 2018-01-23 16:28:56 +01:00
Max Kellermann
2c401f1102 decoder/{adplug,sidplay}: add missing "noexcept"
Closes #202
2018-01-23 10:02:36 +01:00
Max Kellermann
bb1e369f30 playlist/SoundCloud: fix -Wunused-lambda-capture 2018-01-23 09:57:52 +01:00
Max Kellermann
d084950b1a input/qobuz: dispose the TidalLoginRequest earlier 2018-01-21 20:17:50 +01:00
Max Kellermann
2ce10f2fed input/qobuz: dispose the QobuzTrackRequest 2018-01-21 19:59:17 +01:00
Max Kellermann
036094799b input/qobuz: pass std::string by value to OnQobuzTrackSuccess() 2018-01-21 19:58:21 +01:00
Max Kellermann
2da6ab2a45 input/qobuz: dispose the QobuzLoginRequest earlier 2018-01-21 19:45:03 +01:00
Max Kellermann
91a512606b input/qobuz: remove unused variable 2018-01-21 15:01:31 +01:00
Max Kellermann
b6d858f4d6 lib/expat/Parser: make the "is_final" argument optional 2018-01-21 14:37:10 +01:00
Max Kellermann
dedede3caa lib/expat/Parser: add method CompleteParse() 2018-01-21 14:35:47 +01:00
Max Kellermann
b14fc907f9 lib/expat/Parser: forward Parse() arguments 2018-01-21 14:34:53 +01:00
Max Kellermann
542bbb0889 input/qobuz: parse and report message from error responses 2018-01-21 12:52:54 +01:00
Max Kellermann
714e69e708 input/qobuz: create JSON parser on demand 2018-01-21 12:49:10 +01:00
Max Kellermann
cb87ed29d8 input/tidal: invoke login handlers on second request
Fixes a freeze bug.
2018-01-21 12:41:19 +01:00
Max Kellermann
570c6765b0 input/tidal: parse and report userMessage from error responses 2018-01-21 12:30:46 +01:00
Max Kellermann
12a2285ba5 input/tidal: create JSON parser on demand 2018-01-21 12:29:52 +01:00
Max Kellermann
1c023eac70 db/update/Walk: add "noexcept" 2018-01-21 11:53:59 +01:00
Max Kellermann
1e3f0650df SongUpdate: add "noexcept" 2018-01-21 11:53:42 +01:00
Max Kellermann
1e9da09f62 TagFile: add "noexcept" 2018-01-21 11:53:42 +01:00
Max Kellermann
5caf351c44 TagArchive: add "noexcept" 2018-01-21 11:53:42 +01:00
Max Kellermann
7d789a984a decoder/Plugin: add "noexcept" 2018-01-21 11:47:17 +01:00
Max Kellermann
d921114832 db/Helpers: add "noexcept" 2018-01-21 11:37:13 +01:00
Max Kellermann
39a1f03d5c db/PlaylistVector: add "noexcept" 2018-01-21 11:36:16 +01:00
Max Kellermann
c6a4a4edf1 playlist/Print: add "noexcept" 2018-01-21 11:35:31 +01:00
Max Kellermann
45748a2bb0 playlist/Song: add "noexcept" 2018-01-21 11:35:28 +01:00
Max Kellermann
9b13d862c1 playlist/Registry: add "noexcept" 2018-01-21 11:35:27 +01:00
Max Kellermann
590edc648a playlist/Plugin: add "noexcept" 2018-01-21 11:35:25 +01:00
Max Kellermann
3326c87a88 db/Count: add "noexcept" 2018-01-21 11:33:53 +01:00
Max Kellermann
0ec1863fcb db/Print: add "noexcept" 2018-01-21 11:32:22 +01:00
Max Kellermann
2b67a14155 SongPrint: add "noexcept" 2018-01-21 11:32:10 +01:00
Max Kellermann
eac8caa4de TagPrint: add "noexcept" 2018-01-21 11:30:47 +01:00
Max Kellermann
61eb2aa328 storage/Interface: wrap StorageDirectoryReader in std::unique_ptr 2018-01-21 11:04:30 +01:00
Max Kellermann
a9847ebf54 playlist/Queue: use "auto" 2018-01-20 20:14:19 +01:00
Max Kellermann
4ca1089f60 input/TextInputStream: ReadLine() throws exception on error 2018-01-20 20:13:08 +01:00
Max Kellermann
926d4150c5 playlist/SongEnumerator: allow NextSong() to throw exceptions 2018-01-20 20:11:15 +01:00
Max Kellermann
6f267adc14 playlist/SongEnumerator: add "noexcept" 2018-01-20 20:10:46 +01:00
Max Kellermann
0095e2d7d8 playlist/Plugin: use std::unique_ptr<SongEnumerator> 2018-01-20 19:59:42 +01:00
Max Kellermann
147f64e1fc playlist/Plugin: remove useless wrapper functions 2018-01-20 19:58:11 +01:00
Max Kellermann
b8e5932506 tag/{Tag,Builder}: use std::lock_guard 2018-01-20 19:53:38 +01:00
Max Kellermann
1ea04cd8cc tag/Pool: add "noexcept" 2018-01-20 19:53:38 +01:00
Max Kellermann
b334643b68 tag/Pool: use C++11 initializers 2018-01-20 19:53:38 +01:00
Max Kellermann
6e6a0275b5 tag/Pool: use uint8_t instead of unsigned char 2018-01-20 19:53:38 +01:00
Max Kellermann
f5590806e0 tag/Handler: add "noexcept" 2018-01-20 19:53:38 +01:00
Max Kellermann
f686e838fe tag/Builder: add "noexcept" 2018-01-20 19:53:38 +01:00
Max Kellermann
ea8642dec9 tag/Builder: use C++11 initializers 2018-01-20 19:53:38 +01:00
Max Kellermann
eef5b58211 tag/Tag: add "noexcept" 2018-01-20 19:39:46 +01:00
Max Kellermann
1de68b72b9 tag/Tag: use C++11 initializers 2018-01-20 19:39:06 +01:00
Max Kellermann
720df085e5 input/TextInputStream: add "noexcept" 2018-01-20 19:35:09 +01:00
Max Kellermann
f90f17227b input/Domain: remove obsolete variable 2018-01-20 19:19:29 +01:00
Max Kellermann
36f7eaadef input/LocalOpen: make assert() more strict 2018-01-20 19:15:51 +01:00
Max Kellermann
1eb9300658 input/LocalOpen: include cleanup 2018-01-20 19:14:42 +01:00
Max Kellermann
27e4656515 input/{file,archive}: remove the dummy InputPlugin instances
These have no use, exception for creating an artificial dependency
from input_plugins[] to all archive plugins.
2018-01-20 19:07:34 +01:00
Max Kellermann
e0a09dbd69 input/thread: add "noexcept" 2018-01-20 18:54:29 +01:00
Max Kellermann
30832ab33a input/InputStream: add "noexcept" to constructor 2018-01-20 18:53:37 +01:00
Max Kellermann
d20b545a94 input/InputStream: remove methods Lock() and Unlock()
These methods are not exception-safe; std::lock_guard should better be
used.
2018-01-20 18:51:23 +01:00
Max Kellermann
20d01be1ad input/mms: use class ScopeUnlock 2018-01-20 18:51:00 +01:00
Max Kellermann
d6b62d7512 input/tidal: delete request objects upon completion 2018-01-20 00:34:44 +01:00
Max Kellermann
ab9d9541a8 input/tidal: pass std::string by value
Don't keep any references to the owner, as the handler method may
delete the owner.
2018-01-20 00:33:01 +01:00
Max Kellermann
c3b8568560 lib/curl/Handler: add API documentation 2018-01-20 00:28:54 +01:00
Max Kellermann
8bd95a4eb1 db/update/Container: include cleanup 2018-01-20 00:25:57 +01:00
Max Kellermann
2dac3ef58e client: eliminate client_printf() 2018-01-20 00:24:18 +01:00
Max Kellermann
86c7ab29f4 client/Idle: pass Response instead of Client to WriteIdleResponse() 2018-01-20 00:22:47 +01:00
Max Kellermann
db89e5ec28 client/Idle: move code to WriteIdleResponse() 2018-01-20 00:22:30 +01:00
Max Kellermann
d096f75fb8 client/Idle: apply idle_subscriptions mask once 2018-01-20 00:22:09 +01:00
Max Kellermann
854424a758 client/Idle: use std::exchange() 2018-01-20 00:21:26 +01:00
Max Kellermann
fe5d0ce827 Merge branch 'v0.20.x' 2018-01-20 00:04:35 +01:00
Max Kellermann
8376578921 db/simple/Mount: drop mount point prefix from LOCATE_TAG_BASE_TYPE
Fixes search within mount points, resulting in error "No such
directory".

Closes #190
2018-01-19 23:52:57 +01:00
Max Kellermann
ed2354cd9d SongFilter: allow copying items 2018-01-19 23:52:03 +01:00
Max Kellermann
386688b87a SongFilter: use std::string instead of AllocatedString 2018-01-19 23:51:42 +01:00
Max Kellermann
38d56dddf1 lib/icu/Compare: allow copying 2018-01-19 23:49:50 +01:00
Max Kellermann
e8975942ec Makefile.am: link libicu.a before libutil.a
libicu.a depends on libutil.a.
2018-01-19 23:38:24 +01:00
Max Kellermann
3ca80a7336 util/RefCount, db/simple/Mount: remove obsolete libc++ workarounds
No longer a problem with NDK r16.
2018-01-19 23:19:46 +01:00
Max Kellermann
d029dae7ad Makefile.am: use Android SDK build-tools 27.0.0 2018-01-19 23:04:54 +01:00
Max Kellermann
9e058732ee android/build.py: add -fpic
Android native code should be position-independent.

The NDK build scripts use "-fpic" instead of "-fPIC" for ARM, but that
doesn't work with FFmpeg's assembly code, because it requires
R_ARM_MOVW_ABS_NC which is unavailable with "-fpic".
2018-01-19 22:40:59 +01:00
Max Kellermann
cad5d11261 android/build.py: simplify libc++ flags
By telling clang which implementation to use, we avoid the dependency
on libstdc++.so.
2018-01-19 22:36:19 +01:00
Max Kellermann
2fed3b5e5b input/Tidal*Request: add Start() method
The caller should be able to safely store the instance pointer before
his callback is invoked.
2018-01-19 16:03:05 +01:00
Max Kellermann
1ecad094bd input/tidal: add API documentation 2018-01-19 16:03:03 +01:00
Stefan Roellin
187cc573a7 db/upnp/Directory: fix parsing of durations with fractions of seconds
The duration of a song can have fractions of seconds
(quote from http://www.upnp.org/schemas/av/didl-lite-v2.xsd):

    The format of the duration string is:
    H+:MM:SS[.F+], or H+:MM:SS[.F0/F1]
    Where:
    +H              one or more digits to indicate elapsed hours,
    MM              exactly 2 digits to indicate minutes (00 to 59),
    SS              exactly 2 digits to indicate seconds (00 to 59),
    F+              any number of digits (including no digits) to indicate fractions of seconds,
    F0/F1   a fraction, with F0 and F1 at least one digit long,
                    and F0 < F1.
    The string may be preceded by an optional + or - sign, and the
    decimal point itself may be omitted if there are no fractional  seconds digits.

Until now, a duration with fractions of seconds could not be parsed and
resulted in an unknown duration. Only durations in the format "H+:MM:SS"
were feasible. This commit enables to read durations in the first format,
i.e. "H+:MM:SS[.F+]"
2018-01-19 15:53:18 +01:00
Max Kellermann
fcaedec2ab {android,win32}/build.py: move "-O* -g" to common_flags 2018-01-19 12:33:28 +01:00
Max Kellermann
ead9d59e88 python/build/libs.py: build only libFLAC, no programs 2018-01-19 12:33:03 +01:00
Max Kellermann
34b8a17ccd python/build/autotools.py: add "subdir" parameter 2018-01-19 11:39:36 +01:00
Max Kellermann
a53d081c39 python/build/libs.py: disable libFLAC API documentation 2018-01-19 11:38:24 +01:00
Max Kellermann
823134e4ba python/build/libs.py: disable Opus documentation and extra programs 2018-01-19 11:32:40 +01:00
Max Kellermann
272167b4fc python/build/libs.py: update LAME to 3.100 2018-01-18 22:07:28 +01:00
Max Kellermann
92f09bba94 Makefile.am: rename JAVA_SOURCES to JAVA_SOURCE_PATHS
Work around automake warning:

    Makefile.am:310: warning: variable 'JAVA_SOURCES' is defined but no program or
    Makefile.am:310: library has 'JAVA' as canonical name (possible typo)

Closes #195
2018-01-18 22:05:04 +01:00
Max Kellermann
0ead72a404 lib/upnp/ContentDirectoryService: work around GCC 5 bug
Closes #193
2018-01-18 21:55:58 +01:00
Max Kellermann
bbc5212436 fs/AllocatedPath: make the nullptr_t constructor public 2018-01-17 12:17:41 +01:00
Max Kellermann
c4f7740b80 fs/Path: replace method Null() with nullptr_t constructor 2018-01-17 12:16:21 +01:00
Max Kellermann
6c239f7a00 test/run_input: add option to load a configuration file 2018-01-17 12:09:08 +01:00
Max Kellermann
7d5b859756 test/run_input: add command-line option parser 2018-01-17 12:04:01 +01:00
Max Kellermann
3e2e0d062b util/OptionParser: support option values 2018-01-17 11:14:57 +01:00
Max Kellermann
c45fe3517c util/OptionParser: add struct Result
Prepare for option values.
2018-01-17 11:08:05 +01:00
Max Kellermann
d588da69e5 CommandLine: convert pointer to reference 2018-01-17 11:08:03 +01:00
Max Kellermann
ec54a5c72c CommandLine: use C++11 initializers 2018-01-17 11:08:02 +01:00
Max Kellermann
735a371249 util/OptionParser: pass array of OptionDefs to constructor 2018-01-17 10:24:06 +01:00
Max Kellermann
5ab086e337 util/OptionParser: loop in ParseNext() until a new option is found 2018-01-16 11:25:18 +01:00
Max Kellermann
68f660dbcc util/OptionParser: collect remaining arguments
Allow the caller to use a simple "for" loop without checking
arguments.
2018-01-16 11:08:23 +01:00
Max Kellermann
0066f7a818 util/{Const,Writable}Buffer: add constructor with two pointers 2018-01-16 11:06:33 +01:00
Max Kellermann
65059f2add util/{Const,Writable}Buffer: eliminate static method Null(), use nullptr cast instead 2018-01-16 11:04:51 +01:00
Max Kellermann
23dff4f209 util/OptionParser: use ConstBuffer<const char*> to store argv/argc 2018-01-16 10:22:06 +01:00
Max Kellermann
4a304bf34e util/OptionParser: make string pointers "const" 2018-01-16 10:20:53 +01:00
Max Kellermann
36a6405e8b util/OptionParser: add "constexpr" 2018-01-16 10:20:52 +01:00
Max Kellermann
42c1fe963b util/OptionParser: add "noexcept" 2018-01-16 10:13:39 +01:00
Max Kellermann
465b154fc0 util/OptionParser: use C++11 initializers 2018-01-16 10:12:48 +01:00
Max Kellermann
a0c4102b5a util/OptionDef: add "constexpr" 2018-01-16 10:11:35 +01:00
Max Kellermann
9420066895 input/qobuz: new input plugin to receive Qobuz streams 2018-01-15 21:50:20 +01:00
Max Kellermann
74eac1d449 lib/curl/Request: add constructor without "url" parameter
Allows constructing the request first and set the URL later.  This is
needed because curl_easy_escape() is needed to construct the URL,
which however needs the CURL "easy" handle created by the Request class.
2018-01-15 10:36:48 +01:00
Max Kellermann
96676f8f3b Merge branch 'v0.20.x' 2018-01-15 09:06:31 +01:00
Max Kellermann
93b51d56aa input/tidal: new input plugin to receive Tidal streams 2018-01-12 14:33:22 +01:00
Max Kellermann
86c50574d2 lib/yajl/Callbacks: add wrappers for start_array and end_array 2018-01-12 14:33:22 +01:00
Max Kellermann
efb528f979 player/Thread: wake up the decoder when the pipe has run empty
This is another instance of the kludge we already have a few lines
above that.  It works around a deadlock/race condition revealed by
commit 98a7c62d7a
2018-01-12 14:33:22 +01:00
Max Kellermann
edcd0b9913 lib/curl/Request: add methods StartIndirect(), StopIndirect() 2018-01-11 20:51:23 +01:00
Max Kellermann
55d1473918 lib/yajl/Callbacks: OO wrapper for yajl_callbacks 2018-01-11 20:25:17 +01:00
Max Kellermann
0211c7f7f3 lib/yajl/ParseInputStream: use InputStream::LockRead() to reduce lock duration 2018-01-11 20:11:04 +01:00
Max Kellermann
5913994169 lib/yajl/ParseInputStream: eliminate variable "done" 2018-01-11 20:09:52 +01:00
Max Kellermann
26b1573cbe playlist/SoundCloud: move code to Yajl::Parse(InputStream&) 2018-01-11 20:08:02 +01:00
Max Kellermann
7fe07324d7 playlist/SoundCloud: soundcloud_parse_json() throws exception 2018-01-11 20:08:01 +01:00
Max Kellermann
8e29430f21 lib/yajl/Handle: libyajl C++ bindings 2018-01-11 19:25:46 +01:00
Max Kellermann
326488aeeb configure.ac: decouple libyajl detection from SoundCloud
Allow using libyajl in other parts of MPD.
2018-01-11 19:13:19 +01:00
Max Kellermann
cb86023bd7 lib/curl/Form: new library 2018-01-11 17:27:25 +01:00
Max Kellermann
bd2cb40424 lib/curl/Easy: add curl_easy_escape() wrapper 2018-01-11 17:27:25 +01:00
Max Kellermann
e9a3ff0e70 input/failing: new class 2018-01-11 16:18:15 +01:00
Max Kellermann
5148e229e0 input/proxy: allow input==nullptr
Allow implementations to install the "real" input later.
2018-01-11 15:57:57 +01:00
Max Kellermann
1ad21c27c9 input/curl: add public function to construct an instance 2018-01-11 15:53:46 +01:00
Max Kellermann
f392e13077 input/curl: pass additional request headers to constructor
Prepare to allow callers to pass custom request headers.
2018-01-11 15:43:59 +01:00
Max Kellermann
3fe5b42b2b input/curl: pass IcyMetaDataParser to constructor
Allows the caller to decide whether to enable the feature.
2018-01-11 15:32:19 +01:00
Max Kellermann
70c4b621cf input/curl: remove impossible "icy" checks
The IcyMetaDataParser cannot be initialized already in OnHeaders(),
because it will be initialized late in that method; and there will not
be another OnHeaders() call, because streams with Icy metadata are not
seekable, thus there will not be another HTTP request.
2018-01-11 14:55:29 +01:00
Max Kellermann
a8df5e109b input/curl: use StringView::StartsWith() 2018-01-11 14:52:35 +01:00
Max Kellermann
ba4f1da466 input/curl: create the request_headers list only once 2018-01-11 12:49:01 +01:00
Max Kellermann
0bfbe6771e input/curl: un-inline constructor 2018-01-11 12:46:52 +01:00
Max Kellermann
d1df0fec19 input/curl: add "noexcept" 2018-01-11 12:36:31 +01:00
Max Kellermann
031ccce8b7 input/curl: convert struct to class 2018-01-11 12:31:29 +01:00
Max Kellermann
1f50bdb230 event/Loop: use std::atomic_bool for the "quit" variable
Fixes thread sanitizer warnings.
2018-01-08 10:06:23 +01:00
Max Kellermann
2eef4e6716 thread/Thread: add debug attribute "inside_handle"
This attribute shall be used only for IsInside() to make this safe
against a race condition described in #188:

> There is no requirement on the implementation that the ID of the
> created thread be available before the newly created thread starts
> executing.

http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_create.html):

This means that on some pthread implementations (e.g. Haiku), the
assert(thread.IsInside()) could fail.

Closes #188
2018-01-08 09:58:18 +01:00
Max Kellermann
d989dbfec4 thread/Thread: make IsInside() debug-only
This method is only used inside assert().
2018-01-08 09:56:39 +01:00
Max Kellermann
ca9fcec364 thread/Thread: fix indent 2018-01-08 09:49:08 +01:00
Max Kellermann
34eef0ed84 Merge branch 'v0.20.x' 2018-01-07 17:24:05 +01:00
Max Kellermann
354104f9a9 thread/{Thread,Id}: use defaul-initialized pthread_t as "undefined" value
Use the "==" operator instead of pthread_equal().

This allows us to eliminate two boolean flags which are there to avoid
race conditions, and made the thing so fragile that I got tons of
(correct) thread sanitizer warnings.
2018-01-07 17:20:26 +01:00
Max Kellermann
8649ea3d6f thread/Thread: use BoundMethod 2018-01-07 17:20:26 +01:00
Max Kellermann
752ff12c37 thread/Thread: move code to Run() 2018-01-07 17:20:26 +01:00
Max Kellermann
4bb89b1755 MusicPipe: lock the mutex in Peek() and GetSize() 2018-01-07 17:20:22 +01:00
Max Kellermann
be068f360d Merge remote-tracking branches 'mmuman/configure-sockaddr-sin-len' and 'mmuman/haiku-build-fix' 2018-01-06 13:19:58 +01:00
Max Kellermann
0ef553d30e increment version number to 0.20.16 2018-01-06 13:15:47 +01:00
François Revol
5b18b66282 Haiku: fix build
Convert the fill_buffer to a class method, to allow accessing the private method.

Also remove the leftover Wrapper stuff.
2018-01-05 23:10:58 +01:00
François Revol
7b2283c28b configure.ac: autodetect sin_len member in struct sockaddr_in.
This fixes a build issue on Haiku as it does have sin_len.
Tested on Linux as well.

For some reason AC_CHECK_MEMBER doesn't generate the proper define
in config.h.in, so I used AC_CHECK_MEMBERS.
2018-01-05 22:20:47 +01:00
Max Kellermann
c74e018359 Merge branch 'v0.20.x' 2018-01-05 18:11:04 +01:00
Max Kellermann
43a62aef07 android: release 0.20.15 2018-01-05 18:09:56 +01:00
Max Kellermann
ed4d0aa909 release v0.20.15 2018-01-05 17:55:25 +01:00
Max Kellermann
023ce4e720 python/build/libs.py: disable even more FFmpeg modules 2018-01-05 17:41:58 +01:00
Max Kellermann
368d9359dd python/build/libs.py: update libogg to 1.3.3 2018-01-05 17:41:58 +01:00
Max Kellermann
d98c19d561 python/build/libs.py: disable more FFmpeg modules 2018-01-05 16:49:28 +01:00
Max Kellermann
cab77e35e0 queue/PlaylistControl: fix crash after seek failure
This completes the bug fix commit
2065e3290452377b2931f3129b230c8cc536cbc8; if we clear "queued" then we
must clear "queued_song" as well, or another variant of the assertion
fails.
2018-01-05 13:00:24 +01:00
Max Kellermann
e3e90b4b93 python/build/libs.py: disable libcurl SMB support
MPD doesn't use this feature anyway.
2018-01-05 12:00:29 +01:00
Max Kellermann
f8c69893e1 python/build/libs.py: disable lots of useless FFmpeg features 2018-01-05 11:11:20 +01:00
Max Kellermann
49678a0893 python/build/libs.py: suppress "visibility default" in libopus build 2018-01-05 10:33:53 +01:00
Max Kellermann
d667b5b48c python/build/libs.py: work around libid3tag CFLAGS bug 2018-01-05 10:25:16 +01:00
Max Kellermann
4a120f8090 Merge branch 'v0.20.x' 2018-01-05 10:10:17 +01:00
Max Kellermann
9cba55b39c python/build/project.py: add "edits" parameter to edit source files 2018-01-05 10:06:22 +01:00
Max Kellermann
c2cbb7b8ce output/haiku: remove unimplemented Cancel() method 2018-01-05 10:05:14 +01:00
Max Kellermann
79b0f97a3f output/Interface: clarify Play() API documentation 2018-01-05 08:35:40 +01:00
Felix Hädicke
8217d75ca1 build/python: refactoring: introduce new class MakeProject
This introduces a the new class MakeProject, which is used as a base
class for all Makefile based thirdparty libraries.
2018-01-05 08:17:17 +01:00
Max Kellermann
1ca70d9759 build/python/autotools: add properties "ldflags", "libs", "install_target" 2018-01-05 08:17:15 +01:00
Felix Hädicke
4303aaa9b8 build/python: use "glibtoolize", not "libtoolize" when compiling on OS X
On OS X, the "libtoolize" command is some Apple tool. The libtoolize
we want is named "glibtoolize" in Homebrew.
2018-01-05 07:55:59 +01:00
Max Kellermann
7b56bae289 python/build/libs.py: pass --disable-debugging to libid3tag and libmad 2018-01-05 07:30:09 +01:00
Max Kellermann
4183416b3e python/build/libs.py: reindent arrays 2018-01-05 07:27:09 +01:00
Max Kellermann
a60dee57ce python/libs: upgrade Boost to 1.66.0 2018-01-05 07:16:38 +01:00
Max Kellermann
5724656acb android/build.py: enable function/data sections in static libraries
.. and make all library symbols hidden by default.

Saves big amounts of .text section size with --gc-sections, because
only this allows discarding unused functions from those (static)
third-party libraries.
2018-01-04 23:33:07 +01:00
Max Kellermann
329f9cd9fe thread/Util: no ioprio_set() on Android due to seccomp/SIGSYS 2018-01-04 19:33:14 +01:00
Felix Hädicke
fbdb8b406e Makefile.am: build Android APK package without Ant
In current Android SDK releases, Ant support was removed. Move the
necessary build steps from the former Ant build system to our Makefile,
and call the required build tools from the Android SDK (aapt and dx),
Java SDK (javac) and Info-ZIP (zip) directly.

[mk: copied from Felix's commit
e52b906dba971a1173f9e8f83d32b52ee9f89af3 in the XCSoar project)
2018-01-04 18:55:54 +01:00
Max Kellermann
85d0bbd957 Makefile.am: add variable ZIPALIGN 2018-01-04 18:55:45 +01:00
Max Kellermann
414f00d6ae Makefile.am: add variable ANDROID_SDK_PLATFORM 2018-01-04 18:47:52 +01:00
Max Kellermann
e3ef3e8d71 output/Control: unlock mutex during expensive operations 2018-01-04 10:36:18 +01:00
Max Kellermann
7574dfd339 output/Control: move code from FinishDestroy() to destructor 2018-01-04 10:34:27 +01:00
Max Kellermann
a5b93008f5 output/Filtered: remove redundant nullptr assignments from Setup() 2018-01-04 10:32:10 +01:00
Max Kellermann
0227af5bb7 output/Filtered: remove BeginDestroy()
All it does is "sometimes" close the mixer, but that is also done in
the destructor.
2018-01-04 10:29:27 +01:00
Max Kellermann
192f4240e3 valgrind.suppressions: more library suppressions 2018-01-04 10:20:53 +01:00
Max Kellermann
ef71df60f6 output/Multiple: use std::unique_ptr<FilteredAudioOutput> 2018-01-04 10:14:26 +01:00
Max Kellermann
f52b3b4e04 output/Multiple: dispose the AudioOutputControl instances
Fixes shutdown memory leak.
2018-01-04 10:11:23 +01:00
Max Kellermann
7e4e32cfe0 output/Filtered: eliminate FinishDestroy()
This is implicitly done by the destructor.
2018-01-04 10:05:31 +01:00
Max Kellermann
9f8649884b output/Control: dispose the FilteredAudioOutput
Fixes shutdown memory leak.
2018-01-04 10:01:34 +01:00
Max Kellermann
f1ee4caddd output/Init: fix configuration option name in error message 2018-01-04 09:57:28 +01:00
Max Kellermann
051b8fbb31 output/Thread: add "noexcept" 2018-01-04 09:54:35 +01:00
Max Kellermann
b0ea32f660 output/Control: remove unused method StopThread() 2018-01-04 09:20:22 +01:00
Max Kellermann
8322ae5a4c output/Control: use class ScopeUnlock() 2018-01-04 08:41:19 +01:00
Max Kellermann
98a7c62d7a player/Thread: don't send silence if decoder is slow
The output plugin shall decide whether to insert silence or do nothing
at all.  The ALSA output plugin has already implemented this.
Inserting silence is not necessary or helpful for some plugins, and
may even hurt them (e.g. "recorder").
2018-01-03 17:36:41 +01:00
Max Kellermann
859e59262e player/Thread: remove unnecessary "continue" keywords 2018-01-03 17:17:22 +01:00
Max Kellermann
ec113420f1 player/Thread: hold mutex while calling SongBorder()
Eliminates unnecessary mutex locks.
2018-01-03 17:12:21 +01:00
Max Kellermann
1954e94de2 Merge branch 'work_tag' of git://github.com/loujine/MPD
Closes #181
2018-01-03 11:47:02 +01:00
Max Kellermann
f6ec43b9ec pcm/Resampler: add virtual method Flush()
Wired to Filter::Flush().

Closes #153
2018-01-02 23:17:25 +01:00
Max Kellermann
6d0d8cf9cf filter/Filter: add virtual method Flush()
This will be used by filters which have internal buffers which need to
be flushed at the end, e.g. the "soxr" resampler.
2018-01-02 23:15:51 +01:00
Max Kellermann
14f669f4fb Makefile.am: move sources to libfilter_api.a, libfilter_glue.a 2018-01-02 23:11:03 +01:00
Max Kellermann
5ede02aed8 filter/FilterConfig: rename to LoadChain.cxx 2018-01-02 23:09:36 +01:00
Max Kellermann
bbabb7a14c filter/Plugin: move filter_configured_new() to LoadOne.cxx 2018-01-02 23:06:53 +01:00
Max Kellermann
b13ebe3ddb filter/Plugin: eliminate filter_new() 2018-01-02 23:00:16 +01:00
Max Kellermann
17b0add058 filter/Observer: pass Reset() to underlying Filter
Wohooooo, the method Filter::Reset() has been broken because no
implementation of it has ever been called for a loooong time.
And nobody ever noticed it.  WTF.
2018-01-02 22:13:14 +01:00
Max Kellermann
c68ed40661 pcm/SoxrResampler: implement method Reset() 2018-01-02 21:53:09 +01:00
Max Kellermann
b0199245d5 output/Thread: move code to method InternalDrain() 2018-01-02 18:03:48 +01:00
Max Kellermann
b93e3b2cf6 output/Thread: move code to method InternalCloseError() 2018-01-02 18:02:14 +01:00
Max Kellermann
ae7fcf4c6b output/Thread: move common code to method Failure() 2018-01-02 18:00:20 +01:00
Max Kellermann
1607754771 output/Thread: update "last_error" after filter/play errors 2018-01-02 17:59:37 +01:00
Max Kellermann
028f659c40 output/Thread: move error handling code into the catch block 2018-01-02 17:48:14 +01:00
Max Kellermann
8dfdacf128 output/Thread: AudioOutput::Play() must not return zero 2018-01-02 17:47:46 +01:00
Max Kellermann
f4a56f839f output/haiku: remove size==0 check from Play()
By API contract, this parameter must not be zero.
2018-01-02 17:45:14 +01:00
Max Kellermann
67a8eedca0 output/ao: round write_size down to a multiple of the frame size 2018-01-02 17:33:33 +01:00
Max Kellermann
be65c7d5d0 config/Block: add method GetPositiveValue()
Adds missing checks to several plugins.
2018-01-02 17:24:34 +01:00
Max Kellermann
7c5306a841 config/{Block,Global}: add missing strtoul() check 2018-01-02 17:23:10 +01:00
Max Kellermann
201210cfe1 neighbor/Plugin: std::unique_ptr<NeighborExplorer> 2018-01-02 17:04:23 +01:00
Max Kellermann
cd6de3b24e neighbor/{Explorer,Listener}: add "noexcept" 2018-01-02 16:58:14 +01:00
Max Kellermann
dcd483bd99 storage/Composite: use std::unique_ptr<Storage> 2018-01-02 16:18:34 +01:00
Max Kellermann
3c5e4e2788 storage/Plugin: return std::unique_ptr<Storage> 2018-01-02 16:11:17 +01:00
Max Kellermann
3f4f7b0a53 lib/upnp/Discovery: protect "downloaders" accesses with mutex 2018-01-02 14:55:57 +01:00
Max Kellermann
0a4b866d8a db/upnp: use SplitString() instead of stringToTokens() 2018-01-02 14:16:57 +01:00
Max Kellermann
8c7d7dfa5b lib/upnp/Util: remove unused function csvToStrings() 2018-01-02 14:16:57 +01:00
Max Kellermann
cdf615f783 lib/upnp/ContentDirectoryService: use SplitString() instead of csvToStrings() 2018-01-02 14:16:57 +01:00
Max Kellermann
7d96883d64 lib/upnp/Util: use std::string::erase() instead of ..::replace() 2018-01-02 14:16:57 +01:00
Max Kellermann
28c5e7e6a7 Merge branch 'v0.20.x' 2018-01-02 14:16:47 +01:00
Max Kellermann
ff624075a8 storage/State: check if a CompositeStorage exists; fixes nullptr dereference
Fixes another crash bug caused by commit
64d141f71e
2018-01-02 14:13:26 +01:00
Max Kellermann
08db28469d storage/State: make mount errors non-fatal
Fixes crash bug caused by commit
64d141f71e
2018-01-02 14:07:52 +01:00
Max Kellermann
a20b326807 storage/State: fix memory leak after database mount failure
Caused by commit 64d141f71e

This wasn't a serious memory leak, because after a mount failure, MPD
would abort anyway, which is subject to the next commit.
2018-01-02 14:05:07 +01:00
Max Kellermann
4db1b1b250 storage/State: remove useless #ifdef ENABLE_DATABASE
This source file isn't compiled when the database is disabled.
2018-01-02 13:48:16 +01:00
Max Kellermann
ff6b263b48 increment version number to 0.20.15 2018-01-02 13:46:03 +01:00
Max Kellermann
dbfc4abfd6 thread/SafeSingleton: disallow copying 2018-01-02 12:39:05 +01:00
Max Kellermann
5544375002 thread/SafeSingleton: pass parameters to constructor 2018-01-02 12:26:53 +01:00
Max Kellermann
1fd8d46064 lib/upnp/ClientInit: return UpnpClient_Handle 2018-01-02 12:22:44 +01:00
Max Kellermann
46406d6cca output/ao: use class SafeSingleton for libao initialization 2018-01-02 12:13:51 +01:00
Max Kellermann
196df1ccd5 thread/SafeSingleton: new thread-safe utility class 2018-01-02 12:10:41 +01:00
Max Kellermann
d2358b42b6 output/Source: drop the "_instance" suffix from variable names 2018-01-02 09:59:22 +01:00
Max Kellermann
e387d94ff1 filter/Filter: add "noexcept" 2018-01-01 19:23:01 +01:00
Max Kellermann
3bb9c704de pcm/*: add "noexcept" 2018-01-01 19:07:33 +01:00
Max Kellermann
10537c5095 test/run_filter: use "auto" 2018-01-01 19:06:17 +01:00
Max Kellermann
551ac56a33 Filter/Internal: split header 2018-01-01 18:48:34 +01:00
Max Kellermann
5227582e90 Merge tag 'v0.20.14'
release v0.20.14
2018-01-01 18:28:39 +01:00
Max Kellermann
c0bf052fa9 release v0.20.14 2018-01-01 17:55:38 +01:00
loujine
5419cff925 [doc] Fix outdated MusicBrainz URLs (closes #179) 2018-01-01 17:30:24 +01:00
loujine
42959982a9 Add basic support for MUSICBRAINZ_WORKID tag 2017-12-30 19:05:21 +00:00
Max Kellermann
78c73fb9e7 MusicChunk: reorder attributes to reduce padding 2017-12-30 17:52:07 +01:00
Max Kellermann
a06bf388d9 MusicChunk: make the struct size exactly 4096 2017-12-30 17:50:25 +01:00
Max Kellermann
de0c3e717e MusicChunk: split struct MusicChunkInfo from struct MusicChunk 2017-12-30 17:47:16 +01:00
Max Kellermann
1194998ce9 CrossFade: use sizeof(MusicChunk::data) instead of CHUNK_SIZE 2017-12-30 17:43:56 +01:00
Max Kellermann
7171e23700 player/Thread: make seeking into a new song non-blocking 2017-12-30 11:31:26 +01:00
Max Kellermann
dee378b775 player/Thread: make SEEK (partially) non-blocking
When the decoder is still starting up while we handle a SEEK, finish
the "player SEEK" immediately and re-enter the player loop, being able
to handle commands (and even cancel the pending seek).

This is the first part in a series of patches to solve the "blocking
input blocks decoder, blocks player, blocks the main thread" problem.
There are many other blocking code locations left, and the main thread
isn't non-blocking either because it waits for "seeking" to become
false.
2017-12-29 17:32:12 +01:00
Max Kellermann
f76262ef79 poison.h: remove obsolete header 2017-12-29 17:29:52 +01:00
Max Kellermann
6a755b0663 Makefile.am: remove -DCPPUNIT_HAVE_RTTI=0
This declaration is obsolete because MPD has switched on RTTI long
ago.
2017-12-29 17:04:12 +01:00
Max Kellermann
c40354bbcb player/Outputs: abstract interface wrapping class MultipleOutputs 2017-12-29 16:39:05 +01:00
Max Kellermann
c04aafb4e3 output/Multiple: add "noexcept" 2017-12-29 16:29:49 +01:00
Max Kellermann
e31abe6d6b player/Thread: remove redundant outputs.Cancel() call
The STOP, EXIT and CLOSE_AUDIO commands are not finished here; they
are propagated to PlayerControl::RunThread() where the
outputs.Cancel() call will be done again.
2017-12-28 08:39:48 +01:00
Max Kellermann
e1349ccadc player/Thread: ProcessCommand() returns bool
Allows signalling a failed seek, and replaces several redundant
command checks after the ProcessCommand() call.
2017-12-28 08:30:01 +01:00
Max Kellermann
8838bdc1e3 player/Thread: move CommandFinished() call out of SeekDecoder(SongTime)
Decouple this function from player command execution.
2017-12-27 14:28:56 +01:00
Max Kellermann
d6386bc80f player/Thread: update code comment 2017-12-27 14:26:14 +01:00
Max Kellermann
a2c2288cd6 test/run_filter: throw exception on error 2017-12-27 12:03:13 +01:00
Max Kellermann
edef62df86 filter/Internal: return std::unique_ptr<Filter> 2017-12-27 11:56:05 +01:00
Max Kellermann
e2621d5e44 filter/Plugin: return std::unique_ptr<PreparedFilter> 2017-12-27 11:39:01 +01:00
Max Kellermann
0e3ff12dd3 filter/volume: remove from filter_plugins[]
Thsi filter doesn't make sense as manually configured plugin, because
nobody ever calls volume_filter_set() on it, making it a no-op.
2017-12-27 11:38:38 +01:00
Max Kellermann
b335ac4156 filter/{chain,convert}: remove unused FilterPlugin instances
These are not in filter_plugins[] and have dedicated constructors
anyway.
2017-12-27 11:33:15 +01:00
Max Kellermann
03cf6591c0 output/Source: convert prepared_filter to reference 2017-12-27 11:21:43 +01:00
Max Kellermann
2e0949d8e6 archive/Plugin: return std::unique_ptr<ArchiveFile> 2017-12-27 09:07:21 +01:00
Max Kellermann
5a728a069e fs/AllocatedPath: drop obsolete GCC check 2017-12-27 08:50:55 +01:00
Max Kellermann
7384ec199e Compiler.h: remove support for GCC 4.9
Supporting GCC 4.9 is becoming cumbersome as we refactor more code to
C++14.

This shouldn't be a problem for anybody, because Debian Stable
(Stretch) has version 6.3, and Ubuntu LTS (Xenial) has version 5.3.
2017-12-27 08:40:24 +01:00
Max Kellermann
7bce6329e3 archive/File, input/Plugin: return InputStreamPtr 2017-12-26 20:05:22 +01:00
Max Kellermann
49619fbd77 input/Proxy: use InputStreamPtr 2017-12-26 20:03:37 +01:00
Max Kellermann
fb9a2c5431 input/Icy: manage the parser in a std::shared_ptr
This resolves the circular dependency between IcyInputStream and
CurlInputStream.
2017-12-26 20:03:35 +01:00
Max Kellermann
cd38aa3b2a Merge branch 'v0.20.x' 2017-12-26 20:03:18 +01:00
Max Kellermann
eee10ad2ed input/curl: add missing mutex locks to OnEnd(), OnError() 2017-12-26 20:01:13 +01:00
Max Kellermann
daeb7ae949 input/InputStream: add "noexcept" 2017-12-26 11:39:34 +01:00
Max Kellermann
82a79565de input/InputStream: use C++11 initializers 2017-12-26 11:32:36 +01:00
Max Kellermann
078839c711 archive/zzip: convert struct to class 2017-12-26 11:22:46 +01:00
Max Kellermann
98472a8104 pcm/SampleFormat: remove wrong "malloc" attribute 2017-12-23 08:38:22 +01:00
Max Kellermann
90cc32f6f8 util/RefCount: remove obsolete class 2017-12-22 16:37:30 +01:00
Max Kellermann
9aec2f019a archive/File: eliminate Close(), make destructor virtual instead 2017-12-22 16:30:17 +01:00
Max Kellermann
5da455080b archive/iso9660: use std::shared_ptr instead of class RefCount 2017-12-22 16:25:08 +01:00
Max Kellermann
17558102f2 archive/zzip: use std::shared_ptr instead of class RefCount 2017-12-22 16:20:05 +01:00
Max Kellermann
e1c39f3fdc archive/bz2: use std::shared_ptr instead of class RefCount 2017-12-22 16:14:12 +01:00
Max Kellermann
20555c8e37 archive/File: remove unused attribute "plugin" 2017-12-22 16:13:29 +01:00
Max Kellermann
300a619991 Merge branch 'v0.20.x' 2017-12-22 16:10:05 +01:00
Max Kellermann
d094c168aa archive/{iso9660,zzip}: unlock the mutex during I/O
Similar to commit 31ab78ae8e
2017-12-22 16:09:03 +01:00
Max Kellermann
4b18460bc6 archive/bz2: unlock the archive mutex and lock the file mutex
Fixes deadlock because FileInputStream::Read() unlocks the mutex
(which was not locked) and then locks it, keeping it locked.  This can
result in a deadlock.  This happens because the archive and the file
mutex are different.
2017-12-22 16:02:23 +01:00
Max Kellermann
4319dedb23 db/update/Walk: use std::atomic_bool for the "quit" variable
Fixes thread sanitizer warnings.
2017-12-22 12:02:44 +01:00
Max Kellermann
f8bb66b4e0 event/Loop: use std::atomic_bool for the "quit" variable
Fixes thread sanitizer warnings.
2017-12-22 11:04:24 +01:00
Max Kellermann
5d6a8b3840 MusicPipe: lock the mutex in Peek() and GetSize() 2017-12-22 11:03:37 +01:00
Max Kellermann
6a8c2848f6 thread/{Thread,Id}: use defaul-initialized pthread_t as "undefined" value
Use the "==" operator instead of pthread_equal().

This allows us to eliminate two boolean flags which are there to avoid
race conditions, and made the thing so fragile that I got tons of
(correct) thread sanitizer warnings.
2017-12-22 10:37:07 +01:00
Max Kellermann
6439727afc player/Thread: use std::lock_guard in RunThread() 2017-12-22 09:35:31 +01:00
Max Kellermann
27b0a581a6 player/Thread: even more fine-grained unlocking
Use one single std::lock_guard in Run(), and replace the manual
Lock()/Unlock() calls.
2017-12-22 08:09:16 +01:00
Max Kellermann
15a54230f1 player/Thread: move unlock call down
Eliminate more unlock/lock transitions, making the code more robust.
2017-12-22 01:14:51 +01:00
Max Kellermann
f0d184884a player/Thread: remove obsolete commented code 2017-12-22 01:14:39 +01:00
Max Kellermann
8fca04f140 player/Thread: add missing lock for StartDecoder()
Regression from commit 0772e571b7
2017-12-22 01:12:15 +01:00
Max Kellermann
3b2b5edd26 player/Thread: move mutex lock out of SeekDecoder() 2017-12-22 01:07:13 +01:00
Max Kellermann
5bd1fbb0d6 player/Thread: merge four mutex locks in SeekDecoder() 2017-12-22 01:04:44 +01:00
Max Kellermann
0772e571b7 player/Thread: move mutex lock out of StartDecoder() 2017-12-22 01:03:12 +01:00
Max Kellermann
910496cea9 decoder/Control: caller must lock mutex for Start() 2017-12-22 01:03:01 +01:00
Max Kellermann
739e1da279 player/Thread: move mutex lock out of ActivateDecoder() 2017-12-22 00:58:57 +01:00
Max Kellermann
08b4a7aaf2 player/Thread: eliminate LockWaitDecoderStartup() 2017-12-22 00:58:42 +01:00
Max Kellermann
1f0770ca55 player/Thread: move code to SeekDecoder(SongTime) 2017-12-22 00:49:21 +01:00
Max Kellermann
505d0bfa51 player/Thread: move mutex lock out of StopDecoder() 2017-12-22 00:48:19 +01:00
Max Kellermann
860d13c7d8 decoder/Control: caller must lock mutex for Stop() 2017-12-22 00:48:12 +01:00
Max Kellermann
76d77af0f0 player/Thread: use std::lock_guard once more 2017-12-22 00:47:36 +01:00
Max Kellermann
ea8ab4ddf2 player/Thread: merge two mutex locks 2017-12-22 00:42:10 +01:00
Max Kellermann
4bcc38c749 player/Thread: move mutex lock out of WaitDecoderStartup() 2017-12-22 00:41:05 +01:00
Max Kellermann
5becffbba5 player/Thread: merge two mutex locks 2017-12-22 00:39:54 +01:00
Max Kellermann
d0194a6fb3 decoder/Control: caller must lock mutex for Seek() 2017-12-22 00:37:25 +01:00
Max Kellermann
e45d13d469 player/Thread: add missing mutex lock around PlayerControl::SetError() 2017-12-22 00:35:18 +01:00
Max Kellermann
412c0a965c util/WStringAPI: fix indent 2017-12-21 18:45:26 +01:00
Ilya ilyxa Tyshchenko
2becf79223 correct action for compile on Solaris 11.3 X86 2017-12-21 18:42:36 +01:00
Max Kellermann
a431274b32 player/Control: add "occupied" flag to skip REFRESH
Reduces main thread contention.  Avoids blocking the main thread in
"status" commands.
2017-12-21 10:25:40 +01:00
Max Kellermann
994c9a01e3 player/Control: reorder attributes to reduce padding 2017-12-21 10:25:38 +01:00
Max Kellermann
ad1d5e8248 Merge branch 'v0.20.x' 2017-12-21 10:25:28 +01:00
Max Kellermann
43ec96d4a0 command/Error: translate std::{length_error,out_of_range} to ACK_ERROR_ARG 2017-12-21 10:22:04 +01:00
Max Kellermann
3d1d779da7 storage/State: use std::set instead of sorting a std::list 2017-12-21 10:22:00 +01:00
Max Kellermann
c88056ba83 db/simple: fix file corruption in the presence of mount points
If a directory is a mount point, omit the "directory: " as well.

This bug is years old, but has become more visible now that mount
points are persistent in the state file.
2017-12-21 10:16:52 +01:00
Max Kellermann
e769751221 increment version number to 0.20.14 2017-12-21 10:15:16 +01:00
Max Kellermann
b2670eaba5 player/Thread: move start_time variable into the scope 2017-12-20 19:15:28 +01:00
Max Kellermann
54aff33118 player/Thread: reorder attributes to reduce padding 2017-12-20 18:43:56 +01:00
Max Kellermann
499e053d58 decoder/mad: use std::unique_ptr 2017-12-20 15:32:10 +01:00
Max Kellermann
9f33c6fe03 decoder/Bridge: use std::unique_ptr<Tag> 2017-12-20 15:24:41 +01:00
Max Kellermann
73e69edac3 input/InputStream: ReadTag() returns std::unique_ptr<Tag> 2017-12-20 15:22:18 +01:00
Max Kellermann
4c4fa68268 input/Icy: use std::unique_ptr<Tag> 2017-12-20 15:13:22 +01:00
Max Kellermann
43d2fd73ab lib/xiph/VorbisComments: return std::unique_ptr<Tag> 2017-12-20 15:10:59 +01:00
Max Kellermann
71f1ec0bc8 tag/Id3Scan: return std::unique_ptr<Tag> 2017-12-20 15:09:20 +01:00
Max Kellermann
99f4bce112 IcyMetaDataParser: return std::unique_ptr<Tag> 2017-12-20 15:06:33 +01:00
Max Kellermann
6b77ee9a5e IcyMetaDataParser: add "noexcept" 2017-12-20 15:05:14 +01:00
Max Kellermann
25fa3ccade MusicChunk, player/Thread: use std::unique_ptr<Tag> 2017-12-20 15:02:14 +01:00
Max Kellermann
c6a95395b5 tag/Tag: Merge() returns std::unique_ptr<Tag> 2017-12-20 14:59:51 +01:00
Max Kellermann
cb3042ffb2 tag/Builder: CommitNew() returns std::unique_ptr<Tag> 2017-12-20 14:55:25 +01:00
Max Kellermann
d293aaf945 test/test_icy_parser: use AtScopeExit() 2017-12-20 14:54:56 +01:00
Max Kellermann
1d559bf00c util/SliceBuffer: add "noexcept" 2017-12-20 14:41:03 +01:00
Max Kellermann
4286f55c52 player/Thread: use C++11 initializers 2017-12-20 13:35:07 +01:00
Max Kellermann
0a7cad9074 player/Thread: add "noexcept" 2017-12-20 13:32:38 +01:00
Max Kellermann
069a7fe71e player/Thread: more API documentation 2017-12-20 13:27:13 +01:00
Max Kellermann
9c8a45854a player/Control: add SEEK documentation 2017-12-20 12:20:11 +01:00
Max Kellermann
7d035edf9d player/Control, ...: remove API documentation references to the obsolete Error class 2017-12-20 12:20:09 +01:00
Max Kellermann
36899dba0b event/Call: document exceptions 2017-12-20 10:50:36 +01:00
Max Kellermann
6a31446671 event/TimerEvent: add "noexcept" 2017-12-20 10:45:30 +01:00
Max Kellermann
451fbbcea1 event/FullyBufferedSocket: add "noexcept" 2017-12-20 10:44:47 +01:00
Max Kellermann
a17a481e30 event/BufferedSocket: add "noexcept" 2017-12-20 10:42:17 +01:00
Max Kellermann
5f9d4a02a5 client/*: add "noexcept" 2017-12-20 10:38:29 +01:00
Max Kellermann
7094d88958 client/Message: make valid_channel_char() constexpr 2017-12-20 10:27:43 +01:00
Max Kellermann
8ac73a9eba output/alsa: add attributes "dop" and "allowed_formats" 2017-12-19 11:57:52 +01:00
Max Kellermann
86a06a7acc output/Interface: add "attributes" map
These attributes are printed in the "outputs" response, and the new
command "outputset" allows setting new values.

No attributes are currently implemented.
2017-12-19 11:57:52 +01:00
Max Kellermann
d05c3f4e4d lib/alsa/AllowedFormat: throw std::invalid_argument on error 2017-12-19 11:57:52 +01:00
Max Kellermann
de178e90f4 AudioParser: throw std::invalid_argument on error 2017-12-19 11:57:47 +01:00
Max Kellermann
3d960b5e55 util/RuntimeError: add FormatInvalidArgument() 2017-12-19 11:56:29 +01:00
Max Kellermann
39dc83bd82 output/Print: print the plugin name 2017-12-19 11:52:10 +01:00
Max Kellermann
503063cddc output/Print: use %u for the index 2017-12-19 11:52:09 +01:00
Max Kellermann
914df18bf9 Main, ...: catch any exception, not just std::runtime_error 2017-12-19 10:56:23 +01:00
Max Kellermann
a539094c06 command/Error: translate std::{length_error,out_of_range} to ACK_ERROR_ARG 2017-12-19 10:54:49 +01:00
Max Kellermann
cd3ed720e0 lib/alsa/AllowedFormat: add API documentation 2017-12-19 08:41:53 +01:00
Max Kellermann
37c27fa606 output/Interface: convert need_fully_defined_audio_format to flag 2017-12-19 08:41:34 +01:00
Max Kellermann
093ca5d492 storage/Interface: add "noexcept" 2017-12-18 23:54:21 +01:00
Max Kellermann
1d24dd3067 storage/State: use std::set instead of sorting a std::list 2017-12-18 23:50:31 +01:00
Max Kellermann
b9659ba0c0 Merge tag 'v0.20.13'
release v0.20.13
2017-12-18 23:48:14 +01:00
Max Kellermann
49b9a90c3f release v0.20.13 2017-12-18 23:41:56 +01:00
FlashSystems
64d141f71e Save and restore mountpoints within the state file.
Signed-off-by: FlashSystems <developer@flashsystems.de>
2017-12-18 23:39:01 +01:00
FlashSystems
c488d3123f Fix lsinfo and add for mounted databases.
If `SimpleDatabase::Visit` is called on a database that contains a mounted directry the URIs of the elements passed to the callbacks are not prefixed by the mountpoint path. This leads to lsinfo and add not working because they use the wrong URI. This pull request is using the `WalkMount` helper function to create prefixed versions of `VisitDirectory`, `VisitSong` and `VisitPlaylist` to add the correct prefix to the parameters of the callback functions.
2017-12-18 23:33:08 +01:00
Max Kellermann
b6af7abb1a thread/PosixMutex: add "noexcept" 2017-12-18 23:29:08 +01:00
Max Kellermann
edee8a3446 Compiler.h: add gcc_returns_nonnull, gcc_returns_twice 2017-12-18 23:00:13 +01:00
Max Kellermann
5582367d68 db/DatabasePrint: support sorting by "modified-since"
Closes #172
2017-12-18 21:52:36 +01:00
Max Kellermann
7a55ab6acc db/DatabasePrint: support descending sort 2017-12-18 21:50:14 +01:00
Stefano Miccoli
967af60327 rounds alsa HW mixer volume towards ±∞ depending on sgn(∆ vol)
This alleviates a problem in which 'volume +1' cannot be undo by
'volume -1' when using alsa hw mixer.

Closes #104
2017-12-18 21:29:03 +01:00
Max Kellermann
6246d36fe6 Merge branch 'v0.20.x' 2017-12-16 20:56:06 +01:00
Yue Wang
f1ef9f9d31 OSXOutputPlugin: set the buffer time to be 100ms
[mk: the following text was copied from
https://github.com/MusicPlayerDaemon/MPD/pull/167]

For certain format (hi-res files) and normal buffer size hardware, The
hardware may at once consume most of the buffers. However, in Delay()
function, MPD is supposed to wait for 25 ms after the next try. it
will create a hiccup. The negative impact is much major than
increasing the latency.

I understand larger buffers come at a price. That's why in my earlier
commit last year I significantly reduced it. However, the buffer size
in CoreAudio is set according to the hardware, which is super small
latency. For instance, the system audio of 2015 generation of macbook
pro has maximum buffer size of 4096 samples, which is just 0.09s for
44.1k framerate, or 0.04s for 96k frames --- . compare to the 0.5 sec
latency alsa plugin has, even if we quadruple it, it's still super
tiny.
2017-12-12 10:56:42 +01:00
Max Kellermann
dfaf08743c *: check defined(_WIN32) instead of defined(WIN32)
Only _WIN32 is defined by the compiler, and WIN32 is not standardized
and may be missing.

Closes #169
2017-12-12 10:22:20 +01:00
Max Kellermann
d9552d8a6d android/build.py: support NDK r16 2017-12-12 10:01:47 +01:00
Max Kellermann
7586a8ab2c python/build/libs.py: disable the FFmpeg HEVC decoder due to clang build failure 2017-12-12 10:01:47 +01:00
Max Kellermann
e1a942250b python/build/libs.py: disable more FFmpeg features 2017-12-12 09:57:40 +01:00
Max Kellermann
72be0185de python/libs: upgrade Boost to 1.65.1 2017-12-12 09:16:40 +01:00
Max Kellermann
7e4cbce06b python/build/libs: upgrade CURL to 7.57.0 2017-12-12 09:15:24 +01:00
Max Kellermann
177d62f431 python/build/libs: upgrade FFmpeg to 3.4.1 2017-12-11 19:00:22 +01:00
Uwe Kleine-König
5a11e03725 lib/upnp: use include path without upnp/ prefix and honor pkg-config CFLAGS
If libupnp is installed in a non-standard location we must rely on the
include path provided by $(pkg-config --cflags libupnp). Relative to the
path given from that command no prefix must be used to find the respective
files.
2017-12-11 18:58:09 +01:00
Max Kellermann
75d068b7cd Makefile.am: include Windows cross-build script in source tarball 2017-12-05 11:24:52 +01:00
Max Kellermann
fbc4bb29dc Merge branch 'v0.20.x' 2017-12-03 16:22:08 +01:00
FlashSystems
1208503888 Removing gcc_malloc attribute from Directory::CreateChild to fix
assignment of `mnt->mounted_database` in `SimpleDatabase::Mount`.
2017-12-03 12:34:08 +01:00
Max Kellermann
de90d401d2 MusicChunk: add magic value IGNORE_REPLAY_GAIN
This fixes spurious replay gain logs when the player inserts silence
chunks, because those silence chunks had no replay gain attached,
resetting the ReplayGainFilter state, flipping it forth and back.
2017-12-03 11:39:12 +01:00
Max Kellermann
396defaea9 MusicChunk: initialize replay_gain_serial on demand 2017-12-03 11:39:07 +01:00
Max Kellermann
18f350cd04 player/Thread: initialize MusicChunk::bit_rate in SendSilence()
This attribute is not particularly important, but it was
uninitialized.
2017-12-03 10:54:14 +01:00
Yue Wang
7ba7ce3af7 Correctly set the mixer plugin for osx output 2017-12-02 23:29:23 -08:00
Max Kellermann
478180ebe4 queue/PlaylistEdit: shuffle appended songs only within its priority group
Fixes #165.
2017-12-02 17:17:02 +01:00
Max Kellermann
4a3059f509 queue/PlaylistControl: don't skip highest priority song on "play"
When starting playback with a specific song which does not have the
highest priority, the previous highest priority song was skipped
completely because its order was "swapped".  This commit changes to a
more expensive operation which inserts the selected song into the
order list.

This fixes a small part of #165
2017-12-02 16:25:32 +01:00
Max Kellermann
78728138a0 lib/upnp/Compat: disable the 1.8 API emulation with libupnp 1.6.24
libupnp 1.6.24 added a few badly designed macros which break the MPD
build:

 8177a4195a/

To work around this, we disable our emulation functions (from
714011c81e) on this libupnp version.

Closes #163
2017-12-02 14:47:27 +01:00
Max Kellermann
087fcc4e6e queue/Save: fix inverted check
That '!' accidently got lost in commit
75582d47b9

D'oh!

Closes #162
2017-11-27 23:02:45 +01:00
FlashSystems
63fc98591d Fix for "Mount-Points are purged from database on update/rescan."
Signed-off-by: FlashSystems <developer@flashsystems.de>
2017-11-27 22:34:49 +01:00
Max Kellermann
53def9a682 increment version number to 0.20.13 2017-11-27 22:32:55 +01:00
Max Kellermann
520c520512 player/Listener: add "noexcept" 2017-11-26 12:39:09 +01:00
Max Kellermann
a6910313b4 Queue: add "noexcept" 2017-11-26 12:25:53 +01:00
Max Kellermann
2f32df1f09 queue/IdTable: make non-copyable 2017-11-26 12:24:35 +01:00
Max Kellermann
23adf50194 queue/IdTable: make "data" pointer const 2017-11-26 12:24:24 +01:00
Max Kellermann
0691ecc052 queue/IdTable: add "noexcept" 2017-11-26 12:23:46 +01:00
Max Kellermann
d917f44b5b Queue: make configuration attributes const 2017-11-26 12:22:50 +01:00
Max Kellermann
602bb7170a Queue: use C++11 initializer 2017-11-26 12:21:36 +01:00
Max Kellermann
75582d47b9 SongSave: wrap DetachedSong* in std::unique_ptr 2017-11-26 12:18:31 +01:00
Max Kellermann
28fdf1e9ed decoder/Control: wrap DetachedSong* in std::unique_ptr 2017-11-26 12:16:53 +01:00
Max Kellermann
9a8a3beae4 decoder/Control: add "noexcept" 2017-11-26 12:16:53 +01:00
Max Kellermann
2a774a1fea playlist/{flac,m3u}: use std::make_unique 2017-11-26 12:10:33 +01:00
Max Kellermann
b13b023c6b player/Control: wrap DetachedSong* in std::unique_ptr 2017-11-26 12:06:38 +01:00
Max Kellermann
b652ad9568 queue/Playlist: cast next_song to bool, because that is all we need in SyncWithPlayer() 2017-11-26 12:06:29 +01:00
Max Kellermann
624e679e35 player/Control: add "noexcept" 2017-11-26 12:02:08 +01:00
Max Kellermann
618704f504 thread/*: add "noexcept" 2017-11-26 11:58:53 +01:00
Max Kellermann
3b3ec402d6 command/CommandListBuilder: use C++11 initializer 2017-11-26 11:11:36 +01:00
Max Kellermann
2b3c1d640e Merge tag 'v0.20.12'
release v0.20.12
2017-11-25 19:47:56 +01:00
Max Kellermann
323231d1dd release v0.20.12 2017-11-25 19:32:37 +01:00
Max Kellermann
714011c81e lib/upnp: adapt to libupnp 1.8 API changes
Closes #155
2017-11-16 11:39:11 +01:00
Max Kellermann
952ff4207b lib/upnp/Callback: make "evp" parameter const 2017-11-16 11:37:58 +01:00
Max Kellermann
150b16ec2c lib/upnp/Discovery: make Upnp_Discovery pointers const 2017-11-16 11:37:04 +01:00
Max Kellermann
f70b4e02c4 Merge branch 'v0.20.x' 2017-11-14 21:21:14 +01:00
Max Kellermann
c98bc4a243 playlist/PlaylistRegistry: use LockRewind() instead of Rewind()
Fixes a deadlock caused by commit
31ab78ae8e.  That commit was not
actually bad - just these two calls have always been bad, which went
unnoticed for a long time.
2017-11-14 21:19:22 +01:00
Max Kellermann
7d579e7400 lib/alsa/NonBlock: throw exception on error
Avoid another potential deadlock: if no file descriptors are
registered, our non-blocking ALSA code cannot ever work.
2017-11-14 21:08:07 +01:00
Max Kellermann
e0f777d4eb output/alsa: move code to LockCaughtError() 2017-11-14 21:07:59 +01:00
Max Kellermann
febd1ad09c output/alsa: fix deadlock bug
After UnlockActivate() returns, we not only need to check for errors,
but also for more room in the ring buffer.  If we don't check the ring
buffer, it may be drained already, and the cond.wait() call will never
finish.

Closes #151
2017-11-14 21:02:53 +01:00
Max Kellermann
1040b85785 lib/{curl,upnp}: add more exception handlers
Bugs found by Coverity.
2017-11-14 20:05:44 +01:00
Max Kellermann
e2c81aa9ea Merge branch 'v0.20.x' 2017-11-14 12:31:13 +01:00
Max Kellermann
014f8cd693 output/httpd: flush encoder after tag
Without the flush, ReadPage() may not return any data, or not all
data.  This may result in incomplete ddata the new "header" page,
corrupting streams with some encoders such as Vorbis.

Fixes #145
2017-11-14 12:00:14 +01:00
Max Kellermann
aea37e46e3 encoder/vorbis: default to quality 3
Don't require a quality or bitrate setting.  If nothing is set, don't
fail startup - just go with a good default.  A quality setting of 3 is
what "oggenc" defaults to as well.
2017-11-14 11:30:28 +01:00
Max Kellermann
31ab78ae8e input/{cdio,ffmpeg,file,smbclient}: unlock the mutex during blocking I/O
InputStream::Read() and InputStream::Seek() are called with the mutex
locked.  That means the implementation must not block, or unlock the
mutex before calling into blocking code.

Previously, a slow CD drive could stall the whole MPD process,
including the main thread, due to this problem.

Closes #149
2017-11-13 17:13:10 +01:00
Max Kellermann
f82e1453e4 input/smbclient: use std::lock_guard 2017-11-13 17:13:10 +01:00
Max Kellermann
e4a147218b Merge branch 'v0.20.x' 2017-11-12 18:55:12 +01:00
Max Kellermann
a2b77c8813 decoder/ffmpeg, test/test_protocol: catch exceptions by reference
Work around -Werror=catch-value.
2017-11-12 18:54:29 +01:00
Max Kellermann
18add29472 configure.ac: disable -Wnoexcept-type
Workaround for #146.
2017-11-12 18:54:29 +01:00
Max Kellermann
4b2b89eb5e lib/xiph: add "noexcept" 2017-11-12 18:35:49 +01:00
Max Kellermann
4b2bb88375 lib/upnp: add "noexcept" 2017-11-12 18:33:58 +01:00
Max Kellermann
fb01e41e8a lib/sqlite: add "noexcept" 2017-11-12 18:26:03 +01:00
Max Kellermann
ff9759c09d lib/pulse: add "noexcept" 2017-11-12 18:25:16 +01:00
Max Kellermann
a92e0e8540 lib/nfs: add "noexcept" 2017-11-12 18:09:07 +01:00
Max Kellermann
9d47b220a4 lib/curl: add "noexcept" 2017-11-12 17:49:58 +01:00
Max Kellermann
c582a9faae event/MultiSocketMonitor: add "noexcept" 2017-11-12 17:42:50 +01:00
Max Kellermann
cf483107c9 event/IdleMonitor: add "noexcept" 2017-11-12 17:40:25 +01:00
Max Kellermann
b57e2f5521 event/DeferredMonitor: eliminate obsolete class
Move its code to DeferEvent instead.
2017-11-12 17:34:06 +01:00
Max Kellermann
bf3ced6a34 event/Call: migrate from DeferredMonitor to DeferEvent 2017-11-12 17:32:23 +01:00
Max Kellermann
390e830994 {mixer,output}/alsa: migrate from DeferredMonitor to DeferEvent 2017-11-12 17:27:58 +01:00
Max Kellermann
44c60567dd output/alsa: add "allowed_formats" setting
Allows defining a list of supported audio formats, and allows
switching on and off DoP with certain formats.

This is a first rough draft.  The setting syntax and its semantics may
still be redesigned.
2017-11-10 23:05:50 +01:00
Max Kellermann
967d81b782 AudioFormat: add method MatchMask() 2017-11-10 23:05:50 +01:00
Max Kellermann
20199e770c output/shout: use the shout_metadata_t only once
There is no documentation on whether calling shout_metadata_add()
multiple times on one instance is allowed.  To be sure, let's allocate
the object on demand each time in SendTag().
2017-11-10 22:30:53 +01:00
Max Kellermann
4c824e5309 output/shout: simplify shout_tag_to_metadata() 2017-11-10 22:26:25 +01:00
Max Kellermann
981bc85879 output/shout: relax quality and bitrate checks, forward as-is 2017-11-10 22:19:00 +01:00
Max Kellermann
015527d870 output/shout: make "quality" and "bitrate" local variables 2017-11-10 22:17:51 +01:00
Max Kellermann
6464b4b372 encoder/Configured: glue code to initialize PreparedEncoder 2017-11-10 21:54:57 +01:00
Max Kellermann
fef9747fbf output/shout: use MIME type instead of the encoder plugin name
This is more robust, for example it allows using the Shine encoder
plugin instead of LAME.
2017-11-10 21:52:54 +01:00
Max Kellermann
13816c1c7d output/{recorder,httpd,shout}: use std::unique_ptr to manage PreparedEncoder pointer 2017-11-10 21:35:22 +01:00
Max Kellermann
c54a920d13 output/httpd: make enum strictly-typed 2017-11-10 21:25:03 +01:00
Max Kellermann
83f8eeec44 output/httpd: migrate from DeferredMonitor to DeferEvent 2017-11-10 21:18:00 +01:00
Max Kellermann
b83fbad6a1 output/httpd: use C++11 initializers 2017-11-10 21:15:57 +01:00
Max Kellermann
ec20784046 storage/curl: migrate from DeferredMonitor to DeferEvent 2017-11-10 21:10:54 +01:00
Max Kellermann
42ad753e39 event/MaskMonitor: migrate from DeferredMonitor to DeferEvent 2017-11-10 21:10:46 +01:00
Max Kellermann
1ccd2a7b11 lib/nfs: migrate from DeferredMonitor to DeferEvent 2017-11-10 21:06:40 +01:00
Max Kellermann
4c1d29c86c lib/nfs/FileReader: use C++11 initializers 2017-11-10 21:03:41 +01:00
Max Kellermann
0db7a0c9e2 db/update/Service: migrate from DeferredMonitor to DeferEvent 2017-11-10 20:58:25 +01:00
Max Kellermann
13f6b1b344 db/update/Remove: migrate from DeferredMonitor to DeferEvent 2017-11-10 20:56:21 +01:00
Max Kellermann
593d82c6a9 event/DeferEvent: add "noexcept" 2017-11-10 20:55:24 +01:00
Max Kellermann
43dccbd45d event/SocketMonitor: remove unused method Abandon() 2017-11-10 20:52:37 +01:00
Max Kellermann
0ff4350352 event/ServerSocket: pass UniqueSocketDescriptor by value
Passing it by value is actually smaller (32 bit) than the rvalue
reference (64 bit pointer), and it ensures that the object is consumed
after the call returns, no matter how the methods are implemented.
2017-11-10 20:43:14 +01:00
Max Kellermann
5fd2b7cc79 event/SocketMonitor: eliminate Read(), Write()
Migrate callers to GetSocket().Read(), GetSocket.Write(), which is the
same.
2017-11-10 20:37:52 +01:00
Max Kellermann
7e16ac305d event/SocketMonitor: rename Get() to GetSocket() 2017-11-10 20:34:45 +01:00
Max Kellermann
59a8836924 event/SocketMonitor: add "noexcept" 2017-11-10 20:20:07 +01:00
Max Kellermann
9d4020501c event/SocketMonitor: make constructor "explicit" 2017-11-10 20:17:27 +01:00
Max Kellermann
81350d65bc event/SocketMonitor: use C++11 initializers 2017-11-10 20:16:26 +01:00
Max Kellermann
02642a64fd input/Plugin: remove "#undef ERROR"
Maybe this was once a required kludge for Windows, but it's not
anymore.
2017-11-10 19:59:03 +01:00
Max Kellermann
3c41e9f022 evnet/SocketMonitor: move WIN32/ERROR comment to PollGroupWinSelect.hxx 2017-11-10 19:57:54 +01:00
Max Kellermann
2670e13cbd util/{Const,Writable}Buffer: add static_assert to FromVoid() 2017-11-10 19:43:17 +01:00
Max Kellermann
49784513b1 util/{Const,Writable}Buffer, ...: rename IsEmpty() to empty(), imitating STL 2017-11-10 19:24:33 +01:00
Max Kellermann
523051132d Merge branch 'v0.20.x' 2017-11-05 17:48:41 +01:00
cathugger
b111a8fe8d output/Thread: ensure pending tags are flushed in all cases
Fixes hanging playback with soxr resampler.

Closes #139, #141
2017-11-05 17:42:32 +01:00
Marcin Jurkowski
3b23cf0258 decoder/vorbis: scale and clip tremor-decoded samples to 15 bits
Tremor decoder is unusable since commit 2ee43c4. Sound is distorted to
the point where it's nothing but noise.

The data from vorbis_synthesis_pcmout() needs to be scaled and
clipped for 16 bit sample size. For reference see
http://lists.xiph.org/pipermail/tremor/2010-April/001642.html and
http://lists.xiph.org/pipermail/vorbis/2006-October/026513.html.

Signed-off-by: Marcin Jurkowski <marcin1j@gmail.com>
2017-11-03 19:45:41 +01:00
Max Kellermann
55e6629fb4 output/Control: catch and log StartThread() exceptions 2017-10-30 08:39:44 +01:00
Max Kellermann
b6251c6968 pcm/Export: add "noexcept" 2017-10-26 12:29:13 +02:00
Max Kellermann
c51fe089ba pcm/Dop: add "noexcept" 2017-10-26 12:28:59 +02:00
Max Kellermann
fee9f1482c pcm/Pack: add "noexcept" 2017-10-26 12:28:21 +02:00
Max Kellermann
ae67f44c6e pcm/Dsd*: add "noexcept" 2017-10-26 12:26:50 +02:00
Max Kellermann
54dd1ad09b pcm/Order: add "noexcept" 2017-10-26 12:25:38 +02:00
Max Kellermann
e2a74051dc lib/alsa/HwSetup: return effective parameters 2017-10-26 12:13:00 +02:00
Max Kellermann
b7e035b6f3 output/alsa: move AlsaSetupHw() to lib/alsa/HwSetup.cxx 2017-10-26 11:15:01 +02:00
Max Kellermann
890f1f5928 lib/alsa/Format: move HAVE_ALSA_DSD* definitions from the Alsa output plugin 2017-10-26 09:39:18 +02:00
Max Kellermann
b30c37eb79 output/alsa: move functions to lib/alsa/Format.hxx 2017-10-26 09:30:45 +02:00
Max Kellermann
b08cb148ae output/alsa: move class PeriodBuffer to lib/alsa/PeriodBuffer.hxx 2017-10-26 09:27:36 +02:00
Max Kellermann
034bb13e1c util/HugeAllocator: add missing "static inline"
Fixes the non-Linux build.
2017-10-26 09:01:06 +02:00
Max Kellermann
6657801fb1 output/alsa: pass SampleFormat& to AlsaSetupFormat() 2017-10-26 08:46:28 +02:00
Max Kellermann
a199366157 output/alsa: remove period_time adjust loop
This loop was introduced in commit
24c1f46353, but -EPIPE is not a possible
error condition for snd_pcm_hw_params().  This code does not appear to
make sense.  Problems with a wrong period_time should be caught before
that by snd_pcm_hw_params_set_period_time_near().

This commit removes the last "goto" in MPD!  Yay!
2017-10-26 08:40:59 +02:00
Max Kellermann
2a6d5583d1 lib/alsa: add "noexcept" 2017-10-26 08:24:14 +02:00
Max Kellermann
ddabe1a6df output/alsa: add "noexcept" 2017-10-26 08:18:05 +02:00
Max Kellermann
e7b47ce335 output/alsa: in_frame_size is a debug-only variable 2017-10-26 08:17:21 +02:00
Max Kellermann
28e864e096 player/Thread: log message when decoder is too slow 2017-10-25 20:26:09 +02:00
Max Kellermann
1de19b921a input/curl: call StartRequest() after setting CURLOPT_RANGE
It's not possible to set CURL options after curl_easy_perform(), and
thus the CURLOPT_RANGE had no effect.
2017-10-24 21:43:39 +02:00
Max Kellermann
ff162b5a03 input/curl: move code to StartRequest() 2017-10-24 21:41:17 +02:00
Max Kellermann
d8e4705dd4 input/curl: move the range buffer to the stack
From the CURLOPT_RANGE documentation: "The application does not have
to keep the string around after setting this option."
2017-10-24 21:38:35 +02:00
Max Kellermann
ab05b70423 ClientProcess: close connection when client sends HTTP request 2017-10-24 20:32:53 +02:00
Max Kellermann
b177bffa6a system/EventPipe: fix WSAEINPROGRESS on Windows
Apparently, connecting a socket to a loopback address can block on
Windows, and a non-blocking socket will return WSAEINPROGRESS.  This
broken PoorSocketPair() in commit 2119e4fd3e, which made the socket
non-blocking right from the start.  This fix postpones the
ioctlsocket(FIONBIO) call until after the connect().

Closes #134
2017-10-24 20:09:11 +02:00
Max Kellermann
338e1f5926 increment version number to 0.20.12 2017-10-24 17:31:55 +02:00
Max Kellermann
b4b468eb27 Merge tag 'v0.20.11'
release v0.20.11
2017-10-18 10:21:39 +02:00
Max Kellermann
a7fdfa08e1 release v0.20.11 2017-10-18 10:14:46 +02:00
Max Kellermann
9703a401c5 Playlist{File,Save}: always use UTF-8 in playlists on Windows
Turns out that using CP_ACP is a lousy idea, because only very few
Unicode characters can be represented by it.  Instead, switch to UTF-8
(which every sane person on other operating system already uses).

Closes #102
2017-10-18 10:05:26 +02:00
Max Kellermann
753a2aa462 PlaylistSave: move code to playlist_print_path() 2017-10-18 09:51:04 +02:00
Max Kellermann
10990a0684 queue/Playlist: call MoveOrderToCurrent() in SeekSongOrder() on song change
Applies the improvements from the previous commit to the "seek"
commands, which are also capable of switching songs.

Closes #119
2017-10-18 09:14:27 +02:00
Max Kellermann
91254e9211 queue/PlaylistControl: keep order list consistency in MoveOrderToCurrent()
Our previous use of Queue::SwapOrders() could cause surprising
results:

- sometimes, the old "current" song would be played again (if the
  newly selected song had not been played already)

- sometimes, the old "current" song would not be played again (if the
  newly selected song had already been played)

This is inconsistent, because it should not depend on whether the
newly selected song had already been played.

So instead of Queue::SwapOrders() we now use Queue::MoveOrderAfter()
and Queue::MoveOrderBefore(), which is more expensive, but also more
consistent.  It attempts to retain as much from the previous order
list as possible, and only moves the newly selected song around.
2017-10-18 09:05:47 +02:00
Max Kellermann
0f79287b04 queue/Playlist: move code to MoveOrderToCurrent() 2017-10-18 09:05:24 +02:00
Max Kellermann
f2fac77d8c queue/Queue: add methods MoveOrderBefore() and MoveOrderAfter() 2017-10-18 08:50:01 +02:00
Max Kellermann
81b7373637 queue/Queue: MoveOrder() returns to_order 2017-10-18 08:46:31 +02:00
Max Kellermann
fa67c2548a decoder/Thread: clear the command after catching an exception
If an early exception gets caught (e.g. from
AllocatedPath::FromUTF8Throw()) before
DecoderControl::CommandFinishedLocked() is called, the decoder thread
would go in an endless loop, because DecoderCommand::START is still
set.

Closes #118
2017-09-27 17:08:16 +02:00
John Regan
ea80587ddb GME Plugin: fix track numbering
GME starts all track indexes at zero, but subtune prefixes
start at one. This fixes an off-by-one error during track
enumeration.
2017-09-27 11:18:03 +02:00
John Regan
bd50a0d2ef GME Plugin: fix track numbering
GME starts all track indexes at zero, but subtune prefixes
start at one. This fixes an off-by-one error during track
enumeration.
2017-09-26 08:42:53 -05:00
John Regan
9256e748c8 GME Plugin: only load m3u if it exists
If you load an NSFE file (which has embedded track titles),
then attempt to load an M3U file, it causes GME to lose all
information found in the NSFE file. This adds a check that
the M3U file exists before attempting to load.
2017-09-26 08:42:43 -05:00
Max Kellermann
af033c0d1d NEWS: mention the GME decoder change 2017-09-22 20:00:12 +02:00
John Regan
e96513c8db GME Plugin: try loading m3u sidecar files 2017-09-22 19:58:17 +02:00
Max Kellermann
da9657aac4 playlist/SoundCloud: move enum key into struct, make strictly-typed 2017-09-21 23:10:11 +02:00
Max Kellermann
2886766fb5 playlist/SoundCloud: use strcmp() instead of memcmp() to avoid buffer overflow 2017-09-21 23:08:27 +02:00
Max Kellermann
6e7f866288 input/alsa: migrate from DeferredMonitor to DeferEvent 2017-09-21 22:58:00 +02:00
Max Kellermann
6fa403edd9 lib/upnp/Discovery: migrate from DeferredMonitor to DeferEvent 2017-09-21 22:53:57 +02:00
Max Kellermann
431eb7bc8c lib/curl/{Global,Request}: migrate from DeferredMonitor to DeferEvent 2017-09-21 22:53:17 +02:00
Max Kellermann
9df4853e23 event/DeferredCall: rename to DeferEvent 2017-09-21 22:40:25 +02:00
Max Kellermann
18c4ef09d5 input/thread: use class HugeArray instead of the low-level function HugeAllocate() 2017-09-21 21:56:24 +02:00
Max Kellermann
bc93c7a1fc input/thread: un-inline the constructor 2017-09-21 21:55:24 +02:00
Max Kellermann
c8a2a557db util/HugeAllocator: remove obsolete class HugeAllocation 2017-09-21 21:52:08 +02:00
Max Kellermann
9f827c99cb input/async: use class HugeArray instead of HugeAllocation 2017-09-21 21:50:45 +02:00
Max Kellermann
7b2b965415 util/SliceBuffer: use class HugeArray 2017-09-21 21:48:08 +02:00
Max Kellermann
c3cfa18ebe util/HugeAllocator: add template class HugeArray 2017-09-21 21:47:52 +02:00
Max Kellermann
b46835e15e util/HugeAllocator: HugeAllocator() returns WritableBuffer<void> 2017-09-21 21:47:49 +02:00
Max Kellermann
3e5ce3c92c util/{Const,Writable}Buffer: add static method FromVoidFloor() 2017-09-21 21:45:39 +02:00
Max Kellermann
e5c9b4cd75 util/{Const,Writable}Buffer: add operator==(nullptr_t) 2017-09-21 20:34:36 +02:00
Max Kellermann
8753e558f2 util/HugeAllocator: move MADV_DONTFORK setting to HugeForkCow()
Enforcing MADV_DONTFORK is a surprising limitation for this library
which aims to be generic.
2017-09-21 19:36:33 +02:00
Max Kellermann
f6691579de Merge branch 'v0.20.x' 2017-09-20 23:57:28 +02:00
Max Kellermann
828f5f8384 lib/icu/CaseFold: disable broken strxfrm() callback 2017-09-20 23:55:14 +02:00
Max Kellermann
1295a1272a lib/icu/Compare: add fallback using strcasecmp() and strcasestr()
Our IcuCaseFold() fallback using strxfrm() is not actually case
insensitive.  This commit fixes the problem by switching to
strcasecmp().  That function is not guaranteed to support UTF-8, but
it's the best we can do in this sparse situation.

Closes #111
2017-09-20 23:43:27 +02:00
Max Kellermann
66646d9276 SongFilter: use class IcuCompare 2017-09-20 23:43:26 +02:00
Max Kellermann
d0497dba92 lib/icu/Compare: OO wrapper for IcuCaseFold() 2017-09-20 23:32:55 +02:00
Max Kellermann
42914e8227 lib/icu/CaseFold: add "noexcept" 2017-09-20 23:32:54 +02:00
Max Kellermann
59b49b7881 db/Selection: add missing config.h 2017-09-20 23:32:54 +02:00
Max Kellermann
5620f16330 lib/icu/Collate: move IcuCaseFold() to CaseFold.cxx 2017-09-20 23:11:58 +02:00
Max Kellermann
be024d4ad7 lib/icu/Collate: remove unnecessary assert() 2017-09-20 23:05:31 +02:00
Max Kellermann
cfc152d979 input/async: remove outdated API documentation 2017-09-19 19:56:37 +02:00
Max Kellermann
513212c5e8 input/async: use std::exchange() 2017-09-19 19:55:16 +02:00
Max Kellermann
99a447dff5 input/async: use C++11 initializers 2017-09-19 19:54:07 +02:00
Max Kellermann
56a9bf459d util/SliceBuffer: use C++11 initializers 2017-09-19 19:48:04 +02:00
Max Kellermann
11dbba3503 util/HugeAllocator: document std::bad_alloc 2017-09-19 19:45:52 +02:00
Max Kellermann
8662427d48 util/HugeAllocator: use std::exchange() 2017-09-19 19:42:21 +02:00
Max Kellermann
821480d329 util/HugeAllocator: make constructor explicit 2017-09-19 19:42:19 +02:00
Max Kellermann
5ce93d6fa8 output/sndio: refuse to build with libroarsndio
RoarAudio's sndio emulation has been a source for annoyances.  First,
their headers turned out to be broken with C++, due to their use of
the "new" keyword.  Then they used a preprocessor macro to rename
"sio_hdl" to something else, effectively disallowing the use of
forward declarations.  Enough is enough, and I'm removing support for
it.

RoarAudio users should better use the RoarAudio output plugin.
2017-09-19 19:38:43 +02:00
Max Kellermann
20a5ef2798 NEWS: mention the sndio mixer plugin 2017-09-19 19:38:43 +02:00
Max Kellermann
735eabb066 output/sndio: move #include below guard 2017-09-19 18:59:04 +02:00
Max Kellermann
412ff762bb output/sndio: use forward declarations 2017-09-19 18:58:13 +02:00
Max Kellermann
44bbf42a9f Merge branch 'v0.20.x' 2017-09-19 18:58:02 +02:00
Max Kellermann
75c740fe2b output/sndio: fix indent 2017-09-19 18:50:35 +02:00
Max Kellermann
6c8d86bb90 output/sndio: rename the "sio_hdl" variable to avoid clash with struct name 2017-09-19 18:49:33 +02:00
Charlie Waters
b253a6b71e ffmpeg plugin: when decoded stream duration is unavailable, attempt fallback to container duration (fix MusicPlayerDaemon/MPD#110) 2017-09-18 10:39:27 +02:00
Christopher Zimmermann
030f87c90c Add sndio mixer plugin 2017-09-16 11:58:33 +02:00
Christopher Zimmermann
ae941a7665 SndioOutput: Move class definition to header
no change in behaviour.
2017-09-16 09:14:56 +02:00
Christopher Zimmermann
4d563e08e1 Fix building on BSDs 2017-09-16 09:14:11 +02:00
Max Kellermann
8a81b986c0 net/AllocatedSocketAddress: pass SocketAddress by value to operator!= 2017-09-13 17:51:51 +02:00
Max Kellermann
a6e62479be system/Error: include cleanup 2017-09-13 17:49:37 +02:00
Max Kellermann
6c825064ea system/Error: add more "noexcept" 2017-09-13 17:48:13 +02:00
Max Kellermann
13d02968bd system/FileDescriptor: Close() should not be called on undefined object
It does not do much harm - but it causes an unnecessary (failing)
system call.
2017-09-13 17:43:13 +02:00
Max Kellermann
e576556149 system/UniqueFileDescriptor: remove duplicate "using" statements 2017-09-13 17:41:15 +02:00
Max Kellermann
66e74900df system/UniqueFileDescriptor: expose CheckDuplicate() 2017-09-13 17:40:33 +02:00
Max Kellermann
aadc735d71 system/FileDescriptor: mention class UniqueFileDescriptor in API documentation 2017-09-13 17:39:29 +02:00
Max Kellermann
a13897cf6f system/FileDescriptor: add CheckDuplicate() 2017-09-13 17:37:28 +02:00
Max Kellermann
b188ae0e5c system/FileDescriptor: use _WIN32 instead of WIN32 2017-09-13 17:36:48 +02:00
Max Kellermann
c196710fae util/WStringCompare: relicense to BSD-2 2017-09-13 16:43:41 +02:00
Max Kellermann
e4f62483ff util/StringView: add default constructors
It was implicitly deleted since commit
db23c2f27b
2017-09-13 12:59:31 +02:00
Max Kellermann
8d9347edc5 Util/WStringCompare: use struct WStringView 2017-09-13 11:47:48 +02:00
Max Kellermann
eff821c1ca Util/StringView: move struct WStringView to separate header 2017-09-13 11:22:59 +02:00
Max Kellermann
3bcd6ecbad util/Exception: update API documentation 2017-09-13 10:49:34 +02:00
Max Kellermann
e76f4c2ae9 util/DeleteDisposer: convert struct to class 2017-09-13 10:35:51 +02:00
Max Kellermann
f46ac45d69 util/*: update include guards 2017-09-13 10:35:11 +02:00
Max Kellermann
1d1259a86d util/AllocatedString: add method data() 2017-09-13 10:34:12 +02:00
Max Kellermann
101f08ca75 util/Cast: make the "member" pointer const 2017-09-13 10:32:55 +02:00
Max Kellermann
3b7f9827ab Util/IterableSplitString: add wchar_t specialization 2017-09-12 19:12:09 +02:00
Max Kellermann
f98bf39005 Util/IterableSplitString: add template class BasicIterableSplitString 2017-09-12 19:12:09 +02:00
Max Kellermann
9e7df54ccd Util/StringView: add struct TStringView 2017-09-12 19:12:09 +02:00
Max Kellermann
db23c2f27b util/StringView: allow casting from BasicStringView to StringView 2017-09-12 19:08:47 +02:00
Max Kellermann
9744f437d8 Util/CharUtil: add wchar_t overloads
Needed for WStringView.
2017-09-12 18:22:02 +02:00
Max Kellermann
01f84b0e53 util/StringView: add struct WStringView 2017-09-12 17:17:13 +02:00
Max Kellermann
5dbdd36263 util/StringView: add struct BasicStringView 2017-09-12 17:17:13 +02:00
Max Kellermann
96b557c1f0 util/StringView: remove methods SetEmpty(), Empty() 2017-09-12 17:17:13 +02:00
Max Kellermann
ebdb7c8de2 util/WStringAPI: add StringIsEqualIgnoreCase() overload 2017-09-12 17:17:13 +02:00
Max Kellermann
1fda842ee6 util/StringView: use StringAPI.hxx 2017-09-12 17:00:42 +02:00
Max Kellermann
f71e20d0ce util/StringView: use value_type 2017-09-12 17:00:38 +02:00
Max Kellermann
988680de33 util/StringView: remove unnecessary operator= overloads
These will be generated by the compiler automatically.
2017-09-12 17:00:02 +02:00
Max Kellermann
cdf92c6300 util/StringView: remove redundant template parameters 2017-09-12 16:57:19 +02:00
Max Kellermann
be5b726c0a util/StringView: remove Literal()
This is not necessary, because a strlen() on a literal gets optimized
away by the compiler.
2017-09-12 16:55:10 +02:00
Max Kellermann
3491218915 db/update/Service: use C++11 initializers 2017-09-09 07:59:51 +02:00
Max Kellermann
d0f6131ba4 output/Interface: allow Pause() to throw exception
Coverity discovered that the Pulse plugin could throw exceptions from
Pause(), but that method was marked "noexcept" because its caller was
not designed to catch exceptions.  So instead of avoiding exceptions
(by catching and logging them in each and every implementation), let's
allow them, and do the catch/log game in the MPD core.
2017-09-08 14:45:53 +02:00
Max Kellermann
ca7b4df812 doc/user: document the Opus encoder 2017-09-07 14:21:40 +02:00
Max Kellermann
9cc37bdea2 command/PlayerCommands: emit "volume" only if it is known
The "-1" magic value is deprecated now.
2017-09-04 08:37:37 +02:00
Max Kellermann
3f754fd350 Merge branch 'v0.20.x' 2017-09-04 08:27:08 +02:00
Max Kellermann
bc8dd57236 doc/protocol.xml: document status/volume=-1
Closes #107
2017-09-04 08:15:41 +02:00
Max Kellermann
f4f461b8bb storage/curl: support Content-Type application/xml 2017-09-01 11:32:40 +02:00
Max Kellermann
cbb9b6957f storage/curl: use StringStartsWith() 2017-09-01 11:31:10 +02:00
Max Kellermann
f6b56c9317 storage/curl: move code to IsXmlContentType() 2017-09-01 11:30:30 +02:00
Max Kellermann
3717fb6c8d win32/build.py: add -march=pentium3 to fix 32 bit LAME build
Workaround for the following LAME build failure:

 error: inlining failed in call to always_inline '_mm_sqrt_ps': target
 specific option mismatch

This is because the LAME build scripts do not check whether SSE is
available; they only check for the presence of the "xmmintrin.h"
header.

Requiring a Pentium 3 CPU is reasonable enough, and it's the first CPU
to feature SSE support.
2017-08-31 19:48:59 +02:00
Max Kellermann
f6abbc01bd increment version number to 0.20.11 2017-08-31 19:48:59 +02:00
Max Kellermann
91438b6540 output/Interface: the default Pause() implementation fails
Fixes regression from commit 31bad5f7af:
if Pause() returns true, the output thread is running a busy loop,
causing 100% CPU usage, instead of just closing the output.

Closes #105
2017-08-31 15:02:15 +02:00
Max Kellermann
987c505906 event/TimeoutMonitor: remove obsolete class 2017-08-29 16:53:15 +02:00
Max Kellermann
598bb93cc2 StateFile: migrate from TimeoutMonitor to TimerEvent 2017-08-29 16:52:02 +02:00
Max Kellermann
dc531b64ae db/update/InotifyQueue: migrate from TimeoutMonitor to TimerEvent 2017-08-29 16:38:50 +02:00
Max Kellermann
91d4b5cfed lib/nfs/Connection: migrate from TimeoutMonitor to TimerEvent 2017-08-29 16:36:16 +02:00
Max Kellermann
c24b8460e0 lib/curl/Global: migrate from TimeoutMonitor to TimerEvent 2017-08-29 16:33:20 +02:00
Max Kellermann
2e471daef1 storage/nfs: migrate from TimeoutMonitor to TimerEvent 2017-08-29 16:30:50 +02:00
Max Kellermann
7ae57a3531 event/MultiSocketMonitor: migrate from TimeoutMonitor to TimerEvent 2017-08-29 16:28:27 +02:00
Max Kellermann
11f36c0bd6 zeroconf/AvahiPoll: migrate from TimeoutMonitor to TimerEvent 2017-08-29 16:28:27 +02:00
Max Kellermann
fd520eeed2 Client: migrate from TimeoutMonitor to TimerEvent 2017-08-29 16:28:27 +02:00
Max Kellermann
30a5dd267b event/TimeoutMonitor: move code to new class TimerEvent 2017-08-29 16:28:27 +02:00
Max Kellermann
2f0d683378 event/Loop: fix inverted checkin RemoveDeferred() 2017-08-29 16:28:24 +02:00
Max Kellermann
a1309a90ac event/Loop: use boost::intrusive::list to store IdleMonitors and DeferredMonitors
The intrusive contains can easily erase items without searching
through the whole list.  This removes a good amount of runtime
overhead.
2017-08-29 15:43:16 +02:00
Max Kellermann
010855a294 event/Loop: use boost::intrusive::multiset to store TimeoutMonitors
By using an "intrusive" data structure, we can easily eliminate
struct TimerRecord.
2017-08-29 14:42:59 +02:00
Max Kellermann
71ed3ff992 event/Loop: move TimerRecord::due to class TimeoutMonitor
Prepare to eliminate the TimerRecord struct.
2017-08-29 14:13:09 +02:00
Max Kellermann
d4266d0063 event/Loop: remove unused method TimerRecord::IsDue() 2017-08-29 13:41:11 +02:00
Max Kellermann
8225064aab lib/upnp/Discovery: add missing include
Got lost in commit e5ee357903
2017-08-29 13:41:03 +02:00
Max Kellermann
e5ee357903 lib/upnp/Discovery: use DeferredMonitor instead of BlockingCall() 2017-08-25 11:01:30 +02:00
Max Kellermann
8aef518c05 lib/upnp/Discovery: add method GetEventLoop() 2017-08-25 10:59:49 +02:00
Max Kellermann
309ed77ef4 lib/upnp/Device: use std::string::find() instead of ...find_first_of() 2017-08-25 10:57:40 +02:00
Max Kellermann
9a6d2b791f lib/upnp/Discovery: avoid a std::string copy 2017-08-25 10:55:30 +02:00
Max Kellermann
2a5010a426 lib/upnp/Discovery: remove obsolete comment 2017-08-25 10:16:19 +02:00
Max Kellermann
be29da46f8 lib/upnp/Discovery: use std::list::remove_if() 2017-08-25 10:14:18 +02:00
Max Kellermann
d0734e27ba lib/upnp/Discovery: use range-based "for" 2017-08-25 10:11:35 +02:00
Max Kellermann
732f6aaa30 neighbor/Explorer: add "noexcept" 2017-08-25 10:09:34 +02:00
Max Kellermann
dd422c7b8b neighbor/plugins/*: remove redundant "virtual" 2017-08-25 10:07:32 +02:00
Max Kellermann
c8f7a859ea lib/upnp/Discovery: use CURL instead of UpnpDownloadUrlItem()
We can do CURL requests asynchronously, and we don't need a
synchronous WorkQueue thread for that.

This allows parallelizing lookups and allows immediate cancellation.
2017-08-25 09:52:44 +02:00
Max Kellermann
28a2d41b85 db/DatabasePlugin: pass EventThread's EventLoop to create()
Allows database plugins to use the EventThread, e.g. for CURL
integration.
2017-08-24 19:53:52 +02:00
Max Kellermann
7e76656a18 db/DatabasePlugin: add #EventLoop parameter documentation 2017-08-24 19:45:23 +02:00
Max Kellermann
0b93f52ba4 Merge tag 'v0.20.10'
release v0.20.10
2017-08-24 09:35:34 +02:00
Max Kellermann
57a71c157d release v0.20.10 2017-08-24 09:15:43 +02:00
Max Kellermann
cc76aeb7bb python/build/libs: upgrade CURL to 7.55.1 2017-08-24 09:06:15 +02:00
Max Kellermann
811cabf8a9 python/libs: upgrade Opus to 1.2.1 2017-08-24 09:06:15 +02:00
Max Kellermann
bf8d2f93d2 python/build/libs: upgrade FFmpeg to 3.3.3 2017-08-24 09:06:15 +02:00
Max Kellermann
07d8259ad6 python/libs: upgrade Boost to 1.65 2017-08-23 17:46:25 +02:00
Max Kellermann
a00d412008 player/Thread: initialize play_audio_format, fixes assertion
This fixes an assertion failure caused by resuming playback before the
decoder has finished startup.
2017-08-23 17:43:49 +02:00
Matthew Leon
aa9c6062b0 Merge branch 'v0.20.x' into master
contains OSX mixer
2017-08-22 10:36:37 +01:00
Matthew Leon
5fb39658f1 OSX mixer 2017-08-21 20:05:50 +01:00
Max Kellermann
95637fd153 lib/upnp/Discovery: use strncmp() instead of memcmp()
memcmp() can overflow the buffer.
2017-08-18 18:48:22 +02:00
Max Kellermann
5ac72211cd event/Loop: set thread to current thread by default
Allows eliminating lots of complexity and workarounds for bogus
assertion failures.
2017-08-18 18:18:55 +02:00
Max Kellermann
94525d3952 IOThread: remove obsolete library
We now pass the EventThread's EventLoop reference around.
2017-08-18 18:15:19 +02:00
Max Kellermann
7f9a2f8adb event/Loop: schedule and cancel the WakeFD in Run()
This is only needed while Run() is alive, and moving it there avoids
problems with thread-checking assertions.
2017-08-18 18:08:06 +02:00
Max Kellermann
cd0e92878f test/DumpDatabase: start an EventThread
Our local EventLoop instance was never run; it was not usable.
2017-08-18 17:16:23 +02:00
Max Kellermann
9033f07724 test/{DumpDatabase,run_neighbor_explorer}: add class GlobalInit 2017-08-18 14:21:54 +02:00
Max Kellermann
b7d0890bc0 lib/curl/Init: share a CurlGlobal instance between input and storage 2017-08-18 13:34:55 +02:00
Max Kellermann
b2b079a26b SongFilter: use std::chrono::system_clock::time_point instead of time_t 2017-08-18 12:30:50 +02:00
Max Kellermann
b886dfae4d DetachedSong, db/LightSong, db/simple/Song: use std::chrono::system_clock::time_point 2017-08-18 12:22:47 +02:00
Max Kellermann
902fbb3347 db/LightDirectory: use std::chrono::system_clock::time_point 2017-08-18 12:16:43 +02:00
Ryan Walklin
9f16c798d0 Fix std::string read after free in read_stream_art 2017-08-17 21:25:03 +10:00
Ryan Walklin
318f80d113 Fix EventPipe file descriptors 2017-08-17 12:21:01 +10:00
Ryan Walklin
9df8b32f10 Add albumart command
Add API documentation
Support 64 bit offsets
Use InputStream for all reads
2017-08-15 20:38:33 +10:00
Max Kellermann
6f37f5752b db/PlaylistInfo: use std::chrono::system_clock::time_point 2017-08-11 12:50:33 +02:00
Max Kellermann
9d0a71f245 output/Jack: add "noexcept" 2017-08-11 12:41:11 +02:00
Max Kellermann
ff1b435232 output/Jack: reorder methods 2017-08-11 12:39:42 +02:00
Max Kellermann
b57a272f67 system/EPollFD: throw exception instead of raising fatal error 2017-08-11 09:39:47 +02:00
Max Kellermann
ef79647e85 zeroconf/Avahi: throw exception instead of raising fatal error 2017-08-11 09:38:08 +02:00
Max Kellermann
d3fd89552f unix/Signalhandlers: throw exception instead of raising fatal error 2017-08-11 09:37:30 +02:00
Max Kellermann
6d43e70a93 event/SignalMonitor: throw exception instead of raising fatal error 2017-08-11 09:36:22 +02:00
Max Kellermann
e8333316ee Permission: throw exception instead of raising fatal error 2017-08-11 09:33:59 +02:00
Max Kellermann
85edcb858d tag/Config: throw exception instead of raising fatal error 2017-08-11 09:33:07 +02:00
Max Kellermann
bab5f1a93f client: make GREETING constexpr 2017-08-11 09:22:26 +02:00
Max Kellermann
6de8303df8 client: use C++11 initializers 2017-08-11 09:21:29 +02:00
Max Kellermann
33b4114534 system/fd_util: remove unused library 2017-08-11 09:20:15 +02:00
Max Kellermann
7a4457402f system/EventPipe: use FileDescriptor::CreatePipeNonBlock() 2017-08-11 09:19:00 +02:00
Max Kellermann
9056dcaf7d system/FileDescriptor: add method CreatePipeNonBlock() 2017-08-11 09:15:22 +02:00
Max Kellermann
2119e4fd3e system/EventPipe: use class UniqueSocketDescriptor in PoorSocketPair() 2017-08-11 09:09:04 +02:00
Max Kellermann
bcd5190f1d system/EventPipe: throw exception instead of raising fatal error 2017-08-11 09:09:04 +02:00
Max Kellermann
d705a92e43 net/IPv4Address: new class 2017-08-11 09:09:04 +02:00
Max Kellermann
614b3634d4 net/SocketDescriptor: add AcceptNonBlock() overload without address 2017-08-11 09:07:35 +02:00
Max Kellermann
b234f4307f net/SocketDescriptor: AcceptNonBlock() enables non-blocking even if SOCK_NONBLOCK is unavailable 2017-08-11 09:04:38 +02:00
Max Kellermann
e38c213ee0 net/SocketDescriptor: check HAVE_ACCEPT4 2017-08-11 09:04:10 +02:00
Max Kellermann
699f41e114 system/EventPipe: use AtScopeExit() in PoorSocketPair() 2017-08-11 08:30:37 +02:00
Max Kellermann
424e1363ed zeroconf/Bonjour: pass SocketDescriptor to constructor
Fixes Mac build failure.
2017-08-11 08:25:26 +02:00
Max Kellermann
7484bc31b4 system/FileDescriptor: implement CreatePipe() on Windows 2017-08-11 08:15:47 +02:00
Max Kellermann
5a495cc165 system/fd_util: remove unused function close_socket() 2017-08-10 19:47:57 +02:00
Max Kellermann
9ff4717738 system/fd_util: remove unused function accept_cloexec_nonblock() 2017-08-10 19:47:40 +02:00
Max Kellermann
0c1740982d system/fd_util: remove unused function open_cloexec() 2017-08-10 19:46:23 +02:00
Max Kellermann
3c7c0515d8 output/oss: use class FileDescriptor 2017-08-10 19:42:23 +02:00
Max Kellermann
56cb92fdaf mixer/oss: use class FileDescriptor 2017-08-10 19:41:22 +02:00
Max Kellermann
c00b6ff999 fs/FileSystem: use UniqueFileDescriptor in TruncateFile() 2017-08-10 19:40:47 +02:00
Max Kellermann
df5cc3f0f6 fs/FileSystem: OpenFile() returns UniqueFileDescriptor 2017-08-10 19:34:52 +02:00
Max Kellermann
eb0ff32efb system/FileDescriptor: add Open() overload with wchar_t path 2017-08-10 19:34:52 +02:00
Max Kellermann
cf0120e8e0 net/SocketUtil: use SocketDescriptor::SetBoolOption() 2017-08-10 19:30:46 +02:00
Max Kellermann
1f47dc990d net/SocketDescriptor: add method SetKeepAlive() 2017-08-10 19:25:02 +02:00
Max Kellermann
9a5bcc6db0 net/ServerSocket: pass UniqueSocketDescriptor&& to OnAccept() 2017-08-10 19:20:14 +02:00
Max Kellermann
492b20a89d event/SocketMonitor: use class SocketDescriptor 2017-08-10 19:19:58 +02:00
Max Kellermann
fcfc8bacc0 output/httpd: remove obsolete accept() error check 2017-08-10 19:19:53 +02:00
Max Kellermann
0800d9427c system/fd_util: remove unused function socket_cloexec_nonblock() 2017-08-10 17:40:14 +02:00
Max Kellermann
4e113a7086 lib/nfs/Connection: use class SocketDescriptor 2017-08-10 17:37:19 +02:00
Max Kellermann
39f422ded8 net/SocketDescriptor: allow constructing with "int" 2017-08-10 17:37:08 +02:00
Max Kellermann
d2cdaa041c net/SocketDescriptor: SO_REUSEADDR is portable 2017-08-10 13:23:14 +02:00
Max Kellermann
d84dae488e net/SocketUtil: fix -Wunused 2017-08-10 13:22:00 +02:00
Max Kellermann
79e75bfbb9 net/SocketDescriptor: cast setsockopt() value to "const char *" for Windows 2017-08-10 13:21:24 +02:00
Max Kellermann
73b15c1bee net/SocketDescriptor: socketpair() is unavailable on Windows 2017-08-10 13:19:47 +02:00
Max Kellermann
b180604422 net/SocketDescriptor: implement SetNonBlocking() on Windows 2017-08-10 13:18:23 +02:00
Max Kellermann
fab12ef241 net/SocketDescriptor: call SetNonBlocking() on Linux if SOCK_NONBLOCK unavailable 2017-08-10 13:16:25 +02:00
Max Kellermann
917881aa48 net/SocketDescriptors: IsValid() is not available on Windows 2017-08-10 13:15:57 +02:00
Max Kellermann
9259e989a4 net/SocketDescriptors: fix includes for Windows 2017-08-10 13:13:19 +02:00
Max Kellermann
da90f484aa net/SocketUtil: socket_bind_listen() returns UniqueSocketDescriptor 2017-08-10 13:12:13 +02:00
Max Kellermann
817e912025 net/SocketDescriptor: specialization of FileDescriptor for network sockets 2017-08-10 13:12:13 +02:00
Max Kellermann
7f83d38bca net/StaticSocketAddress: add struct sockaddr cast operators 2017-08-10 13:12:13 +02:00
Max Kellermann
54de8b8e77 net/*, ...: use AF_LOCAL instead of AF_UNIX 2017-08-10 13:12:13 +02:00
Max Kellermann
796956970e net/StaticSocketAddress: pass SocketAddress by value to operator!= 2017-08-10 13:12:13 +02:00
Max Kellermann
c0020142da net/StaticSocketAddress: add method SetMaxSize() 2017-08-10 13:12:13 +02:00
Max Kellermann
ee6eea95af net/StaticSocketAddress: set a valid size in Clear() 2017-08-10 13:12:13 +02:00
Max Kellermann
a257504ba4 mixer/Plugin: pass AudioOutput to init()
Fix breakage from commit bea5681fd8
2017-08-10 13:07:36 +02:00
Max Kellermann
fb0dbce15b system/EventFD: use class UniqueFileDescriptor 2017-08-10 12:14:56 +02:00
Max Kellermann
8333551331 system/SignalFD: use class UniqueFileDescriptor 2017-08-10 12:13:41 +02:00
Max Kellermann
292d794806 system/UniqueFileDescriptor: new auto-closing FileDescriptor wrapper 2017-08-10 12:01:17 +02:00
Max Kellermann
91ce76af9d system/FileDescriptor: add methods EnableCloseOnExec(), DisableCloseOnExec() 2017-08-10 11:54:26 +02:00
Max Kellermann
33bd9e80bb system/FileDescriptor: add method IsReadyForWriting() 2017-08-10 11:53:43 +02:00
Max Kellermann
d310f3e9b7 system/FileDescriptor: add method IsValid() 2017-08-10 11:52:22 +02:00
Max Kellermann
8c832f4c50 system/FileDescriptor: use std::exchange() 2017-08-10 09:55:11 +02:00
Max Kellermann
31bad5f7af output/Interface: convert to abstract class
Yet another C-style vtable replaced with C++.
2017-08-10 09:01:41 +02:00
Max Kellermann
1cf7f3d87c output/Solaris: use class FileDescriptor 2017-08-10 08:56:56 +02:00
Max Kellermann
9c9a9ccd5c output/Interface: convert to class, make attributes private 2017-08-09 17:03:07 +02:00
Max Kellermann
7381236de6 output/Interface: remove unused attribute "parent" 2017-08-09 17:03:00 +02:00
Max Kellermann
fe9ffcb9d2 Merge branch 'v0.20.x' 2017-08-08 19:30:30 +02:00
Max Kellermann
bea5681fd8 output/Interface: define a new struct AudioOutput
Hide struct FilteredAudioOutput from the plugins, preparing for hiding
MPD's core internals.
2017-08-08 18:58:40 +02:00
Max Kellermann
e11229494e output/Filtered: add method NeedFullyDefinedAudioFormat()
Avoid accessing FilteredAudioFormat attributes directly.
2017-08-08 18:57:59 +02:00
Max Kellermann
ccc0fcb5b7 output/Shout: move ConfigureShoutAudioInfo() call to Open()
Configure the AudioFormat after opening the encoder, because only now
we know the final format.
2017-08-08 18:56:14 +02:00
Max Kellermann
6e24381962 output/Shout: move code to ShoutSetAudioInfo() 2017-08-08 18:56:12 +02:00
Max Kellermann
3ab905644d output/Shout: open the encoder first, then open connection
This order will be necessary for proper AudioFormat initialization,
because the encoder may change the format.
2017-08-08 18:53:04 +02:00
Max Kellermann
f46d545307 output/Shout: pass shout_t* to shout_connect() 2017-08-08 18:52:03 +02:00
Max Kellermann
8134b0073b output/Shout: move write_page() into the struct 2017-08-08 18:47:37 +02:00
Max Kellermann
6ab19c7ef2 output/Shout: pass shout_t* to handle_shout_error() 2017-08-08 18:47:30 +02:00
Max Kellermann
d22361f7c7 output/Shout: remove unnecessary nullptr check 2017-08-08 18:47:02 +02:00
Max Kellermann
06c7e55188 output/Filtered: add methods SupportsEnableDisable(), SupportsPause() 2017-08-08 15:54:49 +02:00
Max Kellermann
b3eb8489f3 output/Filtered: add a few OutputPlugin method wrappers 2017-08-08 14:27:19 +02:00
Max Kellermann
5431fca99b output/Filtered: add attribute "log_name" 2017-08-08 14:02:58 +02:00
Max Kellermann
47c9d6ac64 output/Internal: rename source to Filtered.cxx 2017-08-07 21:50:13 +02:00
Max Kellermann
d0157af13e filter/Internal: rename struct AudioOutput to FilteredAudioOutput
Prepare to add an abstract class AudioOutput, to be implemented by
plugins, to get rid of the C-style vtable.
2017-08-07 18:47:39 +02:00
Max Kellermann
fc04620519 output/Internal: move code to ConfigureConvertFilter() 2017-08-07 18:42:10 +02:00
Max Kellermann
d4ee165253 output/Thread: move OpenSoftwareMixer() to the end
This call cannot fail, but needs cleanup if others fail.  By moving it
to the end, we eliminate some cleanup.
2017-08-07 18:42:09 +02:00
Max Kellermann
4f7f577a57 output/Internal: add OpenSoftwareMixer()
Moved code from AudioOutputControl::InternalOpen2().
2017-08-07 18:33:07 +02:00
Max Kellermann
612def5c11 output/Internal: rename CloseFilter() to CloseSoftwareMixer() 2017-08-07 18:32:43 +02:00
Max Kellermann
704825be96 mixer/Software: include cleanup 2017-08-07 18:31:11 +02:00
Max Kellermann
b8be7ec90e filter/Normalize: add normalize_filter_prepare() 2017-08-07 18:28:52 +02:00
Max Kellermann
a3d71f4b91 filter/Convert: add convert_filter_prepare() 2017-08-07 18:27:00 +02:00
Max Kellermann
9250819b75 filter/Volume: add volume_filter_prepare()
Circumvent filter_new() with a fake ConfigBlock.
2017-08-07 18:23:13 +02:00
Max Kellermann
04738636ca output/Finish: fold internal function into FinishDestroy() 2017-08-07 18:15:15 +02:00
Max Kellermann
33f67d418f test/run_output: use AudioOutput::{Begin,Finish}Destroy() 2017-08-07 18:14:54 +02:00
Max Kellermann
07d1b3780d output/Control: move two AudioOutput methods to Finish.cxx 2017-08-07 18:13:57 +02:00
Max Kellermann
27d68d8fdd output/Internal: move the Mutex to struct AudioOutputControl
struct AudioOutput should not know or care about multi-threading.
2017-08-07 17:44:46 +02:00
Max Kellermann
546b773b21 output/Internal: remove mutex code from Close() 2017-08-07 17:43:58 +02:00
Max Kellermann
15dcaeda0f output/Internal: remove mutex code from BeginPause(), IteratePause() 2017-08-07 17:40:40 +02:00
Max Kellermann
8f42ba13ef output/Internal: simplify "return" statements in IteratePause() 2017-08-07 17:40:13 +02:00
Max Kellermann
5990017d51 output/Internal: remove mutex code from Enable() and Disable() 2017-08-07 17:39:20 +02:00
Max Kellermann
3197c0fd7d output/Thread: move code to InternalCloseOutput() 2017-08-07 17:35:43 +02:00
Max Kellermann
4580c685f1 output/Thread: unlock the mutex for several AudioOutput calls 2017-08-07 17:08:49 +02:00
Max Kellermann
67232453d4 output/Control: more locking information in API docs 2017-08-07 16:56:41 +02:00
Max Kellermann
b4cce80727 output/Thread: move code to InternalClose() 2017-08-07 16:34:29 +02:00
Max Kellermann
89a2e5ded3 output/Thread: rename InternalClose() to InternalCheckClose() 2017-08-07 16:33:20 +02:00
Max Kellermann
9d6b4f46d4 output/Thread: move AudioOutput methods to Internal.cxx 2017-08-07 16:26:50 +02:00
Max Kellermann
a4019cb6aa util/StringBuffer: use std::array::const_iterator 2017-08-07 16:18:43 +02:00
Max Kellermann
b0703b92c3 util/FormatString: pass the allocated buffer to AllocatedString::Donate()
.. and not the stack buffer.  This made the AllocatedString destructor
crash.

Closes #52
2017-08-03 00:25:30 +02:00
Max Kellermann
d29bdf3e81 Merge branch 'v0.20.x' 2017-07-31 13:50:14 +02:00
Max Kellermann
dd9fd3d8a7 tag/Aiff: the FORM chunk size is big-endian
Was broken by commit 8a86460b8f

Closes #87
2017-07-31 13:46:09 +02:00
Max Kellermann
cf0c59864f doc/protocol.xml: clarify that idle events do not get lost 2017-07-21 09:51:43 +02:00
Matthew Leon
4c0404c70d Check for MusicBrainz id3v2 tags in ffmpeg.
Addresses #82.

Previously, the ffmpeg decoder only checked for the "generic"
MusicBrainz metadata keys used in other metadata container formats.
2017-07-20 08:28:14 +02:00
Matthew Leon
573a413ee1 move MusicBrainz id3v2 tags to separate file
We will reuse these tags elsewhere.
2017-07-20 08:26:29 +02:00
Max Kellermann
f633e6ca49 python/build/libs: add LAME
Enable it in the Windows build script, closes #78.

LAME currently doesn't support Android:

 checking host system type... Invalid configuration `arm-linux-androideabi': system `androideabi' not recognized
2017-07-19 20:53:52 +02:00
Max Kellermann
07b06d76be {android,win32}/build.py: concatenate variables from the command line 2017-07-19 20:53:52 +02:00
Max Kellermann
501a4af914 util/StringUtil: move strip functions to StringStrip.cxx 2017-07-05 17:20:02 +02:00
Max Kellermann
dad7d7e798 util/TruncateString: rename CopyString() to CopyTruncateString() 2017-07-05 17:15:58 +02:00
Max Kellermann
4b94ae8040 util/StringUtil: move CopyString() to TruncateString.cxx 2017-07-05 17:11:34 +02:00
Max Kellermann
b04679b429 util/WritableBuffer: add method MoveFront() 2017-07-05 17:10:59 +02:00
Max Kellermann
19358d1c42 util/Exception: add more utility functions 2017-07-05 17:08:26 +02:00
Max Kellermann
8679074be7 util/Exception: move code to AppendNestedMessage() 2017-07-05 17:07:43 +02:00
Max Kellermann
ba09e22c30 util/Exception: add GetFullMessage(std::exception) 2017-07-05 17:07:41 +02:00
Max Kellermann
6515b9727d util/Exception: catch std::nested_exception 2017-07-05 17:07:40 +02:00
Max Kellermann
4af8e5bdb5 util/Exception: include cleanup 2017-07-05 17:07:39 +02:00
Max Kellermann
2db8cf477b util/Exception: add "fallback" and "separator" parameters 2017-07-05 16:59:40 +02:00
Max Kellermann
3cfefa53f7 util/Exception: rename FullMessage() to GetFullMessage() 2017-07-05 12:25:55 +02:00
Max Kellermann
bce89feb13 util/Manual: drop prefix from include guard 2017-07-05 12:25:32 +02:00
Max Kellermann
88f5220acf util/Manual: drop support for gcc 4.6 2017-07-05 12:25:20 +02:00
Max Kellermann
3e87ac75a1 util/Manual: use C++11 initializer 2017-07-05 12:12:41 +02:00
Max Kellermann
9237f2a80c util/{Const,Writable}Buffer: add array constructor 2017-07-05 12:09:27 +02:00
Max Kellermann
61aca389c4 util/{Const,Writable}Buffer: add typedef value_type 2017-07-05 12:08:34 +02:00
Max Kellermann
80438c4876 util/BindMethod: add BIND_FUNCTION() 2017-07-05 12:04:29 +02:00
Max Kellermann
70ac4fa96b util/AllocatedString: implement AllocatedString<wchar_t>::Duplicate() 2017-07-05 10:26:39 +02:00
Max Kellermann
6e2b348758 output/Internal: move the "open" flag to struct AudioOutputControl 2017-06-15 22:52:46 +02:00
Max Kellermann
5ed5d7fe60 Merge branch 'v0.20.x' 2017-06-15 22:51:07 +02:00
Max Kellermann
856fe2da15 python/build/libs: upgrade FFmpeg to 3.3.2, CURL to 7.54.1 2017-06-15 21:53:22 +02:00
Max Kellermann
f82aae65cd doc/user: add more Debian build dependencies 2017-06-15 21:37:07 +02:00
Max Kellermann
3fbd11a104 doc/user: update build dependencies for Debian Jessie 2017-06-15 21:37:05 +02:00
Max Kellermann
58a99f1907 increment version number to 0.20.10 2017-06-15 21:35:23 +02:00
Max Kellermann
613dd67784 output/Internal: move the AudioOutputSource to struct AudioOutputControl 2017-06-08 22:13:47 +02:00
Max Kellermann
58683f02ec output/Thread: move the AudioOutputSource::Open() call to InternalOpen()
Prepare for moving the AudioOutputSource to class AudioOutputControl.
2017-06-08 22:08:01 +02:00
Max Kellermann
7cb82fe8f3 output/Thread: move code to InternalClose() 2017-06-08 21:59:48 +02:00
Max Kellermann
0494779ecb output/Thread: move software_mixer_set_filter() out of the "try" block
That function is "noexcept".
2017-06-08 21:49:41 +02:00
Max Kellermann
0500990d23 filter/volume: remove unused PcmVolume instance 2017-06-08 21:48:22 +02:00
Max Kellermann
22a82f1eaa mixer/software, filter/volume: add "noexcept" 2017-06-08 21:45:23 +02:00
Max Kellermann
13b04dc908 mixer/Internal: add "noexcept" 2017-06-08 21:42:57 +02:00
Max Kellermann
011106b517 mixer/Internal: use C++11 initializers 2017-06-08 21:42:39 +02:00
Max Kellermann
7467b85019 output/Thread: rename audio_format to in_audio_format 2017-06-08 13:20:55 +02:00
Max Kellermann
7dea615f74 output/{Source,Thread}: make the AudioFormat parameter const 2017-06-08 13:19:34 +02:00
Max Kellermann
3010d182fc output/Internal: move "really_enabled" flag to class AudioOutputControl 2017-06-08 09:55:49 +02:00
Max Kellermann
a72a02f0f2 output/Thread: move Enable() call to InternalEnable() 2017-06-08 09:51:13 +02:00
Max Kellermann
614df96382 output/Thread: move Enable() call out of Open() 2017-06-08 09:50:34 +02:00
Max Kellermann
669d7a6feb output/Thread: move Close() call out of Disable() 2017-06-08 09:34:24 +02:00
Max Kellermann
d600b937f1 output/Thread: move code to InternalDisable() 2017-06-08 09:32:07 +02:00
Max Kellermann
ae713cb099 *: add lots of "noexcept" specifications 2017-06-04 13:09:11 +02:00
Max Kellermann
979f1b6c39 Merge tag 'v0.20.9'
release v0.20.9
2017-06-04 12:57:05 +02:00
Max Kellermann
cf86dfd317 release v0.20.9 2017-06-04 12:51:36 +02:00
Max Kellermann
a057b4f6d8 *: add lost of "noexcept" specifications 2017-06-04 12:46:48 +02:00
Max Kellermann
62b03cfddf storage, db, mixer, command: remove more bogus "pure" attributes
This commit is similar to 788e3b31e1,
and removes more "pure" attributes which were placed on functions that
could throw exceptions, which is illegal according to clang's
understanding of the attribute (but not according to GCC's).  GitHub
issue #58 was most likely about StorageDirectoryReader::GetInfo() and
Storage::GetInfo(), which still had "pure" attributes.

Closes #58
2017-06-03 21:54:24 +02:00
Jörg Raftopoulos
18b827b979 decoder/ffmpeg: add support for adx
Add ffmpeg decoder support for *.adx files (Sega game console)

Closes #60
2017-06-03 20:57:20 +02:00
Max Kellermann
0a379fc514 system/ByteOrder: fix byte order detection on FreeBSD/aarch64
Patch from
 https://svnweb.freebsd.org/ports/head/audio/musicpd/files/patch-src_system_ByteOrder.hxx?revision=441921&view=co
(with a tiny modification)

Closes #59
2017-05-29 20:37:14 +02:00
Max Kellermann
445c11b8d9 increment version number to 0.20.9 2017-05-29 20:36:08 +02:00
Max Kellermann
1fa1790da5 output/Internal: move the "pause" flag to struct AudioOutputControl 2017-05-23 11:23:10 +02:00
Max Kellermann
dd29e6e475 output/pulse: add "pause" flag
Don't access AudioOutput::pause.
2017-05-23 11:17:04 +02:00
Max Kellermann
ae4b30a697 output/httpd: add "pause" flag
Don't access AudioOutput::pause.
2017-05-23 11:13:41 +02:00
Max Kellermann
353299168a output/Thread: skip WaitForDelay() after resuming playback
This allows removing the "base.pause" check from the JACK output
plugin, and will allow removing similar accesses from other plugins.
2017-05-23 11:00:28 +02:00
Max Kellermann
a50b2c3b85 output/Thread: rename {Play,Pause}() to Internal{Play,Pause}() 2017-05-23 10:59:17 +02:00
Max Kellermann
ebecee3d85 output/Internal: move "client" to struct AudioOutputControl 2017-05-23 00:32:03 +02:00
Max Kellermann
194f733ca7 output/MultipleOutputs: use LoadOutputControl() in AddNullOutput() 2017-05-23 00:31:31 +02:00
Max Kellermann
3907ddbcc4 output/{Internal,Control}: add "noexcept" 2017-05-23 00:17:23 +02:00
Max Kellermann
e616be0a42 output/Thread: move code to InternalOpen() 2017-05-23 00:08:36 +02:00
Max Kellermann
5eef146871 output/Internal: move several flags to struct AudioOutputControl 2017-05-22 23:40:20 +02:00
Max Kellermann
2e65686fc0 output/Control: add method Configure()
Prepare to move some configuration settings from AudioOutput to
AudioOutputControl.
2017-05-22 23:36:45 +02:00
Max Kellermann
e5847f1ddf output/MultipleOutputs: move code to LoadOutputControl() 2017-05-22 23:35:32 +02:00
Max Kellermann
86d05e98e5 Merge tag 'v0.20.8'
release v0.20.8
2017-05-19 20:13:01 +02:00
Max Kellermann
8d290ad509 release v0.20.8 2017-05-19 20:10:22 +02:00
Max Kellermann
b90c48b50f .travis.yml: enable Mac OS X 2017-05-19 19:54:27 +02:00
Max Kellermann
d19e7db09e .travis.yml: add shell variable OPTIONS 2017-05-19 19:54:27 +02:00
Max Kellermann
9939904b02 .travis.yml: configure with --disable-silent-rules --disable-dependency-tracking 2017-05-19 19:54:27 +02:00
Max Kellermann
ca23b15f5c test/test_byte_reverse: move "alignas" attribute to the front
Apparently, this makes old clang versions happy ("'alignas' attribute
cannot be applied to types).
2017-05-19 19:45:42 +02:00
Mario Di Raimondo
ffa676f577 playlist/m3u: support for mime-type audio-mpegurl for M3U playlists 2017-05-19 15:25:58 +02:00
Max Kellermann
6d023c4df3 .travis.yml: remove the unnecessary "compiler" setting 2017-05-17 16:22:19 +02:00
Max Kellermann
b31bd37a30 .travis.yml: check $TRAVIS_OS_NAME
Prepare for Mac OS X support by omitting those Ubuntu-specific
commands.
2017-05-17 15:59:25 +02:00
Max Kellermann
78faee8c7c .travis.yml: choose compiler with environment variables
.. and not update-alternatives, which requires "sudo".
2017-05-17 15:56:19 +02:00
Max Kellermann
40e2a703d0 .travis.yml: parallel build 2017-05-17 15:36:59 +02:00
Max Kellermann
b01edcb9bc .travis.yml: indent 2 2017-05-17 15:27:40 +02:00
Max Kellermann
cdd2d4cc1d util/StringView: add method EndsWith() 2017-05-17 12:39:01 +02:00
Max Kellermann
3bcabad28c net/SocketAddress: add method IsV6Any() 2017-05-17 12:22:59 +02:00
Max Kellermann
c629ac7168 net/SocketAddress: add more "noexcept" 2017-05-17 12:21:36 +02:00
Max Kellermann
0195d5590f net/AllocatedSocketAddress: allow copying 2017-05-17 12:19:24 +02:00
Max Kellermann
e7bebb0089 net/AllocatedSocketAddress: add more "noexcept" 2017-05-17 12:07:20 +02:00
Max Kellermann
7b05df8d33 net/AllocatedSocketAddress: use C++11 initializers 2017-05-17 12:06:45 +02:00
Max Kellermann
a8db9ae304 net/StaticSocketAddress: add method SetPort() 2017-05-17 12:03:45 +02:00
Max Kellermann
e6e9b2041e net/AllocatedSocketAddress: add method SetPort() 2017-05-17 09:36:01 +02:00
Max Kellermann
77c747a8fd net/SocketAddress: add method GetPort() 2017-05-17 09:28:12 +02:00
Max Kellermann
907fb257cd util/StringAPI: add StringToken(), StringIsEqualIgnoreCase(), StringCollate() 2017-05-16 23:04:27 +02:00
Max Kellermann
60bd60db03 util/String{Compare,API}: add more "noexcept" 2017-05-16 23:02:36 +02:00
Max Kellermann
0fcc28a108 util/String{Compare,API}: indent with tabs 2017-05-16 23:01:43 +02:00
Max Kellermann
ab8005f03e util/ScopeExit: include cleanup 2017-05-16 22:56:30 +02:00
Max Kellermann
5e8f578e78 util/ConcatString: return the end pointer 2017-05-16 11:56:56 +02:00
Max Kellermann
a4b1633e11 util/ConcatString: use std::copy_n() instead of memcpy() 2017-05-16 11:56:19 +02:00
Max Kellermann
fea211a109 util/Alloc: move template functions to ConcatString.hxx 2017-05-16 11:32:55 +02:00
Max Kellermann
59e4f1ee0f *: remove lots of GCC 4.8 fallback code
We can remove those C++11 and C++14 kludges because we require GCC 4.9
now.
2017-05-16 11:29:15 +02:00
Max Kellermann
86a0a42a8d util/StringView: add "noexcept" 2017-05-16 10:27:14 +02:00
Max Kellermann
662842126d util/SplitString: add "noexcept" 2017-05-16 10:23:50 +02:00
Max Kellermann
66e3801b1e util/MimeType: add "noexcept" 2017-05-16 10:23:38 +02:00
Max Kellermann
a30cf60422 util/FormatString: add "noexcept" 2017-05-16 10:22:52 +02:00
Max Kellermann
c2b8b818c7 util/DivideString: add "noexcept" 2017-05-16 10:22:36 +02:00
Max Kellermann
4284b0e2b8 util/ByteReverse: add "noexcept" 2017-05-16 10:21:59 +02:00
Max Kellermann
9def9b35b9 util/Exception: add "noexcept" 2017-05-16 10:20:17 +02:00
Max Kellermann
377a2860cc Log: add "noexcept" 2017-05-16 10:15:43 +02:00
Max Kellermann
0a3a5a7c65 Merge branch 'v0.20.x' 2017-05-16 10:09:20 +02:00
André Klitzing
f7fffc9be8 Add initial travis configuration 2017-05-16 07:37:46 +02:00
Max Kellermann
50e8634097 python/build/libs: upgrade FFmpeg to 3.3.1 2017-05-16 07:27:08 +02:00
Max Kellermann
e3994e517e INSTALL: merge into doc/user.xml 2017-05-16 07:24:02 +02:00
Max Kellermann
2bb7785189 doc/user.xml: add sticker documentation 2017-05-16 07:23:57 +02:00
Max Kellermann
90c8408111 doc/user.xml: add Zeroconf documentation 2017-05-16 07:23:52 +02:00
Max Kellermann
64786ec12a Main: omit "constexpr" on MIN_BUFFER_SIZE with GCC 4.x 2017-05-16 07:20:47 +02:00
Max Kellermann
b3c82f8886 output/{osx,haiku,pulse,sles}: add missing "noexcept"
Fixes build failure on OS X, closes #44.  With the other plugins,
that's not critical, because those use the AudioOutputWrapper, which
hides this problem.
2017-05-16 07:12:30 +02:00
Max Kellermann
063259dc52 increment version number to 0.20.8 2017-05-16 07:06:57 +02:00
Max Kellermann
c5996c0593 *: add "noexcept" to many, many function prototypes
See commit 71f0ed8b74
2017-05-15 23:05:45 +02:00
Max Kellermann
cde5a07981 *: remove "pure" and "const" attributes from throwing functions
See commit 788e3b31e1 for an explanation.
2017-05-15 23:02:10 +02:00
Max Kellermann
4faef28cc5 Merge tag 'v0.20.7'
release v0.20.7
2017-05-15 23:01:49 +02:00
Max Kellermann
b4c9d9c2a7 release v0.20.7 2017-05-15 22:51:08 +02:00
Max Kellermann
fa2b59df4b Main: cap buffer_before_play at 80% to prevent deadlock
Closes #34
2017-05-15 22:49:31 +02:00
Max Kellermann
f41a169460 Main: enforce a reasonable minimum audio_buffer_size setting 2017-05-15 22:44:18 +02:00
Max Kellermann
f567083006 Main: refactor DEFAULT_BUFFER_SIZE to represent bytes 2017-05-15 22:40:23 +02:00
Max Kellermann
a2a677e539 doc/developer.xml: change git URIs to GitHub 2017-05-15 21:49:18 +02:00
Max Kellermann
9123c0b733 doc, README.md: update bug tracker URL
Closes #43
2017-05-15 21:48:03 +02:00
Max Kellermann
788e3b31e1 *: remove "pure" and "const" attributes from throwing functions
The "pure" and "const" attributes are not so well-defined, and a
recent clang version implements an optimization which pushes the
definition's boundary beyond what I believed it was.  clang now
assumes that functions declared "pure" cannot throw exceptions, even
if they lack the "noexcept" specification.

When compiled with this new clang version, MPD will crash randomly if
an exception happens to get thrown by such as "pure" function
(https://github.com/MusicPlayerDaemon/MPD/issues/41).

This commit removes all such misplaced "pure" and "const" attributes,
closing #41.
2017-05-08 17:25:06 +02:00
Max Kellermann
71f0ed8b74 *: add "noexcept" to many, many function prototypes
This eliminates some overhead, because the compiler doesn't need to
consider these functions throwing.
2017-05-08 14:44:49 +02:00
Max Kellermann
89b900432e output/Internal: move thread-specific stuff to AudioOutputControl
The AudioOutput struct (which is exposed to all plugins) should not be
aware that it's being controlled by another thread.
2017-04-28 22:04:30 +02:00
Max Kellermann
8bb9d0960b output/Control: add struct AudioOutputControl
Will move attributes from struct AudioOutput that are specific to the
OutputThread.  The new struct AudioOutputControl is a holder for the
AudioOutput pointer.

This prepares for making the output list more dynamic, to allow moving
outputs to between partitions.
2017-04-28 22:04:24 +02:00
Max Kellermann
59181ac5fb output/Thread: move code to BeginPause(), IteratePause() 2017-04-28 22:01:20 +02:00
Max Kellermann
2a831fa547 output/Output*: drop "Output" prefix from source file name 2017-04-28 21:42:24 +02:00
André Klitzing
4abadc890e Add initial travis configuration 2017-04-27 20:12:55 +02:00
Max Kellermann
b0ce551523 decoder/pcm: support audio/L24
Closes #31
2017-04-24 20:54:13 +02:00
Max Kellermann
8b0269c264 Merge branch 'v0.20.x' 2017-04-24 20:54:04 +02:00
Max Kellermann
ac2e4e593d python/libs: upgrade Boost to 1.64 2017-04-24 20:43:04 +02:00
Max Kellermann
edaa7d7748 python/build/libs: upgrade CURL to 7.54.0 2017-04-24 20:42:28 +02:00
Max Kellermann
3cdf965fba python/build/libs: upgrade FFmpeg to 3.3 2017-04-24 20:41:08 +02:00
Max Kellermann
6b60d1e71f decoder/pcm: add missing nullptr check
Fixes a potential crash bug which is actually unreachable, because the
"pcm" plugin is never invoked when there is no (matching) MIME type.
2017-04-24 20:36:55 +02:00
Max Kellermann
d68772d45a util/{Foreign,Static}FifoBuffer: update API documentation 2017-04-24 20:19:14 +02:00
Max Kellermann
52cb425e33 util/StaticFifoBuffer: add method GetCapacity() 2017-04-24 20:18:44 +02:00
Max Kellermann
ed3220f37f util/{Foreign,Static}FifoBuffer: use C++11 initializers 2017-04-24 20:16:18 +02:00
Max Kellermann
043cbec68f INSTALL: merge into doc/user.xml 2017-04-24 20:07:52 +02:00
Max Kellermann
7d7217ef89 doc/user.xml: add sticker documentation 2017-04-24 20:07:38 +02:00
Max Kellermann
67c709170d doc/user.xml: add Zeroconf documentation 2017-04-24 19:54:25 +02:00
Max Kellermann
f6e428ac22 Merge branch 'v0.20.x' 2017-04-24 11:44:27 +02:00
Max Kellermann
45fbafae94 decoder/pcm: split variable "frame_size" in "in_*" and "out_*" 2017-04-24 11:32:52 +02:00
Max Kellermann
803b73a34b pcm/PcmPack: add pcm_unpack_24be() 2017-04-24 11:32:52 +02:00
Max Kellermann
7b7fb5acd5 decoder/pcm: fix potential assertion failure in FillBuffer()
After a seek failure, the buffer may still be full, and then
FillBuffer() aborts with assertion failure.
2017-04-24 11:20:37 +02:00
Max Kellermann
b1512201ab pcm/PcmPack: remove obsolete code comment 2017-04-22 09:52:10 +02:00
Max Kellermann
424e9cbc43 pcm/PcmPack: simplify unpack_sample() 2017-04-22 09:28:54 +02:00
Max Kellermann
95b62a843a Merge branch 'add-original-year-tag' of git://github.com/tremby/MPD 2017-04-21 18:55:34 +02:00
Bart Nagel
ccb4f44caf Add support for the OriginalDate tag
See https://picard.musicbrainz.org/docs/mappings/

This tag is useful when the user would like all releases of the same
album to be sorted next to each other.
2017-04-21 09:43:26 -07:00
Max Kellermann
c788c76dc9 output/Internal: add method IsBusy() 2017-04-18 23:15:46 +02:00
Max Kellermann
2e4e1c7f48 output/Control: drop "Output" prefix from file name 2017-04-18 22:36:48 +02:00
Bart Nagel
0a7d612f41 Remove some redundant code 2017-04-18 16:10:38 +02:00
Max Kellermann
38da76bbe0 util/ScopeExit: copy enabled tag in move constructor 2017-04-12 13:11:43 +02:00
martinarielhartmann
a13e045742 Update libs.py
upgrade zlib to 1.2.11
2017-04-11 13:31:34 +02:00
cotko
811620c0a0 Fix typo 2017-04-11 13:31:15 +02:00
Max Kellermann
504f5f7bdd storage/FileInfo, db/simple/Directory: use 64 bit for device/inode
An ino_t is usually a 64 bit integer, and some file systems (such as
Linux's kernel NFS client) really uses the upper 32 bit.  This can
lead to false positives in the directory loop detection in
FindAncestorLoop().  Increasing these two attributes (in
StorageFileInfo and Directory) to 64 bit adds little overhead, but
makes the check a lot safer.
2017-04-06 09:58:25 +02:00
Max Kellermann
f85d4d28d1 output/alsa: work around dmix non-blocking snd_pcm_drain() bug
See code comment.  Bug was reported against MPD, but it's really an
alsa-lib bug.

 https://bugs.musicpd.org/view.php?id=4662
2017-03-29 20:36:04 +02:00
Max Kellermann
b4e4bdcda9 lib/alsa/Version: wrapper for snd_asoundlib_version() 2017-03-29 20:33:06 +02:00
Max Kellermann
dae8b78569 output/httpd: copy the Page reference; fixes use-after-free 2017-03-29 20:17:09 +02:00
Max Kellermann
32bcad51b8 configure.ac: prepare for 0.20.7 2017-03-16 10:50:12 +01:00
Max Kellermann
e26d49efb7 Merge tag 'v0.20.6'
release v0.20.6
2017-03-10 17:02:32 +01:00
Max Kellermann
a40510c241 release v0.20.6 2017-03-10 16:57:59 +01:00
Max Kellermann
ac8dce6599 lib/curl/Request: "ICY 200 OK" is a response boundary header 2017-03-10 16:28:02 +01:00
Max Kellermann
190d525099 lib/curl/Request: move code to IsResponseBoundaryHeader() 2017-03-10 16:24:30 +01:00
Max Kellermann
1b6666fa39 Partition: handle SYNC_WITH_PLAYER before TAG_MODIFIED
The TAG_MODIFIED handler (i.e. playlist::TagModified()) works only if
the modified song is the current song - something that is not updated
until SYNC_WITH_PLAYER is finished.  This fixes tag updates right
after a new song is started.
2017-03-10 16:11:34 +01:00
Max Kellermann
1dd01c99e8 decoder/sidplay: make compatible with libsidplayfp < 1.8
https://bugs.musicpd.org/view.php?id=4665
2017-03-10 13:48:52 +01:00
Thomas Zander
d50b30a498 Add missing include for cstdlib, otherwise free() is undefined 2017-03-07 20:02:36 +01:00
Max Kellermann
42a3a87f13 util/HugeAllocator: paranoid check for sysconf()<0
Just in case.
2017-03-01 21:50:26 +01:00
Ben Boeckel
9dfedbe619 ReusableArray: fix build error on GCC7
GCC7 outputs the following error without this change:

    src/util/ReusableArray.hxx:61:35: error: no matching function for call to ‘swap(size_t&, const size_t&)’
       std::swap(capacity, src.capacity);

which can be resolved by just using an rvalue-reference rather than a
const rvalue-reference.

Signed-off-by: Ben Boeckel <mathstuf@gmail.com>
2017-03-01 19:38:41 +01:00
Max Kellermann
88957b4c9d android/build.py: build with libc++ instead of GNU libstdc++
Android is migrating away from GCC, and libstdc++ will disappear
eventually.
2017-03-01 17:31:26 +01:00
Max Kellermann
b2f2c9322b db/simple/Mount: workaround for libc++ 2017-03-01 17:31:26 +01:00
Max Kellermann
3be2051808 decoder/Thread: check ENABLE_FFMPEG, not HAVE_FFMPEG
This repairs the damage to commit 74dbaade6f done by commit
b3f5b4932c
2017-03-01 17:06:23 +01:00
Max Kellermann
ff32b0dc9b input/curl: use %lu instead of %llu
Fixes a GCC warning because %llu appears to be unsupported by the
Windows standard library.
2017-03-01 16:44:11 +01:00
Max Kellermann
c1869a11af input/curl: format Range offset as unsigned 2017-03-01 16:44:08 +01:00
Max Kellermann
e22a4fdba4 command/Error: improve libstdc++ 4.9.x detection for std::rethrow_if_nested() workaround 2017-03-01 16:38:22 +01:00
Max Kellermann
29a7b2c5b5 decoder/mpcdec: ignore empty frames
https://bugs.musicpd.org/view.php?id=4656 describes a crash due to
division by zero because frame.samples==0.  This should never happen,
but apparently can happen after seeking.  The best we can do is to
just ignore this frame.
2017-03-01 16:13:21 +01:00
Max Kellermann
3b6c285c2a configure.ac: prepare for 0.20.6 2017-03-01 16:13:21 +01:00
Max Kellermann
e9e853b19a command/Partition: add command "partition" to switch to another partition 2017-02-25 10:26:33 +01:00
Max Kellermann
e48ea5f23a Instance: add method FindPartition() 2017-02-25 10:26:33 +01:00
Max Kellermann
a99bab935a Client: add method SetPartition() 2017-02-25 10:25:16 +01:00
Max Kellermann
3eee35e1f7 Client: convert partition to pointer
Prepare to make it mutable.
2017-02-25 10:23:23 +01:00
Max Kellermann
c7396b0675 Client: add method GetPartition(), make partition private 2017-02-25 10:20:09 +01:00
Max Kellermann
e3ee60e7af command/storage: use Instance::EmitIdle()
These events are relevant for all partitions.
2017-02-25 10:20:07 +01:00
Max Kellermann
05b8ddac4c Client: add method GetInstance() 2017-02-25 10:20:05 +01:00
Max Kellermann
668724de4e Client: replace playlist and player_control with getter methods
Prepare to convert "partition" to a mutable pointer.
2017-02-25 09:24:19 +01:00
Max Kellermann
71ce1a25dd SongPrint: remove Storage::MapToRelativeUTF8() call
This code (added 7 years ago with commit b233c145f) has been obsoleted
by the SongLoader class (added 3 years ago).
2017-02-24 13:56:13 +01:00
Max Kellermann
cd522f524d fs/Traits: allow base to end with a slash in Relative()
Fixes false negatives:

 http://foo/dav/example.ogg mismatches http://foo/dav/

.. because StringAfterPrefix() returns just "example.ogg", without
trailing slash (it existed, but was eaten already by the base
matcher).
2017-02-24 13:50:29 +01:00
Max Kellermann
ca559b1db6 input/curl: use %lu instead of %llu
Fixes a GCC warning because %llu appears to be unsupported by the
Windows standard library.
2017-02-21 12:06:56 +01:00
Max Kellermann
a8e76fb345 input/curl: format Range offset as unsigned 2017-02-21 12:06:03 +01:00
Max Kellermann
1d445d1039 SongPrint: move duplicate code into PrintRange() 2017-02-20 22:00:11 +01:00
Max Kellermann
29d03ab937 Merge tag 'v0.20.5'
release v0.20.5
2017-02-20 21:59:40 +01:00
Max Kellermann
575d1786af release v0.20.5 2017-02-20 21:51:31 +01:00
Max Kellermann
bc1c927952 util/TimeFormat: suppress -Wunused on Windows 2017-02-20 21:44:01 +01:00
Max Kellermann
f95bc85f91 python/build/libs: upgrade FFmpeg to 3.2.4 2017-02-20 21:13:43 +01:00
Max Kellermann
4015195314 doc/user: instructions to compile the Windows binary 2017-02-20 21:06:43 +01:00
Max Kellermann
c3d883c6cb win32/build.py: default to x64 build 2017-02-20 21:06:43 +01:00
Max Kellermann
097e30321b win32/build.py: add option --32 2017-02-20 21:06:31 +01:00
Max Kellermann
b6ddeaacf2 win32/build.py: convert argument parser to loop
Allow multiple arguments.
2017-02-20 21:06:21 +01:00
Max Kellermann
b0c60ec124 win32/build.py: add variable "x64", assign host_arch later 2017-02-20 21:04:34 +01:00
François Revol
46aa4d2f91 haiku: fix build
Some missing bits when converted to C++ exceptions...
2017-02-20 11:25:00 +01:00
Max Kellermann
d0b4bd08e1 doc/protocol.xml: idle "output" may indicate outputs have been added or removed
Preparing the protocol spec for multi-player support.
2017-02-19 20:50:09 +01:00
Max Kellermann
512e81c629 output/httpd: use emplace() instead of push() 2017-02-19 20:48:17 +01:00
Max Kellermann
452666f742 output/httpd: wake up the I/O thread only if pages have been read from encoder 2017-02-19 20:46:20 +01:00
Max Kellermann
72008d951b output/httpd: no mutex lock while reading data from encoder 2017-02-19 20:45:16 +01:00
Max Kellermann
72146e7800 output/httpd: use std::lock_guard 2017-02-19 20:43:45 +01:00
Max Kellermann
f7af1bb8e2 output/httpd: cancel the DeferredMonitor in Close() 2017-02-19 20:41:34 +01:00
Max Kellermann
f88f1fca3f output/httpd: move Close() lock into the I/O thread
Fixes a potential deadlock introduced by commit 945287358b
2017-02-19 20:41:06 +01:00
Max Kellermann
26e4a40cc7 output/httpd/Page: use std::shared_ptr instead of class RefCount 2017-02-19 20:17:57 +01:00
Max Kellermann
8b1931072a output/httpd/Page: no variable size, use AllocatedArray
Using variable-size objects is not worth the trouble here.  Let's drop
this and use existing and simpler code.
2017-02-19 20:13:41 +01:00
Max Kellermann
45e15b6cc6 output/httpd/Page: make all attributes private 2017-02-19 20:13:35 +01:00
Max Kellermann
be7e52c882 output/httpd/Page: remove unused method Concat() 2017-02-19 20:13:19 +01:00
Max Kellermann
4162ce0bc5 output/httpd/Page: use uint8_t instead of unsigned char 2017-02-19 19:49:53 +01:00
Max Kellermann
7e46277016 Merge branch 'v0.20.x' 2017-02-19 19:46:18 +01:00
Max Kellermann
f3b788703e tag/Handler: improve snprintf() return value check 2017-02-19 19:34:13 +01:00
Max Kellermann
4bb83781e8 output/httpd/IcyMetaDataServer: cast length to unsigned
Fixes another buffer overflow: if the stream has a very long title or
URL, resulting in a metadata string of more than 2 kB, icy_string[0]
is a negative value, which gets casted to size_t - ouch!

 https://bugs.musicpd.org/view.php?id=4652
2017-02-19 19:28:52 +01:00
Max Kellermann
a73195b7cc output/httpd/IcyMetaDataServer: pad the string with 15 spaces
Fixes a buffer overflow due to the bad formula rounding the buffer
size up.  At the same time, remove the "+1" from the meta_length
calculation, which takes the padding into account and at the same time
implements proper rounding.
2017-02-19 19:27:37 +01:00
Max Kellermann
1bd00b8a9a output/httpd/IcyMetaDataServer: remove the int cast
Why did this cast exist??
2017-02-19 19:27:37 +01:00
Max Kellermann
d84eaeafc5 doc/include/tags.xml: clarify that track/disc are decimal 2017-02-18 19:01:04 +01:00
Max Kellermann
3b84b99804 IdleFlags: add a "partition" event 2017-02-17 23:59:06 +01:00
Max Kellermann
1786f9b1bb command/Partition: add command "newpartition" 2017-02-17 23:53:49 +01:00
Max Kellermann
1e972174a6 output/MultipleOutputs: add method AddNullOutput() 2017-02-17 23:53:49 +01:00
Max Kellermann
77178e0590 Instance: make "partition" a std::list
With this commit, multi-player support becomes possible... it's just
not wired to the frontend yet.

This is based on massive amounts of refactoring work I did over the
past 9 years.
2017-02-17 23:22:29 +01:00
Max Kellermann
9a909d9f27 Instance: un-inline the constructor 2017-02-17 23:22:05 +01:00
Max Kellermann
90d25a40a0 Instance: use C++11 initializer 2017-02-17 23:21:55 +01:00
Max Kellermann
c335f18be7 Partition: add "name" attribute 2017-02-17 23:18:51 +01:00
Max Kellermann
7dc3e73782 command: add command "listpartitions"
The first step to multi-player support.  Not much, just a dummy
command.
2017-02-17 23:07:31 +01:00
Max Kellermann
47dffe66aa output/alsa: fix race condition on early snd_pcm_writei() error
During UnlockActivate() while the mutex is unlocked, the IOThread can
set a new error condition, and will never again wake up the
OutputThread.  This race condition can cause a deadlock in the
OutputThread.
2017-02-15 11:23:44 +01:00
Max Kellermann
6636c69a11 storage/FileInfo: convert mtime to std::chrono::system_clock::time_point 2017-02-11 23:45:15 +01:00
Max Kellermann
0ccaf4a1ff storage/FileInfo: add initializing constructor 2017-02-11 23:45:14 +01:00
Max Kellermann
5cdbad7937 db/simple/Directory: make parent and path const 2017-02-11 23:45:14 +01:00
Max Kellermann
fc0508c047 db/simple/Directory: use C++11 initializers 2017-02-11 23:45:14 +01:00
Max Kellermann
78ca5491e6 db/Interface: GetUpdateStamp() returns std::chrono::system_clock::time_point 2017-02-11 23:02:17 +01:00
Max Kellermann
4146475c73 util/ChronoUtil: new utility library for std::chrono 2017-02-11 22:23:33 +01:00
Max Kellermann
329c3ab21b fs/FileInfo: use std::chrono::system_clock 2017-02-10 23:48:21 +01:00
Max Kellermann
3b7f6641d2 TimePrint: std::chrono::system_clock support 2017-02-10 23:48:21 +01:00
Max Kellermann
781487c4dd thread/Thread: use BoundMethod 2017-02-10 22:46:09 +01:00
Max Kellermann
5ba5bc8ba1 thread/Thread: move code to Run() 2017-02-10 22:43:55 +01:00
Max Kellermann
82c66ce078 thread/Thread: Start() returns void
Since we switched to C++ exceptions, there is no code path which
returns false.
2017-02-10 22:41:29 +01:00
Max Kellermann
9324fbf921 event/Thread: remove the Mutex
We don't need to access Thread::handle early inside the EventThread,
so we don't need this trick anymore.
2017-02-10 22:29:31 +01:00
Max Kellermann
5e081de14a IOThread: move EventThread instance into struct Instance
Eliminate global variables.
2017-02-10 22:25:06 +01:00
Max Kellermann
d1456ae039 test/*: use class EventThread instead of ScopeIOThread 2017-02-10 22:25:01 +01:00
Max Kellermann
115af4f565 event/Loop: Break() is no-op if "quit" is already set 2017-02-10 22:24:48 +01:00
Max Kellermann
822724d1aa event/Thread: auto-stop in the destructor 2017-02-10 22:24:46 +01:00
Max Kellermann
87c9856b20 input/alsa: use the EventLoop& passed to init() instead of io_thread_get() 2017-02-10 22:24:44 +01:00
Max Kellermann
835136dcd3 output/Thread: add assertion on the ao_plugin_play() result 2017-02-10 22:24:36 +01:00
Max Kellermann
4a80e9cb25 output/alsa: copy the PcmExport result to the ring_buffer
.. and not the input data.

Regression from commit b1c7649edb (integer underflow).

 https://bugs.musicpd.org/view.php?id=4639
2017-02-10 22:23:00 +01:00
Max Kellermann
de80c270bd IOThread: move code to class EventThread 2017-02-10 21:40:39 +01:00
Max Kellermann
b92bff2658 IOThread: remove unused function io_thread_inside() 2017-02-10 21:40:30 +01:00
Max Kellermann
42f1e26540 IOThread: remove unused Cond variable 2017-02-10 21:29:54 +01:00
Max Kellermann
cfd056231b output/alsa: use the EventLoop& parameter instead of io_thread_get() 2017-02-10 21:21:15 +01:00
Max Kellermann
20ae84bff9 {input,mixer}/alsa: cancel the DeferredMonitor in the destructor
Yet another potential crash bug fix.
2017-02-10 15:05:49 +01:00
Max Kellermann
b1c7649edb output/alsa: non-blocking mode
Use SND_PCM_NONBLOCK, and perform all snd_pcm_writei() calls in the
IOThread.  Use a lockless queue to copy data from the OutputThread to
the IOThread.

This rather major change aims to improve MPD's internal latency.  All
waits are now under MPD's control, instead of blocking inside
libasound2.

As a side effect, an output's filter is now decoupled from the actual
device I/O, which solves a major latency problem with the conversion
filter on slow CPUs and small period buffers.  See:

 https://bugs.musicpd.org/view.php?id=3900
2017-02-09 21:36:18 +01:00
Max Kellermann
853740f1e2 Main: use the IOThread for outputs and mixers
The main EventLoop can block for a long time while a client's command
runs, and is therefore inappropriate for internal engine I/O.  This
fixes a serious regression for at least the "httpd" output, which used
to be hard-coded for the IOThread, but now receives the main EventLoop
as an initialization parameter.

For the mixers, this doesn't make much of a difference.  They are not
latency critical.
2017-02-09 21:33:49 +01:00
Max Kellermann
14986b153a event/Loop: use std::lock_guard 2017-02-09 21:26:55 +01:00
Max Kellermann
9e503b21c1 {input,mixer}/alsa: move code to lib/alsa/NonBlock.cxx 2017-02-09 21:24:24 +01:00
Max Kellermann
67a958a326 Merge branch 'v0.20.x' 2017-02-09 21:24:20 +01:00
Max Kellermann
7372c931b3 event/Loop: make IsInsideOrNull() available in the NDEBUG build
Fixes build breakage by commit 4e5271fcdf7; and this method does make
sense in non-debug builds.
2017-02-09 21:21:49 +01:00
Max Kellermann
29e1b6e465 mixer/alsa: reset the MultiSocketMonitor in the destructor
Fixes potential crash bug.
2017-02-09 21:13:19 +01:00
Max Kellermann
eda06993f8 event/MultiSocketMonitor: add method Reset() 2017-02-09 21:12:23 +01:00
Max Kellermann
4b30ef1cf2 event/MultiSocketMonitor: use C++11 initializer 2017-02-09 21:12:23 +01:00
Max Kellermann
e92e5e8eb8 event/MultiSocketMonitor: more API documentation
Now ClearSocketList() may only be called from PrepareSockets().
Calling it before destroying the object doesn't work properly, because
it doesn't unregister the TimeoutMonitor and the IdleMonitor.  Some of
its callers need to be fixed.
2017-02-09 21:12:23 +01:00
Max Kellermann
4e5271fcdf event/Call: allow usage during shutdown
Change EventLoop::IsInside() call to EventLoop::IsInsideOrNull().
This means that BlockingCall() may be used during shutdown, after the
main EventLoop::Run() has finished.  This is important because mixers
are currently registered in the main EventLoop.
2017-02-09 21:12:23 +01:00
Max Kellermann
3c55487a16 configure.ac: don't require libsidutils when building with libsidplayfp
The libsidplayfp fork has merged libsidutils into the main library.
The libsidutils we used to link with was part of the original
libsidplay project.
2017-02-09 13:09:03 +01:00
Max Kellermann
76a1cae5d8 {input,mixer}/alsa: fix off-by-one bug in count check
Doesn't make a practical difference - but it's more correct this way.
2017-02-09 12:46:49 +01:00
Max Kellermann
3850716522 command/Database: add "sort" parameter to "find" and "search"
Implement the second part of https://bugs.musicpd.org/view.php?id=3990
2017-02-08 11:22:08 +01:00
Max Kellermann
1e0a60e73d doc/protocol: remove UTF-8 explanation
These days, this is common knowledge, and doesn't need a lengthy
explanation.
2017-02-08 11:22:08 +01:00
Max Kellermann
e9c99e0518 DetachedSong: add LightSong cast operator 2017-02-08 10:38:25 +01:00
Max Kellermann
332baa4f67 DetachedSong: don't declare empty destructor
An explicit destructor prevents usage of implicit move operators, even
if it's empty.  Therefore, declaring a defaulted destructor with GCC
attribute "noinline" does what we want without preventing those
implicit operators.
2017-02-08 10:24:45 +01:00
Max Kellermann
08879d2a20 DetachedSong: add move operator 2017-02-08 10:24:40 +01:00
Max Kellermann
1292af4768 Revert "DetachedSong: remove explicitly-defaulted copy/move constructors"
This reverts commit 67b7d46432.

Turns out I was wrong, and mentioning these does make a difference:
the implicit move constructor is not defined in the presence of a
user-declared destructor.
2017-02-08 10:21:35 +01:00
Max Kellermann
4d88a099f9 Compiler.h: add gcc_noinline 2017-02-08 10:17:21 +01:00
Max Kellermann
777e15bd78 db/DatabaseSong: make the Storage optional
Some database plugins don't use a Storage (e.g. UPnP), and with this
plugin, DatabaseDetachSong() can crash.
2017-02-08 10:05:55 +01:00
Max Kellermann
f689e28958 SongLoader: return instance, not pointer 2017-02-08 10:02:08 +01:00
Max Kellermann
d184231169 db/DatabaseSong: DatabaseDetachSong(uri) returns instance, not pointer 2017-02-08 09:59:12 +01:00
Max Kellermann
7225e919fc db/DatabaseSong: use AtScopeExit() 2017-02-08 09:58:40 +01:00
Max Kellermann
7a185f1ead queue/PlaylistUpdate: assert Database::GetSong()!=nullptr 2017-02-08 09:53:14 +01:00
Max Kellermann
c1fa5279f4 db/Interface: clarify GetSong() error handling 2017-02-08 09:50:30 +01:00
Max Kellermann
4f0fe66f69 DetachedSong: make the LightSong constructor public
Sometimes, it's useful to construct a DetachedSong from a LightSong
even without having real_uri initialized.
2017-02-08 09:45:37 +01:00
Max Kellermann
76380b2b45 DetachedSong: pass std::string&& to uri initializer
Eliminate one temporary allocation.
2017-02-08 09:42:09 +01:00
Max Kellermann
67b7d46432 DetachedSong: remove explicitly-defaulted copy/move constructors
Mentioning these doesn't make a difference.
2017-02-08 09:40:29 +01:00
Max Kellermann
29453ba196 client: add tag_mask attribute
The "tagtypes" command now has several sub commands which can be used
to edit that mask.
2017-02-08 09:06:11 +01:00
Max Kellermann
599d77643b client/Response: add method GetClient() 2017-02-08 09:06:11 +01:00
Max Kellermann
09d87d5ef1 command/Other: move some functions to ClientCommands.cxx
handle_tagtypes() is also being moved to ClientCommands.cxx, because
that command will be extended to access client-specific settings.
2017-02-08 09:06:11 +01:00
Max Kellermann
2f3f075e4f tag/Mask: wrap in class 2017-02-08 09:04:45 +01:00
Max Kellermann
17097d96b7 db/{Count,Print}: use tag_print(), eliminate duplicate code 2017-02-08 09:04:41 +01:00
Max Kellermann
a3e28c2d1a tag/Tag: move tag_name_parse() to ParseName.cxx 2017-02-08 08:57:22 +01:00
Max Kellermann
03a97d87ea tag/Tag*: rename several source files 2017-02-08 08:49:42 +01:00
Max Kellermann
8cbf099054 tag/Id3Load: update API documentation 2017-02-08 08:48:44 +01:00
Max Kellermann
c287452255 configure.ac: increment protocol version 2017-02-08 08:45:40 +01:00
Max Kellermann
07ce915c66 Merge branch 'v0.20.x' 2017-02-08 08:45:24 +01:00
Max Kellermann
81a97315e3 NEWS: mention ID3 memory leak fix 2017-02-08 08:44:47 +01:00
Max Kellermann
53c14d97a6 lib/nfs/FileReader: remove debug line 2017-02-08 08:43:56 +01:00
Max Kellermann
69a82eec17 tag/TagId3: use AtScopeExit() for exception-safety 2017-02-06 23:32:07 +01:00
Max Kellermann
45cadef22f configure.ac: prepare for 0.20.5 2017-02-06 23:28:36 +01:00
Max Kellermann
73f58c57e8 storage/curl: use CURLOPT_POSTFIELDS instead of CURLOPT_READFUNCTION 2017-02-06 23:25:03 +01:00
Max Kellermann
43348a3e13 decoder/Control: improve locking in Start() and Seek()
Previously, both methods accessed a lot of attributes which require
mutex protection.
2017-02-05 13:37:20 +01:00
Max Kellermann
e716b1f4d7 Client: remove redundant "virtual" keywords 2017-02-03 22:27:11 +01:00
Max Kellermann
82e74a4ebd Client: make client_vprintf() static 2017-02-03 20:47:41 +01:00
Max Kellermann
16b260e371 Client: eliminate client_puts(), use Client::Write() instead 2017-02-03 20:46:53 +01:00
Max Kellermann
3102e05da4 Client: make attributes "uid" and "num" const 2017-02-03 20:41:31 +01:00
Max Kellermann
df4af2b550 Merge tag 'v0.20.4'
release v0.20.4
2017-02-01 22:05:33 +01:00
Max Kellermann
0a033fb10a release v0.20.4 2017-02-01 21:59:36 +01:00
Max Kellermann
591afa0647 lib/nfs/Connection: detect socket hangup and unregister from epoll
Fixes race condition when epoll_ctl() gets called after the socket has
been closed, which may affect a different socket created by another
thread meanwhile.
2017-02-01 21:44:20 +01:00
Max Kellermann
05eac20ffe lib/nfs/Connection: detect libnfs reconnect
When rpc_reconnect_requeue() gets called from inside nfs_service(),
the NfsInputStream can stall completely because the old socket has
been unregistered from epoll automatically, but the new one has never
been registered.  Therefore, nfs_service() will never be called again.

This kludge attempts to detect this condition by checking
nfs_which_events()==POLLOUT.

https://bugs.musicpd.org/view.php?id=4081
2017-02-01 21:36:58 +01:00
Max Kellermann
38d263ac19 output/sndio: work around a libroar C++ incompatibility
Same as in commit e02d8ad8d2, but this time for the sndio plugin
which can be emulated by libroar.
2017-02-01 19:53:23 +01:00
Thomas Zander
f71c204eef Correct method types to match Interface.hxx 2017-01-31 21:22:02 +01:00
Thomas Zander
51147203be free() require cstdlib to be included 2017-01-31 21:21:37 +01:00
Max Kellermann
a931686317 pcm/SampleFormat: workaround for GCC 4.9 "constexpr" bug
GCC 4.9 has incomplete C++14 support.  Specifically, it doesn't allow
switch/case in "constexpr" functions.
2017-01-27 11:02:58 +01:00
Max Kellermann
5bd322bdcf python/libs: upgrade Opus to 1.1.4 2017-01-27 08:47:58 +01:00
Max Kellermann
bb097109f0 configure.ac: prepare for 0.20.4 2017-01-27 08:47:36 +01:00
Max Kellermann
97132e3d38 configure.ac: use MPD_DEPENDS for upnp->expat dependency 2017-01-26 10:22:37 +01:00
Max Kellermann
5ad1fe77b1 m4/mpd_depends.m4: print warning when disabling the feature 2017-01-26 09:58:34 +01:00
Max Kellermann
8d4ed1e988 m4/mpd_depends.m4: add documentation 2017-01-26 09:45:25 +01:00
Max Kellermann
add953fb6e lib/curl/Global: decouple from the IOThread library 2017-01-26 09:29:49 +01:00
Max Kellermann
3854211694 input/Plugin: pass EventLoop& to init()
Eliminate dependency on io_thread_get().
2017-01-26 09:26:25 +01:00
Max Kellermann
58ac72f79d input/nfs: use NfsFileReader::GetEventLoop() 2017-01-26 09:25:56 +01:00
Max Kellermann
6d5904801e lib/nfs/FileReader: use nfs_get_event_loop()
Make sure we're using the same EventLoop as the NfsManager.
2017-01-26 09:23:49 +01:00
Max Kellermann
d4993c405e lib/nfs/Glue: add EventLoop& accessor 2017-01-26 09:23:25 +01:00
Max Kellermann
7af8e3937f lib/nfs/FileReader: use C++11 initializers 2017-01-26 09:21:57 +01:00
Max Kellermann
f8eeded528 input/async: pass EventLoop& to constructor 2017-01-25 23:18:33 +01:00
Max Kellermann
c3fa7e13cf input/Plugin: include cleanup 2017-01-25 23:18:17 +01:00
Max Kellermann
5c18b0a94d input/curl: use CurlGlobal::GetEventLoop() 2017-01-25 23:16:56 +01:00
Max Kellermann
ecbad638f1 input/async: add method GetEventLoop() 2017-01-25 23:15:52 +01:00
Max Kellermann
611ce6e756 lib/nfs/{FileReader,Glue}: pass EventLoop&
Eliminate dependency on io_thread_get().
2017-01-25 23:02:02 +01:00
Max Kellermann
4140e9b857 IOThread: make io_thread_run() static 2017-01-25 23:00:31 +01:00
Max Kellermann
8fd9d91974 output/Plugin: pass EventLoop& to init()
Eliminate dependency on io_thread_get().
2017-01-25 22:54:41 +01:00
Max Kellermann
d3f35dab1e output/ao: convert to class, make attributes private 2017-01-25 10:46:09 +01:00
Max Kellermann
487e2618cd output/ao: use AudioOutputWrapper 2017-01-25 10:45:20 +01:00
Max Kellermann
30d5186db4 output/ao: use const_cast instead of the union hack 2017-01-25 10:44:19 +01:00
Max Kellermann
cbe59714d4 output/solaris: convert to class, make attributes private 2017-01-25 10:33:38 +01:00
Max Kellermann
704a28ca17 output/solaris: use AudioOutputWrapper 2017-01-25 10:29:42 +01:00
Max Kellermann
8d70d10aba output/httpd: use AudioOutputWrapper 2017-01-25 10:05:08 +01:00
Max Kellermann
ddd8b16f2b output/roar: use AudioOutputWrapper::Init() 2017-01-25 10:05:08 +01:00
Max Kellermann
b79ce77ec5 output/Wrapper: add missing include 2017-01-25 10:05:08 +01:00
Max Kellermann
fead4bbfd9 output/Plugin: convert pointers to references 2017-01-25 09:48:59 +01:00
Max Kellermann
872ecc1aed configure.ac: prepare for 0.21 2017-01-25 08:58:07 +01:00
Max Kellermann
2ab6c40ff1 release v0.20.3 2017-01-25 08:53:16 +01:00
Max Kellermann
68bb738af2 input/alsa: use snd_pcm_?w_params_alloca() 2017-01-25 08:47:20 +01:00
Max Kellermann
6b968beede output/alsa: convert to class, make attributes private 2017-01-24 23:08:16 +01:00
Max Kellermann
f68dd1bffb output/alsa: make AlsaSetup() an AlsaOutput method 2017-01-24 23:06:33 +01:00
Max Kellermann
f92b71ca99 output/alsa: move code from AlsaSetup() to AlsaSetupSw() 2017-01-24 23:05:29 +01:00
Max Kellermann
2b79fe2d6a output/alsa: move code from AlsaSetup() to AlsaSetupHw() 2017-01-24 22:48:48 +01:00
Max Kellermann
44dd9af276 lib/upnp/Util: pass single delimiter character to stringToTokens() 2017-01-23 19:34:55 +01:00
Max Kellermann
d3013d4f8c lib/upnp/Util: remove parameter "skipinit", always true 2017-01-23 19:28:07 +01:00
Max Kellermann
678524ad21 lib/upnp/WorkQueue: fix race condition
With "ok==false", newly created threads may quit instantly.
2017-01-23 19:25:30 +01:00
Max Kellermann
32a64481f2 lib/upnp: fix bad std::chrono cast
libupnp provides seconds, not whatever time unit is used by
std::chrono::steady_clock.
2017-01-23 19:16:14 +01:00
Max Kellermann
1776015c6c db/simple: drop redundant "virtual" 2017-01-23 18:57:23 +01:00
Max Kellermann
f1c71a26e3 db/proxy: drop redundant "virtual" 2017-01-23 18:56:45 +01:00
Max Kellermann
e78ab767d3 db/proxy: make connect errors during startup non-fatal 2017-01-23 18:55:40 +01:00
Max Kellermann
f01eb2f95d db/proxy: improve Connect() error message 2017-01-23 18:55:18 +01:00
Max Kellermann
1450e45d97 Main, db/Glue: improve error messages 2017-01-23 18:52:16 +01:00
Max Kellermann
ec8cba369c lib/upnp/WorkQueue: disallow copying 2017-01-23 18:35:58 +01:00
Max Kellermann
f4c248f406 lib/upnp/WorkQueue: make constructor explicit 2017-01-23 18:35:47 +01:00
Max Kellermann
f3b2a58646 lib/upnp/WorkQueue: use C++11 initializers 2017-01-23 18:35:22 +01:00
Max Kellermann
c6f89c42b2 db/proxy: make the base class of LibmpdclientError public
If the base class is not accessible, the "catching" the base class
won't work.  This caused the fatal error:

 terminate called after throwing an instance of 'LibmpdclientError'
2017-01-23 18:28:40 +01:00
Max Kellermann
5e93cfdd9e output/Source: reset the ReplayGain serials ion OpenFilter()
Each close/open cycle resets the Filter's state, because a new Filter
instance is being created.  That results in the serials
(replay_gain_serial and other_replay_gain_serial) being out of sync
with the internal ReplayGainFilter state.

So instead of initializing those serials once, we need to initialize
them each time we create new ReplayGainFilter instances, i.e. in
OpenFilter().

 https://bugs.musicpd.org/view.php?id=4632
2017-01-23 17:55:04 +01:00
Max Kellermann
d91d5a3ab5 playlist/SoundCloud: eliminate unnecessary casted variable 2017-01-20 17:16:11 +01:00
Max Kellermann
907c045f33 doc/user: add missing playlist plugins 2017-01-20 17:09:19 +01:00
Max Kellermann
90f189eb54 doc/user: mention which commands are available with playlist plugins 2017-01-20 16:59:07 +01:00
Florian Schlichting
4abd5b2112 doc/user: document effect of http_proxy envvar on curl plugin 2017-01-20 16:52:02 +01:00
Max Kellermann
df9a665994 pcm/Traits: add "SILENCE" attribute 2017-01-20 15:57:09 +01:00
Max Kellermann
7a098ca0ed pcm/Traits: add specialization for SampleFormat::DSD 2017-01-20 15:48:30 +01:00
Max Kellermann
33716732a1 pcm/PcmChannels: silence surround channels when converting from stereo
Previously, there was no special code to convert stereo to
multi-channel.  The generic solution for this was to convert to mono,
and then copy the result to all channels.  That's a pretty bad
solution, but at least something which always renders audio.  MPD does
something, instead of failing.

Now that MPD has proper support for multi-channel (by defining the
channel order), we can do better than that.  It is a (somewhat) common
case to play back stereo music on a DAC which can only do
multi-channel.  The best approach here is to copy the stereo channels
to front-left and front-right, and apply the "silence" pattern to all
other channels.
2017-01-19 10:53:41 +01:00
Max Kellermann
97ae594375 DetachedSong: use C++11 initializers 2017-01-18 13:13:36 +01:00
Max Kellermann
3f321ae9a0 pcm/SampleFormat: make the two inline functions "constexpr" 2017-01-17 22:52:09 +01:00
Max Kellermann
161d32a7e7 AudioFormat: update ToString() API documentatio 2017-01-17 22:48:34 +01:00
Max Kellermann
d7137586a9 Audio{Format,Parser}: use shortcuts such as "dsd64" in log messages 2017-01-17 22:42:23 +01:00
Max Kellermann
cd0c06ba6e doc/protocol: refer to user manual for status/audio 2017-01-17 22:42:23 +01:00
Max Kellermann
899ab63d91 doc/user: document the "dsd" sample format 2017-01-17 22:36:44 +01:00
Max Kellermann
1097820a5a doc/user: add <replaceable> element 2017-01-17 22:36:44 +01:00
Max Kellermann
39114f91a7 AudioFormat: replace struct audio_format_string with class StringBuffer, return it 2017-01-17 22:18:21 +01:00
Max Kellermann
4f01387edf util/StringBuffer: new utility class 2017-01-17 22:03:42 +01:00
Max Kellermann
de3e0585f1 AudioFormat: move enum SampleFormat to pcm/SampleFormat.hxx 2017-01-17 22:01:01 +01:00
Max Kellermann
f85f25ba82 test: add AudioFormat unit test 2017-01-17 12:02:41 +01:00
Max Kellermann
10a2c179f9 Makefile.am: move AudioFormat.cxx to libpcm.a 2017-01-17 12:01:49 +01:00
Max Kellermann
6eea56861b AUTHORS, ...: update my email address 2017-01-17 11:54:55 +01:00
Jörg Krause
21fd2064ae Makefile.am: fix linking xiph with ogg
The internal static xiph library needs to link with libogg. Otherwise
building mpd will fail:

```
/mips-linux-gnu/bin/ld: libxiph.a(libxiph_a-OggVisitor.o): undefined
reference to symbol 'ogg_stream_packetout'
```

Signed-off-by: Jörg Krause <joerg.krause@embedded.rocks>
2017-01-17 11:24:20 +01:00
Max Kellermann
dcbab8e37a PlaylistFile: "playlistadd" creates new playlist if it does not exist, as documented 2017-01-16 20:55:19 +01:00
Max Kellermann
5677278251 CommandLine: update copyright year 2017-01-16 12:04:04 +01:00
Max Kellermann
a83bee993d configure.ac: prepare for 0.20.3 2017-01-16 12:03:22 +01:00
Max Kellermann
96a31f554a release v0.20.2 2017-01-15 01:28:00 +01:00
Max Kellermann
d14ec6aea5 output/Thread: reconfigure ConvertFilter for its new input AudioFormat
If the input AudioFormat changes but the out_audio_format doesn't
change (e.g. because there is a fixed "format" setting in this
"audio_output" section), the ConvertFilter needs to be reconfigured.
This didn't happen, resulting in awful static noise after changing
songs.
2017-01-15 01:24:17 +01:00
Max Kellermann
917cedf893 output/Thread: move AudioFormat logging code around 2017-01-15 01:23:49 +01:00
Max Kellermann
193dd71600 output/Thread: remember the original filter audio format in local variable 2017-01-15 01:21:14 +01:00
Max Kellermann
6c293a3d7f lib/nfs: add more API documentation 2017-01-15 00:58:49 +01:00
Max Kellermann
e847ddf011 DetachedSong: compare start_time and end_time in IsSame()
This method is used by DecoderControl::IsCurrentSong(), which is used
by the player thread to check whether the current decoder instance can
be reused to seek.  When switching to another song in the same CUE
sheet, previously DetachedSong::IsSame() returned true, and thus the
old decoder instance was used for the new song, not considering the
new end_time.  This led to the old decoder quickly quitting.
2017-01-15 00:54:25 +01:00
Max Kellermann
7e8b448985 input/alsa: set period_size=buffer_size/4
This way, we have four periods instead of the default of two.  With
only two periods, we don't get woken up often enough, and we
frequently encounter buffer overruns.  With four periods, we have more
time to breathe, and the buffer overruns magically disappear.
2017-01-14 21:50:28 +01:00
Max Kellermann
d1f3a87c08 input/alsa: remove the start_threshold setting
This setting is mostly useless for capture devices.  There's no point
in configuring it.
2017-01-14 21:47:37 +01:00
Max Kellermann
9f8145e590 input/alsa: dump buffer/period sizes 2017-01-14 21:09:57 +01:00
Steven O'Brien
791efc171a input/alsa: enable non-blocking mode 2017-01-14 20:59:57 +01:00
Steven O'Brien
144312a525 input/alsa: handle EAGAIN 2017-01-14 20:59:23 +01:00
Max Kellermann
92684112ed input/alsa: call snd_pcm_start() after snd_pcm_prepare()
This is necessary because we'll never get woken up again by
epoll_wait() after a buffer overrun recovery, unless we start the PCM
explicitly before returning to the I/O loop.
2017-01-14 20:58:30 +01:00
Max Kellermann
ef114ee6cb input/alsa: improve logging in Recover()
Copy yet more code from the ALSA output plugin.
2017-01-14 20:52:41 +01:00
Max Kellermann
667f209742 input/alsa: check snd_pcm_state() in Recover()
Copy some good code from the ALSA output plugin.
2017-01-14 20:51:51 +01:00
Max Kellermann
4ad0747c78 output/alsa: explicitly mention all snd_pcm_state() enums
I want a compiler warning when a new state needs to be considered
here.
2017-01-14 20:49:15 +01:00
Max Kellermann
c5cf66402c input/alsa: make two attributes "const" 2017-01-13 20:26:36 +01:00
Max Kellermann
05417049eb input/alsa: clear sockets from within IOThread
Fixes assertion failure in implicit destructor.
2017-01-13 20:17:16 +01:00
Max Kellermann
c7b0c46d9f output/recorder: fix typo in variable name
Fixes the dreaded error "Failed to create : No such file or
directory".

 https://bugs.musicpd.org/view.php?id=4625
2017-01-12 21:36:32 +01:00
Max Kellermann
df578c91ad output/alsa: log DoP mode 2017-01-11 22:50:40 +01:00
Max Kellermann
70008c47c9 output/alsa: support DSD_U16 2017-01-11 22:47:21 +01:00
Max Kellermann
938affef32 pcm/export: support DSD_U16 2017-01-11 22:47:12 +01:00
Max Kellermann
a3c33000ee pcm/Dsd32: include cleanup 2017-01-11 22:47:12 +01:00
Max Kellermann
1e54b7b294 test/test_pcm: fix the DSD_U32 byte order
The unit test was wrong as well.  D'oh!
2017-01-11 22:39:23 +01:00
Max Kellermann
cc0dbcf3f4 pcm/Dsd32: fix the byte order
The byte order of DSD_U32 was wrong from the start.  The oldest bits
must be in the MSB, not in the LSB, according to
snd_pcm_format_descriptions in alsa-lib.
2017-01-11 22:25:54 +01:00
Max Kellermann
c5a2cadccc pcm/Export: convert to class, make members private 2017-01-11 21:48:43 +01:00
Max Kellermann
9aa43416b6 pcm/dop: remove unnecessary assertions 2017-01-11 21:48:43 +01:00
Max Kellermann
8364029db8 output/alsa: move code to PlayRaw() 2017-01-11 21:38:05 +01:00
Max Kellermann
d842d21be0 util/ReusableArray: add method GetCapacity() 2017-01-11 20:37:12 +01:00
Max Kellermann
3514fd2433 util/ReusableArray: add move constructor/operator 2017-01-11 20:37:12 +01:00
Max Kellermann
6778ff27ea util/ReusableArray: use C++11 initializers 2017-01-11 20:33:01 +01:00
Max Kellermann
f32315d699 pcm/Export: remove obsolete gcc warning suppression 2017-01-11 20:31:48 +01:00
Max Kellermann
8b754b24b6 pcm/Buffer: update API documentation 2017-01-11 20:24:32 +01:00
Max Kellermann
b1bee9ff38 test/test_pcm: enable the DSD unit tests
These were disabled by accident.
2017-01-11 20:06:10 +01:00
Max Kellermann
569be2d402 test/test_pcm_export: fix TestDop() sample rate results 2017-01-11 20:06:10 +01:00
Max Kellermann
78a73eac53 pcm/Export: add (dummy) method Cancel()
We'll have some code for it soon.
2017-01-11 15:41:28 +01:00
Max Kellermann
533cb99c33 output/Source: reset all filters in Cancel() 2017-01-11 15:39:18 +01:00
Max Kellermann
79726940dc output/Source: un-inline Cancel() 2017-01-11 15:39:00 +01:00
Max Kellermann
27c7891169 filter/Internal: add method Reset() 2017-01-11 15:34:25 +01:00
Max Kellermann
7a3a793a12 decoder/Bridge: call PcmConvert::Reset() after seeking 2017-01-11 15:32:57 +01:00
Max Kellermann
8088469eca pcm/Convert: add method Reset() 2017-01-11 15:30:30 +01:00
Max Kellermann
3dcb082015 pcm/Resampler: add method Reset()
Hook for src_reset(), not yet used.
2017-01-11 15:26:48 +01:00
Max Kellermann
bece023028 pcm/PcmDsd: move Dsd8To32() to Dsd32.cxx 2017-01-11 15:22:43 +01:00
Max Kellermann
9c4df66925 pcm/Export: halve the sample rate for DoP
Move this sample rate fixup from the ALSA output plugin to PcmExport,
where it belongs.
2017-01-11 10:33:23 +01:00
Max Kellermann
2b43ceb6c6 pcm/Export: DSD_U32 quarters the sample rate
DSD_U32 packs four bytes instead of one large "sample", thus the
sample rate is one quarter of the input sample rate.  This fixes a
rather critical DSD_U32 playback problem.
2017-01-11 10:14:41 +01:00
Max Kellermann
c143adba91 pcm/Export: add CalcOutputSampleRate(), CalcInputSampleRate()
Prepare for DSD sample rate fixups.
2017-01-10 23:48:26 +01:00
Max Kellermann
142fdc8d86 decoder/flac: add options "probesize" and "analyzeduration"
https://bugs.musicpd.org/view.php?id=3876
2017-01-10 23:05:04 +01:00
Max Kellermann
67778dcd3d configure.ac: prepare for 0.20.2 2017-01-10 23:01:42 +01:00
Max Kellermann
ed80863eac release v0.20.1 2017-01-09 18:10:18 +01:00
Max Kellermann
c3fc84de12 input/curl: wake up client thread after seek to end of file
Call SeekDone() to avoid the freeze bug.
2017-01-09 18:08:33 +01:00
Max Kellermann
904f83cd85 doc/developer: add GitHub reference 2017-01-09 17:19:15 +01:00
Max Kellermann
28bf100a50 doc/developer: more code style 2017-01-09 17:13:28 +01:00
Max Kellermann
accbd4e82a doc/developer: change C++11 to C++14 2017-01-09 17:13:28 +01:00
Max Kellermann
d7f478c154 doc/developer: add XML ids 2017-01-09 17:13:28 +01:00
Wieland Hoffmann
8f7f13fea4 doc/user: Replace "It used used" with "It is used" 2017-01-08 18:23:13 +01:00
Max Kellermann
c82b03a74c decoder/wavpack: fix crash bug 2017-01-08 14:54:12 +01:00
Max Kellermann
58fb36bdb9 storage/http: new storage plugin 2017-01-08 14:40:20 +01:00
Max Kellermann
4297a7b0a4 lib/curl/Request: move exception handling out of the WRITEFUNCTION
libcurl's WRITEFUNCTION is pretty fragile; if we destroy the CURL*
instance or even unregister it using curl_multi_remove_handle(),
libcurl will crash instantly.  But still we need to be able to handle
exceptions from inside the WRITEFUNCTION, and call
CurlResponseHandler::OnError(), which may destroy the whole thing.  As
a workaround, I use DeferredMonitor to postpone the OnError() call
into a stack frame which is allowed to destroy the request.
2017-01-08 14:36:27 +01:00
Max Kellermann
1bab6d0dd7 lib/curl/Request: move catch clause out of FinishHeaders
Let the caller decide what to do with the exception.
2017-01-08 14:36:27 +01:00
Max Kellermann
13b85edbe2 lib/curl/Request: postpone the curl_easy_cleanup() call
When the request is done, only unregister the CURL* handle, but do not
delete it yet - it may still be needed for CURLINFO_RESPONSE_CODE.
2017-01-08 13:51:53 +01:00
Max Kellermann
dc53098e43 lib/curl/Request: allow Stop() to be called twice
Convert assertion to runtime check.  This is useful because this is a
public method, and the caller has no chance to check if the object is
still registered.
2017-01-08 13:51:53 +01:00
Max Kellermann
3c66feff5a lib/curl/Global: defer the ReadInfo() call
Fixes a crash that can occur due to recursion from InvalidateSockets()
to ReadInfo() to CurlRequest callbacks.
2017-01-08 12:46:35 +01:00
Max Kellermann
218c3bc0d5 lib/curl/Multi: fix typo 2017-01-08 12:46:35 +01:00
Max Kellermann
9f5eddcd13 lib/curl/Global: move code to UpdateTimeout() 2017-01-08 12:44:07 +01:00
Max Kellermann
3cba76552b lib/curl/Global: drop redundant ">=0" check 2017-01-08 12:44:04 +01:00
Max Kellermann
e98a8b624b lib/curl/Global: drop redundant "virtual" 2017-01-08 12:41:26 +01:00
Max Kellermann
6c6947b01f util/UriUtil: add uri_get_path() 2017-01-08 11:05:58 +01:00
Max Kellermann
78c91e9e5b test/run_storage: don't print unknown time stamps 2017-01-08 10:41:08 +01:00
Max Kellermann
44493ca0c4 util/TimeParser: add "pure" attribute 2017-01-08 10:41:08 +01:00
Max Kellermann
42acf78b09 util/TimeParser: wrapper for strptime()
Move code from SongFilter.cxx.
2017-01-07 22:11:45 +01:00
TermeHansen
3aa9f8af18 Rewrite of AlsaMixerPlugin to use volume_mapping
Changed AlsaMixerPlugin to use the get and set normalized functions from volume_mapping of alsa-utils/alsamixer
Changed volume_mapping set volume to be for all channels and not per channel
added volume_mapping files to Makefile.am
2017-01-07 16:30:19 +01:00
TermeHansen
8a32ee30a5 Adding volume_mapping from alsa-utils/alsamixer
source:
http://git.alsa-project.org/?p=alsa-utils.git;a=blob_plain;f=alsamixer/volume_mapping.c;hb=HEAD
http://git.alsa-project.org/?p=alsa-utils.git;a=blob_plain;f=alsamixer/volume_mapping.h;hb=HEAD
2017-01-07 16:26:36 +01:00
Max Kellermann
981dc0626b lib/expat/ExpatParser: add constructor overload for XML_ParserCreateNS() 2017-01-07 16:17:53 +01:00
Max Kellermann
8986d14e98 lib/expat/ExpatParser: make constructors "explicit" 2017-01-07 16:15:11 +01:00
Max Kellermann
5163b1a624 lib/curl/Request: require the caller to explicitly register the request
This allows constructing an instance in any thread, and register it
inside the IOThread later.
2017-01-07 16:01:58 +01:00
Max Kellermann
860aa9d6d0 lib/expat/ExpatParser: move InputStream overload to separate source file
Eliminate one unnecessary dependency for debug programs which don't
need the InputStream API.
2017-01-07 15:46:36 +01:00
Max Kellermann
64dc5212f9 Makefile.am: add variable CURL_SOURCES 2017-01-07 14:19:24 +01:00
Max Kellermann
6cff3214f3 lib/curl/Slist: new wrapper for curl_slist 2017-01-06 19:37:31 +01:00
Max Kellermann
fd910bd5e9 db/upnp: use "override" instead of "virtual" 2017-01-06 19:35:58 +01:00
Max Kellermann
c6086bed41 filter/Internal: remove the default constructor
Not used.  Force implementations to initialize out_audio_format.
2017-01-06 12:45:52 +01:00
Max Kellermann
1a9dfdfab8 filter/AutoConvert: initialize Filter::out_audio_format 2017-01-06 12:44:55 +01:00
Max Kellermann
5284cd11a9 filter/AutoConvert: remove obsolete NULL check 2017-01-06 12:35:06 +01:00
Max Kellermann
d1a47cffad filter/convert: remove obsolete method prototype 2017-01-06 12:34:39 +01:00
Max Kellermann
f469595eee filter/Internal: remove obsolete doxygen line 2017-01-06 12:34:39 +01:00
Max Kellermann
9cfc52f114 filter/Internal: add assertion to constructor 2017-01-06 11:17:55 +01:00
Max Kellermann
30bfb756c2 configure.ac: prepare for 0.20.1 2017-01-05 19:36:32 +01:00
Max Kellermann
711f85445e release v0.20 2017-01-04 10:49:28 +01:00
Max Kellermann
8aae9766e5 fs/io/*: make constructors "explicit" 2017-01-04 10:41:04 +01:00
Max Kellermann
288b98ccbf fs/io/GunzipReader: use C++11 initializer 2017-01-04 10:37:34 +01:00
Max Kellermann
bde50b1be8 fs/io/{GunzipReader,GzipOutputStream: remove deprepcated dynamic exception specifications 2017-01-04 10:33:24 +01:00
Max Kellermann
a34dfd55be util/HugeAllocator: remove deprepcated dynamic exception specifications 2017-01-04 10:32:21 +01:00
Max Kellermann
609c1d4d4c m4: update various scripts from autoconf-archive 2017-01-04 10:19:27 +01:00
Max Kellermann
c12fe09969 Makefile.am: update header files
Problems found by "make distcheck".
2017-01-04 10:15:44 +01:00
Eugene Baklanov
bd14afe347 Fix for priority order bug if reordering in SetRandom()
Fix for the problem where order with priorities gets out of whack in case it's
reordered by SetRandom() while another song is currently playing.
What happens is, if some song is already playing and you have set some
priorities before switching on the random mode, and then turn the mode on, the
original code swaps position of the first song in the order (i.e., the highest
priority song) with current, so that current is 0 (which it should be). The
problem is, the "original" first song then goes to the place "current" song was
after reordering, wherever that is, instead of going after the "current" song.
This patch fixes the issue.
Also the fix makes MoveOrder() public, because why shouldn't it be, anyway.  It
certainly makes more sense than just having SwapOrders() public for some
reason.

Signed-off-by: Eugene Baklanov <miltenfiremage@gmail.com>
2017-01-04 10:10:27 +01:00
Max Kellermann
f445a13051 Makefile.am: updated web server documentation path 2017-01-04 10:09:24 +01:00
Max Kellermann
8ddf607d9f doc/user: add brief "troubleshooting" chapter 2017-01-04 08:04:20 +01:00
Max Kellermann
5900253b85 update copyright year 2017-01-03 20:48:59 +01:00
Max Kellermann
ccec94925f doc/user: tilde expansion 2017-01-03 20:43:14 +01:00
Max Kellermann
4504a9d0b5 doc/user: new section about stored playlists 2017-01-03 20:42:19 +01:00
Max Kellermann
057f98ad45 doc/user: new section about external mixer 2017-01-03 20:37:25 +01:00
Max Kellermann
3b1c9aa026 doc/user: audio_output/enabled is stored in state_file 2017-01-03 20:29:38 +01:00
Max Kellermann
658397dc38 doc/user: mention that more than one audio_output is possible 2017-01-03 20:28:50 +01:00
Max Kellermann
0cd1c8e23e doc/user: mention more plugins 2017-01-03 20:27:22 +01:00
Max Kellermann
0345c1e6f8 doc/user: more general documentation about the configuration file 2017-01-03 20:15:23 +01:00
Max Kellermann
f6c4cda0d4 python/libs: upgrade FLAC to 1.3.2 2017-01-03 15:04:07 +01:00
Max Kellermann
39fd713b91 Main: invoke UpdateEffectiveReplayGainMode() after output init
Forward the configured ReplayGainMode to all outputs and decoders.
2017-01-03 13:44:38 +01:00
Max Kellermann
31d77ec580 input/curl, ...: use strncmp() instead of memcmp() to avoid crash 2017-01-03 13:17:02 +01:00
Max Kellermann
06116382ee input/curl: move code to class CurlRequest
The CurlRequest gives us a more low-level API to CURL without the
InputStream interface, integrated into our IOThread.
2017-01-03 12:24:05 +01:00
Max Kellermann
d2046de193 test/run_input, ...: RAII-style global initialization 2017-01-03 12:24:05 +01:00
Max Kellermann
4397fe3a13 input/curl: fold input_curl_easy_add_indirect() into the only caller 2017-01-03 10:53:20 +01:00
Max Kellermann
534e1fa6eb input/curl: move code to SeekInternal(), simplify DoSeek()
Simplifies the code and reduces the number of IOThread roundtrips.
2017-01-03 10:50:02 +01:00
Max Kellermann
3e8cc2c670 input/curl: move class CurlGlobal to separate source file 2017-01-03 10:50:02 +01:00
Max Kellermann
3c565baf9d output/Source: clear current_chunk in Close()
Fixes assert failure after unpausing.
2017-01-03 10:50:02 +01:00
Max Kellermann
2e182e84c3 thread/Mutex: remove ScopeLock, use std::lock_guard directly 2017-01-03 07:11:57 +01:00
Max Kellermann
a42021655c thread/Cond: make the integer-based timed_wait() overload private
Make sure this deprecated API is not used.
2017-01-03 07:07:10 +01:00
Max Kellermann
2498a2b0bd thread/Mutex: use std::lock_guard instead of std::unique_lock
We need purely RAII-style, and this is std::lock_guard.
2017-01-03 06:56:24 +01:00
Max Kellermann
4484411a77 output/Internal: add various trivial getter methods 2016-12-29 23:28:54 +01:00
Max Kellermann
61a151c803 output/State: add missing mutex lock 2016-12-29 23:28:46 +01:00
Max Kellermann
5149c950aa output/Multiple: add missing mutex lock 2016-12-29 23:28:46 +01:00
Max Kellermann
18f4d846c9 output/Internal: make the Mutex mutable 2016-12-29 23:28:37 +01:00
Max Kellermann
db95aa250d output/Control: pass "force" flag to LockUpdate()
Reduce overhead by eliminating MultipleOutputs::ResetReopen().
2016-12-29 23:20:26 +01:00
Max Kellermann
982d1bf662 output/Init: convert audio_output_setup() to method 2016-12-29 22:59:03 +01:00
Max Kellermann
a0393e9ddf python/libs: upgrade Boost to 1.63 2016-12-29 21:55:20 +01:00
Max Kellermann
a8d6328bd4 python/build/libs: upgrade CURL to 7.52.1 2016-12-29 21:50:35 +01:00
Max Kellermann
13dab13319 python/build/libs: upgrade FFmpeg to 3.2.2 2016-12-29 21:46:13 +01:00
Max Kellermann
c623aa0f06 python/build/verify: support SHA-1 and SHA-256 2016-12-29 21:45:37 +01:00
Max Kellermann
79403afbe6 python/build/verify: prepare SHA support 2016-12-29 21:43:47 +01:00
Max Kellermann
4c650e87fa python/build/verify: add verify_file_digest() 2016-12-29 21:40:54 +01:00
Max Kellermann
3dde62befe python/build/verify: move code to file_digest() 2016-12-29 21:33:36 +01:00
Max Kellermann
8bfabbe265 python/build/verify: move code to feed_file() 2016-12-29 21:33:12 +01:00
Max Kellermann
e334b16aaa python/build/download: move file_md5() to verify.py 2016-12-29 21:32:28 +01:00
Max Kellermann
5626ace245 python/build/download: raise RuntimeError 2016-12-29 21:21:58 +01:00
Max Kellermann
52652cb609 command/{Player,Error}: extract messages from nested exceptions 2016-12-29 14:46:13 +01:00
Max Kellermann
256f40d4f5 output/Multiple: obtain detailed error information in Open() 2016-12-29 14:46:13 +01:00
Max Kellermann
ef9acc54ec output/Internal: remember the most recent error 2016-12-29 14:21:12 +01:00
Max Kellermann
a9f2d25957 output/Thread: unify exception handling 2016-12-29 14:10:37 +01:00
Max Kellermann
6fc47fbb69 thread/Mutex: make ScopeLock an alias for std::unique_lock 2016-12-29 11:53:24 +01:00
Max Kellermann
9c11184238 thread/Mutex: use std::unique_lock to implement ScopeLock 2016-12-29 11:51:25 +01:00
Max Kellermann
a421c1dbfb notify: use C++11 initializer 2016-12-29 11:41:22 +01:00
Max Kellermann
7ec707927d lib/nfs/Blocking, neighbor/smbclient: pass std::chrono::duration to Cond::timed_wait() 2016-12-29 11:37:18 +01:00
Max Kellermann
837134daef system/Clock: remove obsolete MonotonicClock*() functions
We're using std::chrono::steady_clock now.  No need to duplicate code.
2016-12-28 22:24:09 +01:00
Max Kellermann
4011899846 system/PeriodClock: use std::chrono::steady_clock 2016-12-28 22:23:45 +01:00
Max Kellermann
28e743ba70 output/Timer: include cleanup 2016-12-28 22:23:45 +01:00
Max Kellermann
a161d404ad lib/xiph/OggSerial: use std::chrono::steady_clock 2016-12-28 22:17:59 +01:00
Max Kellermann
cd607cb280 lib/upnp/Discovery: use std::chrono::steady_clock 2016-12-28 22:06:06 +01:00
Max Kellermann
4e60ab7f53 lib/upnp/Discovery: use C++11 initializers 2016-12-28 22:05:31 +01:00
Max Kellermann
71e7d32b08 output/Timer: use std::chrono 2016-12-28 22:00:33 +01:00
Max Kellermann
d5e422970c output/Plugin: delay() returns std::chrono::steady_clock::duration 2016-12-28 22:00:29 +01:00
Max Kellermann
871ba5a488 thread/Cond: add timed_wait() overload with std::chrono support 2016-12-28 21:47:04 +01:00
Max Kellermann
249e8d59cb Stats: use std::chrono 2016-12-28 10:22:55 +01:00
Max Kellermann
8f4769d2ac Stats: initialize start_time automatically 2016-12-28 10:22:15 +01:00
Max Kellermann
a3ca9963a5 output/Timer: pass size_t to Add() 2016-12-28 10:17:29 +01:00
Max Kellermann
2d3c23876c output/Timer: use C++11 initializers 2016-12-28 10:16:41 +01:00
Max Kellermann
bd8d8eef3e output/Timer: no "time" initialization if !started 2016-12-28 10:16:11 +01:00
Max Kellermann
e786207cc2 system/PeriodClock: indent with tabs 2016-12-28 01:18:42 +01:00
Max Kellermann
b042095ac2 event/Loop: use std::chrono 2016-12-28 01:15:08 +01:00
Max Kellermann
3413d1bf23 config/Global: add std::chrono::steady_clock::duration overload 2016-12-28 01:12:38 +01:00
Max Kellermann
018c5ef731 event/Loop: use C++11 initializers 2016-12-27 23:13:26 +01:00
Max Kellermann
fdb136f1fa StateFile: use C++11 initializers 2016-12-27 23:13:26 +01:00
Max Kellermann
9e33074735 output/Thread: move software_mixer_set_filter() call to Open()
.. and remove the obsolete method OpenFilter().
2016-12-27 14:44:39 +01:00
Max Kellermann
d6d465cdf4 output/Thread: fix assertion failure in CLOSE handler
Convert assertion to runtime check; this assertion could fail when the
output was closed due to an error before CLOSE arrived.
2016-12-27 07:57:22 +01:00
Max Kellermann
e76573cc1a output/Thread: use "true" instead of "1" 2016-12-27 07:53:02 +01:00
Max Kellermann
3fa6dc71e2 output/Source: add assertion 2016-12-26 20:10:00 +01:00
Max Kellermann
6fec269844 output/SharedPipeConsumer: add thread-safety documentation 2016-12-26 20:09:10 +01:00
Max Kellermann
b6004b6837 output/Source: release the mutex while the filter runs
The filter can take some time to finish, even more so on a weak
machine with a saturated CPU.  By not holding the mutex during that
time, we can reduce PlayerThread latency a lot, because that thread
needs to synchronize a lot with all outputs.
2016-12-26 20:02:15 +01:00
Max Kellermann
86d3b25aec output/Source: add Fill(), ReadTag(), PeekData(), ConsumeData()
Don't expose MusicChunk instances, provide higher-level access to
chunk contents.
2016-12-26 13:53:22 +01:00
Max Kellermann
8a407bfbb0 output/Thread: move code to new class AudioOutputSource 2016-12-26 13:35:19 +01:00
Max Kellermann
d30a590d9e configure.ac: use MPD_AUTO for libsndio and Haiku 2016-12-26 13:35:19 +01:00
Max Kellermann
f95e404be1 outputThread: optimize Command::OPEN
Try harder to skip steps (reopen filter, reopen output) if the
AudioOutput is already open.
2016-12-24 14:05:11 +01:00
Max Kellermann
ffb8b4fc68 output/Internal: add method ClearTailChunk() 2016-12-22 14:46:59 +01:00
Max Kellermann
f86d6b0162 output/Control: move pipe initialization to the OutputThread
Un-protect the SharedPipeConsumer instance, and make it available in
the OutputThread only.  This gives more well-defined mutex protection.
2016-12-22 14:04:38 +01:00
Max Kellermann
71c72ed072 output/Control: use Command::OPEN to unpause, remove special case 2016-12-22 14:04:38 +01:00
Max Kellermann
a8d343e07b output/Thread: update in_audio_format before ReopenFilter() 2016-12-22 14:04:34 +01:00
Max Kellermann
d020172181 output/Thread: keep the device open if the audio format hasn't changed
Add another condition to Reopen() which allows keeping it open.
2016-12-21 17:45:01 +01:00
Max Kellermann
e5c9f6c1fe output/Internal: add attribute request.audio_format
Make in_audio_format accessible only from within the OutputThread, and
add a new one for inter-thread communication.
2016-12-21 17:00:29 +01:00
Max Kellermann
176dc11748 output/Thread: ao_filter_chunk() throws exception on error
Move the error logging to AudioOutput::PlayChunk().
2016-12-20 17:40:11 +01:00
Max Kellermann
c2abd02b9b output/Thread: use ConstBuffer::skip_front() 2016-12-20 17:38:08 +01:00
Max Kellermann
12ecfdd423 output/Thread: convert pointer to reference 2016-12-20 17:35:38 +01:00
Max Kellermann
67cfbfc2f3 output/SharedPipeConsumer: update API documentation 2016-12-20 16:35:14 +01:00
Max Kellermann
fc83d38e67 input/curl: wrap CURLM* in new class CurlMulti 2016-12-19 16:41:12 +01:00
Max Kellermann
7063c423eb input/curl: rename class CurlMulti to CurlGlobal 2016-12-19 16:37:01 +01:00
Max Kellermann
36b93993cf input/curl: wrap CURL* in new class CurlEasy 2016-12-19 14:42:04 +01:00
Max Kellermann
ceffc5aa72 input/curl: remove duplicate InitEasy() call 2016-12-19 14:38:50 +01:00
Max Kellermann
ccb45b6f6e output/Client: new interface to replace direct access to class PlayerControl 2016-12-14 20:29:15 +01:00
Max Kellermann
d2e47e014a player/Thread: reduce unlock/lock overhead in PlayerCommand::PAUSE handler 2016-12-14 20:24:52 +01:00
Max Kellermann
a5b8d7917f player/Thread: mutex must be locked inside OpenOutput() 2016-12-14 20:23:23 +01:00
Max Kellermann
d0e735ee4b player/Thread: mutex must be locked inside CheckDecoderStartup() 2016-12-14 20:13:18 +01:00
Max Kellermann
ece5971027 output/Multiple: move Wait() to struct PlayerControl
Eliminate a dependency from MultipleOutputs on PlayerControl.
2016-12-14 19:37:01 +01:00
Max Kellermann
7c6b0d5c31 player/Thread: use class ScopeLock 2016-12-14 13:10:48 +01:00
Max Kellermann
03151310cf player/Control: add method LockApplyBorderPause() 2016-12-14 13:09:48 +01:00
Max Kellermann
baa2bc0c38 player/Control: add method LockSetOutputError() 2016-12-14 13:01:17 +01:00
Max Kellermann
7e1b53480e output/MultipleOutputs: parallelize EnableDisable() 2016-12-14 08:41:42 +01:00
Max Kellermann
6425b4f9f5 output/MultipleOutputs: parallelize AudioOutput destruction
Reduce latency by stopping all AudioOutputs asynchronously.
2016-12-14 08:35:07 +01:00
Max Kellermann
fb907f5f76 output/Thread: KILL implicitly closes and disables the AudioOutput
Reduce shutdown latency by two commands per output.
2016-12-14 08:29:09 +01:00
Max Kellermann
b107a1583f output/MultipleOutputs: move code to AudioOutput::EnableDisableWait() 2016-12-14 08:00:43 +01:00
Max Kellermann
ced3f320eb output/MultipleOutputs: reduce lock/unlock calls in EnableDisable()
Use ScopeLock to manage the lock; don't unlock after obtaining the
"really_enabled" flag; keep the same lock during EnableWait() /
DisableWait().
2016-12-14 07:54:05 +01:00
Max Kellermann
a9d7293818 output/Thread: wake up the player thread periodically while playing
Without this, the pipe would run empty very often, which may result in
an xrun if the roundtrip to the PlayerThread and back takes too long.
By waking up the PlayerThread before the pipe runs empty, we make MPD
much more latency tolerant, which is a major optimization.
2016-12-13 22:39:49 +01:00
Max Kellermann
add42e9edf NEWS: add "player" section 2016-12-13 22:39:49 +01:00
Max Kellermann
265ad4b96a output/Thread: eliminate redundant nullptr check 2016-12-13 22:20:41 +01:00
Max Kellermann
92eeb4969f output/Thread: don't wake up the player after receiving command in Play()
If we have a pending command, then the player thread is already awake.
Even if not, we'll wake it up as soon as we have finished the command.
2016-12-13 22:17:06 +01:00
Max Kellermann
6fcddaf8fa output/Thread: use AtScopeExit() to revert the in_playback_loop flag 2016-12-13 22:15:52 +01:00
Max Kellermann
41fd583fbc output/Thread: eliminate one ScopeLock 2016-12-13 21:57:03 +01:00
Max Kellermann
ceba6816de output/Thread: split Open()
Simplify the code, eliminate duplicate rollback code and eliminate the
"goto" kludge.
2016-12-13 21:46:27 +01:00
Max Kellermann
093cb475bb output/Thread: simplify the retry_audio_format declaration 2016-12-13 21:34:43 +01:00
Max Kellermann
d44790b35f output/Thread: reduce locking further in Open() 2016-12-13 21:26:28 +01:00
Max Kellermann
f8164a3dd1 output/Thread: unlock mutex during OpenFilter() 2016-12-13 21:24:14 +01:00
Max Kellermann
c20126598f output/Thread: remove unused variable 2016-12-13 21:24:05 +01:00
Max Kellermann
6c818bb37a AudioFormat: add method WithMask(), shortcut for ApplyMask() 2016-12-13 20:57:46 +01:00
Max Kellermann
8cb160b1f8 test/run_convert: pass out_audio_format to PcmConvert::Open() 2016-12-13 20:57:36 +01:00
Max Kellermann
df91f3738a output/Thread: remove a useless out_audio_format setting
Now that I can see the Reopen() method clearly, it is obvious that the
out_audio_format setting will get overwritten by the following Open()
call.
2016-12-13 20:43:29 +01:00
Max Kellermann
b5b268f606 output/Thread: remove another redundant "open" check 2016-12-13 20:41:54 +01:00
Max Kellermann
ce6b8c94a2 output/Thread: convert redundant runtime check to assertion 2016-12-13 20:29:16 +01:00
Max Kellermann
6e643fe58b output/Thread: don't deinitialize the pipe in Close() 2016-12-13 20:28:19 +01:00
Max Kellermann
2bf91a0487 output/Internal: merge REOPEN and OPEN 2016-12-13 20:07:00 +01:00
Max Kellermann
2775d747ac output/Thread: move MusicPipe code to class SharedPipeConsumer 2016-12-13 16:33:23 +01:00
Max Kellermann
99659e4cf9 Merge tag 'v0.19.21'
release v0.19.21
2016-12-13 11:00:39 +01:00
Max Kellermann
3bbcda917c release v0.19.21 2016-12-13 10:54:04 +01:00
Max Kellermann
7e43fb79af Makefile.am: fix mpd.socket path in EXTRA_DIST 2016-12-13 10:53:41 +01:00
Max Kellermann
eb2b567da6 NEWS: fix version number 2016-12-13 10:45:53 +01:00
Max Kellermann
ab332d7b2e systemd: add user unit
The user unit omits the "ProtectKernelModules" setting which fails
with modular kernels:

 Failed at step CAPABILITIES spawning /usr/bin/mpd: Operation not permitted

It is unfortunate that systemd (version 232) is unable to reduce its
own capabilities, because this requires us to split system and user
units.

 https://bugs.musicpd.org/view.php?id=4608
2016-12-13 10:24:10 +01:00
Max Kellermann
53e22b81ef systemd: add "system" sub directory 2016-12-13 10:24:10 +01:00
Max Kellermann
3fc9d50adb doc/user: fix --with-systemdsystemunitdir example 2016-12-13 10:24:10 +01:00
Max Kellermann
c2da6dd45b test/test_queue_priority: fix unit test failure after recent "setprio" change 2016-12-13 08:36:42 +01:00
Max Kellermann
7146f825b2 decoder/ffmpeg: fix double free bug
From the avformat_open_input() API documentation:

 "Note that a user-supplied AVFormatContext will be freed on failure."

https://bugs.musicpd.org/view.php?id=4607
2016-12-13 08:34:05 +01:00
Max Kellermann
f61a5f5200 configure.ac: prepare for 0.19.21 2016-12-13 08:31:21 +01:00
Max Kellermann
dc05dd7ca1 output/Multiple: make chunk_is_consumed_in() an AudioOutput method 2016-12-11 21:59:28 +01:00
Max Kellermann
57dd344f3b decoder/wavpack: implement WavpackStreamReader64 if available 2016-12-10 00:24:54 +01:00
Max Kellermann
f7f59df8aa decoder/wavpack: move code to WavpackInput methods 2016-12-10 00:17:46 +01:00
Max Kellermann
0525a6f90f decoder/wavpack: use WavpackSeekSample64() if available 2016-12-10 00:12:47 +01:00
Max Kellermann
7b4305d81b decoder/wavpack: seek errors are fatal
The libWavPack documentation says:

 "After a FALSE return the file should not be accessed again (other
 than to close it); this is a fatal error."
2016-12-10 00:11:29 +01:00
Max Kellermann
94e9e93fa4 ReplayGainGlobal: move replay_gain_config into struct Config
Yet another global variable removed.
2016-12-10 00:03:29 +01:00
Max Kellermann
d2a1294e9a Main: add struct Config, empty currently 2016-12-10 00:00:50 +01:00
Max Kellermann
3d897f18cd test/read_tags: use ScanGenericTags(InputStream&) after ScanStream() 2016-12-09 23:53:16 +01:00
Max Kellermann
68c14d1e53 test/read_tags: catch exceptions from ScanFile() before falling back to ScanStream() 2016-12-09 23:53:16 +01:00
Max Kellermann
48089394a5 test/read_tags: use AtScopeExit() 2016-12-09 23:53:16 +01:00
Max Kellermann
30bd190b41 decoder/wavpack: implement scan_stream() 2016-12-09 23:23:35 +01:00
Max Kellermann
cf93cd9307 decoder/wavpack: convert WavpackInput::client to pointer 2016-12-09 23:23:02 +01:00
Max Kellermann
f40816e063 decoder/wavpack: add WavpackOpen() wrappers which throw exception 2016-12-09 23:15:40 +01:00
Max Kellermann
3759f29852 decoder/wavpack: move wavpack_scan_file() down 2016-12-09 23:15:06 +01:00
Max Kellermann
bc5555933f decoder/wavpack: support native DSD 2016-12-09 23:08:54 +01:00
Max Kellermann
ead7ae8504 decoder/wavpack: use template for format_sample_X() 2016-12-09 22:53:01 +01:00
Max Kellermann
ad5abba8c6 decoder/wavpack: move 8 and 16 bit conversion to separate functions 2016-12-09 22:49:07 +01:00
Max Kellermann
61296cedd2 decoder/wavpack: rename format_samples_float() to format_samples_nop() 2016-12-09 22:47:32 +01:00
Max Kellermann
d9c29a2c4f decoder/wavpack: use std::copy_n() 2016-12-09 22:23:19 +01:00
Max Kellermann
f5172e6b84 decoder/wavpack: use int16_t instead of uint16_t
Technically, these samples are signed.  There was no practical
difference, only the declaration was formally wrong.
2016-12-09 22:21:31 +01:00
Max Kellermann
544bcbe903 decoder/wavpack: use WavpackGetNumSamples64() if available 2016-12-09 22:09:32 +01:00
Max Kellermann
f35dab1b56 decoder/wavpack: check WavpackGetNumSamples()==-1 2016-12-09 21:46:29 +01:00
Max Kellermann
caee420087 decoder/wavpack: move code to GetDuration() 2016-12-09 21:45:22 +01:00
Max Kellermann
e8c374113e decoder/wavpack: make is_float const 2016-12-09 21:30:31 +01:00
Max Kellermann
98a241a730 decoder/wavpack: use WavpackGetReducedChannels()
Since we don't use OPEN_2CH_MAX, this should be equal to
WavpackGetNumChannels() - but who knows, maybe a future libWavPack
version breaks this assumption.
2016-12-09 21:23:38 +01:00
Max Kellermann
be8297d6f6 decoder/wavpack: basic DSD support (WavPack 5)
Enable OPEN_DSD_AS_PCM if available.  No OPEN_DSD_NATIVE yet.

 https://bugs.musicpd.org/view.php?id=4606
2016-12-09 21:03:47 +01:00
Max Kellermann
09da80e9f4 tag/ApeTag: don't export ape_tags[] 2016-12-09 20:59:07 +01:00
Max Kellermann
df4ecf63a8 decoder/wavpack: disable OPEN_TAGS
Use MPD's internal APE tag code, which works just as well.  This
removes some duplicate code for reading tags and ReplayGain.
2016-12-09 20:53:54 +01:00
Max Kellermann
b4d1937857 decoder/wavpack: change norm_offset to 0
MPD uses a floating point range from -1 to +1 internally - why ask
libwavpack to use -32768..+32768 only to reduce it back to -1..+1
afterwards?
2016-12-09 20:53:45 +01:00
Max Kellermann
0be5fbdc35 decoder/wavpack: use AtScopeExit() 2016-12-09 20:53:04 +01:00
Max Kellermann
ae7e25ea65 Merge tag 'v0.19.20'
release v0.19.20
2016-12-09 20:18:54 +01:00
Max Kellermann
fef45d469c release v0.19.20 2016-12-09 20:02:07 +01:00
Max Kellermann
e7353ec7e7 Queue: "setprio" re-enqueues old song if priority has been raised
This commit changes a minor queue priority design to something which
makes a little bit more sense.

Previously, a song that had already been played would only be
re-enqueued if its priority had just been raised above the current
song's.  This means that if it was already above, it was not
re-enqueued.  That is a surprising behavior, because users expect a
song to be played when its priority is raised.

Now the song is always re-enqueued if its priority is raised (and
above the current song's - no matter if it has already been above
before).

 https://bugs.musicpd.org/view.php?id=4592
2016-12-09 13:02:26 +01:00
Max Kellermann
e3237f057d systemd: more paranoid security settings 2016-12-09 10:41:44 +01:00
Florian Schlichting
54d5d9d1cc systemd: protect /usr when running under systemd 2016-12-09 10:41:44 +01:00
Clément B
31d9aebf0b systemd: also disable mpd.socket when disabling mpd.service
e.g. when running 'update-rc.d mpd disable'
2016-12-09 10:41:43 +01:00
Max Kellermann
5013de6770 LogInit: convert use_stdout flag to out_fd=STDOUT_FILENO 2016-12-04 20:15:45 +01:00
Max Kellermann
301abac0c1 LogInit: initialize out_fd properly to avoid closing stdin 2016-12-04 20:13:37 +01:00
Max Kellermann
9614c48e4c LogInit: throw exception instead of calling FatalError() 2016-12-04 20:07:41 +01:00
Max Kellermann
c6e1ca1c22 system/Error: use std::generic_category() for errno on Windows
It's wrong to use std::system_category() for both GetLastError() and
errno on Windows.  Apparently, everybody uses std::generic_category()
for errno values, which appears to be a safe choice.

Some discussion on this confusing topic can be found here:

 https://stackoverflow.com/questions/28746372/system-error-categories-and-standard-system-error-codes
2016-12-04 20:07:11 +01:00
Max Kellermann
30dc473697 system/Error: allow using errno functions on Windows
The Windows standard library emulates part of POSIX, which includes
errno.
2016-12-04 20:07:09 +01:00
Max Kellermann
65974ceabc PlaylistFile: remove redundant existence check 2016-12-04 20:04:16 +01:00
Max Kellermann
6caf53d1c2 fs/FileSystem: RenameFile() throws exception on error 2016-12-04 19:59:33 +01:00
Max Kellermann
dee6e498d9 fs/CheckFile: use IsAccessDenied() 2016-12-04 19:56:25 +01:00
Max Kellermann
b3723274f7 decoder/Bridge: move code to DecoderControl::SetReady() 2016-12-03 14:20:51 +01:00
Max Kellermann
9fb7cc796b decoder/Control: add attribute configured_audio_format
Obsoletes the same variable from AudioConfig.cxx.
2016-12-03 14:12:08 +01:00
Max Kellermann
3472208c05 ReplayGainGlobal: move replay_gain_mode to struct Partition 2016-12-03 13:56:25 +01:00
Max Kellermann
fc30e1d559 Partition: pass ReplayGainConfig to constructor 2016-12-03 13:55:14 +01:00
Max Kellermann
cd4bb444ff player/Control: make ReplayGainConfig const 2016-12-03 13:47:13 +01:00
Max Kellermann
e443513996 Main: call replay_gain_global_init() before forking 2016-12-03 13:27:59 +01:00
Max Kellermann
3d16f22135 player/Control: use C++11 initializers 2016-12-03 13:08:00 +01:00
Max Kellermann
6cc1ff5eeb decoder/Control: make ReplayGainConfig const 2016-12-03 13:05:25 +01:00
Max Kellermann
3000b9dcde filter/ReplayGain: add ReplayGainConfig copy
Remove dependency on ReplayGain global variables.
2016-12-03 12:51:02 +01:00
Max Kellermann
3b867462a3 filter/ReplayGain: remove FilterPlugin instance, add explicit constructor 2016-12-03 12:34:23 +01:00
Max Kellermann
b8aa9348b9 filter/Registry: make filter_plugins static 2016-12-03 12:24:30 +01:00
Max Kellermann
513e3a3d21 filter/ReplayGain: forward-declare struct ReplayGainInfo 2016-12-03 12:20:32 +01:00
Max Kellermann
bfb0897b54 filter/ReplayGain: convert pointers to references 2016-12-03 12:13:45 +01:00
Max Kellermann
86e8b8c10d decoder/Thread: skip the ReplayGain loader if the feature is disabled
https://bugs.musicpd.org/view.php?id=4595
2016-11-25 13:26:40 +01:00
Max Kellermann
ee57c3490a {decoder,player}/Control: add ReplayGain{Config,Mode} attributes
Don't use the global variables in class DecoderBridge; instead,
forward these values to the decoder thread via PlayerControl and
DecoderControl.
2016-11-25 12:51:55 +01:00
Max Kellermann
77c1f54876 ReplayGainConfig: add struct ReplayGainConfig, move globals to ReplayGainGlobal.cxx 2016-11-25 11:13:08 +01:00
Max Kellermann
dc5984d0e0 ReplayGainConfig: move code to ParsePreamp() 2016-11-24 17:45:27 +01:00
Max Kellermann
7afbd4800f filter/ReplayGain: use ToString(ReplayGainMode) 2016-11-24 17:39:00 +01:00
Max Kellermann
0720702c91 ReplayGainMode: add ToString(), FromString()
Move code from ReplayGainConfig.cxx.
2016-11-24 17:34:57 +01:00
Max Kellermann
5f396e824f ReplayGainMode: convert to strictly-typed enum 2016-11-24 17:34:57 +01:00
Max Kellermann
4f229c254c ReplayGainInfo: move enum ReplayGainMode to separate header 2016-11-24 17:34:57 +01:00
Max Kellermann
25e58df5e0 ReplayGainInfo: don't use array in struct ReplayGainInfo
Declare two named elements.  An enum should not be used as an array
index, as this is error prone.
2016-11-24 17:34:57 +01:00
Max Kellermann
1261327fa6 ReplayGainInfo: implement fallback in Get()
Eliminates Complete().
2016-11-24 17:34:57 +01:00
Max Kellermann
09c3cc58e4 ReplayGainInfo: add method Get() 2016-11-24 17:34:57 +01:00
Max Kellermann
7ef31f84a7 command/Error: translate std::invalid_argument to ACK_ERROR_ARG 2016-11-24 17:33:36 +01:00
Max Kellermann
85c2b396ce test/FakeDecoderAPI: move code to DumpReplayGainTuple() 2016-11-24 17:17:30 +01:00
Max Kellermann
0759d72108 Partition: add UpdateEffectiveReplayGainMode()
Move code from replay_gain_get_real_mode().
2016-11-24 15:18:57 +01:00
Max Kellermann
9b9144f25d decoder/Control: use C++11 initializers 2016-11-24 14:58:17 +01:00
Max Kellermann
b677e891b4 decoder/{mikmod,modplug}: throw exception instead of calling FatalError() 2016-11-24 14:09:58 +01:00
Max Kellermann
509f62f68d output/MultipleOutputs: throw exception instead of calling FatalError() 2016-11-24 14:04:40 +01:00
Max Kellermann
868bf752f3 MusicPipe: disallow copying 2016-11-23 18:06:15 +01:00
Max Kellermann
051cdc9670 MusicPipe: use C++11 initializers 2016-11-23 18:04:23 +01:00
Max Kellermann
4de5c216ff MusicChunk: disallow copying 2016-11-23 17:57:29 +01:00
Max Kellermann
ad2c7304ea MusicChunk: use C++11 initializers 2016-11-23 17:56:36 +01:00
Max Kellermann
4dd1309c3f filter/Plugin: rename with CamelCase 2016-11-23 17:43:50 +01:00
Steven OBrien
541da2740d db/simple: add missing "return"
SimpleDatabase::Visit() always throws exception when visiting a song.
Adding a song to the queue always results in a "No such directory"
error response, although the song is successfully added.  This
behaviour was introduced by commit
3ff728ab02.  This patch fixes this.

https://bugs.musicpd.org/view.php?id=4601
2016-11-23 17:30:30 +01:00
Max Kellermann
95e2bec215 decoder/DecoderPlugin: container_scan() returns forward_list<DetachedSong>
Speed up container_scan() again, by eliminating the need to call
scan_file() for each item.
2016-11-22 16:49:31 +01:00
Max Kellermann
72c96052b4 decoder/gme: move gme_container_scan() down 2016-11-22 16:49:30 +01:00
Max Kellermann
2ab168735f test/ContainerScan: new debug program 2016-11-22 16:04:06 +01:00
Max Kellermann
85cdf05890 Makefile.am: remove obsolete variables 2016-11-22 16:04:02 +01:00
Max Kellermann
bf78b7f815 decoder/sidplay: use template to eliminate duplicate code 2016-11-22 13:17:31 +01:00
Max Kellermann
ffb9874d84 decoder/sidplay: move code to ScanSidTuneInfo() 2016-11-22 12:37:25 +01:00
Max Kellermann
228cdbe6af decoder/gme: provide the TRACK tag 2016-11-22 12:20:31 +01:00
Max Kellermann
a303639c9e decoder/{gme,sidplay}: fix off-by-one bug in container_scan()
Broken by commit 0abee77e62
2016-11-22 12:20:31 +01:00
Max Kellermann
c5133f6088 db/update/Container: catch C++ exceptions 2016-11-22 12:16:14 +01:00
Max Kellermann
27d368d48d decoder/gme: use AtScopeExit() 2016-11-22 12:16:14 +01:00
Max Kellermann
085b599f84 decoder/gme: remove redundant extern declaration 2016-11-22 12:16:14 +01:00
Max Kellermann
3b84eb3b70 decoder/gme: add missing SUBTUNE_PREFIX
Got lost in 0abee77e62
2016-11-22 12:16:14 +01:00
Max Kellermann
aa877a29d7 decoder/Thread: repair container decoder support
Catch ENOTDIR exceptions and in that case, try all matching decoder
plugins which implement the "container_scan" method.

 https://bugs.musicpd.org/view.php?id=4561
2016-11-22 10:24:08 +01:00
Max Kellermann
0abee77e62 decoder/DecoderPlugin: container_scan() returns forward_list<string> 2016-11-22 09:33:52 +01:00
Max Kellermann
114fcee2ae decoder/Client: add virtual method Read() 2016-11-21 22:43:09 +01:00
Max Kellermann
b488204093 decoder/API: move DecoderBridge methods to Bridge.cxx 2016-11-21 22:14:09 +01:00
Max Kellermann
322bfbaf57 decoder/API: simplify the client==nullptr code path in decoder_read() 2016-11-21 22:13:03 +01:00
Max Kellermann
2718f4c333 decoder/API: move part of decoder_check_cancel_read() into class DecoderBridge 2016-11-21 22:07:03 +01:00
Max Kellermann
8c342a764b decoder/API: move functions into class DecoderBridge 2016-11-21 21:44:57 +01:00
Max Kellermann
697c3f8cb9 decoder/Internal: rename struct Decoder to class DecoderBridge 2016-11-21 21:38:23 +01:00
Max Kellermann
bb292f501d m4/ax_cxx_compile_stdcxx.m4: workarounds to allow gcc 4.8
gcc 4.8 doesn't have full C++14 support, but it's enough for MPD.
2016-11-21 21:38:23 +01:00
Max Kellermann
723e54f74e decoder/Client: add OpenUri(), replacing decoder_open_uri() 2016-11-18 12:34:04 +01:00
Max Kellermann
1a8c96a3f0 decoder/mpcdec: use AtScopeExit() 2016-11-18 12:22:41 +01:00
Max Kellermann
a88040e4d5 decoder/Client: add Submit methods
Replaces decoder_data() and others.
2016-11-18 09:05:04 +01:00
Max Kellermann
47a0f46ce8 decoder/Client: add DecoderCommand/seek virtual methods 2016-11-18 09:03:42 +01:00
Max Kellermann
66fb352cca decoder/Client: add virtual method Ready()
Replaces decoder_initialized().
2016-11-18 09:03:41 +01:00
Max Kellermann
fd77acc217 decoder/Client: new interface which wraps struct Decoder
Prepare for a Decoder API redesign based on an abstract class with
virtual methods.
2016-11-18 09:03:39 +01:00
Max Kellermann
595d1942cb decoder/Internal: rename "chunk" to "current_chunk" 2016-11-18 09:01:32 +01:00
Max Kellermann
b905933999 python/build/libs: upgrade CURL to 7.51.0 2016-11-18 08:59:29 +01:00
Max Kellermann
219a756abc Compiler.h: drop gcc_alignas(), use plain C++11 alignas() 2016-11-18 08:56:16 +01:00
Max Kellermann
2f76f9da89 configure.ac: enable C++14 2016-11-18 08:41:47 +01:00
Max Kellermann
b0b8f573bc decoder/API: copy exceptions to Decoder::error 2016-11-17 22:54:13 +01:00
Max Kellermann
746aa6cc0f decoder/API: check for errors in decoder_read() 2016-11-17 22:53:43 +01:00
Max Kellermann
fac610d47b decoder/API: decoder_open_uri() can throw StopDecoder 2016-11-17 22:48:18 +01:00
Max Kellermann
93209da176 decoder/API: lock decoder in decoder_get_command() 2016-11-17 22:36:42 +01:00
Max Kellermann
35a2a48c47 Merge branch 'v0.19.x' 2016-11-17 22:20:24 +01:00
Max Kellermann
7019f6bea4 decoder/pcm: round buffer size down to nearest frame size
https://bugs.musicpd.org/view.php?id=4599
2016-11-17 21:58:27 +01:00
Wieland Hoffmann
8bde47280a doc/protocol: Turn the link to the UTF-8 FAQ into a ulink element 2016-11-16 21:25:45 +01:00
Wieland Hoffmann
521c6da830 doc/protocol: UTF=8 → UTF-8 2016-11-16 21:25:40 +01:00
Max Kellermann
5c3e55b5b1 {input,output}/alsa: fix gcc 7.0 -Wimplicit-fallthrough 2016-11-16 19:50:38 +01:00
Max Kellermann
22dcca9832 util/Error: remove obsolete class 2016-11-10 12:58:26 +01:00
Max Kellermann
db6c0d54cf test/run_gzip: migrate from class Error to C++ exceptions 2016-11-10 12:58:03 +01:00
Max Kellermann
a17abc5557 Log: remove the obsolete class Error overloads 2016-11-10 12:55:08 +01:00
Max Kellermann
741c6f1179 command: remove the obsolete Error support code 2016-11-10 12:55:08 +01:00
Max Kellermann
43b285ef7a decoder/Thread: remove the obsolete catch(Error&) 2016-11-10 12:55:08 +01:00
Max Kellermann
f4bb18b05e fs/AllocatedPath: remove the obsolete class Error overload 2016-11-10 12:55:08 +01:00
Max Kellermann
14885f25b4 system/FatalError: remove the obsolete class Error overloads 2016-11-10 12:55:08 +01:00
Max Kellermann
4e16ea0f0a decoder/flac: migrate from class Error to C++ exceptions 2016-11-10 12:55:08 +01:00
Max Kellermann
42a696873b decoder/faad: migrate from class Error to C++ exceptions 2016-11-10 12:55:08 +01:00
Max Kellermann
cfd51db229 CheckAudioFormat: migrate from class Error to C++ exceptions 2016-11-10 12:55:08 +01:00
Max Kellermann
12f11c97ae decoder/faad: use AtScopeExit() 2016-11-10 12:55:08 +01:00
Max Kellermann
6a78d11127 decoder/gme: use AtScopeExit() 2016-11-10 12:55:08 +01:00
Max Kellermann
256ee7a8c7 decoder/audiofile: use AtScopeExit() 2016-11-10 12:55:08 +01:00
Max Kellermann
07a51957ee fs/FileInfo: remove the obsolete class Error overloads 2016-11-10 12:55:08 +01:00
Max Kellermann
37c4470f10 fs/CheckFile: use FileInfo(Path) instead of GetFileInfo() 2016-11-10 12:55:08 +01:00
Max Kellermann
4dc7d1c0cd decoder/Thread: use AllocatedPath::FromUTF8Throw() 2016-11-10 12:55:08 +01:00
Dave Hocker
f6a85f0b0b output/osx: fix build failure 2016-11-10 12:55:08 +01:00
Max Kellermann
5b8b660bd0 decoder/DecoderAPI: include cleanup 2016-11-09 13:42:52 +01:00
Max Kellermann
d9cb85df83 output/Plugin: remove 'Error&' parameters, use C++ exceptions only 2016-11-09 12:36:21 +01:00
Max Kellermann
445e82be75 output/Multiple: migrate from class Error to C++ exceptions 2016-11-09 12:31:23 +01:00
Max Kellermann
98a12c49dd pcm/Domain: remove obsolete source 2016-11-09 12:15:35 +01:00
Max Kellermann
b78cc7e48a output/Thread: remove obsolete pcm_domain check, this is defunct 2016-11-09 12:15:35 +01:00
Max Kellermann
ac9ce0b3ad output/Init: migrate _setup() from class Error to C++ exceptions 2016-11-09 12:09:00 +01:00
Max Kellermann
cf2b814629 output/Init: migrate Configure() from class Error to C++ exceptions 2016-11-09 12:06:54 +01:00
Max Kellermann
bbe7a37359 output/Internal: hide Configure() and remove the non-configuring constructor 2016-11-09 12:06:06 +01:00
Max Kellermann
d0aa154ea6 output/null: migrate from class Error to C++ exceptions 2016-11-09 12:03:20 +01:00
Max Kellermann
df4616ae4a output/osx: migrate from class Error to C++ exceptions
Beware, this commit was not tested.  I don't have OS X, but I want to
prepare an API change.
2016-11-09 11:51:28 +01:00
Max Kellermann
10f62db9fd output/osx: use std::unique_ptr
Eliminate all those "goto"s and make the function exception-safe.
2016-11-09 11:50:14 +01:00
Max Kellermann
5c075210d6 output/osx: use AtScopeExit() to call CFRelease() 2016-11-09 11:49:21 +01:00
Max Kellermann
0cf85b0771 output/haiku: eliminate DoClose() 2016-11-09 11:42:00 +01:00
Max Kellermann
fa90047e52 output/haiku: migrate from class Error to C++ exceptions
Beware, this commit was not tested.  I don't have Haiku, but I want to
prepare an API change.
2016-11-09 11:39:11 +01:00
Max Kellermann
b9f64fe19b output/haiku: embed "format" into the HaikuOutput class
Avoid one level of dynamic allocation.
2016-11-09 11:36:38 +01:00
Max Kellermann
dd072912e8 output/solaris: migrate from class Error to C++ exceptions 2016-11-09 11:18:19 +01:00
Max Kellermann
9dbdc75689 output/httpd: migrate from class Error to C++ exceptions 2016-11-09 08:40:10 +01:00
Max Kellermann
dce211dbba output/sles: migrate from class Error to C++ exceptions 2016-11-09 08:35:35 +01:00
Max Kellermann
b4e5fa5c1b output/roar: migrate from class Error to C++ exceptions 2016-11-09 08:29:44 +01:00
Max Kellermann
f12fa7e20a output/shout: migrate from class Error to C++ exceptions 2016-11-08 15:40:19 +01:00
Max Kellermann
96f8f1da0c output/OpenAL: migrate from class Error to C++ exceptions 2016-11-08 15:19:30 +01:00
Max Kellermann
db7eec042e output/sndio: migrate from class Error to C++ exceptions 2016-11-08 15:15:16 +01:00
Max Kellermann
52aed3f8a1 output/jack: migrate from class Error to C++ exceptions 2016-11-08 15:11:21 +01:00
Max Kellermann
cadd186f1b output/jack: use AtScopeExit() 2016-11-08 15:10:38 +01:00
Max Kellermann
dd9ab16d67 output/recorder: migrate from class Error to C++ exceptions 2016-11-07 09:48:10 +01:00
Max Kellermann
d8b6aff23a encoder: migrate from class Error to C++ exceptions 2016-11-07 09:25:51 +01:00
Max Kellermann
b8aac3f8fc output/Thread: catch and log send_tag() exceptions 2016-11-07 09:25:47 +01:00
Max Kellermann
4aab97ccb1 config/Path: throw std::runtime_error on error 2016-11-07 09:07:50 +01:00
Max Kellermann
4cd21f1e07 decoder/Control: throw exception on Seek() error 2016-11-07 09:05:28 +01:00
Max Kellermann
403f0f8c64 SongLoader, ...: include cleanup 2016-11-07 09:01:57 +01:00
Max Kellermann
8c4246f2ad net/SocketError: remove obsolete Error functions 2016-11-07 08:58:26 +01:00
Max Kellermann
1859ba5ec8 output/winmm: 8 bit playback is not supported
Everything must be S16.
2016-11-07 08:53:57 +01:00
Max Kellermann
54d5184255 output/winmm: use std::array 2016-11-07 08:50:58 +01:00
Max Kellermann
0c5b986fc4 output/winmm: use range-based "for" 2016-11-07 08:28:41 +01:00
Max Kellermann
7b2cdd618e output/winmm: use AudioOutputWrapper 2016-11-07 08:08:42 +01:00
Max Kellermann
30bb3f1fcb output/winmm: migrate from class Error to C++ exceptions 2016-11-07 07:42:18 +01:00
Max Kellermann
b45ea66175 output/pipe: migrate from class Error to C++ exceptions 2016-11-05 15:24:10 +01:00
Max Kellermann
543c5034af output/fifo: migrate from class Error to C++ exceptions 2016-11-05 15:13:14 +01:00
Max Kellermann
c8aa7afdc6 output/oss: migrate from class Error to C++ exceptions 2016-11-05 13:18:45 +01:00
Max Kellermann
b35bb1b50c output/alsa: use C++ initializers 2016-11-04 11:31:23 +01:00
Max Kellermann
6341be9cdf output/alsa: migrate from class Error to C++ exceptions 2016-11-04 11:31:23 +01:00
Max Kellermann
93a14a93f9 output/alsa: use Error::FormatPrefix() 2016-11-04 11:31:23 +01:00
Max Kellermann
d6559e2ac9 output/Thread: fix wrong error reference in catch clause 2016-11-04 11:31:23 +01:00
Max Kellermann
65e6755b8b output/ao: migrate from class Error to C++ exceptions 2016-11-02 12:36:13 +01:00
Max Kellermann
6ead9750f4 output/pulse: migrate from class Error to C++ exceptions 2016-11-02 11:01:22 +01:00
Max Kellermann
6532c7e089 output/pulse: use C++11 initializers 2016-11-02 11:01:07 +01:00
Max Kellermann
8b3d934230 output/Thread: catch Pause() exceptions 2016-11-02 10:53:43 +01:00
Max Kellermann
e2b7c30811 event/BufferedSocket: pass std::exception_ptr to OnSocketError() 2016-11-02 10:38:05 +01:00
Max Kellermann
c8bb3c0b71 CommandLine: migrate from class Error to C++ exceptions 2016-11-02 10:30:46 +01:00
Max Kellermann
9990e8473c LogInit: migrate from class Error to C++ exceptions 2016-11-02 10:11:17 +01:00
Max Kellermann
d765182bbb config/Global: _get_path() throws exception on error 2016-11-02 10:07:57 +01:00
Max Kellermann
5a63d1d5a4 LogInit: use ConfigParam::GetPath() 2016-11-02 10:07:50 +01:00
Max Kellermann
6d409d27ca lib/icu: migrate from class Error to C++ exceptions 2016-11-02 09:54:13 +01:00
Max Kellermann
e9c2885f34 lib/ffmpeg/Error: remove SetFfmpegError(); it's unused now 2016-10-31 13:18:47 +01:00
Max Kellermann
ecb8f7362b decoder/ffmpeg: copy_interleave_frame() throws exception on error 2016-10-31 13:03:02 +01:00
Max Kellermann
17ccfec358 lib/expat/Parser: remove unused method SetError() 2016-10-29 11:06:28 +02:00
Max Kellermann
a55bb28069 decoder: include cleanup 2016-10-29 11:04:49 +02:00
Max Kellermann
a2e3dc0592 db/Interface: migrate Update() from class Error to C++ exceptions 2016-10-29 10:59:18 +02:00
Max Kellermann
df142d4f61 db/simple: migrate Mount() from class Error to C++ exceptions 2016-10-29 10:56:31 +02:00
Max Kellermann
fac8edd47a db/Interface: migrate visitor methods from class Error to C++ exceptions 2016-10-29 10:42:56 +02:00
Max Kellermann
9a9da7b077 command/Database: use std::unique_ptr 2016-10-29 10:42:56 +02:00
Max Kellermann
131441846b db/Error: remove unused variable db_domain 2016-10-29 10:42:56 +02:00
Max Kellermann
3ff728ab02 db/Visitor: remove the Error parameter
Implementations shall use exceptions instead.
2016-10-29 10:04:43 +02:00
Max Kellermann
78bf4ef5fa db/Configured: migrate from class Error to C++ exceptions 2016-10-29 10:01:50 +02:00
Max Kellermann
318d0b3976 db/simple/Save: move log call to SimpleDatabase::Load() 2016-10-29 10:00:35 +02:00
Max Kellermann
90a14e14f4 db/simple/Save: migrate from class Error to C++ exceptions 2016-10-29 09:45:34 +02:00
Max Kellermann
dea46e8d5a db/Plugin: migrate from class Error to C++ exceptions 2016-10-28 23:15:22 +02:00
Max Kellermann
7e5ce623fe db/simple: throw C++ exception on init error 2016-10-28 23:13:18 +02:00
Max Kellermann
e17805f208 config/Block: GetPath() throws exception on error 2016-10-28 23:08:42 +02:00
Max Kellermann
d8bcdca55a config/Block: rename GetBlockPath() to GetPath() 2016-10-28 23:07:26 +02:00
Max Kellermann
f6f2a3b366 output/alsa: throw C++ exception on init error 2016-10-28 22:56:27 +02:00
Max Kellermann
d52c7e7a1b output/httpd: throw C++ exception on init error 2016-10-28 22:42:10 +02:00
Max Kellermann
c4acccac14 output/Init: add constructor overload which calls Configure() 2016-10-28 22:41:07 +02:00
Max Kellermann
13001c018c AudioParser: throw exception on error 2016-10-28 22:36:04 +02:00
Max Kellermann
1b39efb694 Makefile.am: move a few sources to libbasic.a 2016-10-28 22:31:26 +02:00
Max Kellermann
0c343cb1c3 encoder/Plugin: migrate from class Error to C++ exceptions 2016-10-28 21:29:01 +02:00
Max Kellermann
aead221184 event/ServerSocket: migrate from class Error to C++ exceptions 2016-10-28 21:22:25 +02:00
Max Kellermann
16d1c9f5d6 Main: catch exceptions in all of main() 2016-10-28 21:22:25 +02:00
Max Kellermann
0c464b24ad OutputInit: allow "init" to throw exception 2016-10-28 21:11:52 +02:00
Max Kellermann
a249a630c0 OutputThread: support plugins throwing exceptions 2016-10-28 21:10:18 +02:00
Max Kellermann
f39823eac0 OutputThread: use class ScopeUnlock for exception-safety 2016-10-28 21:10:18 +02:00
Max Kellermann
69de99636f OutputPlugin: update API documentation 2016-10-28 21:10:18 +02:00
Max Kellermann
afcff1fa77 lib/sqlite/Error: add missing include
https://bugs.musicpd.org/view.php?id=4593
2016-10-28 17:46:34 +02:00
Max Kellermann
9b5bae049c config/Param: overload GetPath() throwing exception 2016-10-28 11:53:21 +02:00
Max Kellermann
7a3415166e config/Param: add method GetPath()
Move code from config_parse_path().
2016-10-28 11:45:12 +02:00
Max Kellermann
5b2b4bf13c config/Param: use CamelCase 2016-10-28 11:38:37 +02:00
Max Kellermann
4bd67bc298 db/update/InotifySource: migrate from class Error to C++ exceptions 2016-10-28 10:35:31 +02:00
Max Kellermann
1560749579 db/update/UpdateIO: include cleanup 2016-10-28 10:22:44 +02:00
Max Kellermann
ed68fd4ab3 queue/PlaylistUpdate: include cleanup 2016-10-27 22:19:26 +02:00
Max Kellermann
e9a9dabb49 tag/ApeLoader: include cleanup 2016-10-27 22:18:05 +02:00
Max Kellermann
31faafea9d Client: remove the AllowFile() overload with Error parameter
Unused.
2016-10-27 22:16:05 +02:00
Max Kellermann
6961bd61ca LocateUri: migrate from class Error to C++ exceptions 2016-10-27 22:04:41 +02:00
Max Kellermann
726fc53e62 Client: add AllowFile() overload which throws exception 2016-10-27 22:04:38 +02:00
Max Kellermann
c598686bd9 storage: migrate from class Error to C++ exceptions 2016-10-27 21:35:19 +02:00
Max Kellermann
cab87e9398 storage/FileInfo: make methods "constexpr" 2016-10-27 21:35:19 +02:00
Max Kellermann
680037927d Merge branch 'v0.19.x' 2016-10-27 21:27:19 +02:00
Max Kellermann
ee026386e5 storage/Composite: avoid setting the error twice
If an error has already been set by f.directory->storage->GetInfo(),
don't set it again.
2016-10-27 21:26:55 +02:00
Max Kellermann
60f72f0ff9 command/Storage: use std::unique_ptr 2016-10-27 21:04:40 +02:00
Max Kellermann
debc855806 Merge branch 'v0.19.x' 2016-10-27 21:01:27 +02:00
Max Kellermann
49c04ccfc7 decoder/sidplay: fix playback speed with libsidplayfp
https://bugs.musicpd.org/view.php?id=4577
2016-10-27 20:25:19 +02:00
Max Kellermann
11ba44870b decoder/sidplay: simplify seek loop 2016-10-27 20:25:12 +02:00
Max Kellermann
f9a64d24bf storage/Composite: eliminate the second FindStorage() overload
It was used in a wrong way, which did not deal with errors
consistently.  And if that's wrong, there is no need for FindStorage()
at all - let's remove it and the confusion around it.
2016-10-27 19:55:20 +02:00
Max Kellermann
e1a8dcfcc8 storage/Composite: add FindStorage() API documentation 2016-10-27 19:55:08 +02:00
Max Kellermann
1ee0e29974 storage/Composite: fix documentation typo 2016-10-27 17:12:24 +02:00
Max Kellermann
10e32454ef lib/sqlite, sticker: migrate from class Error to C++ exceptions 2016-10-27 07:50:08 +02:00
Max Kellermann
8d41e9658f Instance: remove Error parameter from GetDatabase() 2016-10-26 18:52:00 +02:00
Max Kellermann
086652dd50 Instance: add GetDatabaseOrThrow() 2016-10-26 18:47:19 +02:00
Max Kellermann
77a9940461 decoder/ffmpeg: ignore empty packets
An empty packet would be a command for avcodec_send_packet() to
finalize the codec.

Fixes https://bugs.musicpd.org/view.php?id=4588
2016-10-26 18:29:07 +02:00
Max Kellermann
9c1c180ae0 tag/Item: declare value[] to have only one element
By declaring the variable-length array to have a nominal size of 1,
struct TagPoolSlot shrinks from 24 bytes to 16 bytes, because "ref"
and "item" now both fit in one machine word.
2016-10-26 18:26:01 +02:00
Max Kellermann
06682bd2a9 tag/Item: remove "packed" attribute, add static_assert on alignment instead
The "packed" attribute triggers a clang 4.0 warning, and it's not
necessary.  All we want is correct allocation of this
dynamically-sized struct.
2016-10-26 18:24:16 +02:00
Max Kellermann
6135f0763b playlist/cue/CueParser: update API documentation 2016-10-26 17:07:52 +02:00
Max Kellermann
307964d874 android/build.py: always build with clang
Support for GCC has been dropped from NDK r13.  Let's switch
everything to clang before they really remove GCC completely.
2016-10-26 17:00:17 +02:00
Max Kellermann
f3dd50de87 python/build/ffmpeg: disable clang's integrated assembler
Causes compatibility problems, because FFmpeg expects the GNU as
syntax.

This FFmpeg bug report has some information, but it was closed as
"invalid": https://trac.ffmpeg.org/ticket/5158
2016-10-26 17:00:17 +02:00
Max Kellermann
c776bcc5f6 android/build.py: drop LLVM version from path
For Android NDK r13.
2016-10-26 17:00:17 +02:00
Max Kellermann
4bbc43d91a android/build.py: pass architecture/CPU flags to the linker 2016-10-26 17:00:17 +02:00
Max Kellermann
db8b5dc698 python/build/zlib: don't use DESTDIR
DESTDIR is for installing to a chroot, but this is not one.  Instead,
we want real absolute paths in the pkg-config file.
2016-10-26 17:00:17 +02:00
Max Kellermann
2f56c61b47 python/libs: upgrade Boost to 1.62 2016-10-26 17:00:17 +02:00
Max Kellermann
1d340e7664 python/libs: upgrade CURL to 7.50.3 2016-10-26 17:00:17 +02:00
Max Kellermann
ea62bc0bb2 python/libs: upgrade FFmpeg to 3.1.5 2016-10-26 17:00:17 +02:00
Max Kellermann
8380c3be02 python/build/autotools: pass RANLIB to configure
Fixes various static library linker failures ("bad extended name entry
at header"), because the wrong "ranlib" was used.
2016-10-26 17:00:17 +02:00
Felix Hädicke
6470bcda19 python/build/autotools: do not use absolute path for autotools 2016-10-26 17:00:17 +02:00
Max Kellermann
2d51349d1d python/build/autotools: move libtoolize call up
autoconf depends on libtoolize.
2016-10-26 17:00:17 +02:00
Max Kellermann
2f2b394d72 fs/StandardDirectory: no /etc/passwd lookups on Android
This doesn't make sense on Android; there is no home directory for
users.
2016-10-26 17:00:17 +02:00
Max Kellermann
ba181ae9df fs/io/FileOutputStream: work around -Wunused 2016-10-26 17:00:17 +02:00
Max Kellermann
f62546ec79 decoder/mad: use C++11 initializers 2016-10-25 18:52:54 +02:00
dennisschagt
7c251fe190 Fix comment in mpdconf.example ("can setting can" -> "setting can") 2016-10-20 15:02:36 +02:00
hawken
1c155a0d03 Fix for TextInputStream consuming file without producing lines 2016-10-12 12:19:04 +02:00
hawken
8f196db778 Fix for segfault on uninitialized state_file 2016-10-12 12:18:44 +02:00
Max Kellermann
a85455fb3f configure.ac: prepare for 0.19.20 2016-09-27 22:04:46 +02:00
Yue Wang
d0302d1bbe _delay in output plugin will now ask the thread to repeatedly wait until it returns 0.
change the _delay API doc so that it matches its implementation behavior.
2016-09-19 10:24:56 -07:00
Yue Wang
d73267df5e use osx_output_delay to wait until ring buffer is able to write
This further optimize the performance. 

This is now working properly with a conditional variable bug being fixed (8bbfb5cda1).
2016-09-19 08:51:03 -07:00
Christian Körner
8bbfb5cda1 thread/PosixCond: fix timed_wait
pthread_cond_timedwait() in PosixCond.hxx:timed_wait(PosixMutex...) returns
EINVAL, if ts.tv_nsec >= 1E9. In this case, it returns to early.

Find attached a patch which fixes this. I chose a compare-subtraction method
to keep ts.tv_nsec below 1E9.

Another option would be
ts.tv_sec += ts.tv_nsec / 1000000000;
ts.tv_nsec %= 1000000000;

But I guess this takes more time on some ARM processors, which don't support
hardware division.
2016-09-19 11:21:21 +02:00
Yue Wang
1e17d5b1cc Update doc for new core audio plugin features. 2016-09-18 23:51:14 -07:00
Yue Wang
f881917d2f Fix a bug that buffer_frame_size is not properly initialized 2016-09-18 21:09:57 -07:00
Yue Wang
99244f51b0 Remove unused imports 2016-09-18 19:40:55 -07:00
Yue Wang
606d029ed9 Kill mutex and locks in osx_render. Improve performance. Also fix an initialization problem 2016-09-18 19:40:04 -07:00
Yue Wang
e4b9d679fb options for sample rate syncing and device hogging 2016-09-18 19:12:45 -07:00
Yue Wang
2bf2bd8932 Add myself to authors 2016-09-18 13:33:48 -07:00
Yue Wang
4a8a33ea85 Hogging is for user selected device only.
do not hog system device.
2016-09-18 13:15:46 -07:00
Yue Wang
ac4b83046a Add sample rate synchronization and device hogging to core audio plugin
which ensures mpd do bit perfect playback on OS X
2016-09-18 12:52:08 -07:00
Max Kellermann
2a2ac35b98 decoder/ffmpeg: FfmpegOpenInput() throws exception on error 2016-09-16 18:49:22 +02:00
Max Kellermann
8c744efd56 input/InputStream: migrate from class Error to C++ exceptions 2016-09-16 17:43:36 +02:00
Max Kellermann
597e59f10d input/thread: use C++ exceptions instead of class Error 2016-09-16 17:43:32 +02:00
Max Kellermann
3cd07d0b54 input/thread: use class ScopeLock and ScopeUnlock 2016-09-16 17:43:32 +02:00
Max Kellermann
13259225c2 input/async: eliminate attribute "postponed_error"
Switch the remaining users to "postponed_exception".
2016-09-16 17:43:32 +02:00
Max Kellermann
7acd91331c input/curl: use C++ exceptions instead of class Error 2016-09-16 17:43:32 +02:00
Max Kellermann
0fdaca17a2 input/alsa: use C++ exceptions instead of class Error 2016-09-16 17:43:32 +02:00
Max Kellermann
539c0ed171 {input,storage}/nfs: use C++ exceptions instead of class Error 2016-09-16 17:43:32 +02:00
Max Kellermann
553365b942 Log: add std::exception_ptr overloads 2016-09-16 17:43:32 +02:00
Max Kellermann
100308db02 db/update: catch exceptions from Storage plugins 2016-09-16 17:43:32 +02:00
Max Kellermann
ab967462e6 tag/{ApeLoader,Id3Load}: catch InputStream exceptions 2016-09-16 17:37:22 +02:00
Max Kellermann
1bc553ea62 decoder/DecoderAPI: catch InputStream::Read() exceptions 2016-09-16 17:34:53 +02:00
Max Kellermann
687ea53616 input/nfs: use class ScopeUnlock 2016-09-16 16:51:36 +02:00
Max Kellermann
220d9528a3 archive/Plugin: migrate open() from class Error to C++ exceptions 2016-09-09 18:36:36 +02:00
Max Kellermann
fc7d3f64c0 input/Plugin: migrate open() from class Error to C++ exceptions 2016-09-09 18:15:01 +02:00
Max Kellermann
63ab7767a3 event/Call: rethrow exceptions in calling thread 2016-09-09 18:14:21 +02:00
Max Kellermann
20894d1c5e playlist/SoundCloud: use AtScopeExit() 2016-09-09 18:04:11 +02:00
Max Kellermann
2f03d2234a playlist/SoundCloud: use std::string 2016-09-09 18:01:36 +02:00
Max Kellermann
dadf3d846b playlist/SoundCloud: implicit SoundCloudJsonData initialization 2016-09-09 18:01:01 +02:00
Max Kellermann
941a9284b9 playlist/SoundCloud: rename struct parse_data to SoundCloudJsonData 2016-09-09 18:00:26 +02:00
Max Kellermann
4ee3820bd6 playlist/SoundCloud: make parse_callbacks constexpr 2016-09-09 17:59:42 +02:00
Max Kellermann
c155df5d79 playlist/SoundCloud: use ScopeLock 2016-09-09 17:59:07 +02:00
Max Kellermann
33b70567c8 input/alsa: use AtScopeExit() 2016-09-09 17:12:52 +02:00
Max Kellermann
720bf51ba6 input/alsa: simplify OpenDevice(), merge redundant recovery code 2016-09-09 17:12:52 +02:00
Max Kellermann
26bdb72428 input/Init: set input_plugins_enabled
Got lost in commit 6ed77f2a27
2016-09-09 17:12:52 +02:00
Max Kellermann
90c8a1b1cf input/archive: use AtScopeExit() for exception-safety 2016-09-09 16:32:11 +02:00
Max Kellermann
3143dbf3dc input/Open: use ScopeLock 2016-09-09 16:11:51 +02:00
Max Kellermann
38d587aaeb decoder/wavpack: wavpack_open_wvc() returns InputStreamPtr
Let std::unique_ptr manage both the InputStream and the WavpackInput.
2016-09-09 16:04:57 +02:00
Max Kellermann
fe9bafa741 decoder/wavpack: use AtScopeExit() for exception-safety 2016-09-09 15:55:58 +02:00
Max Kellermann
8092e18158 input/async: add attribute "postponed_exception"
Will replace "postponed_error".
2016-09-09 15:41:09 +02:00
Max Kellermann
6ed77f2a27 input/Plugin: migrate init() from class Error to C++ exceptions 2016-09-09 15:16:47 +02:00
Max Kellermann
a73688a2be input/Plugin: remove InitResult::UNAVAILABLE, throw PluginUnavailable instead 2016-09-09 15:11:52 +02:00
Max Kellermann
e7d327226a mixer: migrate to C++ exceptions 2016-09-09 14:44:15 +02:00
Max Kellermann
ae1eb9ccde pcm/Convert: migrate from class Error to C++ exceptions 2016-09-09 14:44:13 +02:00
Max Kellermann
860064c812 output/pulse: use a RTTI lock guard
Make all the locks exception-safe.
2016-09-09 14:36:24 +02:00
Max Kellermann
845901ab01 decoder/Internal: convert error from Error to std::exception_ptr 2016-09-08 20:56:05 +02:00
Max Kellermann
25f7360264 decoder/Thread: throw InputStream::Open() errors
Code simplification.
2016-09-08 20:54:55 +02:00
Max Kellermann
78ec7d0fe1 decoder/Thread: throw StopDecoder on DecoderCommand::STOP 2016-09-08 20:54:55 +02:00
Max Kellermann
a1e9678b69 decoder/Thread: std::throw_with_nested() to wrap caught exception 2016-09-08 20:54:55 +02:00
Max Kellermann
be5d629c13 Log: recognize class Error as nested exception 2016-09-08 20:54:55 +02:00
Max Kellermann
957b399e90 decoder/Thread: call FlushChunk() using AtScopeExit()
Be exception-safe.
2016-09-08 20:41:44 +02:00
Max Kellermann
5e6c164b9f decoder/Internal: use C++11 initializers 2016-09-08 20:34:39 +02:00
Max Kellermann
5d9a889190 decoder/Thread: throw C++ exceptions on error 2016-09-08 20:26:40 +02:00
Max Kellermann
a9acc9c971 decoder/Thread: catch C++ exceptions from the decoder plugin 2016-09-08 19:24:15 +02:00
Max Kellermann
308010794a decoder/Control: convert error from Error to std::exception_ptr
Prepare full C++ exception support in the decoder thread.
2016-09-08 17:16:03 +02:00
Max Kellermann
0ce72cbf9d player/Control: convert error from Error to std::exception_ptr
Prepare full C++ exception support in the player thread.
2016-09-08 12:15:14 +02:00
Max Kellermann
6e52ab285a player/Control: use class Error as C++ exception, throw it 2016-09-08 12:07:22 +02:00
Max Kellermann
3da4648112 command/Player: restore "single" mode using AtScopeExit() 2016-09-08 12:07:22 +02:00
Max Kellermann
1897409476 player/Control: update API documentation 2016-09-08 12:07:22 +02:00
Max Kellermann
c60d65dd8f command/All: catch class Error 2016-09-08 12:07:22 +02:00
Max Kellermann
f29949e14d command/Error: support class Error as C++ exception 2016-09-08 10:34:02 +02:00
Max Kellermann
75aa98ddaa command/Error: merge the two try/catch blocks 2016-09-08 10:34:02 +02:00
Max Kellermann
06909f4f00 util/Error: remove explicit move constructor, allow copying
The C++ compiler will auto-generate move and copy
constructors/operators for us.
2016-09-08 10:34:02 +02:00
Max Kellermann
aca081557a queue/PlaylistControl: use PlaylistError::NotPlaying() 2016-09-05 20:37:24 +02:00
Max Kellermann
a71efacd1e queue/PlaylistControl: fix return value in PlayNext(), PlayPrevious()
Failure must be indicated by returning false.
2016-09-05 19:21:23 +02:00
Max Kellermann
871063dab7 neighbor/Plugin: migrate from class Error to C++ exceptions 2016-09-05 11:37:58 +02:00
Max Kellermann
135662d6b0 lib/smbclient/Init: throw std::runtime_error on error 2016-09-05 11:32:20 +02:00
Max Kellermann
a69c3c1848 neighbor/Glue: support C++ exceptions 2016-09-05 11:31:23 +02:00
Max Kellermann
50e5244e25 input/Init: support C++ exceptions 2016-09-05 11:28:05 +02:00
Max Kellermann
1c07f197de Filter/Plugin: migrate from class Error to C++ exceptions 2016-09-04 20:07:05 +02:00
Max Kellermann
13c32111a0 Filter/Internal: migrate from class Error to C++ exceptions 2016-09-04 19:38:41 +02:00
Max Kellermann
28c6975732 filter/AutoConvert: use std::unique_ptr 2016-09-04 19:36:50 +02:00
Max Kellermann
12091fcfb1 thread/Util: throw exception on error 2016-09-04 15:15:11 +02:00
Max Kellermann
5598826eaf thread/Util: un-inline the functions
Reduce header clutter.
2016-09-04 15:11:56 +02:00
Max Kellermann
3fea624cca output/Thread: use Close() after error in ReopenFilter()
Now that CloseFilter() may be called again, we can reduce code
duplication.
2016-09-04 15:09:51 +02:00
Max Kellermann
9007dd9ab7 output/Thread: clear Filter pointers in CloseFilter()
This allows calling CloseFilter() multiple times.
2016-09-04 15:09:05 +02:00
Max Kellermann
08166cf330 output/Internal: initialize the Filter pointers
With the configuration "replay_gain_handler none", the Filter pointers
are never initialized, which can crash MPD.

 https://bugs.musicpd.org/view.php?id=4571
2016-09-04 15:05:42 +02:00
Max Kellermann
e51b6a6233 Filter/Internal: remove outdated API documentation 2016-09-04 14:42:27 +02:00
Max Kellermann
3887465d80 Log: add FormatError() overload with std::exception 2016-09-04 14:34:47 +02:00
Max Kellermann
d84f96a571 fs/io/FileOutputStream: add mode CREATE_VISIBLE 2016-09-04 13:16:37 +02:00
Max Kellermann
f600e226da fs/io/FileOutputStream: add mode APPEND_OR_CREATE 2016-09-04 13:16:33 +02:00
Max Kellermann
d775f13a03 fs/io/FileOutputStream: merge all classes into one, add enum Mode
Prepare to add more modes.
2016-09-04 12:57:41 +02:00
Max Kellermann
b630afdeda fs/io/BufferedOutputStream: add wchar_t overloads 2016-09-04 12:57:41 +02:00
Max Kellermann
c39c259078 fs/io/BufferedOutputStream: add Write(char) 2016-09-04 12:57:41 +02:00
Max Kellermann
a571c4ba33 tag/Item: remove "packed" attribute, add static_assert on alignment instead
The "packed" attribute triggers a clang 4.0 warning, and it's not
necessary.  All we want is correct allocation of this
dynamically-sized struct.
2016-09-04 12:57:41 +02:00
Max Kellermann
889be6e29d fs/io/FileReader: add methods GetSize(), GetPosition() 2016-08-27 12:20:59 +02:00
Max Kellermann
d15f64ae5d fs/io/BufferedReader: add method Reset() 2016-08-27 12:09:57 +02:00
Max Kellermann
a07117ea55 fs/io/FileReader: add method Rewind() 2016-08-27 12:09:17 +02:00
Max Kellermann
d0dae177cf Merge tag 'v0.19.19'
release v0.19.19
2016-08-23 10:27:39 +02:00
Max Kellermann
d4db873716 release v0.19.19 2016-08-23 10:19:10 +02:00
Thomas Klausner
de0752fd56 system/ByteOrder: gssupport non-x86 NetBSD 2016-08-23 10:15:54 +02:00
Max Kellermann
4204d4928b decoder/ffmpeg: no avcodec_parameters_to_context() with FFmpeg 3.0
This function exists since FFmpeg 3.1.  Fix a build failure with
FFmpeg 3.0.
2016-08-23 10:15:54 +02:00
Earnestly
e2f6cc9c9f Don't overwrite ss.format
Currently the switch statement is invalidated by ss.format being overwritten
with the default value of PA_SIMPLE_S16NE which results in white noise during
playback as my server is expected S16LE (S16NE).

Signed-off-by: Earnestly <zibeon@gmail.com>
2016-08-23 10:01:56 +02:00
Max Kellermann
05de0ecec3 decoder/ffmpeg: call avcodec_parameters_to_context()
These bug reports describe problems with some FFmpeg codecs:

 https://bugs.musicpd.org/view.php?id=4564
 https://bugs.musicpd.org/view.php?id=4568
 https://bugs.musicpd.org/view.php?id=4572

According to the FFmpeg bug tracker, a call to
avcodec_parameters_to_context() is required after
avcodec_alloc_context3():

 https://trac.ffmpeg.org/ticket/5781

This requirement was previously undocumented.
2016-08-23 09:59:25 +02:00
Max Kellermann
b05beb000f Compiler.h: work around clang 3.9 warning -Wexpansion-to-defined
Check {GCC,CLANG}_VERSION==0 or >0 instead of using defined(), which
may render undefined behavior.
2016-08-23 09:59:25 +02:00
Max Kellermann
093abaad29 Compiler.h: always define CLANG_VERSION 2016-08-23 09:54:09 +02:00
Max Kellermann
e84e4169f9 Compiler.h: remove redundant __GNUC__ check
GCC_VERSION>0 implies defined(__GNUC__).
2016-08-23 09:53:17 +02:00
Max Kellermann
cd6c5cfd4c Compiler.h: exclude clang from GCC_CHECK_VERSION() 2016-08-23 09:52:14 +02:00
Max Kellermann
b855f2fcc2 Chrono: use macro GCC_OLDER_THAN() 2016-08-23 09:51:41 +02:00
Max Kellermann
ba69ade024 Compiler.h: add macro CLANG_OR_GCC_VERSION() 2016-08-23 09:48:58 +02:00
Max Kellermann
8748b2dc3f fs/io/BufferedReader: add ReadFull(size_t) 2016-08-16 12:09:04 +02:00
Max Kellermann
5f66af3712 fs/io/BufferedReader: add missing Consume() call 2016-08-16 11:47:31 +02:00
Max Kellermann
31ae50b137 fs/io/BufferedReader: add method ReadFull() 2016-08-16 08:46:44 +02:00
Max Kellermann
87e0459fcc util/WritableBuffer: add method skip_front() 2016-08-16 08:46:30 +02:00
Max Kellermann
07e58ae64f fs/io/FileReader: add missing include 2016-08-16 07:58:44 +02:00
Max Kellermann
a88d18148c fs/io/FileOutputStream: change #if to #ifdef 2016-08-16 07:49:30 +02:00
Max Kellermann
1cf43a9dc9 fs/io/FileOutputStream: add missing include 2016-08-16 07:49:01 +02:00
Max Kellermann
196ce8426b fs/io/FileOutputStream: decouple from the FileSystem library 2016-08-15 22:42:44 +02:00
Max Kellermann
6a95c34a81 fs/io/FileOutputStream: use C++11 initializers 2016-08-15 22:34:53 +02:00
Max Kellermann
ea0e6d9824 fs/FileSystem: RemoveFile() throws exception on error 2016-08-15 22:25:15 +02:00
Max Kellermann
14d3da0e18 fs/FileSystem: remove unused FOpenModes 2016-08-15 22:21:34 +02:00
Max Kellermann
b6b8fb7d73 PlaylistFile: use TruncateFile()
As a side effect, "playlistclear" no longer creates a new playlist if
the given one doesn't yet exist.
2016-08-15 22:19:55 +02:00
Max Kellermann
2bca3cd247 fs/FileSystem: add TruncateFile() 2016-08-15 22:13:38 +02:00
Max Kellermann
22a353b8e3 event/SignalMonitor: fix obsolete nullptr check in SignalCallback() 2016-08-15 12:40:16 +02:00
Max Kellermann
743fa73a01 Merge branch 'v0.19.x' 2016-08-15 12:33:07 +02:00
Max Kellermann
a546bfe7d9 decoder/wildmidi: support libWildMidi 0.4 2016-08-15 10:08:35 +02:00
Max Kellermann
25deae6cc7 decoder/wildmidi: move code to wildmidi_output() 2016-08-15 10:07:08 +02:00
Nils Schneider
62000670e3 Support S24_P32/S32/FLOAT sample formats on Pulse
This is based on a patch from Ian Scott in 2014. It was never committed,
so I figured I'd fix the outstanding issue and resubmit it.

https://www.mail-archive.com/mpd-devel%40musicpd.org/msg00139.html
2016-08-15 10:02:29 +02:00
Max Kellermann
ac49043fbb output/pulse: move variable declaration down 2016-08-15 10:02:22 +02:00
Max Kellermann
37a7ca7f14 configure.ac: prepare for 0.19.19 2016-08-15 10:00:03 +02:00
Jacob Vosmaer
4d6192adcd Use a ScopeLock around condition.wait() 2016-08-07 15:47:21 +02:00
Jacob Vosmaer
9f1ada898e Improve readability of frame completion loop 2016-08-07 14:15:55 +02:00
Jacob Vosmaer
5617521380 Must lock/unlock around wait 2016-08-06 15:25:58 +02:00
Jacob Vosmaer
9835a2545d Do not assume two pops are enough 2016-08-06 15:19:10 +02:00
Jacob Vosmaer
c28cefeeb0 output/osx: wait-free render callback
Closes https://bugs.musicpd.org/view.php?id=4537 .

Removed the 'cancel' function because it violates 'single producer,
single consumer'.
2016-08-06 00:08:10 +02:00
Max Kellermann
afd5b750dc Merge tag 'v0.19.18'
release v0.19.18
2016-08-05 18:51:38 +02:00
Max Kellermann
2b97b124bd release v0.19.18 2016-08-05 18:45:23 +02:00
Max Kellermann
d042ab87da decoder/Thread: delete the InputStream on error
Fixes memory leak after stream failure.  See
https://bugs.musicpd.org/view.php?id=4562
2016-08-05 18:15:30 +02:00
Max Kellermann
588303b78d lib/nfs/Manager: add Compare(ManagedConnection, ManagedConnection)
Required for Boost 1.61, which uses that overload in a BOOST_ASSERT().
2016-08-05 18:06:07 +02:00
Max Kellermann
36704c5e18 Makefile.am: fix "undefined reference" linker error 2016-08-05 17:48:53 +02:00
Max Kellermann
21d747cd36 python/libs: upgrade CURL to 7.50.0 2016-08-02 19:20:47 +02:00
Max Kellermann
ef3494f160 python/libs: upgrade FFmpeg to 3.1.1 2016-08-02 19:20:06 +02:00
Max Kellermann
2dc6c4a496 python/libs: upgrade Opus to 1.1.3 2016-08-02 19:18:59 +02:00
Max Kellermann
5834843b8a decoder/ffmpeg: fix the AVCodecParameters API check
Turns out the libavcodec version numbers are not linear;  the feature
was added in FFmpeg 3.1 commit 998e1b8, libavcodec 57.14.0; but FFmpeg
3.0 has version 57.48.101.  Ouch!
2016-08-02 19:15:23 +02:00
Max Kellermann
2777a23672 Merge branch 'v0.19.x' 2016-07-29 20:25:59 +02:00
Max Kellermann
32afd92d30 doc/user.xml: update c64.org link
https://bugs.musicpd.org/view.php?id=4560
2016-07-29 20:17:02 +02:00
Max Kellermann
762f3afb9d decoder/sidplay: allow building with libsidplayfp instead of libsidplay2
https://bugs.musicpd.org/view.php?id=4558
2016-07-29 19:32:21 +02:00
Max Kellermann
7fb2f15a1a decoder/ffmpeg: check avformat_open_input() return value 2016-07-29 19:32:21 +02:00
Max Kellermann
7456dccd3a decoder/ffmpeg: FfmpegOpenInput() returns Error 2016-07-29 19:32:21 +02:00
Max Kellermann
245f41bb7e decoder/ffmpeg: fix endless recursion in FfmpegScanStream()
Was accidently added by commit cafc266e0
2016-07-29 19:32:21 +02:00
Max Kellermann
9bfb844cfa decoder/sidplay: read the "date" tag 2016-07-29 17:47:08 +02:00
Max Kellermann
d790d3ba3c decoder/sidplay: add GetInfoString() 2016-07-29 17:38:04 +02:00
Max Kellermann
c3dbc92766 decoder/sidplay: use SidTune::getStatus() 2016-07-29 17:31:34 +02:00
Max Kellermann
0bd25f1e17 decoder/sidplay: log detailed error message 2016-07-29 17:04:38 +02:00
Max Kellermann
a4cd7411e8 decoder/sidplay: remove unnecessary error check
The ReSIDBuilder constructor cannot fail.
2016-07-29 17:03:26 +02:00
Max Kellermann
bf276f6235 decoder/sidplay: use SidTune::getStatus() 2016-07-29 16:58:58 +02:00
Max Kellermann
d916890a8f configure.ac: detect libsidplay2 and related with pkg-config
The comment about requiring libtool from 7 years ago is obsolete these
days.
2016-07-29 15:21:38 +02:00
Max Kellermann
071cacc9a4 decoder/sidplay: pass SidTuneMod to get_song_length()
Eliminate duplicate SidTune construction.
2016-07-29 14:56:05 +02:00
Max Kellermann
33f33323af decoder/sidplay: simplify the SidDatabase::length() call 2016-07-29 14:55:58 +02:00
Max Kellermann
388fae2c47 decoder/sidplay: include cleanup 2016-07-29 14:55:28 +02:00
Max Kellermann
9f878b77e9 decoder/sidplay: use class SidDatabase
Remove our own songlength database parser.
2016-07-29 14:55:28 +02:00
Max Kellermann
a547d2aaba decoder/sidplay: use config_param::GetBlockPath() 2016-07-29 14:55:28 +02:00
Max Kellermann
c013026821 decoder/sidplay: make "songlength_file" local 2016-07-29 14:55:28 +02:00
Max Kellermann
96b48a2404 decoder/sidplay: pass parsed path to get_song_length()
Eliminates duplicate ParseContainerPath() call.
2016-07-29 14:55:28 +02:00
Max Kellermann
9612975c2c decoder/sidplay: merge get_container_name() and get_song_num() 2016-07-29 14:55:28 +02:00
Max Kellermann
41bfd45a2e fs/Path: make IsAbsolute() const 2016-07-29 14:55:28 +02:00
Max Kellermann
bbdcbd1f08 fs/Path: add methods GetBase() and GetDirectoryName() 2016-07-29 14:55:28 +02:00
Max Kellermann
6b3c525a9d db/update/ExcludeList: declare exclude_list_domain only if HAVE_GLIB 2016-07-29 14:55:28 +02:00
Max Kellermann
83aed7051c output/shout: rename "encoding" to "encoder"
The user manual specifies "encoder", which is consistent with other
output plugins.  "encoding" should be deprecated.
2016-07-29 10:52:03 +02:00
Max Kellermann
77c6e45e65 Compiler.h: require gcc 4.7 or newer
The ScopeExit library uses C++11 initializers, which gcc 4.6 does not
support.  Let's kill support for this ancient incomplete C++11
compiler, nobody should be using it anymore.
2016-07-29 09:52:23 +02:00
Max Kellermann
8825393660 decoder/ffmpeg: use avcodec_alloc_context3()
This commit suppresses the remaining deprecation warnings with FFmpeg 3.1.
2016-07-29 09:20:36 +02:00
Max Kellermann
2b9246c6ad decoder/ffmpeg: use avcodec_send_packet() and avcodec_receive_frame() on FFmpeg 3.1 2016-07-29 09:20:05 +02:00
Max Kellermann
a9edb4de28 decoder/ffmpeg: use AtScopeExit() for safe cleanup 2016-07-29 09:08:14 +02:00
Max Kellermann
a076ddf38c util/ScopeExit: new utility library
Similar to boost::scope_exit, but fewer include dependencies.
2016-07-29 09:07:58 +02:00
Max Kellermann
0c809fbb40 Merge branch 'v0.19.x' 2016-07-29 09:00:20 +02:00
Max Kellermann
cafc266e0b decoder/ffmpeg: merge avformat_close_input() calls 2016-07-28 20:38:07 +02:00
Max Kellermann
a3d020eff9 decoder/ffmpeg: use AVCodecParameters on FFmpeg 3.1
The AVCodecContext attribute is deprecated.
2016-07-28 19:50:25 +02:00
Max Kellermann
8412d94d05 decoder/ffmpeg: add GetCodecParameters()
Preparing for FFmpeg 3.1 support.
2016-07-28 19:49:47 +02:00
Max Kellermann
d1c5bb956a decoder/ffmpeg: move code to IsAudio() 2016-07-28 19:49:45 +02:00
Max Kellermann
70986bc120 decoder/ffmpeg: move code to FfmpegSendFrame() 2016-07-28 19:49:18 +02:00
Max Kellermann
f31fe8b865 decoder/ffmpeg: include cleanup 2016-07-28 19:49:17 +02:00
Max Kellermann
142a9fe530 decoder/ffmpeg: move code to pcm/Interleave.cxx 2016-07-28 19:49:13 +02:00
Max Kellermann
4dd2ad9b27 decoder/ffmpeg: check for commands earlier
Improve initial seek by not reading/decoding the first frame before
checking for the seek command.
2016-07-28 19:48:27 +02:00
Max Kellermann
62f7375804 decoder/ffmpeg: simplify mpd_ffmpeg_open_input() 2016-07-28 19:48:25 +02:00
Max Kellermann
543296b5ba decoder/ffmpeg: move code to lib/ffmpeg/Init.cxx 2016-07-28 19:48:22 +02:00
Max Kellermann
5fee130d00 decoder/ffmpeg: move code to lib/ffmpeg/LogCallback.cxx 2016-07-28 19:47:49 +02:00
Max Kellermann
073facea70 decoder/ffmpeg: remove obsolete comment 2016-07-28 19:47:47 +02:00
Max Kellermann
dbe3b6eee4 decoder/ffmpeg: convert enums to constexpr 2016-07-28 19:47:36 +02:00
Max Kellermann
df97049647 decoder/ffmpeg: move struct AvioStream to FfmpegIo.hxx 2016-07-28 19:47:31 +02:00
Max Kellermann
42c5f68362 decoder/ffmpeg: use AVStream::duration
Use the duration of the stream we're actually decoding - not the
"global" attribute AVFormatContext::duration which may differ.
2016-07-28 19:47:24 +02:00
Max Kellermann
cc19e760cf decoder/ffmpeg: use more references 2016-07-28 19:45:22 +02:00
Max Kellermann
0ff22a16fa decoder/ffmpeg: move code to lib/ffmpeg/Time.hxx 2016-07-28 19:45:11 +02:00
Max Kellermann
47360ec906 decoder/ffmpeg: use av_free() instead of av_freep() 2016-07-28 19:45:07 +02:00
Max Kellermann
087a9938d2 decoder/ffmpeg: add API documentation 2016-07-28 19:45:05 +02:00
Max Kellermann
26d8e41a6b decoder/ffmpeg: copy_interleave_frame() returns ConstBuffer 2016-07-28 19:45:01 +02:00
Max Kellermann
750ae1d3f3 decoder/ffmpeg: copy_interleave_frame() returns Error 2016-07-28 19:44:42 +02:00
Max Kellermann
f8a9a7a108 decoder/ffmpeg: simplify ffmpeg_send_packet() 2016-07-28 19:44:39 +02:00
Max Kellermann
eb192137d6 decoder/ffmpeg: copy the AVPacket in ffmpeg_send_packet()
Revert commit 70495aad by rewriting it.  Turns out, in old FFmpeg
versions, copying the AVPacket is necessary.
2016-07-28 19:42:25 +02:00
Max Kellermann
c25b464f37 decoder/ffmpeg: move code to class FfmpegBuffer 2016-07-27 17:31:02 +02:00
Max Kellermann
710b48d410 decoder/ffmpeg: log detailed error message 2016-07-27 17:28:12 +02:00
Max Kellermann
5e77a8199d decoder/ffmpeg: remove obsolete comment 2016-07-27 17:28:12 +02:00
Max Kellermann
6637db086b decoder/ffmpeg: add "pure" attributes 2016-07-27 17:28:12 +02:00
Max Kellermann
a271a55da7 decoder/ffpmeg: make variables more local 2016-07-27 17:28:12 +02:00
Max Kellermann
6eeec6cbfa decoder/ffpmeg: simplify ffmpeg_send_packet() 2016-07-27 17:22:13 +02:00
Max Kellermann
5e3f3b0400 decoder/ffpmeg: rename functions to CamelCase 2016-07-27 17:18:58 +02:00
Max Kellermann
923c402f69 decoder/ffmpeg: optimize ffmpeg_scan_dictionary()
Don't scan tag items if the handler doesn't implement the tag()
method.
2016-07-27 17:17:14 +02:00
Max Kellermann
4fed0b991c configure.ac: prepare for 0.19.18 2016-07-27 15:07:15 +02:00
Jacob Vosmaer
ad80acb22a output/osx: remove incorrect memset behavior
In e068d62 I added code that zeros the remainder of the output buffer
if there are not enough input frames available. I have now learned
that we can signal to the caller of the render callback how much data
is in the output buffers. In practice, the input buffer is so large
that it does not matter so much how we handle input buffer underruns,
but I suppose that saying 'there is no data' is better than 'here is
some silence for you'.
2016-07-22 20:58:37 +02:00
Max Kellermann
bd8414f8ea Merge branch 'osx-channelmap' of git://github.com/jacobvosmaer/MPD 2016-07-14 09:19:24 +02:00
Jacob Vosmaer
2eb467c788 Move OS X output docs to doc/user.xml 2016-07-13 22:58:13 +02:00
Max Kellermann
c436e29b89 Makefile.am: check HAVE_OGG for OggDecoder.cxx
Fixes build failure when Vorbis is disabled, but FLAC is enabled
(HAVE_XIPH is true, but HAVE_OGG is false).
2016-07-12 18:10:40 +02:00
Max Kellermann
44219d5e91 decoder/flac: refactor flac_convert() to class FlacPcmImport 2016-07-11 23:34:55 +02:00
Max Kellermann
b9de3270f6 decoder/flac: specialize "stereo" for all bit depths 2016-07-11 23:33:34 +02:00
Max Kellermann
590d6faeb0 decoder/flac: convert flac_convert_*() to templates 2016-07-11 23:27:57 +02:00
Max Kellermann
62e96e9a58 decoder/flac: pass number of frames to flac_convert() 2016-07-11 23:24:48 +02:00
Max Kellermann
1c818ef0a0 decoder/flac: improve warning message about unsupported bit depth 2016-07-11 23:13:33 +02:00
Max Kellermann
d6ce2e3671 decoder/flac: move functions into struct FlacDecoder 2016-07-11 23:11:22 +02:00
Max Kellermann
85b6a52662 decoder/flac: use C++11 initializers 2016-07-11 22:44:39 +02:00
Max Kellermann
0246082b9b decoder/flac: move position code to FlacDecoder::GetDeltaPosition() 2016-07-11 22:38:26 +02:00
Max Kellermann
3b031c6ba5 decoder/flac: throw exception on FLAC__stream_decoder_new() failure 2016-07-11 22:38:03 +02:00
Max Kellermann
74740ca50b decoder/flac: add class FlacStreamDecoder wrapping a FLAC__StreamDecoder* 2016-07-11 22:37:55 +02:00
Max Kellermann
631baa7120 decoder/flac: eliminate redundant FlacDecoder attributes 2016-07-11 22:37:52 +02:00
Max Kellermann
657d6edff7 decoder/flac: add FlacInput getter methods 2016-07-11 22:37:49 +02:00
Max Kellermann
737c5a9549 decoder/flac: rename struct flac_data to FlacDecoder 2016-07-11 22:37:46 +02:00
Max Kellermann
c5fb56f90f test/run_decoder: catch and print C++ exceptions 2016-07-11 22:37:40 +02:00
Jacob Vosmaer
4cd9abe632 output/osx channel_map feature 2016-07-09 18:29:35 +02:00
Max Kellermann
b67e7df38e Merge tag 'v0.19.17'
release v0.19.17
2016-07-09 00:46:09 +02:00
Max Kellermann
f28c746b6b release v0.19.17 2016-07-09 00:40:57 +02:00
Max Kellermann
ab95027fc6 decoder/flac: suppress warning at end of stream
This is required if a stream ands without another chained FLAC file.
2016-07-08 23:19:47 +02:00
Max Kellermann
ed3bc4ab63 decoder/flac: move code to FlacInitAndDecode() 2016-07-08 23:03:49 +02:00
Max Kellermann
68064f1aa6 decoder/flac: move duplicate code to flac_data::Initialize() 2016-07-08 22:44:23 +02:00
Max Kellermann
475ac76a5f decoder/flac: late "total_frames" initialization 2016-07-08 22:43:31 +02:00
Max Kellermann
79d4f8674c decoder/flac: remove "duration" parameter from flac_decoder_initialize()
It's always 0.
2016-07-08 22:41:19 +02:00
Max Kellermann
e42eed4d4c decoder/flac: remove pointless check 2016-07-08 22:41:19 +02:00
Max Kellermann
4a7042e847 decoder/flac: handle unknown duration correctly
If the duration is unknown, pass SignedSongTime::Negative(), as
documented for decoder_initialized().
2016-07-08 22:33:49 +02:00
Max Kellermann
7f36923eb4 decoder/flac: pass SignedSongTime to decoder_initialized() 2016-07-08 22:32:23 +02:00
Max Kellermann
2ca8d69126 decoder/flac: document flac_data::position 2016-07-08 22:20:16 +02:00
Max Kellermann
70367d70c8 decoder/flac: remove obsolete sub-song support
This is obsolete because it has been moved to the MPD core.
2016-07-08 21:59:30 +02:00
Jacob Vosmaer
e068d62ac6 output/osx rewrite render callback 2016-07-08 15:36:42 +02:00
Max Kellermann
e6389ff5a1 client/ClientRead: call Break() before Close()
Referencing the attribute "partition" is illegal after Close(),
because Close() deletes "this".
2016-07-07 13:54:04 +02:00
Max Kellermann
b46cf57d98 event/BufferedSocket: OnSocketReady() returns true after close
Fixes use-after-free bug (https://bugs.musicpd.org/view.php?id=4548).
2016-07-07 13:52:20 +02:00
Max Kellermann
6f59d71e07 decoder/API: check initial_seek_running in _check_cancel_read()
The "seeking" flag is not set for the initial seek, and so
decoder_read() could be canceled when another SEEK was emitted during
initial seek.

This fixes several seek problems, for example the one reported for the
FLAC decoder plugin:

 https://bugs.musicpd.org/view.php?id=4552
2016-07-06 15:46:04 +02:00
Max Kellermann
f9130f42a2 decoder/flac: try to recover from seek error()
libFLAC API documentation suggests that FLAC__stream_decoder_flush()
should be called to recover from FLAC__STREAM_DECODER_SEEK_ERROR.
2016-07-05 19:29:56 +02:00
Max Kellermann
faf2eeaa99 decoder/flac: evaluate all possible FLAC__stream_decoder_get_state() values
Stop after all fatal errors.  This fixes assertion failures in
libFLAC.
2016-07-05 19:27:40 +02:00
Max Kellermann
1c7de0b4ac output/shout: remove pointless memset() call 2016-07-05 18:02:35 +02:00
Max Kellermann
58487e484f filter/route: use PcmSilence() 2016-07-05 18:01:29 +02:00
Max Kellermann
104075f3e0 PlayerThread: use PcmSilence() in SendSilence()
No change for regular PCM, but DSD uses 0x69 now.
2016-07-05 18:01:29 +02:00
Max Kellermann
b8097eaf2e pcm/Volume: move silence pattern to Silence.cxx 2016-07-05 17:52:53 +02:00
Max Kellermann
5eb0cbc887 PlayerThread: make chunk allocation error non-fatal in SendSilence()
Fixes abort after seeking on fast machines.
2016-07-05 17:44:45 +02:00
Max Kellermann
1a4a6f3807 filter/Observer: fix memory leak 2016-07-04 15:25:21 +02:00
Max Kellermann
a012b25335 filter/convert: fix no-op check
Commit 3a212412 changed the meaning of out_audio_format, but I forgot
to apply this to ConvertFilter::FilterPCM().

See https://bugs.musicpd.org/view.php?id=4551
2016-07-04 15:17:03 +02:00
Max Kellermann
46e8b137e9 configure.ac: use $have_ogg, not $enable_ogg
The latter doesn't exist, and this broke Vorbis-only builds.
2016-07-04 13:52:37 +02:00
Max Kellermann
4b25c5e8d6 test/*: add missing includes for fprintf() 2016-07-04 13:52:36 +02:00
Jacob Vosmaer
2fdbae3e1f Remove braces 2016-07-03 16:45:23 +02:00
Jacob Vosmaer
87e06793c2 Get rid of GetMacOSStatusCommentString 2016-07-03 14:06:53 +02:00
Jacob Vosmaer
8cc451a2e2 Use error.Set instead of error.Format 2016-07-03 13:36:35 +02:00
Jacob Vosmaer
723c2c7fa9 Remove some debugging code 2016-07-03 13:18:44 +02:00
Jacob Vosmaer
4dd2c5cdd5 Convert device name from CFStringRef to char* 2016-07-03 12:59:19 +02:00
Jacob Vosmaer
bdc257b40e Add debug statements 2016-07-02 23:44:21 +02:00
Jacob Vosmaer
4728f7c697 Use AudioComponent instead of Carbon Component 2016-07-02 23:35:44 +02:00
Max Kellermann
1c4c0fe8a1 test/WriteFile: add missing include for fprintf() 2016-07-02 14:15:43 +02:00
Max Kellermann
360274a6e9 test/WriteFile: add missing include for EXIT_{SUCCESS,FAILURE} 2016-07-02 14:01:54 +02:00
Max Kellermann
07228ff56a tag/Id3Load: use offset_type instead of off_t 2016-07-02 14:00:52 +02:00
Max Kellermann
a61f153df7 system/Error: add missing include 2016-07-02 13:59:47 +02:00
Max Kellermann
34e91850d9 decoder/pcm: assume that audio/L16 is big-endian
See https://bugs.musicpd.org/view.php?id=4547
2016-07-01 21:34:56 +02:00
Max Kellermann
ba8e579e9b pcm/Volume: use 0x69 to generate DSD silence 2016-07-01 21:22:21 +02:00
Max Kellermann
072e39c9cf filter/ReplayGain: skip PcmVolume if a mixer is set
Previously, volume was applied twice: once by PcmVolume, and again by
the hardware mixer.
2016-07-01 21:17:52 +02:00
Max Kellermann
8dc3f3b21a configure.ac: prepare for 0.19.17 2016-07-01 21:16:14 +02:00
Max Kellermann
3a21241248 filter/FilterInternal: split class Filter, add class PreparedFilter
For easier state management inside filter plugins.
2016-07-01 21:04:24 +02:00
Max Kellermann
5c75096bcd pcm/Volume: remove assert() from destructor
While this assert() was useful when we had to track the object's state
manually, there was no practical purpose other than verifying old
code, and it complicates our new C++ code.
2016-07-01 21:04:24 +02:00
Max Kellermann
a43b0f5253 mixer/software: move Filter management to the AudioOutput 2016-07-01 18:23:53 +02:00
Max Kellermann
d93271e86d mixer/software: use C++11 initializers 2016-07-01 14:06:08 +02:00
Dimitris Papastamos
4a6df9f961 output/sndio: Remove unused attribute
The variable is actually used in this function.
2016-06-24 09:11:36 +02:00
Dimitris Papastamos
a43ae2369b output/sndio: Add 24-bit 4-byte packed audio format support 2016-06-24 09:11:30 +02:00
Dimitris Papastamos
9a049de859 output/sndio: No need to use a loop in Play()
This is a left-over from the previous version of the code
that was retrying on EINTR.
2016-06-24 09:10:57 +02:00
Dimitris Papastamos
58b8398aa0 output/sndio: Use size_t instead of ssize_t
Some minor style fixes as well.
2016-06-23 11:11:42 +02:00
Max Kellermann
645751f680 output/Init: use C++11 initializers 2016-06-22 18:44:00 +02:00
Dimitris Papastamos
2d3b6879f5 doc: Initial sndio documentation 2016-06-22 18:43:44 +02:00
Dimitris Papastamos
26c0924461 sndio: Eliminate remaining goto usage to conform to MPD style 2016-06-22 16:10:46 +02:00
Dimitris Papastamos
d4f801a8e9 sndio: Fix segmentation fault when audio card is removed
This can happen if you remove an external audio card or if you stop
sndiod(8) while playing a song.

sio_write() will retry internally if it fails with errno == EINTR
so no need to handle that.
2016-06-22 16:10:38 +02:00
Dimitris Papastamos
cb1082c58c Add an example of sndio output to mpdconf.example 2016-06-22 16:10:27 +02:00
Dimitris Papastamos
8406864963 sndio: Allow tweaking application buffer size
It defaults to 250 ms.
2016-06-22 16:09:57 +02:00
Max Kellermann
85ef034fd0 filter/ReplayGain: use C++11 initializers 2016-06-22 12:43:47 +02:00
Max Kellermann
59141f62bb filter/route: use std::array 2016-06-22 12:24:55 +02:00
Dimitris Papastamos
d68cadba7b sndio: No need to use a timer so get rid of it 2016-06-22 11:28:58 +02:00
Max Kellermann
1207fd1f16 output/sndio: remove unnecessary initialization 2016-06-22 11:01:37 +02:00
Dimitris Papastamos
8aa61e230c sndio: Add option to select output device 2016-06-22 11:00:06 +02:00
Max Kellermann
2c7bda8a3b output/sndio: define SIO_DEVANY if it is undefined
Fixes build failure on Debian Wheezy.
2016-06-22 10:58:44 +02:00
Dimitris Papastamos
d58c5dd398 sndio: Implement sndio_test_default_device() 2016-06-22 10:54:59 +02:00
Dimitris Papastamos
171da7a347 Add sndio output plugin 2016-06-22 08:44:47 +02:00
Max Kellermann
3fd70a769a event/SignalMonitor: remove unused function SignalMonitorGetEventLoop 2016-06-20 10:48:34 +02:00
Max Kellermann
4280f84535 event/SignalMonitor: use BoundMethod instead of raw function pointer 2016-06-20 10:46:36 +02:00
Max Kellermann
c3d9c32615 util/BindMethod: add nullptr constructor and bool operator 2016-06-20 10:36:37 +02:00
Max Kellermann
a938b609b9 util/BindMethod: document the default constructor 2016-06-20 10:36:09 +02:00
Max Kellermann
d3c7fac606 thread/Thread: throw std::system_error on error 2016-06-17 19:11:20 +02:00
Max Kellermann
fea3f6cc72 thread/Thread: use C++11 initialisers 2016-06-17 19:11:19 +02:00
Max Kellermann
aee5966e1c input/thread: use C++11 initialisers 2016-06-17 19:10:39 +02:00
Max Kellermann
95e53ac0a0 input/alsa: rebase on AsyncInputStream
Use the snd_pcm_t only in the IOThread, and reuse code that is
well-known to work.
2016-06-17 18:36:54 +02:00
Max Kellermann
5d11759f7d input/async: use class DeferredCall 2016-06-17 18:31:58 +02:00
Max Kellermann
829616534e event/DeferredCall: new class supposed to replace DeferredMonitor
Comes with a callback pointer instead of a virtual method, which
allows multiple instances in one class.
2016-06-17 18:26:29 +02:00
Max Kellermann
863f4d8366 util/BindMethod: new utility class for callbacks
Replaces the old BoundMethod template.
2016-06-17 18:20:19 +02:00
Max Kellermann
bdd0c3686d input/async: use class HugeAllocation 2016-06-17 18:06:02 +02:00
Max Kellermann
91769d536d util/HugeAllocator: add class HugeAllocation 2016-06-17 18:01:13 +02:00
Max Kellermann
9500343d85 util/HugeAllocator: add "noexcept" 2016-06-17 17:59:45 +02:00
Max Kellermann
ef053035d0 util/HugeAllocator: throw std::bad_alloc on error 2016-06-17 17:57:40 +02:00
Max Kellermann
35faafb32c python/libs: upgrade CURL to 7.49.1 2016-06-17 17:57:40 +02:00
Max Kellermann
f9fd868b99 python/libs: upgrade FFmpeg to 3.0.2 2016-06-17 17:57:10 +02:00
Max Kellermann
8b903626c2 Merge tag 'v0.19.16'
release v0.19.16
2016-06-13 19:03:59 +02:00
Max Kellermann
faf0c950fe release v0.19.16 2016-06-13 18:59:07 +02:00
Max Kellermann
4ecd325371 decoder/flac: log seek errors 2016-06-13 18:37:45 +02:00
Max Kellermann
021519f295 command/QueueCommands: eliminate duplicate code in handle_addid() 2016-06-13 18:28:03 +02:00
Max Kellermann
e83685d667 Merge branch 'addid-with-pos' of git://github.com/ewollesen/MPD 2016-06-13 18:27:21 +02:00
Eric Wollesen
81a198a76a return id for "addid" with position
Previously the id was being returned only when a position wasn't
specified.
2016-06-13 10:14:20 -06:00
Max Kellermann
5771d67202 player/Thread: cancel outputs before seeking
.. instead of doing it after seeking.  After seeking, the command had
no effect, because CheckDecoderStartup() waits for all outputs to
finish.  This caused a very long delay while seeking and switching
songs (https://bugs.musicpd.org/view.php?id=4534).
2016-06-13 09:13:56 +02:00
Lazaros Koromilas
b2b7974ba0 util/WStringAPI: wcpcpy(3) is not yet supported on OpenBSD/NetBSD
Signed-off-by: Lazaros Koromilas <lostd@2f30.org>
2016-06-12 16:36:17 +02:00
Lazaros Koromilas
f59ca94416 net/Resolver: correct includes for gettaddrinfo(3)
Signed-off-by: Lazaros Koromilas <lostd@2f30.org>
2016-06-12 16:36:17 +02:00
Max Kellermann
22ff0d80ce decoder/pcm: add MIME type "audio/x-mpd-float" 2016-06-10 23:06:21 +02:00
Max Kellermann
5a22a0c27d decoder/pcm: implement RFC 2586 (audio/L16)
https://bugs.musicpd.org/view.php?id=4525
2016-06-10 22:52:35 +02:00
Max Kellermann
287ef181ba util/MimeType: add ParseMimeTypeParameters() 2016-06-10 22:52:35 +02:00
Max Kellermann
bc63810ebd doc/user: mention the "pcm" decoder plugin 2016-06-10 22:52:35 +02:00
Max Kellermann
92cdea123e TagStream, decoder/Thread, ...: ignore MIME type parameters for matching plugins 2016-06-10 22:24:13 +02:00
Max Kellermann
e4c7e343c8 util/StringUtil: use CamelCase 2016-06-10 22:08:13 +02:00
Max Kellermann
6b75be183d m4: update to autoconf-archive 20150925 2016-05-27 15:27:44 +02:00
Max Kellermann
718f6d9cef python/libs: upgrade Boost to 1.61.0 2016-05-27 15:27:44 +02:00
Max Kellermann
2ee43c403c decoder/vorbis: reimplement using class OggDecoder
Use libvorbis instead of libvorbisfile, which gives us more control
over the decoding process.
2016-05-14 12:31:12 +02:00
Max Kellermann
24fa3f5e7b Revert "decoder/Thread: flush last chunk only on success"
This reverts commit 995cd95474.  It was
a bad idea because it caused assertion failures when a decoder plugin
aborted with an exception.
2016-05-14 12:31:12 +02:00
Max Kellermann
bbbda7f812 decoder/opus: move code to new class OggDecoder
Prepare to reuse the same code for a new Vorbis decoder plugin based
on libvorbis instead of libvorbisfile.
2016-05-14 11:31:31 +02:00
Max Kellermann
e958900380 decoder/vorbis: reimplement _scan_stream() with plain libvorbis 2016-05-14 10:52:52 +02:00
Max Kellermann
74926c1dd3 decoder/opus: move _scan_stream() code to OggReadPacket() 2016-05-14 10:39:53 +02:00
Max Kellermann
2654888782 decoder/OggFind: move to lib/xiph/ 2016-05-14 10:34:05 +02:00
Max Kellermann
49597b0e9c Makefile.am: compile OggVisitor.cxx only if libogg is used 2016-05-14 10:34:05 +02:00
Max Kellermann
b5ecfb4c9a decoder/opus: move code to class OggVisitor 2016-05-13 13:37:49 +02:00
Max Kellermann
07fa3764ef lib/xiph/OggStreamState: add wrapper for ogg_stream_reset() 2016-05-13 13:37:45 +02:00
Max Kellermann
5acc77a163 decoder/opus: change return types to void 2016-05-13 13:24:32 +02:00
Max Kellermann
0709878b4c decoder/API: add class StopDecoder 2016-05-13 13:23:24 +02:00
Max Kellermann
662e477028 decoder/opus: throw exceptions instead of returning DecoderCommand::STOP 2016-05-13 13:18:19 +02:00
Max Kellermann
b7b7c381ee decoder/Thread: catch exceptions
Allow decoders to throw std::runtime_error.
2016-05-13 13:01:39 +02:00
Max Kellermann
995cd95474 decoder/Thread: flush last chunk only on success 2016-05-13 13:01:31 +02:00
Max Kellermann
fe8a13f76f decoder/Thread: move code to DecoderUnlockedRunUri() 2016-05-13 13:00:40 +02:00
Max Kellermann
9252432bc0 decoder/opus: move OggSyncState into class MPDOpusDecoder 2016-05-13 12:25:30 +02:00
Max Kellermann
f057f6768f decoder/opus: pass DecoderReader to constructor 2016-05-13 12:16:22 +02:00
Max Kellermann
806bf0be8d decoder/Reader: add methods GetDecoder(), GetInputStream() 2016-05-13 11:27:06 +02:00
Max Kellermann
958506a108 decoder/Reader: change Decoder pointer to reference 2016-05-13 10:40:10 +02:00
Max Kellermann
e8fd771b91 decoder/opus: change Decoder pointers to references 2016-05-13 10:39:36 +02:00
Max Kellermann
fa4178fefa decoder/opus: remove ogg_page parameter from constructor
Initialize the OggStreamState as soon as the first page is seen; no
special code needed in the caller.
2016-05-11 17:57:51 +02:00
Max Kellermann
1af59d31b9 decoder/opus: add method IsInitialized() 2016-05-11 17:27:26 +02:00
Max Kellermann
20758cef30 decoder/opus: make internal methods "private" 2016-05-11 17:27:02 +02:00
Max Kellermann
272938529d decoder/opus: move everything into anonymous namespace 2016-05-11 17:25:43 +02:00
Max Kellermann
a67b7266ed util/AllocatedString: work around bogus gcc6 warning 2016-05-11 17:10:15 +02:00
Max Kellermann
75c8aecffa NEWS: add missing lines 2016-05-11 17:09:46 +02:00
Max Kellermann
f26159a0e3 lib/xiph/OggUtil: move code into class OggSyncState 2016-05-09 16:29:04 +02:00
Max Kellermann
675e8667c2 lib/xiph/OggSyncState: remove unused method ExpectFirstPage() 2016-05-09 16:27:11 +02:00
Max Kellermann
a1a26b70bc decoder/opus: make opus_serialno a local variable 2016-05-09 15:43:15 +02:00
Max Kellermann
34a7f86a07 decoder/opus: use class OggStreamState in _stream_decode() 2016-05-09 15:41:03 +02:00
Max Kellermann
e7311ac2f3 decoder/opus: use C++11 initializers 2016-05-09 15:41:01 +02:00
Max Kellermann
8d9ecc0c62 decoder/opus: make variables more local 2016-05-09 15:41:00 +02:00
Max Kellermann
f01b991108 decoder/opus: use class OggStreamState in _scan_stream() 2016-05-09 15:40:59 +02:00
Max Kellermann
f80736c3d7 lib/xiph/OggStreamState: add method GetSerialNo() 2016-05-09 15:40:50 +02:00
Max Kellermann
2c7f69cf85 lib/xiph/OggStreamState: add constructor with ogg_page 2016-05-09 15:38:29 +02:00
Max Kellermann
348ecc1118 lib/xiph/OggStreamState: add method PageIn() 2016-05-09 15:29:37 +02:00
Max Kellermann
a9678f0ae0 decoder/opus: fix minor typo 2016-05-09 15:00:04 +02:00
Max Kellermann
461f298d2c lib/xiph/OggStream: remove obsolete class 2016-05-09 14:55:58 +02:00
Max Kellermann
068de7cf40 encoder/ogg: use class OggStreamState 2016-05-09 14:51:07 +02:00
Max Kellermann
d04eb87c4f encoder/opus: divert to OggEncoder::Read() 2016-05-09 14:51:05 +02:00
Max Kellermann
8af68db965 lib/xiph/OggStreamState: new ogg_stream_state wrapper 2016-05-09 14:50:39 +02:00
Max Kellermann
1cf632e98b lib/xiph/OggStream: move code to ReadPage() 2016-05-09 14:22:12 +02:00
Max Kellermann
58c11c3128 encoder/vorbis: move vorbis_info_init() call to constructor 2016-05-09 13:22:59 +02:00
Max Kellermann
efcda95dda encoder/vorbis: remove vorbis_info_clear() calls from error code paths
The destructor will call this in any case.
2016-05-09 13:22:43 +02:00
Max Kellermann
80d2028bac encoder/vorbis: merge Clear() into the destructor 2016-05-09 13:22:27 +02:00
Max Kellermann
215213fc2c encoder/vorbis: add wrapper class for vorbis_comment 2016-05-09 12:22:22 +02:00
Max Kellermann
99d32dc0b4 Makefile.am: fix build failure when libxiph.a is not used
Some "ar" implementations don't allow empty archives, and failed to
build it.  The real reason (which is hidden with GNU binutils) is that
our Makefile.am was incorrect, and didn't completely disable
libxiph.a.

See https://bugs.musicpd.org/view.php?id=4526
2016-05-07 22:47:45 +02:00
Max Kellermann
0998097253 encoder/{vorbis,opus}: move common code to class OggEncoder 2016-05-04 18:52:57 +02:00
Max Kellermann
c17be5af6b test/run_encoder: use std::unique_ptr 2016-05-04 18:46:06 +02:00
Max Kellermann
b376536a3b encoder/Interface: convert PreparedEncoder to abstract class 2016-05-04 18:32:52 +02:00
Max Kellermann
e7edc02647 encoder/Interface: move instance methods to abstract class
Rename struct Encoder to PreparedEncoder, and add a new (abstract)
class Encoder which represents one encoder instance.
2016-05-04 16:32:31 +02:00
Max Kellermann
69bf835059 encoder/vorbis: move code into the struct 2016-05-04 16:22:59 +02:00
Max Kellermann
b97ffddfe8 encoder/vorbis: use CamelCase 2016-05-04 16:21:47 +02:00
Max Kellermann
6407b7c591 output/recorder: use C++11 initializers 2016-05-04 15:18:57 +02:00
Max Kellermann
e14cd92d59 output/shout: use AudioOutputWrapper 2016-05-04 15:06:29 +02:00
Max Kellermann
73cadd1798 output/shout: dispose encoder in destructor 2016-05-04 15:05:48 +02:00
Max Kellermann
fb9840f1f8 output/shout: call shout_shutdown() in destructor 2016-05-04 15:03:55 +02:00
Max Kellermann
492aaa3375 output/shout: use C++11 initializers 2016-05-04 14:46:45 +02:00
Max Kellermann
33c5da700d encoder/opus: move functions into the struct 2016-05-03 23:56:47 +02:00
Max Kellermann
48d3af7d9a encoder/opus: use CamelCase 2016-05-03 23:53:42 +02:00
Max Kellermann
9b3470eabd lib/xiph/OggStream: use C++11 initializer 2016-05-03 23:46:56 +02:00
Max Kellermann
86a505b4f3 lib/xiph/OggSyncState: disallow copying 2016-05-03 23:45:32 +02:00
Max Kellermann
ed6c6296eb {de,en}coder/{vorbis,flac,opus}: move several libraries to lib/xiph/ 2016-05-03 23:40:29 +02:00
Max Kellermann
b27a41812f configure.ac: enable HAVE_XIPH if Vorbis/FLAC encoder is enabled 2016-05-03 23:40:21 +02:00
Max Kellermann
6c933d2b77 configure.ac: detect libogg
Will be needed to compile libxiph.a.
2016-05-03 23:31:17 +02:00
Max Kellermann
fb5610f9bd configure.ac: improve HAVE_XIPH declaration, add HAVE_OGG 2016-05-03 13:01:23 +02:00
Max Kellermann
7adbd00811 decoder/{vorbis,flac,opus}: move OggCodec.cxx to libxiph.a 2016-05-03 12:54:47 +02:00
Max Kellermann
1c91d19163 decoder/OggUtil: pass Reader instance to OggFeed() 2016-05-03 00:05:31 +02:00
Max Kellermann
f491135318 decoder/Reader: new Reader implementation 2016-05-03 00:05:31 +02:00
Max Kellermann
a7ced00520 input/Reader: new Reader implementation wrapping InputStream 2016-05-03 00:05:31 +02:00
Max Kellermann
be3359fc67 Makefile.am: fix library link order 2016-05-03 00:05:31 +02:00
Max Kellermann
69ed35ed71 test/{run_input,dump_text_file}: use class ScopeLock 2016-05-02 23:35:43 +02:00
Max Kellermann
280d35a053 decoder/api: use class ScopeLock 2016-05-02 23:33:08 +02:00
Max Kellermann
eca6b9f0af thread/Mutex: add method ScopeLock::Unlock() 2016-05-02 23:32:44 +02:00
Max Kellermann
aa5d05eaa4 configure.ac: don't suppress GLib warnings by changing -I to -isystem
This is a kludge which may break system include path order, see
https://bugs.musicpd.org/view.php?id=4524
2016-05-02 22:05:21 +02:00
Max Kellermann
15735552f4 Makefile.am: include doc/include/tags.xml in tarball
See https://bugs.musicpd.org/view.php?id=4523
2016-05-02 09:03:54 +02:00
Max Kellermann
d6d9dc9d95 Makefile.am: include scripts/*.rb in tarball
Fix out-of-tree build by prepending $(srcdir)/, and change *.sh to
*.rb.
2016-05-02 08:58:17 +02:00
Max Kellermann
dc57966dc3 configure.ac: prepare for 0.19.16 2016-05-02 08:57:53 +02:00
Max Kellermann
cc9345e703 encoder/wave: use CamelCase 2016-04-30 14:29:14 +02:00
Max Kellermann
3fb8f3ec95 Merge tag 'v0.19.15'
release v0.19.15
2016-04-30 14:28:25 +02:00
Max Kellermann
04ed50fb0f release v0.19.15 2016-04-30 14:21:52 +02:00
Max Kellermann
c9553411bb encoder/wave: add constant WAVE_FORMAT_PCM 2016-04-30 13:57:09 +02:00
Max Kellermann
62221adf55 encoder/wave: fix indent 2016-04-30 13:45:52 +02:00
Max Kellermann
a6bf4746c6 test/test_byte_reverse: use gcc_alignas() for gcc<4.8 compatibility 2016-04-30 13:41:24 +02:00
Michael Cree
72637d00e8 Bug#822848: mpd FTBFS on Alpha; misaligned arrays in the test suite
Source: mpd
Version: 0.19.14-2
Severity: important
Justification: fails to build form source (but built in the past)
Tags: patch
User: debian-alpha@lists.debian.org
Usertags: alpha

mpd FTBFS on Alpha with a failure in the test suite [1]:

FAIL: test/test_byte_reverse
============================

.F...

!!!FAILURES!!!
Test Results:
Run:  4   Failures: 1   Errors: 0

1) test: ByteReverseTest::TestByteReverse2 (F) line: 58 test/test_byte_reverse.cxx
assertion failed
- Expression: strcmp(result, (const char *)dest) == 0

This occurs because the test suite (in test/test_byte_reversal.cxx)
allocates static char arrays and passes the char arrays to functions
whose respective arguments were declared to be uint16_t *, etc., in
the main code.

This is in the realm of undefined behaviour on architectures with
strict memory alignment requirements.  Although the test only fails
on Alpha (because Alpha has a particular CPU load instruction that
gcc likes to use to add bugs ..., ahem,  optimise the code on the
assumption of alignment) it is potentially a latent bug for other
architectures with strict alignment requirements.

Since the code is compiled with the c++11 standard I attach a patch
that modifies the test suite to align the non-compliant strings with
the alignas() attribute.  The test suite now passes on Alpha with
that patch.

Cheers
Michael

[1] https://buildd.debian.org/status/fetch.php?pkg=mpd&arch=alpha&ver=0.19.14-2&stamp=1461542099
2016-04-28 13:29:41 +02:00
Florian Schlichting
27d4b15925 DecoderBuffer: add missing include
> In file included from src/decoder/DecoderBuffer.cxx:21:0:
> src/decoder/DecoderBuffer.hxx:41:20: error: 'uint8_t' was not declared in this scope
>   DynamicFifoBuffer<uint8_t> buffer;
>                     ^
> src/decoder/DecoderBuffer.hxx:41:27: error: template argument 1 is invalid
>   DynamicFifoBuffer<uint8_t> buffer;
>                            ^
> src/decoder/DecoderBuffer.hxx: In member function 'void DecoderBuffer::Clear()':
> src/decoder/DecoderBuffer.hxx:61:10: error: request for member 'Clear' in '((DecoderBuffer*)this)->DecoderBuffer::buffer', which is of non-class type 'int'
>    buffer.Clear();
>           ^
> src/decoder/DecoderBuffer.hxx: In member function 'size_t DecoderBuffer::GetAvailable() const':
> src/decoder/DecoderBuffer.hxx:78:17: error: request for member 'GetAvailable' in '((const DecoderBuffer*)this)->DecoderBuffer::buffer', which is of non-class type 'const int'
>    return buffer.GetAvailable();
>                  ^
> src/decoder/DecoderBuffer.hxx: In member function 'ConstBuffer<void> DecoderBuffer::Read() const':
> src/decoder/DecoderBuffer.hxx:87:19: error: request for member 'Read' in '((const DecoderBuffer*)this)->DecoderBuffer::buffer', which is of non-class type 'const int'
>    auto r = buffer.Read();
>                    ^
> src/decoder/DecoderBuffer.hxx:88:27: error: could not convert '{<expression error>, <expression error>}' from '<brace-enclosed initializer list>' to 'ConstBuffer<void>'
>    return { r.data, r.size };
>                            ^
> src/decoder/DecoderBuffer.hxx: In member function 'void DecoderBuffer::Consume(size_t)':
> src/decoder/DecoderBuffer.hxx:105:10: error: request for member 'Consume' in '((DecoderBuffer*)this)->DecoderBuffer::buffer', which is of non-class type 'int'
>    buffer.Consume(nbytes);
>           ^

This seems to be caused by a lacking include, fixed by the below patch.

I'm unsure what made this appear now, though, compiler and toolchain
libraries seem to be the same upstream versions that built 0.19.14-1
just fine in late March.
2016-04-25 08:30:27 +02:00
Max Kellermann
7a77767e66 doc/mpd.conf.5: move metadata_to_use to the user manual 2016-04-22 10:48:12 +02:00
Max Kellermann
1b26621860 doc/{user,protocol}: add a list of supported tags
A complete list which replaces the incomplete list in the mpd.conf
manpage.
2016-04-22 10:48:12 +02:00
Max Kellermann
3db5f4d0aa doc/mpd.conf.5: remove obsolete metadata_to_use sentence 2016-04-22 10:38:24 +02:00
Max Kellermann
b2a6e327bf doc: migrate to DocBook 4.5 2016-04-22 10:04:29 +02:00
Florian Schlichting
9aec5fe907 doc/user: fix typo 2016-04-22 09:25:17 +02:00
Max Kellermann
fc3e0dfcd1 fs/AllocatedPath: add method FromUTF8Throw() 2016-04-21 14:27:32 +02:00
Max Kellermann
6513ff92a7 fs/Charset: throw exception on error 2016-04-21 14:23:55 +02:00
Max Kellermann
a0eb6d0976 PlaylistFile: use the new AllocatedPath::FromFS() range overload 2016-04-21 14:22:59 +02:00
Max Kellermann
7530770842 fs/AllocatedPath: add FromFS() with pointer range 2016-04-21 14:21:24 +02:00
Max Kellermann
11ea72e240 fs/AllocatedPath: make constructor "explicit" 2016-04-21 14:20:56 +02:00
Max Kellermann
c98330909a db/update/Walk: use AllocatedPath methods instead of PathTraitsFS 2016-04-21 14:15:01 +02:00
Max Kellermann
bec6fa4ad7 lib/icu/Converter: throw exception on error 2016-04-21 14:03:27 +02:00
Max Kellermann
ac7ce73526 player/Thread: cancel audio when decoder startup on seek fails
Fixes assertion failure in MultipleOutputs::Open() after seeking to a
failing song during playback.
2016-04-21 14:03:27 +02:00
Max Kellermann
4c6619e6c5 output/MultipleOutputs: use C++11 initializers 2016-04-21 13:28:31 +02:00
Max Kellermann
e8121fdc11 decoder/Thread: fail decoder_input_stream_open() if STOP is received
Fixes an assertion failure in tag_ape_scan() which is because
decoder_input_stream_open() returns an "unready" InputStream.
2016-04-21 13:15:34 +02:00
Max Kellermann
21f17270a1 lib/icu/Util: UCharFromUTF8() throws on error 2016-04-21 11:20:41 +02:00
Max Kellermann
423cd5900e lib/icu/Util: fold UCharToUTF8Throw() into UCharToUTF8() 2016-04-21 10:58:21 +02:00
Max Kellermann
b9f535cd49 lib/icu/Win32: throw exception on error 2016-04-21 10:15:40 +02:00
Max Kellermann
c731a82b71 decoder/opus: limit the number of packets in _scan_stream() 2016-04-19 13:08:07 +02:00
Max Kellermann
e6fad97edc decoder/opus: support bigger OpusTags packets
Required for OpusTags packets which contain artwork.

See https://bugs.musicpd.org/view.php?id=4520
2016-04-19 13:05:42 +02:00
Max Kellermann
e228144159 command/playlist: eliminate spl_print() calls
playlist_file_print() already handles stored playlists.  spl_print()
is never called with a successful result.
2016-04-13 19:47:41 +02:00
Max Kellermann
9431a7b022 playlist/Any: fix documentation typo 2016-04-13 19:23:14 +02:00
Max Kellermann
cd041f8574 decoder/Plugin: container_scan() returns AllocatedString 2016-04-13 12:23:10 +02:00
Max Kellermann
8ba3378096 util/AllocatedString: add operator==(nullptr) 2016-04-13 12:23:10 +02:00
Max Kellermann
225984822d lib/icu/Win32: use std::unique_ptr 2016-04-13 11:53:35 +02:00
Max Kellermann
01b68db30e lib/icu/Converter: Create() throws exception on error 2016-04-13 10:04:19 +02:00
Max Kellermann
33fdaa5b6d Merge branch 'v0.19.x' 2016-04-13 10:03:40 +02:00
Max Kellermann
70495aada1 decoder/ffmpeg: don't copy the AVPacket in ffmpeg_send_packet()
Reduce some overhead.  It is not necessary to copy the object.
2016-04-13 09:04:51 +02:00
Max Kellermann
f243f615ef decoder/ffmpeg: convert pointers to references 2016-04-13 09:01:54 +02:00
Max Kellermann
6a1f5667f9 util/FormatString: return AllocatedString 2016-04-12 22:59:23 +02:00
Max Kellermann
fab5f58ee0 util/AllocatedString: add operator[] 2016-04-12 22:57:13 +02:00
Max Kellermann
55be8e6f52 util/AllocatedString: add typedef size_type 2016-04-12 22:56:57 +02:00
Max Kellermann
c75b9b0d12 util/StringPointer: add typedef reference_type 2016-04-12 22:55:12 +02:00
Max Kellermann
9b85446808 util/StringPointer: rename typedef pointer to pointer_type 2016-04-12 22:53:06 +02:00
Max Kellermann
fd5d42836f Client: add WriteString() 2016-04-12 22:32:38 +02:00
Max Kellermann
4eaa82fd22 lib/icu/Util: add overload which throws exception 2016-04-12 22:08:48 +02:00
Max Kellermann
a497cc46f9 lib/icu/Util: use std::unique_ptr 2016-04-12 22:07:23 +02:00
Max Kellermann
178f737971 lib/icu/Collate: use std::unique_ptr 2016-04-12 21:55:14 +02:00
Max Kellermann
74963bce9d lib/icu/Collate: use class AllocatedArray 2016-04-12 21:55:14 +02:00
Max Kellermann
33a4dbe1e5 lib/icu/Util: use class AllocatedArray 2016-04-12 21:42:14 +02:00
Max Kellermann
60f32d0bce util/AllocatedArray: new utility class 2016-04-12 21:32:56 +02:00
Max Kellermann
dce36d3e55 lib/icu/Util: remove obsolete documentation 2016-04-12 21:32:56 +02:00
Max Kellermann
807c72b2f1 decoder/ffmpeg: use av_packet_unref() instead of av_free_packet()
av_free_packet() was deprecated in FFmpeg 3.0.
2016-04-12 21:15:05 +02:00
Max Kellermann
4f393553f4 playlist/Song: catch SongLoader exceptions
Fixes aborted "load" commands due to SongLoader failure.
2016-04-12 21:09:53 +02:00
Max Kellermann
91afc7b23c python/libs: upgrade CURL to 7.48.0 2016-04-04 08:43:20 +02:00
Max Kellermann
36d158e13e python/libs: upgrade FFmpeg to 3.0.1 2016-04-04 08:42:56 +02:00
Max Kellermann
02a97b5985 python/libs: upgrade opus to 1.1.2 2016-04-04 08:35:06 +02:00
Max Kellermann
b980545012 doc/doxygen.conf: enable HAVE_DOT and INTERACTIVE_SVG 2016-03-30 13:47:53 +02:00
Max Kellermann
8aad152b23 doc/doxygen.conf: "doxygen -u" with 1.8.11 2016-03-30 13:44:55 +02:00
Max Kellermann
74dbaade6f decoder/Thread: use "ffmpeg" as fallback instead of "mad"
Adds support for stream codecs which havn't been explicitly listed in
ffmpeg_mime_types.
2016-03-30 00:58:48 +02:00
Max Kellermann
2deb5b7fec sticker/SongSticker: add missing <stdexcept> include
For std::runtime_error.  See http://bugs.musicpd.org/view.php?id=4509
2016-03-30 00:35:25 +02:00
Max Kellermann
53677172f2 notify: use "constexpr" only with glibc
The Mutex and Cond constructors are only "constexpr" with glibc, and
this is what this #ifdef is about.

Backport of commit 459a812a

See http://bugs.musicpd.org/view.php?id=4511
2016-03-30 00:31:01 +02:00
Max Kellermann
bef0ccf42a configure.ac: prepare for 0.19.15 2016-03-30 00:30:39 +02:00
Max Kellermann
2fd5182608 db/Interface: GetSong() throws exception on error 2016-03-19 00:19:50 +01:00
Max Kellermann
7ad7caa2ae queue/PlaylistUpdate: extend catch clause 2016-03-19 00:19:47 +01:00
Max Kellermann
6d1710c74f PlaylistPrint: catch Database::GetSong() exceptions 2016-03-19 00:16:01 +01:00
Max Kellermann
233b8d0129 sticker/Song: catch Database::GetSong() exceptions 2016-03-19 00:14:40 +01:00
Max Kellermann
f55bdf07d3 db/Interface: Open() throws exception on error 2016-03-19 00:05:11 +01:00
Max Kellermann
6c2b532ae3 db/proxy: throw exception on error 2016-03-19 00:02:50 +01:00
Max Kellermann
2539f294e4 db/proxy: move code to MakeError()
Use this function instead of CheckError() when we already know an
error has occurred.
2016-03-18 23:43:28 +01:00
Max Kellermann
b6a3ce9305 db/proxy: fix inconsistent error handling in VisitUniqueTags() 2016-03-18 23:42:04 +01:00
Max Kellermann
b07495aae9 db/proxy: remove superfluous CheckError() call 2016-03-18 23:41:24 +01:00
Max Kellermann
686a53215d db/proxy: use AtScopeExit() 2016-03-18 23:10:42 +01:00
Max Kellermann
6190da1300 test/DumpDatabase: use AtScopeExit() 2016-03-18 22:53:16 +01:00
Max Kellermann
6fd7d8191e db/simple: refactor Check() to throw exception 2016-03-18 22:21:09 +01:00
Max Kellermann
2ccd1cc9f0 db/simple: remove misplaced "pure" attribute 2016-03-18 22:18:09 +01:00
Max Kellermann
8167bdd978 db/simple: handle Database::Open() exceptions in Mount() 2016-03-18 18:55:54 +01:00
Max Kellermann
dfb3e34f7b db/lazy: remove obsolete class
Obsoleted by commit d4d4d621
2016-03-18 18:48:27 +01:00
Max Kellermann
45ee75055e db/upnp: remove obsolete code comment 2016-03-18 18:48:00 +01:00
Max Kellermann
5da4e321c0 Stats: catch exceptions 2016-03-18 18:46:43 +01:00
Max Kellermann
e8519fecb4 Merge tag 'v0.19.14'
release v0.19.14
2016-03-18 18:41:14 +01:00
Max Kellermann
ff35aa07dc release v0.19.14 2016-03-18 18:26:58 +01:00
Max Kellermann
06c172838c queue/PlaylistUpdate: catch and ignore DatabaseError
Fixes regression by commit 42f7df96
2016-03-18 18:25:16 +01:00
Max Kellermann
1543dd85b5 queue/Playlist: don't let StaleSong() interrupt playback
http://bugs.musicpd.org/view.php?id=4470
2016-03-18 18:08:13 +01:00
Max Kellermann
f37a1026f9 queue/Playlist: rename DeleteSong() to StaleSong() 2016-03-18 18:01:01 +01:00
Max Kellermann
91fb7fa3d8 queue/Playlist: pass unsigned to PlayOrder() 2016-03-18 17:49:29 +01:00
Max Kellermann
7b70153068 queue/Playlist: document that current/queued are "order number" 2016-03-18 17:35:29 +01:00
Max Kellermann
7e096ee2c5 db/update/Remove: update code comment 2016-03-18 16:58:06 +01:00
Max Kellermann
86a90daf1b db/update/Remove: pass URI to Remove() 2016-03-18 16:57:43 +01:00
Max Kellermann
42f7df9681 db/update/Remove: reimplement as a non-blocking queue
This reduces overhead for two reasons:

1. calls to Remove() are non-blocking

2. RunDeferred() may work on large chunks at a time, reducing the
   number of RunDeferred() calls
2016-03-18 16:43:02 +01:00
Max Kellermann
2edad38c7c db/DatabaseListener: pass URI to OnDatabaseSongRemoved()
There's no point in passing a LightSong reference here; the callee is
interested only in the URI.
2016-03-18 16:22:33 +01:00
Max Kellermann
296ee4961e sticker/Song: add _delete() overload with "const char *" 2016-03-18 16:21:26 +01:00
Max Kellermann
b1becddf11 util/StringView: add method Strip() 2016-03-18 15:40:49 +01:00
Max Kellermann
667edcd9d0 util/IterableSplitString: cheaper variant of SplitString() 2016-03-18 14:11:50 +01:00
Max Kellermann
b4e75bedf0 util/StringView: make nullptr_t constructor "constexpr" 2016-03-18 14:11:50 +01:00
Max Kellermann
5482ef5451 util/SplitString: relicense to BSD-2 2016-03-18 13:18:31 +01:00
Max Kellermann
a3afd5178c tag/TagPool: optimize _dup_item()
When a reference counter is at its limit, don't allocate a new
TagPoolSlot - that would result in many TagPoolSlot instances with
ref==1.  This in turn would make the linked list very very large,
which means quadratic runtime for many operations.
2016-03-14 13:08:04 +01:00
Max Kellermann
f1285a6dfd tag/TagPool: add constexpr MAX_REF 2016-03-14 08:07:22 +01:00
Max Kellermann
cf7c1afb93 tag/TagPool: use prime number for NUM_SLOTS 2016-03-14 08:04:51 +01:00
Max Kellermann
f254831aa6 Instance: remove redundant "virtual" keywords 2016-03-10 23:16:35 +01:00
Max Kellermann
bd40c8649c Partition: use Instance::EmitIdle() 2016-03-10 23:12:03 +01:00
Max Kellermann
7c53df2ed1 Partition: eliminate GlobalEvents.hxx, add mask constants 2016-03-10 23:10:14 +01:00
Max Kellermann
5ca6026787 Partition: use CallbackMaskMonitor, replacing class GlobalEvents::Monitor 2016-03-10 22:52:16 +01:00
Max Kellermann
483daa5882 Instance: move GlobalEvents::Monitor to Partition
All remaining events are specific to the Partition.
2016-03-10 22:47:47 +01:00
Max Kellermann
e2bc92d128 Instance: replace IdleMaskMonitor with CallMaskMonitor 2016-03-10 22:38:10 +01:00
Max Kellermann
5ffe3773d4 event/MaskMonitor: add variant with bound method 2016-03-10 22:37:33 +01:00
Max Kellermann
a7c68018a2 util/Callback: new utility class for callback functions 2016-03-10 20:42:19 +01:00
Max Kellermann
5ffb82993e IdleMonitor: new class to replace GlobalEvents::IDLE
Use MaskMonitor to eliminate duplicate code.
2016-03-10 20:32:43 +01:00
Max Kellermann
07add0bd91 Instance: add base class which owns the EventLoop 2016-03-10 20:32:35 +01:00
Max Kellermann
9a9b6fa326 queue/Playlist: add interface QueueListener, replacing calls to idle_add() 2016-03-10 20:10:14 +01:00
Max Kellermann
ba43ec5759 queue/Playlist: remove redundant "struct" keyword 2016-03-10 20:03:45 +01:00
Max Kellermann
008a9560fe queue/Playlist: call OnModified(), eliminate duplicate code 2016-03-10 20:03:01 +01:00
Max Kellermann
6ff01cc72c Merge branch 'v0.19.x' 2016-03-07 14:30:43 +01:00
Max Kellermann
e140a28073 archive/iso9660: check path buffer bounds 2016-03-07 14:21:01 +01:00
Max Kellermann
de61c3b962 archive/iso9660: use a single path buffer for Visit()
Avoid wasting 4 kB stack per directory level.
2016-03-07 14:01:52 +01:00
Max Kellermann
c46fc4531b archive/iso9660: move the "." and ".." checks up 2016-03-07 14:01:40 +01:00
Max Kellermann
065a9ed10f archive/iso9660: add local variable "filename" 2016-03-07 13:57:07 +01:00
Max Kellermann
e44c0254f7 archive/iso9660: make variables more local 2016-03-07 13:15:07 +01:00
Max Kellermann
13f9f0315f util/HugeAllocator: fix division by zero due to inverted check
There were two ways this could fail:

1. division by zero when sysconf(_SC_PAGESIZE)==0

2. mmap() failure because the size parameter is not aligned to page
   size

Neither ever happened: sysconf() never fails, and the only caller
passes a size that is already aligned.  Phew.
2016-03-06 23:53:41 +01:00
Max Kellermann
1532ffe215 protocol/ArgParser: fix range check
The old check

 unsigned(value) > std::numeric_limits<unsigned>::max()

.. cannot ever fail.
2016-03-06 23:41:08 +01:00
Max Kellermann
b24cbc68ba decoder/dsdiff: fix off-by-one buffer overflow 2016-03-06 23:28:29 +01:00
Max Kellermann
976fdd76c1 decoder/opus: limit tag size to 64 kB 2016-03-06 23:26:48 +01:00
Max Kellermann
bbda335e02 mixer/pulse: fix integer division rounding 2016-03-06 23:23:30 +01:00
Max Kellermann
031410c72b Instance: add StateFile* attribute 2016-03-05 21:00:38 +01:00
Max Kellermann
710def8e38 Partition: un-inline the constructor 2016-03-05 20:51:29 +01:00
Max Kellermann
c0bda1b103 Idle: move flags to IdleFlags.hxx 2016-03-05 20:48:37 +01:00
Max Kellermann
0e87ce4680 GlobalEvents: expose the internal class
Move the GlobalEvents::Monitor instance into class Instance.
Eliminate all global variables.
2016-03-05 20:23:30 +01:00
Max Kellermann
b4d594eeff Instance: embed EventLoop, no pointer 2016-03-05 20:20:12 +01:00
Max Kellermann
ce09379bae Main: use Instance::Shutdown() 2016-03-05 20:20:12 +01:00
Max Kellermann
b27fb64317 client/ClientRead: use Instance::Shutdown() 2016-03-05 20:19:20 +01:00
Max Kellermann
099455db25 db/update/Service: convert const to constexpr 2016-03-05 20:08:01 +01:00
Max Kellermann
3146bf51e6 db/update/Service: eliminate attribute "progress"
Use walk!=nullptr instead.
2016-03-05 19:40:11 +01:00
Max Kellermann
b24a5e0662 Partition: add method EmitIdle()
Prepare for moving idle events to class Partition.  Right now, it's
just a wrapper for idle_add().
2016-03-05 19:16:39 +01:00
Max Kellermann
e52ac0b187 event/MaskMonitor: new class to replace code in GlobalEvents and Idle 2016-03-05 19:15:50 +01:00
Max Kellermann
eaa1590866 GlobalEvents: eliminate SHUTDOWN, use Instance::Shutdown() instead 2016-03-05 18:56:27 +01:00
Max Kellermann
071af004bd GlobalEvents: include cleanup 2016-03-05 18:56:27 +01:00
Max Kellermann
23ab4e5e5f Instance: add method Shutdown() 2016-03-05 18:56:16 +01:00
Max Kellermann
8e563cbccd Instance: use C++11 initializers 2016-03-05 18:55:57 +01:00
Max Kellermann
1aee89f5ea *: include cleanup (using iwyu) 2016-03-01 22:08:13 +01:00
Max Kellermann
d2dd6f7c70 thread/Posix{Mutex,Cond}: use "constexpr" only with glibc
Apparently all other C libraries are not compatible with "constexpr".
Those which are not will get a performance penalty, but at least they
work at all.
2016-03-01 21:23:59 +01:00
Max Kellermann
e9a544fa98 configure.ac: prepare for 0.19.14 2016-03-01 21:22:42 +01:00
Max Kellermann
fb547260d1 player/Control: Play*() returns Error information 2016-02-28 13:31:41 +01:00
Max Kellermann
2065e32904 queue/PlaylistControl: clear "queued" before calling LockSeek()
This is necessary to avoid an assertion failure in UpdateQueuedSong()
after LockSeek() has failed.
2016-02-28 13:19:44 +01:00
Max Kellermann
ac15581c56 command/error: remove unused function print_playlist_result() 2016-02-28 11:53:38 +01:00
Max Kellermann
9e2e882157 PlaylistPrint: throw PlaylistError on error 2016-02-28 11:52:39 +01:00
Max Kellermann
99ded56047 command/error: remove db_domain from ToAck(Error) 2016-02-28 11:48:12 +01:00
Max Kellermann
65386f52f0 db/proxy: throw DatabaseError on error 2016-02-28 11:47:03 +01:00
Max Kellermann
5b8dce7456 db/simple: throw DatabaseError on error 2016-02-28 11:40:59 +01:00
Max Kellermann
de938eb621 db/simple: handle exception in Open() properly, fix memory leak 2016-02-28 11:40:39 +01:00
Max Kellermann
83cc6c0835 db/simple: use second Error instance in Open()
Don't need to clear the caller-specified one.
2016-02-28 11:38:22 +01:00
Max Kellermann
304d78a4c8 command/error: remove playlist_domain from ToAck(Error)
playlist_domain is no longer used for class Error.
2016-02-28 11:17:43 +01:00
Max Kellermann
347590751c SongLoader: throw PlaylistError on error 2016-02-28 11:15:20 +01:00
Max Kellermann
fe4b1f96f1 SongLoader: use temporary stack variable, no heap allocation
Improved exception-safety.
2016-02-28 11:08:00 +01:00
Max Kellermann
9de984f7f8 queue/PlaylistControl: throw PlaylistError on error 2016-02-28 11:04:35 +01:00
Max Kellermann
b6cb9b853a queue/PlaylistEdit: throw PlaylistError on error 2016-02-28 11:02:36 +01:00
Max Kellermann
50b930f283 playlist/edit: use std::unique_ptr 2016-02-28 11:00:59 +01:00
Max Kellermann
cbeb809798 playlist/queue: use std::unique_ptr 2016-02-28 10:58:50 +01:00
Max Kellermann
ea626368a0 queue/QueueCommands: use std::unique_ptr 2016-02-28 10:56:37 +01:00
Max Kellermann
c81747dd15 queue/PlaylistTag: throw PlaylistError on error 2016-02-28 10:40:31 +01:00
Max Kellermann
f8810d7caf PlaylistError: add NotPlaying() 2016-02-28 10:38:17 +01:00
Max Kellermann
92f54f0b59 output/alsa: disable DoP if it fails
See http://bugs.musicpd.org/view.php?id=4496
2016-02-28 10:19:19 +01:00
Max Kellermann
ddce544b53 output/alsa: move the PcmExport::Open() call to Open() 2016-02-28 10:15:54 +01:00
Max Kellermann
21fb7eea82 output/alsa: probe DSD_U32 if DSD_U8 fails
See http://bugs.musicpd.org/view.php?id=4485
2016-02-28 09:59:09 +01:00
Max Kellermann
fd7eb43366 output/alsa: use CamelCase 2016-02-28 09:44:15 +01:00
Max Kellermann
7d0ca894a4 test/test_pcm_export: extend the DSD_U32 test 2016-02-28 09:37:01 +01:00
Max Kellermann
a1add27c4c output/alsa: fix indent 2016-02-28 09:35:57 +01:00
Max Kellermann
fc8194ee1e output/alsa: fix typo 2016-02-28 09:35:55 +01:00
Max Kellermann
8ffcdb73e8 output/alsa: remove option "use_mmap"
MPD does not really take advantage of memory-mapped I/O by generating
data right into the ALSA buffer; using plain snd_pcm_mmap_writei() has
no advantage compared to snd_pcm_writei().  Let's kill this
non-feature.
2016-02-28 09:30:59 +01:00
Max Kellermann
111528e51c output/alsa: add #ifdef ENABLE_DSD
Fixes the --disable-dsd build.

See http://bugs.musicpd.org/view.php?id=4498
2016-02-28 07:29:37 +01:00
Max Kellermann
5628dcf47e pcm/export: add #ifdef ENABLE_DSD to struct Params 2016-02-27 08:02:01 +01:00
Max Kellermann
fb4f02cd38 pcm/PcmExport: add flag to export to DSD_U32 2016-02-27 07:42:09 +01:00
Max Kellermann
d1be643c0d pcm/PcmDsd: add converter from DSD_U8 to DSD_U32 2016-02-27 07:41:58 +01:00
Max Kellermann
c9761bf6af output/alsa: pass PcmExport::Params to alsa_setup() 2016-02-27 07:35:35 +01:00
Max Kellermann
4a47265224 output/alsa: pass PcmExport::Params to SetupDop() 2016-02-27 07:34:58 +01:00
Max Kellermann
f0f3017a76 pcm/export: move Open() parameters to struct Params 2016-02-26 18:55:27 +01:00
Max Kellermann
d3f0b62348 pcm/export: another #ifdef ENABLE_DSD fix 2016-02-26 18:55:06 +01:00
Max Kellermann
6a53fb33da output/alsa: basic infrastructure for DSD_U16 and DSD_U32 2016-02-26 18:44:58 +01:00
Max Kellermann
dcaf299864 pcm/export: add #ifdef ENABLE_DSD 2016-02-26 18:44:23 +01:00
Max Kellermann
ab2e00bc38 README.md: add a few helpful links for starters 2016-02-26 18:03:08 +01:00
Max Kellermann
48d02bef15 README: convert to Markdown 2016-02-26 17:56:24 +01:00
Max Kellermann
1d67aa7bf2 update copyright year to 2016 2016-02-26 17:54:05 +01:00
Max Kellermann
e56066f721 pcm/dsd: use PcmBuffer::GetT() 2016-02-26 17:41:18 +01:00
Max Kellermann
5e3844ac13 pcm/dsd: use MAX_CHANNELS 2016-02-26 17:41:06 +01:00
Max Kellermann
cb4f5d454b pcm/dsd: use std::array 2016-02-26 17:38:46 +01:00
Max Kellermann
e5c6fe1bb2 player/control: unpause in Play()
Fix regression by commit 45f6129a

See http://bugs.musicpd.org/view.php?id=4477
2016-02-26 17:33:21 +01:00
Max Kellermann
bf65a9732c decoder/thread: clear Decoder::error before attempting another plugin
Keep only the last error.  This fixes bogus aborts due to the error
check in decoder_get_virtual_command().
2016-02-26 17:30:24 +01:00
Max Kellermann
1388b3219a decoder/thread: fix typo in comment 2016-02-26 16:48:27 +01:00
Max Kellermann
d9e8ce22cb util/Error: use std::exception_ptr instead of std::exception
Necessary to preserve type information.  The try/catch sequence didn't
work previously.

Same fix as in commit 1c904000
2016-02-26 16:32:24 +01:00
Max Kellermann
c85ba73371 systemd: set Type=notify
Tell systemd that MPD is going to notify it when initialization is
done.
2016-02-26 16:14:06 +01:00
Max Kellermann
224944528f TagArchive: include cleanup 2016-02-26 15:10:33 +01:00
Max Kellermann
cdcd3e77b3 TagArchive: refactor TagHandler overload to use ArchiveFile 2016-02-26 15:07:30 +01:00
Max Kellermann
ed5058a363 TagArchive: remove obsolete overload 2016-02-26 15:07:00 +01:00
Max Kellermann
a670ff6d3e SongUpdate: remove obsolete overload UpdateFileInArchive(Storage) 2016-02-26 15:06:16 +01:00
Max Kellermann
32f6d34904 db/update/Archive: rescan tags on existing songs in archive
This is the final piece for full ID3/APE support in archives.
2016-02-26 15:05:49 +01:00
Max Kellermann
d3ae05506d SongUpdate: remove archive handling from LoadFile()
This code has been moved to LoadFromArchive().
2016-02-26 15:05:44 +01:00
Max Kellermann
96f4394dce db/update/Archive: pass ArchiveFile to Song constructor
Don't open the ZIP file again and again for each song file.
2016-02-26 15:05:40 +01:00
Max Kellermann
35567e6507 SongUpdate: add UpdateFileInArchive(ArchiveFile&) 2016-02-26 14:53:37 +01:00
Max Kellermann
ae37e25452 TagArchive: add overload with ArchiveFile& 2016-02-26 14:46:01 +01:00
Max Kellermann
c4537fe6f6 TagArchive: add TagBuilder overload with ScanGenericTags() fallback
Load APE/ID3 tags from archives.
2016-02-26 14:03:16 +01:00
Max Kellermann
677334f5a9 tag/TagId3: re-add missing tag_id3_load()==nullptr check 2016-02-26 14:00:30 +01:00
Max Kellermann
3d9652ae35 TagStream: add TagBuilder overload with ScanGenericTags() fallback
This commit adds support for APE/ID3 tags from NFS/SMB files.

See http://bugs.musicpd.org/view.php?id=4270
2016-02-26 13:48:38 +01:00
Max Kellermann
a9130cb99c TagFile: add TagBuilder overload with ScanGenericTags() fallback 2016-02-26 13:48:38 +01:00
Max Kellermann
b1d60b5c85 TagArchive: use InputStreamPtr 2016-02-26 13:48:38 +01:00
Max Kellermann
99a05c56ad tag/Generic: use InputStream::LockRewind() instead of Rewind()
Fixes deadlock.
2016-02-26 13:48:38 +01:00
Max Kellermann
cfc65397b3 tag/Generic: clarify documentation on InputStream overload 2016-02-24 00:01:51 +01:00
Max Kellermann
cd8fd1ef42 tag/Generic: remove redundant documentation 2016-02-24 00:01:30 +01:00
Max Kellermann
6350089e51 Merge tag 'v0.19.13'
release v0.19.13
2016-02-23 22:13:43 +01:00
Max Kellermann
79f2f8cddc release v0.19.13 2016-02-23 22:06:13 +01:00
Max Kellermann
39fa949345 queue/Playlist: move only the tag items in TagModified()
Fixes disappearing duration of remote songs during playback.

See http://bugs.musicpd.org/view.php?id=4492
2016-02-23 21:01:55 +01:00
Max Kellermann
e1d7a5cbf5 DetachedSong: add method MoveTagItemsFrom() 2016-02-23 20:59:44 +01:00
Max Kellermann
f3cefaf043 tag/Tag: move code to MoveItemsFrom() 2016-02-23 20:57:56 +01:00
Max Kellermann
b3460f3f54 configure.ac, unix/Daemon: check for initgroups() at configure time
The initgroups() manpage says we need to check for _BSD_SOURCE.  The
thing is that glibc deprecated this macro, and doesn't define it
anymore, effectively breaking all MPD supplementary groups.

The real fix is to check for initgroups() availability at configure
time, instead of relying on the deprecated _BSD_SOURCE macro.
2016-02-23 20:13:34 +01:00
Max Kellermann
8e5a67ed9f tag/TagId3: eliminate dummy function when libid3tag is disabled 2016-02-23 11:16:19 +01:00
Max Kellermann
cccbcf510a tag/{Id3,Ape}: remove Path overloads 2016-02-23 11:14:27 +01:00
Max Kellermann
a1e680fec7 decoder/thread: open InputStream in decoder_run_file() in any case
decoder_load_replay_gain() will create the InputStream anyway, so
we're not saving any overhead by opening the InputStream on demand
only.
2016-02-23 11:14:12 +01:00
Max Kellermann
1b58bd64ff decoder/thread: use typedef InputStreamPtr 2016-02-23 11:14:11 +01:00
Max Kellermann
196de8c758 decoder/thread: load APE replay gain from remote files 2016-02-23 10:57:03 +01:00
Max Kellermann
222b777552 tag/ApeReplayGain: add overload with InputStream& parameter 2016-02-23 10:42:41 +01:00
Max Kellermann
b5c206d3ae tag/Generic: use common InputStream for APE and ID3 2016-02-23 10:27:31 +01:00
Max Kellermann
17ace95268 tag/Generic: add overload with InputStream& parameter 2016-02-23 10:18:07 +01:00
Max Kellermann
779d73f94b tag/TagId3: add overload with InputStream& parameter 2016-02-23 10:15:38 +01:00
Max Kellermann
73307bf2e7 tag/TagHandler: pass by reference 2016-02-23 10:10:13 +01:00
Max Kellermann
7623c1c5cb SongUpdate: move tag_scan_fallback() to tag/Generic.cxx 2016-02-22 18:00:49 +01:00
Max Kellermann
de568c84c2 tag/ApeLoader: use CamelCase 2016-02-22 17:53:06 +01:00
Max Kellermann
1f5b9c6185 tag/ApeLoader: use std::unique_ptr 2016-02-22 17:50:15 +01:00
Max Kellermann
a5f8fd774d tag/handler: use CamelCase 2016-02-22 17:38:06 +01:00
Max Kellermann
cc5443c38e tag/ApeLoader: use class InputStream instead of FILE*
Prepare for APE tag support on userspace NFS/SMB/CIFS mounts.
2016-02-22 17:30:36 +01:00
Max Kellermann
8a86460b8f tag/Id3Load: use class InputStream instead of FILE*
Prepare for ID3 support on userspace NFS/SMB/CIFS mounts.
2016-02-22 17:30:36 +01:00
Max Kellermann
7ae9e49f51 playlist/Stream, db/upnp: add missing includes 2016-02-22 17:30:36 +01:00
Max Kellermann
c682d087d9 tag/Id3Load: optimized ID3v1 loader
Use a 128 byte buffer instead of reading 10 bytes first and then 118.
2016-02-22 13:14:38 +01:00
Max Kellermann
57da5c0841 tag/Id3Load: simplify end offset calculation 2016-02-22 13:14:37 +01:00
Max Kellermann
a224722ae2 tag/Id3Load: add constant ID3V1_SIZE 2016-02-22 13:14:36 +01:00
Max Kellermann
283ef5b163 tag/Id3Load: use ID3_TAG_QUERYSIZE instead of integer literal 2016-02-22 13:14:35 +01:00
Max Kellermann
09a188bfd9 input/InputStream: add method Skip() 2016-02-22 13:14:19 +01:00
Max Kellermann
10f086854b tag/Id3Load: remove unnecessary seek 2016-02-21 13:34:16 +01:00
Max Kellermann
d67c6c37e3 archive/bzip2: remove HAVE_OLDER_BZIP2 check
The check was added in commit 98fd9b7d, but there was never a
definition.
2016-02-21 13:19:00 +01:00
Max Kellermann
136725dfb1 archive/bzip2: convert struct to class 2016-02-21 13:18:25 +01:00
Max Kellermann
438895842c archive/bzip2: move bz2_fillbuffer into struct Bzip2InputStream 2016-02-21 13:17:22 +01:00
Max Kellermann
82b8f4f1ce archive/bzip2: use C++11 initializer 2016-02-21 13:16:27 +01:00
Max Kellermann
0705f42cf8 playlist/Plugin: pass InputStreamPtr&& to open_stream()
Obsolete class CloseSongEnumerator, which was a kludge.
2016-02-21 12:53:47 +01:00
Max Kellermann
cadc67ea40 input: wrap InputStream in std::unique_ptr 2016-02-21 08:03:32 +01:00
Max Kellermann
054e9ecaae tag/Id3Load: split tag_id3_read() 2016-02-21 07:14:04 +01:00
Max Kellermann
84fe3bfa87 tag/Id3Load: don't seek twice in tag_id3_read()
Copy the query buffer to the allocated buffer, and read only the
remaining data.
2016-02-19 19:43:05 +01:00
Max Kellermann
2ef8403bfa tag/Id3Load: don't read again if we already have enough data 2016-02-19 19:40:23 +01:00
Max Kellermann
1d3b2baee7 tag/Id3Load: manage id3_tag* with std::unique_ptr 2016-02-19 19:16:40 +01:00
Max Kellermann
86de876b24 tag/TagId3: move tag_id3_load() to Id3Load.cxx 2016-02-19 19:06:06 +01:00
Max Kellermann
8a9f04f7fe tag/Id3: catch exceptions 2016-02-19 18:23:54 +01:00
Max Kellermann
98bd4dfe04 fs/io/FileReader: add method Skip() 2016-02-19 18:18:25 +01:00
Max Kellermann
8e0e4d7c04 system/FileDescriptor: add method Skip() 2016-02-19 18:18:12 +01:00
Max Kellermann
a5e8269c72 tag/{Aiff,Riff}: allow fstat() to fail
Omit the file size check if we don't know the size.
2016-02-19 18:16:14 +01:00
Max Kellermann
0acc88cde5 Merge branch 'v0.19.x' 2016-02-19 18:16:04 +01:00
Chris Spiegel
1e0ad1f6bf Add TAK as a supported FFmpeg format. 2016-02-19 17:32:48 +01:00
Max Kellermann
4abcb08cc9 tag/{aiff,riff}: fix ID3 chunk padding
Apply padding only to the fseek(), not to the chunk size.  This fixes
bogus "failed to read riff chunk" messages when the last chunk has an
odd size.

See http://bugs.musicpd.org/view.php?id=4486
2016-02-19 17:31:20 +01:00
Max Kellermann
81e7833711 configure.ac: prepare for 0.19.13 2016-02-19 17:30:01 +01:00
Christian Halaszovich
3392cbbd91 Emit a warning if the OutputThread fails to get realtime scheduling
This only applies to linux systems.  Here, sched_setscheduler() is
called to get realtime scheduling.  With this patch, the return value
of this function is now checked and a warning / error message is
generated if it fails.
2016-02-19 17:09:44 +01:00
Chris Spiegel
e7b211f2c0 Add TAK as a supported FFmpeg format. 2016-02-12 18:49:10 -08:00
Max Kellermann
6c5bc9b4a3 lib/expat: use C++ exceptions instead of class Error 2016-02-07 12:58:20 +01:00
Max Kellermann
cd2f65aafc upnp/ContentDirectoryService: use AtScopeExit() for ixmlDocument_free()
For exception-safety.
2016-02-07 12:56:55 +01:00
Max Kellermann
3ee5093b03 lib/upnp: use C++ exceptions instead of class Error 2016-02-07 12:53:21 +01:00
Max Kellermann
6e2ad6860f lib/upnp/ClientInit: use class ScopeLock 2016-02-07 12:53:21 +01:00
Max Kellermann
8610eb84c6 util/RuntimeError: add missing include 2016-02-07 12:53:21 +01:00
Max Kellermann
a2e008347c Main: catch and log C++ exceptions 2016-02-07 12:42:09 +01:00
Max Kellermann
a1ef0159e3 playlist/PlaylistStream: catch and log C++ exceptions 2016-02-07 12:18:58 +01:00
Max Kellermann
1c5f76635a playlist/SongEnumerator: wrap song in std::unique_ptr 2016-02-07 11:58:54 +01:00
Max Kellermann
e2a0fd7a28 playlist/cue/CueParser: Get() returns std::unique_ptr 2016-02-07 11:58:17 +01:00
Max Kellermann
5869a4ba2d playlist/cue/CueParser: use std::unique_ptr 2016-02-07 08:31:51 +01:00
Max Kellermann
ac9a93261b playlist/cue/CueParser: use C++11 initializers 2016-02-07 08:30:49 +01:00
Max Kellermann
4b79f0047d db/DatabaseError: add exception class DatabaseError 2016-02-07 01:09:33 +01:00
Max Kellermann
6a789b660a command/CommandError: move code to ToAck(DatabaseErrorCode) 2016-02-07 01:09:10 +01:00
Max Kellermann
0d8e44a079 db/DatabaseError: rename enum db_error and make strictly-typed 2016-02-07 01:01:10 +01:00
Max Kellermann
f097952b42 lib/upnp: use std::unique_ptr 2016-02-06 23:57:29 +01:00
Max Kellermann
224d511616 upnp/Discovery: use std::unique_ptr in WorkQueue 2016-02-06 22:26:14 +01:00
Max Kellermann
050c6cc4b0 upnp/Discovery: use AtScopeExit() for exception-safety 2016-02-06 22:06:43 +01:00
Max Kellermann
bc2d23ff0d util/ScopeExit: new utility library
Similar to boost::scope_exit, but fewer include dependencies.
2016-02-06 22:03:37 +01:00
Max Kellermann
2939fadd6a decoder/Control: use ScopeLock 2015-12-31 13:45:10 +01:00
Max Kellermann
ef260377c3 decoder/Internal: use ScopeLock 2015-12-31 13:44:19 +01:00
Max Kellermann
b9213df64b decoder/API: use ScopeLock 2015-12-31 13:43:35 +01:00
Max Kellermann
aa7694047b decoder/Thread: pass InputStream errors to DecoderControl::error
Give MPD clients access to the error condition.
2015-12-31 13:39:13 +01:00
Max Kellermann
e2bc63217a decoder/Thread: decoder_input_stream_open() returns std::unique_ptr<InputStream>
Fixes memory leak after InputStream::Check() failure.
2015-12-31 13:39:13 +01:00
Max Kellermann
6c5b8bcf9d decoder/Thread: log all errors 2015-12-31 13:38:35 +01:00
Max Kellermann
e425fe3f97 decoder/Thread: use std::unique_ptr<InputStream> 2015-12-31 13:12:28 +01:00
Max Kellermann
6507993972 decoder/Thread: move decoder_command_finished_locked() to DecoderControl 2015-12-31 13:06:31 +01:00
Max Kellermann
f081696f62 decoder/Thread: convert "int ret" to "bool success" 2015-12-31 13:02:55 +01:00
Max Kellermann
09157c3130 decoder/Thread: use ScopeLock in decoder_run_stream() 2015-12-31 13:01:49 +01:00
Max Kellermann
00626b1633 decoder/Thread: use std::unique_ptr<InputStream> 2015-12-31 13:01:03 +01:00
Max Kellermann
7e0cdbe502 decoder/Thread: use ScopeUnlock for exception-safety 2015-12-31 12:59:06 +01:00
Max Kellermann
ca08902d71 decoder/Thread: use ScopeLock in TryDecoderFile() 2015-12-31 12:58:58 +01:00
Max Kellermann
fad0e834d5 decoder/Thread: always unlock mutex before returning from TryDecoderFile()
Remove that surprising rule.
2015-12-31 12:57:35 +01:00
Max Kellermann
dc76eb6139 decoder/Thread: mutex not locked for decoder_run_{file,stream}() 2015-12-31 12:42:02 +01:00
Max Kellermann
55e113c7a7 decoder/Thread: document locking rules 2015-12-31 12:36:32 +01:00
Max Kellermann
b62f5e079e decoder/Thread: use ScopeLock for exception-safety 2015-12-31 12:36:00 +01:00
Max Kellermann
ac1eaff6ec thread/Mutex: add class ScopeUnlock() 2015-12-31 12:30:53 +01:00
Max Kellermann
45f6129ae7 player/Control: don't stop playback in Play()
Instead of stopping playback completely, only CANCEL the queued song
if necessary, and use the SEEK command to play the selected song.
SEEK will take care for current playback state.
2015-12-29 13:49:15 +01:00
Max Kellermann
f3503e0026 fs/DirectoryReader: use C++ exceptions instead of class Error 2015-12-29 12:56:26 +01:00
Max Kellermann
826a654c95 fs/DirectoryReader: use C++11 initializer 2015-12-29 12:56:26 +01:00
Max Kellermann
08754e6ce7 system/Error: add IsAccessDenied() 2015-12-29 12:56:26 +01:00
Max Kellermann
3843972b05 command/Error: workaround for gcc 4.x rethrow_exception(exception_ptr) 2015-12-29 12:39:28 +01:00
Max Kellermann
37862f0f20 PlaylistFile: convert more APIs from Error to std::exception 2015-12-28 14:20:37 +01:00
Max Kellermann
1f184f4aec PlaylistFile: throw exception on spl_map_to_fs() failure 2015-12-28 14:20:37 +01:00
Max Kellermann
db5a691693 PlaylistFile: remove obsolete function TranslatePlaylistError() 2015-12-28 14:20:37 +01:00
Max Kellermann
48693250a4 command/Error: no std::exception_ptr forward declaration
This breaks on some standard library implementations.
2015-12-28 14:20:37 +01:00
Max Kellermann
570dcb6309 command/Error: support nested exceptions 2015-12-28 07:00:01 +01:00
Max Kellermann
19e43087a8 command/Error: move code to ToAck(std::exception_ptr) 2015-12-28 06:53:52 +01:00
Max Kellermann
fe0b6a1117 PlaylistFile: convert system_error::ENOENT to PlaylistResult::NO_SUCH_LIST 2015-12-28 06:44:01 +01:00
Max Kellermann
72851647ca PlaylistError: fix NoSuchSong() code 2015-12-28 06:44:01 +01:00
Max Kellermann
1c90400081 command/Error: pass std::exception_ptr to PrintError()
Necessary to preserve type information.  The try/catch sequence didn't
work previously.
2015-12-27 06:43:55 +01:00
Max Kellermann
672e18cac9 system/Error: fix duplicate strerror() call
Apparently, the std::system_error constructor appends strerror()
already.
2015-12-27 06:05:53 +01:00
Max Kellermann
e939d667d9 protocol/Ack: add exception class wrapping enum ack 2015-12-18 09:53:02 +01:00
Max Kellermann
8bb5a565cd PlaylistError: add exception class wrapping enum PlaylistResult 2015-12-18 09:21:11 +01:00
Max Kellermann
7562c5751c db/Configured: allocate ConfigBlock on the stack 2015-12-18 09:17:12 +01:00
Max Kellermann
e6e7d6dbd6 fs/io/Reader: use C++ exceptions instead of class Error 2015-12-18 01:08:16 +01:00
Max Kellermann
fe60c52c70 system/Error: add MakeErrno(), MakeLastError() 2015-12-18 01:08:16 +01:00
Max Kellermann
93f4590453 system/Error: add IsFileNotFound() 2015-12-18 00:54:23 +01:00
Max Kellermann
1098d271b8 util/Error: add bridge to std::exception 2015-12-18 00:24:43 +01:00
Max Kellermann
51168169e7 util/Tokenizer: use std::runtime_error on syntax error 2015-12-16 11:34:26 +01:00
Max Kellermann
d256a0e98f config/ConfigFile: use std::exception on syntax error 2015-12-16 11:13:16 +01:00
Max Kellermann
6717325c3f config/ConfigFile: use std::unique_ptr 2015-12-16 11:13:16 +01:00
Max Kellermann
c4a0571e7a config/ConfigFile: fix typo in format string 2015-12-16 11:13:16 +01:00
Max Kellermann
e4a06da14e fs/io/OutputStream: use C++ exceptions in Write() 2015-12-16 10:24:43 +01:00
Max Kellermann
36d6ead65c fs/io/GzipOutputStream: use C++ exceptions in constructor 2015-12-16 10:14:56 +01:00
Max Kellermann
7eae3bc8c5 fs/io/FileOutputStream: use C++ exceptions in Commit() 2015-12-16 00:33:33 +01:00
Max Kellermann
24b2198668 fs/io/FileOutputStream: use C++ exceptions in constructor 2015-12-16 00:33:30 +01:00
Max Kellermann
d29be0f460 db/simple: use std::unique_ptr<GzipOutputStream> 2015-12-16 00:33:10 +01:00
Max Kellermann
8f93c36466 command/AllCommands: catch and report std::exception 2015-12-16 00:07:51 +01:00
Max Kellermann
3092e5a8a5 system/Error: helper library for constructing std::system_error 2015-12-16 00:07:51 +01:00
Max Kellermann
55f95b3ac9 Log: C++ exception support 2015-12-16 00:07:51 +01:00
Max Kellermann
16218c8680 configure.ac: don't disable C++ exceptions
We may start using C++ exceptions for error handling soon.
2015-12-16 00:07:51 +01:00
Max Kellermann
c11345c4d9 db/DatabaseLock: add class ScopeDatabaseUnlock 2015-12-16 00:07:51 +01:00
Max Kellermann
e31f0b8b0c db/simple: use class ScopeDatabaseLock 2015-12-16 00:07:51 +01:00
Max Kellermann
7dd3b72a8c db/DatabaseLock: add ScopeDatabaseLock::unlock() 2015-12-16 00:07:51 +01:00
Max Kellermann
aeccccb33d python/libs: upgrade CURL to 7.46.0 2015-12-16 00:07:51 +01:00
Max Kellermann
b46a27c554 python/libs: upgrade FFmpeg to 2.8.3 2015-12-16 00:07:21 +01:00
Max Kellermann
13bc15c05d python/libs: upgrade opus to 1.1.1 2015-12-16 00:06:33 +01:00
Max Kellermann
cb1e644230 python/boost: use shutil.copytree() 2015-12-16 00:05:21 +01:00
Max Kellermann
9bc0fada5c Merge tag 'v0.19.12'
release v0.19.12
2015-12-15 22:05:21 +01:00
Max Kellermann
82e261ad33 release v0.19.12 2015-12-15 21:54:42 +01:00
Benno Fünfstück
cae2811762 fix mpd crash on invalid utf8 stream title 2015-12-15 21:49:53 +01:00
Ben Boeckel
09112c6869 docs: add vlc and mpv to the list of example applications
These are other popular clients. In particular, VLC is available on
mobile devices.

Signed-off-by: Ben Boeckel <mathstuf@gmail.com>
2015-12-15 21:30:26 +01:00
Christian Hesse
77aaf1baee fix LimitRTTIME in systemd unit file
systemd does not understand LimitRTTIME=-1. For no limit we have to use
the string 'infinity' (see systemd.exec(5)).

Signed-off-by: Christian Hesse <mail@eworm.de>
2015-12-15 21:17:04 +01:00
Jörg Krause
6626c2d00d Makefile.am: fix static build with alsa
Add ALSA_LIBS to MIXER_LIBS, otherwise building mpd in a static context fails
with lot of undefined references to alsa-lib (libasound) required by
src/mixer/plugins/AlsaMixerPlugin.cxx.

Signed-off-by: Jörg Krause <joerg.krause@embedded.rocks>
2015-12-15 21:16:45 +01:00
Max Kellermann
019aea3d63 {android,win32}/build.py: move code to python/build/libs.py 2015-11-23 10:43:06 +01:00
Max Kellermann
21439108ed {android,win32}/build.py: move code to python/build/dirs.py 2015-11-23 10:38:48 +01:00
Max Kellermann
754b30a7a6 win32/build.py: move class ZlibProject to build/zlib.py 2015-11-21 00:43:50 +01:00
Max Kellermann
89d5d480d7 {android,win32}/build.py: move class FfmpegProject to build/ffmpeg.py 2015-11-21 00:36:54 +01:00
Max Kellermann
fbcacb590b {android,win32}/build.py: FfmpegProject detects CPU and OS 2015-11-21 00:35:52 +01:00
Max Kellermann
f97ad2b2ee {android,win32}/build.py: move class BoostProject to build/boost.py 2015-11-21 00:17:00 +01:00
Max Kellermann
e70f7141be {android,win32}/build.py: move class AutotoolsProject to build/autotools.py 2015-11-21 00:05:48 +01:00
Max Kellermann
7a08ce7ece {android,win32}/build.py: move class Project to build/project.py 2015-11-21 00:00:42 +01:00
Max Kellermann
86486336ec {android,win32}/build.py: add tarball_path and src_path to toolchain class
Reduce dependencies on global variables.
2015-11-20 23:47:52 +01:00
Max Kellermann
ec2a2522aa win32/build.py: restore option "out_of_tree"
Got lost in the previous commit.
2015-11-20 23:40:14 +01:00
Max Kellermann
556f9ee39c {android,win32}/build.py: move common code to python/build/ 2015-11-20 22:14:53 +01:00
Max Kellermann
7dad662d69 {android,win32}/build.py: fix missing rename 2015-11-20 22:14:11 +01:00
Max Kellermann
2daa3eb61f {android,win32}/build.py: add toolchain classes 2015-11-20 20:30:42 +01:00
Max Kellermann
3079aa1f9d {android,win32}/build.py: upgrade FFmpeg to 2.8.2 2015-11-17 17:16:56 +01:00
Max Kellermann
28f9a0a900 command/other: re-allow "lsinfo /"
This compatibility hack was accidently broken by commit f072cbbb
2015-11-13 21:04:02 +01:00
Max Kellermann
a6bb3cf60a command/queue: use StringIsEqual() instead of memcmp()
memcmp() can overflow the buffer.
2015-11-13 21:02:33 +01:00
Max Kellermann
004da5d385 queue/Save: fix "Malformed playlist line in state file"
Regression by commit 738583e3
2015-11-13 20:45:50 +01:00
Max Kellermann
0368282486 player/Control: add code comments 2015-11-13 16:02:07 +01:00
Max Kellermann
4404f20cf4 player/Control: Seek*() returns Error information 2015-11-11 19:56:09 +01:00
Max Kellermann
faca8bc02a decoder/Control: Seek() returns Error information 2015-11-11 19:56:08 +01:00
Max Kellermann
5e93c05095 queue/Playlist: seek methods return bool/Error instead of PlaylistResult 2015-11-11 19:56:01 +01:00
Max Kellermann
0f4f04eaa4 command/CommandError: send verbose error message to client 2015-11-11 19:51:09 +01:00
Max Kellermann
2e55d561d3 PlaylistError: remove unused code "ERRNO" 2015-11-11 19:50:57 +01:00
Max Kellermann
76a9049739 decoder/Control: State::ERROR is illegal
The state ERROR can only be entered during decoder initialization, and
Seek() may only be called after initialization has been finished.
2015-11-11 17:46:06 +01:00
Max Kellermann
27bfcda20d decoder/Control: use switch/case in Seek() 2015-11-11 17:46:03 +01:00
Max Kellermann
c6d1d360a3 player/Control: use class ScopeLock 2015-11-11 17:43:56 +01:00
Max Kellermann
afc1236b06 player/Control: move code to ClearError() 2015-11-11 17:41:02 +01:00
Max Kellermann
bedd5f00f8 player/Control: move code to SeekLocked() 2015-11-11 16:56:24 +01:00
Max Kellermann
36239895bd player/Control: add Lock prefix to locking method names 2015-11-11 16:50:57 +01:00
Max Kellermann
738583e3d4 StateFile: use StringAfterPrefix() instead of StringStartsWith() 2015-11-11 15:34:36 +01:00
Max Kellermann
c513478c31 db/simple: use StringAfterPrefix() instead of StringStartsWith() 2015-11-11 15:27:56 +01:00
Max Kellermann
a944927b56 util/StringPointer: add method empty() 2015-11-11 15:13:46 +01:00
Michael Paquier
315f9d98f6 Main: fix build failure on non-Linux systems 2015-11-10 08:38:53 +01:00
Max Kellermann
f087518e7a configure.ac: prepare for 0.19.12 2015-11-10 08:33:50 +01:00
Max Kellermann
b9a8b0d146 util/StringView: add method Literal() 2015-11-06 10:03:45 +01:00
Max Kellermann
4d15db0134 util/StringCompare: use StringView to simplify inline implementations 2015-11-06 10:03:14 +01:00
Max Kellermann
0d1a54262c playlist/soundcloud: make key_str "static const" 2015-11-06 09:52:35 +01:00
Max Kellermann
e7ef7f5159 db/update/InotifyQueue: use StringAfterPrefix() 2015-11-06 09:49:39 +01:00
Max Kellermann
3dc989bccb input/alsa: use StringAfterPrefix() 2015-11-06 09:49:22 +01:00
Max Kellermann
75d46efd23 util/UriUtil: use StringAfterPrefix() instead of memcmp() 2015-11-06 09:49:22 +01:00
Max Kellermann
b83392cb04 util/UriUtil: move code to SkipUriScheme() 2015-11-06 09:49:22 +01:00
Max Kellermann
7640d333f4 util/UriUtil: make variables more local 2015-11-06 09:49:22 +01:00
Max Kellermann
c880099deb util/StringCompare: add StringIsEmpty() 2015-11-06 09:37:07 +01:00
Max Kellermann
42f5ecd4a1 util/StringCompare: use strncmp() instead of memcmp() in StringStartsWith()
Some optimized implementations of memcmp() may not start from the
beginning of the string, and may thus segfault.
2015-11-06 09:24:18 +01:00
Max Kellermann
733989a284 util/StringUtil: move comparison functions to StringCompare.cxx 2015-11-06 09:20:18 +01:00
Max Kellermann
493f74d94d tag/id3: convert path from "wchar_t*" to "char*" for error message 2015-11-06 09:20:18 +01:00
Max Kellermann
3b71e2abef player/Thread: call DecoderCommand::SEEK only on existing decoder
If the decoder was just started, it already seeks to the desired
position.
2015-11-05 00:41:54 +01:00
Max Kellermann
30cad0c5f1 player/Thread: move code to WaitDecoderStartup() 2015-11-05 00:39:30 +01:00
Max Kellermann
3a387643b3 player/Thread: move player_command_finished() to PlayerControl 2015-11-05 00:38:09 +01:00
Max Kellermann
e6b37703da player/Thread: copy pc.seek_time in ActivateDecoder()
If this gets called while seeking, do the right thing.  This moves the
elapsed_time setter from method Run(), which is now redundant.
2015-11-05 00:30:04 +01:00
Max Kellermann
990f473bb3 player/Control: initialize seek_time in EnqueueSongLocked()
Allows removing a few special cases in the player thread.
2015-11-05 00:29:03 +01:00
Max Kellermann
cf1de78205 player/Thread: remove decoder error check from ActivateDecoder()
It is futile to check for decoder errors before the decoder has
finished startup.  At this time, it's unlikely that the decoder has
already failed.
2015-10-28 18:24:42 +01:00
Max Kellermann
ccea6dd74b player/Thread: rename WaitForDecoder() to ActivateDecoder()
.. and fix its API documentation.
2015-10-28 18:20:48 +01:00
Max Kellermann
166b490eed player/Thread: move code to ForwardDecoderError() 2015-10-27 23:28:13 +01:00
Max Kellermann
efd871ad2f player/Thread: clear pc.next_song earlier in WaitForDecoder() 2015-10-27 23:25:50 +01:00
Max Kellermann
b78896d64e player/Control: use CANCEL to clear next_song in Seek()
Assigning nullptr to next_song may disrupt the player thread and
render undefined behavior.
2015-10-27 23:09:03 +01:00
Max Kellermann
e753c924ef player/Thread: merge the cross_fading flag into enum CrossFadeState 2015-10-27 22:43:46 +01:00
Max Kellermann
9dc7b5a6d9 player/Thread: move ResetCrossFade() calls to where pipes are set
Move ResetCrossFade() to where cross-fading would actually break, to
make the cross-fading state more reliable.
2015-10-27 22:11:56 +01:00
Max Kellermann
f5d21c9cdb player/Thread: add method ResetCrossFade() 2015-10-27 22:05:41 +01:00
Max Kellermann
6ce13646da player/Thread: more CrossFadeState documentation 2015-10-27 21:12:20 +01:00
Max Kellermann
151653dd98 player/Thread: automatic CrossFadeState enum values 2015-10-27 21:05:10 +01:00
Max Kellermann
619cfe6a1c player/Thread: move enum CrossFadeState into the Player class 2015-10-27 20:48:14 +01:00
Max Kellermann
8acf996d90 command/queue: add range parameter to plchanges and plchangesposid 2015-10-27 20:35:40 +01:00
Max Kellermann
15e432204e pcm/Order: new library to convert from FLAC to ALSA channel order
This new library is integrated in the PcmExport class and (if enabled)
converts MPD's channel order (= FLAC channel order) to ALSA channel
order.

This fixes:
 http://bugs.musicpd.org/view.php?id=3147
and
 http://bugs.musicpd.org/view.php?id=3255
2015-10-27 11:44:23 +01:00
Max Kellermann
4b1630e1ec AudioFormat: define that channel order follows the FLAC convention
Basic definition to solve http://bugs.musicpd.org/view.php?id=3147 and
http://bugs.musicpd.org/view.php?id=3255
2015-10-27 11:44:23 +01:00
Max Kellermann
41e63031b0 {android,win32}/build.py: upgrade Boost to 1.59.0 2015-10-27 11:33:09 +01:00
Max Kellermann
bb86f27fdf {android,win32}/build.py: upgrade FFmpeg to 2.8.1 2015-10-27 11:31:13 +01:00
Max Kellermann
5cf4f62610 {android,win32}/build.py: upgrade CURL to 7.45.0 2015-10-27 11:31:13 +01:00
Max Kellermann
8e10a14866 android/build.py: switch to LLVM/clang 3.6 2015-10-27 11:31:13 +01:00
Max Kellermann
94f850a588 Merge tag 'v0.19.11' 2015-10-27 11:05:47 +01:00
Max Kellermann
db9997a106 release v0.19.11 2015-10-27 10:42:20 +01:00
Max Kellermann
0cbfb610f2 systemd: remove obsolete ControlGroup settings
This systemd feature has been removed a while ago without replacement,
and it turns out that systemd developers suggest not using control
groups at all to assign real-time privileges.  Therfore, a replacement
feature will not be implement in future systemd releases, and we can
really remove those lines completely.

See http://bugs.musicpd.org/view.php?id=4413
2015-10-27 10:36:23 +01:00
Max Kellermann
f901cd042b doc/user: section about real-time scheduling 2015-10-27 10:31:50 +01:00
Max Kellermann
5719207dfa gme: don't loop forever, fall back to GME's default play length
Fixes http://bugs.musicpd.org/view.php?id=4432
2015-10-26 17:16:20 +01:00
Max Kellermann
a84fbbe327 decoder/gme: free the gme_info_t as early as possible 2015-10-26 17:15:24 +01:00
Max Kellermann
3882c11450 decoder/gme: log the emulator type 2015-10-26 17:00:27 +01:00
Max Kellermann
08f77c2b60 decoder/gme: add option "accuracy" 2015-10-26 16:56:55 +01:00
Max Kellermann
6269abbcc8 doc/user: add decoder/gme section 2015-10-26 16:56:55 +01:00
Max Kellermann
93c97972b9 decoder/gme: call decoder_seek_error() on seek error 2015-10-26 16:32:39 +01:00
Max Kellermann
ac61d43720 output/Command: flush the mixer cache when enabling/disabling output
Fixes mixer lag (http://bugs.musicpd.org/view.php?id=4425).
2015-10-26 16:29:07 +01:00
Max Kellermann
22ebe0e58f playlist/flac: re-add the plugin
This reverts commit d7d9dbd2c2 by
reimplementing it with the current MPD API.

3 years ago, I was wrong about the "embcue" plugin being able to
replace this one, because "embcue" reads a tag named "CUESHEET", while
this plugin reads the "CUESHEET" FLAC metablock.  There's an important
difference between those two!
2015-10-26 13:16:01 +01:00
Max Kellermann
1958f78cc1 decoder/ffmpeg: fix crash due to wrong avio_alloc_context() call
Allocate the buffer dynamically using av_malloc(), and free
AVIOContext.buffer in the destructor, as mandated by the libavformat
documentation.

Fixes http://bugs.musicpd.org/view.php?id=4446
2015-10-26 13:06:29 +01:00
Max Kellermann
f072cbbba7 LocateUri: new library to classify URIs in a standard way 2015-10-22 09:39:28 +02:00
Max Kellermann
1a5b66b78d SongLoader: move code to LoadFromDatabase()
Avoids the recursion in LoadFile().
2015-10-22 09:34:13 +02:00
Andreas Mair
bea5973e0c Filter out this extra data and leading zeroes in "track" and "disc" tags. 2015-10-21 08:30:33 +02:00
Max Kellermann
0366dcf604 PlaylistPrint: fix -Wunused #ifndef ENABLE_DATABASE 2015-10-20 13:50:00 +02:00
Max Kellermann
8211d4a1c2 DetachedSong: check AllocatedPath::FromUTF8() result 2015-10-20 12:16:25 +02:00
Max Kellermann
fc2154ee92 DetachedSong: move code from Update() to LoadFile()
Avoid duplicate AllocatedPath::FromUTF8() invocations in two callers.
2015-10-20 12:10:42 +02:00
Max Kellermann
76f85e6f7b command/DatabaseCommands: pass URI to handle_lsinfo2() 2015-10-20 12:07:18 +02:00
Max Kellermann
81ce684b35 command/FileCommands: fix access to absolute paths in "readcomments" 2015-10-20 11:25:46 +02:00
Max Kellermann
42bd888946 input/InputStream: remove obsolete method OverrideMimeType() 2015-10-20 11:18:35 +02:00
Max Kellermann
6bea346c41 output/httpd: use boost::intrusive::list instead of std::forward_list 2015-10-19 16:00:26 +02:00
Max Kellermann
8d23706354 util/DeleteDisposer: new utility class 2015-10-19 15:57:30 +02:00
Max Kellermann
62bfb1a273 decoder/mad: reduce memory usage while scanning tags
Allocate the frame pointers only when actually decoding the file.
2015-10-19 13:12:36 +02:00
Max Kellermann
38e86af75c fs/Traits: use StringAfterPrefix() in Relative() 2015-10-19 10:56:13 +02:00
Max Kellermann
607c2c5ba2 util/StringUtil: add StringAfterPrefix() 2015-10-16 19:18:04 +02:00
Max Kellermann
85f58eb082 util/WStringUtil: fix indent 2015-10-16 19:17:54 +02:00
Max Kellermann
a7ee64a25b decoder/mpcdec: use SampleTraits<SampleFormat::S24_P32>
Eliminates some duplicate code, and as a side effect, this works
around clang 3.8 compiler warning because a negative value was
shifted.
2015-10-16 18:12:32 +02:00
Max Kellermann
2a58f22649 decoder/mpcdec: use Clamp() 2015-10-16 18:11:42 +02:00
Max Kellermann
f066bb7716 unix/Daemon, playlist/...: remove unused Domain variables 2015-10-16 18:08:59 +02:00
Max Kellermann
4e3d182189 encoder/flac: fix crash with 32 bit playback
Copy to encoder->audio_format *after* adjusting the sample format to
S24_P32.

Fixes http://bugs.musicpd.org/view.php?id=4433
2015-10-16 18:05:34 +02:00
Max Kellermann
205fba74cf tag/ApeLoader: fix buffer overflow after unterminated key 2015-10-16 14:55:40 +02:00
Max Kellermann
a9bcf8d50d configure.ac: prepare for 0.19.11 2015-10-16 14:55:40 +02:00
Max Kellermann
54383b017e test/ReadApeTags: new debug program 2015-10-16 14:28:57 +02:00
Max Kellermann
438b7b7bd0 util/ConstBuffer: add method MoveFront() 2015-10-16 09:00:36 +02:00
Max Kellermann
27a40a9843 util/StringView: add methods StripLeft(), StripRight() 2015-10-16 08:59:47 +02:00
Max Kellermann
c7b0e9b05b lib/expat/Parser: delete the copy constructor/operator 2015-10-02 18:06:32 +02:00
Max Kellermann
356c829b76 util/StringView: new utility class 2015-09-30 22:21:46 +02:00
Max Kellermann
ffbb5c48ed configure.ac: remove -lstdc++ from fallback GME_LIBS
This should not be necessary if libgme was built properly, and it may
break the build with libc++.
2015-09-30 22:21:46 +02:00
Anthony DeRossi
6b6c7b0920 update: apply .mpdignore matches to subdirectories
Wildcard matches are directly applied to all filenames in
subdirectories without any attempt at matching relative paths.

This change is based on the following feature request:

  http://bugs.musicpd.org/view.php?id=3729
2015-09-30 21:50:34 +02:00
Anthony DeRossi
de332a16d1 event/ServerSocket: fix AF_UNIX address in use error
bind fails with an "address already in use" error if the socket path
already exists.

This was broken by cbb595ba.
2015-09-30 21:50:34 +02:00
Anthony DeRossi
84ab3ee3af unix/PidFile: fix empty PID file
This was broken by 4f29034f.
2015-09-30 21:49:18 +02:00
Max Kellermann
ce0d896492 unix/Daemon, playlist/pls, ...: remove unused Domain variables 2015-09-17 23:15:54 +02:00
Max Kellermann
eae9cb4afe Main: use config_domain for inotify error 2015-09-17 23:15:54 +02:00
Max Kellermann
459a812a54 notify: use "constexpr" only with glibc
The Mutex and Cond constructors are only "constexpr" with glibc, and
this is what this #ifdef is about.
2015-09-17 22:56:35 +02:00
François Revol
7743647460 output: add native Haiku audio output and mixer support
Also uses the notification system to display tags.
2015-09-17 22:46:46 +02:00
François Revol
352ec364f0 Makefile.am: add the Haiku resources to the mpd binary 2015-09-17 22:46:46 +02:00
François Revol
54f684b7b3 configure: add tests for Haiku tools (rc, xres) 2015-09-17 22:46:46 +02:00
François Revol
1943b158fe Haiku: add resources: application signature and flags
Since we do not handle B_QUIT_REQUESTED because the BApplication
does not Run(), use the background flag to avoid showing up in Deskbar.
2015-09-17 22:46:46 +02:00
François Revol
a36eeb5261 Haiku: add icon as resource definition file 2015-09-17 22:46:46 +02:00
François Revol
a8b00faba1 Haiku: add an HVIF icon
3D version reinterpreted from the official 2D design,
reusing existing Haiku icons.

Icon-O-Matic source file.
Same as data/artwork/icons/App_MusicPD in the Haiku tree as of hrev47609.
2015-09-17 22:46:46 +02:00
François Revol
bf73d0f905 notify: Don't use constexpr on Haiku 2015-09-17 22:46:46 +02:00
François Revol
193ffa06d9 system/SocketUtil: guard usage of SO_PASSCRED
Haiku has struct ucred but no SO_PASSCRED (yet).
2015-09-17 22:46:46 +02:00
François Revol
9d176e35d4 unix/Daemon: define WCOREDUMP() for platforms that don't support it
Haiku does not dump core, it just starts the debugger.
2015-09-17 22:46:46 +02:00
François Revol
cd2e8c6ef1 configure.ac: check for socket() in libnetwork for Haiku 2015-09-17 22:46:45 +02:00
Will Tiffany
8461d71b52 CueParser.cxx: Append pregap to previous track
Only ignore indexes after first nonzero, preserving pregaps but
appending them to the previous track instead of prepending to the
current. The first index of the first track is used for the start time
regardless of its number. Unneeded bool last_updated removed.
2015-09-17 22:44:47 +02:00
Max Kellermann
e31cdf0df9 util/AllocatedString: fix off-by-one bug in Duplicate() 2015-09-01 23:33:19 +02:00
Max Kellermann
6f41791ea6 util/StringAPI: add UnsafeCopyStringP() 2015-09-01 21:16:22 +02:00
Max Kellermann
0bacbcd04e util/StringAPI: fix include guard name 2015-09-01 21:12:16 +02:00
Max Kellermann
ffe689363f util/AllocatedString: add constant "SENTINEL" 2015-09-01 21:11:22 +02:00
Max Kellermann
48d7fedbc0 thread/{Mutex,Cond}: remove obsolete comments 2015-08-25 12:52:13 +02:00
Max Kellermann
75dff64450 thread/Posix{Mutex,Cond}: use "constexpr" only with glibc
Apparently all other C libraries are not compatible with "constexpr".
Those which are not will get a performance penalty, but at least they
work at all.
2015-08-25 12:46:12 +02:00
Max Kellermann
f0b58c6f24 db/UniqueTags, tag/Set, ...: use typedef tag_mask_t 2015-08-24 11:53:30 +02:00
Max Kellermann
f3661b19c0 tag/Settings: move typedef tag_mask_t to Mask.hxx 2015-08-24 11:40:25 +02:00
Max Kellermann
2f5106c97f tag/Settings: convert to C++ 2015-08-24 11:20:45 +02:00
Max Kellermann
0c19418e84 tag/Settings: convert to bit mask 2015-08-24 11:20:45 +02:00
Max Kellermann
60c077c790 tag/Settings: add function IsTagEnabled() wrapping access to ignore_tag_items[] 2015-08-24 11:20:45 +02:00
Max Kellermann
7aaa4dda22 TagPrint: use unsigned integer 2015-08-24 11:20:45 +02:00
Max Kellermann
109b3700b5 Tag: include cleanup 2015-08-24 11:20:45 +02:00
Max Kellermann
71fecf4d1f unix/PidFile: add missing include stdlib.h for strtoul() 2015-08-24 10:40:05 +02:00
Will Tiffany
0f75c79665 CueParser.cxx: ignore INDEX after first per track
Use the first INDEX in each TRACK section, instead of the last, for the
start time. This preserves the original CD layout (including gaps
between tracks), and avoids skipping sections of songs in more exotic
cuesheets (eg musical suite tracks).

Fixes 0004355 and 0003359
2015-08-23 15:49:50 +02:00
Max Kellermann
9bcb01a75e doc/protocol: clarify "playlistmove" parameters 2015-08-23 15:20:14 +02:00
Max Kellermann
4f29034f11 unix/PidFile: use raw file descriptor instead of stdio 2015-08-15 16:42:07 +02:00
Max Kellermann
567bf445bf unix/Daemon: move code to ReadPidFile() 2015-08-15 16:41:22 +02:00
Max Kellermann
28a0c46ca7 unix/Daemon: eliminate local variable "ret" 2015-08-15 16:41:21 +02:00
Max Kellermann
7cc33d0f27 test/stdbin.h: remove obsolete header 2015-08-15 16:37:58 +02:00
Max Kellermann
5fba8d773c PlayerThread, ...: move to src/player/ 2015-08-15 15:55:46 +02:00
Max Kellermann
36cd73df51 client, command: use StringIsEqual() 2015-08-14 19:48:30 +02:00
Max Kellermann
6f20889f00 command/CommandListBuilder: postpone "size" initialization 2015-08-14 19:42:11 +02:00
Max Kellermann
8e408725e9 protocol/Result: move current_command to class Response 2015-08-14 19:04:00 +02:00
Max Kellermann
d053797340 protocol/Result: move command_list_num to class Response 2015-08-14 19:00:02 +02:00
Max Kellermann
c8d0f947d2 protocol/Result: move error code to class Response 2015-08-14 18:57:44 +02:00
Max Kellermann
86e036c393 command: pass Response object to command callbacks 2015-08-13 12:48:31 +02:00
Max Kellermann
7652a2986b client/Response: new Client wrapper class for writing responses 2015-08-12 08:41:05 +02:00
Max Kellermann
b1480167be command/Request: add parser methods
Wrapper for protocol/ArgParser.cxx.
2015-08-11 23:02:34 +02:00
Max Kellermann
e118e958f7 protocol/ArgParser: add overload with max_value parameter 2015-08-11 22:58:04 +02:00
Max Kellermann
ee61dfe087 protocol/ArgParser: use std::numeric_limits
Using unsigned(-1) renders undefined behavior.
2015-08-11 22:57:47 +02:00
Max Kellermann
9231f420c1 protocol/ArgParser: overload as ParseCommandArg(), pass references 2015-08-11 22:43:10 +02:00
Max Kellermann
0f92d021a1 command/Request: new struct wrapping ConstBuffer<const char *> 2015-08-11 22:43:10 +02:00
Max Kellermann
cbdc3194cc protocol/ArgParser: add struct RangeArg 2015-08-11 22:43:10 +02:00
Max Kellermann
993df0fd28 command/{Queue,Other}: eliminate local "bool" variable 2015-08-11 21:54:29 +02:00
Florian Schlichting
4294fdb0b2 doc/mpdconf.example: document that socket activation voids bind_to_address setting 2015-08-11 19:02:26 +02:00
Florian Schlichting
082523bcea doc/user: document effect of http_proxy envvar on curl plugin 2015-08-11 19:01:08 +02:00
Florian Schlichting
5d13c13821 systemd: protect /usr when running under systemd 2015-08-11 19:00:21 +02:00
Clément B
21ef656e24 systemd: also disable mpd.socket when disabling mpd.service
e.g. when running 'update-rc.d mpd disable'
2015-08-11 18:58:34 +02:00
Florian Schlichting
3c4fe8cc04 doc/user: fix typo 2015-08-11 18:57:50 +02:00
Wieland Hoffmann
95ebd57b25 mpd.service: Set the Documentation option
This makes references to mpd(1) and mpd(5) appear in systemd status output.
2015-08-06 22:03:29 +02:00
Max Kellermann
84e09aa8dd Partition: add method GetDatabase() 2015-08-06 12:45:45 +02:00
Max Kellermann
6cce3d2996 ClientWrite: merge client_write() into Client::Write() 2015-08-06 10:36:24 +02:00
Max Kellermann
77b34fa961 Client: include cleanup 2015-08-06 10:32:18 +02:00
Max Kellermann
024d978ae5 output/fifo: smaller Cancel() buffer 2015-08-06 10:15:19 +02:00
Max Kellermann
e0f55b9295 output/fifo: move the buffer into the loop 2015-08-06 10:14:53 +02:00
Max Kellermann
ccd83748f7 output/fifo: use ssize_t for the read() result 2015-08-06 10:14:35 +02:00
Max Kellermann
291ee9f86a output/fifo: simplify the Cancel() loop 2015-08-06 10:13:21 +02:00
Max Kellermann
59e4d7f0f5 output/fifo: convert struct to class 2015-08-06 09:51:03 +02:00
Max Kellermann
4647448399 output/fifo: use AudioOutputWrapper::Open(),Close() 2015-08-06 09:50:02 +02:00
Max Kellermann
7dfe841876 output/fifo: rename Open(), Close() to OpenFifo(), CloseFifo() 2015-08-06 09:49:00 +02:00
xent
34db35c36d playlist/embcue: fix last track 2015-08-05 23:37:57 +02:00
Max Kellermann
3e9738dc66 decoder/mpcdec: read the bit rate
This was lost in commit 8ead8f7ea, because this was never implemented
for the new API.
2015-08-05 23:33:11 +02:00
Max Kellermann
2ecf57cdd9 decoder/mpcdec: use SampleTraits<SampleFormat::S24_P32> 2015-08-05 23:24:30 +02:00
Max Kellermann
c8b602038e decoder/mpcdec: use Clamp() 2015-08-05 23:24:30 +02:00
Max Kellermann
e384fa226e decoder/mpcdec: make buffer more local
Allow the compiler to invalidate buffer contents.
2015-08-05 23:10:39 +02:00
Max Kellermann
cbb595ba83 event/ServerSocket: use AllocatedSocketAddress to build local socket address 2015-07-22 11:05:48 +02:00
Max Kellermann
fdeec0307e event/ServerSocket: use AllocatedSocketAddress for OneServerSocket::address
Manages memory automatically.
2015-07-22 11:05:08 +02:00
Max Kellermann
f084bbbf35 net/AllocatedSocketAddress: new sockaddr wrapper class 2015-07-22 10:56:35 +02:00
Max Kellermann
20d69b957f Net/StaticSocketAddress: add equality operator with SocketAddress 2015-07-22 10:56:32 +02:00
Max Kellermann
7de0a621e3 net/StaticSocketAddress: replace cast operator with GetAddress()
The implicit cast operator can be very dangerous.
2015-07-22 10:55:57 +02:00
Max Kellermann
3441ea9844 net/ToString: relicense to BSD-2 2015-07-22 10:26:18 +02:00
Max Kellermann
83752e9349 net/ToString: rename sockaddr_to_string() to ToString() 2015-07-22 10:26:18 +02:00
Max Kellermann
8fdfe85b5f net/ToString: move V4 mapping code to functions 2015-07-22 10:26:18 +02:00
Max Kellermann
d4d9a85ad8 net/ToString: make variables more local 2015-07-22 10:26:18 +02:00
Max Kellermann
6f22452b54 net/Resolver: move sockaddr_to_string() to ToString.cxx 2015-07-22 10:03:36 +02:00
Max Kellermann
a4a37d7a19 net/StaticSocketAddress: remove unused method SetLocal() 2015-07-21 14:42:46 +02:00
Max Kellermann
d1b1a8e490 net/StaticSocketAddress: include cleanup 2015-07-21 13:56:21 +02:00
Max Kellermann
104fe124df net/StaticSocketAddress: disable SetLocal() on Android
Fixes build failure because Bionic doesn't provide SUN_LEN().
2015-07-21 12:08:25 +02:00
Max Kellermann
5bdbd74d59 net: add header Features.hxx
For improved portability of the net library to projects without
autoconf.
2015-07-21 11:57:53 +02:00
Max Kellermann
e621c24270 net/StaticSocketAddress: include config.h 2015-07-21 11:57:53 +02:00
Max Kellermann
554888318a net/StaticSocketAddress: use SocketAddress::size_type 2015-07-21 10:39:50 +02:00
Max Kellermann
49aaf98a7f net/StaticSocketAddress: include cleanup 2015-07-21 10:38:58 +02:00
Max Kellermann
ccdb94b06c configure.ac: remove GLib option
Not used anymore.
2015-06-27 16:06:28 +02:00
Max Kellermann
6f7bfa71a9 lib/icu/Collate: remove GLib implementation
There is not much use in GLib: on Windows, we have a native API for
string collation, and the rest uses either libicu or the standard C
library calls.
2015-06-27 16:05:54 +02:00
Max Kellermann
fb3564fbe7 lib/icu/Collate: use LCMapStringEx() on Windows 2015-06-27 15:52:37 +02:00
Max Kellermann
e1e365e16e configure.ac: add option to disable iconv() 2015-06-27 15:32:26 +02:00
Max Kellermann
5b5a18db2a configure.ac: make libicu "auto" by default 2015-06-27 15:13:00 +02:00
Max Kellermann
3fa4dad418 lib/icu/Converter: remove GLib implementation
We don't need this anymore: Win32 doesn't use this library at all, and
everything else has either iconv() or libicu.
2015-06-26 16:51:18 +02:00
Max Kellermann
0756607e32 lib/icu/Converter: add iconv() implementation 2015-06-26 16:49:25 +02:00
Max Kellermann
a03be5a8a6 lib/icu/Converter: add missing <> 2015-06-26 16:49:25 +02:00
Max Kellermann
39c5bb95d2 CommandLine: show more compile-time features in --version 2015-06-26 16:42:06 +02:00
Max Kellermann
4d33b089da CommandLine: update copyright year 2015-06-26 16:32:52 +02:00
Max Kellermann
58996b841a config/Global: allow calling config_get_string() with one argument
default_value defaults to nullptr.
2015-06-26 08:06:40 +02:00
Max Kellermann
df03a7b3f8 config/Templates: mark http_proxy_* deprecated 2015-06-26 08:06:40 +02:00
Max Kellermann
ac03871174 Main: remove g_set_application_name() call
Since we are removing GLib, this call is useless.
2015-06-26 07:59:58 +02:00
Max Kellermann
2a086d20c6 fs/Glob: remove GLib implementation
I suppose there is no non-WIN32 operating system that doesn't have
fnmatch().  So let's remove the GLib implementation.
2015-06-26 07:56:34 +02:00
Max Kellermann
d5cfa6d4dc TagId3: remove the "id3v1_encoding" setting
Drop support for misencoded tags.  People should not be using ID3v1
anyway.
2015-06-26 00:15:24 +02:00
Max Kellermann
f415167e59 config/Templates: add attribute "deprecated" 2015-06-26 00:11:33 +02:00
Max Kellermann
9477db2363 config/Templates: add constructor with defaulted "repeat" parameter 2015-06-26 00:11:23 +02:00
Max Kellermann
8d11577ff2 lib/icu/{Converter,Collate}: return AllocatedString 2015-06-25 23:44:16 +02:00
Max Kellermann
037d1d9ad1 util/AllocatedString: add methods Duplicate(), Clone() 2015-06-25 23:44:16 +02:00
Max Kellermann
619ef2b341 util/AllocatedString: add method empty() 2015-06-25 23:44:16 +02:00
Max Kellermann
f06fe76d35 SongFilter: add assertion to StringMatch() 2015-06-25 23:29:07 +02:00
Max Kellermann
eb86fdfbea SongFilter: return "const char *" instead of std::string 2015-06-25 23:15:36 +02:00
Max Kellermann
c7712e2ef0 lib/icu/Collate: fall back to strxfrm() 2015-06-25 23:01:29 +02:00
Max Kellermann
61fa770644 lib/icu/Collate: fix indent 2015-06-25 22:55:57 +02:00
Max Kellermann
334bd73792 lib/icu/Collate: fall back to strcoll() instead of strcasecmp() 2015-06-23 13:26:45 +02:00
Max Kellermann
090ce262c4 lib/icu/Collate: use CompareStringEx() on Windows 2015-06-23 13:20:41 +02:00
Max Kellermann
d551d40886 fs/NarrowPath: use the WideCharToMultiByte() wrapper 2015-06-23 13:20:11 +02:00
Max Kellermann
aecfcaa8a2 lib/icu/Win32: wrappers for WideCharToMultiByte(), MultiByteToWideChar() 2015-06-23 13:20:11 +02:00
Max Kellermann
61a3028788 util/AllocatedString: remove bogus code from operator= 2015-06-23 13:20:11 +02:00
Max Kellermann
11d048b8e3 util/AllocatedString: new utility class 2015-06-23 12:48:21 +02:00
Max Kellermann
d814a01f2a fs/Path: include cleanup 2015-06-23 12:35:13 +02:00
Max Kellermann
4c0916df79 fs/Path: use base class StringPointer 2015-06-23 12:34:45 +02:00
Max Kellermann
e4844b9936 util/StringPointer: new utility class 2015-06-23 12:34:44 +02:00
Max Kellermann
60aa8c527b fs/Path: use method c_str() internally 2015-06-23 12:34:43 +02:00
Max Kellermann
9f7c3b8ea6 fs/Config: remove charset auto-detection via GLib
The default is always UTF-8.
2015-06-22 22:35:54 +02:00
Max Kellermann
9f4f1bab39 LogBackend: remove character set support
Always write UTF-8 to the log file.
2015-06-22 22:33:37 +02:00
Max Kellermann
73bd6af0f9 fs/Charset: hard-code Windows to ACP
Don't define HAVE_FS_CHARSET, and make GetFSCharset() return "ACP"
instead of "UTF-8".  Ignore the configuration setting, which had no
effect anyway.
2015-06-22 22:20:10 +02:00
Max Kellermann
2aa54c5365 fs/Glob: use PathMatchSpec() on Windows 2015-06-22 22:12:08 +02:00
Max Kellermann
bc8542503d fs/Glob: use fnmatch() if available 2015-06-22 22:12:08 +02:00
Max Kellermann
a6aea4ba58 fs/Glob: make constructor "explicit" 2015-06-22 22:12:08 +02:00
Max Kellermann
0b41faec89 db/update/ExcludeList: remove obsolete TODO comments 2015-06-22 22:12:08 +02:00
Max Kellermann
e12bd00b47 test/TestFs: new unit test for libfs.a 2015-06-22 22:12:08 +02:00
Max Kellermann
50eac9b49e db/update/ExcludeList: move class Pattern to fs/Glob.hxx 2015-06-22 22:12:08 +02:00
Max Kellermann
e0405f1781 test/test_translate_song: use PATH_LITERAL() 2015-06-22 22:12:08 +02:00
Max Kellermann
680d03e4d6 test/test_pcm_util: call the C++11 random engine instead of random()
Stupid mistake from commit 7cb803ad
2015-06-22 22:02:39 +02:00
Max Kellermann
b4fc2e38ab pcm/Interleave: add stereo optimization 2015-06-22 17:27:29 +02:00
Max Kellermann
16639f9d71 pcm/Interleave: instantiate a 16 bit optimization 2015-06-22 17:20:37 +02:00
Max Kellermann
22f2605e25 pcm/Interleave: convert PcmInterleave32() to template 2015-06-22 17:19:42 +02:00
Max Kellermann
69476b4f21 pcm/Interleave: add optimization for 32 bit samples
Move code from the "vorbis" decoder.
2015-06-22 16:32:06 +02:00
Max Kellermann
fdf92c5f3b pcm/Interleave: add "restrict" keywords 2015-06-22 16:32:06 +02:00
Max Kellermann
5e22c83baa test/test_pcm: add PcmInterleave() unit test 2015-06-22 16:32:06 +02:00
Max Kellermann
eed1a3c239 decoder/ffmpeg: move code to pcm/Interleave.cxx 2015-06-22 14:42:19 +02:00
Max Kellermann
94c037821b decoder/ffmpeg: check for commands earlier
Improve initial seek by not reading/decoding the first frame before
checking for the seek command.
2015-06-22 14:42:19 +02:00
Max Kellermann
e38e8eb636 decoder/vorbis: check STOP before entering the loop 2015-06-22 14:40:51 +02:00
Max Kellermann
bef8c83388 OutputThread: move code to CloseOutput() 2015-06-22 13:02:13 +02:00
Max Kellermann
2e98324486 lib/ffmpeg/Buffer: add "malloc" attribute 2015-06-22 09:11:22 +02:00
Thomas Guillem
6e2d7445c5 InputStream: add ReadFull method
Convenient method that behave differently than Read, and that will be used by
tag scanners.

This method will return in case of error, if the whole data is read or is EOF
is reached.
2015-06-22 08:51:14 +02:00
Max Kellermann
90e7ace980 Merge tag 'v0.19.10' 2015-06-21 16:06:02 +02:00
Max Kellermann
b0ff3bc7a3 release v0.19.10 2015-06-21 15:51:50 +02:00
Max Kellermann
06301e279c PlayerThread: start the decoder on PlayerCommand::QUEUE
Fixes missing SongBorder() call, which causes "single" mode breakage.
2015-06-21 15:38:48 +02:00
Max Kellermann
6d6f274648 DecoderAPI: discard unused song tag early
If there's a stream tag, don't let the song tag override it in the
next update_stream_tag() call.
2015-06-21 15:10:55 +02:00
Max Kellermann
9acefcb256 DecoderThread: set Decoder::song_tag only for local files
If the song tag comes from a stream, and MPD playback restarts, MPD
would believe the tag should override the newly received tag.  This
makes the previous tag appear stuck.  This change passes the song tag
only if it's authoritative - i.e. if it's a song file.
2015-06-21 15:02:14 +02:00
Max Kellermann
e4d0293a31 DecoderAPI: "move" the Tag object
Reduce runtime overhead.
2015-06-20 16:06:09 +02:00
Romain Rollet
ae77542a11 OutputControl: fix fail_timer check right after booting
Right after booting, the monotonic clock starts with a very small
value, and AudioOutput::LockUpdate() may believe that the fail_timer
has not recovered yet.
2015-06-20 15:37:19 +02:00
Max Kellermann
980187f856 system/PeriodClock: make IsDefined() "constexpr" 2015-06-20 15:33:17 +02:00
Max Kellermann
2b0a127fa5 pcm/soxr: fix recipe parser 2015-06-20 15:25:00 +02:00
Max Kellermann
327a8e6c59 decoder/ffmpeg: skip unwanted samples after seeking
When seeking to the beginning of a packet, skip the samples that come
before the desired time stamp.
2015-06-20 15:01:05 +02:00
Max Kellermann
d11e2724c4 decoder/ffmpeg: use AVSEEK_FLAG_BACKWARD for seeking
Ask FFmpeg to seek to the next packet boundary *before* the seek
position, so we don't miss audio data.  Now we get too much, but we'll
solve that in the next commit.
2015-06-20 14:29:42 +02:00
Max Kellermann
f768ca3a2d decoder/ffmpeg: move code to StreamRelativePts() 2015-06-19 18:56:29 +02:00
Max Kellermann
947e902288 input/curl: trigger the condition variable in RequestDone()
Fixes deadlock on small responses.
2015-06-19 16:45:38 +02:00
Max Kellermann
07c5d3277f {android,win32}/build.py: allow overriding shared path via environment 2015-06-03 07:48:38 +02:00
Max Kellermann
d1d44a4fde {android,win32}/build.py: move tarballs to subdirectory "download" 2015-06-03 07:46:58 +02:00
Max Kellermann
6837a67234 win32/build.py: build zlib in-tree
zlib cannot be built out-of-tree, and previously, we were building in
the "src" directory, not in the "build" directory.  The
make_build_path() return value was unused.
2015-06-03 07:36:06 +02:00
Thomas Guillem
3436a646b5 storage/nfs: fix deadlock when connecting
The Connect method can be called between Schedule and lock. In that case, when
locked, the state is already set to CONNECTING of READY and the condition won't
be signaled anymore.
2015-05-29 22:39:14 +02:00
jai
aed0af1e00 input/smbclient: fix DFF playback 2015-05-29 22:37:49 +02:00
Max Kellermann
d6eb74262a {android,win32}/build.py: upgrade Boost to 1.58 2015-05-05 12:29:20 +02:00
Max Kellermann
403aa8c5a1 {android,win32}/build.py: upgrade libvorbis, FFmpeg, CURL 2015-05-05 12:08:35 +02:00
Michal Nazarewicz
0d7ee2b014 OpusEncoderPlugin: initialise granulepos so we end up with sane values
Not initialising granulepos leads to it having arbitrary values in the
encoded stream including possibly negative values which are not valid
and confuse opusdec.  Explicitly initialise opus_encoder::granulepos
to avoid that problem.
2015-03-25 18:02:54 +01:00
Max Kellermann
2f5fd91bd8 configure.ac: prepare for 0.19.10 2015-03-25 18:02:54 +01:00
Max Kellermann
cd1148c6aa db/update/ExcludeList: use the NarrowPath class 2015-03-25 17:32:17 +01:00
Max Kellermann
cfd26f53f0 fs/io/FileOutputStream: fix wrong #ifdef WIN32 2015-03-25 17:28:27 +01:00
Max Kellermann
69ad5671ed Playlist*: use the BufferedOutputStream API instead of FILE* 2015-03-24 22:03:20 +01:00
Max Kellermann
f9e0f0d257 PlaylistSave: return bool/Error instead of PlaylistResult 2015-03-24 22:03:17 +01:00
Max Kellermann
98f3135ad3 PlaylistFile: export spl_map_to_fs() and TranslatePlaylistError() 2015-03-24 22:03:17 +01:00
Max Kellermann
8c9c3a91e6 PlaylistFile: eliminate redundant spl_map() calls 2015-03-24 22:03:17 +01:00
Max Kellermann
7f3518333d Mapper: don't use C-style prototypes 2015-03-24 22:03:17 +01:00
Max Kellermann
f1f871f103 fs/io/FileOutputStream: add method Tell() 2015-03-24 22:00:10 +01:00
Max Kellermann
6387b52896 fs/io/FileOutputStream: seek end-of-file in AppendFileOutputStream ctor 2015-03-24 21:59:34 +01:00
Max Kellermann
077e95da85 system/FileDescriptor: add method Tell() 2015-03-24 21:59:34 +01:00
Max Kellermann
7f6e1fbc8d fs/io/FileOutputStream: add class AppendFileOutputStream 2015-03-23 22:51:33 +01:00
Max Kellermann
06827cfcf1 fs/io/FileOutputStream: move code to new class BaseFileOutputStream 2015-03-23 22:36:03 +01:00
Max Kellermann
6dc3097998 fs/io/FileOutputStream: make "path" const 2015-03-23 22:35:56 +01:00
Max Kellermann
cd35271698 fs/io/BufferedOutputStream: add code comments 2015-03-23 22:03:25 +01:00
Max Kellermann
7b575f61d0 Main: notify systemd when MPD is ready 2015-03-21 14:27:54 +01:00
Max Kellermann
400e3ea649 configure.ac: support libsystemd (instead of the older libsystemd-daemon) 2015-03-20 22:12:43 +01:00
Max Kellermann
622d871587 m4: add MPD_ENABLE_AUTO() 2015-03-20 22:04:14 +01:00
Max Kellermann
63d04645c7 m4: add API documentation 2015-03-19 17:19:11 +01:00
Max Kellermann
3f4908c363 doc/doxygen.conf: strip absolute path name 2015-03-17 12:15:38 +01:00
Max Kellermann
dd0f1d9d2d doc/doxygen.conf: "doxygen -u" with 1.8.8 2015-03-17 12:11:58 +01:00
Max Kellermann
b31d171ae8 *: doxygen fixups 2015-03-17 11:21:43 +01:00
Max Kellermann
085f06594c doc/doxygen.conf: disable WARN_IF_UNDOCUMENTED, too much noise 2015-03-17 11:21:43 +01:00
Max Kellermann
ce3d41052c doc/doxygen.conf: remove DOT_FONTNAME (font name was obsolete) 2015-03-17 10:50:23 +01:00
Max Kellermann
44f3df697f doc/doxygen.conf: scan headers recursively 2015-03-17 10:47:53 +01:00
Max Kellermann
28c75b2283 doc/doxygen.conf: generate documentation for C++ headers 2015-03-17 10:46:35 +01:00
Max Kellermann
b6e56119c4 doc/doxygen.conf: remove obsolete settings 2015-03-17 10:45:41 +01:00
Max Kellermann
a0e29b5435 doc/doxygen.conf: remove XML section
It's disabled anyway.
2015-03-17 10:43:51 +01:00
Max Kellermann
65ff72cdf8 fs/Traits: enable _UNICODE on Windows
Use wchar_t for everything on Windows.  Solves a lot of filesystem
charset problems.
2015-03-05 10:15:10 +01:00
Max Kellermann
1da0956331 output/recorder: convert path to UTF-8 for logging 2015-03-05 10:15:10 +01:00
Max Kellermann
983078992d fs/NarrowPath: new utility class 2015-03-05 10:07:07 +01:00
Max Kellermann
81059f80d8 output/winmm: convert device name to filesystem charset 2015-03-05 10:07:07 +01:00
Max Kellermann
a261442279 output/winmm: eliminate "goto" 2015-03-05 10:07:07 +01:00
Max Kellermann
2f41eba100 fs/Path: reimplement GetSuffix() using GetBase() and StringFindLast() 2015-03-05 10:07:07 +01:00
Max Kellermann
91a6fb81c1 PlaylistStream: convert suffix to UTF-8 2015-03-05 10:07:07 +01:00
Max Kellermann
c95f0820bc TagFile: convert suffix to UTF-8 2015-03-05 10:07:07 +01:00
Max Kellermann
830a1bd130 fs/File{System,Info}: fix regular file check
Don't use FILE_ATTRIBUTE_NORMAL, it's a "magic" value for something
else.  To check if a file is a regular file, we need to check if it's
NOT a directory (or a device).
2015-03-05 10:07:07 +01:00
Max Kellermann
5c5ea8a254 fs/Path: use the "const_pointer" typedef 2015-03-05 10:07:07 +01:00
Max Kellermann
5222c684d3 event/ServerSocket: #ifdef out local socket support on Windows 2015-03-05 10:07:07 +01:00
Max Kellermann
5798faa13b util/StringUtil: add wchar_t overloads 2015-03-05 10:06:56 +01:00
Max Kellermann
a062693875 util/StringAPI: add wchar_t overloads 2015-03-05 08:58:04 +01:00
Max Kellermann
6887d5d347 fs/Traits: use TCHAR on Windows 2015-03-05 08:58:04 +01:00
Max Kellermann
39c9669445 fs/Traits: add macro PATH_LITERAL() 2015-03-05 08:58:04 +01:00
Max Kellermann
44565e22a0 fs/Traits: use string.h API wrappers 2015-03-05 08:58:04 +01:00
Max Kellermann
ddec10d494 input/Open: convert UTF-8 to filesystem charset for OpenLocalInputStream() 2015-03-05 08:51:01 +01:00
Max Kellermann
758e969cb6 input/Open: use PathTraitsUTF8 to check UTF-8 path 2015-03-05 08:40:34 +01:00
Max Kellermann
a9a6a5041b db/Configured: convert path to UTF-8 before injecting into configuration 2015-03-05 08:38:50 +01:00
Max Kellermann
59dd8ffbc6 PlaylistFile: use Path::ToUTF8() instead of PathToUTF8() 2015-03-05 08:37:00 +01:00
Max Kellermann
8f9fe1b11a PlaylistFile: don't insert "file://" before absolute paths
This prefix is deprecated.
2015-03-05 08:36:17 +01:00
Max Kellermann
9ed0152cf2 unix/PidFile: use the UTF-8 path for error message 2015-03-05 08:09:08 +01:00
Max Kellermann
250332a8d5 util/StringUtil: reorder functions 2015-03-04 20:22:05 +01:00
Max Kellermann
39825c6622 util/ASCII: strip include guard 2015-03-04 20:05:39 +01:00
Max Kellermann
cee3070ca4 output/winmm: use StringStartsWith() instead of strstr() 2015-03-04 08:58:59 +01:00
Max Kellermann
cd08e5c7da fs/io/FileOutputStream: use class FileDescriptor 2015-03-03 23:04:25 +01:00
Max Kellermann
dd4beea44c system/FileDescriptor: Close() returns bool 2015-03-03 23:04:25 +01:00
Max Kellermann
5b48d59769 system/FileDescriptor: add "mode" parameter to Open() 2015-03-03 22:29:09 +01:00
Max Kellermann
4dec12fcfc system/FileDescriptor: move O_NOCTTY|O_CLOEXEC to Open() 2015-03-03 22:20:51 +01:00
Max Kellermann
57ad3aca8e input/file: use class FileReader 2015-03-03 21:48:45 +01:00
Max Kellermann
f677f42be7 system/FileDescriptor: remove bogus assertions 2015-03-03 21:48:45 +01:00
Max Kellermann
a5760670ef fs/io/FileReader: add method GetFileInfo() 2015-03-03 21:41:11 +01:00
Max Kellermann
f04a3ec201 fs/io/FileReader: add move constructor 2015-03-03 21:41:10 +01:00
Max Kellermann
f402c5fe3c input/file: pass UTF-8 URI to InputStream ctor 2015-03-03 21:17:56 +01:00
Max Kellermann
9352e25392 input/file: add missing fcntl.h include for posix_fadvise() 2015-03-03 21:17:47 +01:00
Max Kellermann
1c90b0c19d *: change C-style prototypes, drop "(void)" 2015-03-03 20:05:08 +01:00
Max Kellermann
cd776ff1a8 system/FileDescriptor: fix WIN32 checks 2015-03-03 19:44:32 +01:00
Max Kellermann
40a587bbaf system/FileDescriptor: new wrapper class for a file descriptor 2015-03-03 17:14:30 +01:00
Max Kellermann
818d729d8b system/fd_util: remove unused functions 2015-03-03 17:07:52 +01:00
Max Kellermann
dd5daa0767 fs/io/FileReader: add method Seek() 2015-03-03 14:29:36 +01:00
Max Kellermann
ef5090c397 db/update/Container: convert vtrack name to FS charset 2015-03-03 13:20:43 +01:00
Max Kellermann
cf073de36c storage/local: convert mangled URI to FS charset 2015-03-03 13:18:15 +01:00
Max Kellermann
f16054639b storage/local: use PathTraitsFS typedefs 2015-03-03 13:12:54 +01:00
Max Kellermann
b0983e8708 fs/Traits: add Find() 2015-03-03 12:44:07 +01:00
Max Kellermann
0febb218ed FileCommands: use Path::HasNewline() 2015-03-03 12:42:27 +01:00
Max Kellermann
dfcfeeb550 fs/Traits: use std::char_traits 2015-03-03 12:28:47 +01:00
Max Kellermann
820debf45a util/StringUtil: add FindStringSuffix() 2015-03-03 11:29:31 +01:00
Max Kellermann
c19292c036 Util/StringUtil: use std::copy_n() 2015-03-02 22:35:59 +01:00
Max Kellermann
4ee81e6a3d PlaylistFile: limit variable scope 2015-03-02 22:19:47 +01:00
Max Kellermann
87a8a3e22f PlaylistFile: move memchr() call to class Path 2015-03-02 21:48:37 +01:00
Max Kellermann
e9125ef8e4 PlaylistFile: use PathTraitsFS typedefs 2015-03-02 21:47:33 +01:00
Max Kellermann
6ff394bcc9 StorageCommands: use PathTraitsUTF8 for protocol argument 2015-03-02 21:25:55 +01:00
Max Kellermann
7ce96585f5 fs/Path: add method GetSuffix()
Type-safe wrapper for uri_get_suffix().
2015-03-01 01:09:53 +01:00
Max Kellermann
41cc31c124 SongUpdate: use OpenArchiveInputStream() to open archive file
Don't pass Path::c_str() to tag_stream_scan() which requires a UTF-8
string.
2015-03-01 00:48:44 +01:00
Max Kellermann
605af61a0f db/simple: eliminate UpdateFileInArchive() if archive API is disabled
Reduce some unnecessary overhead.
2015-03-01 00:25:30 +01:00
Max Kellermann
77e163e5b8 Mapper: use Path::IsAbsolute() 2015-02-28 23:50:18 +01:00
Max Kellermann
0e00b9009d fs/Path: pass Path to Relative() 2015-02-28 23:45:16 +01:00
Max Kellermann
a6dd998d31 fs/AllocatedPath: use PathTraitsFS::Relative()
Eliminate duplicate code.
2015-02-28 23:30:53 +01:00
Max Kellermann
cdd0ccc67a fs/Path: rename RelativeFS() to Relative() 2015-02-28 23:19:34 +01:00
Max Kellermann
a918821868 fs/Traits: add missing dereference in RelativePathImpl() 2015-02-28 23:19:34 +01:00
Max Kellermann
c637b96f10 Win32Main: use TCHAR where appropriate 2015-02-28 23:15:46 +01:00
Max Kellermann
44b9197354 Mapper: use class Path 2015-02-28 23:00:27 +01:00
Max Kellermann
7a8f96b1dd FileCommands: use PathTraitsFS typedefs 2015-02-28 23:00:26 +01:00
Max Kellermann
f4f21f462d fs/CheckFile: convert path to UTF-8 for error message 2015-02-28 23:00:26 +01:00
Max Kellermann
d09b8b5bd7 fs/FileInfo: use GetFileAttributesEx() on WIN32 2015-02-28 23:00:26 +01:00
Max Kellermann
ee327db517 fs/FileSystem: remove unused WIN32 port of StatFile() 2015-02-28 23:00:26 +01:00
Max Kellermann
90a61b6bab fs/FileInfo: new library providing GetFileInfo()
Replaces StatFile(), with a portable data object.
2015-02-28 23:00:26 +01:00
Max Kellermann
00583bc4a8 FileCommands: skip special files completely
Previously, MPD printed the time stamp without printing the file
name.  That made no sense.
2015-02-28 23:00:26 +01:00
Max Kellermann
2d06a8e880 storage/FileInfo: rename to StorageFileInfo 2015-02-28 23:00:26 +01:00
Max Kellermann
e1a434edbc fs/Path: make IsAbsolute() const 2015-02-28 23:00:26 +01:00
Max Kellermann
6b3b1cbd99 fs/FileSystem: use GetFileAttributes() on WIN32 if possible 2015-02-27 19:15:31 +01:00
Max Kellermann
4dd861ee23 fs/FileSystem: merge CheckAccess() into PathExists()
PathExists() should better do what CheckAccess() does, and
CheckAccess() doesn't do what its name implies.
2015-02-27 19:13:46 +01:00
Max Kellermann
4f0f81a047 fs/DirectoryReader: use FindFirstFile(), FindNextFile() on WIN32 2015-02-26 18:11:02 +01:00
Max Kellermann
e3908c8de6 fs/Traits: add constant CURRENT_DIRECTORY 2015-02-25 19:53:35 +01:00
Max Kellermann
81c49fba03 fs/AllocatedPath: add nullptr_t constructor 2015-02-25 19:53:35 +01:00
Max Kellermann
eb174d5ba3 fs/{Allocated,}Path,Charset: use PathTraitsFS typedefs 2015-02-25 19:17:45 +01:00
Max Kellermann
4c899e9c5a fs/FileSystem: remove unused FOpenModes 2015-02-25 19:17:45 +01:00
Max Kellermann
00b0f6ad51 fs/io/File{Reader,OutputStream}: convert path to UTF-8 for error message 2015-02-25 19:10:51 +01:00
Max Kellermann
fe1e467a49 db/ExcludeList: use the TextFile class instead of stdio.h 2015-02-25 16:25:26 +01:00
Max Kellermann
73cb538d72 configure.ac: enable STRICT mode on Windows 2015-02-25 16:01:30 +01:00
Max Kellermann
64b9e7fd48 util/DynamicFifoBuffer: adjust include guard 2015-02-16 00:53:59 +01:00
Max Kellermann
12de22d3bb net/StaticSocketAdress: new class wrapping struct sockaddr_storage 2015-02-13 21:16:43 +01:00
Max Kellermann
821bc6d777 system/ByteOrder: use GCC built-ins if available 2015-02-12 11:05:02 +01:00
Max Kellermann
6e66a5b77b net/Resolver: relax size check in LocalAddressToString()
Handles abstract sockets on Linux.
2015-02-10 22:47:26 +01:00
Max Kellermann
cf5c10bbe6 net/Resolver: move code to LocalAddressToString() 2015-02-10 22:46:04 +01:00
Max Kellermann
4e30e74739 net/SocketAddress: light wrapper for struct sockaddr 2015-02-10 22:06:06 +01:00
Max Kellermann
42890b9acf system/{Resolver,Socket{Error,Util}}: move to new library libnet.a 2015-02-10 22:06:06 +01:00
Max Kellermann
33a27379f9 Listen: add "override" 2015-02-10 22:05:57 +01:00
Max Kellermann
0cf57cc7ca event/ServerSocket: remove obsolete macro DEFAULT_PORT 2015-02-10 20:27:45 +01:00
Max Kellermann
68fcbaf4c8 event/ServerSocket: remove obsolete typedef 2015-02-10 20:24:23 +01:00
Max Kellermann
9c83d3c78c fs/io/FileOutputStream: use CREATE_ALWAYS instead of TRUNCATE_EXISTING
Fixes yet another breakage of creating the database+state file on
Windows.
2015-02-10 13:41:09 +01:00
Max Kellermann
676dfabc91 command/{Queue,File}Commands: drop "file:///" prefix for absolute paths
Requiring this prefix makes the client's intention very clear, but it
was too hard to understand why this prefix was needed.  Initially, my
intention was to differentiate from broken clients which prefix relate
URIs with a slash; once MPD allowed that.  In the past few years
however, MPD has disallowed that, and there was no significant
breakage (except for the "add /" special case which some clients
apparently still do).  So I figure it's about time to define that an
URI that begins with a slash points to an arbitrary file on the file
system.
2015-02-09 07:55:06 +01:00
Max Kellermann
60e6d1d61b fs/Charset: convert #ifdef to regular "if" 2015-02-09 07:44:21 +01:00
Max Kellermann
975e275030 fs/Charset: change FixSeparators() API to use std::string&& 2015-02-08 17:52:01 +00:00
Max Kellermann
afcd5670e3 Listen: remove C-style "void" 2015-02-07 12:15:10 +00:00
Max Kellermann
b17b53955c configure.ac: raise protocol version to 0.20.0
A few protocol feature have been added to the 0.20 branch, and thus we
should raise the protocol version in the server greeting.
2015-02-06 17:16:57 +01:00
Max Kellermann
ff2b427cc1 Merge tag 'v0.19.9' 2015-02-06 17:15:31 +01:00
Max Kellermann
5761800197 release v0.19.9 2015-02-06 17:08:25 +01:00
Max Kellermann
0eebacc521 Merge tag 'v0.18.23' into v0.19.x 2015-02-06 17:07:47 +01:00
Max Kellermann
4a5528697d release v0.18.23 2015-02-06 17:04:14 +01:00
Max Kellermann
d38034bb5c fs/io/FileOutputStream: don't auto-delete file on WIN32
The file handle is never reset to INVALID_HANDLE_VALUE, and thus the
destructor will assume the operation shall be cancelled and will
delete the temporary file.

This was a major breakage for saving the database file and the state
file.
2015-02-06 14:36:55 +01:00
Max Kellermann
a62fe30546 SongPrint: let CPP concatenate string literals 2015-02-06 13:06:38 +01:00
Max Kellermann
b3fe3e8b3d TagBuilder: allow adding duplicate tag types in Complement()
Build a table of pre-existing tag types before adding new items.  The
old way would check HasType() each time, which would return true after
the first instance of that tag type had been added, preventing
duplicate tag types to be merged.

This broke duplicate tag types loaded from the state file, because
this code path uses TagBuilder::Complement().
2015-02-06 12:25:34 +01:00
Max Kellermann
25ebb427da tag/Rva2: convert pointers to references 2015-02-04 15:57:32 +01:00
Max Kellermann
c5bde10b4f tag/Rva2: rename struct rva2_data to CamelCase 2015-02-04 15:56:59 +01:00
Max Kellermann
e582e893cc tag/Rva2: make enum rva2_channel strictly-typed 2015-02-04 15:56:01 +01:00
Max Kellermann
833ec3d3cd lib/upnp/Discovery: remove locking from ExpireDevices() 2015-02-03 23:48:11 +01:00
Max Kellermann
3d446d3266 lib/upnp/Discovery: apply naming convention 2015-02-02 21:12:19 +00:00
Max Kellermann
e660229c40 output/sles: use AudioOutputWrapper::Create() 2015-02-01 22:24:19 +01:00
Max Kellermann
5489dec28d NEWS: fix v0.18.22 release date 2015-02-01 12:22:24 +01:00
Max Kellermann
ee6e0e16cb DecoderThread: make variables more local 2015-01-31 22:20:38 +01:00
Max Kellermann
eb1733609a decoder/sndfile, ...: update API documentation 2015-01-31 22:17:15 +01:00
Max Kellermann
8a6b4db19f Makefile.am: move org_musicpd_Bridge.h to BUILT_SOURCES 2015-01-31 00:05:30 +01:00
Max Kellermann
df43b6a05c Makefile.am: generate icon before compiling JNI classes
Apparently, Android's build.xml requires the icon to be available,
even when only running the Java compiler.
2015-01-31 00:05:30 +01:00
Max Kellermann
e2e66404d5 decoder/DsdLib: fix integer overflow in ID3 size calculation 2015-01-30 23:22:49 +01:00
Max Kellermann
3ecb19d0f1 decoder/DsdLib: check size before seeking 2015-01-30 23:19:26 +01:00
Max Kellermann
fd02c87fa2 decoder/DsdLib: don't use InputStream::GetOffset() after seeking
We already know the offset.
2015-01-30 23:00:22 +01:00
Max Kellermann
63ac81c8f5 decoder/DsdLib: pass offset_type t dsdlib_tag_id3() 2015-01-30 22:47:43 +01:00
Max Kellermann
557bee61d5 Merge branch 'v0.19.x' 2015-01-29 22:55:18 +01:00
Max Kellermann
3adca3c2fa db/update/Walk: use std::unique_ptr instead of std::auto_ptr
std::auto_ptr is deprecated, and std::unique_ptr is much better
anyway.
2015-01-29 08:37:23 +01:00
PHO
39abd3ecb4 Avoid integer overflow in MonotonicClock{S,MS,US}
This is Darwin specific: the previous implementation was causing an integer
overflow when base.numer is very large. On PPC Darwin, the timebase info is 1000000000/33330116 and this is too large for integer arithmetic.
2015-01-29 08:34:37 +01:00
PHO
a4f4fc50b9 Avoid integer overflow in MonotonicClock{S,MS,US}
This is Darwin specific: the previous implementation was causing an integer
overflow when base.numer is very large. On PPC Darwin, the timebase info is 1000000000/33330116 and this is too large for integer arithmetic.
2015-01-29 08:33:48 +01:00
Max Kellermann
7bf638b0de decoder/DsdLib: use new[] to allocate the ID3 buffer
Don't abort the process if there's not enough memory.  This buffer is
not important and can be large.
2015-01-29 08:24:34 +01:00
Max Kellermann
56662a703c decoder/DsdLib: free ID3 buffer right after id3_tag_parse()
Merge two free() calls.
2015-01-29 08:24:34 +01:00
Max Kellermann
8b5f47d3a3 decoder/DsdLib: raise ID3 tag limit to 1 MB
A bug report was submitted with a 600 kB ID3 tag that could not be
read by MPD.
2015-01-29 08:20:14 +01:00
Max Kellermann
8bfb88840b output/fifo: use template AudioOutputWrapper 2015-01-28 19:43:37 +01:00
Max Kellermann
593bb5a8a7 StickerDatabase: convert the struct name to upper case 2015-01-28 19:33:56 +01:00
Max Kellermann
822ac7b100 win32/build.py: fix IndexError when no command-line arguments are given 2015-01-27 09:07:41 +01:00
Max Kellermann
cc70c5c67d win32/build.py: use os.path.abspath() to build mpd_path
Fixes a bug that occurs when runing "build.py" from inside the
"win32" directory.
2015-01-26 20:59:57 +01:00
Max Kellermann
ae7e1a22cb Merge branch 'v0.19.x' 2015-01-26 20:57:29 +01:00
Max Kellermann
a289dcb9ee Merge branch 'v0.18.x' into v0.19.x 2015-01-26 20:48:19 +01:00
PHO
023b9c1e7e Test the existence of strndup(3) before using it.
This can eliminate the ad-hoc "#ifdef WIN32" and can also support other platforms lacking it as well (including Darwin 9).
2015-01-26 20:39:49 +01:00
Max Kellermann
4c61662644 test/read_mixer: add missing stdlib.h include 2015-01-26 20:39:49 +01:00
Max Kellermann
ad1b6ef0ac {playlist,input}/despotify: remove defunct plugin 2015-01-26 09:55:31 +01:00
Max Kellermann
16944b5397 pcm/SoxrResampler: move quality recipe names to table 2015-01-25 10:01:50 +01:00
Max Kellermann
ed5c6be2f1 util/list: disable gcc5 warning
This file has been removed in newer MPD versions, so don't care about
it now.
2015-01-23 16:50:31 +01:00
Max Kellermann
30cb082932 ClientProcess: cast enum to int before passing to printf()
Fixes gcc5 warning.
2015-01-23 16:50:31 +01:00
Max Kellermann
645554d12f configure.ac: prepare for 0.18.23 2015-01-23 16:47:13 +01:00
Max Kellermann
72e44d596f tag/Format: add %iso8601% 2015-01-22 19:10:15 +01:00
Max Kellermann
8f2ca8f085 ConfigFile: fix typo (parser breakage) 2015-01-22 19:08:09 +01:00
Max Kellermann
6725c2afa1 util/format: allow upper case, digits and underscore in names 2015-01-22 18:59:42 +01:00
Max Kellermann
e9d4b73cc3 util/format: move code to is_name_char() 2015-01-22 18:59:01 +01:00
Max Kellermann
212b0faf0c android/build.py: use os.path.abspath() to build mpd_path
Fixes a bug that occurs when runing "build.py" from inside the
"android" directory.
2015-01-22 18:51:53 +01:00
Max Kellermann
929ec70512 queue/PlaylistState: remove unused macro 2015-01-22 18:44:30 +01:00
Max Kellermann
6cd5d73607 pcm/SoxrResampler: allow multi-threaded resampling 2015-01-22 11:37:18 +01:00
Max Kellermann
80a7e1ea7d pcm/SoxrResampler: add a global soxr_runtime_spec_t variable 2015-01-22 11:37:09 +01:00
Max Kellermann
0d3b26b3aa Config: add section "resampler" 2015-01-22 11:04:28 +01:00
Max Kellermann
52acea7b1f doc/user: move resampler list to the plugin reference section 2015-01-22 11:04:28 +01:00
Max Kellermann
e9b49a43e2 config/Block: add method IsEmpty() 2015-01-22 10:20:51 +01:00
Max Kellermann
4fa5538e2b config/Param: split block-specific attributes to new struct ConfigBlock
The old struct config_param remains only for top-level string options.
2015-01-21 23:56:33 +01:00
Max Kellermann
84e74173de config/File: move code to ReadConfigParam() 2015-01-21 23:51:04 +01:00
Max Kellermann
6cdb2a4896 fs/io/BufferedReader: count line numbers
Replaces the dirty code in config/ConfigFile.cxx.
2015-01-21 23:43:32 +01:00
Max Kellermann
d8bef3270d config/File: use FileReader/BufferedReader instead of stdio 2015-01-21 23:36:57 +01:00
Max Kellermann
a33db8fe6f config/Data: assign nullptr during iteration 2015-01-21 23:30:00 +01:00
Max Kellermann
1c3f5517fa config/Option: convert to strictly-typed enum 2015-01-21 23:30:00 +01:00
Max Kellermann
10972da060 input/curl: work around format warning on WIN32 2015-01-21 23:30:00 +01:00
Max Kellermann
a38f02541d config/Param: make "line" signed 2015-01-21 22:19:36 +01:00
Max Kellermann
fdba76ba47 ConfigFile: convert macros to constexpr 2015-01-21 22:12:16 +01:00
Max Kellermann
f900ab0121 config/Data: add method Clear()
Move code from config_global_finish().
2015-01-21 21:50:02 +01:00
Max Kellermann
f80ab6a7a2 ConfigData: rename header file 2015-01-21 21:49:09 +01:00
Max Kellermann
6ed209bbf3 config/Param: make constructor "explicit" 2015-01-21 21:32:26 +01:00
Max Kellermann
fe85fa3bea ConfigData: move struct config_param to Param.hxx 2015-01-21 21:23:02 +01:00
Max Kellermann
76b7882f33 ConfigData: rename struct block_param to BlockParam 2015-01-21 21:18:25 +01:00
Max Kellermann
bf0ab2d44c ConfigData: move struct block_param to Block.?xx 2015-01-21 20:45:34 +01:00
Max Kellermann
276a0d9500 thread/Name: include stdio.h if HAVE_PRCTL
Caused a build failure with uClibc because snprintf() was not
available.
2015-01-21 20:40:56 +01:00
Max Kellermann
bcbfa560e9 pcm/SoxrResampler: use a global soxr_quality_spec_t variable 2015-01-21 19:59:50 +01:00
Max Kellermann
8b366f0795 pcm/SoxrResampler: soxr_parse_converter() returns unsigned long 2015-01-21 19:56:57 +01:00
Max Kellermann
aa08f9692c pcm/SoxrResampler: add constant SOXR_DEFAULT_QUALITY 2015-01-21 19:56:36 +01:00
Max Kellermann
288ba84939 pcm/SoxrResampler: fix indent 2015-01-21 19:47:14 +01:00
Max Kellermann
4c74016b1a MixerAll: restore "null" mixer volume from state file 2015-01-16 19:48:26 +01:00
Max Kellermann
384b6c8288 doc/protocol: "playlistsearch" is case insensitive 2015-01-16 17:27:19 +01:00
Max Kellermann
a2af158fd3 configure.ac: prepare for 0.19.9 2015-01-16 17:26:50 +01:00
Joshua Wise
1d8544ef3b db/plugins/ProxyDatabasePlugin: add "keepalive" parameter 2015-01-15 14:44:55 -08:00
Max Kellermann
91a12f76cd util/CharUtil: minor API documentation fix 2015-01-15 19:34:02 +01:00
Max Kellermann
f4627acc48 win32/build.py: prepend "./" to "configure" if path is empty
Fixes in-tree build when the script is called as "win32/build.py"
and not "./win32/build.py".
2015-01-14 23:23:24 +01:00
Max Kellermann
2b1194d574 Merge tag 'v0.19.8' 2015-01-14 23:22:42 +01:00
Max Kellermann
f33d2fb2e7 release v0.19.8 2015-01-14 23:12:24 +01:00
Max Kellermann
a9eec35aff Merge tag 'v0.18.22' into v0.19.x 2015-01-14 23:12:08 +01:00
Max Kellermann
8534f2d1e2 release v0.18.22 2015-01-14 23:04:49 +01:00
Max Kellermann
e8debd2e45 output/recorder: dynamic file name 2015-01-14 22:03:26 +01:00
Max Kellermann
1caa41a623 test/run_encoder: use EncoderToOutputStream() 2015-01-14 21:56:28 +01:00
Max Kellermann
bf59635280 output/recorder: move code to encoder/ToOutputStream.cxx 2015-01-14 20:11:00 +01:00
Max Kellermann
5d6f75aaef Makefile.am: link output plugins before libtag.a 2015-01-14 19:59:27 +01:00
Max Kellermann
eaf0662b75 fs/io/FileOutputStream: add static method Create() 2015-01-14 19:44:28 +01:00
Wieland Hoffmann
6e8ea2a2cb doc/protocol.xml: Fix a typo 2015-01-14 12:28:09 +01:00
Max Kellermann
b043b2a761 fs/AllocatedPath: add operator== 2015-01-13 10:42:29 +01:00
Max Kellermann
ac7e0dfb77 DetachedSong: remove obsolete friend declaration 2015-01-12 20:56:07 +01:00
Max Kellermann
05d47bb09a output/null: convert struct to class 2015-01-09 19:30:22 +01:00
Max Kellermann
575a5bd0b8 output/null: move functions into the struct 2015-01-09 17:44:00 +01:00
Max Kellermann
00740fb23b android/build.py: prepend "./" to "configure" if path is empty
Fixes in-tree build when the script is called as "android/build.py"
and not "./android/build.py".
2015-01-09 16:51:52 +01:00
Max Kellermann
ae4c189e19 encoder/Interface: move functions into the struct 2015-01-08 19:36:19 +01:00
Max Kellermann
362a6e6d46 encoder/Plugin: move struct Encoder to EncoderInterface.hxx 2015-01-08 19:31:57 +01:00
Max Kellermann
c76c7c68ff output/recorder: convert struct to class 2015-01-08 16:56:22 +01:00
Max Kellermann
59ac9d39d5 output/recorder: move encoder_finish() call to destructor 2015-01-08 16:56:13 +01:00
Max Kellermann
ec41caade4 output/wrapper: add method SendTag() 2015-01-07 19:20:09 +01:00
Max Kellermann
06ec06cdd7 output/recorder: remove unused variable "recorder_output_domain" 2015-01-07 19:17:07 +01:00
Max Kellermann
b7acf86408 output/recorder: use FileOutputStream 2015-01-07 19:14:23 +01:00
Max Kellermann
58c4db925b output/recorder: log commit errors 2015-01-07 19:13:55 +01:00
Max Kellermann
fe0c4ff3c2 output/recorder: move code to method Commit() 2015-01-07 19:11:04 +01:00
Max Kellermann
7a2af0fbf4 output/recorder: move more functions into the struct 2015-01-07 18:55:34 +01:00
Max Kellermann
d83127722f output/oss: use nullptr instead of NULL 2015-01-07 18:55:34 +01:00
Max Kellermann
dc03ad05be output/oss: add "const" attributes 2015-01-07 18:50:38 +01:00
Max Kellermann
a62df3cb8f output/oss: eliminate unnecessary tail code after "switch" 2015-01-07 18:49:29 +01:00
Max Kellermann
18e32abda9 output/oss: convert struct to class 2015-01-07 18:43:52 +01:00
Max Kellermann
15d29da43b output/oss: add "device" parameter to constructor 2015-01-07 18:43:45 +01:00
Max Kellermann
8b217d5313 fs/io/FileOutputStream: use O_TMPFILE if available
The Linux feature allows writing new files to an invisible file, and
then replace the old file.  This preserves the old file if we get
interrupted by some event.
2015-01-06 19:38:55 +01:00
Max Kellermann
ac62586bad test/WriteFile: new debug program 2015-01-06 19:38:55 +01:00
Max Kellermann
c150fd9a1c output/oss: move functions into the struct 2015-01-06 16:24:33 +01:00
Max Kellermann
674d14879f Merge branch 'v0.19.x' 2015-01-06 12:54:46 +01:00
Max Kellermann
37e9010887 input/async: reset the "open" flag after seeking successfully
Fixes a problem with the "curl" input plugin: IsEOF() always returns
true because the "open" flag was cleared by
CurlInputStream::RequestDone() when end-of-stream was reached.  This
flag stays false even when seeking to another position has succeeded.

This patch resets the "open" flag to true after seeking successfully.
2015-01-06 12:46:28 +01:00
Max Kellermann
4bd2c75056 thread/Name: disable pthread_setname_np() on NetBSD
NetBSD's pthread_setname_np() prototype is incompatible with the rest
of the world, and it requires to pass the string argument as a
non-const pointer.  Instead of working around this misdesign, I hereby
disable the feature on NetBSD.
2015-01-06 12:08:36 +01:00
Max Kellermann
b9ed850b98 thread/Name: enable FormatThreadName() with prctl()
Add macro HAVE_THREAD_NAME which is set when any method to set the
thread name is available.  Use that macro in FormatThreadName()
instead of just checking for HAVE_PTHREAD_SETNAME_NP.
2015-01-06 12:04:30 +01:00
Max Kellermann
11cea17496 thread/Name: indent preprocessor commands 2015-01-06 12:04:15 +01:00
Max Kellermann
81df45a893 fs/io/File{Reader,OutputStream}: use OpenFile() 2015-01-05 23:13:35 +01:00
Max Kellermann
c1f0708a5d output/recorder: use config_param::GetBlockPath()
Supports "~/" expansion.  Forces us to switch from "const char *" to
AllocatedPath, which is a good thing.
2015-01-05 19:49:54 +01:00
Max Kellermann
153f5854e2 output/alsa: move functions into the struct 2015-01-04 19:53:56 +01:00
Max Kellermann
f532964fde output/pulse: add wrapper for pa_threaded_mainloop_signal() 2015-01-04 19:51:09 +01:00
Max Kellermann
efea609dc3 output/pulse: convert to class 2015-01-04 19:46:51 +01:00
Max Kellermann
f3a160038d output/pulse: move more code into the struct 2015-01-04 19:45:58 +01:00
Max Kellermann
f016eef48a output/pulse: use AudioOutputWrapper::Init() 2015-01-04 19:44:45 +01:00
Max Kellermann
f649514183 output/openal: convert macro to constexpr 2015-01-03 20:00:41 +01:00
Max Kellermann
afd31677dd output/openal: convert struct to class 2015-01-03 20:00:16 +01:00
Max Kellermann
b28710b08c output/openal: move functions into the class 2015-01-02 18:40:16 +01:00
Max Kellermann
712ed555e6 Copyright year 2015 2015-01-01 19:48:13 +01:00
Max Kellermann
11fb5bc3d0 output/osx: use nullptr instead of NULL 2014-12-31 11:47:27 +01:00
Max Kellermann
2a5feb225b ConfigData: use nullptr instead of NULL 2014-12-30 23:26:54 +01:00
Max Kellermann
970e338847 output/pulse: move code into the struct 2014-12-30 00:03:07 +01:00
Max Kellermann
0b9f650fe2 output/Wrapper: new helper class 2014-12-29 23:45:14 +01:00
Max Kellermann
977834179a output/pulse: move initialization to constructor 2014-12-29 23:07:18 +01:00
Max Kellermann
b42732743d output/pulse: remove unnecessary initialization 2014-12-29 23:00:11 +01:00
Max Kellermann
99e6409a67 {mixer,output}/pulse: move code to LogPulseError() 2014-12-29 22:42:52 +01:00
Max Kellermann
6a0a5f9693 output/pulse: move SetError() to lib/pulse/Error.cxx 2014-12-29 22:34:32 +01:00
Max Kellermann
fe9db8b369 {mixer,output}/pulse: use a common Domain instance 2014-12-29 22:25:14 +01:00
Max Kellermann
ca035d0e8d mixer/pulse: remove redundant "virtual" keywords 2014-12-29 22:23:58 +01:00
Max Kellermann
84c9260dc4 output/fifo: make variables more local 2014-12-28 00:48:05 +01:00
Max Kellermann
987c02e946 output/pipe: convert to class 2014-12-27 18:57:18 +01:00
Max Kellermann
5c0bc612fe output/pipe: add static method Create() 2014-12-27 18:56:23 +01:00
Max Kellermann
0e28b53242 output/pipe: merge Initialize() and Configure() 2014-12-27 18:56:08 +01:00
Max Kellermann
5fc0ce80fc output/pipe: move functions into the struct 2014-12-27 18:42:31 +01:00
Max Kellermann
af9092df39 EncoderPlugin: pass Tag reference to method tag() 2014-12-26 22:30:54 +01:00
Max Kellermann
58a5da33c2 OutputPlugin: pass Tag reference to _send_tag() 2014-12-26 22:27:01 +01:00
Max Kellermann
7077eac589 test/FakeDecoderAPI: dump tags 2014-12-26 22:23:55 +01:00
Max Kellermann
b3435ae432 output/recorder: implement send_tag() 2014-12-26 15:03:22 +01:00
Max Kellermann
a31129333c output/recorder: move functions into the struct 2014-12-26 14:57:29 +01:00
Max Kellermann
2983c2a24f output/jack: fix implicit nullptr/bool conversion
Return false on error, not nullptr.
2014-12-26 14:44:47 +01:00
Max Kellermann
412bedb697 Merge branch 'v0.19.x' 2014-12-26 14:40:32 +01:00
Max Kellermann
163597ef69 db/simple: fix implicit nullptr/bool conversion
Return false on error, not nullptr.
2014-12-26 14:34:03 +01:00
Max Kellermann
95f84afd33 fs/Traits, ...: work around -Wtautological-pointer-compare
New in clang 3.6.
2014-12-26 14:34:03 +01:00
Max Kellermann
9f7fd1fbfb db/lazy, input/mms: add "override" keywords
Fixes -Winconsistent-missing-override (clang 3.6).
2014-12-26 14:29:29 +01:00
Max Kellermann
940cab8620 Merge branch 'v0.18.x' into v0.19.x 2014-12-26 14:28:52 +01:00
Max Kellermann
d37811f177 lib/ffmpeg/Buffer: always include libavutil/mem.h
Needed for av_free().
2014-12-26 14:09:45 +01:00
Max Kellermann
5b84c99d79 doc/user: remove autoconf/automake from Debian build dependencies 2014-12-26 14:00:50 +01:00
Max Kellermann
b295024574 doc/user: add more Debian build dependencies 2014-12-26 13:56:26 +01:00
Max Kellermann
34180f1745 doc/user: add libicu-dev to Debian build dependencies 2014-12-26 13:54:33 +01:00
Max Kellermann
665031467a db/proxy, output/shout: fix implicit nullptr/bool conversion
Return false on error, not nullptr.
2014-12-26 13:50:54 +01:00
Max Kellermann
df33171107 db/{simple,proxy}, ...: add "override" keywords
Fixes -Winconsistent-missing-override (clang 3.6).
2014-12-26 13:47:04 +01:00
Max Kellermann
53f4044890 util/{ASCII,UriUtil}, ...: work around -Wtautological-pointer-compare
New in clang 3.6.
2014-12-26 13:43:32 +01:00
Max Kellermann
a5049136ff DatabaseGlue: convert nullptr check to assertion 2014-12-26 13:43:32 +01:00
Max Kellermann
705b3c6b63 util/ASCII: fix indent 2014-12-26 13:37:38 +01:00
Max Kellermann
6b4ac66962 Compiler.h: add macro CLANG_CHECK_VERSION() 2014-12-26 13:31:03 +01:00
Max Kellermann
0964b06240 Compiler.h: add macro GCC_OLDER_THAN() 2014-12-26 13:30:44 +01:00
Max Kellermann
92eeca3ba7 util/Manual: reimplement GCC_CHECK_VERSION() using GCC_MAKE_VERSION() 2014-12-26 13:30:22 +01:00
Max Kellermann
2a86554ac4 Compiler.h: add macro GCC_MAKE_VERSION() 2014-12-26 13:30:11 +01:00
Max Kellermann
805caa30ce configure.ac: prepare for 0.18.22 2014-12-26 13:23:04 +01:00
Max Kellermann
d4ca853fd3 output/jack: move code to separate functions 2014-12-25 22:18:22 +01:00
Max Kellermann
5a8d2e8057 output/jack: cache AudioFormat::channels 2014-12-24 23:22:56 +01:00
Max Kellermann
687fc358fd output/jack: fix typo 2014-12-24 23:22:56 +01:00
Max Kellermann
c4c2da06b7 output/jack: use jack_ringbuffer_get_write_vector()
Reduce number of libjack calls.
2014-12-24 23:14:15 +01:00
Max Kellermann
8928cd53bf output/jack: move jack_ringbuffer_write_space() call to WriteSamples() 2014-12-24 23:08:39 +01:00
Max Kellermann
ca88fc4ed3 output/jack: cache AudioFormat::channels 2014-12-24 23:04:29 +01:00
Max Kellermann
b83a1d79b7 output/jack: pass float* to WriteSamples() 2014-12-24 23:02:19 +01:00
Max Kellermann
cec2a837cf output/jack: WriteSamples() returns size_t 2014-12-24 23:00:46 +01:00
Max Kellermann
cff47262da output/jack: pass size_t to WriteSamples() 2014-12-24 23:00:15 +01:00
Max Kellermann
da83eae754 output/jack: use SampleFormat::FLOAT
What JACK expects is already implemented in MPD, just not used.  The
sample format conversion code in the JACK plugin was redundant and
could reduce sound quality.
2014-12-24 22:40:00 +01:00
Max Kellermann
c5409d52f5 output/Internal: move enum AudioOutputCommand into the struct 2014-12-24 22:18:47 +01:00
Max Kellermann
54fc8f0e8c output/Internal: convert audio_output_command to strictly-typed enum 2014-12-24 22:13:50 +01:00
Max Kellermann
2ea633a2f7 output/jack: use std::fill() 2014-12-24 16:27:13 +01:00
Max Kellermann
9a52043fad output/jack: move functions into the struct 2014-12-24 16:10:27 +01:00
Max Kellermann
39a5be2df9 output/jack: merge two mpd_jack_available() calls 2014-12-24 16:10:27 +01:00
Max Kellermann
96560e317a output/jack: make variables more local 2014-12-24 15:21:23 +01:00
Max Kellermann
adb27903eb output/jack: convert const to constexpr 2014-12-24 15:14:51 +01:00
Max Kellermann
51150faa39 output/jack: convert enum to constexpr 2014-12-24 09:52:32 +01:00
Max Kellermann
a56949e9fa decoder/ffmpeg: support interleaved floating point 2014-12-23 20:51:08 +01:00
Max Kellermann
ea96919b80 Merge branch 'v0.19.x' 2014-12-23 20:43:15 +01:00
Max Kellermann
43da4c0eca input/mms: limit the mmsx_read() size 2014-12-23 20:34:45 +01:00
Max Kellermann
5835afb849 decoder/ffmpeg: fix indent 2014-12-23 10:21:34 +01:00
Max Kellermann
b9c7771830 decoder/DsdLib: add missing stdlib.h include 2014-12-23 10:08:46 +01:00
Jan Brittenson
35db88affe DSF ID3 tags hitting 4k size limit
Here's a change to dynamically allocate the DSD ID3 tag buffer.
Pretty much anything with cover art is going to exceed the existing,
static 4k limit...  Here's a change to dynamically allocate the buffer
and sanity check it at some upper limit.  I rather arbitrarily pulled
256k out of thin air just to keep a corrupt file from causing it to
trying to allocate a buffer larger than available memory.
2014-12-23 09:49:33 +01:00
Max Kellermann
e38faca455 configure.ac: prepare for 0.19.8 2014-12-23 09:48:31 +01:00
Max Kellermann
0255e8710c android: release v0.19.7 2014-12-23 09:42:52 +01:00
Max Kellermann
7f3fecbdf5 decoder/ffmpeg: simplify mpd_ffmpeg_open_input() 2014-12-22 22:24:10 +01:00
Max Kellermann
a2c6d5e148 decoder/ffmpeg: move functions into the AvioStream struct 2014-12-22 21:58:25 +01:00
Max Kellermann
373706c92b configure.ac: add macro MPD_DEFINE_CONDITIONAL 2014-12-22 10:31:50 +01:00
Max Kellermann
7afe63aa06 configure.ac: use MPD_ENABLE_AUTO_PKG_LIB for libgme 2014-12-22 10:28:15 +01:00
Max Kellermann
8fab855099 configure.ac: remove redundant declaration "HAVE_ISO9660" 2014-12-22 10:19:13 +01:00
Max Kellermann
062fef36f9 m4/mpd_auto: fix description in AC_DEFINE() 2014-12-22 10:19:13 +01:00
Max Kellermann
fefe2df3ee input/ffmpeg: use FfmpegInit() instead of av_register_all()
Make sure that the log callback is installed.
2014-12-21 20:56:42 +01:00
Max Kellermann
90b91ead72 decoder/ffmpeg: move code to lib/ffmpeg/Init.cxx 2014-12-21 20:51:41 +01:00
Max Kellermann
1e98e41381 decoder/ffmpeg: move code to lib/ffmpeg/LogCallback.cxx 2014-12-20 18:46:29 +01:00
Max Kellermann
7030e8f050 decoder/ffmpeg: remove obsolete comment 2014-12-19 11:53:58 +01:00
Max Kellermann
74bb514a8c decoder/ffmpeg: convert enums to constexpr 2014-12-19 11:53:58 +01:00
Max Kellermann
46914e486c decoder/ffmpeg: move struct AvioStream to FfmpegIo.hxx 2014-12-19 10:35:10 +01:00
Max Kellermann
f9abc561fb decoder/ffmpeg: remove unnecessary nullptr check for av_free() 2014-12-19 10:33:17 +01:00
Max Kellermann
2e22ff2e36 decoder/ffmpeg: use AVStream::duration
Use the duration of the stream we're actually decoding - not the
"global" attribute AVFormatContext::duration which may differ.
2014-12-19 10:23:05 +01:00
Max Kellermann
8c3be4a5f0 decoder/ffmpeg: skip _scan_stream() if no audio stream was found 2014-12-19 10:21:51 +01:00
Max Kellermann
3fe2f7337c decoder/ffmpeg: remove redundant audio stream check 2014-12-19 10:20:45 +01:00
Max Kellermann
ec24eb1d8e decoder/ffmpeg: use more references 2014-12-19 10:19:19 +01:00
Max Kellermann
ffcaf85609 decoder/ffmpeg: merge avformat_close_input() calls 2014-12-19 09:57:29 +01:00
Max Kellermann
d0c481e44e lib/ffmpeg/Time: add API documentation 2014-12-19 09:49:29 +01:00
Max Kellermann
67e2d9f9e1 decoder/ffmpeg: move code to lib/ffmpeg/Time.hxx 2014-12-19 09:41:21 +01:00
Max Kellermann
dd5aa2b483 decoder/ffmpeg: use av_free() instead of av_freep() 2014-12-19 09:23:22 +01:00
Max Kellermann
806494a254 decoder/ffmpeg: add API documentation 2014-12-19 06:41:50 +01:00
Max Kellermann
5c3afd020a decoder/ffmpeg: copy_interleave_frame() returns ConstBuffer 2014-12-18 23:44:56 +01:00
Max Kellermann
190cdfc326 decoder/ffmpeg: copy_interleave_frame() returns Error 2014-12-18 23:39:56 +01:00
Max Kellermann
13b954c765 decoder/ffmpeg: pass AVPacket copy to ffmpeg_send_packet() 2014-12-18 23:24:11 +01:00
Max Kellermann
49f6b50ed3 decoder/ffmpeg: simplify ffmpeg_send_packet() 2014-12-18 23:21:48 +01:00
Max Kellermann
0f2a304d34 decoder/ffmpeg: pass references instead of pointers 2014-12-18 23:08:08 +01:00
Max Kellermann
a142f93dca decoder/ffmpeg: move code to class FfmpegBuffer 2014-12-18 22:24:28 +01:00
Max Kellermann
2dfe2fb22c decoder/ffmpeg: fix crash on out-of-memory
Fixes regression by commit 7c8038e
2014-12-18 22:24:02 +01:00
Max Kellermann
e8564b4c90 decoder/ffmpeg: log detailed error message 2014-12-18 22:07:38 +01:00
Max Kellermann
2fd81b4932 decoder/ffmpeg: remove obsolete comment 2014-12-18 20:19:40 +01:00
Max Kellermann
0cf4c6ffea decoder/ffmpeg: add "pure" attributes 2014-12-18 20:17:15 +01:00
Max Kellermann
25f89afbfb output/winmm: show detailed error messages 2014-12-17 19:43:14 +01:00
Max Kellermann
43f3cdcd24 output/winmm: show detailed error messages 2014-12-17 19:42:54 +01:00
Max Kellermann
3454fed324 win32/build.py: add option "--64" for a x64 build 2014-12-17 19:28:53 +01:00
Max Kellermann
a64ffda688 {win32,android}/build.py: add the host triple to the lib paths
Allow multiple targets to share a library directory tree.
2014-12-17 19:28:49 +01:00
Max Kellermann
8400da9934 Merge tag 'v0.19.7' 2014-12-17 19:27:59 +01:00
Max Kellermann
6d89020f80 release v0.19.7 2014-12-17 19:20:54 +01:00
Max Kellermann
9c56c49e73 Merge tag 'v0.18.21' into v0.19.x 2014-12-17 19:19:13 +01:00
Max Kellermann
acb798e544 release v0.18.21 2014-12-17 19:13:47 +01:00
Max Kellermann
c5720a15c7 LogBackend: force-flush stderr on WIN32
setvbuf() does not seem to have an effect on Windows.
2014-12-17 19:12:25 +01:00
Max Kellermann
90709b332a LogInit: make stderr line-buffered
Make sure everything gets logged right away.  No delays because
stdio's buffer is not yet full.
2014-12-17 19:12:01 +01:00
Max Kellermann
81f17d10c8 util/HugeAllocator: enable MEM_COMMIT on Windows
Without MEM_COMMIT, the reserved address space is not accessible, and
MPD crashes.
2014-12-17 19:10:58 +01:00
k44
773de38bd9 playlist/embcue: fix filename suffix detection
The definition of the playlist_plugin struct member of the embcue
plugin was incorrect.
2014-12-16 18:43:05 +01:00
Max Kellermann
ae8bdd473c win32/build.py: remove unused variable "build_arch" 2014-12-16 12:11:31 +00:00
Max Kellermann
adfc5db3d2 Merge branch 'v0.19.x' 2014-12-15 00:46:56 +01:00
Max Kellermann
a48704925d storage/nfs: add timeout 2014-12-15 00:45:13 +01:00
Max Kellermann
fa4beeee75 decoder/ffmpeg: detect and fix negative time stamps
Works around assertion failure due to something that appears to be a
(minor) FFmpeg bug.
2014-12-15 00:40:46 +01:00
Max Kellermann
d8351772d3 configure.ac: prepare for 0.18.21 2014-12-15 00:39:52 +01:00
Max Kellermann
68d1abdb85 storage/nfs: clear last_error in SetState()
Fixes bogus assertion failure.
2014-12-15 00:39:30 +01:00
Max Kellermann
7e8474a85a lib/nfs/Connection: unregister socket with SocketMonitor::Steal()
SocketMonitor::Cancel() does not actually unregister the socket; it
only disables the event.
2014-12-15 00:31:12 +01:00
Max Kellermann
82da364b8b lib/nfs/Connection: implement mount timeout 2014-12-15 00:05:53 +01:00
Max Kellermann
7fa91ec175 lib/nfs/Connection: add debug flag "in_destroy" 2014-12-15 00:03:30 +01:00
Max Kellermann
1d3a09d377 lib/nfs/Connection: add assertion 2014-12-14 22:51:37 +01:00
Max Kellermann
02563a35f0 lib/nfs/Connection: fix reconnect after mount failure
When mounting had not yet finished, SocketMonitor::IsDefined() was
always false, due to the workaround at the beginning of the function
that calls SocketMonitor::Steal().  This commit drops the IsDefined()
check because it was never necessary and breaks reconnect.
2014-12-14 22:49:16 +01:00
Max Kellermann
d653f35bb7 lib/nfs/Connection: fix typo in code comment 2014-12-14 22:49:09 +01:00
Max Kellermann
a543627abd lib/nfs/Connection: fix memory leak (and assertion failure)
nfs_destroy_context() will invoke all pending callbacks with
err==-EINTR.  In CancellableCallback::Callback(), this will invoke
NfsConnection::DeferClose(), which however is only designed to be
called from nfs_service().  In non-debug mode, this will leak memory
because nfs_close_async() is never called.

Workaround: before nfs_destroy_context(), invoke nfs_close_async() on
all pending file handles.
2014-12-14 16:02:47 +01:00
Max Kellermann
80f2ba7fca lib/nfs/Connection: move code to Service() 2014-12-14 15:45:10 +01:00
Max Kellermann
32bca64920 lib/nfs/Connection: add assertions 2014-12-14 15:40:29 +01:00
Max Kellermann
7fa1a84ec3 lib/nfs/Connection: move code to method InternalClose() 2014-12-14 15:38:09 +01:00
Max Kellermann
ab4bb26a0a lib/nfs/Connection: make in_service and in_event debug-only flags 2014-12-14 15:20:40 +01:00
Max Kellermann
4b8d258cff lib/nfs/Connection: fix crash while canceling a failing Open()
The method NfsConnection::CancellableCallback::Callback() will always
invoke NfsConnection::Close() on the file handle, even if the void
pointer is not a nfsfh.  This can happen if the Open() was not
successful, e.g. when the file does not exist.
2014-12-14 15:16:01 +01:00
Max Kellermann
3c29aa6271 event/Loop: read the "again" flag while holding mutex 2014-12-14 14:47:36 +01:00
Max Kellermann
51464b4317 lib/nfs/Connection: add assertions 2014-12-14 14:24:49 +01:00
Max Kellermann
3f32a6b607 input/nfs: include cleanup 2014-12-14 14:21:11 +01:00
Max Kellermann
21aa1631a4 input/async: add API documentation 2014-12-14 14:21:11 +01:00
Max Kellermann
49968541fd sticker/Match: add inequality operators 2014-12-12 22:26:04 +01:00
Max Kellermann
cc143105b8 sticker/Match: add operator "EQUALS"
Mapped to "=" in the MPD protocol.  This is the first operator,
initially supporting value matches in the MPD protocol.
2014-12-12 22:16:00 +01:00
Max Kellermann
fed44e95b3 sticker/Song: add enum StickerOperator to sticker_song_find() 2014-12-12 22:10:24 +01:00
Max Kellermann
71ece56470 sticker/Database: move code to BindFind() 2014-12-12 22:04:43 +01:00
Max Kellermann
204a1de3fd sticker/Database: use the Error library 2014-12-12 21:43:54 +01:00
Max Kellermann
80ddf4aecf sticker/Database: always invoke sqlite3_reset() and sqlite3_clear_bindings() 2014-12-12 21:43:54 +01:00
Max Kellermann
12b4a666bc lib/sqlite/Util: add ExecuteModified() 2014-12-12 21:43:54 +01:00
Max Kellermann
cfdbaf331e sticker/Database: add wrapper for sqlite3_step() 2014-12-12 21:43:54 +01:00
Max Kellermann
052d350b19 sticker/Database: move SQLite helpers to lib/sqlite/Util.hxx 2014-12-12 21:42:51 +01:00
Max Kellermann
2ca18a7ee5 lib/sqlite/Domain: add Domain instance for SQLite
Replaces the sticker_domain for Error::domain.
2014-12-12 20:49:00 +01:00
Max Kellermann
7dbe5f4640 sticker/Database: remove redundant sqlite3_reset() calls
Call sqlite3_reset() only after a sqlite3_stmt* has been used, not
before.  Assume it is already in reusable state.
2014-12-12 20:43:26 +01:00
Max Kellermann
432ecd1b6a sticker/Database: require SQLite 3.7.3
SQLite 3.7.3 is the version shipped in Debian Squeeze (oldstable);
should be old enough to be the required version.  Drop the
compatibility #ifdef.
2014-12-12 20:41:36 +01:00
Rasmus Steinke
7d9aa5b716 vorbiscomments: Remove support for non-standard "album artist" tags.
MPD used both "album artist" and "albumartist" tags and mapped them to one tag.
This could lead to issues, if a file had both tags, causing MPD to send
a list of albumartists instead of a single one.
Since "album artist" is not a standard tag anyway and even its originators
started to use the proper alternative, its time to say goodbye!
2014-12-12 18:28:11 +01:00
Max Kellermann
43267dc892 sticker/Database: make variables more local 2014-12-12 14:27:47 +01:00
Max Kellermann
3ec6c26e6c sticker/Database: add sqlite3_bind_text() wrapper 2014-12-12 14:13:35 +01:00
Max Kellermann
7de684668b sticker/Database: remove C-style (void) 2014-12-12 14:12:31 +01:00
Max Kellermann
2fec463542 util/HugeAllocator: disable MEM_LARGE_PAGES on Windows
MEM_LARGE_PAGES does not appear to work.  Instead, MEM_RESERVE appears
to be necessary.  Until I figure this out, this large pages are
disabled.
2014-12-12 13:20:58 +01:00
Max Kellermann
1affc641c4 input/Init: eliminate double colon from log message 2014-12-12 13:20:37 +01:00
Max Kellermann
4741d7bfe2 Merge branch 'v0.19.x' 2014-12-12 13:14:29 +01:00
Max Kellermann
aea99a1222 decoder/ffpmeg: make variables more local 2014-12-11 10:58:33 +01:00
Max Kellermann
7c8038e2da decoder/ffpmeg: simplify ffmpeg_send_packet() 2014-12-11 10:58:06 +01:00
Max Kellermann
673336297d decoder/ffmpeg: support stream tags 2014-12-11 10:52:40 +01:00
Max Kellermann
ee4b7042ce decoder/ffpmeg: move code to FfmpegScanMetadata() 2014-12-11 10:08:08 +01:00
Max Kellermann
310ab7d41b NEWS: mention ffmpeg/MixRamp 2014-12-10 14:01:12 +01:00
Max Kellermann
fc1796f3e8 decoder/ffmpeg: support ReplayGain and MixRamp 2014-12-10 13:45:29 +01:00
Max Kellermann
d8926ea5eb decoder/ffpmeg: use forward declarations 2014-12-10 13:42:34 +01:00
Max Kellermann
0c1e428c7d decoder/ffpmeg: rename functions to CamelCase 2014-12-10 13:05:28 +01:00
Max Kellermann
bcd97f5887 decoder/ffmpeg: optimize ffmpeg_scan_dictionary()
Don't scan tag items if the handler doesn't implement the tag()
method.
2014-12-10 09:35:28 +01:00
Max Kellermann
0faf86c2b9 ReplayGainInfo: add method IsDefined() 2014-12-10 07:57:46 +01:00
Max Kellermann
b30957c89c ReplayGainInfo: make IsDefined() constexpr 2014-12-10 07:57:07 +01:00
Max Kellermann
dbbcbc3616 Util/Manual: cast via void* to avoid alignment warnings 2014-12-09 23:10:05 +01:00
Max Kellermann
1889150013 Util/Manual: use Get() in Destruct() 2014-12-09 23:08:53 +01:00
Max Kellermann
14f9cdde6b Util/Manual: add assertion to Get() 2014-12-09 23:08:22 +01:00
Max Kellermann
3ab0691eec Util/Manual: add method Get()
May be more clear than operators.
2014-12-09 23:07:43 +01:00
Max Kellermann
1e073a196f util/Manual: use gcc_alignas() 2014-12-09 23:05:47 +01:00
Max Kellermann
7b60e3916c DespotifyUtils: make string buffers temporary 2014-12-09 22:14:47 +01:00
Max Kellermann
c486c5bf5b DespotifyUtils: fix coding style 2014-12-09 22:10:17 +01:00
Max Kellermann
fc0b6d143a DespotifyUtils: use ARRAY_SIZE() 2014-12-09 22:06:22 +01:00
Max Kellermann
5f4252bcd2 ConfigTemplates: use ARRAY_SIZE() 2014-12-09 22:04:34 +01:00
Max Kellermann
a588aef921 output/oss: make the static arrays "constexpr" 2014-12-09 22:02:18 +01:00
Max Kellermann
b70df57f7b ls: make the static array "const" 2014-12-09 22:01:15 +01:00
Max Kellermann
e813c93e08 decoder/mad: convert "const" to "constexpr" 2014-12-09 21:59:11 +01:00
Max Kellermann
900c4977cc AllCommands: use ARRAY_SIZE() 2014-12-09 21:58:01 +01:00
Max Kellermann
bb39fffab9 ConfigParser: make the static arrays "const" 2014-12-09 21:57:07 +01:00
Max Kellermann
f52aefb341 decoder/ffmpeg: make the tag_table constexpr 2014-12-09 21:56:22 +01:00
Max Kellermann
aecb5630cb configure.ac: use MPD_ENABLE_AUTO_LIB for libfaad 2014-12-09 21:36:52 +01:00
Max Kellermann
0f0245625a configure.ac: add macro MPD_ENABLE_AUTO_LIB 2014-12-09 21:19:09 +01:00
Max Kellermann
8583689fa4 configure.ac: use AC_CHECK_FUNCS for pthread_setname_np()
Don't assume "-lpthread".  Just use PTHREAD_CFLAGS, as determined by
AX_PTHREAD.
2014-12-09 21:19:09 +01:00
Max Kellermann
7a1e026bb5 configure.ac: check for pthread before librt
Works around a linker problem with some older glibc versions: if
"-lrt" was used, then "-pthread" was implied, but only the symbols
used by librt were available.  This led to a linker error because
pthread_atfork() was not found.

So with "-lrt", autoconf decides that no pthread flag is necessary,
but in the end fails due to pthread_atfork() missing.

By checking for pthread before librt, we avoid this dependency
problem.
2014-12-09 21:19:09 +01:00
Max Kellermann
64f04ee6db configure.ac: move --with-tremor declaration down 2014-12-09 21:19:09 +01:00
Max Kellermann
5c6f538b85 configure.ac: inherit existing TREMOR_CFLAGS and TREMOR_LIBS
Replaces the old options --with-tremor-libraries and
--with-tremor-includes.
2014-12-09 21:19:09 +01:00
Max Kellermann
00aa83a498 configure.ac: reset tremor_prefix 2014-12-09 21:19:09 +01:00
Max Kellermann
e44848f8c4 configure.ac: make failure to find libvorbisidec fatal 2014-12-09 21:19:09 +01:00
Max Kellermann
5ea8950a13 configure.ac: use AC_CHECK_FUNC for Tremor check
Don't imply the library's name is "vorbisidec"; use whatever we found
inside TREMOR_LIBS.
2014-12-09 21:19:09 +01:00
Max Kellermann
184557bfed m4/mpd_with_flags: add macro MPD_WITH_FLAGS 2014-12-09 21:19:09 +01:00
Max Kellermann
b4253210d2 configure.ac: improve description for --enable-id3 2014-12-09 21:19:09 +01:00
Max Kellermann
8e1585aa8a m4/mpd_auto.m4: fix option description in MPD_ARG_ENABLE
Was using the wrong variable.  Regression by commit 16f870aa
2014-12-09 21:18:27 +01:00
Max Kellermann
dee49d7488 win32/build.py: script that cross-compiles to Windows 2014-12-09 14:10:10 +01:00
Max Kellermann
1ecde309e4 src/win32: move resources to win32/ 2014-12-09 14:04:33 +01:00
Max Kellermann
d62a738460 Merge branch 'v0.19.x' 2014-12-09 14:04:11 +01:00
Max Kellermann
0cfd4fff62 playlist/Print: don't skip non-existent songs in "listplaylist"
Skipping those songs silently will confuse the client, because
commands specifying the song index within a playlist
(e.g. playlistdelete) will be out of sync.

This copies spl_print()'s behavior to playlist_file_print().
2014-12-09 13:36:48 +01:00
Max Kellermann
8904127c10 configure.ac: prepare for 0.19.7 2014-12-09 13:09:03 +01:00
Max Kellermann
0f1b1bb44d configure.ac: add option to disable CUE 2014-12-08 22:33:50 +01:00
Max Kellermann
16f870aa41 m4/mpd_auto.m4: move code to MPD_ARG_ENABLE 2014-12-08 21:54:02 +01:00
Max Kellermann
16f729eb22 m4/mpd_auto.m4: fix displayed default value
Was hard-coded to "auto", and the macro parameter was ignored (in the
help text).
2014-12-08 18:38:52 +01:00
Max Kellermann
36f0bd432c CommandLine: merge printf() calls 2014-12-08 18:31:30 +01:00
Max Kellermann
457ab8b2ce CommandLine: use printf() instead of puts() 2014-12-08 18:25:03 +01:00
Thomas Guillem
1ebf5f3bcb android/build: enable cpudetect for ffmpeg 2014-12-08 18:16:19 +01:00
Thomas Guillem
a928a9640f Makefile.am: change android apk name
If no name is specified, it'll use the name of the first activity of the
AndroidManifest.xml. And we don't want the apk to be called Settings.apk.
2014-12-08 18:16:11 +01:00
Thomas Guillem
cb302476b4 Makefile.am: add symlink for android layout folders 2014-12-08 18:15:47 +01:00
Thomas Guillem
31726737df ConfigGlobal: fix params not fully cleaned 2014-12-08 18:15:13 +01:00
Max Kellermann
082be33cbd m4/mpd_func.m4: fix typo 2014-12-08 15:37:39 +01:00
Max Kellermann
9aada2ef19 m4/pretty_print.m4: eliminate "eval" 2014-12-08 15:31:59 +01:00
Max Kellermann
4066b2767b m4/pretty_print.m4: drop support for "with_*" variables
Not used.
2014-12-08 15:28:54 +01:00
Max Kellermann
de43bddc1a Merge tag 'v0.19.6' 2014-12-08 15:22:44 +01:00
Max Kellermann
c46f48abec release v0.19.6 2014-12-08 15:12:41 +01:00
Max Kellermann
4acbf7b90d android/build.py: update FFmpeg to 2.5 2014-12-08 15:05:49 +01:00
Max Kellermann
cbc1a58e93 Merge tag 'v0.18.20' into v0.19.x 2014-12-08 15:03:09 +01:00
Max Kellermann
1b5f33a435 release v0.18.20 2014-12-08 14:57:17 +01:00
Max Kellermann
41b4a63f2b decoder/ffmpeg: support FFmpeg 2.5
Version 2.5 fixed an API oddity, however it broke API compatibility,
at least with C++.  Disable the workaround when a libavformat version
is detected that is recent enough.
2014-12-08 14:25:34 +01:00
Max Kellermann
d8fc2db910 thread/Id: drop "::" prefix before pthread function names
The "::" to explicitly refer to the global namespace appeared like a
good idea in C++, but it breaks with C libraries that implement
standard functions using macros (e.g. musl).
2014-12-08 14:17:17 +01:00
Max Kellermann
dc11dea7cc configure.ac: prepare for 0.18.20 2014-12-08 14:13:20 +01:00
Max Kellermann
6edfc56c9d command: use ConstBuffer<const char *> for argument list 2014-12-08 13:30:35 +01:00
Max Kellermann
5837a63942 AllCommands: simplify the tokenizer loop 2014-12-08 13:25:41 +01:00
Max Kellermann
3a28f456b1 AllCommands: assign current_command early 2014-12-08 13:25:00 +01:00
Max Kellermann
4f6fc2675c AllCommands: remove redundant initializer 2014-12-08 13:09:12 +01:00
Max Kellermann
c7da1821c3 CommandLine: show id3tag support in --version 2014-12-07 17:14:19 +01:00
Max Kellermann
1a8c3271da AllCommands: make variables more local 2014-12-06 00:10:34 +01:00
Max Kellermann
bd49e8e76f AllCommands: make the commands array "constexpr" 2014-12-06 00:07:07 +01:00
Max Kellermann
533699abe7 playlist/soundcloud: drop support for libyajl1
Require the version 2 which has a more sane API.
2014-12-05 00:37:02 +01:00
Max Kellermann
267ccc98d3 Win32Main: make the service table "constexpr" 2014-12-05 00:26:48 +01:00
Max Kellermann
cd3c2fdb49 Win32Main: make variables more local 2014-12-05 00:25:48 +01:00
Max Kellermann
5cbc319e96 configure.ac: require GLib 2.32 (if enabled)
Since version 2.32, g_thread_init() is deprecated and a no-op.  Let's
upgrade that (optional) dependency so we can remove all those
g_thread_init() calls.
2014-12-05 00:21:48 +01:00
Max Kellermann
d435dcdca4 configure.ac: make GLib optional by default
Only very few (minor) features still depend on GLib.
2014-12-05 00:21:48 +01:00
Max Kellermann
e5ab456df3 Win32Main: use FatalSystemError() 2014-12-05 00:21:48 +01:00
Max Kellermann
08bf4f74a9 system/FatalError: add FatalSystemError() overload with WIN32 error code 2014-12-05 00:19:07 +01:00
Max Kellermann
a838a03412 system/FatalError: use FormatMessage() instead of g_win32_error_message() 2014-12-05 00:15:30 +01:00
Max Kellermann
ad4e597f74 util/Error: use FormatMessage() instead of g_win32_error_message() 2014-12-05 00:10:44 +01:00
Max Kellermann
ee3610a2d2 android/build.py: enable Vorbis and httpd
These do not require GLib anymore.
2014-12-04 23:35:02 +01:00
Max Kellermann
88b75b57d0 playlist, InotifySource, ...: update GLib comments 2014-12-04 23:33:08 +01:00
Max Kellermann
aa4c7055f8 playlist/pls: custom INI parser
Don't use GLib.
2014-12-04 23:10:50 +01:00
Max Kellermann
4b70f9d213 util/DivideString: add option "strip" 2014-12-04 23:05:44 +01:00
Max Kellermann
79d2d1c201 decoder/sidplay: pass SidTuneMod to get_song_length()
Eliminate duplicate SidTune construction.
2014-12-04 21:58:09 +01:00
Max Kellermann
406bda9b95 decoder/sidplay: simplify the SidDatabase::length() call 2014-12-04 21:53:45 +01:00
Max Kellermann
405f1dd027 decoder/sidplay: include cleanup 2014-12-04 21:53:45 +01:00
Max Kellermann
51f349d504 decoder/sidplay: use class SidDatabase
Remove our own songlength database parser.
2014-12-04 21:40:38 +01:00
Max Kellermann
4f201d1e85 decoder/sidplay: use config_param::GetBlockPath() 2014-12-04 21:30:59 +01:00
Max Kellermann
03cfef100f decoder/sidplay: make "songlength_file" local 2014-12-04 21:30:59 +01:00
Max Kellermann
ff89b491dd ConfigData: update API documentation 2014-12-04 21:30:59 +01:00
Max Kellermann
7552dff0e5 decoder/sidplay: pass parsed path to get_song_length()
Eliminates duplicate ParseContainerPath() call.
2014-12-04 21:21:49 +01:00
Max Kellermann
110589c0f3 decoder/sidplay: merge get_container_name() and get_song_num() 2014-12-04 21:11:33 +01:00
Max Kellermann
3400398230 doc/mpdconf.example: move sidplay documentation to the user manual 2014-12-04 21:06:21 +01:00
Max Kellermann
5c244e9a8c SongSticker: remove obsolete documentation 2014-12-04 20:53:48 +01:00
Max Kellermann
4e2f4e2091 util/StringUtil: add ToUpperASCII()
Replaces g_ascii_strup() and allows building the Vorbis encoder
without GLib.
2014-12-04 17:43:01 +01:00
Max Kellermann
e69bef3ce3 util/SplitString: new utility class
Replaces GLib's g_strsplit().
2014-12-04 09:14:28 +01:00
Max Kellermann
c1c0fc79bc output/jack: use usleep() instead of g_usleep() 2014-12-04 09:14:28 +01:00
Max Kellermann
02a77f6797 test/test_util: add unit test for DivideString 2014-12-04 07:23:06 +01:00
Max Kellermann
77b316cdfb test/TestCircularBuffer: include cleanup 2014-12-04 07:14:43 +01:00
Max Kellermann
2abfc7b87b test/test_util: move class UriUtilTest to UriUtilTest.hxx 2014-12-04 07:12:04 +01:00
Max Kellermann
050f0c3d8f util/SplitString: rename to DivideString 2014-12-03 21:38:06 +01:00
Max Kellermann
90e6c727da encoder/vorbis: convert pointers to references 2014-12-02 22:33:40 +01:00
Max Kellermann
d3d9a04e62 output/ao: use class SplitString instead of g_strsplit() 2014-12-02 22:29:41 +01:00
Max Kellermann
a66051216f TagId3: add "pure" attributes 2014-12-02 22:17:47 +01:00
Max Kellermann
0debba0f6e mixer/null: new mixer plugin 2014-12-02 18:20:44 +01:00
Max Kellermann
f2bd2c318c MixerType: convert to strictly-typed enum 2014-12-02 18:20:44 +01:00
Max Kellermann
21c42819c7 MixerType: rename to CamelCase 2014-12-02 18:19:31 +01:00
Max Kellermann
5899a272ef decoder/gme: simplify ParseContainerPath()
Use simple string and path parsing functions instead of GLib's
g_pattern_match(), which was used in a very clumsy way.
2014-12-02 07:11:11 +01:00
Max Kellermann
27b4c62bc1 decoder/gme: merge get_container_name() and get_song_num()
There is duplicate code in the two.
2014-12-02 06:53:33 +01:00
Max Kellermann
b227fddec7 fs/Path: add methods GetBase() and GetDirectoryName() 2014-12-02 06:45:57 +01:00
Max Kellermann
2c1f1de33c decoder/gme: get_song_num() returns unsigned 2014-12-01 23:28:21 +01:00
Max Kellermann
c26622cf8f decoder/gme: move code to ScanMusicEmu() 2014-12-01 23:01:58 +01:00
Max Kellermann
9e91873428 decoder/gme: move code to ScanGmeInfo() 2014-12-01 22:56:48 +01:00
Max Kellermann
7363d50a1e output/httpd/IcyMetaDataServer: use CopyString() instead of g_strlcpy() 2014-12-01 22:33:57 +01:00
Max Kellermann
15213a041d output/httpd/IcyMetaDataServer: don't use GLib types 2014-12-01 22:31:29 +01:00
Max Kellermann
fb70a34c80 output/httpd/IcyMetaDataServer: make variables more local 2014-12-01 22:28:14 +01:00
Max Kellermann
fbf76c6d21 input/cdio_paranoia: use CopyString() instead of g_strlcpy() 2014-12-01 22:22:29 +01:00
Nix
811af02f56 Output: start with a null mixer.
There are code paths (mostly error cases) in which it is possible to
initialize an AudioOutput and then kill it without ever calling
audio_output_new().  In such a case, its destructor will attempt to
free a mixer that was never initialized, leading to an attempt to
take out a lock on a mutex that was similarly never initialized,
which hangs forever.

Fix by always initializing the mixer appropriately.
2014-12-01 22:14:09 +01:00
Max Kellermann
bc00c38f9d lib/icu/Converter: add ICU-based backend 2014-12-01 21:56:48 +01:00
Max Kellermann
4658bd8208 test/TestIcu: new unit test for lib/icu/* 2014-12-01 20:55:05 +01:00
Max Kellermann
6eb1caa417 fs/Config: add HAVE_GLIB check 2014-11-30 20:35:26 +01:00
Max Kellermann
41efc1376e fs/Config: swap #if/#else 2014-11-30 20:34:32 +01:00
Max Kellermann
0f35016773 lib/icu/Converter: add TODO comment 2014-11-30 19:08:38 +01:00
Max Kellermann
c641ca90a9 lib/icu/Collate: move code to Util.cxx 2014-11-30 10:53:05 +01:00
Max Kellermann
87c88fcb27 fs/Charset: move code to wrapper class IcuConverter
Prepare for a ICU-based backend without GLib.
2014-11-30 00:31:13 +01:00
Max Kellermann
4f80a129f1 fs/Charset: return std::string from PathFromUTF8()
Don't expose pointer that requires the caller to invoke g_free(),
because that's GLib-only.
2014-11-30 00:28:27 +01:00
Max Kellermann
6987f2ba82 fs/Charset: use macro HAVE_FS_CHARSET internally 2014-11-30 00:27:58 +01:00
Max Kellermann
563db580ae fs/Charset: add DeinitFSCharset() 2014-11-29 23:47:48 +01:00
Max Kellermann
125daea16a fs/Charset: add macro HAVE_FS_CHARSET 2014-11-29 23:36:44 +01:00
Max Kellermann
fd2c6b8a4b fs/Charset: return Error on SetFSCharset() failure
Don't abort the process, let the caller decide instead.
2014-11-29 23:36:44 +01:00
Max Kellermann
5b1db917bc fs/Config: remove bogus WIN32 check 2014-11-29 23:36:44 +01:00
Max Kellermann
8780e23ed3 android/build.py: update ffmpeg 2.4.3, curl 7.39 2014-11-28 21:08:27 +01:00
Max Kellermann
be492ed108 android: update libFLAC to 1.3.1
Due to security vulnerabilities.
2014-11-28 21:08:27 +01:00
Max Kellermann
24da14f4f7 .gitignore: ignore /lib/ 2014-11-28 21:08:18 +01:00
Max Kellermann
03d2fb450f configure.ac: prepare for 0.19.6 2014-11-28 20:13:57 +01:00
Max Kellermann
849b0563ce util/Alloc: add fallback for gcc 4.6 2014-11-28 19:44:32 +01:00
Max Kellermann
16a99ad515 Compiler.h: exclude clang from GCC_CHECK_VERSION() 2014-11-28 19:33:09 +01:00
Max Kellermann
d93172bee8 Compiler.h: add macro CLANG_OR_GCC_VERSION() 2014-11-28 19:09:56 +01:00
Max Kellermann
25429af122 Compiler.h: add macro GCC_OLDER_THAN() 2014-11-28 19:09:52 +01:00
Max Kellermann
4bfd104a23 util/Manual: reimplement GCC_CHECK_VERSION() using GCC_MAKE_VERSION() 2014-11-28 19:07:59 +01:00
Max Kellermann
7745067d99 Compiler.h: add macro GCC_MAKE_VERSION() 2014-11-28 19:00:26 +01:00
Max Kellermann
b19d3629b9 util/Manual: use GCC_CHECK_VERSION 2014-11-28 19:00:26 +01:00
Max Kellermann
84c519df09 util/Alloc: remove bogus "unused" attribute 2014-11-27 18:21:50 +01:00
Max Kellermann
737a56a030 Merge tag 'v0.19.5' 2014-11-26 20:19:17 +01:00
Max Kellermann
67cba251c8 release v0.19.5 2014-11-26 20:11:42 +01:00
Max Kellermann
0bc511715b Makefile.am: distribute Android sources 2014-11-26 20:11:42 +01:00
Max Kellermann
27ce80544f Merge tag 'v0.18.19' into v0.19.x 2014-11-26 20:02:57 +01:00
Max Kellermann
04f627c2af release v0.18.19 2014-11-26 19:58:48 +01:00
Max Kellermann
12b6959ea2 Playlist: reset song priority on playback
A priority should be a volatile thing: it should schedule a song for
playing back once, but it should not affect the next time the queue
gets played.
2014-11-26 08:54:16 +01:00
Max Kellermann
7519768cb1 Queue: add "reorder" parameter to SetPriority() 2014-11-26 08:50:58 +01:00
Max Kellermann
9af470c92d Playlist: add method SongStarted()
Empty currently, but code will be added song.
2014-11-26 08:49:19 +01:00
Max Kellermann
ac8c1d0a01 Playlist: move more functions into the class 2014-11-26 08:34:51 +01:00
Max Kellermann
921d01b59d Playlist: add another assertion 2014-11-26 08:25:48 +01:00
Max Kellermann
8aa4a66ba0 Playlist: move playlist_song_started() into the class 2014-11-26 08:24:25 +01:00
Max Kellermann
2e7153d8d6 DatabasePrint: cast int to unsigned before comparison
Fixes compiler warning.
2014-11-26 08:21:55 +01:00
Max Kellermann
70b5a81a29 {Tag,Song}Print, PlayerCommands: report song duration with milliseconds precision 2014-11-25 17:46:43 +01:00
Max Kellermann
83fd822e8b ApeTag: drop support for non-standard tag "album artist"
This was used by proprietary software.  MPD adopted it a few years
ago, which turns out to be a mistake, because it now creates problems
for some MPD users (http://bugs.musicpd.org/view.php?id=4168).
2014-11-25 17:07:08 +01:00
Max Kellermann
e72eef421b lib/nfs/FileReader: clean up on disconnect
Avoids crash because Close() invokes a call on a destructed
NfsConnection.
2014-11-25 14:02:15 +01:00
Max Kellermann
016063c810 lib/nfs/FileReader: move code to CancelOrClose() 2014-11-25 14:00:32 +01:00
Max Kellermann
38f19981b2 lib/nfs/FileReader: reset state in OnNfsConnectionFailed()
Avoid calling NfsConnection::RemoveLease(), because the lease has been
removed already.
2014-11-25 13:51:09 +01:00
Max Kellermann
40dd968f13 lib/nfs/FileReader: update "state" in OnNfsError()
Clean up the "state" to indicate that there is no longer any
asynchronous operation.  Fixes another NFS-related crash due to
cleanup of a non-existing asynchronous operation.
2014-11-25 13:39:42 +01:00
Max Kellermann
3cef348f30 lib/nfs/Manager: defer NfsConnection destruction
Avoids a crash that occurs when NfsConnection::OnSocketReady()
dereferences itself before returning.
2014-11-25 13:31:18 +01:00
Max Kellermann
b293b16007 lib/nfs/Connection: broadcast error before closing connection
During the NfsLease::OnNfsConnectionFailed() call, the old (defunct)
nfs_context may be used to close file handles.  Such code does not yet
exist, but will be added soon to fix other bugs.
2014-11-25 13:27:06 +01:00
Max Kellermann
f5f43db2da lib/nfs/Connection: cancel DeferredMonitor on disconnect
Fixes potential second mount attempt after the old connection to the
NFS server was shut down.
2014-11-25 13:22:25 +01:00
Max Kellermann
029555d192 lib/nfs/FileReader: include Compiler.h for "final" fallback 2014-11-25 13:18:22 +01:00
Max Kellermann
fa4d202e71 decoder/mp4v2: remove because of incompatible license
libmp4v2 is licensed under MPL 1.1, which is incompatible with GPLv2.
Unfortunately, this means that we must remove the plugin.

More information can be found in the Debian bug report:

 http://bugs.debian.org/767504
2014-11-25 13:10:52 +01:00
Max Kellermann
a8ebfd7a92 event/DeferredMonitor: include cleanup 2014-11-25 10:44:06 +01:00
Max Kellermann
b19e5720cc test/run_input: make variables more local 2014-11-25 07:51:33 +01:00
Max Kellermann
a254f5a3a8 archive/zzip: fix inverted error handler
Set the Error when zzip_seek()==-1 and not on success.  Fixes a crash
after seeking.
2014-11-24 22:08:50 +01:00
Max Kellermann
143c735f96 configure.ac: prepare for 0.18.19 2014-11-24 22:08:50 +01:00
Max Kellermann
dd3752956a m4/mpd_auto.m4: fix inverted assignment after auto-detection
Broken by commit cdbdcec
2014-11-24 18:27:04 +01:00
Max Kellermann
bf15cac980 Merge branch 'v0.19.x' 2014-11-24 09:00:14 +01:00
Max Kellermann
951bad46e0 decoder/{dsdiff,dsf,opus}: fix deadlock while seeking 2014-11-24 08:54:30 +01:00
Max Kellermann
716225cd2f doc/protocol: mention that "count" can have multiple filters 2014-11-24 08:09:58 +01:00
Max Kellermann
bbc618b8f9 configure.ac: prepare for 0.19.5 2014-11-24 08:09:44 +01:00
Max Kellermann
11ead56d6d android: release v0.19.4
Android releases were missing since 0.19.1.
2014-11-24 08:00:47 +01:00
Max Kellermann
e972ae4afa android: switch to gcc 4.9 / llvm 3.5 (NDK r10c) 2014-11-24 08:00:45 +01:00
Max Kellermann
0709065f50 Java/File: fix include guard 2014-11-24 07:51:25 +01:00
Max Kellermann
1a61b01315 configure.ac: add macro MPD_AUTO 2014-11-23 07:39:05 +01:00
Max Kellermann
c643b6ff16 configure.ac: add macro MPD_ENABLE_AUTO_PKG_LIB 2014-11-22 23:50:21 +01:00
Max Kellermann
b3f5b4932c configure.ac: add macro MPD_ENABLE_AUTO_PKG
Simplify the definition of many build options.
2014-11-21 22:19:57 +01:00
Max Kellermann
b3f5f2f75f Makefile.am: link test/run_convert with ConfigError.cxx
Fixes linker error due to missing "config_domain" symbol.
2014-11-21 15:14:24 +01:00
Max Kellermann
62288907dd configure.ac: allow disabling syslog() support 2014-11-21 14:56:13 +01:00
Max Kellermann
cdbdcec715 m4/mpd_auto.m4: reduce "eval" bloat
Don't assign bash variables; instead, use the m4 parameters directly.
2014-11-21 14:39:33 +01:00
Max Kellermann
ccf78448aa android: switch to gcc 4.9 / llvm 3.5 (NDK r10c) 2014-11-20 20:59:36 +01:00
Max Kellermann
ed001e0cfb configure.ac: add option "--disable-daemon" 2014-11-20 20:38:37 +01:00
Max Kellermann
26382713c2 Merge tag 'v0.19.4' 2014-11-18 21:47:20 +01:00
Max Kellermann
d6bc5c35a7 release v0.19.4 2014-11-18 21:40:52 +01:00
Max Kellermann
dc03f003ac Merge tag 'v0.18.18' into v0.19.x 2014-11-18 21:38:44 +01:00
Max Kellermann
7aa2104596 release v0.18.18 2014-11-18 21:34:03 +01:00
Max Kellermann
460cfba6ff QueueCommands: workaround for buggy clients that send "add /" 2014-11-18 21:31:54 +01:00
Max Kellermann
c8b93d6573 Client: assume uid==0 is local socket
A negative uid value means it's not a "local socket" (PF_LOCAL).
uid==0 means user "root" connected.
2014-11-18 20:56:27 +01:00
Max Kellermann
3f5f96ac91 event/ServerSocket: fix get_remote_uid() error value
Must return -1 on error, not 0.  0 is root.
2014-11-18 20:53:59 +01:00
Max Kellermann
f37481f843 DatabaseCommands: add "window" parameter to "search"/"find" 2014-11-18 14:31:27 +01:00
Max Kellermann
7c6b991de7 decoder/opus: add MIME types audio/ogg and application/ogg 2014-11-12 15:16:34 +01:00
Max Kellermann
82460aa49f configure.ac: prepare for 0.19.4 2014-11-12 15:16:07 +01:00
Florent Le Coz
7e7b403043 Construct a Null AllocatedPath if the filename conversion into UTF8 failed 2014-11-11 17:15:19 +01:00
Max Kellermann
c3f6502be2 Merge tag 'v0.19.3' 2014-11-11 11:43:52 +01:00
Max Kellermann
e5217e6ce9 release v0.19.3 2014-11-11 11:21:42 +01:00
Max Kellermann
c98cb1d6f9 decoder/opus: support chained streams 2014-11-11 11:20:18 +01:00
Max Kellermann
ba6f2b0467 decoder/opus: move code to HandleEOS() 2014-11-11 11:20:16 +01:00
Max Kellermann
23465ad985 decoder/opus: improved error logging 2014-11-11 11:20:03 +01:00
Max Kellermann
7886a14b74 decoder/opus: fix mistyped LoadEOSPacket() return value 2014-11-11 11:18:51 +01:00
Max Kellermann
466b6a23cd decoder/opus: eliminate flag "found_opus"
Check opus_decoder!=nullptr instead.
2014-11-11 08:30:11 +01:00
Max Kellermann
4a04f73434 decoder/opus: add constexpr output_buffer_frames 2014-11-11 07:45:31 +01:00
Misty De Meo
134cb6a017 Main: fix compilation on OS X using non-Apple compilers
Commit d42c0f1dc5 added an OS X-specific
method of calling mpd_main_after_fork(), which uses Grand Central
Dispatch. Since this uses a block literal, it breaks compilation on
compilers which don't support the block extension, e.g. non-Apple
compilers. This affects users on older OS X releases with GCD (which
depend on older Clang releases, or Apple GCCs, which don't support the
C++11 features MPD needs); or which don't support GCD at all (10.5 and
lower).

This patch changes the #ifdef so that the non-GCD code is used
as it was on OS X before this patch if blocks aren't available, via
checking __BLOCKS__ macro.
2014-11-11 06:22:24 +01:00
Max Kellermann
8d036c4b7c pcm/SoxrResampler: round output buffer size up
The old formula calculates the output buffer size with "regular"
rounding (to the nearest integer), however sometimes, that is
insufficient and the last sample cannot be resampled.  This causes
audible distortions.  By changing the formula to consider the worst
case (always round up), this problem is eliminated.
2014-11-10 22:52:17 +01:00
Max Kellermann
c64ad78c7b decoder/ffmpeg: support opus 2014-11-10 18:00:30 +01:00
Max Kellermann
4a043a915f configure.ac: prepare for 0.18.1 2014-11-10 17:59:06 +01:00
Max Kellermann
8ff0d99092 decoder/audiofile: fix bit rate calculation 2014-11-10 09:00:50 +01:00
Max Kellermann
2e47cb12c4 test/FakeDecoderAPI: dump bit rate 2014-11-10 09:00:38 +01:00
Max Kellermann
ff6f1655f0 input/curl: ignore ResponseBoundary() while seeking
While seeking, metadata must not be updated.  ResponseBoundary() was
added in MPD 0.19.1, but I forgot to add the IsSeeking() check there.
This caused the "seekable" flag to reset.
2014-11-10 08:45:19 +01:00
Max Kellermann
0120f396ac db/upnp/Directory: TitleToPathSegment() returns rvalue reference
Eliminate one implicit std::string copy.
2014-11-09 20:46:32 +01:00
Max Kellermann
231fffe594 db/upnp/Directory: apply coding style 2014-11-09 20:40:05 +01:00
Max Kellermann
b5ba94f1de tag/Set: do AlbumArtist/Artist fallback only if AlbumArtist is not disabled
On "list albumartist", songs that have no AlbumArtist tag will use the
Artist tag.  However, if AlbumArtist is disabled via
"metadata_to_use", the TagBuilder::AddItem() call is ignored, and
PrintUniqueTag() attempts to print a nullptr string.

This commit fixes the problem by attempting the fallback only if
AlbumArtist is not disabled.
2014-11-08 19:25:01 +01:00
Max Kellermann
cbf79769d3 db/Count: include cleanup 2014-11-08 19:21:42 +01:00
Max Kellermann
e67afc35b8 db/upnp/Directory: move checkobjok() to class UPnPDirObject 2014-11-08 10:55:59 +01:00
Max Kellermann
5e73007b1d db/upnp/Object: apply coding style 2014-11-08 10:52:35 +01:00
Max Kellermann
2d9876a261 Merge branch 'v0.19.x' 2014-11-07 19:41:19 +01:00
Max Kellermann
125eb01e03 decoder/ffmpeg: support opus 2014-11-07 19:22:26 +01:00
Max Kellermann
ccb13205f4 db/upnp: fix valgrind warning 2014-11-07 19:12:43 +01:00
Max Kellermann
6f23e91e33 lib/upnp/ContentDirectoryService: swap uri_apply_base() parameters
When uri_apply_base() was moved from db/upnp/Util.cpp to
util/UriUtil.cpp, the parameter order was changed, however without
swapping the parameters in the ContentDirectoryService constructor.
2014-11-07 18:43:00 +01:00
Max Kellermann
1bd8a322f5 input/AsyncInputStream: set Error when seeking unseekable
Fixes crash in the "audiofile" decoder while logging the seek error.
2014-11-07 13:57:57 +01:00
Max Kellermann
362e73bea8 input/Open: expose input_domain 2014-11-07 13:57:57 +01:00
Max Kellermann
9f8c2b3b56 configure.ac: prepare for 0.19.3 2014-11-04 09:24:09 +01:00
Max Kellermann
303d67aed2 Merge tag 'v0.19.2' 2014-11-02 14:06:05 +01:00
Max Kellermann
6a7f6cdacd release v0.19.2 2014-11-02 13:46:32 +01:00
Max Kellermann
5715342fe0 Merge tag 'v0.18.17' into v0.19.x 2014-11-02 13:46:09 +01:00
Max Kellermann
38a0d15190 release v0.18.17 2014-11-02 13:06:20 +01:00
Max Kellermann
56f763a4a8 input/curl: forget Content-Length (and more) after redirect
Fixes playback of redirected streams.
2014-11-02 13:00:28 +01:00
Max Kellermann
a2eb14f3b3 AsyncInputStream: add method ClearTag() 2014-11-02 13:00:28 +01:00
Max Kellermann
05c63af7c4 InputStream: add method ClearMimeType() 2014-11-02 12:59:16 +01:00
Max Kellermann
1f59701c46 Merge branch 'v0.18.x' into v0.19.x 2014-11-02 12:27:46 +01:00
Max Kellermann
ec3191f502 input/curl: fix curl_easy_setopt() parameter types 2014-11-02 11:55:48 +01:00
Max Kellermann
32b5654a6e Decoder, Playlist: ignore URI query string for plugin detection
Use the new uri_get_suffix() overload that removes the query string.
2014-11-02 11:54:26 +01:00
Max Kellermann
674091424e util/UriUtil: add uri_get_suffix() overload that ignores query string 2014-11-02 11:53:31 +01:00
Max Kellermann
6ad336743d PlaylistFile: don't allow empty playlist name 2014-11-02 11:52:48 +01:00
Max Kellermann
c882568ccd playlist/m3u: recognize the file suffix ".m3u8" 2014-11-02 11:50:56 +01:00
Max Kellermann
f6b2899dd2 decoder/faad: remove workaround for ancient libfaad2 ABI bug
Many years ago, FAAD had a serious ABI bug: the NeAACDecInit()
prototype in its header declared the "samplerate" parameter to be
"unsigned long *", but internally, the function assumed it was
"uint32_t *" instead.  On 32 bit machines, that was no difference, but
on 64 bit, this left one portion of the return value uninitialized;
and worse, on big-endian, the wrong word was filled.  This bug had to
be worked around in MPD (commit 9c4e97a6).

A few months later, the bug was fixed in the FAAD CVS in commit 1.117
on file libfaad/decoder.c; the commit message was:

 "Use public headers internally to prevent duplicate declarations"

The commit message was too brief at best; the problem was not
duplicate declarations, but a prototype mismatch.  No mention of the
bug fix in the ChangeLog.

The MPD project never learned about this bug fix, and so MPD would
always pass a "uin32_t *" dressed up as a "unsigned long *".  Nearly 6
years later, it's about time to fix this second ABI problem.  Let's
kill the workaround!
2014-11-02 11:50:56 +01:00
Steven OBrien
bccd4ef2f7 decoder/ffmpeg: recognize MIME type audio/aacp 2014-11-02 11:50:56 +01:00
Max Kellermann
94c240a026 configure.ac: show DSD in result 2014-11-02 11:50:56 +01:00
Max Kellermann
c50a0cf7bf output/roar: remove unnecessary "volatile" keyword
A mutex acts as a memory barrier, and thus "volatile" is not
necessary.
2014-11-02 11:50:56 +01:00
Max Kellermann
c37f7abb79 TagString: use g_strndup() for unterminated string
Fixes buffer overflow bug.
2014-11-02 11:48:13 +01:00
Max Kellermann
432ce9b1de configure.ac: prepare for 0.18.17 2014-11-02 11:41:40 +01:00
Max Kellermann
054323c2bc lib/upnp/Discovery: add missing stdlib.h include 2014-11-02 11:04:13 +01:00
Max Kellermann
a8770aa606 input/curl: fix curl_easy_setopt() parameter types 2014-11-01 14:09:30 +01:00
Max Kellermann
7d5442e103 Decoder, Playlist: ignore URI query string for plugin detection
Use the new uri_get_suffix() overload that removes the query string.
2014-11-01 13:41:18 +01:00
Max Kellermann
eab32f2e5d util/UriUtil: add uri_get_suffix() overload that ignores query string 2014-11-01 12:45:47 +01:00
NanoTech
d42c0f1dc5 Main: run the OS X native event loop after forking 2014-10-31 15:03:53 +01:00
NanoTech
6ad1e4d99a Revert "Main: run the OS X native event loop"
This reverts commit f0be48ff90
(except for the NEWS entry).

If libdispatch (GCD) is used before forking, it
can't safely be used again after forking.
2014-10-31 15:03:46 +01:00
Max Kellermann
7350144ab3 PlaylistFile: don't allow empty playlist name 2014-10-31 14:59:27 +01:00
Max Kellermann
54c591bd9d decoder/mad: fix negative replay gain values
Negating an unsigned integer does not work.
2014-10-28 22:22:30 +01:00
Max Kellermann
217d88f21f TextInputStream: don't ignore unterminated last line 2014-10-28 22:10:47 +01:00
Max Kellermann
394e3be482 playlist/m3u: recognize the file suffix ".m3u8" 2014-10-26 08:14:16 +01:00
Max Kellermann
575fbad254 AllCommands: "commands" returns playlist commands only if playlist_directory configured 2014-10-25 23:50:47 +02:00
Max Kellermann
fa0aa91bf9 SongSticker, playlist/soundcloud: add missing stdlib.h include
For free().
2014-10-25 23:49:29 +02:00
Max Kellermann
d7f024c510 OutputThread: fall back to PCM if given DSD sample rate is not supported
Works around the "PCM conversion from f to dsd is not implemented"
error message that prevents DSD playback.
2014-10-25 22:06:08 +02:00
Max Kellermann
bc5a53574c decoder/faad: remove workaround for ancient libfaad2 ABI bug
Many years ago, FAAD had a serious ABI bug: the NeAACDecInit()
prototype in its header declared the "samplerate" parameter to be
"unsigned long *", but internally, the function assumed it was
"uint32_t *" instead.  On 32 bit machines, that was no difference, but
on 64 bit, this left one portion of the return value uninitialized;
and worse, on big-endian, the wrong word was filled.  This bug had to
be worked around in MPD (commit 9c4e97a6).

A few months later, the bug was fixed in the FAAD CVS in commit 1.117
on file libfaad/decoder.c; the commit message was:

 "Use public headers internally to prevent duplicate declarations"

The commit message was too brief at best; the problem was not
duplicate declarations, but a prototype mismatch.  No mention of the
bug fix in the ChangeLog.

The MPD project never learned about this bug fix, and so MPD would
always pass a "uin32_t *" dressed up as a "unsigned long *".  Nearly 6
years later, it's about time to fix this second ABI problem.  Let's
kill the workaround!
2014-10-25 20:42:50 +02:00
Max Kellermann
3e641e2147 SongSticker: don't use GLib 2014-10-25 01:25:33 +02:00
Max Kellermann
de7e4f0db7 decoder/wavpack: don't use GLib 2014-10-25 01:24:45 +02:00
Max Kellermann
a1cb1d78bd playlist/SoundCloud: don't use GLib for string allocation 2014-10-25 01:24:27 +02:00
Max Kellermann
1178f2c1ab Util/Alloc: add xstrcatdup(), replacing g_strconcat() 2014-10-25 01:24:10 +02:00
Steven Newbury
76f277eeb4 Set pulseaudio channel map to WAVE-EX
Pulseaudio expects clients to specify their channel-map if the
default (ALSA) map does not route the audio to the expected speakers.

Many Google results suggest dealing with this by re-routing the audio
channels with the appropriate ALSA plugin, but this will then simply
break any clients which expect the default ALSA mapping.

Virtually all media files and codecs, certainly flac, dca, a52, and of
course anything based on Microsoft's WAVEFORMAT_EXTENSIBLE specification,
assume the layout in the table here:
http://en.wikipedia.org/wiki/Surround_sound#Standard_speaker_channels

Fortunately, pulseaudio directly addresses this with a built-in channel
map for WAVE-EX which can be set automatically in the stream sample-spec.
2014-10-25 01:08:09 +02:00
Max Kellermann
4000390dcd configure.ac: prepare for 0.20 2014-10-25 00:33:39 +02:00
Max Kellermann
30df709736 configure.ac: update VERSION_REVISION 2014-10-25 00:33:25 +02:00
Steven OBrien
8cd17ce045 decoder/ffmpeg: recognize MIME type audio/aacp 2014-10-25 00:26:58 +02:00
Max Kellermann
1bfbced258 configure.ac: add storage plugin section to result 2014-10-25 00:21:18 +02:00
Max Kellermann
6ac5980a17 configure.ac: show DSD in result 2014-10-25 00:19:01 +02:00
Max Kellermann
2e24adae89 configure.ac: require xmlto for --enable-documentation 2014-10-25 00:14:25 +02:00
Max Kellermann
188b94cb3e test/test_archive: don't use GLib 2014-10-25 00:08:04 +02:00
Max Kellermann
c48733e34f fs/Charset: work around clang's -Wunused-const-variable
MPD_PATH_MAX_UTF8 is only used by GLib-specific code currently.
2014-10-25 00:07:25 +02:00
Max Kellermann
f36db9bb04 configure.ac: auto-disable plugins that require GLib when --disable-glib is used 2014-10-24 23:46:20 +02:00
Max Kellermann
30dd29e251 configure.ac: improve database dependency checks
Abort if --enable-libmpdclient or --enable-upnp are used with
--disable-database, instead of ignoring the mismatch silently.
2014-10-24 23:43:21 +02:00
Max Kellermann
6cf1acfb48 test/DumpDatabase, ...: no g_thread_init() calls when GLib is disabled 2014-10-24 18:30:30 +02:00
Max Kellermann
a7b09d3d1c OutputThread: close the output plugin after filter failure
Fixes memory leak because ao_plugin_close() never gets called.
2014-10-24 00:35:16 +02:00
Max Kellermann
8fc3768166 OutputThread: unlock mutex for CloseFilter()
Be consistent.
2014-10-24 00:29:03 +02:00
Max Kellermann
b07bddf742 output/roar: remove unnecessary "volatile" keyword
A mutex acts as a memory barrier, and thus "volatile" is not
necessary.
2014-10-23 23:29:56 +02:00
Max Kellermann
220f957cd8 pcm/ChannelsConverter: fix variable used to generate error message
Use the "_format" parameter instead of the (uninitialized) "format"
attribute.
2014-10-23 22:44:53 +02:00
Max Kellermann
8ce48d83eb pcm/FormatConverter: move check to Open()
Report unsupported format while opening the filter, not later when the
first conversion takes place.
2014-10-23 22:42:08 +02:00
Max Kellermann
200cdb6b0a pcm/PcmConvert: assign {src,dest}_format at the end
Fixes assertion failure in destructor by not assigning
{src,dest}_format when an error occurs.
2014-10-23 22:39:51 +02:00
Max Kellermann
d9fb40203a pcm/PcmConvert: make AudioFormat parameters "const" 2014-10-23 22:39:51 +02:00
Max Kellermann
2d9e972195 configure.ac: prepare for 0.19.2 2014-10-23 21:57:04 +02:00
Max Kellermann
97a1a04116 release v0.19.1 2014-10-19 01:03:17 +02:00
Max Kellermann
493cd866f1 TextInputStream: manually shift the buffer before reading
Fixes truncated lines in m3u and cue files (regression by commit
67958f7).
2014-10-19 00:50:52 +02:00
Max Kellermann
063d369672 util/StaticFifoBuffer: make Shift() public 2014-10-19 00:49:08 +02:00
Max Kellermann
a0fae8dacc playlist/extm3u: strip first line for #EXTM3U detection 2014-10-17 20:45:18 +02:00
Max Kellermann
bc840b69d5 Makefile.am: distribute systemd/mpd.socket
The file systemd/mpd.service.in is being distributed implicitly, but
systemd/mpd.socket is not and needs to be added to EXTRA_DIST.
2014-10-12 08:38:52 +02:00
Max Kellermann
85301853d6 ThreadInputStream: call ThreadRead() inside the thread instead of Read()
Fixes deadlock bug in the "mms" plugin.
2014-10-11 21:59:06 +02:00
Max Kellermann
7cd53fb452 ThreadInputStream: add assertions 2014-10-11 21:57:31 +02:00
Max Kellermann
538ddf7af2 NEWS: add missing line 2014-10-11 21:48:52 +02:00
Max Kellermann
d5afa181f7 NEWS: fix typo in version number 2014-10-11 21:48:27 +02:00
Max Kellermann
8ed4124184 util/DynamicFifoBuffer: make the "Range" type public
Export it from the protected base class.  This fixes a build failure
on Mac OS X.
2014-10-11 20:28:08 +02:00
Max Kellermann
160242a74f configure.ac: prepare for 0.19.1 2014-10-11 20:25:19 +02:00
Max Kellermann
81b83bc904 release v0.19 2014-10-10 23:49:31 +02:00
Max Kellermann
2a716b7a7a doc: document the mount/neighbor commands 2014-10-10 23:22:39 +02:00
Max Kellermann
63272541eb doc/protocol: add more markup 2014-10-10 23:22:39 +02:00
Max Kellermann
464767c5fd db/upnp/Util: move caturl() to util/UriUtil.cxx 2014-10-10 22:43:40 +02:00
Max Kellermann
a9c3ca8606 event/IdleMonitor: remove redundant comment 2014-10-10 22:39:11 +02:00
Max Kellermann
86dd677e0c ZeroconfBonjour: use htons() instead of g_htons() 2014-10-10 22:30:38 +02:00
Max Kellermann
666f700a93 TagString: implement fix_utf8() without GLib 2014-10-10 22:11:38 +02:00
Max Kellermann
b70bf938c2 util/UTF8: add SequenceLengthUTF8() 2014-10-10 22:11:38 +02:00
Max Kellermann
d5cf41e043 util/UTF8: new library 2014-10-10 22:11:38 +02:00
Max Kellermann
b7a1954c33 TagString: return WritableBuffer<char> 2014-10-10 22:07:19 +02:00
Max Kellermann
6520589a37 TagString: use strndup() for unterminated string
Fixes buffer overflow bug.
2014-10-10 22:06:48 +02:00
Max Kellermann
f445b0178a TagString: remove ISO-Latin-1 fallback
MPD handles all strings in UTF-8 internally.  Those decoders which
read Latin-1 tags are supposed to implement the conversion, instead of
passing Latin-1 to TagBuilder::AddItem().  FixTagString() is simply
the wrong place to do that, and hard-coding Latin-1 is kind of
arbitrary.
2014-10-10 20:53:08 +02:00
Max Kellermann
f618065f7c fs/Traits: use value_type 2014-10-10 19:51:44 +02:00
nanotech
f0be48ff90 Main: run the OS X native event loop 2014-10-10 19:51:44 +02:00
Max Kellermann
bb922d577d storage/nfs: use the libnfs async API
Share the NFS connection with the NFS input plugin.
2014-10-09 08:09:08 +02:00
Max Kellermann
990809cc21 lib/nfs/Connection: reduce Error instance allocations 2014-10-09 08:08:17 +02:00
Max Kellermann
bfcc466647 lib/nfs/Glue: add assertion 2014-10-09 07:59:53 +02:00
Max Kellermann
3d2558bde6 StoragePlugin: pass EventLoop to constructor 2014-10-09 07:45:25 +02:00
Max Kellermann
1aac0b10c9 test/run_input, ...: add struct ScopeIOThread
Auto-stop the IO thread in all error handlers.
2014-10-07 20:02:13 +02:00
Max Kellermann
e5ff85b63c storage/nfs: move code to class MemoryStorageDirectoryReader
Read all directory entries into memory and close the struct nfsdir
before returning the StorageDirectoryReader instance.  This is what
libnfs does, anyway.
2014-10-07 06:36:11 +02:00
Max Kellermann
f0bb5b84f9 storage/nfs: move code to Copy() 2014-10-07 06:35:53 +02:00
Max Kellermann
07b50f6c69 lib/nfs/Connection: add methods {Open,Read,Close}Directory() 2014-10-07 06:35:50 +02:00
Max Kellermann
61b3aaaa07 lib/nfs/Connection: add method Stat(path) 2014-10-07 06:35:46 +02:00
Max Kellermann
b5119d7958 test/run_storage: new debug program 2014-10-07 06:21:34 +02:00
Max Kellermann
d3e72e4344 Makefile.am: add libnfs and libsmbclient to STORAGE_LIBS 2014-10-07 06:21:34 +02:00
Max Kellermann
60512ffa09 lib/nfs/Connection: make GetEventLoop() public 2014-10-06 08:47:13 +02:00
Max Kellermann
b1a252a64d lib/nfs/Base: kludge to reduce number of NFS mounts
Creating a NfsStorage sets its own export_name as the "base".  Now
NfsFileReader can use this information to derive the export_name to be
mounted, instead of guessing.  This solves the "too many connection"
problem on the NFS server while updating the database.
2014-10-05 07:41:50 +02:00
Max Kellermann
fb90b64bac Makefile.am: compile libffmpeg.a with FFMPEG_CFLAGS 2014-10-04 14:23:11 +02:00
Max Kellermann
6e7a398263 PlaylistStream: use OpenLocalInputStream() 2014-10-02 22:03:02 +02:00
Max Kellermann
44d2d9b1e8 PlaylistStream: pass Path instance to playlist_open_path()
Convert filesystem charset to UTF-8 for playlist_list_open_uri().
This fixes one of many remaining charset bugs.
2014-10-02 22:02:11 +02:00
Max Kellermann
8302ed44aa archive/bzip2: use OpenLocalInputStream() 2014-10-02 22:00:42 +02:00
Max Kellermann
7e12aea1d8 input/Open: use OpenLocalInputStream()
Make the "open" method of plugins "file" and "archive" dummy methods
that always fail.  Instead, let InputStream::Open() hard-code access
to these two plugins by using OpenLocalInputStream().  This allows
simplifyin the algorithm for falling back to probing archive plugins.
2014-10-02 21:50:14 +02:00
Max Kellermann
20346b0da4 DecoderThread: use OpenLocalInputStream() for local files 2014-10-02 21:48:52 +02:00
Max Kellermann
e0e65cbdf9 TagFile: use OpenLocalInputStream() 2014-10-02 21:43:40 +02:00
Max Kellermann
9d2d58c4b6 input/LocalOpen: new library for opening local files
Combines the "file" and the "archive" input plugins.
2014-10-02 21:06:01 +02:00
Max Kellermann
0c461c3859 input/archive: export function OpenArchiveInputStream() 2014-10-02 21:00:38 +02:00
Max Kellermann
0d38bd9b3b input/file: export function OpenFileInputStream() 2014-10-02 20:44:03 +02:00
Max Kellermann
2f02e49b9f input/file: generate Error when errno==ENOENT
This special case was useless.  Fixes the dreaded "Unrecognized URI"
error message when a file does not exist.
2014-10-02 20:16:05 +02:00
Max Kellermann
064e8a7c68 input/file: make the "fd" attribute "const" 2014-10-02 19:55:01 +02:00
Max Kellermann
e4dd269609 input/file: make variables more local 2014-10-02 19:18:58 +02:00
Max Kellermann
19dd59f38c storage: remove redundant "virtual" keywords
"override" implies "virtual".
2014-10-02 19:17:46 +02:00
Max Kellermann
37501d9bc7 input/file: convert to class 2014-10-02 19:14:59 +02:00
Max Kellermann
89f9561d10 storage/Interface: include cleanup 2014-10-01 23:38:17 +02:00
Max Kellermann
8af3f91e78 Makefile.am: fix header file names
Found by "make distcheck".
2014-10-01 23:28:18 +02:00
Max Kellermann
0661fd6f7c lib/nfs/FileReader: postpone the nfs_close_async() call
If an async opertion is in progress, nfs_close_async() will make
libnfs crash because the RPC callback will dereference an object that
was freed by nfs_close_async().
2014-10-01 23:10:32 +02:00
Max Kellermann
edd003b62a lib/nfs/Connection: fix memory leak when cancelling Open()
Close the newly allocated file handle passed to the callback.
2014-10-01 23:03:31 +02:00
Max Kellermann
10cc87e422 lib/nfs/Connection: remove Mutex
All locks are currenly held from only a single thread (the IOThread)
and thus we don't need the Mutex.
2014-10-01 22:15:06 +02:00
Max Kellermann
0470f648c6 lib/nfs/Connection: add method GetEventLoop() 2014-10-01 22:10:46 +02:00
Max Kellermann
777360149d lib/nfs/Connection: remove obsolete flag postponed_destroy 2014-10-01 22:10:05 +02:00
Max Kellermann
aa7774b82b lib/nfs/Connection: remove deprecated move constructor workaround
Not used anymore because NfsManager now uses boost::intrusive::set
instead of std::map.
2014-10-01 22:09:37 +02:00
Max Kellermann
d44da875e7 storage/nfs: make a few attributes "const" 2014-10-01 21:14:26 +02:00
Max Kellermann
f9ad73598b lib/nfs/Manager: use boost::intrusive::map
Reduce overhead for storing the key twice, and more overhead while
looking up the connection to remove it after a failure.
2014-10-01 20:49:40 +02:00
Max Kellermann
952fe98796 lib/nfs/Glue: add assertion 2014-10-01 20:44:54 +02:00
Max Kellermann
579912e52f lib/nfs/Glue: destruct the NfsManager in the I/O thread
This allows eliminating the indirection code from the NfsConnection
destructor.
2014-10-01 20:39:50 +02:00
Max Kellermann
1b5ec3e3ca lib/nfs/Glue: eliminate class NfsGlue
It's just a useless wrapper for class NfsManager.
2014-10-01 20:37:25 +02:00
Max Kellermann
fb4e6ac923 lib/nfs/Cancellable: use boost::intrusive::list
Reduce Remove() overhead because we don't have to walk the list to
find an iterator by reference.
2014-10-01 19:49:38 +02:00
Max Kellermann
3560dc4be6 Tag: support "AlbumSort"
The new tag is supported by all decoders that use the tag name table,
and the ID3v2 tag "TSOA" maps to it.
2014-09-29 18:55:59 +02:00
Max Kellermann
b002ea9a20 storage/nfs: convert file name to UTF-8
Assume the configured filesystem character set is also used by the NFS
server.
2014-09-28 18:26:54 +02:00
Max Kellermann
540317ea2b storage/nfs: use string::append() instead of string::insert()
Swap the order of adding the URI and the slash, because appending is
cheaper than inserting.
2014-09-28 18:25:51 +02:00
Max Kellermann
142d1951d2 storage/nfs: move code to UriToNfsPath() 2014-09-28 18:12:20 +02:00
Max Kellermann
cf06ba6d13 fs/AllocatedPath: add method Steal() 2014-09-28 18:12:20 +02:00
Max Kellermann
a8d800572e fs/AllocatedPath: API documentation grammar fixes 2014-09-28 18:06:18 +02:00
Wieland Hoffmann
5525ea45a4 Add MusicBrainz' Release Track Id tag
The Release Track Id uniquely identifies a recording on a release - that
is, even if a recording appears twice on a release (meaning that the
combination of recording and release id are not enough to figure out
which one it is), the release track id will allow differentiating the two.

The tag names are taken from
https://musicbrainz.org/doc/MusicBrainz_Picard/Tags/Mapping
2014-09-27 19:54:12 +02:00
Max Kellermann
3120958a17 pcm: --disable-dsd also disables the dsd2pcm library 2014-09-26 12:17:47 +02:00
Max Kellermann
052726ed50 PcmConvert: eliminate unused local variable "format" 2014-09-26 12:17:37 +02:00
Max Kellermann
8397196fbb output/alsa: change a few "dsd" to "dop" 2014-09-26 11:07:53 +02:00
Max Kellermann
8547611479 Merge tag 'v0.18.16' 2014-09-26 11:06:11 +02:00
Max Kellermann
fe45f28204 release v0.18.16 2014-09-26 10:57:04 +02:00
Max Kellermann
861067412f configure.ac: fix DSD breakage due to typo 2014-09-26 10:56:20 +02:00
Max Kellermann
7eca886608 configure.ac: prepare for 0.18.16 2014-09-26 10:55:43 +02:00
Max Kellermann
79b6f9e89e release v0.18.15 2014-09-26 09:41:40 +02:00
Max Kellermann
3d17c06777 configure.ac: allow building MPD without decoder plugin
There's always the "PCM" decoder plugin, which was never checked by
configure.ac.
2014-09-26 09:29:18 +02:00
Max Kellermann
d6c08fb79f configure.ac: allow building MPD without output plugin
MPD can easily be used as a database provider for the proxy database
plugin.  In that case, it needs only one "null" output, and no real
output plugin.
2014-09-26 09:29:18 +02:00
Max Kellermann
ef02b20811 CommandLine: update copyright year 2014-09-26 09:29:18 +02:00
Max Kellermann
8bf46a665e configure.ac: add option to disable the DSD decoders
Allow building a smaller MPD binary for people who don't need DSD.
2014-09-26 09:29:18 +02:00
Max Kellermann
c4fca2aa61 playlist/embcue: change name string to "embcue"
The name "cue" was listed twice in "mpd --version".
2014-09-26 09:29:18 +02:00
Max Kellermann
45310d0cf6 decoder/mp4v2: add tag table 2014-09-24 23:29:10 +02:00
Max Kellermann
87268c2297 test/test_protocol: add missing stdlib.h include
EXIT_SUCCESS and EXIT_FAILURE are defined in stdlib.h, not unistd.h.
D'oh!
2014-09-24 23:03:28 +02:00
Max Kellermann
032e435490 decoder/mpg123: support ID3v2, ReplayGain and MixRamp 2014-09-24 22:53:50 +02:00
Max Kellermann
78c43edcac decoder/mpg123: make variables more local 2014-09-24 22:53:39 +02:00
Max Kellermann
f32d34b965 decoder/flac: pass VorbisComment to flac_parse_mixramp() 2014-09-24 22:50:28 +02:00
Max Kellermann
8a7ff6a6fd decoder/flac: move code to tag/MixRamp.cxx 2014-09-24 22:44:58 +02:00
Max Kellermann
6c48aa5fae decoder/mad: move code to tag/MixRamp.cxx 2014-09-24 22:40:34 +02:00
Max Kellermann
d82547acd3 decoder/flac: pass VorbisComment to flac_parse_replay_gain() 2014-09-24 22:34:08 +02:00
Max Kellermann
441f9cc2ee tag/ReplayGain: add VorbisComment parser
Move code from the Vorbis and FLAC decoder plugins.
2014-09-24 22:21:13 +02:00
Max Kellermann
9f4fc8ad33 tag/ReplayGain: move code to template function 2014-09-24 22:19:55 +02:00
Max Kellermann
d1e31261fe decoder/{vorbis,flac}: move duplicate code to tag/VorbisComment.cxx 2014-09-24 21:50:42 +02:00
Max Kellermann
05dd9acba8 tag/ApeReplayGain, decoder/mad: move duplicate code to tag/ReplayGain.cxx 2014-09-24 21:50:34 +02:00
Max Kellermann
9270485723 Merge branch 'v0.18.x' 2014-09-24 21:49:20 +02:00
Max Kellermann
e93975cb46 test/test_protocol: add missing unistd.h include 2014-09-24 21:43:11 +02:00
Max Kellermann
cbdaf4827f CommandLine: make all OptionDefs "constexpr" 2014-09-22 09:10:17 +02:00
Max Kellermann
f2c28d287a DecoderBuffer: struct to class 2014-09-22 08:49:14 +02:00
Max Kellermann
90c228abca DecoderBuffer: convert functions to methods 2014-09-22 08:32:44 +02:00
Max Kellermann
505e6bec9e decoder/faad: use DecoderBuffer references 2014-09-22 08:30:25 +02:00
Max Kellermann
ee027f237b decoder/faad: allocate DecoderBuffer on stack 2014-09-22 08:29:07 +02:00
Max Kellermann
3ae0d6f421 DecoderBuffer: export the struct
Eliminates the functions _new() and _free().
2014-09-22 08:18:58 +02:00
Max Kellermann
13b66a77c7 DecoderBuffer: make "decoder" const 2014-09-21 14:02:39 +02:00
Max Kellermann
ed70836057 DecoderBuffer: convert pointer to reference 2014-09-21 13:50:27 +02:00
Max Kellermann
a68e52c2e3 DecoderBuffer: use class DynamicFifoBuffer 2014-09-21 13:39:26 +02:00
Max Kellermann
ea37b89753 decoder/adplug: log version number 2014-09-21 13:22:56 +02:00
Max Kellermann
5d89aa06f7 decoder/adplug: move the buffer into the loop 2014-09-21 13:20:30 +02:00
Max Kellermann
ead034e638 decoder/sndfile: include cleanup 2014-09-21 13:15:53 +02:00
Max Kellermann
a294838bcd decoder/audiofile: fix indent 2014-09-19 23:57:09 +02:00
Max Kellermann
1c03d1e87d decoder/sndfile: remove obsolete code comment 2014-09-19 23:00:12 +02:00
Max Kellermann
f8804c8a56 decoder/sndfile: remove debug printf() 2014-09-19 22:49:31 +02:00
Max Kellermann
7c444dea6e doc/user: add section "Satellite setup" 2014-09-19 22:41:00 +02:00
Max Kellermann
6d91d270d6 doc/user: more NFS instructions 2014-09-19 22:12:49 +02:00
Max Kellermann
dd1cec4196 decoder/sndfile: log detailed sf_open_virtual() error message 2014-09-19 21:51:24 +02:00
Max Kellermann
d1a8a4481e decoder/sndfile: support float and 16 bit samples
Support these PCM formats natively, instead of letting libsndfile
convert everything to 32 bit.
2014-09-19 21:44:16 +02:00
Max Kellermann
5921ffaa36 decoder/sndfile: move sf_readf_int() call to sndfile_read_frames() 2014-09-19 21:42:06 +02:00
Max Kellermann
cf47b68c1e decoder/sndfile: add sndfile_sample_format()
Prepare for other sample formats.
2014-09-19 21:06:44 +02:00
Max Kellermann
eeb8d0dbcd db/proxy: support empty values in VisitUniqueTags()
Workaround for assertion failure in PrintUniqueTag().
2014-09-18 17:22:31 +02:00
Max Kellermann
b6fa22bd84 OutputThread: retain negative mix ratio
Fixes MixRamp breakage.
2014-09-18 13:50:23 +02:00
Andrzej Rybczak
a0ef27a0cd command/list: reset used size after the list has been processed 2014-09-18 09:15:39 +02:00
Thomas Guillem
22eb831a71 Makefile.am: android AIDL need src/org/musicpd folder 2014-09-16 18:26:20 +02:00
Thomas Guillem
01ab9acd14 Makefile.am: fix android symlinks, use absolute paths 2014-09-16 18:26:07 +02:00
Thomas Guillem
74fcbb382f android/Bridge: add shutdown()
Break the mainloop and terminate run call.
2014-09-16 18:25:45 +02:00
Thomas Guillem
9836b1dddd CurlInputPlugin: fix crash after second init call
The second time init was called, http_200_aliases pointed to a freed pointer
and leaded to a SEGFAULT.
2014-09-16 18:25:25 +02:00
Max Kellermann
e304d0f8ee thread/Posix{Cond,Mutex}: don't ues PTHREAD_*_INITIALIZER on NetBSD
On NetBSD, PTHREAD_MUTEX_INITIALIZER and PTHREAD_COND_INITIALIZER are
not compatible with C++11 "constexpr" (see Mantis ticket 0004110).  As
a workaround, don't ues "constexpr", and use the functions
pthread_mutex_init(), pthread_mutex_destroy(), pthread_cond_init() and
pthread_cond_destroy() instead.  This adds some runtime overhead, but
is portable to POSIX implementations that have awkward initializer
macros.
2014-09-13 11:26:17 +02:00
Max Kellermann
ab7b38d4b9 configure.ac: prepare for 0.18.15 2014-09-13 11:14:41 +02:00
Max Kellermann
a464dc681a Merge tag 'v0.18.14' 2014-09-11 19:26:58 +02:00
Max Kellermann
eaf675dc92 release v0.18.14 2014-09-11 19:09:49 +02:00
Max Kellermann
57068e526c test/run_decoder: dump MixRamp data 2014-09-09 19:17:22 +02:00
Max Kellermann
c14a00eec9 decoder/ffmpeg: use memset() to initialize AVProbeData 2014-09-09 19:07:46 +02:00
Max Kellermann
219c42522f decoder/ffmpeg: pass MIME type to ffmpeg/libav version 11
That attribute was uninitialized before, which could crash
libavformat.

See Debian bug 760669
2014-09-07 22:05:33 +02:00
Max Kellermann
e3a0f15837 Decoder*: add more assertions 2014-09-07 21:52:34 +02:00
Max Kellermann
a6bb27483b DecoderThread: clear the pipe when handling late SEEK
See code comment.  Fixes assertion failure in
decoder_command_finished().
2014-09-07 21:50:00 +02:00
Max Kellermann
7ada7def9e decoder/audiofile: fix crash after seeking
Log call was added to the wrong branch.

Fixes regression by commit ca1a1149
2014-09-06 19:32:10 +02:00
Max Kellermann
af384d9aa6 doc/user: require bit-perfect playback for DoP 2014-09-05 14:32:43 +02:00
Max Kellermann
223c129b6b output/pulse: simplify _wait_for_operation()
Eliminate the duplicate pa_operation_get_state() call.
2014-09-05 11:16:09 +02:00
Max Kellermann
421c4ae907 protocol/ArgParser: fix integer overflow in parse_range()
Casting std::numeric_limits<unsigned>::max() to "long" leads to an
overflow if sizeof(unsigned)==sizeof(long), and the result will be -1.

This happens on some 32 bit architectures, for example ARM and WIN32.

Workaround: use std::numeric_limits<int>::max(), which is the largest
signed integer.  Since sizeof(long)>=sizeof(int), this will never
overflow.

Fixes Mantis ticket 0004080.
2014-09-04 17:37:31 +02:00
Max Kellermann
4907f610d6 test/test_protocol: unit test for protocol/ArgParser.cxx 2014-09-04 17:10:30 +02:00
Max Kellermann
f9d1bbbffb configure.ac: prepare for 0.18.14 2014-09-03 19:59:26 +02:00
Max Kellermann
60589fc1cb input/nfs: auto-reconnect if failed while paused 2014-09-02 21:27:07 +02:00
Max Kellermann
5121316036 input/async: add method IsPaused() 2014-09-02 20:02:56 +02:00
Max Kellermann
68bdfa9d0e doc/user: add sections for bit-perfect playback and DSD 2014-09-02 14:42:05 +02:00
Max Kellermann
97b816200d doc/protocol: enable docbook-xslt option "use.id.as.filename" 2014-09-02 13:50:47 +02:00
Max Kellermann
059a643188 doc/user: enable docbook-xslt option "use.id.as.filename" 2014-09-02 13:44:38 +02:00
Max Kellermann
7facad41b7 doc/user: add links 2014-09-02 10:36:20 +02:00
Max Kellermann
3ee59e454c doc/user: remove redundant encoder plugin settings 2014-09-02 10:36:20 +02:00
Max Kellermann
43da1686da nfs/Connection: check for disappearing libnfs socket 2014-08-31 19:33:08 +02:00
Max Kellermann
6d643f92b7 nfs/Connection: use only BroadcastError()
Since BroadcastError() calls BroadcastMountError(), there's no need to
check mount_finished here.
2014-08-31 19:32:41 +02:00
Max Kellermann
559a01f585 nfs/Connection: nfs_get_fd() can return -1
While reconnecting to the NFS server, the socket is -1, because there
is no socket.  Fixes a potential crash (assertion failure).
2014-08-31 19:08:26 +02:00
Max Kellermann
ba8e3f11e2 input/nfs: notify client on error
Fixes hanging NFS client.
2014-08-31 18:26:32 +02:00
Max Kellermann
fd8a53ca3d nfs/Connection: use nfs_get_error() for mount error 2014-08-31 17:44:35 +02:00
Max Kellermann
8707aafaf7 nfs/Connection: fix assertion failure 2014-08-31 17:39:33 +02:00
Max Kellermann
e5a28bfd8d output/alsa, pcm: rename "DSD over USB" to "DoP"
The standard has been renamed since the early draft that was
implemented in MPD.
2014-08-31 16:12:26 +02:00
Max Kellermann
6e04d66a35 Merge tag 'v0.18.13' 2014-08-31 15:03:34 +02:00
Max Kellermann
86e8b3b4bd release v0.18.13 2014-08-31 14:50:23 +02:00
Max Kellermann
a26ead035a PlaylistControl: use SeekSongOrder(current) to keep current song
The "current" attribute is a "song order", not a "song position".
This is usually the same - except in random mode.  Fixes Mantis ticket
0004073.
2014-08-31 14:44:20 +02:00
Max Kellermann
704be54c3a PlaylistControl: move code to new method SeekSongOrder() 2014-08-31 14:23:06 +02:00
Max Kellermann
2406152576 output/alsa: fix endless loop at end of file in dsd_usb mode 2014-08-31 14:01:57 +02:00
Max Kellermann
af260b5a64 output/{alsa,oss}: add assertions 2014-08-31 14:00:09 +02:00
Joachim Fasting
4efa96df21 doc/protocol: fix description of "stats" response
Fix incorrect description of the "songs" field and add missing
"albums" field.

Signed-off-by: Joachim Fasting <joachifm@fastmail.fm>
2014-08-31 13:16:39 +02:00
Max Kellermann
26bef5d209 DecoderAPI: use std::min() 2014-08-31 08:27:51 +02:00
Max Kellermann
cd6e0ff88a MusicChunk: remove special case for num_frames==0
Simply return an empty WritableBuffer, not a nulled one.
2014-08-31 08:26:03 +02:00
Max Kellermann
2ca979425f MusicChunk: copy AudioFormat only when chunk is empty 2014-08-31 08:25:17 +02:00
Max Kellermann
8d822ebdb4 PlaylistMapper: pass the Storage::MapUTF() result to playlist_open_remote()
Finally allows loading playlist files on a storage plugin.  Commit
297e2747 attempted to implement this, but failed due to this bug.
2014-08-30 01:02:24 +02:00
Max Kellermann
bc5b5afcbf decoder/sndfile: refactor frame_to_time() 2014-08-30 00:53:14 +02:00
Max Kellermann
b373c53ce4 *: add missing Compiler.h includes
Necessary for "final" on gcc 4.6.
2014-08-30 00:46:52 +02:00
Max Kellermann
bc4b89c21a Chrono: workaround for gcc 4.6 constexpr problems 2014-08-30 00:41:56 +02:00
Max Kellermann
e10c287c93 PlayerControl: make settings "const" 2014-08-30 00:28:02 +02:00
Max Kellermann
ce42d53a09 PlayerControl: update include guard 2014-08-30 00:27:01 +02:00
Max Kellermann
a4f9d6d98b output/alsa: fix signed/unsigned comparison warning 2014-08-30 00:27:01 +02:00
Max Kellermann
eebd03701a db/simple: fix build failure without zlib 2014-08-30 00:25:12 +02:00
Max Kellermann
d5287682d1 ArgParser: allow fractional seconds in ParseCommandArg(SongTime) 2014-08-29 23:46:38 +02:00
Max Kellermann
7c567e3cbd CrossFade: pass total_time as SignedSongTime instance 2014-08-29 23:41:34 +02:00
Max Kellermann
58352ea69d db/Stats: use std::chrono::duration for the total duration
Use milliseconds precision to reduce rounding errors.
2014-08-29 23:25:03 +02:00
Max Kellermann
de64b35359 db/upnp: use DatabaseStats::Clear() 2014-08-29 23:24:49 +02:00
Max Kellermann
7df8e1eab2 db/Count: use std::chrono::duration for the total time
Use milliseconds precision to reduce rounding errors.
2014-08-29 23:18:40 +02:00
Max Kellermann
8b62127770 decoder/gme: fix song duration
The unit of gme_info_t::length is milliseconds, not centiseconds.
2014-08-29 23:03:29 +02:00
Max Kellermann
3158955198 TagHandler: pass SongTime to duration() 2014-08-29 22:52:04 +02:00
Max Kellermann
d9d97bd17b DecoderAPI: pass SignedSongTime to decoder_initialized() 2014-08-29 21:40:15 +02:00
Max Kellermann
94f6380d69 Chrono: add methods FromScale() 2014-08-29 21:38:08 +02:00
Max Kellermann
2ee821656f Chrono: rename ToScale() parameter 2014-08-29 21:38:08 +02:00
Max Kellermann
7556abb92d decoder/faad: bit_rate==0 is an error 2014-08-29 21:38:08 +02:00
Max Kellermann
9d3a85d434 MusicChunk: use SignedSongTime for the time stamp 2014-08-29 13:20:58 +02:00
Max Kellermann
147d301f10 MultipleOutputs: use SignedSongTime for elapsed_time 2014-08-29 13:20:58 +02:00
Max Kellermann
75a89c5983 PlayerThread: use SongTime for elapsed_time 2014-08-29 13:20:58 +02:00
Max Kellermann
2289968634 PlayerControl: use SignedSongTime for the song duration 2014-08-29 13:20:58 +02:00
Max Kellermann
ca252804c6 DecoderControl: use SignedSongTime for the song duration 2014-08-29 13:20:58 +02:00
Max Kellermann
7c25d83f1c Tag: use SignedSongTime for the song duration 2014-08-29 13:20:58 +02:00
Max Kellermann
8ce30c6a69 Chrono: convert SongTime to SignedSongTime implicitly 2014-08-29 13:20:58 +02:00
Max Kellermann
9fcaff749f Chrono: add SignedSongTime::FromS(unsigned) 2014-08-29 12:50:41 +02:00
Max Kellermann
3ac1475262 Chrono: add methods ToS(), RoundS() 2014-08-29 12:23:09 +02:00
Max Kellermann
ad64bab5b2 Chrono: add method SignedSongTime::Negative() 2014-08-29 12:18:13 +02:00
Max Kellermann
f02998b106 DecoderControl: use std::chrono::duration for start_ms and end_ms 2014-08-28 13:08:44 +02:00
Max Kellermann
127fe6ecf0 PlaylistEdit: pass std::chrono::duration to SetSongIdRange() 2014-08-28 13:03:18 +02:00
Max Kellermann
888ab0c89c db/simple/Song: use std::chrono::duration for start_ms and end_ms 2014-08-28 13:03:18 +02:00
Max Kellermann
2efd8ef52d db/LightSong: use std::chrono::duration for start_ms and end_ms 2014-08-28 13:03:18 +02:00
Max Kellermann
6ad933982f DetachedSong: use std::chrono::duration for start_ms and end_ms 2014-08-28 13:03:18 +02:00
Max Kellermann
854258f376 Chrono: override operator+ and operator-
Make sure we return the correct type.  This obsoletes the cast
constructor trick.
2014-08-28 13:03:18 +02:00
Max Kellermann
26f2d7fbae DecoderControl: update API documentation 2014-08-28 13:03:18 +02:00
Max Kellermann
3952920492 Playlist: use std::chrono::duration for Seek*() 2014-08-28 06:42:19 +02:00
Max Kellermann
c2001a7259 Chrono: add class SignedSongTime 2014-08-28 06:42:04 +02:00
Max Kellermann
78f911ac19 Chrono: add methods IsZero(), IsPositive() 2014-08-28 06:42:04 +02:00
Max Kellermann
0f2a7226fb PlayerControl: use std::chrono::duration for Seek() 2014-08-27 19:07:16 +02:00
Max Kellermann
f8d0ebe92f PlayerThread: check if total_time is valid before using it 2014-08-27 19:06:50 +02:00
Max Kellermann
ba6ba7d4be DecoderControl: use std::chrono::duration for Seek() 2014-08-27 18:48:43 +02:00
Max Kellermann
58e6f660f3 Chrono: add implicit conversion operator from std::chrono::duration 2014-08-27 18:47:14 +02:00
Max Kellermann
cd482ca655 Chrono: add method ToDoubleS() 2014-08-27 18:41:33 +02:00
Max Kellermann
e43b56eb38 Chrono: add template parameter to ToScale() 2014-08-27 18:41:33 +02:00
Max Kellermann
0c2d767f6f DecoderAPI: use std::chrono::duration for decoder_seek*()
For type safety and code readability.
2014-08-26 22:27:04 +02:00
Max Kellermann
02e697032f decoder/pcm: use integer seek times 2014-08-26 22:05:02 +02:00
Max Kellermann
07dc262690 decoder/dsf: use integer seek times 2014-08-26 22:00:16 +02:00
Max Kellermann
6bf8d5b936 decoder/dsdiff: use integer seek times 2014-08-26 21:53:50 +02:00
Max Kellermann
93858bf262 decoder/wildmidi: use integer seek times 2014-08-26 11:41:48 +02:00
Max Kellermann
f64da46a98 decoder/wavpack: use integer seek times 2014-08-26 11:39:58 +02:00
Max Kellermann
2052a029ee decoder/vorbis: use integer seek times 2014-08-26 11:38:39 +02:00
Max Kellermann
c6aafff701 decoder/sndfile: use integer seek times 2014-08-26 11:36:20 +02:00
Max Kellermann
26f0f92210 decoder/opus: use integer seek times 2014-08-26 11:34:56 +02:00
Max Kellermann
bdc4ae2b86 decoder/opus: remove redundant decoder_timestamp() call
After seeking, the MPD core automatically refreshes the timestamp, and
thus discards the value from decoder_timestamp().
2014-08-26 11:34:24 +02:00
Max Kellermann
9ca9341384 decoder/mpg123: use integer seek times 2014-08-26 11:31:57 +02:00
Max Kellermann
7f4f8b7c7d decoder/mpcdec: use integer seek times 2014-08-26 11:31:49 +02:00
Max Kellermann
8870526457 decoder/flac: use integer seek times 2014-08-26 11:30:21 +02:00
Max Kellermann
f057e1e17a decoder/audiofile: use integer seek times 2014-08-26 11:29:22 +02:00
Max Kellermann
8561c9c5a6 DecoderAPI: add decoder_seek_where_frame() 2014-08-26 11:27:41 +02:00
Max Kellermann
23199719d9 decoder/mp4v2: use integer seek times 2014-08-26 11:20:15 +02:00
Max Kellermann
a606ef0700 decoder/ffmpeg: use integer seek times 2014-08-26 11:15:53 +02:00
Max Kellermann
a234de1ee3 decoder/gme: use integer seek times 2014-08-26 11:15:40 +02:00
Max Kellermann
d266898617 decoder/modplug: use integer seek times 2014-08-26 11:11:36 +02:00
Max Kellermann
69b5929c5a decoder/mad: use integer seek times
Avoid roundtrips to floating point.
2014-08-26 11:07:47 +02:00
Max Kellermann
316c72a4ae DecoderAPI: add decoder_seek_where_ms()
Move to fixed-point integers instead of floating point.
2014-08-26 11:02:02 +02:00
Max Kellermann
9da88eec3e decoder/mad: move duplicate code to RecoverFrameError() 2014-08-26 10:52:17 +02:00
Max Kellermann
f10d9996d2 decoder/mad: simplify if/else chain 2014-08-26 10:52:17 +02:00
Max Kellermann
58ec9d3a73 decoder/mad: make variables more local 2014-08-26 10:34:04 +02:00
Max Kellermann
4a503ba1ad decoder/mad: simplify "return", eliminate check
This check was redundant, because we could only exit the loop when
ret==DECODE_OK.
2014-08-26 10:30:22 +02:00
Max Kellermann
2d096a569a output/alsa: fix coding style 2014-08-26 10:25:59 +02:00
Max Kellermann
e44ea5038e output/alsa: merge Init() into Configure() 2014-08-26 10:22:35 +02:00
Max Kellermann
b111aa0111 ZeroconfAvahi: fix coding style 2014-08-26 10:04:27 +02:00
Max Kellermann
773d24ebf7 ZeroconfAvahi: remove "goto" 2014-08-26 10:03:35 +02:00
Max Kellermann
bd371af0b3 ZeroconfAvahi: remove unused flag "avahi_running"
This flag is never read.
2014-08-26 10:02:06 +02:00
Max Kellermann
9d79c72c17 output/alsa: add API documentation 2014-08-26 09:37:30 +02:00
Max Kellermann
a86aaef4d0 output/alsa: support native DSD playback
Translate SampleFormat::DSD to SND_PCM_FORMAT_DSD_U8, which was added
to alsa-lib 1.0.27.1.
2014-08-26 07:11:53 +02:00
Max Kellermann
e463244db3 output/alsa: move alsa_configure() into the class 2014-08-26 07:10:16 +02:00
Max Kellermann
9e10b75f55 PcmExport: remove obsolete API documentation 2014-08-26 07:10:16 +02:00
Max Kellermann
294091ce60 output/alsa: remove obsolete macros 2014-08-26 05:53:15 +02:00
Max Kellermann
da6dd2dc92 decoder/mad: don't reset the xing struct
Not necessary.
2014-08-25 10:32:40 +02:00
Max Kellermann
40b9de66c7 decoder/mad: remove unused flag "found_xing" 2014-08-25 10:31:55 +02:00
Max Kellermann
aac985951a decoder/mad: convert enums/macros to constexpr 2014-08-24 21:06:50 +02:00
Max Kellermann
662cc5fe20 decoder/mad: make variables more local 2014-08-24 20:57:47 +02:00
Max Kellermann
e1e62d97a8 doc/mpd.conf.5: remove deprecated setting 2014-08-24 13:59:49 +02:00
Max Kellermann
a29cc48fec doc/{mpd.conf.5,mpdconf.example}: move documentation to the manual 2014-08-24 13:33:00 +02:00
Max Kellermann
42af040fbd StateFile: configurable interval 2014-08-24 13:24:20 +02:00
Max Kellermann
d383d617c2 StateFile: make "path" const 2014-08-24 13:24:20 +02:00
Max Kellermann
9d04c21cc2 doc/user: document the state file 2014-08-24 13:24:20 +02:00
Max Kellermann
ed8039e223 doc/user: add comments about libao and openal 2014-08-24 13:24:20 +02:00
Max Kellermann
f05743bf57 doc/user: add comment about Linux and OSS 2014-08-24 13:24:19 +02:00
Max Kellermann
c6be661bb5 doc/user: more markup 2014-08-24 13:24:19 +02:00
Max Kellermann
c84508ae9f Merge branch 'v0.18.x' 2014-08-24 13:20:35 +02:00
Max Kellermann
f06fe1ea98 event/TimeoutMonitor: really reset "active" flag before invoking OnTimeout()
The previous commit was broken.  D'oh!
2014-08-24 13:19:50 +02:00
Max Kellermann
77f2cd6513 Merge branch 'v0.18.x' 2014-08-24 13:15:17 +02:00
Max Kellermann
d16fb79708 event/TimeoutMonitor: reset "active" flag before invoking OnTimeout()
The IsActive() method returned true even if the timer was not active,
after it completed once.  This broke the state file timer, and the
state file was not saved periodically.
2014-08-24 13:13:12 +02:00
Max Kellermann
baad86bcd7 doc/user: document ALSA mixer plugin settings 2014-08-23 15:39:32 +02:00
Max Kellermann
8808aad529 decoder/dsdiff: implement seeking 2014-08-23 15:27:21 +02:00
Max Kellermann
6d7eaba845 decoder/dsdiff: refactor the main decoder loop
Check for STOP before decoding the first chunk.  This reduces the
command latency.
2014-08-23 15:25:40 +02:00
Max Kellermann
4259b17b91 decoder/dsdiff: add local variable "remaining_bytes"
Remember the chunk's total size.
2014-08-23 15:21:08 +02:00
Max Kellermann
828ea700e8 decoder/dsdiff: don't skip remaining bytes
Nobody cares.
2014-08-23 15:19:34 +02:00
Max Kellermann
7f22685fa3 decoder/dsdiff: eliminate local variable "buffer_samples" 2014-08-23 15:17:31 +02:00
Max Kellermann
40db9dff3b decoder/dsdiff: support only one "DSD" chunk
Eliminate the loop from dsdiff_stream_decode().  It makes the code
complex, real-world files with multiple DSD chunks are outside of the
specification, and the "chunk_size" variable would be bogus anyway.
2014-08-23 15:14:16 +02:00
Max Kellermann
fa82264604 pcm/PcmDsd: remove "lsbfirst" support
Unused.  Bit reversing is done in the decoder.
2014-08-23 14:46:34 +02:00
Max Kellermann
ae467aa42e pcm/dsd2pcm: add license headers
Obtained from the Mercurial repository at
https://code.google.com/p/dsd2pcm/
2014-08-23 14:42:23 +02:00
Thomas Klausner
c38f29ce56 system/ByteOrder: <endian.h> is a non-standard header that only Linux provides. 2014-08-23 14:27:44 +02:00
Max Kellermann
67cc09416f decoder/dsf: implement seeking 2014-08-23 14:00:38 +02:00
Max Kellermann
f2a75fbfc7 decoder/dsf: refactor the main decoder loop
Check for STOP before decoding the first chunk.  This reduces the
command latency.
2014-08-23 13:57:57 +02:00
Max Kellermann
b1fb09e183 decoder/dsf: make the buffer more local
This allows the compiler to discard buffer contents between two
iterations.
2014-08-23 13:55:52 +02:00
Max Kellermann
cd0082c630 decoder/dsf: eliminate pointless return statement 2014-08-23 13:54:07 +02:00
Max Kellermann
f78527d1e3 decoder/dsf: use the block count internally 2014-08-23 13:51:08 +02:00
Max Kellermann
1f642238a7 decoder/dsf: don't skip remaining bytes
Nobody cares.
2014-08-23 13:50:36 +02:00
Max Kellermann
6fe06cad98 decoder/dsf: count the blocks, not the remaining bytes
Prepare refactoring the whole plugin to use blocks instead of bytes.
A block is the smallest addressable unit, and it will simplify the
seeking code.
2014-08-23 13:44:53 +02:00
Max Kellermann
2335fdbb5a decoder/dsf: allow channel setups other than stereo
This finishes the multi-channel support.  Development of the feature
was started with commit 02cc77cd8
2014-08-23 13:40:21 +02:00
Max Kellermann
1b6f7c3eb7 decoder/dsf: eliminate another hard-coded stereo mode assumption
When calculating the upper bound using the "sample count" format
header, don't assume it's stereo.
2014-08-23 13:39:00 +02:00
Max Kellermann
67f0d26d17 decoder/dsf: fix big-endian bugs 2014-08-23 13:35:29 +02:00
Max Kellermann
8574bcd494 decoder/dsf: compare with InputStream::GetRest() instead of ..GetSize() 2014-08-23 13:26:17 +02:00
Max Kellermann
02cc77cd82 decoder/dsf: fix multi-channel files
The plugin was horribly bugged for files that were not stereo.
2014-08-22 07:30:32 +02:00
Max Kellermann
d8782ce5fd decoder/dsf: simplify dsf_to_pcm_order()
Don't pass the buffer size to the function, as it's known at compile
time.  Use "restrict" on the pointer arguments, and merge the two
loops, which allows the compiler to optimize this loop with a few SSE2
instructions.
2014-08-22 06:58:08 +02:00
Max Kellermann
dedc2986c6 decoder/dsf: fix noise at end of malformed file
Read one block at a time.  This discards the last partial block, which
cannot be interleaved anyway.  Previously, uninitialised memory was
used to interleave the last block, which generated some noise.
2014-08-21 17:46:25 +02:00
Max Kellermann
74cdc0005a decoder/dsf: eliminate temporary buffer
Convert into a second buffer that gets passed to decoder_data()
without copying back to the first buffer.
2014-08-21 17:15:29 +02:00
Max Kellermann
a756cd9565 decoder/dsf: add constant DSF_BLOCK_SIZE 2014-08-21 17:12:43 +02:00
Max Kellermann
ae27c3f4c5 decoder/dsf: use size_t loop variables when the limit is a size_t 2014-08-21 17:09:49 +02:00
Max Kellermann
6d41f36266 decoder/dsf: use memcpy() 2014-08-21 13:09:14 +02:00
Max Kellermann
57cbcdf2ec decoder/dsf: make the "scratch" buffer local
This allows the compiler to discard buffer contents between two
function calls.
2014-08-21 13:05:35 +02:00
Max Kellermann
455fd180b1 Merge branch 'v0.18.x' 2014-08-21 12:52:27 +02:00
Max Kellermann
78abcd7df7 decoer/dsdiff: fix endless loop on malformed file
Same bug as in the previous commit.
2014-08-21 12:48:03 +02:00
Max Kellermann
23dce21647 decoer/dsf: fix endless loop on malformed file
When the data chunk size is not a multiple of the frame size, the last
partial frame lead to an endless loop.  We fix this by checking
chunk_sze>=frame instead of chunk_sze>0.  This way, the partial frame
is simply skipped.
2014-08-21 12:37:22 +02:00
Max Kellermann
e6177c3349 decoder/dsf: remove unused attribute "id3_size" 2014-08-20 09:46:42 +02:00
Max Kellermann
e2adb82e29 decoder/DsdLib: use offset_type instead of uint64_t 2014-08-19 22:39:44 +02:00
Max Kellermann
bb472206de InputStream: move typedef offset_type to Offset.hxx
Reduce header dependencies.
2014-08-19 22:29:52 +02:00
Max Kellermann
d87cf5146e InputStream: CheapSeeking() returns false only for HTTP
Seeking on NFS or SMB is cheap.  Actually, only HTTP streams are
expensive to seek.  This enables a few features on NFS/SMB files, for
example Ogg tags.
2014-08-19 21:39:12 +02:00
Max Kellermann
87eb5cbced InputStream: move code to ExpensiveSeeking() 2014-08-19 21:38:18 +02:00
Max Kellermann
181edf4b53 InputStream: make offset_type unsigned 2014-08-19 21:23:03 +02:00
Max Kellermann
dfa53cb88e InputPlugin: remove typedef offset_type
Has been moved to class InputStream long ago.
2014-08-19 21:22:23 +02:00
Max Kellermann
d079cda174 InputStream: allow GetSize() only if KnownSize() 2014-08-19 21:02:00 +02:00
Max Kellermann
4265e71d6f InputStream: add constant UNKNOWN_SIZE 2014-08-19 21:00:50 +02:00
Max Kellermann
f66a72c66b input/proxy: use KnownSize() 2014-08-19 21:00:32 +02:00
Max Kellermann
9be90bd1c9 decoder/wavpack: add local reference variables 2014-08-19 20:58:08 +02:00
Max Kellermann
106e535577 decoder/sndfile: check InputStream::KnownSize() 2014-08-19 20:57:25 +02:00
Max Kellermann
194be51f05 decoder/pcm: check InputStream::KnownSize() 2014-08-19 20:57:00 +02:00
Max Kellermann
a862e363ea decoder/mpcdec: check InputStream::KnownSize() 2014-08-19 20:55:51 +02:00
Max Kellermann
2e64afca27 decoder/modplug: check InputStream::KnownSize() 2014-08-19 20:53:02 +02:00
Max Kellermann
51cda0be2a decoder/mad: check InputStream::KnownSize() 2014-08-19 20:44:29 +02:00
Max Kellermann
4da3291157 decoder/ffmpeg: check InputStream::KnownSize() 2014-08-19 20:44:29 +02:00
Max Kellermann
52edabf2cb decoder/faad: remove unnecessary cast to size_t 2014-08-19 20:44:29 +02:00
Max Kellermann
43a1a0f3ab decoder/faad: remove size!=0 check
Since we already checked InputStream::KnownSize(), we can assume that
GetSize() returns a valid value, and this check is obsolete.
2014-08-19 20:44:29 +02:00
Max Kellermann
e88524f274 decoder/faad: check InputStream::KnownSize()
Replace the bogus GetSize() check and call GetSize() only when
necessary.
2014-08-19 20:44:29 +02:00
Max Kellermann
7a929fcd27 decoder/faad: call GetSize() only when needed 2014-08-19 20:44:29 +02:00
Max Kellermann
7087fdf6c0 decoder/DsdLib: make variables more local 2014-08-19 20:44:29 +02:00
Max Kellermann
67093a5143 decoder/DsdLib: use fixed-length ID3 buffer
Variable-length arrays are not allowed in C++.
2014-08-19 20:42:40 +02:00
Max Kellermann
3f34016888 decoder/DsdLib: check InputStream::KnownSize() 2014-08-19 20:24:33 +02:00
Max Kellermann
1307633a84 decoder/dsf: check InputStream::KnownSize() 2014-08-19 20:24:09 +02:00
Max Kellermann
1a53f07d80 decoder/dsf: remove unnecessary ID3 offset check
If the offset is out of range, the seek will simply fail.  Not a
problem.
2014-08-19 20:23:36 +02:00
Max Kellermann
672f678ed6 InputStream: use KnownSize() in assertion 2014-08-19 11:59:19 +02:00
Max Kellermann
b924568f79 decoder/audiofile: check InputStream::KnownSize()
The plugin assumes that the size is known, but does not verify it at
runtime.
2014-08-19 11:58:15 +02:00
Max Kellermann
e6e9c21275 input/ffmpeg: use av_strerror()
Generate more detailed error messages.
2014-08-18 20:35:34 +02:00
Max Kellermann
636f5d4a1d {input,decoder}/ffmpeg: move ffmpeg_domain to lib/ffmpeg/Domain.cxx
Eliminate duplicate definition (in input plugin and decoder plugin).
2014-08-18 10:12:37 +02:00
Max Kellermann
41a4b280ee input/ffmpeg: update offset after seeking 2014-08-18 09:52:53 +02:00
Max Kellermann
27139bf41f input/ffmpeg: refactor error code path 2014-08-18 09:52:25 +02:00
Max Kellermann
12ba1957d0 input/ffmpeg: use "auto" 2014-08-18 09:47:28 +02:00
Jurgen Kramer
9b9d189a33 decoder/dsf: Allow up to DSD512. Enable DSD rates based on Fs=48kHz 2014-08-16 18:40:53 +02:00
Jurgen Kramer
7c3af4f56f Report bitrate for DSF and DSDIFF DSD decoders 2014-08-16 18:38:44 +02:00
Max Kellermann
880ce080b7 decoder/dsf: fix indent 2014-08-16 18:38:15 +02:00
Max Kellermann
6e84a03a35 PlayerThread: rename player_create() to StartPlayerThread() 2014-08-16 10:33:19 +02:00
Max Kellermann
a9f6556454 Merge branch 'v0.18.x' 2014-08-16 08:25:10 +02:00
Max Kellermann
2722211ba3 pcm/SoxrResampler: add missing string.h include 2014-08-16 08:25:06 +02:00
François Revol
e2e5cddcaa icu: include strings.h for strcasecmp
Again, POSIX says strcasecmp is not in string.h.
2014-08-16 07:53:08 +02:00
François Revol
40280fa6cf util: Fix header for strcasecmp
According to POSIX and both OSX and Linux manpages,
strcasecmp comes from strings.h, not string.h.

Most OSes also have them available in string.h,
but we just fixed the headers on Haiku and it now
only provides them in strings.h.

We might want to fall back to string.h for other
OSes though...

cf.
http://pubs.opengroup.org/onlinepubs/009695399/functions/strcasecmp.html
http://linux.die.net/man/3/strcasecmp
https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/strcasecmp.3.html
2014-08-16 06:51:13 +02:00
Max Kellermann
8b7718fbdc encoder/shine: require libshine 3.1, adapt to new API
The "written" argument to shine_encode_buffer() and shine_flush() was
changed from "long" to "int", which breaks API and ABI compatibility.
This is a big deal, and it doesn't seem worthwile to keep support for
the (broken) 3.0 release.
2014-08-13 18:49:44 +02:00
Max Kellermann
fe9299ceff decoder/ffmpeg: use avcodec_descriptor_get() to determine codec name
In version 11, both ffmpeg and libav deprecate
AVCodecContext::codec_name.  The function avcodec_descriptor_get() has
been introduced long ago.
2014-08-13 18:40:39 +02:00
Max Kellermann
b44957ad91 PcmExport: add missing <iterator> include
For the range-based loop on a ConstBuffer object.
2014-08-13 13:00:37 +02:00
Max Kellermann
a049f972ec test/test_rewind: add missing stdlib.h include
For EXIT_SUCCESS.
2014-08-13 12:55:29 +02:00
Max Kellermann
069895d26b PcmDsdUsb: use class ConstBuffer 2014-08-12 22:21:24 +02:00
Max Kellermann
0e756e4377 PcmExport: use class ConstBuffer 2014-08-12 22:19:53 +02:00
Max Kellermann
ee7282ce0d test/test_pcm: add PcmExport unit test 2014-08-12 22:05:38 +02:00
Max Kellermann
d026367334 Merge branch 'v0.18.x' 2014-08-12 16:54:32 +02:00
Max Kellermann
7244dc4511 Filter: FilterPCM() returns ConstBuffer
API simplification.  We can now avoid abusing a "size_t*" as
additional return value.
2014-08-12 16:40:51 +02:00
Max Kellermann
56f61a6d59 PcmConvert: Convert() returns ConstBuffer 2014-08-12 16:36:07 +02:00
Max Kellermann
4d5f610029 Filter: update API documentation 2014-08-12 16:05:37 +02:00
Max Kellermann
c94b4466d5 MusicChunk: rename struct to MusicChunk 2014-08-12 15:56:41 +02:00
Max Kellermann
61f9e79ec9 MusicChunk: update API documentation 2014-08-12 15:56:11 +02:00
Max Kellermann
cf797657ed AllCommands: close connection after syntax error
Stop HTTP clients from exploiting MPD via forged POST requests.
2014-08-12 15:33:45 +02:00
Max Kellermann
c597538b40 util/HugeAllocator: implement on Windows 2014-08-11 23:06:45 +02:00
Max Kellermann
43f964e28d db/simple: check for I/O errors in Load() 2014-08-11 22:54:46 +02:00
Max Kellermann
8283f23651 fs/io/TextFile: add method Check() 2014-08-11 22:53:48 +02:00
Max Kellermann
7cc25f91ff fs/io/Reader: add "nonnull" attribute 2014-08-11 22:49:08 +02:00
Max Kellermann
5d2506e697 SongFilter: new filter "modified-since" 2014-08-11 22:38:58 +02:00
Max Kellermann
14908b7f28 doc/protocol: reformat the "find" types 2014-08-11 22:38:58 +02:00
Max Kellermann
2e122e1509 db/simple: compress the database file using gzip 2014-08-11 21:48:25 +02:00
Max Kellermann
486b5b6bfc fs/io/TextFile: use AutoGunzipReader
Several MPD subsystems can now read gzipped files; for example, the
database file can be gzipped.
2014-08-11 21:48:25 +02:00
Max Kellermann
88a2f128ec fs/io/AutoGunzipReader: new class 2014-08-11 21:48:25 +02:00
Max Kellermann
45c139cfb3 fs/io/PeekReader: new utility class 2014-08-11 21:48:25 +02:00
Max Kellermann
3a111e5d74 fs/io/GzipOutputStream,GunzipReader: move zlib_domain to src/lib/zlib/Domain.cxx 2014-08-11 21:48:25 +02:00
Max Kellermann
fc0c5e7359 configure.ac: fix typo, remove spaces 2014-08-11 21:20:27 +02:00
Max Kellermann
2ccfb71d12 util/CharUtil: add ToLowerASCII() 2014-08-11 18:42:05 +02:00
Max Kellermann
e8a5a9b1e8 Merge branch 'mp4v2' of github.com:ekroth/mpd 2014-08-09 00:10:04 +02:00
Andrée Ekroth
ec3568bd97 decoder/Mp4v2: fix crash with undefined error
When no track is found the error is now properly set.
Previously the calling function tried to log an undefined
error, which resulted in a crash. MPD falls back to
ffmpeg for unsupported tracks, such as ALAC.

This should fix issue 4051.
2014-08-08 23:24:26 +02:00
Max Kellermann
a67a881715 input/GunzipInputStream: new class 2014-08-08 20:11:29 +02:00
Max Kellermann
7a048f004d Merge branch 'id-3919' of git://github.com/ekroth/mpd 2014-08-07 22:52:46 +02:00
Andrée Ekroth
330b6a0482 decoder/Mp4v2: add MP4v2 decoder plugin
This plugin uses the MP4v2 library to play mp4/m4a files.
It is limited to file_decode.
2014-08-07 21:01:38 +02:00
Max Kellermann
aa2e4d92e0 fs/io/BufferedReader: new class to replace class TextFile
The new class is pluggable, to prepare for gzipped database files.

For now, the TextFile class remains, and will be refactored away
later.
2014-08-07 19:38:25 +02:00
Max Kellermann
0ea66a1275 fs/io/Reader: new interface 2014-08-07 19:38:25 +02:00
Max Kellermann
aafff8fd5c fs/output, fs/TextFile: move to fs/io/ 2014-08-07 19:38:25 +02:00
Max Kellermann
5ac2a69940 input/TextInputStream: move ReadBufferedLine() to util/TextFile.hxx 2014-08-07 19:38:25 +02:00
Max Kellermann
8278a12af9 Makefile.am: link libfs.a before libsystem.a
libfs.a depends on libsystem.a.
2014-08-07 19:38:25 +02:00
Max Kellermann
e88dd9b08b util/DynamicFifoBuffer: make GetCapacity() and Clear() public 2014-08-07 19:21:09 +02:00
Max Kellermann
bbea6564fc fs/output/FileOutputStream: use open_cloexec()
Support operating systems that don't have O_CLOEXEC.
2014-08-07 18:16:11 +02:00
Max Kellermann
1ca8d7ad45 TextInputStream: don't strip
Let the caller decide whether to strip.  Only remove \n and \r
(end-of-line markers).
2014-08-07 16:45:43 +02:00
Max Kellermann
67958f7fa7 util/{Static,Foreign}FifoBuffer: lazy shift
Reduce the number of unnecessary memmove() calls.
2014-08-07 16:11:00 +02:00
Max Kellermann
ab9c527274 util/StaticFifoBuffer: fix indent 2014-08-07 16:08:55 +02:00
Max Kellermann
36ff991960 TextInputStream: move code to ReadBufferedLine()
Look at the buffer first, before trying to read from the file.  This
reduces overhead because we don't refill the buffer after every line.
2014-08-07 16:08:02 +02:00
Max Kellermann
59d38f876a util/StringUtil: add StripRight() overload with "end" argument 2014-08-07 16:08:02 +02:00
Max Kellermann
5c5c6a965c LogBackend: use StripRight()
Eliminate duplicate code.
2014-08-07 16:08:02 +02:00
Max Kellermann
74aafe6a10 util/StringUtil: use IsWhitespaceOrNull() in StripRight()
The null byte is whitespace, too.
2014-08-07 16:08:02 +02:00
Max Kellermann
f860a2fbd6 util/StringUtil: move code to StripRight() 2014-08-07 16:08:02 +02:00
Max Kellermann
87bcf739ee util/StringUtil: rename strchug_fast() to StripLeft() 2014-08-07 16:08:02 +02:00
Max Kellermann
db6db51742 util/CharUtil: add IsWhitespaceFast() 2014-08-07 16:08:02 +02:00
Max Kellermann
981be7956b util/CharUtil: make IsWhitespace*() "constexpr" 2014-08-07 16:08:02 +02:00
Max Kellermann
8c10aa575c util/CharUtil: fix indent 2014-08-07 16:08:02 +02:00
Max Kellermann
17b316b94b fs/StandardDirectory: pass writable string to ParseConfigLine()
Eliminate the std::string overhead.
2014-08-07 16:07:52 +02:00
Max Kellermann
8921b4f9d1 event/BufferedSocket: fix inversed buffer check
This was broken by commit 84d20d9e, which deleted the "!" from the
check.
2014-08-07 16:07:48 +02:00
Max Kellermann
c3f111a56c event/BufferedSocket: fix inversed buffer check
This was broken by commit 84d20d9e, which deleted the "!" from the
check.
2014-08-07 16:03:44 +02:00
Max Kellermann
cf16d81fa4 util/ForeignFifoBuffer: add method Swap() 2014-08-07 09:02:24 +02:00
Max Kellermann
2beb763b4f util/ForeignFifoBuffer: add method MoveFrom() 2014-08-07 08:53:02 +02:00
Max Kellermann
69ae879c58 input/TextInputStream: return char*
Revert to the old API before commit e9e55b08, removing unnecessary
bloat.
2014-08-07 00:06:02 +02:00
Max Kellermann
08fee9a284 util/ForeignFifoBuffer: add method GetAvailable() 2014-08-06 22:55:59 +02:00
Max Kellermann
f89da17827 util/DynamicFifoBuffer: move code to new base class ForeignFifoBuffer 2014-08-06 17:39:07 +02:00
Max Kellermann
ea26da0be7 util/FifoBuffer: rename to StaticFifoBuffer 2014-08-06 17:29:05 +02:00
Max Kellermann
1f3d3970f6 db/update/InotifySource: remove FifoBuffer
Eliminate support for partial reads.  The Linux kernel will never
return partial results, so this buffering was unnecessary.
2014-08-06 17:20:03 +02:00
Max Kellermann
c9a71a7176 fs/GzipOutputStream: new class wrapping zlib 2014-08-06 16:35:10 +02:00
Max Kellermann
7ed8833fd5 Makefile.am: add variable FS_LIBS 2014-08-06 16:35:10 +02:00
François Revol
250318329f Makefile.am: fix dependencies for win32
It happened to me when doing the Haiku port, src/mpd failed to
be relinked properly when editing source files, and likely also
happens on win32, although I didn't try this change.

When building for windows, src_mpd_DEPENDENCIES is overriden.

Automake then disables the default version which contains all
the static libraries. In Makefile.in:
@HAVE_WINDOWS_FALSE@src_mpd_DEPENDENCIES = libmpd.a \

Instead we use EXTRA_src_mpd_DEPENDENCIES which is meant for this.
2014-08-02 08:48:44 +02:00
Max Kellermann
14c538c9c7 Win32Main: move to win32/ 2014-08-02 08:48:30 +02:00
Max Kellermann
abe4c57663 configure.ac: prepare for 0.18.13 2014-08-02 08:45:44 +02:00
Max Kellermann
9fb351a139 *Save, *State: use the OutputStream API instead of FILE* 2014-07-30 22:17:01 +02:00
Max Kellermann
0d0ccacdf3 fs/OutputStream: new infrastructure for writing to files 2014-07-30 22:12:02 +02:00
Max Kellermann
c8858f85d8 util/Error: add method FormatLastError() 2014-07-30 22:10:31 +02:00
Max Kellermann
d1bc46ffad util/Error: add SetLastError() overload with "DWORD code" parameter 2014-07-30 22:08:26 +02:00
Max Kellermann
32e5848f34 util/Error: add "printf" attributes 2014-07-30 22:02:46 +02:00
Max Kellermann
be36c0769a TagId3: fix printf string parameter 2014-07-30 22:02:46 +02:00
Max Kellermann
f9e63dfd65 util/DynamicFifoBuffer: fix typo in API documentation 2014-07-30 20:53:09 +02:00
Max Kellermann
fa05dac5ae StateFile: use nullptr instead of NULL 2014-07-30 18:45:14 +02:00
Max Kellermann
430dd3ae05 encoder/opus: use nullptr instead of NULL 2014-07-30 18:45:00 +02:00
Max Kellermann
664fc76ac7 system/Resolver: use nullptr instead of NULL 2014-07-30 18:44:40 +02:00
Max Kellermann
37d6cc07a7 pcm: use nullptr instead of NULL 2014-07-30 18:44:20 +02:00
Max Kellermann
d79b6cd8dc playlist/extm3u: use nullptr instead of NULL 2014-07-30 18:44:03 +02:00
Max Kellermann
d6510f9578 android build 5 2014-07-30 11:18:33 +02:00
Max Kellermann
59e8302c9d Makefile.am: add missing backslash
Fixes breakage by commit 1a619522
2014-07-30 11:18:33 +02:00
Max Kellermann
3422bd9b94 Merge tag 'v0.18.12' 2014-07-30 10:40:40 +02:00
Max Kellermann
a3f3c7ba24 release v0.18.12 2014-07-30 10:30:17 +02:00
Max Kellermann
82ecebb393 Main: don't require mpd.conf on Android
Don't fail to start if mpd.conf does not exist; just use default
values.
2014-07-30 10:22:22 +02:00
Max Kellermann
6ba0b029e6 android/Main: indicate when the native code has quit
Let the user know that MPD has failed.  Not the best thing to do, but
better than pretending it still runs.
2014-07-30 10:17:31 +02:00
Max Kellermann
604c9dacdb android/Loader: fix indent 2014-07-30 10:17:31 +02:00
Max Kellermann
1a619522ee Makefile.am: *.apk depends on android/src/*.java
Invoke "ant" when a Java source is modified.
2014-07-30 10:17:31 +02:00
Max Kellermann
88615fbff1 Makefile.am: move duplicate specification to APK_DEPS 2014-07-30 10:15:37 +02:00
Max Kellermann
d4f8f67173 Makefile.am: release .apk depends on icon
Missing piece from commit e0ca4347
2014-07-30 10:14:26 +02:00
Max Kellermann
174a0a2efc Makefile.am: new zipalign path 2014-07-30 09:45:03 +02:00
Max Kellermann
12b5494906 db/proxy: implement Update() 2014-07-29 23:35:09 +02:00
Max Kellermann
aa0f06d6b7 db/Interface: add virtual method Update()
For database plugins that don't use the UpdateService.
2014-07-29 23:31:27 +02:00
Max Kellermann
0c47685e02 OtherCommands: split handle_update() 2014-07-29 23:29:57 +02:00
Max Kellermann
e0ca4347be Android: generate icon from SVG 2014-07-14 19:05:01 +02:00
Qball Cow
e65d9408ee import MPD SVG icon 2014-07-14 19:04:46 +02:00
Max Kellermann
d8558a3af3 util/Cast: add "const" overload 2014-07-14 17:08:57 +02:00
Max Kellermann
72eedb1c98 util/Cast: add missing include 2014-07-14 17:08:41 +02:00
Max Kellermann
3c5cf9500d util/Cast: fix indent 2014-07-14 16:44:43 +02:00
Max Kellermann
7a1f3177c9 util/Cast: reimplement as template without macro 2014-07-14 16:24:07 +02:00
Max Kellermann
f8da8b0261 util/Cast: add const overloads 2014-07-14 16:02:02 +02:00
Max Kellermann
393cb7fd7d util/Cast: suppress "unused function" warning by using "inline" 2014-07-14 15:58:12 +02:00
Max Kellermann
e74e1256d4 util/Cast: fix indent 2014-07-14 15:57:48 +02:00
Max Kellermann
96abd70c13 decoder/dsdiff: move artist/title/id3 offsets out of DsdiffMetaData
They are only used inside dsdiff_read_metadata_extra().
2014-07-12 20:51:25 +02:00
Max Kellermann
1f9d9c3176 Merge branch 'v0.18.x' 2014-07-12 20:51:22 +02:00
Max Kellermann
94efeb2845 decoder/dsdiff: simplify dsdlib_skip() call 2014-07-12 20:51:00 +02:00
Max Kellermann
a73834436f decoder/dsdiff: simplify loop condition, merge branches 2014-07-12 20:46:24 +02:00
Max Kellermann
85f4aeca05 decoder/dsdiff: ignore garbage null byte at end of file
Failure to read another chunk header is not fatal.  Continue to read
metadata.
2014-07-12 20:41:26 +02:00
Max Kellermann
7db84a961a decoder/dsdiff: fix metadata parser bug (uninitialized variables) 2014-07-12 20:41:26 +02:00
Max Kellermann
74e95e88d8 PlaylistSong: always merge tags and LastModified 2014-07-12 19:41:04 +02:00
Max Kellermann
80d9baa9e8 QueueSave: use the long format to save partial songs
Previously, only streams were saved with range and tags, but this is
necessary for all "partial" songs (e.g. CUE tracks).
2014-07-12 19:36:39 +02:00
Max Kellermann
751995ab95 QueueCommands: new command "rangeid"
Manipulates the playback range of a queued song.
2014-07-12 18:55:41 +02:00
Max Kellermann
5ca6e2910a PlaylistSong, CueParser: don't override Tag::time
Now that Song::GetDuration() is used (which considers start_ms and
end_ms), we don't need to override the Tag's duration value.
2014-07-12 18:54:20 +02:00
Max Kellermann
071d05465a SongPrint: use DetachedSong::GetDuration()
Fixes the bogus duration of the last track in a CUE sheet.
2014-07-12 18:41:15 +02:00
Max Kellermann
11a9536271 TagPrint: split tag_print()
Add one method that prints only the tag values, but not the song
duration.
2014-07-12 17:42:38 +02:00
Max Kellermann
41a7203c28 Tag: add class const_iterator and methods begin(), end()
Enables using range-based "for".
2014-07-12 17:22:39 +02:00
Max Kellermann
543a58bb87 DecoderBuffer: implement _skip() using decoder_skip() 2014-07-12 02:26:38 +02:00
Max Kellermann
b2b95cad20 DecoderBuffer: add method _need()
Move code from the FAAD decoder plugin.
2014-07-12 02:23:48 +02:00
Max Kellermann
eabec967ec DecoderBuffer: remove unused method _is_full() 2014-07-12 02:23:36 +02:00
Max Kellermann
e42b152037 decoder/faad: eliminate the adts_find_frame() loop
This loop is completely unnecessary.  We just need to find the first
ADTS frame and feed it into NeAACDecInit().
2014-07-12 01:51:39 +02:00
Max Kellermann
da599e3f1a decoder/faad: split faad_stream_decode()
Eliminate duplicate cleanup code.
2014-07-12 01:47:07 +02:00
Max Kellermann
4c7b0b935b DecoderBuffer: remove unused method _is_empty() 2014-07-12 01:28:37 +02:00
Max Kellermann
c400876df1 Merge branch 'v0.18.x' 2014-07-12 01:27:18 +02:00
Max Kellermann
a960e2ef48 decoder/faad: estimate song duration for remote files
Previously, MPD tried to slurp the whole song file, count the number
of frames and calculate the song duration from that.  That however is
extremely expensive for remote files, and will delay playback for a
long time.  Workaround: check only the first 128 frames and try to
extrapolate from here.  Fixes Mantis ticket 0004035.
2014-07-12 00:37:00 +02:00
Max Kellermann
4fe272a7fb DecoderBuffer: add method _available() 2014-07-12 00:35:32 +02:00
Max Kellermann
a7d9f248ea DecoderBuffer: add method _get_stream() 2014-07-12 00:23:22 +02:00
Max Kellermann
06aa689383 decoder/faad: bail out early if sample rate is invalid 2014-07-12 00:23:11 +02:00
Max Kellermann
835b0c44cd decoder/faad: use adts_check_frame() in faad_song_duration()
Eliminate more duplicate code.
2014-07-12 00:18:02 +02:00
Max Kellermann
54b6f8a4ae decoder/faad: test "seekable" after ADTS frame check
Don't bother to check for ADIF just because the stream is not
seekable.
2014-07-12 00:17:51 +02:00
Max Kellermann
18787ebe8f decoder/faad: move code to faad_decoder_new()
Merge some duplicate code.
2014-07-12 00:17:43 +02:00
Max Kellermann
47e8fcf37e decoder/faad: remove unnecessary read
Eliminate some overhead when the caller doesn't need the buffer.
2014-07-12 00:17:30 +02:00
Max Kellermann
5958b78459 DecoderBuffer: add "pure" attributes 2014-07-12 00:16:41 +02:00
Max Kellermann
9d9697b366 DecoderBuffer: add method _clear() 2014-07-12 00:15:35 +02:00
Max Kellermann
6585e18571 decoder/faad: check sample_rate, not frames_per_second
Checking the integer is faster, easier and more reliable.
2014-07-11 23:12:08 +02:00
Max Kellermann
6f1b4292f0 decoder/faad: make variables more local 2014-07-11 22:52:31 +02:00
Max Kellermann
ef9ef03b1f decoder/faad: use MAX_CHANNELS
.. instead of declaring a new constant.
2014-07-11 22:40:28 +02:00
Max Kellermann
c4bea3dfe4 decoder/sndfile: implement scan_stream() instead of scan_file() 2014-07-11 22:09:35 +02:00
Max Kellermann
eaa9a1e33b decoder/sndfile: make variables more local 2014-07-11 22:03:26 +02:00
Max Kellermann
3e19298c9e decoder/sndfile: support more tag types 2014-07-11 22:03:13 +02:00
Max Kellermann
2a96ce97ee decoder/sndfile: add str_type to TagType table 2014-07-11 21:57:41 +02:00
Max Kellermann
8cfe901391 decoder/sndfile: move code to sndfile_handle_tag() 2014-07-11 21:56:02 +02:00
Max Kellermann
30f1ee7a1f decoder/sndfile: log libsndfile version on startup 2014-07-11 21:53:03 +02:00
Max Kellermann
46ff830daa PlaylistEdit: fix typo in code comment 2014-07-11 21:37:06 +02:00
Max Kellermann
828cd6fd0b Merge branch 'v0.18.x' 2014-07-11 21:33:50 +02:00
Max Kellermann
ecb67a1ed1 decoder/sndfile: use decoder_read_full()
Replaces the loop in sndfile_vio_read(), eliminating duplicate and
fragile code.
2014-07-11 21:18:44 +02:00
Max Kellermann
0ef843f138 decoder/sndfile: use decoder_read()
.. instead of InputStream::LockRead(). The former is cancellable.
2014-07-11 21:18:44 +02:00
Max Kellermann
eb79d83051 decoder/sndfile: log seek errors 2014-07-11 21:18:44 +02:00
Max Kellermann
ca1a11493d decoder/audiofile: log seek errors 2014-07-11 21:18:44 +02:00
Max Kellermann
69bb086ba5 decoder/audiofile: fix typo in comment 2014-07-11 21:18:44 +02:00
Max Kellermann
11a5ee821b PlaylistEdit: postpone UpdateQueuedSong() when adding multiple songs
Implement a "bulk" edit mode that postpones both UpdateQueuedSong()
and OnModified().  This way, the playlist version gets incremented
only once.  More importantly: when adding multiple songs to a queue
that consists of only one song, the first song that got added will
always be played next.  By postponing this choice, all newly added
songs get a chance to become the next song.  Fixes the second (and
last) part of Mantis ticket 0004005.
2014-07-11 20:22:35 +02:00
Max Kellermann
a8a85143f6 QueueCommands: make "result" more local 2014-07-11 20:22:35 +02:00
Max Kellermann
e2cc328eef Playlist: randomize next song when enabling "random" mode while not playing
Don't restore the current song after shufflung when MPD is stopped
(but still remembers the current song internally).  Fixes the first
part of Mantis ticket 0004005.
2014-07-11 19:41:39 +02:00
Max Kellermann
344d10a8e3 PlaylistControl: update code comment 2014-07-11 19:29:25 +02:00
Max Kellermann
681643ea9e input/curl: options "verify_peer" and "verify_host" 2014-07-11 16:39:42 +02:00
Max Kellermann
fa947e02ca test/FakeDecoderAPI: dump MixRamp data 2014-07-11 08:54:29 +02:00
Mantas Mikulėnas
cd289843f7 fs/StandardDirectory: look for cache dir in environment, not user-dirs
The XDG cache directory is part of the "base directories" spec like
$XDG_CONFIG_HOME, not "user directories".
2014-07-11 08:09:19 +02:00
Max Kellermann
b123392592 input/async: more API documentation 2014-07-10 10:33:43 +02:00
Max Kellermann
ccbb5c3e01 decoder/audiofile: log libaudiofile errors 2014-07-10 09:37:43 +02:00
Max Kellermann
49b63e084f decoder/audiofile: make variables more local 2014-07-10 09:26:12 +02:00
Max Kellermann
107321e385 decoder/audiofile: implement scan_stream() instead of scan_file() 2014-07-10 09:23:56 +02:00
Max Kellermann
1d214b4aed decoder/audiofile: use audiofile_get_duration() in _stream_decode() 2014-07-10 08:35:24 +02:00
Max Kellermann
2e1347aba4 decoder/audiofile: split audiofile_get_duration() 2014-07-10 08:31:41 +02:00
Max Kellermann
9ddb5931fb decoder/audiofile: remove unused Error variable 2014-07-09 20:03:11 +02:00
Max Kellermann
913064d6cc Merge branch 'v0.18.x' 2014-07-09 20:02:07 +02:00
Gustavo Zacarias
fb45b8a5c9 playlist/plugins/DespotifyPlaylistPlugin: fix build failure due to missing stdio.h include
Signed-off-by: Gustavo Zacarias <gustavo@zacarias.com.ar>
2014-07-09 19:54:35 +02:00
Gustavo Zacarias
f5c9056430 output/plugins/httpd/HttpdClient: fix build failure due to missing stdio.h include
Signed-off-by: Gustavo Zacarias <gustavo@zacarias.com.ar>
2014-07-09 19:54:35 +02:00
Gustavo Zacarias
0e39b59700 decoder/plugins/FlacIOHandle: fix build failure due to missing stdio.h include
Signed-off-by: Gustavo Zacarias <gustavo@zacarias.com.ar>
2014-07-09 19:54:35 +02:00
Max Kellermann
552af5455e decoder/dsdlib: use decoder_skip()
Reduce duplicate code.
2014-07-09 19:42:36 +02:00
Max Kellermann
8759bc1b41 decoder/dsdlib: pass unsigned offsets to dsdlib_skip*() 2014-07-09 19:39:10 +02:00
Joff
09384df32c decoder/dsd: use decoder_read_full() where appropriate
Addresses Mantis ticket 0004015.

[mk: use decoder_read_full() only when needed, and a few formal
changes]
2014-07-09 19:18:36 +02:00
Max Kellermann
20538516b9 decoder/audiofile: use decoder_read_full()
Works around WAV stream playback bug, because libaudiofile does not
like partial reads (Mantis 0004028).
2014-07-09 19:05:20 +02:00
Max Kellermann
0759421d11 DecoderAPI: add function decoder_read_full()
Move code from the "mad" plugin.
2014-07-09 19:03:58 +02:00
Max Kellermann
bf7417981f DecoderAPI: add function decoder_skip()
Move code from the "mad" plugin.
2014-07-09 19:03:31 +02:00
Max Kellermann
dba41e2e4a test: merge duplicate code to FakeDecoderAPI.cxx 2014-07-09 19:01:38 +02:00
Max Kellermann
bc6472bb9e decoder/audiofile: use decoder_read()
.. instead of InputStream::LockRead(). The former is cancellable.
2014-07-09 18:57:50 +02:00
Gustavo Zacarias
d4bd947bf5 playlist/PlsPlaylistPlugin: fix build failure due to missing stdio.h include
Signed-off-by: Gustavo Zacarias <gustavo@zacarias.com.ar>
2014-07-09 17:41:31 +02:00
Gustavo Zacarias
d8e8eabf60 output/HttpdClient: fix build failure due to missing stdio.h include
Signed-off-by: Gustavo Zacarias <gustavo@zacarias.com.ar>
2014-07-09 17:41:31 +02:00
Gustavo Zacarias
a70443af31 decoder/OpusDecoderPlugin: fix build failure due to missing stdio.h include
Signed-off-by: Gustavo Zacarias <gustavo@zacarias.com.ar>
2014-07-09 17:41:31 +02:00
Gustavo Zacarias
3f221e2edb decoder/AudiofileDecoderPlugin: fix build failure due to missing stdio.h include
Signed-off-by: Gustavo Zacarias <gustavo@zacarias.com.ar>
2014-07-09 17:41:31 +02:00
Max Kellermann
56504534d8 thread/{Mutex,Cond}: relicense to BSD-2 2014-07-02 20:09:39 +02:00
Max Kellermann
80a45c91f9 thread/GLib{Mutex,Cond}: remove obsolete classes 2014-07-02 20:09:39 +02:00
Max Kellermann
3f695fdfaf lib/nfs/Connection: include poll.h 2014-06-30 10:22:08 +02:00
Christoph Tieben
88433bca22 Added Comment/Description to decoder/plugins/XiphTags.cxx 2014-06-27 21:14:55 +02:00
Christoph Tieben
34689eb2d2 decoder: vorbis, flac, opus: honor DESCRIPTION= tag in Xiph-based files as a comment to the song
(see https://www.xiph.org/vorbis/doc/v-comment.html for Details)
2014-06-27 21:14:17 +02:00
Max Kellermann
211aea1441 util/ConstBuffer: add method skip_front() 2014-06-26 22:25:03 +02:00
Max Kellermann
74a46788cd util/ConstBuffer: wrap assert() in NDEBUG check
Fixes build failure because assert.h was not included.
2014-06-26 13:31:48 +02:00
Max Kellermann
7213c26798 util/ConstBuffer: add method Contains() 2014-06-23 22:30:01 +02:00
Max Kellermann
fa1fb47d75 Merge branch 'v0.18.x' 2014-06-23 10:13:50 +02:00
Max Kellermann
848ed14788 db/proxy: fall back to recursive walk on old libmpdclient/MPD
Error message was 'too few arguments for "find"' because the "base"
constraint was not supported, and no other constraints remained.
2014-06-23 09:18:11 +02:00
Max Kellermann
4c8a5dfb05 db/proxy: use mpd_song_get_{start,end}() only with libmpdclient >= 2.3 2014-06-23 09:17:35 +02:00
Max Kellermann
4f61ba766d configure.ac: prepare for 0.18.12 2014-06-23 09:14:35 +02:00
Max Kellermann
b9eeb6e6eb db/proxy: use mpd_song_get_{start,end}() only with libmpdclient >= 2.3 2014-06-23 08:57:51 +02:00
Max Kellermann
d5fa2af353 input/async: use IsEOF() instead of !open for "ready" check
Checking "!open" did not work with the NFS plugin because that plugin
does not close the file automatically, unlike CURL.
2014-06-21 14:13:31 +02:00
Max Kellermann
a877926f08 Revert "AsyncInputStream: fix assertion failure in AppendToBuffer()"
This reverts commit 966c4244cb.

The commit was bad, because the bug was really in
NfsInputStream::DoRead(); see previous commit.
2014-06-21 14:07:15 +02:00
Max Kellermann
3e4e6f7ced input/nfs: never read more than space available in buffer
Avoids off-by-one bug and obsoletes the bug fix in commit 966c4244
2014-06-21 14:06:31 +02:00
Max Kellermann
936eb43c0e db/proxy: initialize LightSong::real_uri
Fixes potential crash.
2014-06-21 12:37:23 +02:00
Max Kellermann
bb66cfa780 android build 4 2014-06-21 12:21:19 +02:00
Max Kellermann
1d626cb6ac android/build.py: add Boost 2014-06-21 12:06:58 +02:00
Max Kellermann
580346f4a7 android/build.py: upgrade CURL to 7.37.0 2014-06-21 12:06:58 +02:00
Max Kellermann
0fbcf64108 android/build.py: upgrade ffmpeg to 2.2.3 2014-06-21 11:38:43 +02:00
Max Kellermann
267faa3851 android/build.py: upgrade libogg to 1.3.2 2014-06-21 11:36:31 +02:00
Max Kellermann
fe50481f7b android/build.py: remove unused parameter from class FfmpegProject 2014-06-21 11:04:54 +02:00
nanotech
759616abd4 Makefile.am: use ICU_CFLAGS 2014-06-17 10:38:50 +02:00
Max Kellermann
eb8fd07900 lib/nfs/Manager: gcc 4.7 compatibility hack
std::map::emplace() is only available from gcc 4.8 on.
2014-06-17 10:35:34 +02:00
Max Kellermann
c99559dbe9 input/nfs: use the asynchronous libnfs API
More robust and cancellable.
2014-06-17 03:21:25 +02:00
Max Kellermann
966c4244cb AsyncInputStream: fix assertion failure in AppendToBuffer() 2014-06-17 03:21:11 +02:00
Max Kellermann
81283f8bcb AsyncInputStream: reset "paused" when seeking
May cause assertion failure.
2014-06-17 03:20:49 +02:00
Max Kellermann
8b84e5b3f9 input/curl: hold mutex while writing to postponed_error 2014-06-17 02:32:17 +02:00
Max Kellermann
e1d5ddb478 input/AsyncInputStream: add method IsBufferFull() 2014-06-17 02:32:17 +02:00
Max Kellermann
2da0322329 command: make argc unsigned 2014-06-16 19:50:34 +02:00
Max Kellermann
fefb35c782 Directory: eliminate attribute "have_stat"
Check for 0 in "device" and "inode" instead.
2014-06-16 19:46:35 +02:00
Max Kellermann
b2433a664c TagPool: move code to tag_value_slot_p() 2014-06-16 19:26:26 +02:00
Max Kellermann
adad4279f3 TagPool: convert macro to constexpr 2014-06-16 19:18:10 +02:00
Max Kellermann
3ca0a39a35 db/simple: use class boost::intrusive::list
Remove the C list_head library and use type-safe C++ instead.
2014-06-16 18:39:16 +02:00
Max Kellermann
52594e64d0 configure.ac: disable exceptions only with Boost 1.54 or newer
See https://svn.boost.org/trac/boost/ticket/7849
2014-06-16 18:39:16 +02:00
Max Kellermann
3364c1b893 ClientList: use class boost::intrusive::list
Eliminate extra allocations for the std::list node instances.
2014-06-11 09:27:17 +02:00
Max Kellermann
0801b3f495 configure.ac: check for Boost 2014-06-11 09:27:17 +02:00
Max Kellermann
657f00fe36 m4: update to pkg-config 0.28 2014-06-11 09:27:17 +02:00
Max Kellermann
044c81b644 m4: update to autoconf-archive 20140228 2014-06-11 08:08:33 +02:00
Max Kellermann
507d8fdc6f ClientList: add typedef List 2014-06-10 23:21:09 +02:00
Max Kellermann
31e29e62f4 zeroconf/Avahi: call dbus_shutdown() during shutdown
Make valgrind happy.
2014-06-10 23:21:09 +02:00
Max Kellermann
dfcb572985 Main: delete the Storage instance on shutdown 2014-06-10 23:21:09 +02:00
Max Kellermann
1d324176d1 lib/icu/Init: call u_init() and u_cleanup()
Make valgrind happy.
2014-06-10 23:21:09 +02:00
Max Kellermann
37b3190752 lib/icu: add IcuInit(), IcuFinish() 2014-06-10 23:21:09 +02:00
Max Kellermann
d51265d48f valgrind.suppressions: more library suppressions 2014-06-10 23:21:09 +02:00
Max Kellermann
dc14ac7a8f thread/Util: relicense to BSD-2 2014-05-31 12:11:53 +02:00
Max Kellermann
fb52a24da3 input/async: add offset/size comparison to IsEOF() 2014-05-24 15:19:22 +02:00
Max Kellermann
fbafb19657 input/curl: move code to AsyncInputStream
New base class for other InputStream implementations that run in the
I/O thread.
2014-05-24 14:36:28 +02:00
Max Kellermann
6c4438d8a9 input/curl: call SetReady() only if not yet ready
Fixes assertion failure.
2014-05-24 14:36:25 +02:00
Max Kellermann
be00737ced input/curl: include cleanup 2014-05-24 12:43:48 +02:00
Max Kellermann
07b93dcf80 InputStream: make Seek() always absolute
Remove the "whence" parameter that is not actually necessary, and only
complicates the InputStream implementations.
2014-05-22 13:52:00 +02:00
Max Kellermann
374c6a27db decoder/vorbis: make VorbisInputStream::input_stream a reference 2014-05-22 13:52:00 +02:00
Max Kellermann
36c9e95969 decoder/vorbis: add VorbisInputStream constructor 2014-05-22 13:52:00 +02:00
Max Kellermann
a3142ee4e6 decoder/vorbis: rename struct vorbis_input_stream to VorbisInputStream 2014-05-22 13:52:00 +02:00
Max Kellermann
437caeb90f decoder/vorbis: add "restrict" to pointers in vorbis_interleave()
Allows more compiler optimizations.
2014-05-22 13:52:00 +02:00
Max Kellermann
af49cace8d decoder/vorbis: log libvorbis version on startup 2014-05-22 13:52:00 +02:00
Max Kellermann
13b78d0d89 decoder/wavpack: move code to WavpackInput::ReadBytes() 2014-05-22 12:54:56 +02:00
Max Kellermann
65c135b451 decoder/wavpack: convert WavpackInput attributes to references 2014-05-22 12:52:33 +02:00
Max Kellermann
ec162f265f decoder/wavpack: move wavpack_input_init into struct WavpackInput 2014-05-22 12:47:20 +02:00
Max Kellermann
ba99696771 decoder/wavpack: wavpack_open_wvc() returns WavpackInput* 2014-05-22 12:36:55 +02:00
Max Kellermann
4eeea640f4 DecoderAPI: add function decoder_open_uri()
Move and refactor code from the Wavpack decoder plugin.
2014-05-22 12:35:20 +02:00
Max Kellermann
cc6f1020d0 test/run_decoder: merge code into FakeDecoderAPI.cxx
Eliminate duplicate code.
2014-05-22 12:35:20 +02:00
Max Kellermann
316ddc2382 test/run_decoder: auto-initialize struct Decoder 2014-05-22 12:35:20 +02:00
Max Kellermann
3452625fac Makefile.am: link test_rewind with GLib 2014-05-22 12:35:20 +02:00
Max Kellermann
426e0105a6 test/run_decoder: move the "uri" attribute out of struct Decoder 2014-05-22 11:17:11 +02:00
Max Kellermann
18f39aa012 test/run_decoder: move the DecoderPlugin pointer out of struct Decoder 2014-05-22 11:14:01 +02:00
Max Kellermann
631b635652 decoder/wavpack: rename struct wavpack_input to WavpackInput 2014-05-22 10:52:34 +02:00
Max Kellermann
49695d47d3 input/curl: relock mutex in error paths 2014-05-21 19:00:47 +02:00
Max Kellermann
5cec477131 input/curl: pass remaining size to CircularBuffer::Append() 2014-05-21 18:59:51 +02:00
Max Kellermann
a5d0300787 input/curl: move code to IcyInputStream 2014-05-21 18:47:49 +02:00
Max Kellermann
09b84c51ee input/rewind: move code to class ProxyInputStream 2014-05-21 18:47:49 +02:00
Max Kellermann
afe53997bf test/test_rewind: unit test for class RewindInputStream 2014-05-21 18:47:40 +02:00
Max Kellermann
c42e412c0a input/InputStream: move Open() to Open.cxx
Allow compiling test programs with only selected plugins.
2014-05-21 18:47:32 +02:00
Max Kellermann
542e7feba8 input/rewind: include cleanup 2014-05-21 18:47:22 +02:00
Max Kellermann
dc085e0bd2 input/rewind: work around assertion failure
Caused by commit 0b4fa41a
2014-05-21 18:47:12 +02:00
Max Kellermann
7c9517343c ThreadInputStream: include cleanup 2014-05-12 19:04:32 +02:00
Max Kellermann
0b4fa41aff InputStream: "protect" attributes 2014-05-12 18:59:46 +02:00
Max Kellermann
e138e2c880 input/cdio: convert to class 2014-05-12 18:59:25 +02:00
Max Kellermann
0d6345e98b input/cdio: move initialization code to constructor
Make attributes const, don't allow partial initialization.
Instantiate the CdioParanoiaInputStream object at the end of
input_cdio_open().
2014-05-12 18:54:05 +02:00
Max Kellermann
a84bcf597d input/cdio: handle cdio_open() failure 2014-05-12 18:53:47 +02:00
Max Kellermann
4bbd4ba855 input/cdio: initialize lsn_relofs in constructor 2014-05-12 18:48:16 +02:00
Max Kellermann
9e5b56b475 input/cdio: initialize attribute "buffer_lsn" 2014-05-12 18:47:27 +02:00
Max Kellermann
dd383037fd input/cdio: remove unused attribute "trackno" 2014-05-12 18:41:45 +02:00
Max Kellermann
3cd24c0a51 Merge tag 'v0.18.11' 2014-05-12 18:38:45 +02:00
Max Kellermann
8bfdb4ed0c release v0.18.11 2014-05-12 18:20:26 +02:00
Max Kellermann
41507d8129 icu/Collate: use u_strFoldCase() instead of ucol_getSortKey()
Turns out ucol_getSortKey() does not what I thought it does.
2014-05-12 14:43:30 +02:00
Max Kellermann
317a98a5a9 icu/Collate: UCharFromUTF8() returns WritableBuffer<UChar> 2014-05-12 14:39:40 +02:00
Max Kellermann
1395794923 icu/Collate: initialize error_code
Fixes the broken "search" command.
2014-05-12 14:13:09 +02:00
Max Kellermann
073e9d06ec mixer/software: keep attribute "volume" in the 0..100 range
The attribute must be 0..100 and not 0..1024.  Previously, the code
was inconsistent.
2014-05-12 12:46:14 +02:00
Max Kellermann
fd1b04932a InputStream: remove attribute "plugin" 2014-05-11 18:25:55 +02:00
Max Kellermann
d4b625b48e InputStream: make various methods abstract
Replace InputPlugin attributes.
2014-05-11 17:14:49 +02:00
Max Kellermann
82337dec44 InputStream: add virtual destructor
Replaces the method Close().
2014-05-11 17:12:50 +02:00
Max Kellermann
f1d0700252 input/plugins: make InputStream the base class
Prepare for adding virtual methods.
2014-05-11 17:12:50 +02:00
Max Kellermann
e1383a2d8e input/rewind: convert to class 2014-05-11 17:12:50 +02:00
Max Kellermann
6773adc771 InputStream: convert to class 2014-05-11 15:34:48 +02:00
Max Kellermann
ee2afb35dd Makefile.am: add variable NFS_SOURCES 2014-05-11 14:49:36 +02:00
Max Kellermann
0adcda387a PlaylistCommands: remove redundant playlist_load_spl() call
This case is handled already by playlist_open_in_playlist_dir() (via
playlist_mapper_open()).  And the call didn't work anyway.
2014-05-10 19:02:33 +02:00
Max Kellermann
fc1664d9fc PlaylistMapper: use map_spl_utf8_to_fs()
Eliminates some overhead and some duplicate code, and fixes a serious
bug: the old code did not append the ".m3u" suffix, and thus the
"load" command was completely broken for stored playlists.  D'oh!
2014-05-10 19:00:46 +02:00
Max Kellermann
70bd35abe2 decoder/OggUtil: allow skipping up to 32 kB after seek
Fixes missing song length on high-latency Opus files.

According to tests with 320 kbit/s opus files with 60ms packets, we
need to skip up to 29 kB.
2014-04-29 11:56:05 +02:00
Max Kellermann
12768babdf doc/protocol.xml: add warning to "listall" and "listallinfo" 2014-04-29 10:31:14 +02:00
Max Kellermann
bc2a1160b8 db/Count: implement grouping 2014-04-27 22:27:43 +02:00
Max Kellermann
75542e8f5d db/Count: add constructor 2014-04-27 22:27:28 +02:00
Max Kellermann
fcb55f841a DatabasePrint: move PrintSongCount() to Count.cxx 2014-04-26 22:59:21 +02:00
Max Kellermann
0efb67b51e DeferredMonitor: fix race condition when using GLib event loop
Turns out the lock-free code using atomics was not thread-safe.  The
given callback could be invoked by GLib before the source_id attribute
was assigned.  This commit changes the DeferredMonitor class to use a
Mutex to block the event loop until source_id is assigned.  This bug
does not exist in the 0.19 branch because it does not use the GLib
main loop anymore.
2014-04-26 22:11:23 +02:00
Max Kellermann
54ebf2a699 configure.ac: prepare for 0.18.11 2014-04-26 22:08:08 +02:00
Max Kellermann
154e601f4e db/Helpers: split library 2014-04-25 18:39:21 +02:00
Max Kellermann
4cca75b2e1 DatabasePrint: refactor variable/function names 2014-04-25 18:36:07 +02:00
Max Kellermann
6d616e55ae LogInit: fix file descriptor leak in SIGHUP handler 2014-04-25 12:31:06 +02:00
Max Kellermann
95b1a640b6 DatabaseCommands: disallow "grouping" by the selected tag
Fixes assertion failure.
2014-04-25 11:28:17 +02:00
Max Kellermann
ecc12c9ba1 db/Helpers: move code to tag/Set.cxx 2014-04-24 18:32:23 +02:00
Max Kellermann
9e50993c13 db/Helpers: move TagSet to dedicated header 2014-04-24 18:18:26 +02:00
Max Kellermann
b32ec857b1 db/Helpers: use set::emplace() 2014-04-24 18:17:07 +02:00
Max Kellermann
0de42d56fc DatabasePrint: eliminate printAllIn(), printInfoForAllIn() 2014-04-24 18:09:39 +02:00
Max Kellermann
6378ad69bb DatabasePrint: merge adjacent client_printf() calls 2014-04-24 18:07:12 +02:00
Max Kellermann
9616e9bf3b DatabasePrint: pass const SearchStats reference 2014-04-24 18:06:46 +02:00
Max Kellermann
7c8b73bffb DatabasePrint: use unsigned counts 2014-04-24 18:06:26 +02:00
Max Kellermann
ae178c77bd DatabaseCommands: "list" allows grouping 2014-04-24 11:38:49 +02:00
Max Kellermann
2220651253 TagBuilder: add method AddEmptyItem() 2014-04-24 11:38:48 +02:00
Max Kellermann
7fdd801479 DatabaseCommands: simplify the handle_list() argument parser 2014-04-24 11:38:48 +02:00
Max Kellermann
27002ad1ea db/Helpers: "list" on album artist falls back to the artist tag 2014-04-24 10:48:52 +02:00
Max Kellermann
986dd2fac1 db/Helpers: move code to CheckUniqueTag() 2014-04-24 10:47:53 +02:00
Max Kellermann
3965b490a9 db/Helpers: use reference instead of pointer 2014-04-24 10:31:19 +02:00
Max Kellermann
b999e16406 SongFilter: convert argv to ConstBuffer 2014-04-24 09:59:59 +02:00
Max Kellermann
7fb9bebd46 util/{Const,Writable}Buffer: add front(), back(), pop_{front,back}(), shift() 2014-04-24 09:50:19 +02:00
Max Kellermann
3b8a9dd6ec util/{Const,Writable}Buffer: add typedef reference_type 2014-04-24 09:47:59 +02:00
Max Kellermann
cfbee59152 doc/protocol.xml: change "in" to "base" 2014-04-24 09:37:31 +02:00
Max Kellermann
b4db28fed2 doc/protocol.xml: update and fix command "list" 2014-04-24 08:20:38 +02:00
Max Kellermann
c9aec3e866 DatabaseCommands: fix crash on "list base"
The string "base" is understood by locate_parse_type(), but not by
listAllUniqueTags().  The special tag type LOCATE_TAG_BASE_TYPE causes
a crash in PrintUniqueTag().
2014-04-24 08:19:08 +02:00
Max Kellermann
1d1f8be260 DatabasePrint: convert "type" to unsigned 2014-04-24 08:18:41 +02:00
Max Kellermann
38e6c0ad3f DatabaseCommands: clarify compatibility comment 2014-04-24 08:11:06 +02:00
Max Kellermann
7ecf4ad54d input/nfs: add missing string.h include
For strrchr().  Fixes build failure.
2014-04-23 12:53:19 +02:00
Max Kellermann
1c02b4b9f4 Merge tag 'release-0.18.10' 2014-04-10 13:49:20 +02:00
Max Kellermann
d0119548c1 release v0.18.10 2014-04-10 13:36:38 +02:00
Marcello Desantis
95ac6071b9 decoder/sndfile: work around libsndfile bug on partial read 2014-04-09 23:58:56 +02:00
Weng Xuetian
3a4e667078 PlaylistEdit: don't interrupt playback when current song gets deleted 2014-04-09 23:10:14 +02:00
Max Kellermann
afdefefbe4 icu/Collate: fix memory leak in IcuCaseFold() 2014-04-09 20:09:34 +02:00
Max Kellermann
5360c0c588 IOThread: make io_thread_get() "const" 2014-04-05 09:26:45 +02:00
Max Kellermann
74a05a7f53 pcm/Neon: explicit rounding
Convert to 31 bit first, then right-shift with rounding to 16 bit.
2014-03-19 06:54:06 +01:00
Max Kellermann
a68acf5c66 util/ConstBuffer: add FromVoid(), ToVoid() to "void" specialization
Provide the full API.
2014-03-18 12:09:17 +01:00
Max Kellermann
ce18c36ed9 decoder/ffmpeg: handle unknown stream start time 2014-03-18 09:16:09 +01:00
Max Kellermann
8e39cf62e7 decoder/ffmpeg: pass AVSEEK_FLAG_ANY to av_seek_frame()
This corrects a major mistake from commit 724a59aa - there was one
small thing that commit was supposed to do, and it failed.
AV_TIME_BASE is not a seek flag.
2014-03-18 09:10:36 +01:00
Max Kellermann
707d379b97 input/mms: move blocking I/O to thread 2014-03-16 11:48:46 +01:00
Max Kellermann
88a0a48b03 input/BufferedInputStream: new wrapper for moving plugin to thread 2014-03-16 10:26:40 +01:00
Max Kellermann
d51b90a880 thread/Thread: make the destructor non-virtual
The class does not have any virtual methods, and thus the (debug-only)
destructor does not need to be virtual.
2014-03-16 10:26:23 +01:00
Max Kellermann
e9912bcf8a input/alsa: don't initialize "seekable=false", "size=-1"
These are the default values already.
2014-03-16 09:52:17 +01:00
Max Kellermann
4a5cc9f610 test/run_decoder: use InputStream::OpenReady() instead of InputStream::Open() 2014-03-16 09:41:03 +01:00
Max Kellermann
e29fc62b68 test/{run_decoder,dump_playlist}: fix accidental search/replace hiccups 2014-03-16 09:41:03 +01:00
Max Kellermann
b55e1dcb5e pcm/Neon: make neon_x4_b() variadic 2014-03-16 09:30:50 +01:00
Max Kellermann
6f4775a8ee pcm/Neon: apply bit shift during float->int conversion
Avoid multiplication.  This is a speedup of 20%.
2014-03-16 09:05:30 +01:00
Max Kellermann
c7e2f558a0 input/curl: use CircularBuffer
Replaces its own weird buffering code.
2014-03-16 00:35:28 +01:00
Max Kellermann
328860c8ba util/CircularBuffer: add method GetSpace() 2014-03-16 00:28:42 +01:00
Max Kellermann
89ac111853 util/CircularBuffer: add method GetSize() 2014-03-16 00:27:18 +01:00
Max Kellermann
3d4f588a7f util/CircularBuffer: rename GetSize() to GetCapacity() 2014-03-15 23:12:20 +01:00
Max Kellermann
8f74bf314d input/curl: add method CurlInputStream::Open() 2014-03-15 22:56:05 +01:00
Max Kellermann
0dd5ebbdbe input/curl: move _seek() into the CurlInputStream class 2014-03-15 22:42:37 +01:00
Max Kellermann
2ae60767a3 input/curl: move _easy_init() into the CurlInputStream class 2014-03-15 22:38:46 +01:00
Max Kellermann
64f31f70f9 input/curl: pass std::string&& to HeaderReceived()
Code simplification.
2014-03-15 22:02:59 +01:00
Max Kellermann
23eacbd132 input/curl: move code to CurlInputStream methods 2014-03-15 20:43:37 +01:00
Max Kellermann
e9f16fca96 input/curl: rename "error" to "error_buffer" 2014-03-15 20:43:17 +01:00
Max Kellermann
3d30de91f3 input/curl: rename struct input_curl to CurlInputStream 2014-03-15 20:38:08 +01:00
Max Kellermann
f68d2f7c7f system/fd_util: export fd_set_cloexec() 2014-03-15 20:03:31 +01:00
Max Kellermann
f660d30138 util/CircularBuffer: new buffer class 2014-03-15 18:35:52 +01:00
Max Kellermann
b10276ff98 m4/ucred.m4: don't define _GNU_SOURCE
Not necessary anymore, because we enable this flag unconditionally
now.
2014-03-15 18:31:54 +01:00
Max Kellermann
7d353bbe2a configure.ac: always define _GNU_SOURCE on Linux
Make sure glibc gives us all features.
2014-03-15 18:27:09 +01:00
Max Kellermann
5696f91a1e pcm/PcmFormat: ARM NEON optimizations for float->s16
This is nearly 4 times faster than the "portable" algorithm.
2014-03-15 11:41:01 +01:00
Max Kellermann
3932e62fc7 test/test_pcm: replace 256 with prime number
Use some odd number that will expose problems with remaining samples
after optimized vector operations.
2014-03-15 10:53:13 +01:00
Max Kellermann
729304aef5 test/test_pcm_format: add unit test for float clamping 2014-03-15 10:00:47 +01:00
Max Kellermann
40cce050e7 test/test_pcm_all: move CPPUNIT_TEST_SUITE_REGISTRATION() to test_pcm_main.cxx
Run each unit test only once.  Using CPPUNIT_TEST_SUITE_REGISTRATION
from within the header meant that each unit class was registered again
for each source file that includes the header.
2014-03-15 10:00:47 +01:00
Max Kellermann
bb6ee71f08 pcm/PcmFormat: don't use WritableBuffer
The previous commit eliminated the need for that.
2014-03-14 23:23:16 +01:00
Max Kellermann
0d0642fd67 pcm/PcmFormat: instantiate FloatToInteger<S32>
.. instead of reusing FloatToInteger<S24> and converting from S24 to
S32 in-place.
2014-03-14 23:21:20 +01:00
Max Kellermann
08e6cf3dd2 pcm/PcmFormat: eliminate more duplicate code with templates
Refactor the conversion functions to classes and pass an instance to
the new function AllocateConvert().
2014-03-14 20:54:09 +01:00
Max Kellermann
044134eba0 pcm/PcmFormat: eliminate local variable "bits" 2014-03-14 20:53:22 +01:00
Max Kellermann
9fa6fa522e pcm/PcmFormat: remove obsolete AllocateFromFloat() overload 2014-03-14 20:53:14 +01:00
Pete Beardmore
d0cd98a63a MultipleOutputs: ensure input_audio_format is zero-initialised
-fixes SIGABRT when mpd is started from a previously paused state
-regression introduced by commit: f5a923b9d1:
'OutputAll: convert to class, move instance to class Partition'

-input_audio_format was previously declared using the static modifier
ensuring it was zero-initialised by default
-the current default-initialised input_audio_format contains garbage at
runtime which allows the AudioFormat.IsDefined() 'fail fast' test in
MultipleOutputs::Update to pass and the SIGABRT follows in
AudioOutput::Open when passed the invalid input_audio_format struct
-switching AudioFormat.IsDefined() for AudioFormat.IsValid() is an
alternative workaround
2014-03-14 20:27:21 +01:00
Max Kellermann
88eae9dabb command/{storage,file}: suppress bogus format warnings on WIN32 2014-03-14 08:58:43 +01:00
Max Kellermann
f2f1801c25 db/proxy: check connect error before initializing SocketMonitor
Fixes crash bug because mpd_connection_get_async() was called without
a connection.
2014-03-06 13:35:42 +01:00
Max Kellermann
a9e351e00d decoder/gme: fix memory leak in container_scan() 2014-03-06 13:12:39 +01:00
Max Kellermann
d65841a2db configure.ac: prepare for 0.18.10 2014-03-06 13:08:30 +01:00
Pete Beardmore
9da57e7458 PulseOutputPlugin: avoid locking mainloop object from within mainloop thread
-fixes regression introduced by:
 '8d6fedf8177d0d2ced81e6d93d35c368b2ac69db [PATCH] Mixer: add class MixerListener'
-listener.OnMixerVolumeChanged() called GetVolume() which attempted to acquire
the lock but as per 'pa_threaded_mainloop_lock()' documentation:
This function may not be called inside the event loop thread. Events that are
dispatched from the event loop thread are executed with this lock held
-this patch seperates the underlying action of GetVolume() into a new
GetVolumeInternal() function, to be called only when the lock is already held, as
is the case for the listener.OnMixerVolumeChanged() call
2014-03-05 17:17:41 +00:00
Pete Beardmore
3a3fb98f79 PulseOutputPlugin: set icon name 2014-03-04 15:18:30 +00:00
Max Kellermann
503ed9c331 Merge tag 'release-0.18.9' 2014-03-02 11:46:07 +01:00
Max Kellermann
2784d65618 release v0.18.9 2014-03-02 11:25:01 +01:00
Max Kellermann
47ea69233b output/alsa: remove the obsolete Raspberry Pi workaround
Has been superseded by the previous commit.
2014-03-02 11:22:04 +01:00
Max Kellermann
a884e37de1 output/alsa: call snd_pcm_prepare() after snd_pcm_drop()
Don't wait for an optimistic write to fail.  This is an improved
workaround for the infamous Raspberry Pi bug (see commit af991765).
It works much better and comes without the negative side effects.  The
old workaround is now obsolete.
2014-03-02 11:12:25 +01:00
Max Kellermann
0102a8665a event/SignalMonitor: fix build failure due to missing signal.h include 2014-03-02 10:21:31 +01:00
Max Kellermann
cb63189f6b android build 3 2014-03-02 00:53:41 +01:00
Max Kellermann
d77c83f4ba Main: auto-configure state file on Android 2014-03-02 00:35:37 +01:00
Max Kellermann
8cf3ac200b Main: use getExternalStorageDirectory() for locating mpd.conf 2014-03-02 00:24:31 +01:00
Max Kellermann
477877406a android/build.py: enable ffmpeg 2014-03-02 00:22:05 +01:00
Max Kellermann
2bf2f34b12 InputPlugin: allow init() to soft-fail
Add enum InputResult which is a tri-state.  Input plugins may now fail
and just become unavailable.
2014-03-02 00:17:32 +01:00
Max Kellermann
7453c26ec4 thread/Name: fall back to prctl() 2014-03-01 23:58:59 +01:00
Max Kellermann
b059ba69d6 output/sles: support stereo 2014-03-01 23:05:44 +01:00
Max Kellermann
36ca57a54e fs/StandardDirectory: add GetUserCacheDir()
Move code from CreateConfiguredDatabase() and add XDG support.  This
implements an automatic Linux fallback for the setting "db_file" if
none was specified.
2014-03-01 22:51:51 +01:00
Max Kellermann
efa6678bcc NEWS: add group "configuration" 2014-03-01 22:51:51 +01:00
Max Kellermann
b8f1850bba db/Configured: store database file in cache directory
Add class Context which wraps the Android/Java Context class and add a
JNI wrapper for method Context.getCacheDir().
2014-03-01 22:20:28 +01:00
Max Kellermann
5268f55344 java/File: add method ToAbsolutePath() returning AllocatedPath 2014-03-01 20:53:39 +01:00
Max Kellermann
e44c9a000d android/Environment: fix copyright header
Stole my own code from another project :-)
2014-03-01 20:22:22 +01:00
Max Kellermann
ffc926bda5 android/build.py: enable libid3tag 2014-03-01 19:18:50 +01:00
Max Kellermann
07c1ba1f5e TagId3: disable charset conversion without GLib 2014-03-01 19:18:50 +01:00
Max Kellermann
14168eadb2 Main: inline mpd_main() on Android 2014-03-01 19:09:31 +01:00
Max Kellermann
58771fc41c Android: obtain music directory from Environment.getExternalStoragePublicDirectory() 2014-03-01 18:48:20 +01:00
Max Kellermann
1e06c66c77 java: new helper library for the Android port 2014-03-01 18:48:20 +01:00
Max Kellermann
c73771e3ce Main: load mpd.conf from /sdcard/ on Android
Hard-coded path.  Will be replaced soon.
2014-03-01 18:48:20 +01:00
Max Kellermann
350d2bcd6e storage/Configured: fix fallback music directory
This was accidently disabled when storage plugins were introduced.
2014-03-01 18:45:09 +01:00
Max Kellermann
b2c523e56d android: use "strip" from the Android NDK 2014-03-01 08:52:28 +01:00
Max Kellermann
5bc5abf0e7 android: enable database plugins 2014-03-01 08:25:23 +01:00
Max Kellermann
44352e9ee4 Makefile.am: use Android API level 17
The SDK for level 9 cannot be downloaded anymore.
2014-03-01 08:24:49 +01:00
Max Kellermann
7ccc609da2 db/update/ExcludeList: make no-op if GLib is disabled
Quick hack to allow using the database without GLib (for Android).
2014-03-01 08:16:13 +01:00
Max Kellermann
ebc0168072 android: downgrade WRITE_EXTERNAL_STORAGE to READ_EXTERNAL_STORAGE
We're not using external storage yet, but as soon as we will, we only
need to read music files, not write them.
2014-03-01 07:58:01 +01:00
Max Kellermann
4ba7427fa0 util/{Const,Writable}Buffer: add operator[] 2014-03-01 07:49:13 +01:00
Max Kellermann
9dc5335e3e util/{Const,Writable}Buffer: add template specialization for "void"
Omit a few methods that are not applicable.
2014-03-01 07:37:58 +01:00
Max Kellermann
d333de1980 util/ConstBuffer: remove cast operator ConstBuffer<void>
This was bugged, because it did not scale the "size".
2014-03-01 07:37:20 +01:00
Max Kellermann
96afa8bd2b command: add command "listfiles"
Lists files and directories.  Supports storage plugins.
2014-03-01 06:25:57 +01:00
Max Kellermann
797bbeabeb m4: add missing file ax_pthread.m4 from autoconf-archive 2014-03-01 06:24:55 +01:00
Max Kellermann
20cdab5546 DatabasePrint: move code to PrintDirectoryURI() 2014-02-28 08:21:34 +01:00
Max Kellermann
6765234b60 DatabasePrint: add API documentation 2014-02-28 08:17:25 +01:00
Max Kellermann
4c27898ce7 {Other,Database}Commands: contract declaration and assignment 2014-02-28 07:12:04 +01:00
Max Kellermann
d34ae0850c AllCommands: "findadd" requires the "add" permission 2014-02-27 23:08:22 +01:00
Max Kellermann
e9a85aa4e4 db/simple: mount points
A SimpleDatabase instance can now "mount" other Database instances at
certain locations.  This is used to use a new SimpleDatabase instance
for each storage mount (issued with the "mount" protocol command).
Each such instance has its own database file, stored in the directory
that is specified with the "cache_directory" option.
2014-02-27 20:49:13 +01:00
Max Kellermann
2a16fc74fd CompositeStorage: add method GetMount() 2014-02-27 20:49:13 +01:00
Max Kellermann
f65254680a db/update/Queue: use std::list instead of std::queue
The problem with std::queue is that it doesn't give us enough control.
The method Clear() is a kludge already, but soon, we'll need
filtering.
2014-02-27 20:49:13 +01:00
Max Kellermann
d64edb6896 db/simple: GetRoot() returns reference 2014-02-27 19:29:10 +01:00
Max Kellermann
3f9ad8e104 db/update/Service: allocate UpdateWalk dynamically 2014-02-27 18:04:24 +01:00
Max Kellermann
1c772ef699 Playlist: use the Error library to return errors 2014-02-27 17:27:23 +01:00
Max Kellermann
809b89b5af Playlist*: move to queue/ 2014-02-27 17:12:42 +01:00
Max Kellermann
681e012fb5 db/update: cancel the update on shutdown 2014-02-27 16:58:35 +01:00
Max Kellermann
3be36643a1 db/UpdateGlue: rename to Service.cxx 2014-02-27 16:14:10 +01:00
Max Kellermann
21e19ef69f db/simple/Directory: eliminate method LookupSong()
Move to SimpleDatabase::GetSong() to give that method more control.
2014-02-26 20:10:31 +01:00
Max Kellermann
69a42fc901 db/simple/Directory: LookupDirectory() return remaining URI
Code can now be reused in LookupSong().
2014-02-26 19:50:46 +01:00
Max Kellermann
525789cd36 db/simple/Directory: make variables more local 2014-02-26 19:50:36 +01:00
Max Kellermann
367d660c08 db/Directory: add DEVICE_* documentation 2014-02-26 10:00:38 +01:00
Max Kellermann
4d73e4d605 db/simple: create dedicated directory 2014-02-26 09:17:41 +01:00
Max Kellermann
d86cc5bf42 db/Song: update API documentation for SimpleDatabasePlugin 2014-02-25 22:16:20 +01:00
Max Kellermann
5f262da09d db/simple: remove unused method LookupDirectory() 2014-02-25 20:13:40 +01:00
Max Kellermann
82985a9488 db/simple: make internal methods "private" 2014-02-25 19:48:01 +01:00
Max Kellermann
afcdb65f80 db/simple: add comment 2014-02-25 18:17:54 +01:00
Max Kellermann
6b66e86f40 db/simple: move Create() up 2014-02-25 18:17:39 +01:00
Max Kellermann
cb145d290e DirectorySave: save the flags "DEVICE_INARCHIVE" and "DEVICE_CONTAINER"
Helps avoid unnecessary archive scans during database update on a
fresh MPD process.
2014-02-25 18:16:19 +01:00
Max Kellermann
167803d2a1 DatabaseSave: increase DB_FORMAT version 2014-02-25 18:16:06 +01:00
Max Kellermann
58a981d2f6 DatabaseSave: add constant OLDEST_DB_FORMAT 2014-02-25 18:15:55 +01:00
Max Kellermann
8963cd1fab DirectorySave: move code to ParseLine() 2014-02-25 18:15:43 +01:00
Max Kellermann
6526de024a output/pulse: remove bogus g_free() call 2014-02-24 21:23:49 +01:00
Max Kellermann
55cd5a9a78 DirectorySave: save the mtime only if it is known 2014-02-24 21:17:06 +01:00
Max Kellermann
3f4c283203 icu/Collate: pass UErrorCode* to ucol_strcollUTF8()
Fixes crash after database update.
2014-02-24 21:05:44 +01:00
Max Kellermann
1e63e7c08b icu/Collate: initialize the error code before ucol_open()
Fixes initialization failure.
2014-02-24 21:04:23 +01:00
Max Kellermann
33fc3af775 SongSort, ...: use libicu instead of GLib's g_utf8_*() 2014-02-24 20:39:37 +01:00
Max Kellermann
6d9739165e output/httpd/client: eliminate GLib 2014-02-24 20:39:37 +01:00
Max Kellermann
7c5396ffb9 output/{shout,win32}: include cleanup 2014-02-24 20:34:09 +01:00
Max Kellermann
8319398957 output/openal: use usleep() instead of g_usleep() 2014-02-24 20:33:15 +01:00
Max Kellermann
a1509876de output/pulse: use setenv() instead of g_setenv()
There is no advantage in using g_setenv().
2014-02-24 20:31:38 +01:00
Max Kellermann
0f2cf51f43 output/pulse: remove bogus g_free() call 2014-02-24 20:29:29 +01:00
Max Kellermann
e99ff4fdbc decoder/gme: use free() instead of g_free() 2014-02-24 20:19:34 +01:00
Max Kellermann
25431f32a2 DecoderPlugin: free the container_scan() return value with delete[] 2014-02-24 20:19:34 +01:00
Max Kellermann
6ba1fe7568 UriUtil: support ftp:// URLs in uri_remove_auth() 2014-02-24 19:59:53 +01:00
Max Kellermann
bfae92e307 Main: use INT_MAX instead of G_MAXUINT 2014-02-24 18:57:03 +01:00
Max Kellermann
9c5bf542d1 android/build.py: add project parameter "cppflags" 2014-02-24 09:33:23 +01:00
Max Kellermann
61161269d8 android/build.py: add parameter that specifies a subdirectory 2014-02-24 09:32:38 +01:00
Max Kellermann
8fe004e98e fs/Charset: use "UTF-8" instead of "utf-8" as the default value
The upper-case name seems to be the canonical one.
2014-02-23 22:03:40 +01:00
Max Kellermann
09e5f17b5d Directory: use PathTraitsUTF8::Build() instead of g_strconcat() 2014-02-23 22:02:39 +01:00
Max Kellermann
db20e29af6 Directory: pass std::string&& to constructor 2014-02-23 22:02:02 +01:00
Max Kellermann
5f5c95cc68 android build 2 2014-02-22 13:40:29 +01:00
Max Kellermann
68f3015712 android/build.py: add libopus 2014-02-22 13:40:11 +01:00
Max Kellermann
240a697f6c encoder/opus: use xalloc() instead of g_malloc() 2014-02-22 13:40:11 +01:00
Max Kellermann
5a0dc808fd decoder/opus: use new[] instead of g_malloc() 2014-02-22 13:37:36 +01:00
Max Kellermann
befbf6bf13 android/build.py: add libmad 2014-02-22 10:22:31 +01:00
Max Kellermann
2d5c21c457 android/build.py: add option "autogen" 2014-02-22 10:22:31 +01:00
Max Kellermann
25977d56c8 android/build.py: add -Iroot/include and -Lroot/lib
Allow library auto-detection without pkg-config.
2014-02-22 10:22:31 +01:00
Max Kellermann
4dcf0b8ae0 first Android release
Finally, MPD runs on Android.  For some small value of "runs".  Very
much work left, too much to describe.
2014-02-22 01:39:08 +01:00
Max Kellermann
9574d11dc8 output/sles: new output plugin for Android 2014-02-22 00:18:46 +01:00
Max Kellermann
3d4689756c Main: disable command-line parser and signal handlers on Android 2014-02-22 00:18:46 +01:00
Max Kellermann
90114514a9 LogBackend: use __android_log_print() on Android 2014-02-22 00:18:46 +01:00
Max Kellermann
7757e59e78 input/curl: include cleanup 2014-02-22 00:18:29 +01:00
Max Kellermann
adb89e0121 Makefile.am: build shared library for Android
Doesn't work yet, just to get the Android port started.
2014-02-21 10:51:07 +01:00
Max Kellermann
b7a7953757 db/Directory: use "unsigned" for inode and device
This is what we get from the storage plugin via FileInfo.  Fixes a
compiler warning on Mac OS X where dev_t appears to be signed.
2014-02-21 10:48:43 +01:00
Max Kellermann
d25ef7eea4 configure.ac: detect Android cross-build
Define "ANDROID" if the host operating system is Android.
2014-02-21 10:27:07 +01:00
Max Kellermann
30a82076ba PlayerListener: new interface to replace GlobalEvents access 2014-02-21 10:22:35 +01:00
Max Kellermann
860339c132 Makefile.am: use AM_CPPFLAGS instead of src_mpd_CPPFLAGS
Fixes build failure caused by commit d9466cad0.
2014-02-21 10:22:35 +01:00
Max Kellermann
008723c62f ConfigGlobal: eliminate function config_get_next_param() 2014-02-20 00:04:23 +01:00
Max Kellermann
9e0ce23a03 test/run_{filter,output}: use config_find_block() 2014-02-20 00:04:23 +01:00
Max Kellermann
04ba433ca6 Main: initialize Partition before Listener
Fixes nullptr dereference (regression by commit df5f9f4a).
2014-02-20 00:04:23 +01:00
Max Kellermann
d884272ba8 Listen: eliminate local variable 2014-02-19 23:50:47 +01:00
Max Kellermann
e609c88334 Listen: reduce overhead for builds without systemd 2014-02-19 23:49:34 +01:00
Max Kellermann
e92a41fa3a db/upnp: move plugin source to upnp directory 2014-02-19 23:46:00 +01:00
Max Kellermann
df5f9f4a15 Listen: add Partition reference 2014-02-19 23:43:36 +01:00
Max Kellermann
d9466cad0e Makefile.am: move the MPD core to libmpd.a
Prepare for providing everything in a shared library, to be embedded
in another process.
2014-02-19 23:41:07 +01:00
Max Kellermann
150443b014 DatabasePlugin: add FLAG_REQUIRE_STORAGE
Ignore the storage configuration if FLAG_REQUIRE_STORAGE is not set in
the DatabasePlugin.
2014-02-19 23:24:17 +01:00
Max Kellermann
9e36af7916 DatabasePlugin: add attribute "flags" 2014-02-19 23:24:15 +01:00
Max Kellermann
85b8675e7a db/Interface: add attribute "plugin"
The new method IsPlugin() replaces the "is_simple" flag.
2014-02-19 23:17:21 +01:00
Max Kellermann
ae594ad92c DatabasePlugin: split header 2014-02-19 22:54:52 +01:00
Max Kellermann
8d6fedf817 Mixer: add class MixerListener
Use a listener interface instead of GlobalEvents.
2014-02-19 21:40:14 +01:00
Max Kellermann
f4f8fa7c94 output/Init: pass AudioOutput references 2014-02-19 21:38:48 +01:00
Max Kellermann
fb5fbb8088 util/Tokenizer: relicense to BSD-2 2014-02-19 10:41:48 +01:00
Max Kellermann
e06a807d30 Makefile.am: move DatabaseSave.cxx to libdatabase_plugins.a 2014-02-19 10:13:42 +01:00
Max Kellermann
6b09842cb6 Makefile.am: re-add src/AudioCompress/compress.c to test/run_normalize
Build was broken by previous commit.
2014-02-19 10:13:31 +01:00
Max Kellermann
ca813389dc Makefile.am: move AudioCompress to libfilter_plugins.a 2014-02-19 10:03:58 +01:00
Max Kellermann
e624171ba1 StickerCommands: include cleanup 2014-02-19 09:53:22 +01:00
Max Kellermann
0bbfb28992 output/httpd: move to dedicated directory 2014-02-19 09:22:08 +01:00
Max Kellermann
ee7bd695fd Timer: move to output/ 2014-02-19 09:22:08 +01:00
Max Kellermann
1cc17bfe7a cue/CueParser: move to playlist/ 2014-02-19 08:56:58 +01:00
Max Kellermann
8ae492dfeb Makefile.am: merge mpd_headers into src_mpd_SOURCES 2014-02-18 23:10:53 +01:00
Max Kellermann
e8789d7cb9 system/FatalError: remove GError support 2014-02-18 23:05:40 +01:00
Max Kellermann
0053cd0d0d Main: disable inotify check without database
Fix build failure.
2014-02-18 21:47:01 +01:00
Max Kellermann
c32477a223 Merge branch 'v0.18.x' 2014-02-18 21:46:41 +01:00
Max Kellermann
5e1e92626c event/SignalMonitor: unblock signals after fork
Fixes hanging child process in the "pipe" output plugin.
2014-02-18 19:13:50 +01:00
Max Kellermann
7fee85c80a configure.ac: fix linker failure when libvorbis/libogg are static
Link libvorbisfile first, followed to libvorbis and finally libogg.
This order is necessary because libvorbisfile depends on libvorbis.
2014-02-18 18:39:19 +01:00
Max Kellermann
a0c25941a8 Thread/Util: use __NR_ioprio_set instead of SYS_ioprio_set
Bionic doesn't have the SYS_* macros.
2014-02-18 10:44:18 +01:00
Max Kellermann
5eb468bce0 Thread/Util: make SCHED_RESET_ON_FORK optional
Use it if it exists, but don't insist if the C library is poor
(e.g. Bionic/Android).
2014-02-18 10:43:24 +01:00
Max Kellermann
7f8dd0e939 Makefile.am: rename libdecoder_plugins.a to libdecoder.a 2014-02-18 10:02:46 +01:00
Max Kellermann
28701cb9dd Makefile.am: remove unused variable DECODER_SRC 2014-02-18 10:01:37 +01:00
Max Kellermann
9b7f492c65 thread/Posix{Mutex,Cond}: disable "constexpr" on Android
Bionic's pthread declarations are non-literal.
2014-02-18 09:54:35 +01:00
Max Kellermann
6eda79d02d system/EPollFD: add epoll_create1() fallback for Android 2014-02-18 09:54:35 +01:00
Max Kellermann
fb5cf8e3ac .gitignore: add "/" prefixes 2014-02-18 09:41:25 +01:00
Max Kellermann
55e128cced test: various fixups for building without GLib 2014-02-18 09:18:42 +01:00
Max Kellermann
13056af8b2 Makefile.am: disable test_icy_parser without CURL 2014-02-18 09:18:42 +01:00
Max Kellermann
972c52891d configure.ac: check for libpthread
Required for building without GLib.
2014-02-18 09:18:42 +01:00
Max Kellermann
e10a8d95f6 PlaylistRegistry: disable the "pls" plugin without GLib 2014-02-18 09:18:42 +01:00
Max Kellermann
97f2be348c LogInit: disable SetLogCharset() without GLib 2014-02-18 09:18:42 +01:00
Max Kellermann
2b21312b36 util/StringUtil: add StringEndsWith()
Replaces g_str_has_suffix().
2014-02-18 09:18:42 +01:00
Max Kellermann
3a818b6d45 SongFilter: disable g_utf8_casefold() without GLib
Temporary hack for the experimental no-GLib build.
2014-02-18 09:18:42 +01:00
Max Kellermann
1709ab6810 fs/TextFile: use custom allocation instead of GString 2014-02-17 23:04:10 +01:00
Max Kellermann
ce925ba56f fs/Charset: disable if GLib is disabled 2014-02-17 22:48:26 +01:00
Max Kellermann
4ad14f6a2c TagId3: use xstrdup() instead of g_strdup() 2014-02-17 22:42:54 +01:00
Max Kellermann
579e48edbb util/StringUtil: add function Strip()
Replaces g_strstrip().
2014-02-17 22:37:43 +01:00
Max Kellermann
6a08f2281a TagString: disable UTF-8 validation if GLib is disabled 2014-02-17 22:33:10 +01:00
Max Kellermann
91729437a0 Main: initialize Database before Storage 2014-02-17 22:14:00 +01:00
Max Kellermann
3af7af0b8f Main: move code to InitDatabaseAndStorage() 2014-02-17 22:13:53 +01:00
Max Kellermann
1ddd00433e db/Configured: disallow both "db_file" and "database"
This is misconfiguration, and MPD should abort.
2014-02-17 22:13:53 +01:00
Max Kellermann
de160bb2d1 Main: move code to db/Configured.cxx 2014-02-17 22:13:53 +01:00
Max Kellermann
ff62b6742b Main: check if database exists before attempting to close it
Fixes nullptr dereference.
2014-02-17 22:13:53 +01:00
Max Kellermann
6da0af94df db/DatabaseSimple: remove obsolete header 2014-02-17 20:44:03 +01:00
Max Kellermann
5d87a274a5 configure.ac: link the Vorbis encoder with libogg
Fixes another linker failure.  Similar to commit ea406875
2014-02-17 19:42:38 +01:00
Max Kellermann
df9667a497 StorageCommands: add command "unmount" 2014-02-12 23:48:08 +01:00
Max Kellermann
e3e2ad4ae5 CompositeStorage: fix tree walk in Directory::Unmount() 2014-02-12 23:48:08 +01:00
Max Kellermann
ace4ba3171 StorageCommands: emit IDLE_MOUNT on successful "mount"
Add the new idle event to Idle.hxx/Idle.cxx.
2014-02-12 23:06:47 +01:00
Max Kellermann
0935ae330a StorageCommands: add command "listmounts" 2014-02-12 21:47:59 +01:00
Max Kellermann
9e02b13ab3 systemd: add socket activation files 2014-02-12 21:22:36 +01:00
Max Kellermann
5a486a940c systemd: assign real-time budget 2014-02-12 21:00:53 +01:00
Max Kellermann
d05ae4b444 util/HugeAllocator: relicense to BSD-2 2014-02-10 13:32:50 +01:00
Max Kellermann
73b0610d89 PlaylistSong: copy the "real" URI
Playback with some decoder plugins was broken because the Queue's
DetachedSong instances did not have the "real" URI (the mapped path).
2014-02-10 11:00:49 +01:00
Max Kellermann
57e862712a configure.ac: prepare for 0.18.9 2014-02-09 22:58:14 +01:00
Max Kellermann
73aec9ce63 StorageCommands: expose the "mount" command 2014-02-09 11:07:08 +01:00
Max Kellermann
a9fefcf600 Main: wrap the Storage instance in CompositeStorage 2014-02-09 11:07:08 +01:00
Max Kellermann
59ce67e2e5 CompositeStorage: new Storage implementation
This is the backend for the upcoming "mount" command.
2014-02-09 10:47:29 +01:00
Max Kellermann
2182209a8a db/update/Walk: disable FindAncestorLoop() if device/inode==0 2014-02-09 10:47:29 +01:00
Max Kellermann
e29a8b3a9c db/update/Walk: document FindAncestorLoop() 2014-02-09 10:46:39 +01:00
Max Kellermann
ace3f37af4 db/update/Walk: rename find_inode_ancestor() to FindAncestorLoop() 2014-02-09 10:46:39 +01:00
Max Kellermann
37b6899660 Main: move code to storage/Configured.cxx 2014-02-09 08:09:47 +01:00
Max Kellermann
570b12ec13 Idle: error out when unrecognized idle event was specified
Implements the error checks missing in commit 0bad8406
2014-02-09 08:07:48 +01:00
Max Kellermann
ac286ef734 OtherCommands: remove unnecessary nullptr check 2014-02-09 08:07:43 +01:00
Max Kellermann
b3663b5da2 storage/nfs: new storage plugin 2014-02-08 14:24:47 +01:00
Max Kellermann
d761d8b168 input/nfs: move nfs_domain to lib/nfs/Domain.cxx 2014-02-08 14:24:47 +01:00
Max Kellermann
fe7c6fee34 ArchivePlugin: pass Path to open() 2014-02-08 13:25:44 +01:00
Max Kellermann
9906daeca7 ArchivePlugin: rename struct archive_plugin to ArchivePlugin 2014-02-08 13:22:13 +01:00
Max Kellermann
5fb54095d2 doc/user: document storage plugins 2014-02-08 00:09:53 +01:00
Max Kellermann
3fdc678aae Main: support arbitrary storage plugins 2014-02-08 00:04:29 +01:00
Max Kellermann
a0088ccce1 storage: add struct StoragePlugin and a plugin registry 2014-02-07 23:46:15 +01:00
Max Kellermann
be081929f4 storage/local: remove utf8 path from constructor
Build the UTF-8 version of the path automatically in the constructor.
2014-02-07 23:41:06 +01:00
Max Kellermann
b0b086d473 Main: move storage initialization to InitStorage() 2014-02-07 23:37:39 +01:00
Max Kellermann
6798af52b6 Mapper: obtain music directory from Storage
Eliminate duplicate variable.
2014-02-07 23:34:29 +01:00
Max Kellermann
4d5ebafa6d Main: check the music directory
Move call from Mapper.cxx.
2014-02-07 23:29:20 +01:00
Max Kellermann
ec8873b178 Mapper: move check_directory() to the filesystem library 2014-02-07 23:25:47 +01:00
Max Kellermann
c45f205593 Main: chop separators from music directory
Move call from Mapper.cxx.
2014-02-07 23:13:24 +01:00
Max Kellermann
027b2063ba Mapper: remove unused functions 2014-02-07 23:03:25 +01:00
Max Kellermann
b531c4c2fe OtherCommands: use Storage::MapUTF8() instead of Mapper.cxx 2014-02-07 22:58:21 +01:00
Max Kellermann
4b010df99e Main: create Storage instance in glue_mapper_init()
Don't use the obsolete Mapper library to create it.
2014-02-07 22:54:18 +01:00
Max Kellermann
5e4dd4be9c Main: allow playlist directory without music directory 2014-02-07 22:39:17 +01:00
Max Kellermann
04d5896c1c NEWS: mention default soundcloud API key
Missing from commit 48c96bba
2014-02-07 22:38:04 +01:00
Max Kellermann
f947274626 InotifyUpdate: use class Storage instead of Mapper.cxx 2014-02-07 22:30:40 +01:00
Max Kellermann
f6939f71a7 InotifyUpdate: use the root name instead of mapper_get_music_directory_fs()
The root WatchDirectory instance already contains the music directory,
and we don't need to fetch it again.
2014-02-07 22:30:01 +01:00
Max Kellermann
25aa17ad89 InotifyUpdate: move functions into the WatchDirectory class 2014-02-07 22:24:26 +01:00
Max Kellermann
05ee057db5 InotifyUpdate: remove unnecessary #ifdefs 2014-02-07 22:17:27 +01:00
Max Kellermann
297e2747f3 PlaylistMapper: use class Storage instead of Mapper.cxx 2014-02-07 21:44:50 +01:00
Max Kellermann
77de233117 Playlist{Any,Registry,Mapper}: move functions to PlaylistStream.cxx 2014-02-07 21:30:49 +01:00
Max Kellermann
02b67edaf5 PlaylistSong: include cleanup 2014-02-07 21:30:03 +01:00
Max Kellermann
8549ccfd8c playlist/CloseSongEnumerator: new wrapper class
Simplifies a lot of code, because we don't need to return both the
SongEnumerator and the InputStream.
2014-02-07 20:27:24 +01:00
Max Kellermann
ffd16b55a6 StoragePlugin: add method MapToRelativeUTF8()
Replaces map_to_relative_path() from Mapper.cxx.
2014-02-07 19:09:28 +01:00
Max Kellermann
d744c997d8 fs/Traits: add function Relative()
Move code from Path::RelativeFS() and make it generic.
2014-02-07 19:08:51 +01:00
Max Kellermann
6b421cc354 DecoderPlugin: pass Path instance to file_decode() and scan_file() 2014-02-07 18:52:19 +01:00
Max Kellermann
37ec29b225 Mapper: remove unused function map_song_fs() 2014-02-07 18:51:19 +01:00
Max Kellermann
ca7f6a26b5 DecoderThread: use only DetachedSong::GetRealURI()
Don't use the mapper - all DetachedSong instances we get have already
been mapped.
2014-02-07 18:50:07 +01:00
Max Kellermann
9b69d22d7e DecoderThread: pass Path object around for local song files 2014-02-07 18:45:11 +01:00
Max Kellermann
4ab4cf8532 SongUpdate: pass Storage to UpdateFileInArchive() 2014-02-07 18:44:47 +01:00
Max Kellermann
3341b282b7 PlaylistSave: use DetachedSong::GetRealURI() in playlist_print_song()
The DetachedSong instance already knows its own absolute path, and
there is no need to ask the mapper again.
2014-02-07 18:42:16 +01:00
Max Kellermann
bb3b836dbb FileCommands: support remove database files 2014-02-07 18:41:42 +01:00
Max Kellermann
1873c67540 FileCommands: use Storage::MapFS() instead of map_uri_fs() 2014-02-07 18:38:10 +01:00
Max Kellermann
8fd8f23a6b FileCommands: move code to read_file_comments() 2014-02-07 18:33:43 +01:00
geneticdrift
f225051348 fixed possible format_context not closed in ffmpeg_decode 2014-02-07 12:07:43 +01:00
Max Kellermann
b2e3fdef0f storage/local: hide the class declarations
Hide inside CreateLocalStorage().
2014-02-07 01:11:52 +01:00
Max Kellermann
c13810ebaa Mapper: move map_song_detach() to db/DatabaseSong.cxx
Use Storage::MapUTF8() internally, don't use global variables.
2014-02-07 00:42:14 +01:00
Max Kellermann
19a982cf69 Mapper: convert IsInDatabase() check to assertion in map_song_detach() 2014-02-07 00:42:14 +01:00
Max Kellermann
746a47982b Merge tag 'release-0.18.8' 2014-02-07 00:17:36 +01:00
Max Kellermann
ddb5390d88 release v0.18.8 2014-02-07 00:06:31 +01:00
Max Kellermann
fce20e514e NEWS: fix 0.18.7 release year 2014-02-07 00:06:31 +01:00
Max Kellermann
327cbf48f5 pcm/FallbackResampler: add missing ConstBuffer<T>::ToVoid() call 2014-02-06 23:48:01 +01:00
geneticdrift
0f1f509be7 fixed leaked LocalDirectoryReader *const reader in UpdateWalk::UpdateDirectory 2014-02-06 23:08:24 +01:00
Max Kellermann
c8f0c7e9ed */smbclient: protect all libsmbclient calls with a mutex
libsmbclient is not thread-safe nor reentrant.  We must protect all
function calls with a global mutex, unfortunately.
2014-02-06 22:19:59 +01:00
Max Kellermann
a7989077ab neighbor/smbclient: move smbclient_domain to lib/smbclient/Domain.cxx 2014-02-06 22:12:50 +01:00
Max Kellermann
7e34737b2b Makefile.am: add variable SMBCLIENT_SOURCES 2014-02-06 22:11:59 +01:00
Max Kellermann
af66ed2505 doc/user: document the RoarAudio output plugin 2014-02-06 21:46:29 +01:00
Max Kellermann
ea4068757d configure.ac: link the Vorbis encoder with libvorbis
Since the encoder plugin uses a libvorbis function (and not only
libvorbisenc functions), we need to link with libvorbis explicitly.
2014-02-06 21:32:50 +01:00
Max Kellermann
0a0659d737 mixer/Plugin: pass AudioOutput reference to init()
Passing a void pointer is unsafe.
2014-02-06 21:10:12 +01:00
Max Kellermann
b6df4680df MixerPlugin: convert function pointers to Mixer virtual methods 2014-02-06 20:52:33 +01:00
Max Kellermann
e04090b477 Mixer: delete the implicit copy constructor 2014-02-06 20:52:25 +01:00
Max Kellermann
c9fb6f7bdb Mixer: make the constructor "explicit" 2014-02-06 20:52:25 +01:00
Max Kellermann
ad6b05ae17 mixer/software: use IgnoreError() 2014-02-06 20:52:25 +01:00
Max Kellermann
29b18d9ab7 SongUpdate: use the Storage interface, support remote files
This commit finally allows the database update to scan remote files,
e.g. using the smbclient storage plugin.  However, it is not yet
possible to configure that, therefore the feature is not accessible
yet.
2014-02-06 19:06:08 +01:00
Max Kellermann
ad309cdeae SongUpdate: make variables more local 2014-02-06 18:58:56 +01:00
Max Kellermann
e4322a716c input/nfs: new plugin using libnfs 2014-02-06 18:37:27 +01:00
Max Kellermann
90886c0760 doc/user: sort input plugins 2014-02-06 18:37:27 +01:00
Max Kellermann
957beeb0e9 storage/smbclient: Storage implementation using libsmbclient 2014-02-06 07:19:14 +01:00
Max Kellermann
522ad4cca6 Instance: narrow "storage" to class Storage 2014-02-06 07:19:14 +01:00
Max Kellermann
dc76b24e5f storage/local: OpenDirectory() returns StorageDirectoryReader* 2014-02-05 19:35:41 +01:00
Max Kellermann
e3e3053f32 storage/Interface: explicitly delete copy constructors 2014-02-05 19:30:58 +01:00
Max Kellermann
c8c3f20840 storage/local: move to src/storage/plugins/ 2014-02-05 19:26:21 +01:00
Max Kellermann
f6682aae77 db/update: include StorageInterface.hxx instead of LocalStorage.hxx 2014-02-05 19:26:18 +01:00
Max Kellermann
0ba1b73395 storage: add abstract interface
Prepare for the plugin interface.
2014-02-05 18:53:51 +01:00
Max Kellermann
4c995eb498 db/UpdateWalk: move LocalStorage to Instance
Keep only a reference.
2014-02-05 17:58:13 +01:00
Max Kellermann
144cfe70bf db/update/Remove: initialize attribute "removed_song"
Fixes bogus assertion failure.
2014-02-05 17:58:13 +01:00
Max Kellermann
855f26c43d Mixer: use reference instead of pointer for MixerPlugin 2014-02-05 17:25:47 +01:00
Max Kellermann
f86e159536 Mixer: rename struct mixer_plugin to MixerPlugin 2014-02-05 17:22:34 +01:00
Max Kellermann
243c4e1e83 Main: remove unused global variable "main_thread" 2014-02-05 17:04:16 +01:00
Max Kellermann
9ae7f186bc LocalStorage: new API abstracting filesystem walk
Prepare to make this a new plugin API, for example to use a SMB share
for the music_directory.
2014-02-05 10:04:03 +01:00
Max Kellermann
f8d114be42 db/UpdateIO: add "pure" attributes 2014-02-05 10:04:03 +01:00
Max Kellermann
2c70251df1 db/UpdateGlue: relax assertion
Fixes assertion failure when update gets launched during MPD startup.
2014-02-05 10:04:03 +01:00
Max Kellermann
d380db25be Instance: add attribute "event_loop"
Replaces global variable "main_loop".
2014-02-05 00:09:36 +01:00
Max Kellermann
e8938b1069 MixerPlugin: add EventLoop& init() parameter 2014-02-05 00:02:02 +01:00
Max Kellermann
4a28333039 event/Loop: remove the dummy constructor argument 2014-02-05 00:00:03 +01:00
Max Kellermann
ad7f2b2aec test/ShutdownHandler: make the constructor "explicit" 2014-02-05 00:00:00 +01:00
Max Kellermann
ff665b37cb db/DatabaseListener: add method OnDatabaseSongRemoved()
Decouples db/update/Remove.cpp from global variables.
2014-02-04 19:53:37 +01:00
Max Kellermann
ce73843014 db/proxy: include cleanup 2014-02-04 19:53:12 +01:00
Max Kellermann
bae6f653d1 Instance: merge DatabaseModified() into OnDatabaseModified() 2014-02-04 19:17:22 +01:00
Max Kellermann
eec6d09959 db/update/Service: use DatabaseListener instead of Instance
Don't use the global variable "instance".
2014-02-04 18:54:54 +01:00
Max Kellermann
c5fa8ed321 db/update/Service: use EventLoop::IsInside()
Don't use the global variable "main_thread".
2014-02-04 18:54:45 +01:00
Max Kellermann
abc16b919d {Message,Neighbor}Commands: use Client::partition instead of Main.hxx 2014-02-04 11:35:23 +01:00
Max Kellermann
2de7cd32ea ClientMessage: undefine GetMessage on WIN32 2014-02-04 11:35:14 +01:00
Max Kellermann
098aa18538 GlobalEvents: remove obsolete event DELETE 2014-02-04 11:25:41 +01:00
Max Kellermann
cf6281a5a7 Instance: add Database attribute
Move from db/DatabaseGlue.cxx, eliminating global variable.
2014-02-04 11:22:33 +01:00
Max Kellermann
f00710a57e Main: create UpdateService instance in glue_db_init_and_load() 2014-02-04 11:22:32 +01:00
Max Kellermann
c953904343 db/update/Service: initialize "progress" and "update_task_id"
Database update was randomly broken due to these uninitialized
variables.
2014-02-04 11:22:13 +01:00
Max Kellermann
ddd36338da StateFile: pass Database to SongLoader
Fixes loading database songs from state file (regression by commit
29072797c).
2014-02-04 10:30:51 +01:00
Max Kellermann
d76b6f878e db/update/Service: add SimpleDatabase reference
Don't use the global variables from the DatabaseSimple library.
2014-02-04 09:05:32 +01:00
Max Kellermann
f25ef8d682 db/update/Walk: add Directory reference parameter
Remove dependency on the DatabaseSimple library.
2014-02-04 09:05:32 +01:00
Max Kellermann
33a2c01ea2 db/Simple: remove unused function db_get_directory() 2014-02-04 09:03:17 +01:00
Max Kellermann
9c637df77e SongSticker: add Database reference parameter 2014-02-04 01:15:08 +01:00
Max Kellermann
29072797ca db/DatabasePlaylist: pass Database reference around
Reduce global variable usage, move to frontend code.
2014-02-04 00:57:43 +01:00
Max Kellermann
db69ceade6 db/LightSong: make "real_uri" a pointer
Reduce overhead.  LightSong can always point to the "real" allocated
string.
2014-02-04 00:38:52 +01:00
Max Kellermann
b9c248e7e7 PlaylistFile: use class SongLoader 2014-02-03 23:50:19 +01:00
Max Kellermann
d533b59ee3 PlaylistFile: switch spl_append_uri() arguments
Playlist file name first, to be consistent with the other functions in
this library.
2014-02-03 23:33:25 +01:00
Max Kellermann
5ad2980d69 QueueSave: use class SongLoader 2014-02-03 23:32:31 +01:00
Max Kellermann
ca36ac2ba1 SongLoader: new class that merges duplicate code
There was quite a lot of duplicate code for loading DetachedSong
objects, with different semantics for "securely" loading local files.
2014-02-03 23:32:10 +01:00
Max Kellermann
ba675d6a55 FileCommands: use PathTraitsUTF8::IsAbsolute() 2014-02-03 23:31:28 +01:00
Max Kellermann
e4c5a4f61b PlaylistSave: remove redundant backslash conversion
This is already being done by FixSeparators(), called from
PathToUTF8().
2014-02-03 23:15:57 +01:00
Max Kellermann
a8e52ad89f ClientFile: move client_allow_file() into the Client class 2014-02-02 13:59:07 +01:00
Max Kellermann
8cf4fb53aa Playlist: pass Database to DatabaseModified()
Don't use global variable.
2014-02-01 00:45:58 +01:00
Max Kellermann
1769ae54e4 Partition: disable DatabaseModified() if not ENABLE_DATABASE 2014-02-01 00:44:41 +01:00
Max Kellermann
e545679265 Main: don't measure DatabaseGlobalDeinit() time
Useless information.
2014-02-01 00:39:42 +01:00
Max Kellermann
981080500b Stats: pass Database reference around
Call GetDatabase() only once.
2014-02-01 00:38:57 +01:00
Max Kellermann
636d28b784 Stats: remove obsolete "simple" plugin special case
The proxy plugin has now implemented the "idle" event listener.
2014-02-01 00:37:01 +01:00
Max Kellermann
188783ac1a Stats: return false if update has failed 2014-02-01 00:36:36 +01:00
Max Kellermann
ff650d50a2 Mapper: assert that Song::parent is not nullptr 2014-01-31 23:14:13 +01:00
Max Kellermann
78689645dc db/update/Archive: delete archive from database on error 2014-01-31 22:24:28 +01:00
Max Kellermann
26970579b8 db/update/Editor: add locking method variants 2014-01-31 22:17:49 +01:00
Max Kellermann
04b4f53488 db/update: convert runtime check to assertion 2014-01-31 21:59:35 +01:00
Max Kellermann
c310941f69 fs/AllocatedPath: add conversion constructor from Path 2014-01-30 23:36:57 +01:00
Max Kellermann
c02f146791 fs/DirectoryReader: GetEntry() returns Path, not AllocatedPath
Reduce overhead, don't duplicate the string.
2014-01-30 22:20:57 +01:00
Max Kellermann
a631200cca update/Walk: declare std::string at assignment
Reduce overhead.
2014-01-30 22:19:56 +01:00
Max Kellermann
6207a3f999 PlaylistFile: narrow LoadPlaylistFileInfo() API to accept Path 2014-01-30 22:17:35 +01:00
Max Kellermann
0bd01824f6 fs/AllocatedPath: add Build() overlays with Path arguments 2014-01-30 22:15:13 +01:00
Max Kellermann
4465e2c46b db: add compile-time option to disable database 2014-01-30 20:39:40 +01:00
Max Kellermann
34b309b99a OtherCommands: merge duplicate code from handle_update(), handle_rescan() 2014-01-30 20:39:40 +01:00
Max Kellermann
c6725884bc db/update: convert to OO API
Move global variables into the new classes.  That may allow multiple
update threads for multiple databases one day.
2014-01-30 18:47:05 +01:00
Max Kellermann
a31738f6f1 Main, OutputThread: increase kernel timer slack (Linux)
Allows the kernel to combine timer wakeups with other processes,
reducing power usage.
2014-01-30 18:43:40 +01:00
Max Kellermann
39a2867ea8 NEWS: mention thread names 2014-01-30 18:43:16 +01:00
Max Kellermann
468c3df82d NEWS: add "threads" section 2014-01-30 18:43:03 +01:00
Max Kellermann
d5b017407d ExcludeList: move to db/update/ 2014-01-30 10:11:12 +01:00
Max Kellermann
4b044bd8e1 InotifyUpdate: pass EventLoop to mpd_inotify_init() 2014-01-29 18:36:32 +01:00
Max Kellermann
aeaf64b467 Listen: pass EventLoop to listen_global_init()
Don't use global variables.
2014-01-29 18:32:28 +01:00
Max Kellermann
a137f817f5 db/Directory: move isRootDirectory() to Uri.hxx
Decouple command/OtherCommands.cxx from the "simple" database plugin.
2014-01-29 18:05:33 +01:00
Max Kellermann
ff87145537 sticker: don't use classes Directory and Song
Don't depend on the "simple" database plugin.  This fixes an assertion
failure / crash and allows using stickers with other plugins.
2014-01-29 17:45:07 +01:00
Max Kellermann
667481c371 OutputThread: move more functions into the AudioOutput class 2014-01-29 09:26:11 +01:00
Max Kellermann
af71605769 output: rename "chunk" to "current_chunk" 2014-01-29 09:23:57 +01:00
Max Kellermann
4657a3bd0f output: move functions into the AudioOutput struct 2014-01-29 08:10:46 +01:00
Max Kellermann
cb7366f472 AudioOutput: make "plugin" a reference 2014-01-29 08:10:36 +01:00
Max Kellermann
bf803e241f AudioOutput: pass plugin to constructor
Make it "const".
2014-01-29 08:10:18 +01:00
Max Kellermann
8a8d023f90 doc/user: add Debian build dependencies 2014-01-29 08:10:07 +01:00
Max Kellermann
5b3aa45e58 CommandLine: remove junk from string literal 2014-01-29 08:09:48 +01:00
Max Kellermann
c4403c523f AudioOutput: add constructor and destructor 2014-01-28 12:37:58 +01:00
Max Kellermann
07b89b2bad ConfigTemplates: rename "AudioOutput" back to "audio_output"
sed gone horribly wrong.  D'oh!
2014-01-28 12:37:58 +01:00
Max Kellermann
68b79f97f3 output: rename source files 2014-01-28 11:42:54 +01:00
Max Kellermann
815d72065c output: rename struct audio_output to AudioOutput 2014-01-28 11:34:09 +01:00
Max Kellermann
e0dc721324 OutputPlugin: rename struct audio_output_plugin to AudioOutputPlugin 2014-01-28 11:33:15 +01:00
Max Kellermann
2f873edc9c thread/Name: implementation for Mac OS X
pthread_setname_np() doesn't have the "thread" argument on OS X.
2014-01-28 11:33:15 +01:00
Max Kellermann
d5f46a846a Makefile.am: make libneighbor.a conditional
Fixes non-Linux build without neighbor plugins.
2014-01-28 11:27:32 +01:00
Max Kellermann
f5a923b9d1 OutputAll: convert to class, move instance to class Partition
Another big chunk of code for multi-player support.
2014-01-28 09:20:53 +01:00
Max Kellermann
36bab6ef06 configure.ac: detect libsmbclient without pkg-config
The pkg-config file has been added in Samba 4.0.  This commits adds a
fallback for older libsmbclient versions.
2014-01-27 15:00:44 +01:00
Max Kellermann
5273900b0e neighbor/smbclient: add splice_after() fallback for gcc 4.6 2014-01-27 14:59:15 +01:00
Max Kellermann
1451344221 configure.ac: check if -lrt is necessary for clock_gettime() 2014-01-27 14:59:15 +01:00
Max Kellermann
8ed9f779cd Makefile.am: build test/run_neighbor_explorer with AM_LDADD 2014-01-27 14:54:40 +01:00
Max Kellermann
f548a966f5 Playlist{Info,Vector}: move to db/ 2014-01-27 11:05:21 +01:00
Max Kellermann
67ad31b8b2 doc/developer: mention git pull requests 2014-01-27 10:44:27 +01:00
Max Kellermann
35f46eaa3f doc/developer: update number of contributors 2014-01-27 10:44:22 +01:00
Max Kellermann
ccfb125f02 doc/developer: add mailman page 2014-01-27 10:44:05 +01:00
Max Kellermann
f29e3ce8d5 doc/developer: explain clang static analyzer 2014-01-27 10:36:48 +01:00
Max Kellermann
bcb4646d6b doc/developer: tag for email address 2014-01-27 10:36:26 +01:00
Max Kellermann
5b8af30da1 autogen.sh: re-add $ACLOCAL_FLAGS, $AUTOMAKE_FLAGS 2014-01-27 10:35:37 +01:00
Max Kellermann
30fadaed7f Merge branch 'v0.18.x' 2014-01-27 10:33:42 +01:00
Max Kellermann
2b10ecfa37 IcyMetadataParser: more robust tag parser
Allow semicolons and single quotes in the stream title.  This is not
part of any specification, but found in real life.
2014-01-27 10:08:21 +01:00
Max Kellermann
f7eb2b697e test/test_icy_parser: unit test for IcyMetaDataParser.cxx 2014-01-27 09:51:31 +01:00
Max Kellermann
c01282a322 Makefile.am: remove "sparse" rule
We're C++, and sparse understands only plain C.
2014-01-27 09:29:34 +01:00
Max Kellermann
0e3f18ed70 Makefile.am: move test-suite.log back to base directory
Was broken on out-of-tree builds.
2014-01-27 09:28:08 +01:00
Max Kellermann
e5b1d30f1b autogen.sh: simplify, no versioned program names
This was just too complex and fragile.  Anybody who has versioned
program names shall just call those programs manually.
2014-01-27 09:25:15 +01:00
Max Kellermann
6746b751c4 autogen.sh: don't run aclocal with -I /usr/local/share/aclocal
I expect that aclocal is clever enough to find its own include
directories.  If it does not, letting MPD guess it is not the most
reliable idea either.
2014-01-27 09:13:11 +01:00
Max Kellermann
544c69c61c configure.ac: move autoconf/automake helpers to build/ 2014-01-27 09:01:02 +01:00
Max Kellermann
0ab66db7b9 move systemd unit to directory systemd/ 2014-01-27 08:55:42 +01:00
Max Kellermann
f7669c201f Makefile.am: fix "distcheck" 2014-01-27 08:55:42 +01:00
Max Kellermann
0b3fbdba87 neighbor/upnp: UPnP media server discovery 2014-01-26 15:51:33 +01:00
Max Kellermann
3dad837ca6 db/upnp: remove sleep(2) call
This call was unnecessary.  It is a bad idea anyway to block the MPD
process for some arbitrary amount of time.
2014-01-26 15:50:30 +01:00
Max Kellermann
d7e78059b0 upnp: initialize the client handle only once
Eliminate class LibUPnP and move the code to ClientInit.cxx.  Its
initialization function can be called multiple times, but
UpnpRegisterClient() is called at most once.
2014-01-26 15:43:23 +01:00
Max Kellermann
01f7abfc63 upnp: move library initialization to Init.cxx
Allow calling UpnpGlobalInit() multiple times.
2014-01-26 15:23:26 +01:00
Max Kellermann
e57e89b9d5 upnp/discovery: use a plain UpnpClient_Handle instead of class LibUPnP 2014-01-26 15:22:33 +01:00
Max Kellermann
bcc1f93370 upnp: add class UpnpCallback
Each Upnp*Async() call passes a new cookie pointer, and the cookie
passed to UpnpRegisterClient() appears to be ignored.  Using this
interface is a more elegant approach than having one single "handler"
function.
2014-01-26 15:04:56 +01:00
Max Kellermann
b161d72326 CueParser: don't "move" the filename
This invalidated the std::string instance, and thus broke the CUE
parser (commit 322b061632).
2014-01-26 14:58:23 +01:00
Max Kellermann
66c013682f upnp: remove obsolete global variable "theLib" 2014-01-26 13:54:48 +01:00
Max Kellermann
9f3ba737d6 upnp/Discovery: add listener interface 2014-01-26 13:41:40 +01:00
Max Kellermann
f86f5ad224 db/upnp: move generic code to lib/upnp/ 2014-01-26 13:41:40 +01:00
Max Kellermann
8b6b3ff28a neighbor/Glue: fix rollback range 2014-01-26 13:41:40 +01:00
Max Kellermann
4a3dc2cea2 db/upnp: rename variables 2014-01-26 13:08:52 +01:00
Max Kellermann
bd0cfffe23 neighbor/Info: add constructor 2014-01-26 13:07:53 +01:00
Max Kellermann
8c5ea7ec55 Makefile.am: add DespotifyUtils.cxx to libinput.a and libplaylist_plugins.a
Simplifies test program rules.
2014-01-26 13:04:14 +01:00
Max Kellermann
412d1b0a01 Makefile.am: use $(MKDIR_P) 2014-01-26 12:32:51 +01:00
Max Kellermann
642be502c0 NeighborCommands: convert assertion to runtime check 2014-01-26 01:17:49 +01:00
Max Kellermann
5c4a42caa0 neighbor: new subsystem to detect file servers on the local network
This commit adds the NeighborPlugin API which can be used to detect
nearby file servers that can be used by input plugins.  This list of
servers is exported using the new "listneighbors" command.  The idle
even "neighbor" notifies interested clients when a new neighbor is
found or an existing one is lost.

There's a lot missing currently: protocol&user documentation, and a
way to "mount" remote servers into the music database.  Obviously,
some code from the UPnP database plugin can be moved to a neighbor
plugin.
2014-01-26 00:10:05 +01:00
Max Kellermann
e847788569 lib/smbclient/Init: return empty username/password
This appears to be the right thing to do when we want anonymous login.
2014-01-26 00:08:50 +01:00
Max Kellermann
86ca5b3f16 input/smbclient: move code to lib/smbclient/Init.cxx 2014-01-25 23:29:42 +01:00
Max Kellermann
9b1fbdbca6 ConfigGlobal: add config_find_block()
Merge duplicate code.
2014-01-24 16:55:17 +01:00
Max Kellermann
97391fd4b9 DespotifyUtils, Expat: move to lib/ 2014-01-24 16:44:36 +01:00
Max Kellermann
68eda78704 Mixer*: move to mixer/ 2014-01-24 16:44:32 +01:00
Max Kellermann
7c52a1c04b Filter*: move to filter/ 2014-01-24 16:43:57 +01:00
Max Kellermann
9d34fc394c Database*: move to db/ 2014-01-24 16:38:44 +01:00
Max Kellermann
973c9872f9 Sticker*: move to sticker/ 2014-01-24 16:38:15 +01:00
Max Kellermann
eef7ba48dd Win32Main: move to win32/ 2014-01-24 16:37:32 +01:00
Max Kellermann
299ff2b23f move daemonization code to unix/ 2014-01-24 16:37:21 +01:00
Max Kellermann
f8bfea8bae Input*: move to input/ 2014-01-24 16:33:33 +01:00
Max Kellermann
e199c33c6e Client*: move to client/ 2014-01-24 00:26:53 +01:00
Max Kellermann
08296cd66d Update*: move to update/ 2014-01-24 00:24:43 +01:00
Max Kellermann
197b503f3e Config*: move to config/ 2014-01-24 00:20:01 +01:00
Max Kellermann
129eb178eb Queue*: move to queue/ 2014-01-24 00:17:50 +01:00
Max Kellermann
6b70f5e490 Zeroconf*: move to zeroconf/ 2014-01-24 00:14:54 +01:00
Max Kellermann
4aa6d39fd8 archive/*: move to archive/plugins/ 2014-01-24 00:09:37 +01:00
Max Kellermann
51adaf2c47 decoder/*: move to decoder/plugins/ 2014-01-24 00:02:24 +01:00
Max Kellermann
ea5b901bcc output/*: move to output/plugins/ 2014-01-23 23:49:50 +01:00
Max Kellermann
f1f19841bd playlist/*: move to playlist/plugins/ 2014-01-23 23:30:12 +01:00
Max Kellermann
655ad34414 Encoder*: move to src/encoder
.. and move the plugins to src/encoder/plugins/.
2014-01-23 23:09:14 +01:00
Max Kellermann
017eecb8e8 UPGRADING: remove obsolete file
This file has been unmaintained for 5 years, and nowadays, MPD tries
very hard to stay compatible with older versions.
2014-01-23 23:06:01 +01:00
Max Kellermann
b8e382b011 db/upnp/Discovery: use std::list instead of std::map
There will only be very few items, and that does not justify the bloat
of std::map.
2014-01-23 22:35:22 +01:00
Max Kellermann
c9af358e4b db/upnp/Discovery: move code to LockAdd(), LockRemove() 2014-01-23 22:35:22 +01:00
Max Kellermann
3afcfe3330 db/upnp/Discovery: un-inline the destructor 2014-01-23 22:35:22 +01:00
Max Kellermann
b521d8564a Makefile.am: always link test/dump_playlist with DetachedSong.cxx
Fixes linker failure.
2014-01-23 22:25:47 +01:00
Max Kellermann
53a13e8bc6 DetachedSong: un-inline the destructor
Reduce bloat.
2014-01-23 21:22:52 +01:00
Max Kellermann
f3f5e2e162 db/upnp: un-inline a few destructors
Reduce bloat.
2014-01-23 21:17:40 +01:00
Max Kellermann
ec41d849bb thread/Name: set thread names
For debugging.
2014-01-23 10:07:14 +01:00
Max Kellermann
1d547fe273 thread/Util: set the SCHED_RESET_ON_FORK flag in SetThreadRealtime() 2014-01-23 09:14:09 +01:00
Max Kellermann
b52d8fbebe db/upnp: strict vpath checks for the "root" directory 2014-01-23 00:40:39 +01:00
Max Kellermann
b61a2c722c db/upnp: move code to VisitObject() 2014-01-23 00:28:27 +01:00
Max Kellermann
c455d2c1de db/upnp: merge two PathTraitsUTF8::Build() calls 2014-01-23 00:25:08 +01:00
Max Kellermann
77070f5ab9 db/upnp: move code to VisitItem() 2014-01-23 00:17:38 +01:00
Max Kellermann
8d5f7160ac db/upnp: fix subdirectory paths in "listallinfo"
Add missing server name prefix.
2014-01-23 00:07:35 +01:00
Max Kellermann
b167ce2913 base_uri 2014-01-23 00:06:17 +01:00
Max Kellermann
3ac15ca8d1 db/upnp: pass char* to visitSong()
Don't use std::string, reduce bloat.
2014-01-23 00:06:03 +01:00
Max Kellermann
f703d4fc3e db/upnp: call VisitDirectory on servers, even in recursive mode 2014-01-22 23:52:08 +01:00
Max Kellermann
77c461fed7 db/upnp: make several methods "const" 2014-01-22 23:50:33 +01:00
Max Kellermann
a89c21b06a db/upnp: inline Configure() 2014-01-22 23:30:53 +01:00
Max Kellermann
b74aa6b14c db/upnp: don't duplicate song data for VisitSong
Not necessary because we control the LightSong's life cycle.
2014-01-22 23:28:23 +01:00
Max Kellermann
0c4a791111 db/upnp: emplace/move in csvToStrings() 2014-01-22 23:21:23 +01:00
Max Kellermann
1feedd4d9c db/upnp: require an empty token list in csvToStrings() 2014-01-22 23:21:14 +01:00
Max Kellermann
0ec1808956 db/proxy: simplify csvToStrings() 2014-01-22 23:17:42 +01:00
Max Kellermann
546e7cafa4 db/proxy: merge redundant string::push_back() calls 2014-01-22 23:13:24 +01:00
Max Kellermann
d9926a1c21 db/upnp: use PathTraitsUTF8::Build() 2014-01-22 23:10:00 +01:00
Max Kellermann
e50969e31c db/proxy: fix for libmpdclient < 2.9 2014-01-22 23:09:36 +01:00
Max Kellermann
a6d9998e1d db/proxy: copy "Last-Modified" from remote directories 2014-01-22 23:07:21 +01:00
Max Kellermann
a42f9e4ee3 LightDirectory: new struct replacing Directory in the DB API 2014-01-22 23:01:32 +01:00
Max Kellermann
f16db6cd80 DatabasePrint: don't print zero mtime
Zero means "unknown".
2014-01-22 23:01:32 +01:00
Max Kellermann
4943606f4a db/upnp: append characters instead of single-character strings 2014-01-22 21:55:58 +01:00
Max Kellermann
87629dda81 db/upnp: use string::push_back() instead of string::append() 2014-01-22 21:55:08 +01:00
Max Kellermann
71928b473e db/upnp/Discovery: unlock mutex before deleting DiscoveredTask 2014-01-22 21:48:33 +01:00
Max Kellermann
a0bee9fa0a db/upnp/Discovery: eliminate two strlen() calls 2014-01-22 21:47:34 +01:00
Max Kellermann
0defd927f3 db/upnp: use std::list instead of std::set for SearchCapabilities
Reduce bloat.  We never used the set lookup.
2014-01-22 21:41:05 +01:00
Max Kellermann
6c41e8f63f db/upnp: check offset<total at end of loop 2014-01-22 21:37:21 +01:00
Max Kellermann
fa67a4e956 db/upnp: break when zero objects have been returned 2014-01-22 21:37:19 +01:00
Max Kellermann
bf9352fb26 db/upnp: free responses manually 2014-01-22 21:33:54 +01:00
Max Kellermann
7573d4e1ba db/upnp: break when count==0
Make this non-fatal.  Just stop reading more objects.
2014-01-22 21:33:19 +01:00
Max Kellermann
bfb483898f db/upnp: use ParseUnsigned() instead of atoi() 2014-01-22 21:11:04 +01:00
Max Kellermann
f363788d76 db/upnp: pass unsigned integers to readDirSlice() 2014-01-22 20:57:10 +01:00
Max Kellermann
714056f157 db/upnp: inline ContentDirectoryService::readDirSlice() 2014-01-22 20:42:36 +01:00
Max Kellermann
1abc96fa27 db/upnp: remove special case for "*"
Passing this to csvToStrings() will do the same.
2014-01-22 20:37:17 +01:00
Max Kellermann
0fa98479ad db/upnp: obtain char* from ixmlwrap::getFirstElementValue()
Fixes crash when there's no SearchCaps element.
2014-01-22 20:26:33 +01:00
Max Kellermann
02f2171010 db/upnp/Util: pass char* to csvToStrings() 2014-01-22 20:24:55 +01:00
Max Kellermann
a5e7d0a90f db/upnp: require an empty input capability set 2014-01-22 20:21:01 +01:00
Max Kellermann
9fb5134f64 db/upnp/Util: handle absolute URI paths properly in caturl()
Fixes problems with some UPnP servers.
2014-01-22 19:38:07 +01:00
Max Kellermann
9aeb23dfe9 db/upnp/Util: use string::back(), string::front() 2014-01-22 19:38:02 +01:00
Max Kellermann
e59d8c9378 db/upnp/Device: clear the "value" pointer on unknown element
Avoid appending to an obsolete string object.
2014-01-22 19:38:02 +01:00
Max Kellermann
0616667688 Main: glue_mapper_init() returns true if GetUserMusicDir() fails
Not a fatal error.  Fixes assertion failure.
2014-01-22 16:28:19 +01:00
Max Kellermann
9747cc9e58 db/upnp/Device: replace std::vector with a std::string pointer 2014-01-22 09:55:51 +01:00
Max Kellermann
7b44dea4b1 db/upnp/Device: remove unused UPnPService attributes 2014-01-22 09:51:26 +01:00
Max Kellermann
18aea922e9 db/upnp/Directory: "emplace" items into the vector 2014-01-22 09:43:49 +01:00
Max Kellermann
7d194aceb6 db/upnp/Device: emplace/move the UPnPService into the vector
Reduce overhead.
2014-01-22 09:42:46 +01:00
Max Kellermann
2722b8a3df db/upnp/Util: "emplace" items into the list
Reduce overhead.
2014-01-22 09:40:38 +01:00
Max Kellermann
fd754ff8f8 db/upnp/Directory: replace std::vector with a simple enum
Reduce bloat.
2014-01-22 09:32:11 +01:00
Max Kellermann
b7738e7af3 db/upnp/Directory: join all CDATA nodes for tag values
Expat can call CharacterData() multiple times if the CDATA contains
entity references.  We need to collect all of them in one large
string.
2014-01-22 08:44:35 +01:00
Max Kellermann
99bebabac9 db/upnp/Directory: make "m_dir" private 2014-01-22 08:44:20 +01:00
Max Kellermann
0ed48b364a db/upnp: merge duplicate branches in Namei() 2014-01-21 23:42:02 +01:00
Max Kellermann
b38b8b9c18 db/upnp: simplify Namei() 2014-01-21 23:37:27 +01:00
Max Kellermann
5434856136 db/upnp: use std::list instead of std::vector
Reduce overhead.
2014-01-21 23:33:28 +01:00
Max Kellermann
aa1eb2f40d db/upnp: use iterator in Namei() 2014-01-21 23:32:42 +01:00
Max Kellermann
7260d7883c db/upnp: move "objid" declaration down
Don't allocate the object when it's not needed.
2014-01-21 23:10:30 +01:00
Max Kellermann
154250f551 db/upnp: eliminate redundant Namei() parameter "oobjid"
The caller should better obtain the object id from the returned
UPnPDirObject instance.
2014-01-21 23:07:33 +01:00
Max Kellermann
3e4fb92cfb db/upnp: remove redundant objid.empty() check from VisitServer()
If Namei() succeeds, the object id is guaranteed to be set.
2014-01-21 23:07:06 +01:00
Max Kellermann
0da713e278 db/upnp: use std::move() to extract server name
Reduce runtime overhead.
2014-01-21 22:57:54 +01:00
Max Kellermann
94cb1545b3 db/upnp: use vector::front() instead of [0] 2014-01-21 22:57:16 +01:00
Max Kellermann
411527a240 db/upnp: don't use stringToTokens() in ParseDuration()
Reduce bloat.
2014-01-21 22:52:12 +01:00
Max Kellermann
7777057d35 db/upnp: don't construct redundant empty vector<string> in Visit()
We know already that vpath is empty, let's use this instance.
2014-01-21 22:47:57 +01:00
Max Kellermann
dc5ef9ad01 db/upnp: simplify GetSong() 2014-01-21 22:43:04 +01:00
Max Kellermann
7471f65d95 LightSong: add attribute "real_uri"
The UPnP database plugin can now show relative song URIs for remote
songs.
2014-01-21 21:08:11 +01:00
Max Kellermann
5d4b450c52 DetachedSong: add attribute "real_uri"
Prepare for UPnP songs that retain there database identity.
2014-01-21 21:06:56 +01:00
Max Kellermann
483b1f51c9 DetachedSong: remove parameter names from "defaulted" constructors
Suppresses gcc warnings.
2014-01-21 21:06:56 +01:00
Max Kellermann
ecac7a629e db/upnp: fix empty song URI
Fall back to UPnPDirObject::url if there is no override.
2014-01-21 21:02:21 +01:00
Max Kellermann
21209ff46b DetachedSong: use "default" copy/move constructors
Remove unnecessary explicit code.
2014-01-21 20:38:13 +01:00
Chase Geigle
716bdc36fd pcm/SoxrResampler: Add configurable quality levels 2014-01-21 20:35:26 +01:00
Max Kellermann
4f120f3714 PlaylistSong: modify the given song object in-place
Reduce bloat.
2014-01-21 00:28:37 +01:00
Max Kellermann
dd20a3ce7e test: add unit test for playlist_check_translate_song() 2014-01-21 00:28:34 +01:00
Max Kellermann
c727c86245 PlaylistSong: remove redundant "secure" check
This has been verified already in the caller.
2014-01-21 00:28:32 +01:00
Max Kellermann
82b4ec22be PlaylistSong: recurse after applying base_uri
Allows applying map_to_relative_path() with base_uri.
2014-01-20 23:47:43 +01:00
Max Kellermann
501f1e6de0 PlaylistSong: remove the IsInDatabase() check
No caller passes a database song to this function, but if he does,
this check doesn't make sense.
2014-01-20 23:32:03 +01:00
Max Kellermann
414d5b648c PlaylistSong: don't map relative URI to absolute path
This didn't make sense.
2014-01-20 23:31:08 +01:00
Max Kellermann
a237e7f860 CommandLine: show the current git tag and commit id 2014-01-20 23:31:08 +01:00
Max Kellermann
07a3bef25c PlaylistSong: pass reference variables internally 2014-01-20 19:57:26 +01:00
Max Kellermann
da67260c95 new developer mailing list 2014-01-20 17:20:57 +01:00
Max Kellermann
2f51285349 Merge branch 'v0.18.x' 2014-01-20 09:05:36 +01:00
Max Kellermann
ab9c9068d4 Queue: rename struct queue to Queue
Works around a build failure on Solaris because annoyingly, Solaris
reserves the name "queue".  This rename was pending anyway.
2014-01-20 08:57:46 +01:00
Max Kellermann
6b4d7d7315 Queue: make the constructor "explicit" 2014-01-20 08:57:41 +01:00
Max Kellermann
64465c1318 Song: make the "parent" attribute mandatory
The Song class is only used for database songs now.  A Song without a
Directory is not possible anymore.
2014-01-19 23:16:09 +01:00
Max Kellermann
a506adea41 Directory: use Song::Export() 2014-01-19 23:16:08 +01:00
Max Kellermann
f5ae1ce00b LightSong: new class to be used by DatabasePlugin callbacks
Detach the Song class completely from the public API, only to be used
by SimpleDatabase and the update thread.
2014-01-19 17:04:51 +01:00
Max Kellermann
738d6f1040 db/proxy: simplify error handling in GetSong()
Check mpd_response_finish() before using mpd_song.  Don't skip this
check even if the mpd_song is non-nullptr.
2014-01-19 11:37:42 +01:00
Max Kellermann
ba372197fb db/simple: make borrowed_song_count "mutable"
Simpler to use than const_cast.
2014-01-19 11:23:02 +01:00
Max Kellermann
bde27ccec3 Tag: pack attributes tighter
This saves another 3% memory.
2014-01-19 03:11:01 +01:00
Max Kellermann
d2cf74027c Song: embed the Tag object statically into class Song
Reduces overhead because we need to manage only one memory allocation.
According to valgrind/massif, we save 7%.
2014-01-19 02:58:55 +01:00
Max Kellermann
bc966577ff Song: use the VarSize library 2014-01-18 19:24:55 +01:00
Max Kellermann
fdf4dff561 db/upnp: move Tag from UPnPDirObject to Song
The UPnPDirObject is a temporary object, we can move its contents.
This reduces runtime overhead.
2014-01-18 19:09:42 +01:00
Max Kellermann
fab6cbed75 db/upnp/Discovery: eliminate attribute "last_seen" 2014-01-18 16:28:12 +01:00
Max Kellermann
051eede1ed db/upnp/Discovery: use monotonic clock instead of time() 2014-01-18 16:26:11 +01:00
Max Kellermann
0696cac50b db/upnp/Discovery: eliminate full copy in getServer() 2014-01-18 16:18:51 +01:00
Max Kellermann
0c2485e86c db/upnp: use getServer() in Visit()
Reduce bloat.
2014-01-18 16:13:33 +01:00
Max Kellermann
7d696a7063 db/upnp/Discovery: eliminate Error attribute
Move code to method Start() and add Error& parameters to several
methods.
2014-01-18 16:08:30 +01:00
Max Kellermann
53573e950f db/upnp: remove unnecessary m_superdir nullptr checks 2014-01-18 16:02:21 +01:00
Max Kellermann
1e99983263 db/upnp: pass ContentDirectoryService references 2014-01-18 15:58:02 +01:00
Max Kellermann
5409e43fb5 db/upnp: cache m_path.back() 2014-01-18 15:44:41 +01:00
Max Kellermann
f33f891c54 db/upnp: add UpnpMakeAction() helper function 2014-01-18 15:27:54 +01:00
Max Kellermann
6e55552292 db/upnp/ixmlwrap: getFirstElementValue() returns const char *
Eliminate the std::string bloat.
2014-01-18 15:01:19 +01:00
Max Kellermann
e569f82dd3 db/upnp: merge duplicate nullptr check 2014-01-18 14:44:06 +01:00
Max Kellermann
1a4940bbda db/upnp: free IXML_Document *request manually 2014-01-18 14:38:52 +01:00
Max Kellermann
22dd3c8048 db/upnp/Device: move code to method Parse()
Forward the Error to the caller.
2014-01-18 14:29:31 +01:00
Max Kellermann
04b7648e00 db/upnp/Device: use ContentDirectoryDescriptor's move operator
Reduce bloat.
2014-01-18 14:26:24 +01:00
Max Kellermann
be0759d465 db/upnp/Discovery: don't copy XML to std::string
Pass "const char *" to Expat.
2014-01-18 14:24:38 +01:00
Max Kellermann
339d939873 db/upnp/Discovery: fix memory leak 2014-01-18 14:03:18 +01:00
Max Kellermann
c1950e40e6 db/upnp: remove unused typedef DevServIt 2014-01-18 13:42:54 +01:00
Max Kellermann
ad76bad8fd db/upnp: use move operator to assign XML CDATA
Reduce runtime bloat.
2014-01-18 13:39:31 +01:00
Max Kellermann
55737e4ff6 db/upnp/Util: trimstring() constructs string from buffer
Reduce overhead by omitting the part of the buffer that consists only
of whitespace.
2014-01-18 13:36:50 +01:00
Max Kellermann
f3b4ddee6c db/upnp/Discovery: free the response body
Memory leak.
2014-01-18 13:08:48 +01:00
Max Kellermann
758b504cf3 db/upnp/Discovery: don't copy the response body
Bloat.
2014-01-18 13:07:42 +01:00
Max Kellermann
416f7c2600 db/upnp: don't hold mutex while downloading device description
Must not perform blocking I/O while holding a mutex.
2014-01-18 13:04:01 +01:00
Max Kellermann
b9f02f22c4 db/upnp: don't use WorkQueue for _ADVERTISEMENT_BYEBYE
Remove the ContentDirectoryDescriptor right away.  Reduces bloat.
2014-01-18 12:56:35 +01:00
Max Kellermann
b635610409 db/upnp: include cleanup 2014-01-18 12:51:25 +01:00
Max Kellermann
d4d4d6217f db/upnp: don't use LazyDatabase
Now that MPD forks early, this workaround is obsolete.
2014-01-18 12:48:28 +01:00
Max Kellermann
be47320a05 Daemon: fork as early as possible
Keep the parent process around until MPD has finished initializing.

This is important for libraries that are allergic to fork(), such as
libupnp.
2014-01-18 12:42:30 +01:00
Max Kellermann
9f3ce7551a PidFile: open in write-only mode 2014-01-18 12:42:12 +01:00
Max Kellermann
5f3b79e21d Daemon: move code to class PidFile 2014-01-18 12:10:20 +01:00
Max Kellermann
56c12bd1ea Daemon: don't use daemon(), always require fork()
Prepare for more advanced daemonization code, which will not work with
daemon().  Let's just require fork().  Everybody who supports daemon()
also supports fork().
2014-01-18 11:46:28 +01:00
Max Kellermann
3a6da7c594 Main: make variables more local 2014-01-18 11:34:13 +01:00
Max Kellermann
9909a80d6a Main: eliminate variable "success" 2014-01-18 11:20:20 +01:00
Max Kellermann
a52cae1dba pcm/Volume: make DSD a no-op
Kludge to work around DSD playback failure because the
ReplayGainFilterPlugin is always in the filter chain.
2014-01-17 23:57:30 +01:00
Max Kellermann
61b01f82ef Mapper: add function map_song_detach()
Make the DetachedSong(Song) conversion constructor private.  Everybody
should use map_song_detach() which will take over more
responsibilities soon.
2014-01-17 23:51:14 +01:00
Max Kellermann
75b847132a QueueSave: use DatabaseDetachSong() 2014-01-17 23:49:53 +01:00
Max Kellermann
32ec672311 DatabaseSong: new library merging duplicate code 2014-01-17 22:58:27 +01:00
Max Kellermann
e2812f722d db/upnp/Discovery: move callbacks and data structures into class
Eliminate global variables.
2014-01-17 10:13:04 +01:00
Max Kellermann
aa64a5328e db/upnp: split cluCallback() 2014-01-17 09:46:51 +01:00
Max Kellermann
59510f509a db/upnp: add local reference variables
Prepare to refactor some code.
2014-01-17 00:17:20 +01:00
Max Kellermann
a35c7bc81a db/upnp: move the LibUPnP instance to class UpnpDatabase
Delete the object when closing the database.
2014-01-16 09:30:24 +01:00
Max Kellermann
02769929b3 db/upnp: remove useless static Mutex 2014-01-16 09:29:11 +01:00
Max Kellermann
1a09003a6e db/upnp: move the UPnPDeviceDirectory instance to class UpnpDatabase
Delete the object when closing the database.
2014-01-16 09:08:04 +01:00
Max Kellermann
a827714823 db/upnp: don't initialize attributes to nullptr
Not necessary, these are not used.
2014-01-16 09:07:52 +01:00
Max Kellermann
8f9e76ca42 db/upnp: remove redundant m_root nullptr checks 2014-01-16 08:51:39 +01:00
Max Kellermann
478ace984a db/upnp/WorkQueue: use emplace() and std::move() 2014-01-16 08:46:41 +01:00
Max Kellermann
028fd268b8 db/upnp/WorkQueue: simplify start() 2014-01-16 08:43:57 +01:00
Max Kellermann
876a095166 Directory: initialize "mtime" and "have_stat" 2014-01-15 18:53:53 +01:00
Max Kellermann
14c3ff58a4 db/upnp/WorkQueue: fix pthread_t[] allocation size
Was using the wrong variable.
2014-01-15 18:51:10 +01:00
Max Kellermann
2819b302c3 db/upnp/Object: remove obsolete attribute "m_title" 2014-01-15 18:36:01 +01:00
Max Kellermann
9fb82f9687 DetachedSong: add method Update()
Don't create an intermediate Song instance when all we want is a
DetachedSong.
2014-01-15 12:05:44 +01:00
Max Kellermann
df80deb070 DetachedSong: remove misplaced std::move() 2014-01-15 11:52:17 +01:00
Max Kellermann
5fb72d7c8f Merge branch 'v0.18.x' 2014-01-15 11:47:49 +01:00
Max Kellermann
313d1d5d83 decoder/ffmpeg: support libav v10_alpha1 2014-01-15 11:33:18 +01:00
Max Kellermann
b7d6133593 decoder/ffmpeg: include cleanup 2014-01-15 11:31:51 +01:00
Max Kellermann
5b6bb114ad decoder/ffmpeg: check for av_samples_get_buffer_size() errors
Fixes potential nullptr dereference.
2014-01-15 11:25:58 +01:00
Max Kellermann
56f082c9d4 util/PeakBuffer: fix nullptr dereference when peak_size==0 2014-01-15 11:24:29 +01:00
Max Kellermann
a1b798e555 SongFilter, TagConfig: cast TAG_NUM_OF_ITEM_TYPES to integer
Fixes clang warning.
2014-01-15 11:23:41 +01:00
Max Kellermann
c91e08fbfd OutputAPI: fix typo in include guard 2014-01-15 11:22:59 +01:00
Max Kellermann
f882434547 configure.ac: prepare for 0.18.8 2014-01-15 11:22:06 +01:00
Max Kellermann
f1ca17f6a1 decoder/ffmpeg: check for av_samples_get_buffer_size() errors
Fixes potential nullptr dereference.
2014-01-14 23:16:07 +01:00
Max Kellermann
fe7cda57e4 util/PeakBuffer: fix nullptr dereference when peak_size==0 2014-01-14 23:07:04 +01:00
Max Kellermann
a3f9abcbd1 SongFilter, TagConfig: cast TAG_NUM_OF_ITEM_TYPES to integer
Fixes clang warning.
2014-01-14 22:40:07 +01:00
Max Kellermann
77041e2cd2 input/alsa: fix memory leak
Don't duplicate the MIME type when it gets passed to a std::string.
2014-01-14 22:38:30 +01:00
Max Kellermann
14235f171b decoder/sidplay: use free() instead of g_free()
This pointer was allocated by libc, not by GLib.
2014-01-14 22:35:07 +01:00
Max Kellermann
1f90e3ce7f playlist/extm3u: allocate Tag instance on the stack
Automate the life cycle, making the code safer.
2014-01-14 22:33:31 +01:00
Max Kellermann
676d8bb624 db/upnp/Object: add attribute "tag"
Replaces "m_title" and "m_props".  More bloat removed.
2014-01-14 22:33:18 +01:00
Max Kellermann
4bcaf5d306 db/upnp: move upnp_tags to Tags.cxx 2014-01-14 22:33:18 +01:00
Max Kellermann
70d3ad3ca1 OutputAPI: fix typo in include guard 2014-01-14 22:33:18 +01:00
Max Kellermann
46debfb8b5 db/upnp/Object: disallow copying, always move
Reduce bloat.
2014-01-14 14:11:07 +01:00
Max Kellermann
9a4b572d34 db/upnp: getTagValue() returns string pointer
Reduce bloat.
2014-01-14 13:42:08 +01:00
Max Kellermann
ddc75cc46b db/upnp/Directory: merge m_containers and m_items
There is no use in duplicating these containers.  It only means that
we have to search both, duplicating the code.
2014-01-14 13:37:21 +01:00
Max Kellermann
dafd0bc49a db/upnp: pass const reference to getTagValue() 2014-01-14 13:37:05 +01:00
Max Kellermann
2cb912e4f4 db/upnp: Namei() returns error when no object was found
Don't fail silently.
2014-01-14 12:34:49 +01:00
Max Kellermann
91a513e87d db/upnp/Directory: eliminate one std::string copy with std::move() 2014-01-14 12:27:21 +01:00
Max Kellermann
efdb41f2a6 db/upnp/Object: add attribute "name"
Call titleToPathElt() only once for each object.
2014-01-14 12:22:37 +01:00
Max Kellermann
26b850c15c db/upnp: use std::replace() in titleToPath() 2014-01-14 12:15:21 +01:00
Max Kellermann
9941735ae7 db/upnp: pass std::string to titleToPathElt() 2014-01-14 12:03:36 +01:00
Max Kellermann
29e5dc4413 db/upnp: don't sanitize the title tag
We need this only for path names.
2014-01-14 12:00:58 +01:00
Max Kellermann
3a660c5527 db/upnp/WorkQueue: remove unused attributes "high", "low" 2014-01-14 11:49:42 +01:00
Max Kellermann
738991494a db/upnp/WorkQueue: initialize "ok" to false, eliminate redundant checks 2014-01-14 11:48:19 +01:00
Max Kellermann
ee4c3ff1b8 db/upnp/WorkQueue: remove IsOK() check from put()
Not necessary, not worth the check.
2014-01-14 11:46:18 +01:00
Max Kellermann
60486bcc46 db/upnp/WorkQueue: remove redundant n_workers_exited check from IsOK() 2014-01-14 11:43:18 +01:00
Max Kellermann
79eed5182e db/upnp/WorkQueue: include cleanup 2014-01-14 11:41:28 +01:00
Max Kellermann
5de0f3f36a db/upnp/WorkQueue: remove unnecessary "waiting" attributes 2014-01-14 11:38:48 +01:00
Max Kellermann
9f316e11bd db/upnp/WorkQueue: remove unused method waitIdle()
Contrary to setTerminateAndWait()'s documentation, the method does
wait for worker threads to exit via pthread_join().
2014-01-14 11:31:49 +01:00
Max Kellermann
c6d8f6da70 db/upnp/WorkQueue: use array instead of std::list
Reduce bloat further.
2014-01-14 11:23:13 +01:00
Max Kellermann
73fd98b82e db/upnp/WorkQueue: use std::list instead of std::unordered_map
Reduce bloat.
2014-01-14 11:11:08 +01:00
Max Kellermann
6cb725391d db/upnp/WorkQueue: rename attributes 2014-01-14 11:07:06 +01:00
Max Kellermann
c13facdaca db/upnp/WorkQueue: pass reference to take() 2014-01-14 11:07:00 +01:00
Max Kellermann
e259474362 db/upnp/WorkQueue: remove unused method qsize() 2014-01-14 11:06:55 +01:00
Max Kellermann
7740855a78 db/upnp/WorkQueue: remove unused "szp" parameter from take() 2014-01-14 11:06:43 +01:00
Max Kellermann
d605170f9f db/upnp/WorkQueue: remove unused statistics 2014-01-14 10:51:33 +01:00
Max Kellermann
4734af747b OutputThread: use real-time priority 2014-01-14 09:59:04 +01:00
Max Kellermann
5d17731b73 UpdateGlue: let the update thread run at "idle" priority
The update thread should not affect the rest of the system, therefore
set "idle" priority, and let it only run when nobody else is using the
resources.
2014-01-14 09:09:52 +01:00
Max Kellermann
07a7fde825 Merge branch 'shine' of git://github.com/ekroth/mpd 2014-01-13 22:54:15 +01:00
Max Kellermann
049abef2d4 input/despotify: change name to "despotify"
The name "spt" didn't make much sense for this plugin.
2014-01-13 22:35:30 +01:00
Max Kellermann
7c60b50a39 CommandLine: print list of database plugins 2014-01-13 22:31:55 +01:00
Max Kellermann
4f83c60296 copyright year 2014 2014-01-13 22:31:55 +01:00
Andrée Ekroth
cd5817b67e encoder/shine: fix segfault workaround
Initializing and closing the Shine library without
writing any data results in a segmentation fault.
The current workaround writes zeroes if there was
no actual data.
2014-01-13 22:28:29 +01:00
Max Kellermann
a4d580a6f8 db/upnp: add fallback for emplace()
The method emplace() was added in gcc 4.8.  This commit restores
compatibility with gcc 4.7.
2014-01-13 22:24:48 +01:00
Max Kellermann
ca43e634b5 db/upnp: use std::function for the libupnp callback
Replaces the bloated std::map.
2014-01-13 22:24:02 +01:00
Max Kellermann
85324f80fe db/upnp: fix "upnp:class" parser
"upnp:class" is an element, not an attribute of element "item".  This
fixes a regression from commit 65ebfb16
2014-01-13 22:23:00 +01:00
Andrée Ekroth
56a7fcf189 encoder/shine: remove unnecessary buffer
Now writes to the de-interleaved buffers directly,
instead of writing to an intermediate fifo buffer.

Fix indentation and 80 char width lines.
2014-01-13 17:55:12 +01:00
Max Kellermann
8cd15a02cd Merge tag 'release-0.18.7' 2014-01-13 11:52:35 +01:00
Max Kellermann
05ad335ae9 release v0.18.7 2014-01-13 11:39:27 +01:00
Andrée Ekroth
ea771c17c5 Shine encoding plugin
This encoding plugin features a fixed-point mp3 encoder,
with faster encoding on architectures without a FPU.

Right now the encoder is limited to stereo and 16 bit depth.
The bitrate and sample rate can be modified in audio_output.

audio_output {
        type            "httpd"
        name            "My shine stream"
        encoder         "shine"
        port            "8000"
        format          "44100:16:2"
        bitrate         "320"  # default: 128
}
2014-01-13 11:14:19 +01:00
Max Kellermann
7faeb2ff2b configure.ac: reject libmpcdec SV7 in configure script
Look for symbol "mpc_demux_init" which does not exist in SV7.  This
avoids build failures when SV7 was found by configure.ac.
2014-01-11 21:02:12 +01:00
Max Kellermann
65ebfb16c9 db/upnp/Directory: parse item_class in StartElement
Don't add to the std::map.
2014-01-11 01:40:21 +01:00
Max Kellermann
44a65fc5de db/upnp/Object: add attribute "url"
Don't store in the std::map.
2014-01-11 01:36:08 +01:00
Max Kellermann
f031eb1ef2 db/upnp/Directory: parse duration
Don't put all <res/> attributes to the attributes map; parse the
"duration" attribute as soon as we receive it, and store it in an
integer attribute.  This reduces bloat.
2014-01-11 01:31:13 +01:00
Max Kellermann
b50d79542c db/upnp: move stringToTokens() to Util.cxx 2014-01-11 01:30:05 +01:00
Max Kellermann
8351543c0f db/upnp: move lazy Open() call to new class LazyDatabase
Generic approach for the workaround.
2014-01-11 01:25:22 +01:00
Max Kellermann
8add78ed5e db/upnp/discovery: convert std::strings to const char *
Reduce bloat.
2014-01-11 01:21:54 +01:00
Max Kellermann
4b3a3d6faa db/upnp: remove unnecessary Mutex 2014-01-11 01:16:35 +01:00
Max Kellermann
71d012fa61 db/proxy: forward "idle" events
Send "idle" to the other MPD whenever there's nothing else to do and
forward incoming "idle database" events to all our MPD clients.
2014-01-11 01:11:19 +01:00
Max Kellermann
114df1f137 DatabasePlugin: add interface DatabaseListener
Allow database plugins to announce that they have been modified.
2014-01-11 01:01:54 +01:00
Max Kellermann
00adf7ff17 db/proxy: move code to Disconnect() 2014-01-11 00:46:33 +01:00
Max Kellermann
3f0415fa24 UpdateGlue: move stats_invalidate() call to Instance::DatabaseModified() 2014-01-11 00:46:33 +01:00
Max Kellermann
348d0c944e Stats: lazy initialization
Ask the DatabasePlugin for stats when the first client requests them,
not at startup.
2014-01-10 23:42:46 +01:00
Max Kellermann
e9ba5fcaf3 db/upnp: remove unused method setMaxContentLength() 2014-01-10 23:04:50 +01:00
Max Kellermann
48097745f6 db/upnp: remove "upnplog" option
We have removed all libupnp logging calls, and we don't need to debug
libupnp.
2014-01-10 23:00:27 +01:00
Max Kellermann
1091ca969f db/upnp: remove unused macro PLOGINF() 2014-01-10 23:00:18 +01:00
Max Kellermann
09d62cc630 db/upnp: remove unused method errAsString() 2014-01-10 23:00:10 +01:00
Max Kellermann
a2ead993e6 db/upnp/Device: remove unused attribute "m_tabs" 2014-01-10 23:00:03 +01:00
Max Kellermann
b330aa8dd5 db/upnp: remove unnecessary empty string checks from CharacterData() 2014-01-10 22:59:46 +01:00
Max Kellermann
1b8053a618 db/upnp/Directory: simplify checkobjok() 2014-01-10 22:59:28 +01:00
Max Kellermann
70e5ab3fde db/upnp/Directory: don't log unknown items 2014-01-10 22:59:16 +01:00
Max Kellermann
f4490f6918 db/upnp/Directory: eliminate the "attributes" std::map
Look up attributes in the "atts" array.  Reduce bloat.
2014-01-10 22:59:01 +01:00
Max Kellermann
dadd987bf4 db/upnp/Directory: move "res" attributes to array
Reduce bloat.
2014-01-10 22:58:37 +01:00
Max Kellermann
a1ced29279 db/upnp: use nullptr-terminated array
Reduce bloat.
2014-01-10 22:58:23 +01:00
Max Kellermann
791d6c1336 db/upnp/Directory: eliminate struct StackEl, use std::string
Reduces bloat.
2014-01-10 22:57:57 +01:00
Max Kellermann
10abb07960 db/upnp/Directory: make "attributes" a local variable
We only need it inside StartElement().  Reduces bloat.
2014-01-10 22:57:46 +01:00
Max Kellermann
040a5ddad5 db/upnp/Directory: move "res" tag handler to StartElement()
No need to handle this in EndElement() - in StartElement(), we already
have all we need.
2014-01-10 22:57:22 +01:00
Max Kellermann
e7eb04954d db/upnp/Directory: don't use std::map to parse upnp:class
Reduce excessive bloat.
2014-01-10 22:57:16 +01:00
Max Kellermann
09b00fa4e3 db/upnp/Object: use strictly-typed enums
At the same time, rename the enum types and the class attributes, and
add an "UNKNOWN" type/class.  The latter avoids the "-1" hack.
2014-01-10 22:56:52 +01:00
Max Kellermann
74842fd6d4 db/upnp: getprop() returns const char *
Return the return value, instead returning it in a reference
parameter.  Reduces bloat by reducing unnecessary std::string usage.
2014-01-10 22:56:45 +01:00
Max Kellermann
f23b47ba17 Expat: attributes come in name/value pairs (bug fix)
I wrongfully assumed that each array element is a name and a value
concatenated.
2014-01-10 22:56:28 +01:00
Max Kellermann
15eedfbb12 db/upnp: don't set mtime, start_ms, end_ms
Not necessary or useful.
2014-01-10 09:01:28 +01:00
Max Kellermann
cfc25e08dc db/upnp: use TagTable in upnpItemToSong()
Reduces bloat by eliminating one std::map.
2014-01-10 08:57:31 +01:00
Max Kellermann
1583eb36e4 doc/user: mention the upnp database plugin 2014-01-09 20:59:51 +01:00
Jean-Francois Dockes
406452f019 UPnP database plugin
[mk: renamed source files, applied coding style, reduced bloat, using
MPD's threading library, using MPD's error reporting and logging
library and refactoring, fixed lots of bugs]
2014-01-09 20:56:00 +01:00
Max Kellermann
12b139beaf ExpatParser: add Parse() overload with buffer 2014-01-09 20:56:00 +01:00
Max Kellermann
2ed1c22227 ExpatParser: add helper class CommonExpatParser 2014-01-09 20:56:00 +01:00
Max Kellermann
eb23ef1747 event/Loop: allow AddTimer() after Run() has returned
Kludge for libavahi-client quirk.
2014-01-09 20:56:00 +01:00
Max Kellermann
970b10d01b tag/TagTable: add lookup TagType -> name 2014-01-09 19:01:03 +01:00
Max Kellermann
61b938d6fa event/Loop: allow scheduling events before Run()
Add the debug-only flag "virgin" which gets checked by assert()
calls.  Fixes assertion failures when using zeroconf/avahi.
2014-01-09 17:52:55 +01:00
Max Kellermann
0c34555b02 Directory: remove method Free() 2014-01-09 13:21:56 +01:00
Max Kellermann
83a988e2e4 db/proxy: allocate Directory instance on the stack 2014-01-09 13:21:09 +01:00
Max Kellermann
91efe1cb5a Directory: convert to fixed-size struct
Using a variable-size struct with embedded string is not worth the
trouble here.  There are not so many Directory objects.
2014-01-09 13:14:14 +01:00
Max Kellermann
735241f049 Timer: remove unused method Synchronize() 2014-01-09 12:56:57 +01:00
Max Kellermann
dd82370a80 playlist/{asx,rss,xspf}: use Expat instead of GLib to parse XML 2014-01-09 12:19:52 +01:00
Max Kellermann
dab052e53d playlist/asx: make variables more local 2014-01-09 12:18:13 +01:00
Max Kellermann
322b061632 DetachedSong: fork of struct Song
From now on, struct Song will be used by the database only, and
DetachedSong will be used by everybody else.  DetachedSong is easier
to use, but Song has lower overhead.
2014-01-09 09:05:58 +01:00
Max Kellermann
43847f2244 test/DumpDatabase: fix nullptr dereference 2014-01-09 09:05:58 +01:00
Max Kellermann
8f9ba96c59 SongUpdate: move code to handle_lsinfo()
Don't create a temporary Song object in handle_lsinfo().  Instead,
print all tags while parsing the remote file.
2014-01-08 23:35:37 +01:00
Max Kellermann
10406c73b3 SongSave: make variables more local 2014-01-08 23:10:24 +01:00
Steven O'Brien
67a6a12916 doc/user.xml: add alsa input section 2014-01-08 23:02:21 +01:00
Max Kellermann
139122c57f Merge branch 'v0.18.x' 2014-01-08 22:14:12 +01:00
Max Kellermann
fdd76b3461 decoder/faad: fix memory leak 2014-01-08 22:11:00 +01:00
Max Kellermann
959d7ca9d0 valgrind.suppressions: add libsmbclient suppressions 2014-01-08 20:57:53 +01:00
Max Kellermann
e490e5d0ab playlist/pls: don't free stack buffer 2014-01-08 19:50:44 +01:00
Max Kellermann
3b568b0943 playlist/pls: make variables more local 2014-01-08 19:50:10 +01:00
Max Kellermann
b2e1b38864 playlist/pls: convert "while" loop to "for" loop 2014-01-08 19:50:05 +01:00
Max Kellermann
5c6fe97b35 playlist/pls: simplify error handler
Don't pass a GError** to g_key_file_get_X().  We don't need to dispose
something we didn't request in the first place.
2014-01-08 19:49:34 +01:00
Max Kellermann
2071070f39 DespotifyUtils: return Tag, not pointer 2014-01-08 19:49:27 +01:00
Max Kellermann
89a78a5f3c DespotifyUtils: pass const ds_track reference 2014-01-08 19:49:21 +01:00
Max Kellermann
bc23a6bb05 tag/TagBuilder: overload Commit() returning a Tag object 2014-01-08 19:49:08 +01:00
Max Kellermann
ac1983eae3 tag/TagBuilder: rename Commit() to CommitNew() 2014-01-08 19:48:55 +01:00
Steven O'Brien
33c5fc95b4 input/AlsaInputPlugin: remove unnecessary alsa s/w param setting to fix high CPU load issue 2014-01-08 14:00:42 +01:00
Max Kellermann
6a953394f4 SongSticker: use Song references 2014-01-08 00:41:08 +01:00
Max Kellermann
c152a88ff6 PlayerThread: use Song references 2014-01-08 00:36:59 +01:00
Max Kellermann
cbf57e7421 DecoderThread: use Song references 2014-01-08 00:35:28 +01:00
Max Kellermann
3f3ae48ff4 test: add missing includes 2014-01-07 23:57:39 +01:00
Max Kellermann
27ca0db7a6 util/Alloc: new library replacing GLib's g_malloc() 2014-01-07 23:35:18 +01:00
Max Kellermann
49f34fbf68 DecoderBuffer: use NewVarSize() 2014-01-07 23:31:26 +01:00
Max Kellermann
fe6094a822 tag/TagPool: use NewVarSize() to allocate TagPoolSlot 2014-01-07 23:24:59 +01:00
Max Kellermann
8a30c7992d tag/TagPool: rename struct slot to TagPoolSlot 2014-01-07 23:12:24 +01:00
Max Kellermann
70eb9335bd tag/TagPool: use gcc_packed instead of mpd_packed
By accident, this declared a global variable instead of adding the
"packed" attribute.
2014-01-07 23:11:00 +01:00
Max Kellermann
da80f91e1c Directory: make some code generic, move to VarSize.hxx 2014-01-07 23:10:56 +01:00
Max Kellermann
cc60d193ce Directory: use g_malloc() instead of g_malloc0()
Explicit attribute initialization.
2014-01-07 23:10:56 +01:00
Max Kellermann
3a05c421e0 doc/user: fix typo 2014-01-07 18:06:58 +01:00
Max Kellermann
0f99410ba1 playlist/soundcloud: parse URI without copying it 2014-01-07 10:21:42 +01:00
Max Kellermann
442dadd6fe playlist/soundcloud: change scheme check to assertion
The MPD core takes care for checking the scheme.
2014-01-07 09:40:31 +01:00
Max Kellermann
da9dd58f34 playlist/soundcloud: eliminate nullptr checks before g_free() 2014-01-07 09:27:50 +01:00
Max Kellermann
bd01d80ffc pcm/Utils: remove unused function pcm_end_pointer() 2014-01-07 00:46:47 +01:00
Max Kellermann
7eda72d440 pcm/Volume: use number of samples instead of end pointer 2014-01-07 00:42:02 +01:00
Max Kellermann
c75339edcc pcm/Format: change parameters/return values to ConstBuffer 2014-01-06 23:08:49 +01:00
Max Kellermann
b0b7244b3a pcm/Format: use number of samples instead of end pointer 2014-01-06 22:42:33 +01:00
Max Kellermann
a9e849ff4f DecoderBuffer: _read() returns ConstBuffer object 2014-01-06 22:17:30 +01:00
Max Kellermann
4c95a4d7c6 DecoderBuffer: add "pure" attributes 2014-01-06 22:16:56 +01:00
Max Kellermann
eac9fabd48 DecoderBuffer: add method _clear() 2014-01-06 21:59:43 +01:00
Max Kellermann
e2a08fa824 decoder/faad: make variables more local 2014-01-06 21:57:40 +01:00
Max Kellermann
d403749d09 decoder/faad: eliminate local variable "ret" 2014-01-06 21:57:40 +01:00
Max Kellermann
582c2105a9 event/Loop: cancel the WakeFD monitor in destructor 2014-01-06 21:57:40 +01:00
Steven O'Brien
f39a34ccfa input/AlsaInputPlugin.cxx: use I/O thread to poll for available data
[mk: modified to use MultiSocketMonitor instead of SocketMonitor]
2014-01-06 18:27:44 +01:00
Max Kellermann
08f5b9f1f9 event/MultiSocketMonitor: add method ClearSocketList() 2014-01-06 18:27:26 +01:00
Max Kellermann
793962c5b8 event/SocketMonitor: don't close the socket automatically
Users now have to call Close() explicitly.  This simplifies using the
class, as most users have automatic socket management already, and
Steal() had to be used often.
2014-01-06 18:26:55 +01:00
Max Kellermann
0d20130d07 util/Cast: new utility library 2014-01-06 18:21:45 +01:00
Max Kellermann
617090cfda event/IdleMonitor: cancel in destructor only if active
Debug-mode workaround for bogus assertion failure.
2014-01-06 18:21:45 +01:00
Max Kellermann
a9e604d51d event/MultiSocketMonitor: API documentation 2014-01-06 08:59:27 +01:00
Max Kellermann
e599b86424 event/Loop: try to avoid the WakeFD when adding DeferredMonitor
Add a flag that indicates whether the EventLoop is currently "busy".
As long as that flag is set, it does not need to be woken up - we can
simply add the DeferredMonitor to the list, and it will be caught by
EventLoop very soon.  This eliminates nearly all of the
DeferredMonitor overhead when compared to IdleMonitor, rendering
IdleMonitor mostly obsolete.
2014-01-05 02:15:34 +01:00
Max Kellermann
da9e584921 event/Loop: combine multiple WakeFD::Write() calls
Reduce DeferredMonitor overhead.
2014-01-05 02:15:10 +01:00
Max Kellermann
e9d764d7ad event/Loop: add attribute "again"
Improved support for added events.
2014-01-05 02:15:01 +01:00
Max Kellermann
6268955778 event/Loop: add thread-safety assertions 2014-01-05 02:14:31 +01:00
Max Kellermann
4ddfc6e9a2 output/httpd: move the clients.clear() call to the IOThread
This call is not thread-safe.
2014-01-05 02:13:35 +01:00
Max Kellermann
dcbc05a9cd output/httpd: import GetEventLoop() 2014-01-05 02:13:21 +01:00
Max Kellermann
4c705334fa ClientList: use "delete" instead of Client::Close()
Client::Close() installs a TimeoutMonitor, which is not something we
should do during shutdown.
2014-01-05 02:07:49 +01:00
Max Kellermann
c12da599b9 event/Loop: remove obsolete assertion 2014-01-05 01:41:03 +01:00
Max Kellermann
f685a48008 event/Loop: move code to HandleDeferred() 2014-01-05 01:35:12 +01:00
Max Kellermann
7c15e41da5 event/MultiSocketMonitor: add missing <algorithm> include
For std::find_if().
2014-01-05 01:35:12 +01:00
Max Kellermann
7b540f0226 event/MultiSocketMonitor: add method ReplaceSocketList()
Move code from AlsaMixerPlugin.
2014-01-05 01:28:36 +01:00
Max Kellermann
e29c22e662 event/MultiSocketMonitor: include cleanup 2014-01-05 00:39:29 +01:00
Max Kellermann
f0d3b47ad8 event/Loop: remove the GLib implementation
Now that the remaining known bugs in poll() implementation are fixed,
we can go on without the GLib implementation.
2014-01-04 19:31:23 +01:00
Max Kellermann
bfe7533546 output/httpd: move Bind()/Unbind() to the IOThread
Fixes more thread-safety bugs.
2014-01-04 19:29:51 +01:00
Max Kellermann
880bf17dae event/poll: eliminate one vector::size() call 2014-01-04 19:10:21 +01:00
Max Kellermann
c9da3363a0 output/httpd: move all broadcast operations to the IOThread
Add a Page queue to class HttpdOutput, and use DeferredMonitor to
flush this queue inside the IOThread.  This fixes a thread-safety
issue: much of EventLoop is not thread-safe, and the httpd plugin
ignored that problem.
2014-01-04 18:22:55 +01:00
Max Kellermann
9bd4ed3e60 output/httpd: use the IOThread
Do all I/O in the IOThread and not in the main thread.  This solves an
upcoming deadlock problem.
2014-01-04 18:21:40 +01:00
Max Kellermann
68fcc19565 output/httpd: move queue size check to HttpdClient::PushPage()
Don't let the server care for client problems.
2014-01-04 17:42:03 +01:00
Max Kellermann
8e4efd071e output/httpd: wrap the std::list in std::queue 2014-01-04 17:12:59 +01:00
Max Kellermann
f2ad9f6fad output/httpd: merge duplicate code to ClearQueue() 2014-01-04 17:11:22 +01:00
Max Kellermann
968c5eb767 output/httpd: keep track of queue size
Don't iterate the std::list each time.
2014-01-04 17:06:05 +01:00
Max Kellermann
19424e95db event/Loop: remove bogus "!quit" assertion
Commit 1f11959 allowed modifying the "quit" attribute from any thread,
and thus the assertion may fail spuriously.  This assertion is too
strict for the relaxed use of "quit".  Let's remove it and move the
"quit" check to before the SockedMonitor::Dispatch() call.
2014-01-04 17:06:05 +01:00
Max Kellermann
0f9ef2506f event/Loop: remove unused method AddCall() 2014-01-04 16:00:45 +01:00
Max Kellermann
1f1195975f event/Loop: non-recursive Break() implementation
Simply set the "quit" flag and wake up the thread.  This works even if
we're inside this thread.  Setting "quit" to a new value without mutex
protection is usually not safe, but good enough here.
2014-01-04 15:59:00 +01:00
Max Kellermann
87fce8ef27 mixer/alsa: use DeferredMonitor to update file descriptors
EventLoop::AddCall() and EventLoop::AddIdle() are unsafe, because we
can't cancel those calls.
2014-01-04 15:58:59 +01:00
Max Kellermann
d2a4f64fd6 event/BlockingCall: always use DeferredMonitor internally
There is no advantage of using EventLoop::AddCall(), now that
DeferredMonitor is thread-safe.
2014-01-04 15:58:59 +01:00
Max Kellermann
a357d84dce event/DeferredMonitor: make fully thread-safe
Instead of creating a new eventfd for each DeferredMonitor instance,
reuse EventLoop's eventfd, and add a std::list to EventLoop that
manages the list of pending DeferredMonitors.  This std::list is
protected by the same mutex as the "calls" list.

The bottom line is: reduced overhead because the per-instance eventfd
was eliminated, slightly added overhead due to Mutex usage (but
negligible), and we're thread-safe now.

This subsystem is now good enough to replace EventLoop::AddCall().
2014-01-04 15:58:59 +01:00
James McGlashan (DarkFox)
48c96bbaea Added application key for soundcloud plugin 2014-01-04 14:01:17 +01:00
James McGlashan (DarkFox)
c666794ce3 Added soundcloud documentation 2014-01-04 14:01:12 +01:00
James McGlashan (DarkFox)
1ee3df6976 Added user and search paramaters for SoundCloud plugin 2014-01-04 13:36:24 +01:00
James McGlashan (DarkFox)
d4dea53ae9 http -> https for SoundCloud plugin 2014-01-02 12:29:45 +01:00
Max Kellermann
d477a9222e output/httpd: change "struct" to "class" 2013-12-31 17:04:40 +01:00
Max Kellermann
69a9d29190 output/httpd: move code to methods Delay(), Play(), Cancel() 2013-12-31 17:01:08 +01:00
Max Kellermann
e2425592b6 output/httpd: move Cast() into the class 2013-12-31 16:59:24 +01:00
Max Kellermann
964b2661d8 output/httpd: add methods Init(), Finish() 2013-12-31 16:55:26 +01:00
Max Kellermann
8b65b524d5 output/httpd: use reference instead of pointer 2013-12-31 16:32:33 +01:00
Max Kellermann
f1ac2cd336 output/httpd: make the HttpdClient base class "private" 2013-12-31 16:24:51 +01:00
Max Kellermann
e73d0df2b6 event/*Monitor: document as not being thread-safe 2013-12-31 15:59:41 +01:00
Max Kellermann
af3f483924 event/Loop: document that AddCall() is thread-safe 2013-12-31 15:31:59 +01:00
Max Kellermann
809b0eb1f5 command: "lsinfo" and "readcomments" allowed for remote files 2013-12-29 18:25:32 +01:00
Max Kellermann
b5f3bfce92 SongUpdate: read tags from songs in an archive
Add the TagStream.cxx library, similar to TagFile.cxx, and use it to
load tags from song files inside archives.
2013-12-29 18:15:30 +01:00
Max Kellermann
aeb2baa495 InputStream: add static method OpenReady()
Merge some duplicate code.
2013-12-29 18:08:49 +01:00
Max Kellermann
afc70c120e util/UriUtil: uri_get_suffix() fails if name begins with dot
A file called ".jpg" is not a JPEG file with an empty name; it is
merely a hidden file.
2013-12-29 17:40:51 +01:00
Max Kellermann
ea9aff1d3f TagFile: rewind the stream before trying the next plugin
Got lost in commit c97685fe
2013-12-29 17:09:59 +01:00
Max Kellermann
cecae419fb DecoderList: add "pure" attribute 2013-12-29 17:06:59 +01:00
Max Kellermann
df4db50904 DecoderList: add function decoder_plugins_supports_suffix()
Replaces decoder_plugin_from_suffix().
2013-12-29 16:59:57 +01:00
Max Kellermann
decc4002a0 DecoderThread: use decoder_plugins_try()
.. instead of decoder_plugin_from_suffix().  This reduces overhead by
walking the array only once.
2013-12-29 16:51:18 +01:00
Max Kellermann
5bb563e3bc UpdateContainer: pass suffix instead of DecoderPlugin
Instead of using the first DecoderPlugin that supports the suffix, use
the first one that actually implements the "container_scan" method.
2013-12-29 16:46:02 +01:00
Max Kellermann
9be82891b0 TagFile: pass reference instead of pointer 2013-12-29 16:24:04 +01:00
Max Kellermann
c97685fe6c TagFile: use decoder_plugins_try()
.. instead of decoder_plugin_from_suffix().  This reduces overhead by
walking the array only once.
2013-12-29 16:13:11 +01:00
Max Kellermann
358b671033 DecoderList: remove unused function decoder_plugin_from_mime_type() 2013-12-29 15:53:55 +01:00
Max Kellermann
92a4bf4441 Merge branch 'v0.18.x' 2013-12-29 14:18:19 +01:00
Max Kellermann
d7f80eab68 configure.ac: improved check for libyajl 1.0
If we have libyajl 2.0.1 (without a pkg-config file), our configure.ac
would assume this is the libyajl 1.0 API, because the function
yajl_alloc() exists in both.  This commit changes the library check to
the function yajl_parse_complete() which was removed in the 2.0 API.
This fixes build failure with libyajl 2.0.1.
2013-12-29 14:12:33 +01:00
Max Kellermann
e30b356eb0 daemon: no initgroups() when already running as the configured user
We can assume that initgroups() would be a no-op in that case, however
initgroups() is not allowed for unprivileged users anyway.
2013-12-29 13:59:05 +01:00
Max Kellermann
09a0803116 Daemon: fix typo in comment 2013-12-29 13:59:05 +01:00
Max Kellermann
20ffedc745 Daemon: simplify nested "if" 2013-12-29 13:57:12 +01:00
Max Kellermann
0b1ad27ba8 Daemon: fix typo in cast 2013-12-29 13:47:29 +01:00
Max Kellermann
6a1b2f0387 configure.ac: prepare for 0.18.7 2013-12-29 10:40:59 +01:00
Max Kellermann
5465647c2e input/smbclient: new input plugin 2013-12-29 01:25:27 +01:00
Max Kellermann
a2baeed329 ls: add "pure" attribute 2013-12-29 01:25:27 +01:00
Max Kellermann
92aa464edb pcm/Volume: remove unused function pcm_volume_dither() 2013-12-28 18:39:26 +01:00
Max Kellermann
da29298d4d pcm/PcmMix: improved dithering
Use the existing PcmDither library.
2013-12-28 18:30:27 +01:00
Max Kellermann
afcf0795c4 pcm/Volume: improved dithering
Instead of just adding a rectangular random value before shifting back
to the normal scale, use the existing PcmDither library.
2013-12-28 18:30:24 +01:00
Max Kellermann
394e2815db pcm/PcmDither: inline Dither24To16() and Dither32To16() 2013-12-28 18:30:13 +01:00
Max Kellermann
f3bbe4bb1f pcm/Volume: remove optimized i386 assembly
This code is unable to dither.  Until we implement that, let's remove
the code for now.  i386 isn't relevant anymore anyway.
2013-12-28 17:24:54 +01:00
Max Kellermann
2a3a18a283 pcm/Traits: use 32 bit integer for S8 long_type
16 bit is not enough for volume calculations.
2013-12-25 12:28:18 +01:00
Max Kellermann
431c80f4f0 pcm/Dither: add API documentation 2013-12-24 23:45:38 +01:00
Max Kellermann
9ac18c39a1 pcm/Dither: move shift from DitherConvert() to Dither()
All callers need this shift, so let's move it to the basic method.
2013-12-24 23:39:29 +01:00
Max Kellermann
d1b7473418 pcm/Dither: rename DitherShift() to DitherConvert() 2013-12-24 23:38:11 +01:00
Max Kellermann
1ad52f131c test/*: use fprintf(stderr,...) and Log() instead of g_printerr()
Avoid GLib.
2013-12-24 14:44:08 +01:00
Max Kellermann
8064bbbc3f test/*: remove GLib logging setup
Obsolete, our logging library doesn't ues GLib anymore.
2013-12-24 14:13:03 +01:00
Max Kellermann
64e898f6db Merge tag 'release-0.18.6' 2013-12-24 12:20:24 +01:00
Max Kellermann
fb34519b96 release v0.18.6 2013-12-24 12:01:01 +01:00
Max Kellermann
91fed47648 PlayerThread: log the last song that was played 2013-12-24 11:58:10 +01:00
Max Kellermann
c05691b546 OutputControl: update both ReplayGainFilters
The "mode" of the second ReplayGainFilter was never set, and thus
replay gain was never applied to the new song during cross-fade.
2013-12-24 11:53:21 +01:00
Max Kellermann
1732166328 OutputThread: handle failing ReplayGainFilter::Open()
Since opening the PcmVolume object can now fail, this case must be
handled.
2013-12-24 10:52:33 +01:00
Max Kellermann
8edde7a4b3 pcm/Volume: convert to class
Prepare for adding state.
2013-12-23 10:58:37 +01:00
Max Kellermann
d11a0c9f14 pcm/Volume: apply volume into destination buffer 2013-12-23 10:55:29 +01:00
Max Kellermann
7be2abe6b5 pcm/Volume: convert i386 code to template specialization 2013-12-23 10:35:35 +01:00
Max Kellermann
4a62cd4ad8 pcm/Volume: move code to template pcm_volume_sample() 2013-12-23 10:35:23 +01:00
Max Kellermann
6d21b9448a pcm/PcmVolume: rename to Volume.cxx 2013-12-23 10:35:21 +01:00
Max Kellermann
2d1a3073f6 pcm/PcmConvert: move the Domain instance to Domain.cxx
Rename pcm_convert_domain to pcm_domain.  Move it out so we can use it
without depending on the whole PcmConvert library.
2013-12-23 10:35:19 +01:00
Max Kellermann
d7b9886387 ConfigData: initialise "used" in second constructor 2013-12-23 10:31:29 +01:00
Max Kellermann
1543e529f1 pcm/Dither: convert remaining methods to templates
Use the SampleTraits template and let the compiler generate a special
case for S32 instead of reusing S24_P32.
2013-12-22 22:18:06 +01:00
Max Kellermann
4043f320fe pcm/Dither: generic sample dithering using template 2013-12-22 22:06:25 +01:00
Max Kellermann
32b834aa04 pcm/Traits: include stddef.h for size_t 2013-12-22 22:06:25 +01:00
Max Kellermann
b43ec3d6f0 pcm/Traits: add MIN and MAX
Move from PcmClamp().
2013-12-22 21:32:25 +01:00
Max Kellermann
316a25dead pcm/Volume: add constant PCM_VOLUME_BITS 2013-12-22 21:31:17 +01:00
Max Kellermann
bfe020e06c pcm/Volume: make PCM_VOLUME_1 a "constexpr" 2013-12-22 21:20:40 +01:00
Max Kellermann
5aae560683 pcm/Prng: make pcm_prng() inline 2013-12-22 21:20:38 +01:00
Max Kellermann
86e72ffefb util/Clamp: generic Clamp() function 2013-12-22 21:08:06 +01:00
Max Kellermann
6416198e9f event/PollGroupPoll: include stddef.h instead of string.h 2013-12-21 21:21:25 +01:00
Max Kellermann
3c4cd9d08b input/alsa: fix build with gcc 4.6 2013-12-21 21:21:25 +01:00
Steven O'Brien
6b3b8c6f2e fix FfmpegDecoderPlugin to use relative timestamps 2013-12-20 22:28:33 +01:00
Max Kellermann
fdb02ee5ca configure.ac: skip Linux specific tests on other OSs 2013-12-20 21:38:07 +01:00
Steven O'Brien
35f85ddd86 add draft ALSA input plugin
I've created an elementary input plugin that plays sound from the
soundcard, so you can use MPD to listen to anything connected to the
line-in jack, or to Video4Linux FM radio cards that send audio through
the soundcard.  There has been a small number of posts here in the
past requesting line-in input, so here is a first, simplistic stab at
it.

The patch adds a new sheme, alsa://, which causes mpd to play data
read directly from a souncdard.  It defaults to hw:0,0, but you can
pass any ALSA device name in the URI.  So, using mpc for example:

 mpc add alsa://
 mpc play

will play from device hw:0,0.

To use a diffferent device:

 mpc add alsa://hw:1,0
2013-12-19 23:25:50 +01:00
Max Kellermann
e30fa7d15e configure.ac: add variable $host_is_unix 2013-12-19 12:59:01 +01:00
Max Kellermann
c476305149 configure.ac: add variable $host_is_solaris 2013-12-19 12:55:43 +01:00
Max Kellermann
45ad7696fe output/osx: fix typo 2013-12-19 12:46:21 +01:00
Max Kellermann
d86cd4e4b4 util/fifo_buffer: remove obsolete library 2013-12-19 12:17:09 +01:00
Max Kellermann
0e84d71559 output/osx: use DynamicFifoBuffer instead of struct fifo_buffer 2013-12-19 12:16:29 +01:00
Max Kellermann
5f14704eee configure.ac: increment protocol version to 0.19.0
Due to recent protocol additions ("addtagid", "cleartagid").
2013-12-19 12:16:29 +01:00
Max Kellermann
a191db84f2 util/Error: add missing <algorithm> include
For std::move().
2013-12-19 10:58:20 +01:00
Max Kellermann
52dca859c7 util/PeakBuffer: use IsEmpty() instead of IsNull()
The DynamicFifoBuffer methods never return nullptr when the buffer is
empty or full; instead, they return an empty buffer.  This bug caused
an endless loop.
2013-12-19 10:30:26 +01:00
Michal Smucr
e4d69f38b0 riff: recognize upper-case "ID3" chunk name
Some tagging libraries (eg. TagLib) produce that variant.
2013-12-19 09:35:54 +01:00
Max Kellermann
97fc001180 input/cdio: fix typo in #include path
Broken by commit 3b0fea5f
2013-12-17 08:58:00 +01:00
Max Kellermann
f544316314 util/{Domain,Error}: relicense to BSD 2-clause 2013-12-16 22:42:01 +01:00
Max Kellermann
ecdebb315f util/PeakBuffer: use DynamicFifoBuffer instead of struct fifo_buffer
Switch to the C++ version.
2013-12-15 23:07:08 +01:00
Max Kellermann
1f523be72d util/PeakBuffer: return ConstBuffer<void> 2013-12-15 23:07:08 +01:00
Max Kellermann
f2a20a0a80 util/WritableBuffer: add cast methods 2013-12-15 23:01:06 +01:00
Max Kellermann
e5a2efaa65 util/WritableBuffer: fix indent 2013-12-15 22:58:32 +01:00
Max Kellermann
c44cb3246d util/DynamicFifoBuffer: make constructor "explicit" 2013-12-15 22:35:21 +01:00
Max Kellermann
9cfd9d7ce0 Merge branch 'v0.18.x' 2013-12-15 19:17:40 +01:00
Max Kellermann
42a09ff17a mixer/alsa: fix deadlock
This deadlock was a regression by commit 8e38b4f8.  Since we currently
can't resolve this, let's revert the commit, and add a GLib specific
workaround for the build failure.
2013-12-15 19:07:25 +01:00
Max Kellermann
66d90dd412 test/*: use fprintf(stderr,...) and Log() instead of g_printerr()
Avoid GLib.
2013-12-15 18:52:13 +01:00
Max Kellermann
d5dfe7d457 configure.ac: add option "--disable-glib"
Allows building without GLib.  This fails to compile currently,
because GLib is still used in the MPD core.
2013-12-15 18:43:12 +01:00
Max Kellermann
0db0b4e302 Daemon: use strdup() instead of g_strdup() 2013-12-15 18:43:12 +01:00
Max Kellermann
635d6a19ef util/Tokenizer, ...: include cleanup 2013-12-15 18:33:26 +01:00
Max Kellermann
777844ae0c system/SocketError, ...: use strerror() instead of g_strerror()
Avoid GLib.
2013-12-15 18:32:07 +01:00
Max Kellermann
a10a4ad900 LogInit: move backend code to LogBackend.cxx 2013-12-15 18:27:52 +01:00
Max Kellermann
c330d694c7 Log: move Log() to LogBackend.cxx
Prepare for GLib removal.
2013-12-15 17:32:41 +01:00
Max Kellermann
73555f9088 Log: move enum LogLevel to LogLevel.hxx 2013-12-15 17:23:45 +01:00
Max Kellermann
e1ec65bd53 UriUtil: add function uri_get_scheme()
Replaces g_uri_parse_scheme().
2013-12-15 17:06:10 +01:00
Max Kellermann
65b8e52d80 output/alsa: use new[] instead of g_malloc() 2013-12-14 22:17:19 +01:00
Max Kellermann
4b7a418e28 playlist/soundcloud: fix coding style 2013-12-14 22:09:27 +01:00
Max Kellermann
73d917b76e playlist/soundcloud: make variables more local 2013-12-14 22:08:45 +01:00
Max Kellermann
527a6003e2 input/despotify: don't log "eof" flag after setting it 2013-12-14 13:58:28 +01:00
Max Kellermann
26c731a382 input/despotify: convert to class 2013-12-14 13:49:56 +01:00
Max Kellermann
8297563978 decoder/flac: simplify the comment parsers 2013-12-14 13:44:57 +01:00
Max Kellermann
1da0526072 decoder/flac: VorbisComment_Entry is null-terminated
Don't duplicate the buffer just to null-terminate the string.
According to libFLAC API documentation, the string is already
null-terminated.
2013-12-14 13:44:57 +01:00
Max Kellermann
635a67afac util/SplitString: new utility class
To replace g_strdup().
2013-12-14 12:58:26 +01:00
Max Kellermann
c7e7c819a2 decoder/vorbis: remove useless cast 2013-12-14 12:53:59 +01:00
Max Kellermann
fbf677d9b2 decoder/mad: use new[] instead of g_malloc() 2013-12-14 12:50:51 +01:00
Max Kellermann
d37b788ea8 DecoderAPI: add function decoder_read_full()
Move code from the "mad" plugin.
2013-12-14 12:43:06 +01:00
Max Kellermann
cb336ff666 DecoderAPI: add function decoder_skip()
Move code from the "mad" plugin.
2013-12-14 12:40:43 +01:00
Max Kellermann
e2e5433beb test: merge duplicate code to FakeDecoderAPI.cxx 2013-12-14 12:40:24 +01:00
Max Kellermann
c7b1038a9d Merge branch 'v0.18.x' 2013-12-14 12:37:16 +01:00
Max Kellermann
c170fed6f9 .gitignore: ignore "test-driver"
File generated by automake version 1.14.
2013-12-14 12:33:20 +01:00
Max Kellermann
d43aa12987 Tag: swap "base" and "add" in method Merge()
Fixes broken CUE sheet song tags (regression by commmit 7e8d254b).
2013-12-13 15:53:58 +01:00
Max Kellermann
8e38b4f83c mixer/alsa: use BlockingCall() instead of EventLoop::AddCall()
This is safer, and works without epoll().  Fixes a build failure with
uClibc, which does not support epoll().
2013-12-13 14:35:36 +01:00
Max Kellermann
db4ae19246 doc/mpd.conf.5: remove redundant documentation
The real and detailed documentation is in the user manual.
2013-12-11 21:04:28 +01:00
Max Kellermann
82a89c6bfe doc/user: document the "ao" output
Move from doc/mpd.conf.5.
2013-12-11 21:03:11 +01:00
Max Kellermann
166c70cab3 doc/user: document the "fifo" output
Move from doc/mpd.conf.5.
2013-12-11 20:58:06 +01:00
Max Kellermann
de78fe38c8 doc/user: document shout option "protocol" 2013-12-11 20:54:42 +01:00
mobidyc
96fa69ff6b SongUpdate: accept files without metadata
If the file was recognized by a decoder plugin, accept it - don't
require metadata.
2013-12-10 19:34:35 +01:00
Max Kellermann
39d94bd3ea TagFile: add return value API documentation 2013-12-10 19:32:26 +01:00
Lukas Stabe
695ca29274 output/osx: fix build failure 2013-12-10 19:19:31 +01:00
Max Kellermann
02e8da6c98 NEWS: add openal line 2013-12-10 19:19:27 +01:00
Denis Krjuchkov
ca69ad8beb CommandLine: refactor config search, use standard directory API 2013-12-08 17:25:20 +06:00
Denis Krjuchkov
e42637226f Main: use standard directory API 2013-12-08 17:25:19 +06:00
Denis Krjuchkov
ae25582178 ConfigPath: use standard directory API 2013-12-08 17:25:19 +06:00
Denis Krjuchkov
5d85792178 fs: implemented standard directories API 2013-12-08 17:24:43 +06:00
Denis Krjuchkov
acba9c0f61 TextFile: move to fs subsystem 2013-12-08 04:15:27 +06:00
Max Kellermann
ad7302a032 util/DynamicFifoBuffer: new class replacing growing_fifo 2013-12-05 11:49:21 +01:00
Max Kellermann
9f3bead99f test/run_encoder: destruct the Encoder before exiting 2013-12-05 11:49:21 +01:00
Denis Krjuchkov
38afc89407 fs/FileSystem.hxx: don't define CheckAccess() with mode on Windows 2013-12-05 15:05:01 +06:00
Denis Krjuchkov
c161bb287c db/SimpleDatabasePlugin.cxx: don't use CheckAccess with mode on Windows 2013-12-05 15:05:01 +06:00
Denis Krjuchkov
06d7169674 fs/FileSystem.hxx: add CheckAccess without mode parameter 2013-12-05 15:05:01 +06:00
Denis Krjuchkov
8bf1640932 fs/Traits.cxx: don't return drive path without trailing separator 2013-12-05 15:05:01 +06:00
Denis Krjuchkov
da50c888fe fs/Traits.hxx: introduce PathTraitsXXX::IsDrive function 2013-12-05 15:05:01 +06:00
Denis Krjuchkov
62dc8e4131 fs/Charset.cxx: replace \ with / when converting path to UTF-8 on Windows 2013-12-05 15:04:52 +06:00
Denis Krjuchkov
dc554ca61f PlaylistSong.cxx: don't use g_build_filename 2013-12-05 12:35:29 +06:00
Denis Krjuchkov
cbb9149a82 fs/Traits.hxx: add shorter forms of PathTraitsXXX::Build() 2013-12-05 12:35:28 +06:00
Denis Krjuchkov
dab7348da8 fs/Traits.hxx: add PathTraitsUTF8::GetLength for consistency 2013-12-05 12:35:28 +06:00
Denis Krjuchkov
378e8a6224 fs/AllocatedPath.cxx: don't use g_path_get_dirname 2013-12-05 12:35:28 +06:00
Denis Krjuchkov
289fdcc52b fs/Traits: implement GetBase/GetParent/Build using templates 2013-12-05 12:35:21 +06:00
Denis Krjuchkov
83e6e3e31f fs/Traits.cxx: don't return empty string if parent dir is root 2013-12-05 12:27:31 +06:00
Denis Krjuchkov
c387031252 fs/Traits.hxx: add FindLastSeparator function to PathTraitsXXX 2013-12-05 04:09:07 +06:00
Denis Krjuchkov
403bd77eff fs/Traits: improve compatibility between PathTraitsFS and PathTraitsUTF8 2013-12-05 04:01:29 +06:00
Denis Krjuchkov
b397c46184 fs/Traits.hxx: add gcc_nonnull_all where applicable 2013-12-05 03:56:51 +06:00
Denis Krjuchkov
0a6c4c31b2 fs/Traits: split PathTraits type into PathTraitsFS and PathTraitsUTF8 2013-12-05 03:53:43 +06:00
Max Kellermann
02fcf184b5 tag/ApeLoader: use new[]/delete[] instead of g_malloc()/g_free() 2013-12-04 15:21:10 +01:00
Max Kellermann
b978126bb0 DirectorySave: don't duplicate string
Not necessary anymore for playlist_metadata_load().
2013-12-04 15:11:23 +01:00
Max Kellermann
9f51d19087 PlaylistFile: use std::string for temporary string allocation 2013-12-04 15:07:45 +01:00
Max Kellermann
859184000f Mapper: update API documentation 2013-12-04 15:04:54 +01:00
Max Kellermann
1ad2f18c9e IcyMetaDataParser: use new[]/delete[] instead of g_malloc()/g_free() 2013-12-04 15:03:39 +01:00
Max Kellermann
06a49a5f9e TagId3: make variables more local 2013-12-04 14:52:34 +01:00
Max Kellermann
b811927e0e TagId3: use std::string for partial string copy 2013-12-04 14:43:09 +01:00
Max Kellermann
83cdd0a0c8 TagId3: use free() instead of g_free() for libid3tag allocations 2013-12-04 14:39:30 +01:00
Max Kellermann
53c69cd2ce TagId3: use new[]/delete[] instead of g_malloc()/g_free() 2013-12-04 14:36:13 +01:00
Max Kellermann
c6cf8e992d TagId3: gcc_unlikely instead of G_UNLIKELY 2013-12-04 14:35:16 +01:00
Max Kellermann
0c53e8c2d0 system/Resolver: use std::string to allocate internal buffer
No GLib memory allocation.
2013-12-04 14:27:28 +01:00
Max Kellermann
e1901e97c2 system/Resolver: sockaddr_to_string() returns std::string()
No GLib memory allocation.
2013-12-04 08:43:55 +01:00
Max Kellermann
d694150372 Tag: destructor calls Clear()
Eliminate duplicate code.
2013-12-03 13:19:45 +01:00
Max Kellermann
4ab586aaf1 Tag: use new[]/delete[] instead of g_new()/g_free() 2013-12-03 13:16:43 +01:00
Max Kellermann
8a5209ad93 Tag: remove method AddItem()
Use class TagBuilder instead.
2013-12-03 13:15:42 +01:00
Max Kellermann
308fdf6e9a input/curl: use class TagBuilder 2013-12-03 13:14:11 +01:00
Max Kellermann
9f4e96fdfa PaylistTag: use class TagBuilder 2013-12-03 12:59:55 +01:00
Max Kellermann
c36af35730 TagBuilder: add move operator 2013-12-03 12:59:33 +01:00
Max Kellermann
424f478c3f TagBuilder: reserve items in move constructor 2013-12-03 12:59:32 +01:00
Max Kellermann
5e0c272061 TagBuilder: make conversion constructors "explicit" 2013-12-03 12:53:13 +01:00
Max Kellermann
d99bdca094 playlist/xspf: use class TagBuilder 2013-12-03 12:33:14 +01:00
Max Kellermann
187069bec9 playlist/xspf: rename "tag" to "tag_type" 2013-12-03 12:30:55 +01:00
Max Kellermann
01de768f09 playlist/soundcloud: use class TagBuilder 2013-12-03 12:30:00 +01:00
Max Kellermann
73a861abf1 playlist/rss: use class TagBuilder 2013-12-03 12:25:22 +01:00
Max Kellermann
b4f60ee95c playlist/rss: rename "tag" to "tag_type" 2013-12-03 12:25:13 +01:00
Max Kellermann
85e587a882 playlist/pls: use class TagBuilder 2013-12-03 12:23:45 +01:00
Max Kellermann
d91f6dc1b5 playlist/extm3u: use class TagBuilder 2013-12-03 12:21:22 +01:00
Max Kellermann
78c0d8cc88 playlist/asx: use class TagBuilder 2013-12-03 12:15:43 +01:00
Max Kellermann
b23d2ad43b playlist/asx: rename "tag" to "tag_type" 2013-12-03 12:14:55 +01:00
Max Kellermann
ef68946e74 CueParser: use class TagBuilder 2013-12-03 12:09:21 +01:00
Max Kellermann
a5574f9189 TagBuilder: implement the assignment operator 2013-12-03 12:09:21 +01:00
Max Kellermann
ba61a92897 CueParser: rename local variables "current_tag" to "tag" 2013-12-03 11:58:27 +01:00
Max Kellermann
68fc3704e9 CueParser: rename "tag" to "header_tag" 2013-12-03 11:55:32 +01:00
Max Kellermann
69867015e9 DespotifyUtils: use class TagBuilder 2013-12-03 11:46:31 +01:00
Max Kellermann
923f18ef76 IcyMetaDataParser: use class TagBuilder 2013-12-03 11:46:26 +01:00
Max Kellermann
7e8d254b95 Tag: move code from Merge() to TagBuilder::Complement() 2013-12-03 11:46:24 +01:00
Max Kellermann
6325c3f14a TagBuilder: add Tag copy/move constructors 2013-12-03 11:46:23 +01:00
Max Kellermann
074a23e6b4 TagBuilder: add method HasType() 2013-12-03 11:46:21 +01:00
Max Kellermann
2fb61534a1 Merge branch 'master' of git://git.musicpd.org/dk/mpd 2013-12-03 11:46:04 +01:00
Max Kellermann
12b6c6ccf7 OutputAll: use new[]/delete[] instead of g_new()/g_free() 2013-12-03 10:51:50 +01:00
Denis Krjuchkov
55ed7bd34d AllocatedPath.hxx: use move constructor 2013-12-03 14:57:26 +06:00
Denis Krjuchkov
eeeef3eab5 fs/AllocatedPath: use PathTraits::BuildFS 2013-12-03 13:50:50 +06:00
Denis Krjuchkov
96413b1604 fs/Traits.hxx: implement BuildFS() method 2013-12-03 13:46:05 +06:00
Denis Krjuchkov
2278fe42e5 fs/Traits.hxx: move definition of AllocatedPath::string to PathTraits 2013-12-03 13:37:35 +06:00
Denis Krjuchkov
3a183f869f fs/Traits.hxx: add GetLengthFS()
There is no GetLengthUTF8() because strlen or std::string::size()
could be used instead.
2013-12-03 12:26:05 +06:00
Denis Krjuchkov
6c5828822c fs/AllocatedPath.hxx: add FromFS(std::string) method 2013-12-03 12:16:53 +06:00
Denis Krjuchkov
9dd824ba50 fs/Traits.hxx: don't use g_path_is_absolute 2013-12-03 11:59:57 +06:00
Denis Krjuchkov
d744ea3fca fs/Traits.hxx: simplify code
- Move definition of SEPARATOR_UTF8 out of #ifdef
- Remove duplicated check in IsSeparatorUTF8
2013-12-03 11:48:45 +06:00
Denis Krjuchkov
07352e82f1 PollGroupWinSelect: delete copy constructor and assignment operator 2013-12-03 11:43:26 +06:00
Denis Krjuchkov
1003cc9bf9 PollGroupWinSelect: uninline constructor and destructor 2013-12-03 11:41:36 +06:00
Lukas Stabe
0ea5f4ac3a output/openal: check __APPLE__ instead of HAVE_OSX
On OSX, the configure-flag --enable-osx is used to enable the
unsupported osx output. It sets the HAVE_OSX preprocessor define.

src/output/OpenALOutputPlugin.cxx uses this define to determine wether
it is building on OSX, and imports different headers (which have
nothing to do with the osx output) depending on wether or not it is
set.
2013-12-02 13:08:52 +01:00
Max Kellermann
2b717997e2 command: add commands "addtagid", "cleartagid" 2013-12-02 12:50:27 +01:00
Max Kellermann
20ebacf489 Tag: add methods RemoveAll(), RemoveType() 2013-12-02 12:46:48 +01:00
Max Kellermann
c6ef0e8887 pcm/Traits: add typedef "sum_type"
Allow 32 bit platforms to use 32 bit instead of 64 bit for summing 24
bit samples.
2013-12-02 11:48:10 +01:00
Max Kellermann
f761d583b5 pcm/Traits: use int_leastX_t types 2013-12-02 11:47:17 +01:00
Max Kellermann
cee1ac150e pcm/PcmChannels: implement fake N-to-M mapping
This is really just a mono mapper, but the important part is that this
library cannot fail anymore.
2013-12-02 11:42:19 +01:00
Max Kellermann
71b47ae3ef pcm/PcmChannels: use the SampleTraits library 2013-12-02 11:28:54 +01:00
Max Kellermann
36e3fda554 pcm/Traits: add template specialization for FLOAT 2013-12-02 11:26:38 +01:00
Max Kellermann
2b44a2c9bd pcm/PcmChannels: use struct ConstBuffer 2013-12-02 11:21:32 +01:00
Max Kellermann
af3b454805 pcm/PcmBuffer: add typed method GetT() 2013-12-02 11:21:32 +01:00
Max Kellermann
3a0f3eaa50 pcm/PcmUtils: use the SampleTraits library 2013-12-02 11:21:32 +01:00
Max Kellermann
80eb8d9e26 pcm/PcmUtils: remove unused function PcmClampN() 2013-12-02 11:21:32 +01:00
Max Kellermann
30c4136c4d pcm/PcmVolume: use the SampleTraits library 2013-12-02 11:21:32 +01:00
Max Kellermann
83e4475021 pcm/PcmFormat: use SampleTraits::long_type in ConvertFromFloat() 2013-12-02 11:21:32 +01:00
Max Kellermann
c071d6d9f6 pcm/PcmPrng: add "constexpr" 2013-12-02 11:21:32 +01:00
Denis Krjuchkov
1df426aa5c event: add poll() based PollGroup implementation 2013-12-02 14:39:52 +06:00
Max Kellermann
023482406f pcm/PcmMix: use the SampleTraits library for MixRamp 2013-12-01 22:49:50 +01:00
Max Kellermann
04ba40981f pcm/PcmMix: use the SampleTraits library 2013-12-01 22:44:16 +01:00
Max Kellermann
fc10bdf24d pcm/SampleTraits: use 64 bit for S24 long_type 2013-12-01 22:44:16 +01:00
Max Kellermann
28ad79c97a pcm/Traits: add typedef long_type 2013-12-01 19:32:48 +01:00
Max Kellermann
7661ad6653 pcm/Traits: add API documentation 2013-12-01 19:32:00 +01:00
Max Kellermann
e1436063ff pcm/PcmFormat: move generic definitions to Traits.hxx 2013-12-01 19:24:37 +01:00
Max Kellermann
3e11a28cd9 pcm/SoxrResampler: new resampler option using libsoxr 2013-12-01 19:13:39 +01:00
Max Kellermann
3ed80f3139 pcm/ConfiguredResampler: convert boolean flag to enum
Prepare for adding more resamplers.
2013-12-01 19:13:39 +01:00
Max Kellermann
a698cc8112 doc: move documentation from mpd.conf.5 to the user manual 2013-12-01 19:13:39 +01:00
Max Kellermann
916aaacb68 doc/user: remove obsolete "24_3" option 2013-12-01 19:13:39 +01:00
Max Kellermann
aaeb8150b7 NEWS: prepare for 0.19 2013-12-01 19:13:39 +01:00
Max Kellermann
5ba90cd8ea pcm/PcmResampler: convert to abstract interface
The PcmResampler interface is implemented by the two classes
FallbackPcmResampler and LibsampleratePcmResampler.  This prepares for
adding more resampler libraries.
2013-11-30 16:22:57 +01:00
Max Kellermann
e9127523db pcm/PcmConvert: move code to new class GluePcmResampler 2013-11-30 14:10:31 +01:00
Max Kellermann
92004f2e7e pcm/PcmConvert: move code to new class PcmChannelsConverter 2013-11-30 13:22:25 +01:00
Max Kellermann
0eefc7a43c pcm/PcmConvert: move code to new class PcmFormatConverter 2013-11-30 13:08:55 +01:00
Max Kellermann
3a666702af pcm/PcmConvert: add AudioFormat parameters
Don't use src_format.  In the middle of Convert(), the current
AudioFormat has already been modified, it's now something in between
src_format and dest_format.  This simplifies keeping track of what
remains to be done.
2013-11-30 13:00:41 +01:00
Max Kellermann
3c0c939689 pcm/PcmConvert: use struct ConstBuffer internally 2013-11-29 22:48:23 +01:00
Max Kellermann
413f7c64e5 pcm/PcmDsd: use struct ConstBuffer 2013-11-29 22:06:14 +01:00
Max Kellermann
6f47c1ca20 util/ConstBuffer: new utility class 2013-11-29 22:06:04 +01:00
Max Kellermann
abeebfe070 pcm/PcmDsd: make attributes private 2013-11-29 22:05:29 +01:00
Max Kellermann
1a002eb23d PcmConvert: add pcm_convert_global_init()
Wrapper for pcm_resample_global_init(), just in case other PCM
libraries need initialization, too.
2013-11-29 11:00:57 +01:00
Denis Krjuchkov
71bc15aca1 PollGroupEPoll.hxx: add const modifiers where applicable 2013-11-29 15:26:57 +06:00
Denis Krjuchkov
65b24ce557 Clock.cxx: provide all arguments for GetProcessTimes
All parameters seem mandatory, otherwise this call makes MPD crash.
2013-11-29 15:21:31 +06:00
Denis Krjuchkov
cfdd5edc49 event: implement PollGroup based on Windows select 2013-11-29 15:05:01 +06:00
Denis Krjuchkov
b9035d3e0a configure.ac: code style improvements
Rename HAVE_WINDOWS to host_is_windows for consistency.
Use 'yes' as true value instead of '1' for this variable.
Use test on this variable instead of case where applicable.
2013-11-29 12:30:29 +06:00
Max Kellermann
e504913b0f pcm: drop compatibility with libsamplerate older than 0.1.3
Remove compatibility code.
2013-11-28 20:48:02 +01:00
Max Kellermann
af4133e3c9 Util/StringUtil: add StringStartsWith()
Replaces GLib's g_str_has_prefix().
2013-11-28 18:48:35 +01:00
Max Kellermann
a788b7e747 PcmConvert: fix src_format corruption when converting from DSD
Method PcmConvert::Convert() modifies the src_format variable.  This
used to be a parameter, however commit d2679f59c made it an attribute
instead.  The modification to src_format persisted, and the next call
would return garbage.
2013-11-28 18:43:33 +01:00
Denis Krjuchkov
bb288f0284 event: introduce generic API for internal event loop 2013-11-28 17:06:16 +06:00
Max Kellermann
f90abe9530 include cleanup using iwyu 2013-11-28 11:50:54 +01:00
Max Kellermann
47c50c079d decoder/ffmpeg: use IgnoreError instead of local Error instance 2013-11-28 00:05:26 +01:00
Denis Krjuchkov
46bab7e4b9 Add infrastructure for using multiple event loops
This change adds two configuration options:

  --with-eventloop=[glib|internal|auto]
  --with-pollmethod=[epoll|auto]

First allows switching between GLib event loop and internal one.
Second chooses backend to use for internal event loop.
Conditional compilation symbols are changed accordingly.
Additional helper macro MPD_OPTIONAL_FUNC_NODEF is added as well.
2013-11-27 17:28:36 +06:00
Gaetan Bisson
3b0fea5fae input/cdio_paranoia: support libcdio-paranoia 0.90 2013-11-27 08:25:17 +01:00
Max Kellermann
443516cdda configure.ac: prepare for 0.18.6 2013-11-27 08:25:17 +01:00
Denis Krjuchkov
22fb49fa90 HttpdOutputPlugin.cxx: fix null pointer dereference 2013-11-26 18:13:23 +06:00
Denis Krjuchkov
957d187ae4 Main.cxx: initialize winsock before creating IO thread
Otherwise sockets can't be created during IO thread initialization.
2013-11-26 18:10:18 +06:00
Denis Krjuchkov
b88ea6735b configure.ac: set VERSION_MINOR to 19 2013-11-26 18:07:59 +06:00
Max Kellermann
51de8fd10a Volume, Output: use new class PeriodClock instead of GTimer 2013-11-25 22:09:46 +01:00
Max Kellermann
2ef6052536 ClientNew: fix nullptr dereference after g_get_prgname() failure
Hard-code the program name to "mpd" instead of using g_get_prgname().
The latter has become useless since this GLib variable doesn't get
initialized anymore.
2013-11-25 22:09:06 +01:00
Max Kellermann
394b1e6351 archive/iso9660: remove pointless formula 2013-11-24 22:49:15 +01:00
Max Kellermann
c95d068ef5 archive/iso9660: use reference instead of pointer 2013-11-24 22:47:50 +01:00
Max Kellermann
dbda35ffe1 archive/iso9660: convert structs to classes 2013-11-24 22:41:23 +01:00
Max Kellermann
6396e23a2a DatabaseGlue: make GetDatabase() "gcc_const"
This variable is initialized once on startup.  It will never change.
2013-11-24 22:04:45 +01:00
Max Kellermann
529b4bd185 Stats: use monotonic clock instead of GTimer
Reduce GLib usage.
2013-11-24 21:14:38 +01:00
Max Kellermann
85b51e4e77 Stats: use GetProcessTimes() on WIN32 to determine MPD uptime
Don't use GTimer if the operating system is able to tell us the
uptime.
2013-11-24 20:41:00 +01:00
Max Kellermann
e53a25cbae event: add API documentation 2013-11-24 19:28:04 +01:00
Max Kellermann
41e7145973 event/SocketMonitor: add missing space 2013-11-24 16:07:12 +01:00
Denis Krjuchkov
db238cc23f CommandLine: new command line parser
This implementation behaves mostly identical to old parser.
Few observable differences:
- There are no option groups (single group is used for all options)
- Option --stdout is hidden (it has been obsolete for a long time)
- MPD executable name (mpd) is hardcoded for simplicity
2013-11-24 17:29:05 +06:00
Max Kellermann
75e9c798e0 archive/iso9660: simplify _read() 2013-11-23 18:51:38 +01:00
Max Kellermann
99527051b5 Merge branch 'v0.18.x' 2013-11-23 18:45:02 +01:00
Max Kellermann
57e0cc5442 release v0.18.5 2013-11-23 18:30:12 +01:00
Max Kellermann
73f45d87d5 decoder/{dsf,dsdiff}: eliminate useless assignments 2013-11-23 18:30:12 +01:00
Max Kellermann
ae88ba986e archive/iso9660: eliminate useless assignments 2013-11-23 18:30:12 +01:00
Max Kellermann
d6247902ec input/curl: work around stream resume bug (fixed in libcurl 7.32.0) 2013-11-23 12:13:41 +01:00
Max Kellermann
a566c28a49 input/curl: add global variable "curl_version" 2013-11-23 12:08:46 +01:00
Max Kellermann
2eddb63a83 input/curl: dump version number 2013-11-23 12:02:39 +01:00
Max Kellermann
fc7d5b055d PcmResampleLibsamplerate: clip 24 bit data
Using pcm_resample_lsr_32() for 24 bit samples works, but may cause 24
bit overflows.  This commit makes 24 bit a special case with explicit
clipping.
2013-11-22 23:27:56 +01:00
Max Kellermann
87c8953e8e PcmResample: un-inline Resample24() 2013-11-22 23:24:40 +01:00
Max Kellermann
45d27a52f1 PcmUtils: add function PcmClampN() 2013-11-22 23:24:40 +01:00
Javier Domingo Cansino
bed98303a3 doc: audio_outputs sample output and explanation of each returned line 2013-11-22 10:18:17 +01:00
Max Kellermann
d22acc59c9 db/proxy: implement method GetUpdateStamp() 2013-11-22 00:45:27 +01:00
Max Kellermann
c064e8d62f DatabasePlugin: add method GetUpdateStamp()
Refactor SimpleDatabase::GetLastModified() to be generic for all
plugins.  Remove the SimpleDatabase assumption from db_stats_print(),
allowing it to be implemented by all database plugins.
2013-11-22 00:35:29 +01:00
Max Kellermann
099a2cb586 Stats: print db statistics only if db is available
Fixes crash on "stats" in certain configurations.
2013-11-22 00:27:37 +01:00
Max Kellermann
042fe2a9d0 Stats: print more unsigned integers 2013-11-22 00:23:27 +01:00
Max Kellermann
ff1c1107f3 Stats: auto-reload statistics with proxy plugin 2013-11-22 00:19:28 +01:00
Max Kellermann
41a3fd0fd0 Stats: use struct DatabaseStats
Eliminate redundant declaration.
2013-11-22 00:12:12 +01:00
Max Kellermann
b9169a5670 Stats: move the GTimer variable out of struct stats 2013-11-22 00:10:53 +01:00
Max Kellermann
2ecd5fa28d Stats: don't export the global variable "stats"
Unused outside of Stats.cxx.
2013-11-22 00:08:43 +01:00
Max Kellermann
e719b6cc41 Stats: print db_update as unsigned integer 2013-11-22 00:04:58 +01:00
Max Kellermann
67b8124a1d Mapper: _get_music_directory_utf8() may return nullptr
If no music_directory is configured, return nullptr instead of an
empty string.  This fixes a crash when db_file is configured without
music_directory.
2013-11-22 00:02:17 +01:00
Florian Schlichting
51ec499c89 system/ByteOrder: testing for endianness in a more general way
Fixes build tests on ia64 and mipsel by testing for endianness in a
more general / portable way.
2013-11-21 23:04:49 +01:00
Max Kellermann
3a4df25db2 util/ByteOrder: add comments 2013-11-21 23:04:31 +01:00
Max Kellermann
37cf78ef45 util/ByteOrder: indent the preprocessor directives
Improve readability.
2013-11-21 23:03:28 +01:00
Max Kellermann
727c622659 configure.ac: auto-detect fluidsynth by default
The option "--enable-fluidsynth" was documented to be "auto" by
default, when it was really "no".
2013-11-21 22:50:58 +01:00
Max Kellermann
74a778e65f configure.ac: prepare for 0.18.5 2013-11-18 20:03:30 +01:00
Denis Krjuchkov
1fc0c9fe8a NEWS: add version 0.18.5 change log 2013-11-18 16:40:00 +06:00
Denis Krjuchkov
740d8ec5ab system/fd_util.h: avoid symbol conflict with statically linked libmpdclient 2013-11-18 16:35:22 +06:00
Denis Krjuchkov
0bcc477d46 decoder/OggFind.cxx: include stdio.h for SEEK_END definition 2013-11-18 16:28:39 +06:00
Max Kellermann
d2679f59c5 PcmConvert: add methods Open(), Close()
Replaces Reset() and eliminates the AudioFormat parameters from the
Convert() method.
2013-11-13 21:06:33 +01:00
Max Kellermann
4ee147ea34 DecoderAPI: stop decoder on MPD error
This commit adds the basic infrastructure for reporting bugs from
DecoderAPI.cxx via DecoderThread.cxx to DecoderControl.
2013-11-13 20:57:13 +01:00
Max Kellermann
f1ca61d7d7 DecoderInternal: allocate PcmConvert dynamically
Reduce header dependencies and allow it to be nullptr to disable it.
2013-11-13 19:16:31 +01:00
Max Kellermann
a80b5cf19b DecoderInternal: move functions into the class 2013-11-13 19:13:47 +01:00
Max Kellermann
44ac84767e PcmResampleFallback: use PcmBuffer instead of PcmResampler
Lighter API.
2013-11-13 18:39:15 +01:00
Max Kellermann
a40d7ae4dd configure.ac: prepare version 0.19 2013-11-13 18:39:10 +01:00
Max Kellermann
35297f8d4f release v0.18.4 2013-11-13 18:26:01 +01:00
Max Kellermann
6f4202408c doc/example: remove "format" and "audio_output_format"
Just an attempt to prevent users from shooting themselves in the foot
by uncommenting these lines without knowing what they're doing.
2013-11-11 17:18:29 +01:00
Max Kellermann
0b6548a282 util/RefCount: no "constexpr" with libc++
Not supported by libc++.
2013-11-11 12:27:16 +01:00
Max Kellermann
faf5821816 util/LazyRandomEngine: make min()/max() static+constexpr
Required for building with libc++.
2013-11-11 12:27:15 +01:00
Max Kellermann
188673b746 output/httpd: don't use incomplete template argument with libc++ 2013-11-11 08:31:50 +01:00
Max Kellermann
287c70e361 filter/route, ...: add missing stdlib.h includes 2013-11-11 08:20:09 +01:00
Max Kellermann
f6b44af998 DespotifyUtils: add missing stdio.h include 2013-11-11 08:20:09 +01:00
Max Kellermann
84c3d9674f DecoderAPI: add missing math.h include 2013-11-11 08:18:54 +01:00
Jurgen Kramer
47d3758820 decoder/dsdiff: fix byte order bug 2013-11-10 16:49:39 +01:00
Max Kellermann
573ff3a24f DecoderThread: add missing <functional> include 2013-11-09 09:54:12 +01:00
Max Kellermann
32fcc22cb3 configure.ac: prepare for 0.18.4 2013-11-09 09:52:51 +01:00
Max Kellermann
daba1238b5 release v0.18.3 2013-11-08 12:55:12 +01:00
Max Kellermann
d125567f4a doc/developer: add text from the wiki 2013-11-08 12:54:16 +01:00
Max Kellermann
993eca9327 Makefile.am: disable dist-bzip2
bzip2-compressed tarballs are obsolete, xz is better and widely
understood.
2013-11-08 12:29:56 +01:00
Max Kellermann
e314844a4d doc: show .tar.xz in sample unpack command 2013-11-08 12:29:04 +01:00
Max Kellermann
017bc564af doc: replace the remaining wikia links 2013-11-08 12:26:07 +01:00
Max Kellermann
e076ff9085 DecoderAPI: log without holding mutex 2013-11-08 12:15:05 +01:00
Max Kellermann
2789493a5f PlayerThread: fix stuck MPD after song change (0.18.2 regression)
Commit 77c63511 caused MPD to become stuck right after a song change.
The problem was that at some point, the MusicBuffer became full, and
the DecoderThread working on the next song waits for the PlayerThread.
However, the PlayerThread was stuck in a loop of g_usleep() calls, and
never bothered to tell the DecoderThread that the MusicBuffer is not
full anymore.  This bug is very old, but its chance to occur went from
nearly 0% to nearly 100%.

The fix is to wake up the DecoderThread before waiting for it.  As a
side effect, I replaced the g_usleep() call with a Cond::Wait() call.
2013-11-08 12:02:21 +01:00
Max Kellermann
4ed0635447 DecoderInternal: simplify need_chunks()
Remove the "do_wait" parameter which is always true.  Check only
command==NONE and merge the "return" statements.
2013-11-08 11:59:56 +01:00
Max Kellermann
1904e504be DecoderInternal: don't wake up player in need_chunks
Nothing of interest happens here.  No need to wake up the player.
2013-11-08 11:58:23 +01:00
Max Kellermann
834715ea2f configure.ac: prepare for 0.18.3 2013-11-08 11:57:37 +01:00
Max Kellermann
380a3bbff4 release v0.18.2 2013-11-07 18:48:04 +01:00
Max Kellermann
6219326e02 doc: more information about "close" 2013-11-07 18:41:53 +01:00
Max Kellermann
6c4de5106b doc: remove documentation on obsolete tcp_keep_alive options 2013-11-07 18:39:55 +01:00
Max Kellermann
e936705840 doc: add link to user manual 2013-11-07 18:36:55 +01:00
Max Kellermann
9b2603b6f6 doc: update current maintainer 2013-11-07 18:34:57 +01:00
Max Kellermann
88856b847c doc: update Mantis link 2013-11-07 18:34:04 +01:00
Max Kellermann
f679878f7b doc/user: add more documentation for the proxy database plugin 2013-11-07 18:31:56 +01:00
Max Kellermann
f33acf8758 input/cdio_paranoia: add setting "default_byte_order"
Allows big-endian users to configure the fallback byte order to
little-endian.  Without this setting, MPD assumes native byte order if
the CD drive can't decide.
2013-11-07 18:17:54 +01:00
Max Kellermann
a846a4c643 AvahiPoll: don't close the dbus socket
Avoid closing it twice.
2013-11-07 01:10:07 +01:00
Max Kellermann
899c2bb9cc input/curl: unregister removed sockets from epoll
Fixes a crash bug.  See code comment.
2013-11-07 01:10:07 +01:00
Max Kellermann
f8f95e2dbd OutputControl: reduce the number of OutputThread wakeups
Wake up the OutputThread only if it hasn't already been woken up and
if it isn't already in the playback loop.
2013-11-06 23:51:17 +01:00
Max Kellermann
77c63511d8 PlayerThread: reduce the number of DecoderThread wakeups
After the number of decoded chunks has fallen below the threshold, the
PlayerThread woke up the DecoderThread over and over.  This commit
adds a boolean flag that avoids these duplicate wakeups, and thus
reduces the number of system calls.
2013-11-06 23:51:17 +01:00
Max Kellermann
0be5a6ab2b DecoderControl: reduce the number of PlayerThread wakeups
Wake up the PlayerThread only if it is really waiting for the decoder.
This greatly reduces the number of system calls in the DecoderThread.
2013-11-06 23:51:17 +01:00
Max Kellermann
9802e74859 DecoderInternal: lock DecoderControl in _flush_chunk()
Must hold the Mutex to signal the Cond object safely.
2013-11-06 23:51:17 +01:00
Max Kellermann
8e7d6eb151 DecoderInternal: wake up the player thread in _flush_chunk()
Merge duplicate code.
2013-11-06 23:51:17 +01:00
Max Kellermann
5c18e4f114 event/FullyBufferedSocket: remove obsolete TODO comment
We have a better solution now.
2013-11-06 23:50:36 +01:00
Max Kellermann
fd2eafa7c6 ClientRead: "close" flushes the output buffer
Add a new CommandResult code called "FINISH" which, unlike "CLOSE",
will attempt to flush the output buffer.  This is a one-shot attempt;
it will do one write, and not try again.
2013-11-06 22:01:06 +01:00
Max Kellermann
422b8472fe event/FullyBufferedSocket: try to write without extra roundtrip
Postpone the write using IdleMonitor instead of scheduling a write
event.  This reduces the number of system calls, because we don't need
to register and unregister the write event in epoll.
2013-11-06 21:52:24 +01:00
Max Kellermann
5b213b0504 event/FullyBufferedSocket: make WriteFromBuffer() protected
.. and rename it to Flush().
2013-11-06 21:52:09 +01:00
Max Kellermann
ad27d06979 PlayerThread: enable buffering when starting playback
For some reason, this got lost in commit 975deca8.

Re-enabling this fixes stuttering at the beginning of radio streams.
2013-11-06 20:14:38 +01:00
Max Kellermann
c4b1251d0a configure.ac: require libaudiofile 0.3 due to API breakage
Prior to version 0.3, the "length" callback returned a "long" instead
of AFfileoffset.  Now that this API bug fix is a few years old, let's
drop 0.2 support for good.
2013-11-06 20:04:21 +01:00
Max Kellermann
01891f8815 input/curl: fix bug with redirected streams
Migrate from the old curl_multi_perform() API to the newer
curl_multi_socket_action() API (since CURL 7.16).

This allows working around a bug with HTTP redirections with epoll:
when CURL closes a socket and the new one happens to have the same
file number, MPD did not have a chance to remove the old one from
epoll and subsequently attempted to use EPOLL_CTL_MOD, which was not
allowed by epoll, because it's a new socket now.
2013-11-06 19:14:22 +01:00
Max Kellermann
adb68450ce input/curl: move code into class CurlMulti
Move all global variables there, and keep just one global variable:
the pointer to the CurlMulti instance.  Prepares for the next commit.
2013-11-06 19:07:10 +01:00
Max Kellermann
2520f6fe49 input/curl: remove the global list of requests
Unused.
2013-11-06 19:06:14 +01:00
Max Kellermann
c9278bfcdf input/curl: don't abort all requests on curl_multi_perform() error
Eliminate some complicated code that's not worth the trouble.
2013-11-06 19:06:02 +01:00
Max Kellermann
8b838ff9ea input/curl: use CURLOPT_PRIVATE
Replaces the loop in input_curl_find_request().
2013-11-06 19:05:45 +01:00
Max Kellermann
154bdf0bca event/SocketMonitor: add method Abandon() 2013-11-06 19:05:45 +01:00
Max Kellermann
ed436c6f0c system/ByteOrder: fix big-endian support
D'oh!
2013-11-05 22:08:53 +01:00
Max Kellermann
ae5dd2da4f playlist/pls: fix reversed song order
Remove the forward_list::reverse() call.  It was not necessary,
because pls_parser() already reads the playlist in reverse order.
2013-11-05 18:22:34 +01:00
Jurgen Kramer
f4b61e8c8d decoder/dsf: enable DSD128 2013-11-05 17:38:48 +01:00
Max Kellermann
e49a3d377f NEWS: add missing line 2013-11-05 17:38:41 +01:00
Max Kellermann
b631b552bb test/*: add more missing stdlib.h includes 2013-11-05 17:28:23 +01:00
Natanael Copa
3f21581a81 add various missing headers
Fixes building with gcc-4.8

Signed-off-by: Natanael Copa <ncopa@alpinelinux.org>
2013-11-05 11:08:36 +01:00
Max Kellermann
bb62ecf157 configure.ac: prepare for 0.18.2 2013-11-05 11:08:17 +01:00
Max Kellermann
a268ab35ea release v0.18.1 2013-11-04 23:46:14 +01:00
Max Kellermann
62baec1841 output/alsa: avoid endless loop in Raspberry Pi workaround
See code comment.
2013-11-04 23:40:34 +01:00
Max Kellermann
7bca61f5bb event/ServerSocket: don't abort if IPv6 is not available
First check if an IPv6 socket can be created.
2013-11-04 23:36:02 +01:00
Max Kellermann
ecf12a60e8 Log: add level "DEFAULT"
Map LogLevel::INFO to G_LOG_LEVEL_INFO, and LogLevel::DEFAULT to
G_LOG_LEVEL_MESSAGE.  Now client connect/disconnect message are only
logged on log_level "secure".
2013-11-04 22:27:49 +01:00
Max Kellermann
6de85cb047 Log: document the LogLevel items 2013-11-04 22:17:53 +01:00
Max Kellermann
39257717d8 test/test_mixramp: add threshold to floating point comparisons
Fixes bogus test failures on Debian build machines due to rounding
errors (hopefully).
2013-11-04 22:08:59 +01:00
Max Kellermann
b54762a8f6 event/ServerSocket: fix assertion failure
Regression from previous commit.  D'oh!
2013-11-04 20:16:28 +01:00
Max Kellermann
bcae86196c event/ServerSocket: open sockets in the order they were configured
Use a std::list which can be appended at the end.
2013-11-04 20:10:46 +01:00
Max Kellermann
7adfea8ca2 system/resolver: return path of UNIX domain sockets
getnameinfo() doesn't work well - it always returns "localhost".
2013-11-04 19:13:05 +01:00
Max Kellermann
eab1a77683 ClientRead: always ignore whitespace at the end of the line 2013-11-04 18:11:15 +01:00
Max Kellermann
84f5e0c0de Makefile.am: distribute missing files 2013-11-04 08:26:10 +01:00
Max Kellermann
2ce3900071 filter/AutoConvert: modify child_audio_format, not in_audio_format
This prevented using the "volume_normalization" feature with some
codecs (e.g. mp3), because the normalization code requires 16 bit
samples.  If the codec happens to deliver formats other than S16, the
AutoConvert filter succeeds to initialize the conversion filter, but
the returned input audio format was wrong.
2013-11-04 08:00:00 +01:00
Max Kellermann
bf2c1f3e9e configure.ac: prepare for 0.18.1 2013-11-04 08:00:00 +01:00
Max Kellermann
8ccd8a008d release v0.18 2013-10-31 00:23:41 +01:00
Max Kellermann
9513c1a8d6 AUTHORS: add new authors 2013-10-31 00:23:41 +01:00
Max Kellermann
0a1be2bfc3 AUTHORS: new formatting 2013-10-31 00:18:44 +01:00
Max Kellermann
8c6727949c CommandLine: simplified program name line 2013-10-31 00:12:31 +01:00
Max Kellermann
ff9b717bf6 Makefile.am: add missing header file 2013-10-31 00:08:14 +01:00
Max Kellermann
8c834a4ff6 system/FatalError: use _exit() instead of exit()
Skip the global destructors.  We don't need them here - we bail out as
quickly as we can.
2013-10-30 23:42:16 +01:00
Max Kellermann
8c01004219 system/FatalError: move code to Abort() 2013-10-30 23:41:02 +01:00
Max Kellermann
8555b65c50 *: update copyright year to 2013 2013-10-30 23:37:06 +01:00
Max Kellermann
304fa5ecac ClientList: disconnect all clients in destructor
Fixes assertion failure.
2013-10-30 23:12:45 +01:00
Max Kellermann
88e630170e mixer/software: fix double free bug 2013-10-30 23:12:45 +01:00
Max Kellermann
da8bdd62c8 PlaylistState: ignore "mixrampdelay:nan"
mixramp_delay==nan() causes severe problems with cross-fading.
2013-10-30 22:33:02 +01:00
Max Kellermann
54abeab80b increase default buffer size to 4 MB
2 MB was too small for cross-fading a 24 bit file.  Increasing to 4 MB
is still not too large for weak machines, but is enough for
cross-fading.
2013-10-30 21:46:40 +01:00
Max Kellermann
1dc8a9f0e7 db/proxy: remove obsolete #undefs 2013-10-30 20:51:41 +01:00
Max Kellermann
a62d54425c db/proxy: auto-reconnect 2013-10-30 19:50:22 +01:00
Max Kellermann
c8b2591ac2 configure.ac: move -Werror before all other CFLAGS
Without -Werror, clang will not fail on -ftree-vectorize.
2013-10-30 19:17:07 +01:00
Max Kellermann
ee1d8e1091 configure.ac: default to enable_openal=auto 2013-10-30 19:02:59 +01:00
Max Kellermann
672fc8d79b configure.ac: enable -ffast-math and -ftree-vectorize
Allows advanced compiler optimization.
2013-10-30 18:30:04 +01:00
Max Kellermann
84ff1a680a configure.ac: enable some gcc options even in debug mode
Most importantly: always disable C++ exceptions.  It was surprising to
see MPD terminate due to an unexpected exception.
2013-10-30 18:22:35 +01:00
Max Kellermann
90c899407a ReplayGainInfo: use large negative value instead of infinity
The last piece to allow -ffast-math.
2013-10-30 18:01:45 +01:00
Max Kellermann
55868eecd0 PlayerCommands: show CrossFade/MixRamp only if enabled 2013-10-30 17:49:47 +01:00
Max Kellermann
50dc98367c PcmMix: use negative value instead of NaN for addition
Avoid NaN to allow -ffast-math.
2013-10-30 17:23:49 +01:00
Max Kellermann
c4d3030d24 CrossFade: eliminate NaN from mixramp_interpolate()
Use a boolean flag instead.
2013-10-30 17:20:34 +01:00
Max Kellermann
c6f101884b CrossFade: use negative value for invalid MixRamp overlap
Avoid NaN to allow -ffast-math.
2013-10-30 17:20:12 +01:00
Max Kellermann
c0c0526fc8 test/test_mixramp: improved test for mixramp_interpolate(0) 2013-10-30 17:18:54 +01:00
Max Kellermann
375c88b110 test/test_mixramp: add test with "invalid" return value 2013-10-30 17:14:40 +01:00
Max Kellermann
a65f63747b CrossFade: use negative value for invalid mixramp_delay
Avoid NaN to allow -ffast-math.
2013-10-30 16:50:34 +01:00
Max Kellermann
a21edddf27 CrossFade: remove obsolete API documentation 2013-10-30 16:45:02 +01:00
Max Kellermann
a88c23b6e8 Main: check the g_get_user_special_dir() result
Fixes crash.
2013-10-30 16:14:44 +01:00
Max Kellermann
216e37bf33 Makefile.am: link test/DumpDatabase with Ack.cxx 2013-10-30 16:14:44 +01:00
Max Kellermann
7bb3987acc db/proxy: return server errors using "enum ack" 2013-10-30 16:04:21 +01:00
Max Kellermann
6a147a17af db/proxy: pass search/find to remote MPD 2013-10-30 10:00:57 +01:00
Max Kellermann
2b7529e905 db/proxy: pass SongFilter to the remote MPD in VisitUniqueTags() 2013-10-30 09:40:23 +01:00
Max Kellermann
1ed321f964 db/proxy: add missing nullptr check 2013-10-30 09:37:20 +01:00
Max Kellermann
2aee1b86f3 SongFilter: add special keyword "base"
Restores the features from the previous draft commands "findin" /
"searchin".
2013-10-29 21:13:40 +01:00
Max Kellermann
b5fc21b9f4 Revert "command: new commands "findin", "searchin" with base URI"
This reverts commit a577944ab5.

Will be replaced by new options for the old commands "search" and
"find".
2013-10-29 21:13:40 +01:00
Max Kellermann
44581dbef5 util/UriUtil: add uri_is_child_or_same() 2013-10-29 21:13:40 +01:00
Jean-Francois Dockes
205448c1e8 db/proxy: enable song matching 2013-10-29 20:58:35 +01:00
Jean-Francois Dockes
2d11c6ab29 SongFilter: make SongFilter::Item class definition public 2013-10-29 20:47:52 +01:00
Max Kellermann
6859c22b69 SongFilter: "any" does not match file name
According to the protocol documentation, matching the file name was
wrong.  This removes some awkward special-case code.
2013-10-29 20:40:55 +01:00
Max Kellermann
2d5413fc3b DatabaseSelection: use std::string 2013-10-29 20:36:52 +01:00
Max Kellermann
a6aa0e4cbf SongFilter: use std::string 2013-10-29 19:39:17 +01:00
Max Kellermann
163848ab3b fd_util: avoid unnecessary fcntl() calls 2013-10-29 13:02:53 +01:00
Max Kellermann
03747ba93e PlayerControl: move attributes to struct CrossFadeSettings 2013-10-29 00:14:27 +01:00
Max Kellermann
095c390df7 FilterRegistry: add "pure" attribute 2013-10-29 00:05:04 +01:00
Max Kellermann
20597b3632 *: use nullptr instead of NULL 2013-10-28 23:58:17 +01:00
Max Kellermann
4728735acf decoder/dsf: don't play junk at the end of the "data" chunk 2013-10-28 23:47:25 +01:00
Max Kellermann
9dcbd005f0 decoder/dsf: add range check 2013-10-28 23:41:51 +01:00
Max Kellermann
0ad2eb34c7 decoder/dsdlib: add class DsdUint64
Merge lots of duplicate code.
2013-10-28 23:29:23 +01:00
Max Kellermann
0e8a15e813 decoder/dsdlib: include cleanup 2013-10-28 23:26:37 +01:00
Max Kellermann
5b0d6a59cf decoder/dsdlib: move API documentation to header 2013-10-28 23:26:16 +01:00
Max Kellermann
fd3dc7e5fb decoder/dsdlib: convert struct dsdlib_id to a class 2013-10-28 23:12:48 +01:00
Max Kellermann
c37edfd3e9 configure.ac: disable the OS X output plugin by default
There hasn't been a maintainer for this plugin for years.  It may even
fail to build.
2013-10-28 22:25:58 +01:00
Max Kellermann
4a99b1df4b configure.ac: add variable host_is_darwin
Fixes the OpenAL detection which was broken because enable_osx was
uesd which was set later.
2013-10-28 22:18:56 +01:00
Max Kellermann
12e9b7eafa PcmFormat: move definitions to struct SampleTraits 2013-10-28 21:29:36 +01:00
Max Kellermann
de1261ba28 MusicChunk: return WritableBuffer 2013-10-28 17:10:12 +01:00
Max Kellermann
5ee5a89a7f MusicChunk: use uint8_t instead of char 2013-10-28 17:08:14 +01:00
Max Kellermann
1ad2475f9e DecoderControl: convert mutex and client_cond to a reference
Share the Mutex between the DecoderThread and the PlayerThread.  This
simplifies synchronization between the two threads and fixes a freeze
problem: while the PlayerThread waits for the DeocderThread, it cannot
answer requests from the main thread, and the main thread will block
until the DecoderThread finishes.
2013-10-28 10:22:05 +01:00
Max Kellermann
5b5675cc12 player_control: rename to PlayerControl 2013-10-28 10:12:33 +01:00
Max Kellermann
e699f6781e decoder_control: rename to DecoderControl 2013-10-28 10:09:21 +01:00
Oddegamra
5f13c1cd9c output/httpd: accept icy-metadata with and without space
Some, or most, Win32 audio players will pass "icy-metadata:1" to
streaming servers. MPD expects a space between ":" and "1" at this
point, and thus does not send any stream metadata. This applies to
foobar2k and Winamp, for example.

According to forums.radiotoolbox.com/viewtopic.php?t=74 not having
a space there is expected behavior, so maybe MPD could accept
both forms to determine if metadata should be sent or not.
2013-10-26 16:32:00 +02:00
Max Kellermann
a577944ab5 command: new commands "findin", "searchin" with base URI 2013-10-26 16:13:35 +02:00
Max Kellermann
17ec3b0c2d FileCommands: "readcomments" understands APE and ID3v2 tags
Implements Mantis ticket 3843.
2013-10-26 16:04:29 +02:00
Max Kellermann
fb75137540 FileCommands: fix wrong control character check in IsValidValue()
Check was the wrong way around, and made all valid values invisible.
2013-10-26 16:04:06 +02:00
Max Kellermann
6f87164ad6 ApeTag: support multiple values per name 2013-10-26 16:00:05 +02:00
Max Kellermann
a4d82cfe1e ApeTag: move code to ForEachValue() 2013-10-26 15:57:09 +02:00
Max Kellermann
9f21eee2ec ApeTag: simplify the "recognized" flag 2013-10-26 15:52:49 +02:00
Max Kellermann
a40246d312 TagFile: use Path instead of const char * 2013-10-26 15:38:29 +02:00
Max Kellermann
4a5aad0948 PlayerControl: initialize tagged_song in constructor 2013-10-26 15:37:49 +02:00
Max Kellermann
85ae7e9c9a DecoderControl: move code/attributes to new class MixRampInfo 2013-10-26 14:19:34 +02:00
Max Kellermann
2098b94b47 DecoderThread: move code to DecoderControl::CycleMixRamp() 2013-10-26 14:12:10 +02:00
Max Kellermann
59ad6265a1 DecoderControl: add MixRamp getters 2013-10-26 14:08:09 +02:00
Max Kellermann
067572c6dd CrossFade: reimplement mixramp_interpolate() without strtok()
Don't require a writable string, and don't modify it.
2013-10-26 13:53:32 +02:00
Max Kellermann
7f03f68fcc CrossFade: apply coding style 2013-10-26 13:53:08 +02:00
Max Kellermann
de862f9f1b test/test_mixramp: unit test for mixramp_interpolate() 2013-10-26 13:49:15 +02:00
Max Kellermann
b5e31c89c0 CrossFade: merge "return" statements using "break" 2013-10-26 13:49:15 +02:00
Max Kellermann
e898400fbd CrossFade: use nullptr instead of NULL 2013-10-26 13:49:15 +02:00
Max Kellermann
3ac7de7a22 util/NumberParser: add ParseFloat() 2013-10-26 13:49:15 +02:00
Max Kellermann
ade66e7ece util/NumberParser: indent 2013-10-26 13:49:15 +02:00
Max Kellermann
6673f9e39d INSTALL: mention clang 2013-10-26 13:49:15 +02:00
Max Kellermann
2db2c0f0b7 INSTALL: mention minimum gcc version 2013-10-26 13:48:42 +02:00
Max Kellermann
17dc638c18 command: new command "readcomments" lists arbitrary file tags 2013-10-25 19:35:40 +02:00
Max Kellermann
d6e28c42e5 ReplayGainInfo: refactor to a class 2013-10-25 19:12:46 +02:00
Max Kellermann
6d475c40de ReplayGainInfo: use CamelCase for struct name 2013-10-25 19:12:38 +02:00
Max Kellermann
ed7891bf01 ReplayGainConfig: add "pure" attributes 2013-10-25 19:12:29 +02:00
Max Kellermann
e17da71a70 output/httpd: support HEAD requests 2013-10-25 00:32:48 +02:00
Max Kellermann
610bef9ff5 output/httpd: remove bogus assertion 2013-10-25 00:26:02 +02:00
Max Kellermann
961c7d0f78 OtherCommands: re-add the "volume" command
This command was removed by commit 206392ad (MPD 0.16), even though it
was been proven useful for some very simple clients.  On request, I
add it to the protocol again.
2013-10-25 00:20:36 +02:00
Max Kellermann
c1ba47beee MixerAll, Volume: add "pure" attributes 2013-10-25 00:15:55 +02:00
Max Kellermann
ac8e5be9f4 decoder/opus: support replay gain
Parse the R128_TRACK_GAIN comment string.
2013-10-24 23:56:06 +02:00
Max Kellermann
c76952534e decoder/Opus: implement seeking 2013-10-24 23:26:58 +02:00
Max Kellermann
f0060718de decoder/opus: provide time stamps
Call decoder_timestamp().  This is not necessary currently, but will
be as soon as we implement seeking.
2013-10-24 23:26:54 +02:00
Max Kellermann
982ab9e496 decoder/opus: show song duration during playback
This requires seeking to the end-of-stream, checking its granulepos,
and then seeking back to the previous file position.  We do this only
for local files.
2013-10-24 23:26:46 +02:00
Max Kellermann
b74bcf2274 decoder/opus: call ogg_stream_reset() in OggSeekPageAtOffset() 2013-10-24 23:23:23 +02:00
Max Kellermann
645cb5833d test/run_decoder: print the song duration 2013-10-24 21:35:05 +02:00
Max Kellermann
dc328e0c4a decoder/opus: move code to OggSeekPageAtOffset() 2013-10-24 20:40:23 +02:00
Max Kellermann
92c85bd20d decoder/opus: move SeekFindEOS() to OggFind.cxx 2013-10-24 20:33:12 +02:00
Max Kellermann
f629eb8cb2 decoder/opus: make opus_sample_rate constexpr 2013-10-24 20:14:47 +02:00
Max Kellermann
e4f41ff61d decoder/opus: use std::copy_n() instead of memcpy() 2013-10-24 20:06:50 +02:00
Max Kellermann
dae6ecb680 decoder/opus: support all core tag names 2013-10-24 20:01:14 +02:00
Max Kellermann
a57a7b1a76 decoder/opus: move code to ParseOpusTagName() 2013-10-24 20:01:14 +02:00
Max Kellermann
03073b366b decoder/opus: use delete[] for the OpusReader::ReadString() result 2013-10-24 20:01:14 +02:00
Max Kellermann
1bd8a9e744 DecoderAPI: add "pure" attributes 2013-10-24 20:01:05 +02:00
Max Kellermann
0a5c991ab5 decoder/wavpack: move variable declarations 2013-10-23 23:20:55 +02:00
Max Kellermann
93deb84499 input_stream: rename struct to InputStream 2013-10-23 23:12:02 +02:00
Max Kellermann
c4d4011c63 InputInternal: remove obsolete library 2013-10-23 23:10:27 +02:00
Max Kellermann
3d12f8d246 UriUtil: uri_remove_auth() returns std::string 2013-10-23 21:58:44 +02:00
Max Kellermann
c3e720279c test/test_util: unit test for libutil.a 2013-10-23 21:58:44 +02:00
Max Kellermann
f1027ed198 InputStream: add method Rewind() 2013-10-23 21:58:44 +02:00
Max Kellermann
fe3c5e4e8e DecoderThread: remove unused function deconst_plugin() 2013-10-23 21:57:28 +02:00
Max Kellermann
d110131ad6 Playlist: refresh new tags after database update
Fixes regression from commit e96779d.
2013-10-22 01:05:29 +02:00
Max Kellermann
10bc1a9acc decoder/flac: fix tag name comparison 2013-10-22 01:05:09 +02:00
Max Kellermann
3f899f83ff Playlist*, Queue: use GetDatabase() overload without Error
Don't use IgnoreError() when there's an overload that does not try to
give us one.
2013-10-22 00:59:56 +02:00
Max Kellermann
fc05768374 Queue: add method ModifyAtPosition() 2013-10-22 00:59:56 +02:00
Max Kellermann
03b57df630 Queue: ModifyAtOrder() does not increment version
Leave that to the caller, allowing it to modify multiple items at a
time.
2013-10-22 00:59:56 +02:00
Max Kellermann
4de3b6dc80 Partition: add method DatabaseModified() 2013-10-22 00:59:55 +02:00
Max Kellermann
c7bbfef19a UpdateRemove: include cleanup 2013-10-22 00:59:55 +02:00
Max Kellermann
7f1130b52b DecoderList: fix the decoder_plugin_from_mime_type() return value 2013-10-22 00:59:55 +02:00
Max Kellermann
2d696f46c3 PlaylistEdit: compare Song URIs in DeleteSong()
Fixes purging deleted songs from the queue after update.  Fixes
regression from commit e96779d.
2013-10-22 00:13:39 +02:00
Max Kellermann
2f43e4bc66 Playlist: copy stream tags from the PlayerThread
Finally restores an important feature that has been broken for several
months when the PlayerThread started working with Song copies instead
of pointers to the Queue's Song instances (commit e96779d).
2013-10-22 00:02:21 +02:00
Max Kellermann
f8c23488c9 Song: add method ReplaceTag() 2013-10-21 23:53:30 +02:00
Max Kellermann
1e2cda9239 Partition: add methods TagModified(), SyncWithPlayer()
Move code from class Instance.
2013-10-21 23:40:52 +02:00
Max Kellermann
20cba9e89f Song: pass reference to song_equals() 2013-10-21 23:19:15 +02:00
Max Kellermann
f6d67ac260 DecoderThread: simplify the decoder lookup loop
Merge the two loops into one, and eliminate the GSList.
2013-10-21 22:15:57 +02:00
Max Kellermann
74904b9cf2 DecoderList: reimplement _for_each() with function object 2013-10-21 22:02:19 +02:00
Max Kellermann
82059645f1 decoder: rename the struct to "Decoder" 2013-10-21 21:12:37 +02:00
Max Kellermann
13e9f18403 DecoderPlugin: move functions into the struct 2013-10-21 21:08:12 +02:00
Max Kellermann
875821f2ba SongUpdate: use tag_file_scan()
Eliminate duplicate code.
2013-10-21 21:05:59 +02:00
Max Kellermann
cc3be3aeed TagFile: use IgnoreError() 2013-10-21 20:52:59 +02:00
Max Kellermann
72af3c0489 decoder_plugin: rename struct to DecoderPlugin 2013-10-21 20:31:34 +02:00
Max Kellermann
65e54f6ed1 decoder/modplug: use WritableBuffer instead of GByteArray
Eliminate the temporary buffer, do I/O right into the WritableBuffer.
2013-10-21 20:22:53 +02:00
Max Kellermann
10196496f3 decoder/modplug: move code to LoadModPlugFile() 2013-10-21 20:19:27 +02:00
Max Kellermann
86f08862e4 playlist/EmbeddedCue: use std::string for the "cuesheet" attribute 2013-10-21 10:53:31 +02:00
Max Kellermann
83c726a34f GetBaseUTF8 2013-10-21 10:50:22 +02:00
Max Kellermann
a0415f73d4 archive/bz2: remove unused function bz2_quark() 2013-10-21 10:50:22 +02:00
Max Kellermann
93068f10ec fs/AllocatedPath: don't include glib.h 2013-10-21 10:27:14 +02:00
Max Kellermann
7142c81c05 DirectorySave: use Directory::GetName() 2013-10-21 10:04:59 +02:00
Max Kellermann
c0421a57da input/curl: don't use GLib's typedef "gushort" 2013-10-21 09:54:21 +02:00
Max Kellermann
8f1ec1dfdf util/NumberParser: utilities for parsing numbers from ASCII strings 2013-10-21 09:48:31 +02:00
Max Kellermann
222dc8a239 Util/ASCII: add StringEqualsCaseASCII() overload with length
Replaces GLib's g_ascii_strncasecmp().
2013-10-21 08:42:55 +02:00
Max Kellermann
0e4d2e7277 Util/ASCII: add function StringEqualsCaseASCII()
Replaces GLib's g_ascii_strcasecmp().
2013-10-20 23:09:51 +02:00
Max Kellermann
2bbff77e48 OutputControl: convert anonymous enum to constexpr 2013-10-20 13:53:01 +02:00
Max Kellermann
3315c67f0f Inotify: convert anonymous enum to constexpr 2013-10-20 13:51:55 +02:00
Max Kellermann
b879bcb1eb UpdateWalk: convert anonymous enum to constexpr 2013-10-20 13:50:34 +02:00
Max Kellermann
ae99135c8d Main: convert anonymous enum to constexpr 2013-10-20 13:47:32 +02:00
Max Kellermann
1defb38a6f DatabaseSave: convert anonymous enum to constexpr 2013-10-20 13:46:13 +02:00
Max Kellermann
56bc9e12ee ClientInternal: convert anonymous enum to constexpr 2013-10-20 13:45:47 +02:00
Max Kellermann
116ebe0494 Idle: convert anonymous enum to constexpr 2013-10-20 13:45:21 +02:00
Max Kellermann
5ec843dcc8 *Commands: move to src/command/ 2013-10-20 13:41:04 +02:00
Max Kellermann
a78b2d84ed TagType: rename enum tag_type to TagType 2013-10-20 13:32:59 +02:00
Max Kellermann
cf4d80fc65 command: convert command_return to to a strictly-typed enum 2013-10-20 13:10:54 +02:00
Max Kellermann
8118bc93a8 FatalError: remove unused GError overload 2013-10-20 13:10:09 +02:00
Max Kellermann
c772bc45c6 PlaylistError: convert playlist_result to a strictly-typed enum 2013-10-20 13:06:40 +02:00
Max Kellermann
c1e7be3b8e decoder/sidplay: add header file 2013-10-20 13:05:50 +02:00
Max Kellermann
17ecc56e83 decoder/sidplay: update file name 2013-10-20 13:03:58 +02:00
Max Kellermann
6a42e6f6d4 doc/developer: require C++11 2013-10-20 13:03:32 +02:00
Max Kellermann
75ba961e97 Client: move message functions into the class 2013-10-19 19:44:45 +02:00
Max Kellermann
c2d5ce0ca2 Client: move trivial functions into the Client class 2013-10-19 19:39:40 +02:00
Max Kellermann
32645b80c4 ClientInternal: move class Client to Client.hxx
Publish the Client API, preparing to move more code into the Client
class.
2013-10-19 19:35:37 +02:00
Max Kellermann
ff626ac763 *: use references instead of pointers 2013-10-19 18:48:38 +02:00
Max Kellermann
59f8144c50 *: use nullptr instead of NULL 2013-10-19 18:19:03 +02:00
Max Kellermann
5a7c931293 input/cdio: use class AllocatedPath 2013-10-19 17:48:46 +02:00
Max Kellermann
1373d40fea decoder/mpg123: use const_cast instead of g_strdup() 2013-10-19 17:46:00 +02:00
Max Kellermann
3274bb54ad event/ServerSocket: pass AllocatedPath to AddPath() 2013-10-19 17:40:56 +02:00
Max Kellermann
7db124068f ConfigPath: use std::string 2013-10-19 17:32:49 +02:00
Max Kellermann
39e2ffe212 decoder/mikmod: use const_cast instead of g_strdup() 2013-10-19 17:30:56 +02:00
Max Kellermann
0a213ddf03 input/curl: use std::string for meta_name
Automatic memory management.
2013-10-19 17:24:21 +02:00
Max Kellermann
5dc4cbdf82 util/FormatString: new library to replace g_strdup_printf() 2013-10-19 17:24:21 +02:00
Max Kellermann
1434e5a22e decoder/gme,input/curl,...: use static buffers instead of g_strdup_printf() 2013-10-19 17:15:17 +02:00
Max Kellermann
9acc1e1e97 Permission: use std::find instead of g_strsplit() 2013-10-19 16:47:56 +02:00
Max Kellermann
daa47546c7 Permission: move code to ParsePermission() and a table 2013-10-19 16:47:41 +02:00
Max Kellermann
c5194d0a8f Permission: convert PERMISSION_* from macro to constexpr 2013-10-19 16:47:23 +02:00
Max Kellermann
7ece8ff85c Permission: remove nullptr check
Both callers pass non-nullptr.
2013-10-19 16:40:40 +02:00
Max Kellermann
a4effeb3f9 Permission: convert PERMISSION_PASSWORD_CHAR from macro to constexpr 2013-10-19 16:39:45 +02:00
Max Kellermann
d3f28a1d7f FilterConfig: use std::find instead of g_strsplit_set() 2013-10-19 16:34:11 +02:00
Max Kellermann
03cddd0acf FilterConfig: return bool 2013-10-19 16:29:56 +02:00
Max Kellermann
04a737e04c FilterConfig: move code to filter_chain_append_new() 2013-10-19 16:26:51 +02:00
Max Kellermann
966c54bef5 FilterConfig: eliminate duplicate API documentation 2013-10-19 16:23:40 +02:00
Max Kellermann
efcd9dfc35 ConfigData: use strtoul() in GetUnsignedValue()
Lifts the artificial 31 bit limit in i386 where
sizeof(long)==sizeof(int).
2013-10-19 16:12:52 +02:00
Sebastian Thorarensen
db44a6e948 decoder/modplug: Add "loop_count" parameter
The "loop_count" configuration parameter allows the user to set how
many times a module with backward loops shall loop. "0" (the default)
means a module is not allowed to use backward loops at all. "-1"
enables inifinite looping.
2013-10-19 16:12:17 +02:00
Sebastian Thorarensen
d6553fc6a7 ConfigData: Add support for signed integers
Now config_param::GetBlockValue() can be used to get signed integers
from the configuration.
2013-10-19 16:11:33 +02:00
Ben Boeckel
fc9014f7ec PlayerThread: Only drop 0 length packets without tags
Fixes a regression from 752dfb3d95 which
caused the current chunk to be flushed as soon as new replaygain
information was found. If this occurs on a tag chunk, it has no data
(length 0) and is then skipped before pushing it to all of the outputs.

This change allows 0-length chunks through if they contain a tag and
they are now appearing in mplayer and mpv properly.
2013-10-19 15:45:11 +02:00
Max Kellermann
b39ab76118 Util/CharUtil: new library replacing g_ascii_isX() 2013-10-19 15:36:47 +02:00
Max Kellermann
90777f78c9 playlist/(Ext)M3u: use strchug_fast() 2013-10-19 15:36:47 +02:00
Max Kellermann
7cb803ad5c test/test_pcm: use C++11 random instead of GLib 2013-10-19 15:05:48 +02:00
Max Kellermann
8e063829c4 encoder/{opus,vorbis}: new serial generator replacing g_random_int() 2013-10-19 14:43:24 +02:00
Max Kellermann
139c6be370 encoder/wave: include cleanup 2013-10-19 02:05:44 +02:00
Sebastian Thorarensen
b6ac249c3c decoder/mikmod: Add loop configuration parameter
This patch allows the user to configure the mikmod decoder plugin to loop
modules. It adds a configuration parameter to the mikmod decoder called
"loop" which can be "no" (the old behaviour, default) or "yes" to allow
modules to use backward loops.
2013-10-18 14:23:24 +02:00
Max Kellermann
5e103b5fb7 filter/route: merge the two loops, one-pass parsing 2013-10-18 12:24:49 +02:00
Max Kellermann
de5be62da5 filter/route: allocate "sources" statically
Worst-case allocation using MAX_CHANNELS.
2013-10-18 12:24:47 +02:00
Max Kellermann
b5f608d026 filter/route: use int8_t instead of signed char 2013-10-18 12:24:47 +02:00
Max Kellermann
58fe352fda util/StringUtil: rename strchug_fast_c() to strchug_fast()
Overload the name.
2013-10-18 12:24:47 +02:00
Max Kellermann
b105093dcd ZeroconfAvahi: convert avahiRunning to a "bool" 2013-10-18 10:50:14 +02:00
Max Kellermann
d1c401fe7a ZeroconfAvahi: integrate into the EventLoop
Finally fixes the regression by commit c1f4f1fd.
2013-10-18 09:16:55 +02:00
Max Kellermann
964aa42b04 test/run_avahi: new debug program 2013-10-18 09:01:34 +02:00
Max Kellermann
bf8660b21c test/run_inotify: use SignalMonitor 2013-10-18 08:56:25 +02:00
Max Kellermann
43863a70c8 SignalMonitor: add SignalMonitorGetEventLoop()
Eliminate the global variable "shutdown_loop".
2013-10-18 08:44:40 +02:00
Max Kellermann
bd5a70c712 input/curl: use MultiSocketMonitor constants instead of GLib 2013-10-18 08:30:44 +02:00
Max Kellermann
909ff4b8a9 valgrind.suppressions: add g_get_home_dir suppression 2013-10-18 01:14:31 +02:00
Max Kellermann
bcfc62a3f2 PlaylistEdit, QueueSave: free the Song object after Append()
Fix for a major memory leak.
2013-10-18 01:12:47 +02:00
Max Kellermann
d1924867db valgrind.suppressions: add libGnuTLS suppression 2013-10-18 01:00:20 +02:00
Max Kellermann
abfbd55305 fs/Path: rename to AllocatedPath
The new class Path only holds a string pointer without being
responsible for allocation/deallocation.  The FileSystem.hxx library
accepts Path arguments instead of AllocatedPath, to avoid forcing
callers to allocate another string object.
2013-10-17 23:43:46 +02:00
Max Kellermann
b3611524f4 fs/Path: move definitions to struct PathTraits 2013-10-17 23:23:25 +02:00
Max Kellermann
a63613dba0 fs/Path: include clenaup 2013-10-17 23:20:26 +02:00
Max Kellermann
7fec2b02d4 fs/Charset: GetFSCharset() returns "utf-8" by default
If fs_charset is empty, i.e. we're using the default "utf-8",
GetFSCharset() should return exactly that instead of an empty
std::string.
2013-10-17 22:47:09 +02:00
Max Kellermann
608a98c873 fs/Charset: default filesystem charset is UTF-8
Implement a fast path for UTF-8 which leaves fs_charset empty, and
don't assign a value to fs_charset if there's no configuration.
2013-10-17 22:42:22 +02:00
Max Kellermann
f951e5356b fs/Charset: don't allow nullptr arguments 2013-10-17 22:39:06 +02:00
Max Kellermann
080ee87e07 fs/Path: move configuration code to Config.cxx 2013-10-17 22:29:03 +02:00
Max Kellermann
fa60b9ae94 fs/Path: move path_domain to Domain.hxx 2013-10-17 22:20:53 +02:00
Max Kellermann
0d33ae52c6 fs/Path: make fs_charset static 2013-10-17 22:10:27 +02:00
Max Kellermann
77e4b28092 fs/Path: include cleanup 2013-10-17 22:08:57 +02:00
Max Kellermann
4817437d31 fs/Limits: convert macro to "constexpr" 2013-10-17 22:08:56 +02:00
Max Kellermann
354b5a9365 fs/Path: move MPD_PATH_MAX to Limits.hxx 2013-10-17 22:00:01 +02:00
Max Kellermann
58502b38d3 *: use std::numeric_limits 2013-10-17 21:53:19 +02:00
Max Kellermann
d44880dfa9 UpdateGlue: handle update id management
Add UpdateQueueItem::id to keep track of the id in every item.
Replaces thhe hack in update_queue_push().
2013-10-17 21:45:53 +02:00
Max Kellermann
0c63632cc2 UpdateGlue: pass UpdateQueueItem around
Fixes a few kludges and avoids GLib allocation.
2013-10-17 21:45:42 +02:00
Max Kellermann
b93523c0b1 UpdateGlue: never pass null to update_enqueue() 2013-10-17 21:45:41 +02:00
Max Kellermann
7ef40de98b UpdateQueue: use std::string and std::queue 2013-10-17 21:13:40 +02:00
Max Kellermann
196ec25682 Mapper: use std::string 2013-10-17 19:54:58 +02:00
Max Kellermann
c85af12d45 StickerDatabase: return std::string 2013-10-17 19:39:23 +02:00
Max Kellermann
e452d1f5b4 StickerDatabase: add pure/const attributes 2013-10-17 19:39:22 +02:00
Max Kellermann
ffea268d2e PlayerControl: GetError() returns an Error, not a char* 2013-10-17 19:34:59 +02:00
Max Kellermann
8e676db633 Thread/Thread: replacement library for GThread 2013-10-17 19:29:47 +02:00
Max Kellermann
f6d74012b7 util/Error: add method SetLastError() 2013-10-17 19:29:38 +02:00
Max Kellermann
32dfc11c23 Main: use ThreadId instead of GThread* 2013-10-17 19:28:34 +02:00
Max Kellermann
aad0ea6e23 Makefile.am: move sources to libthread.a 2013-10-17 19:26:23 +02:00
Max Kellermann
05de2e998c InputStream: use int64_t instead of goffset
Decouple some more from GLib.
2013-10-17 10:45:10 +02:00
Max Kellermann
24780d99e6 input_plugin: rename struct to "InputPlugin" 2013-10-17 10:20:57 +02:00
Max Kellermann
7c1cf61728 thread/{Cond,Mutex}: use "class" instead of "typedef"
Allows forward-declaration.
2013-10-17 10:06:31 +02:00
Max Kellermann
eb10d08671 CueParser: use std::string 2013-10-17 01:34:10 +02:00
Max Kellermann
abb0549e4b InotifyUpdate: use class Path 2013-10-17 01:16:46 +02:00
Max Kellermann
5327ea13ac PlaylistSave: eliminate the last g_warning() call 2013-10-17 01:15:54 +02:00
Max Kellermann
be8ceae6e6 Song: GetURI() returns std::string 2013-10-17 01:01:15 +02:00
Max Kellermann
67ae033de7 ArchiveLookup: in-place editing, avoid string copy 2013-10-17 00:54:20 +02:00
Max Kellermann
161f7ced96 ArchiveLookup: declare local variables later 2013-10-17 00:48:58 +02:00
Max Kellermann
72bc11b180 ArchiveLookup: don't reset out arguments
If we return false, their values are undefined.
2013-10-17 00:46:26 +02:00
Max Kellermann
15c2538532 ArchiveLookup: move code to FindSlash() 2013-10-17 00:44:57 +02:00
Max Kellermann
fd9dd9343b ArchiveLookup: move code to FindSuffix() 2013-10-17 00:38:26 +02:00
Max Kellermann
1b8a1d4140 ArchiveLookup: return const strings 2013-10-17 00:36:52 +02:00
Max Kellermann
e132d10aec ArchiveLookup: move API documentation to header 2013-10-17 00:36:35 +02:00
Max Kellermann
3dbda2dda2 test/test_archive: unit test for archive_lookup() 2013-10-17 00:19:22 +02:00
Max Kellermann
a0105b45ae configure.ac: add function MPD_AUTO_LIB and use it 2013-10-17 00:09:08 +02:00
Max Kellermann
551b7768fc configure.ac: define HAVE_MPCDEC
Restore the "mpcdec" decoder plugin that was accidently broken since
commit 8ead8f7e.
2013-10-17 00:07:04 +02:00
Max Kellermann
d6967db761 decoder/wildmidi: remove suport for libwildmidi 0.2.2 or older 2013-10-16 23:57:26 +02:00
Max Kellermann
b0967cae69 configure.ac: don't leak -lsidutils -lmp3lame into
Make the third argument to AC_CHECK_LIB() non-empty to disable its
default handler.
2013-10-16 23:46:11 +02:00
Max Kellermann
401a799a1b test: use the CPPUNIT framework for unit tests 2013-10-16 23:36:36 +02:00
Max Kellermann
ba98518c69 Makefile.am: distribute util/Domain.hxx and system/ByteOrder.hxx 2013-10-16 23:36:03 +02:00
Max Kellermann
5e26e2ab1d system/ByteOrder: new library for byte ordering / endianess
Replacing GLib macros.
2013-10-16 22:09:44 +02:00
Max Kellermann
08eca827b6 util/ByteReverse: use C99 "restrict"
Micro-optimization.
2013-10-16 22:07:59 +02:00
Max Kellermann
6b2b5af344 util/byte_reverse: convert to C++ 2013-10-16 22:07:52 +02:00
Max Kellermann
f32fbd9ed1 pcm_pack: convert to C++ 2013-10-16 22:07:43 +02:00
Max Kellermann
e3511d0ee0 encoder/wave: use delete to dispose the WaveEncoder object 2013-10-16 22:07:32 +02:00
Max Kellermann
fa13a6616f Archive*: move archive_domain to ArchiveDomain.cxx
Merge duplicate symbol.
2013-10-15 23:24:54 +02:00
Max Kellermann
d4c2f91182 ConfigData: remove unused method DupBlockString() 2013-10-15 23:19:44 +02:00
Max Kellermann
084fd8df63 playlist/soundcloud: use std::string 2013-10-15 23:17:53 +02:00
Max Kellermann
328131b7aa output/roar: use const_cast instead of g_strdup() 2013-10-15 23:14:34 +02:00
Max Kellermann
85003429af output/roar: use std::string 2013-10-15 23:11:32 +02:00
Max Kellermann
6db77dcf75 output/roar: move code into the RoarOutput class 2013-10-15 22:58:38 +02:00
Max Kellermann
1cde86823d output/pipe: use std::string 2013-10-15 22:52:04 +02:00
Max Kellermann
dbd88e6aef Client, ...: remove unnecessary glib.h include 2013-10-15 22:51:09 +02:00
Max Kellermann
45418583e9 ApeTag: use std::string for temporary allocation 2013-10-15 22:50:02 +02:00
Max Kellermann
77a1133723 PlaylistRegistry: use std::string for temporary allocation 2013-10-15 22:49:51 +02:00
Max Kellermann
25c208d81d input/*: don't allocate attribute "mime"
This was a memory leak, because "mime" was a std::string which created
another copy and discarded the allocated buffer.
2013-10-15 22:49:23 +02:00
Max Kellermann
67f87db511 UpdateArchive: use std::string for temporary string 2013-10-15 22:49:12 +02:00
Max Kellermann
7de96275dd ConfigData: use std::string for config_param::value 2013-10-15 22:49:01 +02:00
Max Kellermann
e13d0bf656 Permission: use std::string for temporary password allocation
As a side effect, this fixes a memory leak.
2013-10-15 22:48:09 +02:00
Max Kellermann
8ed9f7effa Mapper: remove obsolete variable music_dir_fs_length 2013-10-15 22:48:01 +02:00
Max Kellermann
12ab556477 event/BufferedSocket: pass writable pointer to OnSocketInput()
Remove the const_cast from HttpdClient.cxx, and avoid one allocation
in ClientRead.cxx.
2013-10-15 22:47:46 +02:00
Max Kellermann
509f8dab89 Util/Macros: replacement for GLib's G_N_ELEMENTS() 2013-10-15 22:47:39 +02:00
Max Kellermann
77429b6dd3 output/winmm: use delete instead of g_free() 2013-10-15 22:47:25 +02:00
Max Kellermann
84d20d9e43 util/FifoBuffer: C++ version of the fifo_buffer library 2013-10-15 10:28:52 +02:00
Max Kellermann
0c13703da3 system/clock: convert to C++ 2013-10-15 09:38:12 +02:00
Max Kellermann
b97b7a7493 require GLib 2.28
The header glib_compat.h is now obsolete and can be removed.
2013-10-15 09:35:25 +02:00
Max Kellermann
be2951b45f gcc.h: rename to Compiler.h 2013-10-15 09:21:59 +02:00
Max Kellermann
1dd1a705b5 gcc.h: major update
Copy the according file from another project (i.e. XCSoar).  This will
allow copying more code more easily.
2013-10-15 09:13:22 +02:00
Max Kellermann
e4e80ff0cb *: use WIN32 instead of G_OS_WIN32 2013-10-15 08:33:44 +02:00
Max Kellermann
9508ea982b fs/Path: add method IsAbsolute() 2013-10-14 22:38:29 +02:00
Max Kellermann
47d655ea7f fs/Path: add separator constants/functions 2013-10-14 22:26:23 +02:00
Max Kellermann
62271bf6ce PlaylistFile: always check for absolute paths within music_directory
Try map_fs_to_utf8() first, and fall back to Path::ToUTF8() for
absolute paths.
2013-10-14 22:21:22 +02:00
Max Kellermann
0b27ac2f5c fs/Path: add method RelativeFS()
Move code from map_fs_to_utf8().
2013-10-14 22:09:02 +02:00
Max Kellermann
6fd481df97 Mapper, ...: use memcmp() instead of strncmp() where appropriate
Micro-optimization.
2013-10-14 22:00:21 +02:00
Max Kellermann
b915e43391 fs/Path: add method data() 2013-10-14 21:57:43 +02:00
Max Kellermann
c96b295700 PlaylistFile: fix memory leak
Consistently use std::string in LoadPlaylistFile().
2013-10-14 21:53:08 +02:00
Max Kellermann
9067da2df8 Mapper: map_fs_to_utf8() returns std::string
Avoid the conversion to an allocated char*, let the caller decide.
2013-10-14 21:43:41 +02:00
Max Kellermann
8cf2f52f7a Merge tag 'release-0.17.6' 2013-10-14 21:40:56 +02:00
Max Kellermann
681352ac3b release 0.17.6 2013-10-14 21:15:55 +02:00
Florian Schlichting
d9c662d51f decoder/modplug: fix include directory 2013-10-14 21:12:47 +02:00
Max Kellermann
ad631d563b stored_playlist: use fs_charset_to_utf8() for URLs 2013-10-14 21:11:20 +02:00
Max Kellermann
7cbaf11dda load_file 2013-10-14 21:00:46 +02:00
Max Kellermann
3be63549c0 stored_playlist: add "file://" prefix to absolute paths
Prepare to fix loading arbitrary song files from stored playlists.
2013-10-14 20:52:49 +02:00
Max Kellermann
17c6db6c33 replay_gain_*.h: rename to *.hxx 2013-10-02 12:22:12 +02:00
Max Kellermann
86316b1828 output/httpd: don't include glib.h in header 2013-10-02 12:20:36 +02:00
Max Kellermann
efc3a69dbf Stats: don't include glib.h in header
Use forward declaration instead.
2013-10-02 12:16:52 +02:00
Max Kellermann
ec883e1901 Stats: rename stats.h to Stats.hxx 2013-10-02 12:14:07 +02:00
Max Kellermann
060814daa8 Log: new logging library API
Prepare to migrate away from GLib.  Currently, we're still using GLib
as a backend.
2013-10-02 08:57:55 +02:00
Max Kellermann
c53492a76a TextFile: don't include glib.h in header
Un-inline the methods that use GLib.
2013-10-02 08:56:27 +02:00
Max Kellermann
43675717b8 filesystem/Path: use std::string 2013-10-02 08:56:27 +02:00
Max Kellermann
b21ed2fa36 PlaylistMapper: convert playlist name to filesystem charset 2013-10-02 08:56:27 +02:00
Max Kellermann
0214baad5a Playlist*: use nullptr instead of NULL 2013-10-02 08:56:27 +02:00
Max Kellermann
c2d3ed2acc Listen, ...: add missing includes 2013-10-02 08:56:27 +02:00
Max Kellermann
0339c8d025 ConfigData: handle default_value==nullptr
Return Path::Null() instead of dying from assertion failure.
2013-10-02 08:56:02 +02:00
Max Kellermann
0e0be0243b Daemon, Mapper: move-assign the Path objects 2013-10-01 18:50:18 +02:00
Max Kellermann
a2ce2447a6 Merge branch 'v0.17.x' 2013-10-01 17:20:38 +02:00
Max Kellermann
9a1076256d mixer/alsa: handle ENODEV
Fixes busy loop when USB sound device gets unplugged (Mantis bug
#3824).
2013-10-01 16:35:27 +02:00
Max Kellermann
72ef38d4a7 mixer/alsa: log snd_mixer_handle_events() errors 2013-10-01 16:30:20 +02:00
Max Kellermann
d397ce68dc prepare 0.17.6 2013-10-01 16:29:54 +02:00
Max Kellermann
5e20b7976f DecoderControl: lock the mutex in Seek()
Use LockSynchronousCommand() instead of SynchronousCommandLocked().
Fixes regression from commit ef663810 (dead lock due to cond_wait with
unlocked mutex).
2013-09-30 16:20:35 +02:00
Max Kellermann
36f712b949 tag/{riff,aiff}: convert to C++ 2013-09-28 14:14:13 +02:00
Max Kellermann
a446775d80 playlist/lastfm: remove defunct Last.fm support
This plugin has been defunct ever since Last.fm changed their
protocol.  Since there is no volunteer willing to fix the plugin, I'm
removing it now.
2013-09-28 14:01:51 +02:00
Max Kellermann
ccd7f0825a DecoderControl: use GLib forward declarations 2013-09-27 23:00:23 +02:00
Max Kellermann
d0896ea7c4 PlayerThread: convert struct player to a class 2013-09-27 22:22:11 +02:00
Max Kellermann
a73d1e4b1c PlayerThread: use strictly typed enum 2013-09-27 22:19:26 +02:00
Max Kellermann
d05bb2a0af PlayerControl: use strictly typed enums 2013-09-27 22:07:20 +02:00
Max Kellermann
6765901687 DecoderControl: convert "enum decoder_state" to strictly-typed enum 2013-09-27 12:27:33 +02:00
Max Kellermann
c5d05ac0cf DecoderCommand: convert to strictly-typed enum 2013-09-27 12:11:37 +02:00
Max Kellermann
939003c1f1 OutputAll: add pure/const attributes 2013-09-27 09:38:47 +02:00
Max Kellermann
a10f3a8aec PlayerControl: convert functions to methods 2013-09-27 09:30:19 +02:00
Max Kellermann
ef663810a2 DecoderControl: convert functions to methods 2013-09-27 09:18:03 +02:00
Max Kellermann
ada67a6a4f PlayerThread: move code to player_control::CommandFinished() 2013-09-27 07:58:48 +02:00
Max Kellermann
b6a5d1ad5a PlayerThread: use nullptr instead of NULL 2013-09-27 00:03:22 +02:00
Max Kellermann
d8c5a63bc2 PlayerThread: unlock/lock in player_task() 2013-09-26 23:58:41 +02:00
Max Kellermann
bcb2db62c9 PlayerThread: move code into the player class 2013-09-26 23:57:31 +02:00
Max Kellermann
079ef93121 PlayerThread: use player references 2013-09-26 23:27:47 +02:00
Max Kellermann
b2789c598e PlayerThread: use {decoder,player}_control references 2013-09-26 22:53:40 +02:00
Max Kellermann
92a93c1217 PlayerThread: allocate decoder_control on the stack 2013-09-26 22:48:55 +02:00
Max Kellermann
96b70835f9 PlayerThread: move global MusicBuffer variable into the player object 2013-09-26 22:45:49 +02:00
Max Kellermann
7fa3b7a267 PlayerThread: simplify "buffer empty" assertion 2013-09-26 22:41:07 +02:00
Max Kellermann
f3fc76e3c8 MusicChunk: remove obsolete prototypes 2013-09-26 22:34:43 +02:00
Max Kellermann
3216f4b257 MusicBuffer: expose the C++ API 2013-09-26 22:21:56 +02:00
Max Kellermann
ce1d897575 MusicPipe: expose the C++ API 2013-09-26 21:51:45 +02:00
Max Kellermann
17e108a10a MusicChunk: use constexpr for CHUNK_SIZE 2013-09-26 21:49:26 +02:00
Max Kellermann
5bc4ab899f *Plugin: remove redundant "line %i" from error messages
The MPD core will add this as a prefeix.
2013-09-26 20:59:40 +02:00
Max Kellermann
44faf1080c SongFilter: search for album artist falls back to the artist tag
Implement Mantis ticket 0003646.
2013-09-26 19:25:13 +02:00
Max Kellermann
e354c5c2a8 IdTable, SongFilter: use std::fill_n() instead of std::fill() 2013-09-26 18:25:28 +02:00
Max Kellermann
04bc9005ae TagType: reduce the enum size to 1 byte
Reduce the TagItem overhead.
2013-09-26 18:14:58 +02:00
Max Kellermann
3c92c69bc7 Tag: add "pure" attributes 2013-09-26 18:11:00 +02:00
Max Kellermann
52ee132d92 TagHandler: use a TagBuilder internally
Reduce heap allocator overhead.
2013-09-26 17:35:08 +02:00
Max Kellermann
7ca0aedcfc Main: fix crash if no database was configured
Add nullptr check, and return early from glue_db_init_and_load().
2013-09-26 17:33:46 +02:00
Max Kellermann
a2c4037a24 Main: use nullptr instead of NULL 2013-09-26 17:31:50 +02:00
Max Kellermann
d7b0073ce1 decoder/modplug: fix include directory
Since Debian package 1:0.8.8.4-4, the pkg-config file does not contain
-I/usr/include/libmodplug anymore, and we need to add the
"libmodplug/" prefix to the #include line.
2013-09-26 17:27:35 +02:00
Artem Savkov
585b68d2ae input/curl: fix EventLoop stall after curl_easy_pause
When playing finite http streams, e.g. something from soundcloud,
eventloop stalls after pausing writefunc. TimeoutMonitor is cancelled
by the time resume happens, so when enough data is consumed writefunc
is called only once. Calling InvalidateSockets() from
input_curl_resume() seems to fix the issue.
2013-09-26 17:27:35 +02:00
Max Kellermann
89d2d648cc ConfigPath: return early on "~"
Previously, the pointer was moved to undefined memory.
2013-09-12 11:05:59 +02:00
Max Kellermann
7532f24d58 ConfigPath: skip the slash of "~/"
Increment the "path" earlier.
2013-09-12 11:05:41 +02:00
Max Kellermann
69a5df2f98 ConfigPath: remove the "~/" from the constructed path
This was building broken paths like "/home/foo/~/bar".  Bug found by
Maarten de Vries.
2013-09-12 10:54:45 +02:00
Max Kellermann
1c65908cdb ConfigPath: simplify the duplicate tilde check 2013-09-12 10:49:57 +02:00
Max Kellermann
3aaf013dd1 ConfigPath: convert "home" variable to Path object
Use Path::FromUTF8() for the g_get_home_dir() return value instead of
assuming it's already FS charset.
2013-09-12 10:35:40 +02:00
Max Kellermann
5f2705ab07 ConfigPath: move code to GetHome() 2013-09-12 10:30:00 +02:00
Max Kellermann
9af620982c ConfigPath: include cleanup 2013-09-12 10:17:41 +02:00
Max Kellermann
1ee6a78cb7 Path: add FromUTF8() overload that returns an Error 2013-09-12 10:17:41 +02:00
Max Kellermann
bf4ee48efa ConfigPath: move path_domain to system/Path.cxx 2013-09-12 10:03:37 +02:00
Maarten de Vries
08e6d222a2 Listen: Allow tilde paths for socket. 2013-09-12 08:55:45 +02:00
Max Kellermann
cf98b0e261 test/dump_rva2: remove fake Tag symbols 2013-09-05 19:25:50 +02:00
Max Kellermann
a24589d46e TagBuilder: add method Commit(Tag&)
For callers that already have a Tag instance.
2013-09-05 19:23:06 +02:00
Max Kellermann
84533b6cad TagBuilder: add method IsEmpty() 2013-09-05 19:14:47 +02:00
Max Kellermann
8dca38e979 Tag: remove the obsolete "bulk" mode
Methods BeginAdd() and EndAdd() have been replaced by class
TagBuilder.
2013-09-05 19:08:22 +02:00
Max Kellermann
662bed6a00 db/proxy: use class TagBuilder 2013-09-05 19:07:27 +02:00
Max Kellermann
ae5e0cb02b SongSave: use class TagBuilder 2013-09-05 18:59:19 +02:00
Max Kellermann
0b3e1c4706 TagBuilder: new class for constructing Tag objects
Obsoletes Tag::BeginAdd() and the complicated "bulk add" code.
2013-09-05 18:41:49 +02:00
Max Kellermann
ce08a7a932 TagItem: disable the copy constructor/operator
This is not a C++ class and must not be copied.
2013-09-05 18:41:01 +02:00
Max Kellermann
5d5f21bfc5 Tag: compile-time initialisation of ignore_tag_items
Move to TagSettings.c and use C99 initializers.
2013-09-05 18:34:12 +02:00
Max Kellermann
fcccedc588 Tag: move struct TagItem to TagItem.hxx 2013-09-05 18:28:07 +02:00
Max Kellermann
0d73a49327 Tag: move fix_tag_value() to TagString.cxx 2013-09-05 18:27:40 +02:00
Max Kellermann
6239dd96f2 Tag: remove unused methods 2013-09-05 18:27:31 +02:00
Max Kellermann
57a4700fb9 TagNames: make tag_item_names const 2013-09-05 18:27:23 +02:00
Max Kellermann
2b676dc5fc Tag: move configuration code to TagConfig.cxx
Allow using the Tag.cxx library without the Config library.
2013-09-05 18:27:08 +02:00
Max Kellermann
3f267b1795 Tag, ...: move to libtag.a 2013-09-05 18:26:56 +02:00
Max Kellermann
7a4c9f5f4c mpd_error.h: remove obsolete header
Migrate the remaining callers to FatalError().
2013-09-05 18:26:46 +02:00
Ales Guzik
3330aa6f6a input/curl: enable https 2013-09-05 11:56:49 +02:00
Max Kellermann
8929f88e6d PlaylistPlugin: add interface SongEnumerator
Replaces struct playlist_provider.
2013-09-05 09:40:55 +02:00
Max Kellermann
5348808bf5 PlaylistPlugin, ConfigGlobal: use nullptr instead of NULL 2013-09-05 09:40:32 +02:00
Max Kellermann
fccba1af2a use standard snprintf() instead of GLib g_snprintf() 2013-09-05 09:21:53 +02:00
Max Kellermann
26d92c80ed conf.h: remove obsolete header
Use only ConfigData.hxx in plugin sources to reduce header
dependencies.
2013-09-05 08:47:10 +02:00
Max Kellermann
9605e24655 conf.h: move constants to ConfigDefaults.hxx 2013-09-05 08:42:08 +02:00
Max Kellermann
7d0269d2ce InputLegacy: move functions to the input_stream class 2013-09-05 00:23:14 +02:00
Max Kellermann
52ffdb0a55 test/read_tags: use input_stream_wait_ready() 2013-09-05 00:22:43 +02:00
Max Kellermann
681d6bbdc5 TagTable: un-inline the two functions
Reduce header dependencies.
2013-09-04 23:57:30 +02:00
Max Kellermann
867b82b6de Tag*: move TagTable.hxx to libtag.a 2013-09-04 23:54:37 +02:00
Max Kellermann
5101ef4b02 Tag*: move libtag.a sources to src/tag/ 2013-09-04 23:46:20 +02:00
Max Kellermann
ee9e238179 system/SocketError: un-inline constructor
Reduces header dependencies.
2013-09-04 23:36:30 +02:00
Max Kellermann
29030b54c9 util/Error: new error passing library
Replaces GLib's GError.
2013-09-04 18:14:22 +02:00
Max Kellermann
c9fcc7f148 system/resolver: convert to C++ 2013-09-04 18:02:09 +02:00
Max Kellermann
d1f4a31b5e output/pulse: require libpulse 0.9.16
Remove all #ifdefs.  Old versions of libpulse are not being tested,
and thus I'm removing support.
2013-09-04 16:55:03 +02:00
Max Kellermann
b691d3123b IOThread: pass GError to FatalError()
Fixes build failure on GLib < 2.32.
2013-09-04 16:54:52 +02:00
Max Kellermann
f68e36f8c2 DatabaseSave: eliminate redundant db_quark() implementation 2013-09-03 11:52:57 +02:00
Max Kellermann
4db119c01b IOThread: use FatalError() on g_thread_create() error
New GLib versions don't fail.
2013-09-03 11:28:47 +02:00
Max Kellermann
bbd7115564 input/{mms,despotify}: remove "seek" implementation
Omitting it has the same effect as returning false unconditionally.
2013-09-03 10:54:29 +02:00
Max Kellermann
8d36367fe2 input_stream.h: rename to InputLegacy.hxx 2013-09-03 09:18:30 +02:00
Max Kellermann
3deca8fccd db_error: convert to C++ 2013-08-10 19:43:27 +02:00
Max Kellermann
7af24c4d3a playlist_error: convert to C++ 2013-08-10 19:40:45 +02:00
Max Kellermann
7f0ce4e94e ack.h: move to protocol/ 2013-08-10 19:32:41 +02:00
Max Kellermann
5c48d3fbba alsa/mixer: defer InvalidateSockets() call to I/O thread 2013-08-10 14:05:06 +02:00
Max Kellermann
00420ef9ca EventLoop: initialise the thread id explicitly 2013-08-10 14:01:55 +02:00
Max Kellermann
b9d30595d6 ZeroconfAvahi: disable Avahi with epoll
Temporary hotfix until we have integrated avahi into our new event
loop.
2013-08-10 13:59:01 +02:00
Max Kellermann
c1f4f1fdb6 EventLoop: new implementation using epoll
Implement an event loop without GLib.
2013-08-10 13:54:23 +02:00
Max Kellermann
342333f72a mixer/alsa: invoke InvalidateSockets() in constructor 2013-08-10 13:54:23 +02:00
Max Kellermann
94cdc47786 event/Call: signal the calling thread
Fixes regression from commit 018f4155.
2013-08-10 12:40:44 +02:00
Max Kellermann
cc511e7b60 event/IdleMonitor: new monitor class 2013-08-10 11:52:31 +02:00
Max Kellermann
bb2af791e9 event/MultiSocketMonitor: add struct SingleFD
Prepare for migrating away from GLib.
2013-08-10 11:52:31 +02:00
Max Kellermann
f3f4b332ae event/MultiSocketMonitor: use uint64_t instead of gint64
Unsigned and portable.
2013-08-10 11:52:31 +02:00
Max Kellermann
84ac79bb08 event/MultiSocketMonitor: eliminate virtual method CheckSockets()
Handle timeout internally.
2013-08-10 11:52:31 +02:00
Max Kellermann
be0c8495cd event/MultiSocketMonitor: PrepareSockets() returns timeout
Simplify the API, don't use GLib specific integer type.
2013-08-10 11:52:31 +02:00
Max Kellermann
cbd0709d1c glib_compat.h: use monotonic_clock_us() in g_source_get_time() 2013-08-10 11:52:31 +02:00
Max Kellermann
371d635da8 glib_compat.h: remove unused wrapper g_file_test() 2013-08-10 11:52:31 +02:00
Max Kellermann
85216966fa decoder/wildmidi: use class Path for the "timidity.cfg" location 2013-08-10 11:52:31 +02:00
Max Kellermann
1c823e9d1f ConfigData: overload GetBlockPath() with default value 2013-08-10 11:52:31 +02:00
Max Kellermann
25e338a098 ConfigData: use FatalError() instead of MPD_ERROR() 2013-08-10 11:52:31 +02:00
Max Kellermann
81175b0717 system/EPollFD: fix typo in Add() 2013-08-10 11:52:31 +02:00
Max Kellermann
d23c907a94 thread/Id: new class replacing GThread pointers
Remove a GLib dependencies from class EventLoop and DatabaseLock.
2013-08-10 09:00:04 +02:00
Max Kellermann
018f4155eb event: add function BlockingCall()
Replaces io_thread_call().  This approach is more generic and easier
to use due to std::function.
2013-08-08 23:04:07 +02:00
Max Kellermann
9ab0a1f5f1 EventLoop: add methodd IsInside()
Track which thread runs the EventLoop and provide a check whether
we're currently inside.
2013-08-08 23:04:01 +02:00
Max Kellermann
c043b337b1 EventLoop: un-inline Run() and others
Prepare for adding more code.
2013-08-08 23:03:49 +02:00
Max Kellermann
090bc6fa79 event/*Monitor: add method GetEventLoop() 2013-08-08 23:03:38 +02:00
Max Kellermann
b63db1c1aa event/SocketMonitor: un-inline Schedule()
Merge with CommitEventFlags().
2013-08-08 00:18:59 +02:00
Max Kellermann
0287ac794e event/SocketMonitor: add assertions 2013-08-08 00:18:59 +02:00
Max Kellermann
0005221533 output/httpd: use "unsigned" instead of "guint" 2013-08-08 00:18:59 +02:00
Max Kellermann
23d2c0f1c6 Client{Event,Write}: add missing include 2013-08-08 00:14:19 +02:00
Max Kellermann
377b6f05ea event/BufferedSocket: add missing include 2013-08-08 00:11:40 +02:00
Max Kellermann
3ac2e9d31f os/FileSystem: disable mkfifo() wrapper on WIN32 2013-08-07 20:31:27 +02:00
Max Kellermann
b76a29a69a ConfigPath: return a Path object
Migrate all callers to use Path directly, instead of doing the
conversion in each caller.
2013-08-07 19:59:09 +02:00
Max Kellermann
abe090ec1f *: remove remaining __cplusplus checks 2013-08-07 19:58:52 +02:00
Max Kellermann
dff05c71e6 event/EPollFD: basic support for Linux epoll 2013-08-07 19:44:43 +02:00
Max Kellermann
f6f4742410 event/DeferredMonitor: rename Run() to RunDeferred() 2013-08-07 19:39:26 +02:00
Max Kellermann
977004c350 event/DeferredMonitor: use EventLoop::AddIdle() 2013-08-07 19:38:10 +02:00
Max Kellermann
fdc7d13ad1 configure.ac: pass option name to MPD_OPTIONAL_FUNC() 2013-08-07 19:23:00 +02:00
Max Kellermann
355dd5cb24 event/DeferredMonitor: new class wrapping g_idle_add() 2013-08-07 18:59:42 +02:00
Max Kellermann
123dd5fe2d mixer/alsa: use AllocatedArray for the pollfd buffer 2013-08-07 18:56:57 +02:00
Max Kellermann
953e3190ca encoder/lame: use ReusableBuffer instead of AllocatedArray 2013-08-07 18:53:24 +02:00
Max Kellermann
44a0e21795 PcmBuffer: move code to new class ReusableBuffer
ReusableBuffer is more generic.
2013-08-07 18:51:21 +02:00
Max Kellermann
fafaf567f9 Makefile: fix "distcheck" errors 2013-08-07 18:49:05 +02:00
Max Kellermann
870cc1d928 add missing includes 2013-08-07 18:23:55 +02:00
Max Kellermann
d86ee93801 filter/Route: don't access PcmBuffer attributes directly
Return the pointer given by PcmBuffer::Get() instead of reaching into
the PcmBuffer object.
2013-08-07 18:23:34 +02:00
Alexander Gehrke
87b7328463 CommandLine.cxx: look for config file in XDG_CONFIG_HOME too
Look for "$XDG_CONFIG_HOME/mpd/mpd.conf", similar to where mpd looks
for the file under Windows.
2013-08-07 18:22:27 +02:00
Alexis Ballier
3f846cf6b8 FfmpegDecoderPlugin: Allocate the interleaved buffer as needed instead of using an arbitrary big constant.
Also, save a memcpy when FFmpeg outputs interleaved audio.

Fixes build with FFmpeg 2.0.
2013-08-07 15:07:41 +02:00
Max Kellermann
f2ce8c3b62 event/EventFD: move to libsystem 2013-08-07 11:52:26 +02:00
Max Kellermann
4223657ab8 event/SignalMonitor: use signalfd() if available 2013-08-07 11:03:47 +02:00
Max Kellermann
930128a7ea SignalHandlers: move code to new class SignalMonitor 2013-08-07 10:56:33 +02:00
Max Kellermann
db447440ff event/Event{Pipe,FD}: auto-create in constructor
Errors are fatal now.  This makes the class a lot easier to use.
2013-08-07 10:53:22 +02:00
Max Kellermann
b70d38dc10 Makefile.am: move sources to libsystem.a 2013-08-07 10:31:31 +02:00
Max Kellermann
a27d105dcd FatalError: new library to replace mpd_error.h 2013-08-07 10:08:36 +02:00
Max Kellermann
67e44b0f2c daemon: convert to C++ 2013-08-07 09:53:33 +02:00
Max Kellermann
bf840700e4 test/signals: remove obsolete library 2013-08-07 09:51:43 +02:00
Max Kellermann
47e16dbee3 configure.ac: add option --enable-eventfd
Remove the runtime check for eventfd(), hard-code the feature once
it's been selected at compile time.  The class WakeFD is splitted into
EventFD and EventPipe, using WakeFD as a macro diversion.
2013-08-06 23:32:21 +02:00
Max Kellermann
66f678023f util/Manual: add missing include <utility> 2013-08-06 22:34:20 +02:00
Max Kellermann
132971f8eb playlist/pls: use std::string instead of GString 2013-08-06 09:32:08 +02:00
Max Kellermann
3f04a4d635 encoder/lame: dynamic output buffer 2013-08-06 09:13:28 +02:00
Max Kellermann
17c8e839b6 encoder/lame: use delete instead of g_free() 2013-08-06 09:13:07 +02:00
Max Kellermann
348bdcd7b7 encoder/lame: use lame_encode_buffer_interleaved()
Don't deinterleave manually, don't allocate memory.
2013-08-06 09:10:30 +02:00
Max Kellermann
a32443c63b encoder/lame: use offset variable instead of memmove() 2013-08-06 09:02:48 +02:00
Max Kellermann
7e53934ce3 encoder/lame: rename "buffer" to "output_buffer" 2013-08-06 09:02:48 +02:00
Max Kellermann
7c2b553364 playlist/EmbbeddedCue: convert to class 2013-08-05 22:23:33 +02:00
Max Kellermann
409fc837ab playlist/lastfm: convert to class 2013-08-05 21:44:34 +02:00
Max Kellermann
6d0ada7f45 playlist/lastfm: allocate the lastfm_playlist object at the end
Simplify the error path, because the other allocations may fail.
2013-08-05 21:31:54 +02:00
Max Kellermann
af63372d2b playlist/m3u: allocate ExtM3uPlaylist with new/delete 2013-08-05 21:28:19 +02:00
Max Kellermann
3e91f757a9 playlist/extm3u: allocate ExtM3uPlaylist with new/delete 2013-08-05 21:25:25 +02:00
Max Kellermann
498491ec05 decoder/ffmpeg: convert struct mpd_ffmpeg_stream to a class 2013-08-05 00:15:25 +02:00
Max Kellermann
85b77b81ca *: use gcc.h macros instead of GLib 2013-08-04 23:48:01 +02:00
Andrzej Rybczak
5bf2ec5a74 DatabasePrint: print Last-Modified attribute for directories 2013-08-04 23:29:24 +02:00
Max Kellermann
9e715089a4 Commands: new command "toggleoutput" 2013-08-04 23:21:23 +02:00
Max Kellermann
1a852bc365 configure.ac: increase protocol version to 0.18 2013-08-04 23:21:23 +02:00
Max Kellermann
9326ce53ec Merge tag 'release-0.17.5' 2013-08-04 14:36:22 +02:00
Max Kellermann
d8217c364a release 0.17.5 2013-08-04 14:21:45 +02:00
Justin Riley
3a34fd181d FfmpegDecoderPlugin: add application/flv to mime types list 2013-08-04 14:20:16 +02:00
Max Kellermann
fcb7233b25 ConfigData: remove obsolete functions 2013-08-04 14:07:50 +02:00
Max Kellermann
fe53a376a3 PlaylistPlugin: pass config_param reference 2013-08-04 14:07:50 +02:00
Max Kellermann
65842cd99e DatabasePlugin: pass config_param reference 2013-08-04 14:07:50 +02:00
Max Kellermann
bf6ed643e0 InputPlugin: pass config_param reference 2013-08-04 14:07:50 +02:00
Max Kellermann
a0beb5fa26 MixerPlugin: pass config_param reference 2013-08-04 14:07:50 +02:00
Max Kellermann
f54bcc1f16 FilterPlugin: pass config_param reference 2013-08-04 14:07:50 +02:00
Max Kellermann
ca0d09c50f EncoderPlugin: pass config_param reference 2013-08-04 14:07:50 +02:00
Max Kellermann
81c3224076 OutputPlugin: pass config_param reference 2013-08-04 14:07:49 +02:00
Max Kellermann
7a1d466fb2 DecoderPlugin: pass config_param reference 2013-08-04 13:30:47 +02:00
Max Kellermann
83f4c48c8a ConfigData: move code to block_param, config_param methods 2013-08-04 12:03:56 +02:00
Max Kellermann
acd742d225 ConfigData: remove C++ checks 2013-08-03 23:47:31 +02:00
Max Kellermann
d1e7b4e381 audio_format: convert to C++ 2013-08-03 21:37:56 +02:00
Max Kellermann
67f591a9ce gcc.h: add macro gcc_unreachable() 2013-08-03 21:34:17 +02:00
Christoph Mende
7ff988275f decoder/mikmod: use MikMod_free() to free the title on libmikmod-3.2
Player_LoadTitle() returns an aligned pointer in libmikmod-3.2 that
cannot be freed with free(). The correct way to do this now is
MikMod_free() which extracts the original pointer from the buffer and
frees that.

Signed-off-by: Christoph Mende <mende.christoph@gmail.com>
2013-08-01 09:30:20 +02:00
Max Kellermann
363050f44c playlist_edit: fix "move" relative to current when there is no current song
Fixes Mantis #3770.
2013-08-01 09:28:03 +02:00
Michael Mair-Keimberger
dbe04c4207 configure.ac: detect system "ar" 2013-08-01 09:13:41 +02:00
tsufeki
d59a332ef9 commmand: fix URI argument in playlistadd 2013-08-01 08:42:22 +02:00
Max Kellermann
105b431e4c PcmBuffer: reset size in Clear()
Fix for Mantis #3806.

"PcmBuffer::Clear clears the buffer but does not reset the size. If
Get is called on the same PcmBuffer later on with a size that is the
same as (or less than) it was before the call to Clear, the "else"
branch is taken and the memory of buffer (at the address of nullptr)
is poisoned instead of the necessary allocation being performed. A
memset or memcpy on the returned pointer (nullptr) causes a
segmentation fault."
2013-08-01 08:33:53 +02:00
Max Kellermann
ba79f4c1f9 Tag: check bulk mode in Clear() 2013-07-31 09:02:07 +02:00
Max Kellermann
8b2dcf7018 decoder/ffmpeg: require ffmpeg/libav 0.8
Now that even Debian stable has picked up version 0.8, we can safely
make this a requirement, and remove a lot of old cruft.
2013-07-31 01:01:21 +02:00
Max Kellermann
44621f7326 output/winmm: adapt to PcmBuffer API changes 2013-07-31 00:57:52 +02:00
Max Kellermann
8ead8f7ea6 decoder/mpcdec: remove support for the "old" API
This old version has been obsolete for many years - time to remove it.
2013-07-31 00:43:21 +02:00
Max Kellermann
7f9402bd22 Tag: add method Clear()
Allow reusing Tag instances.
2013-07-31 00:35:05 +02:00
Max Kellermann
cbd38327e7 DecoderAPI: pass rvalue reference to decoder_tag()
Avoid duplicating the tag.
2013-07-31 00:34:22 +02:00
Max Kellermann
06f898cc12 tag: convert to C++ 2013-07-30 20:19:53 +02:00
Max Kellermann
6a9ab8bc0e tag: move enum tag_type to TagType.h 2013-07-30 20:10:24 +02:00
Max Kellermann
9a0061c511 encoder_api: convert to C++ 2013-07-30 09:04:05 +02:00
Max Kellermann
7a3aac1843 encoder/lame,twolame: convert to C++ 2013-07-30 08:52:47 +02:00
Max Kellermann
da1f4b3ede encoder/wave: convert to C++ 2013-07-30 08:48:53 +02:00
Max Kellermann
dac740ee17 encoder/null: convert to C++ 2013-07-30 08:43:19 +02:00
Max Kellermann
28030d7edb include cleanup 2013-07-30 08:39:21 +02:00
Max Kellermann
648196319f output_api: convert to C++ 2013-07-30 08:34:10 +02:00
Max Kellermann
c75cb67c44 pcm_buffer: convert to C++ 2013-07-30 08:31:02 +02:00
Max Kellermann
cd1bb2bafa Main: fix crash without state file
If no state file is configured, don't chek for state changes.
2013-07-30 08:31:02 +02:00
Max Kellermann
a9d2dc6144 pcm_resample: convert to C++ 2013-07-30 00:04:16 +02:00
Max Kellermann
46b9388bb0 PcmConvert: don't memset() in the constructor
This destroys data inside PcmDsd and other attributes.  It was once
necessary, but is not anymore.
2013-07-30 00:03:36 +02:00
Max Kellermann
a1a97d663e encoder/flac: convert to C++ 2013-07-29 08:04:34 +02:00
Max Kellermann
cac3c159bc pcm_dsd: convert to C++ 2013-07-29 07:56:40 +02:00
Max Kellermann
43166130b5 audio_check: convert to C++ 2013-07-29 07:50:08 +02:00
Max Kellermann
14f21378e3 tag_table: convert to C++ 2013-07-29 07:45:58 +02:00
Max Kellermann
bd42aeab46 XiphTags: convert to C++ 2013-07-29 07:42:50 +02:00
Max Kellermann
cde6a3a00c tag_handler: convert to C++ 2013-07-29 07:39:58 +02:00
Max Kellermann
96b763067e ape: convert to C++ 2013-07-29 07:39:36 +02:00
Max Kellermann
dd5ba062cc tag_id3: convert to C++ 2013-07-28 20:25:45 +02:00
Max Kellermann
ba161ec572 song: convert header to C++ 2013-07-28 13:25:12 +02:00
Max Kellermann
43f613d9be decoder_api: convert to C++ 2013-07-28 13:18:48 +02:00
Max Kellermann
2277d143fa decoder/fluidsynth: convert to C++ 2013-07-28 13:16:27 +02:00
Max Kellermann
6b6d9e64bd decoder/pcm: convert to C++ 2013-07-28 13:10:05 +02:00
Max Kellermann
f016a99f24 decoder/mpcdec: convert to C++ 2013-07-28 13:04:12 +02:00
Max Kellermann
2eed9d64ce decoder/modplug: convert to C++ 2013-07-28 13:03:04 +02:00
Max Kellermann
1688b6dda9 decoder/mikmod: convert to C++ 2013-07-28 13:03:04 +02:00
Max Kellermann
33aedc887a decoder/wildmidi: convert to C++ 2013-07-28 13:03:04 +02:00
Max Kellermann
258d0ea97e decoder/mpg123: convert to C++ 2013-07-28 13:03:04 +02:00
Max Kellermann
d3641766a5 decoder/sndfile: convert to C++ 2013-07-28 12:48:26 +02:00
Max Kellermann
b25d5c5d33 decoder/audiofile: convert to C++ 2013-07-28 12:48:26 +02:00
Max Kellermann
352d7f477e decoder/{dsf,dsdiff}: convert to C++ 2013-07-28 12:20:50 +02:00
Max Kellermann
1fcf35ad3b tag_rva2: convert to C++ 2013-07-26 12:52:51 +02:00
Max Kellermann
c8054e569a decoder/mad: convert to C++ 2013-07-26 11:59:17 +02:00
Max Kellermann
ef48eca9ca Merge branch 'master' of git://git.musicpd.org/dk/mpd 2013-06-24 16:17:46 +02:00
Matthias Larisch
906d2fbadf fix overwriting bitrate with signal type
I recently opened a bug: http://bugs.musicpd.org/view.php?id=3787

The main problem is that opus encoder config for signal overwrote
bitrate setting.
2013-06-24 16:08:25 +02:00
Matthias Drochner
2b579aeb4f NULL pointer vs bool "false" confusion
there are some places in the mpd-0.17.4 sources where a "false" is
used instead of a NULL pointer.
2013-06-24 16:00:58 +02:00
Denis Krjuchkov
e9e55b0812 text_input_stream: convert to class 2013-05-12 20:02:27 +06:00
Denis Krjuchkov
49a3845135 timer: convert to class 2013-05-12 19:03:42 +06:00
Denis Krjuchkov
21dac6c05d decoder/FLAC*: rename files and symbols to Flac* 2013-05-06 23:36:47 +06:00
Denis Krjuchkov
1d9b84a5af PlaylistFile: use DirectoryReader and file system API 2013-05-06 23:36:42 +06:00
Denis Krjuchkov
a688745bdc ClientFile: use Path and file system API, update usages accordingly
This commit also fixes incorrect passing of UTF-8 strings to client_allow_file
2013-05-06 23:36:36 +06:00
Denis Krjuchkov
459d824c50 ClientFile.cxx: include config.h 2013-05-06 23:36:24 +06:00
Denis Krjuchkov
96019f4a02 UpdateWalk, ExcludeList: use Path, file system API, DirectoryReader, log in UTF8 2013-05-06 23:34:48 +06:00
Denis Krjuchkov
896015bf53 DirectoryReader: rename Failed() to HasFailed() for consistency with TextFile 2013-05-05 13:34:12 +06:00
Denis Krjuchkov
df3e7a9248 .gitignore: always ignore any .exe files 2013-05-05 13:28:18 +06:00
Max Kellermann
b2d3d15e97 Main: move global variables to struct Instance
More preparations for multi-player support.
2013-04-17 23:52:58 +02:00
Max Kellermann
08dfd263ba GlobalEvents: include windows.h for DELETE macro workaround 2013-04-17 23:52:57 +02:00
Max Kellermann
abaabe92d6 decoder_buffer: convert to C++ 2013-04-17 22:45:10 +02:00
Max Kellermann
257b42b87f decoder/faad: convert to C++ 2013-04-17 22:33:59 +02:00
Max Kellermann
31bc94160a song_sort: convert to C++ 2013-04-17 22:25:57 +02:00
Max Kellermann
9e5d2c5bb7 encoder_list: convert to C++ 2013-04-17 22:22:37 +02:00
Max Kellermann
2df2a989af input/soup: plugin removed
This plugin is cumbersome to support, now that MPD is migrating away
from GLib and the GLib event loop.  It has no practical advantages
over the CURL plugin.  Soup requires the bloated GType library.
2013-04-17 21:46:16 +02:00
Max Kellermann
4a800b311f don't use g_thread_init() with GLib 2.32
Deprecated.
2013-04-17 01:54:14 +02:00
Max Kellermann
a4a13a3825 use g_thread_new() if GLib is recent enough
Fixes deprecation warnings.
2013-04-17 01:49:43 +02:00
Max Kellermann
a28df6123f OutputInternal: use Mutex instead of GMutex 2013-04-17 01:41:56 +02:00
Max Kellermann
c5c43c4541 thread/Cond: add method timed_wait() 2013-04-17 01:33:07 +02:00
Max Kellermann
0954f580fa output/oss,null: use new/delete 2013-04-17 01:21:33 +02:00
Max Kellermann
3a2254c91f output: convert to C++ 2013-04-17 01:12:05 +02:00
Max Kellermann
4aeec4bb60 output/solaris: convert to C++ 2013-04-17 01:08:35 +02:00
Max Kellermann
750b2ad6a8 output/openal: convert to C++ 2013-04-17 01:04:27 +02:00
Max Kellermann
86c276f538 output/ao: convert to C++ 2013-04-17 00:56:09 +02:00
Max Kellermann
166569200a output/shout: convert to C++ 2013-04-17 00:47:20 +02:00
Max Kellermann
e903d00968 output/ffado: remove broken plugin
This plugin has been in MPD for three years, and it has never worked.
Enough!
2013-04-17 00:44:02 +02:00
Max Kellermann
7d5d95ad53 configure.ac: fix hidden syntax error 2013-04-17 00:40:27 +02:00
Max Kellermann
cc6c452854 output/mvp: remove obsolete plugin
The hardware is obsolete, and the product does not exist anymore on
the Hauppauge web site.  Let's see if anybody complains about the
removal.
2013-04-17 00:37:30 +02:00
Max Kellermann
f492c78e2e output/jack: convert to C++ 2013-04-17 00:37:30 +02:00
Max Kellermann
6b83d08228 output/fifo: convert to C++ 2013-04-17 00:37:30 +02:00
Max Kellermann
dc415b761e output/pipe: convert to C++ 2013-04-17 00:37:30 +02:00
Max Kellermann
f1034eb657 output/recorder: convert to C++ 2013-04-17 00:37:30 +02:00
Max Kellermann
ac9ebe1439 scripts: delete obsolete scripts 2013-04-17 00:37:30 +02:00
Max Kellermann
7b5f7c041b MixerInternal: use Mutex instead of GMutex 2013-04-16 23:50:41 +02:00
Max Kellermann
8ce9b53093 mixer/software: use gcc_unused instead of G_GNUC_UNUSED 2013-04-16 23:50:41 +02:00
Max Kellermann
0b9e52bd5f configure.ac: fix libmpdclient variable name 2013-04-16 23:44:32 +02:00
Max Kellermann
5dd728d802 doc: move sticker_file to "optional parameters" 2013-04-16 23:19:44 +02:00
Florian Schlichting
ce7c97b6ba doc: mpd.conf.5 wrongly documents parameters as required
mpd.conf.5 lists follow_outside_symlinks and follow_inside_symlinks
under REQUIRED, yet also documents a default value for these options,
which only makes sense if they're not actually required.
2013-04-16 23:17:43 +02:00
Max Kellermann
9a4c049675 prepare 0.17.5 2013-04-16 23:17:38 +02:00
Max Kellermann
cb8449a66d MixerInternal: convert to class 2013-04-16 21:33:25 +02:00
Max Kellermann
621467717d mixer/winmm: convert to a class 2013-04-16 21:31:03 +02:00
Max Kellermann
506c716cf2 mixer/Software: convert to a class 2013-04-16 21:25:27 +02:00
Max Kellermann
9f625b0a0d mixer/Pulse: convert to a class 2013-04-16 21:18:54 +02:00
Max Kellermann
bc1b4131cb mixer/Oss: convert to a class 2013-04-16 21:11:14 +02:00
Max Kellermann
80ba3c5932 mixer/Alsa: convert to a class 2013-04-16 21:11:06 +02:00
Max Kellermann
e63420a8c2 output/Pulse: convert to C++ 2013-04-16 20:51:21 +02:00
Max Kellermann
e02d8ad8d2 output/roar: work around libroar's use of "new" 2013-04-16 20:04:11 +02:00
Max Kellermann
d300e6bf21 util/Manual: work around strict-aliasing warning 2013-04-11 00:01:08 +02:00
Max Kellermann
1729388634 pcm_export: convert to C++ 2013-04-09 01:31:05 +02:00
Max Kellermann
c654c7630a pcm_*: move to src/pcm/ 2013-04-09 01:24:52 +02:00
Max Kellermann
3f3b26fb0e utils: convert to C++ 2013-04-09 01:17:47 +02:00
Max Kellermann
0921180b90 string_util: convert to C++ 2013-04-09 01:08:20 +02:00
Max Kellermann
14df240f5b OpusReader: don't use strndup()
Eliminate the fallback strndup() and strnlen() implementations.
2013-04-09 01:03:44 +02:00
Max Kellermann
2090911363 cue_parser: convert to C++ 2013-04-09 00:38:03 +02:00
Max Kellermann
3cc7be0fa6 playlist/cue: add constructor/destructor 2013-04-09 00:34:48 +02:00
Max Kellermann
6728b8c1a3 decoder_plugin: convert to C++ 2013-04-09 00:20:49 +02:00
Max Kellermann
450c26c471 tokenizer: convert to C++ 2013-04-08 23:51:39 +02:00
Max Kellermann
7ec1121cc8 uri: convert to C++ 2013-04-08 23:45:31 +02:00
Max Kellermann
f84e288ad7 decoder/gme: fix rounding error
Cast to integer after multiplying with 1000.  Allows sub-second
seeking.
2013-04-08 23:45:21 +02:00
Max Kellermann
8e31366431 decoder/gme: convert to C++ 2013-04-08 23:32:53 +02:00
Max Kellermann
1bfa04f80e InputStream: use gcc.h attributes 2013-04-08 23:22:12 +02:00
Max Kellermann
98cbc0ea79 event/TimeoutMonitor: eliminate support for periodic events
No caller needs this.  Fixes use-after-free after returning from
Client::OnTimeout().
2013-04-08 23:14:07 +02:00
Max Kellermann
dca1115196 StateFile: schedule timer only after a change
Save the state file 2 minutes after the last change.  This reduces the
disruptions by an idle MPD, and MPD can be paged out permanently until
it is used.
2013-04-08 23:11:36 +02:00
Max Kellermann
96882175f1 StateFile: move code to RememberVersions(), IsModified() 2013-04-08 23:11:36 +02:00
Max Kellermann
484841fc9e StateFile: make AutoWrite() private 2013-04-08 23:11:35 +02:00
Max Kellermann
8052c76489 Idle: fix typo in API documentation 2013-04-08 23:11:35 +02:00
Max Kellermann
3477acee48 decoder/ffmpeg: suppress warning about unused variable
Only relevant for old ffmpeg versions.
2013-04-08 22:12:49 +02:00
Max Kellermann
2c4b998170 Merge tag 'release-0.17.4' 2013-04-08 22:11:42 +02:00
Max Kellermann
0a9c7ff6cf release 0.17.4 2013-04-08 22:00:43 +02:00
Max Kellermann
cd71038655 command: don't check audio_format if not playing
Fixes valgrind warning.
2013-04-08 22:00:35 +02:00
Max Kellermann
1894aed261 Makefile.am: enable "dist-xz" 2013-04-08 21:35:45 +02:00
Max Kellermann
f3832bcaa8 .gitignore: stricter matches 2013-04-08 21:35:34 +02:00
Max Kellermann
436335e9a3 player_control: don't emit IDLE_PLAYER before audio format is known
Eliminates one IDLE_PLAYER call in playlist_control, and add two new
ones to player_thread.  Fixes Mantis bug 3636.
2013-04-08 21:31:03 +02:00
Max Kellermann
a30eb194d5 command: don't print undefined audio_format
Check audio_format_defined().
2013-04-08 21:31:03 +02:00
Anton Khirnov
8becbb8b08 ffmpeg decoder plugin: do not allocate an AVFrame on stack.
AVFrame must be allocated with avcodec_alloc_frame().
2013-04-05 23:34:10 +02:00
Anton Khirnov
e0c2c77c2a ffmpeg decoder plugin: do not allocate an AVFrame on stack.
AVFrame must be allocated with avcodec_alloc_frame().
2013-04-05 23:30:47 +02:00
Max Kellermann
6f2e1c2415 GlobalEvents: use g_idle_add() instead of WakeFD()
Use the GMainLoop specific function to wake up the main loop.  This is
simpler and comes with very little overhead.
2013-02-27 20:41:17 +01:00
Max Kellermann
fc0ad8674b GlobalEvents: wake up only if the flags were empty
Don't bother checking for the parameter mask.  This doesn't matter.
The only thing that matters is if a wake-up is already pending.
2013-02-27 20:40:46 +01:00
Max Kellermann
19c67ab724 Idle, GlobalEvents: use std::atomic::exchange()
Less overhead than fetch_and() for what we do.
2013-02-27 20:35:44 +01:00
Oddegamra
a046b6e105 IcyMetaDataServer: increment iterator
Fixes segmentation fault.
2013-02-27 20:01:58 +01:00
Max Kellermann
8017301de5 Merge branch 'v0.17.x' 2013-02-27 20:00:14 +01:00
Florian Schlichting
46528783ef fix typos in upstream's mpd.conf.5 2013-02-27 19:50:05 +01:00
Hagen Fritsch
6f4bb6cd2c Add some comments to keep track of timer units. 2013-02-27 19:47:28 +01:00
Hagen Fritsch
2cf31e905b clock: fix usec-to-usec factor 2013-02-27 19:45:31 +01:00
Hagen Fritsch
28a60db5aa clock: add missing include 2013-02-27 19:42:35 +01:00
Max Kellermann
496f70fc0d mixer_plugin: convert to C++ 2013-02-22 20:51:23 +01:00
Max Kellermann
9ede4c5f3c {output,mixer}/winmm: convert to C++ 2013-02-22 20:29:03 +01:00
Max Kellermann
214a526945 Merge branch 'v0.17.x' 2013-02-19 09:24:11 +01:00
Jörg Thalheim
d5b756413a command: allow to omit END in ranges (START:END)
If END is omitted, mpd should use the highest possible value instead of raising an error.
This partially reverts 52e9cab1c1
2013-02-19 09:23:18 +01:00
Max Kellermann
af99176581 output/alsa: workaround for noise after manual song change
Workaround for driver bug observed on the Raspberry Pi, see code
comment for details.
2013-02-04 15:51:32 +01:00
Max Kellermann
57e825dfe7 output/alsa: pre-allocate the silence buffer 2013-02-04 15:30:31 +01:00
Max Kellermann
e06dd129dd output/alsa: move code to alsa_write_silence() 2013-02-04 14:30:16 +01:00
Max Kellermann
00baddcd9e SocketUtil: add separators to g_prefix_error() call 2013-02-04 14:26:03 +01:00
Max Kellermann
7e92820c50 output/alsa: default "device" is an empty string
Fixes nullptr dereference in std::string::operator=().  Also fixes a
memory leak by using config_get_block_string() instead of
config_dup_block_string().
2013-02-04 11:46:49 +01:00
Max Kellermann
5692e20fd5 event/ServerSocket: close only sockets that have been opened
Fixes assertion failure.
2013-02-04 11:44:36 +01:00
Max Kellermann
3b3c9334c8 decoder/Opus: replace non-static data member initializers
Would require gcc 4.7, and MPD attempts to be compatible with gcc 4.6.
2013-02-04 11:08:32 +01:00
Max Kellermann
96dc0a318a player_thread: implement missing "idle" events on output errors
When all outputs fail, MPD automatically pauses playback, but did not
emit the IDLE_PLAYER event.  Thus, clients were not woken up.  (Mantis
3665)
2013-02-04 10:15:34 +01:00
Uli Schlachter
a4223aac38 ServerSocket: Initialize length variable 2013-02-04 09:30:21 +01:00
Denis Krjuchkov
2bb751d9fa StateFile: use file system API, log in UTF-8 2013-02-02 20:52:04 +06:00
Denis Krjuchkov
3b620112ca SimpleDatabasePlugin: use file system API, log in UTF-8 2013-02-02 20:52:03 +06:00
Denis Krjuchkov
99526219b7 UpdateIO.cxx: use file system API, log in UTF-8 2013-02-02 20:52:02 +06:00
Denis Krjuchkov
d818b618af UpdateWalk.cxx: use FileExists 2013-02-02 20:51:36 +06:00
Denis Krjuchkov
c64700e7ae TextFile.hxx: use file system API 2013-02-02 20:23:27 +06:00
Denis Krjuchkov
5bd1917705 SongUpdate.cxx: use StatFile 2013-02-02 20:22:32 +06:00
Denis Krjuchkov
178c6c20cd PlaylistSave.cxx: use FOpen 2013-02-02 20:21:46 +06:00
Denis Krjuchkov
92d71cc7fa PlaylistFile.cxx: use file system API 2013-02-02 20:21:10 +06:00
Denis Krjuchkov
227eca7d28 ExcludeList.cxx: use FOpen 2013-02-02 20:20:24 +06:00
Denis Krjuchkov
9399b0ea52 ConfigFile.cxx: use FOpenMode 2013-02-02 20:19:25 +06:00
Denis Krjuchkov
17dca254a3 Path.hxx: add GetDirectoryName() method 2013-02-02 19:28:02 +06:00
Denis Krjuchkov
f6b50d2387 FileSystem.hxx: add FOpen modes for appending files 2013-02-02 19:20:10 +06:00
Max Kellermann
a9ce0218c1 FilterInternal: convert struct filter to a OO interface 2013-02-02 09:34:07 +01:00
Max Kellermann
7bb5a960fd output/null: convert to C++ 2013-02-02 09:30:29 +01:00
Max Kellermann
e6b04d1b50 filter/*: don't use GLib macros 2013-02-02 08:31:17 +01:00
Max Kellermann
12613356fc filter/Chain: use std::forward_list instead of GSList 2013-02-01 18:14:06 +01:00
Max Kellermann
3894450b10 filter: convert to C++ 2013-02-01 17:47:09 +01:00
Max Kellermann
ec07f6ec83 PcmMix: merge duplicate code with templates 2013-02-01 17:45:17 +01:00
Max Kellermann
a7a10d03c9 test/test_pcm: add unit test for pcm_mix() 2013-02-01 15:52:03 +01:00
Max Kellermann
ef99d6ce3d PcmUtils: remove pcm_range(), use PcmClamp() instead 2013-02-01 14:10:27 +01:00
Max Kellermann
0ac06d77f1 PcmUtils: make PcmClamp() 64-bit-safe, add missing cast 2013-02-01 14:04:40 +01:00
Max Kellermann
469e233428 PcmUtils: remove unused clamp functions 2013-02-01 14:02:20 +01:00
Max Kellermann
86a0f9cf9b PcmFormat: merge duplicate code with a template 2013-02-01 13:47:29 +01:00
Max Kellermann
e6a91d291d PcmChannels: merge duplicate code with a template 2013-02-01 13:47:24 +01:00
Max Kellermann
bf35972714 ConfigTemplates: fix typo in id3v1_encoding 2013-02-01 13:47:12 +01:00
Max Kellermann
e0c645a270 test/test_pcm: add unit tests for the PcmFormat library 2013-02-01 00:32:05 +01:00
Max Kellermann
e42734c3f3 test/test_pcm: merge source buffer generator 2013-01-31 22:58:27 +01:00
Max Kellermann
eab78ab99c PcmDither: use constexpr 2013-01-31 22:55:00 +01:00
Max Kellermann
f2491c88c8 PcmDither: convert struct to a class 2013-01-31 22:54:10 +01:00
Max Kellermann
1b175025fe pcm_*: convert to C++ 2013-01-31 21:11:06 +01:00
Max Kellermann
ccdf7184be gcc.h: add "restrict" macro for C++ 2013-01-31 21:11:06 +01:00
Max Kellermann
7764136211 mixer/software, filter/volume: convert to C++ 2013-01-31 21:11:06 +01:00
Max Kellermann
0307801d51 test/test_pcm: convert to C++ 2013-01-31 21:11:06 +01:00
Max Kellermann
72cf8dd8a0 ZeroconfBonjour: fix OnSocketReady() return type 2013-01-31 21:11:06 +01:00
Max Kellermann
3c2b464dfa filter/convert: remove unused attribute 2013-01-31 00:31:24 +01:00
Max Kellermann
361404fd59 pcm_convert: convert to C++ 2013-01-31 00:26:55 +01:00
Max Kellermann
762c91b7f1 util/Manual: new template class 2013-01-30 23:48:34 +01:00
Max Kellermann
f2a8d4d289 filter/convert: convert to C++ 2013-01-30 23:28:13 +01:00
Max Kellermann
9ee52d85d7 filter/autoconvert: include cleanup 2013-01-30 23:19:11 +01:00
Max Kellermann
5ed9f02c4d TagPool, ...: include cleanup 2013-01-30 22:53:12 +01:00
Max Kellermann
378ebad1c8 ConfigData: use simple linked list instead of GSList 2013-01-30 22:39:24 +01:00
Max Kellermann
e44e0fab9f ConfigData: forbid copying a config_param object 2013-01-30 22:39:24 +01:00
Max Kellermann
c434077728 FilterConfig: add missing glib.h include 2013-01-30 22:39:24 +01:00
Max Kellermann
6e47e79790 ConfigData: move functions into the class 2013-01-30 22:25:17 +01:00
Max Kellermann
d9ea3082fb ConfigData: add constructors/destructors 2013-01-30 22:20:14 +01:00
Max Kellermann
2d63c26936 ConfigData: use std::string in block_param 2013-01-30 22:20:14 +01:00
Max Kellermann
3cdd01aa1b ConfigData: use std::vector for the block_param list 2013-01-30 22:20:13 +01:00
Max Kellermann
d25195447a ConfigData: use new/delete instead of GLib 2013-01-30 22:20:13 +01:00
Max Kellermann
aa8ab2fc89 test/test_vorbis_encoder: convert to C++ 2013-01-30 22:19:24 +01:00
Max Kellermann
d664baff26 audio_{parser,config}: convert to C++ 2013-01-30 21:47:12 +01:00
Max Kellermann
3275d4c6fa conf.h: move the GQuark to ConfigQuark.hxx 2013-01-30 21:43:16 +01:00
Max Kellermann
cd0d003197 filter/chain, encoder: GLib include cleanup 2013-01-30 21:42:50 +01:00
Max Kellermann
cfeeb7af2e test/run_encoder, ...: convert to C++ 2013-01-30 21:39:43 +01:00
Max Kellermann
ac887d3afb ConfigFile: simplify error cleanup 2013-01-30 21:39:43 +01:00
Max Kellermann
e294ccae24 ConfigFile: move code to ConfigGlobal.cxx 2013-01-30 21:39:43 +01:00
Max Kellermann
72070f292b ConfigFile: add struct ConfigData 2013-01-30 21:36:11 +01:00
Max Kellermann
823c618d24 {encoder,output}_api.h: allow compiling as C++ 2013-01-30 21:36:09 +01:00
Max Kellermann
51cb6a0a44 conf: move struct definitions to ConfigData.hxx 2013-01-30 21:36:07 +01:00
Max Kellermann
a1b1ec3d11 Makefile.am: move source files to libconf.a 2013-01-30 21:36:06 +01:00
Max Kellermann
595b6a4f6c ConfigFile: add enum ConfigOption
Look up top-level config options by enum (= integer), not by name
string.
2013-01-30 21:36:04 +01:00
Max Kellermann
daa4647712 ConfigOption: rename to ConfigTemplate 2013-01-30 19:05:33 +01:00
Max Kellermann
c67668d6dd Makefile.am: fix test/read_mixer rule 2013-01-30 19:05:04 +01:00
Max Kellermann
9cfaa9c7b0 ConfigFile: move code to ConfigOptions.cxx 2013-01-30 17:45:19 +01:00
Max Kellermann
c5ea586882 ConfigFile: split config_entry
The new struct ConfigOption is the compile-time description, and the
global array "config_params" contains the actual values.
2013-01-30 17:35:33 +01:00
Max Kellermann
f2a3a37dff filter_config: convert to C++ 2013-01-30 17:22:44 +01:00
Max Kellermann
01dd540d7e decoder_list: convert to C++ 2013-01-30 17:18:48 +01:00
Max Kellermann
8142080633 InotifyUpdate: use std::list instead of GList
Let STL manage the WatchDirectory allocations.
2013-01-30 16:44:55 +01:00
Max Kellermann
9920a3e8fc InotifyUpdate: move code to destructor 2013-01-30 16:44:54 +01:00
Max Kellermann
f7d8e6c40c InotifyUpdate: allocate the root dynamically 2013-01-30 16:41:17 +01:00
Max Kellermann
4ecf09f9e6 InotifyUpdate: use new/delete instead of GLib slices 2013-01-30 16:37:49 +01:00
Max Kellermann
47a8369d79 InotifyUpdate: rename struct watch_directory 2013-01-30 16:36:58 +01:00
Max Kellermann
6805fa2fa0 InotifyUpdate: use std::map instead of GTree 2013-01-30 16:27:55 +01:00
Max Kellermann
4d6b9611ae UpdateContainer: remove duplicate unlock call 2013-01-30 16:27:38 +01:00
Max Kellermann
16afdfd874 ArchivePlugin: move instance methods to class ArchiveFile 2013-01-30 15:30:19 +01:00
Max Kellermann
701fff03d2 archive/bzip2: create file only after stream has been opened
Simplify error handling.
2013-01-30 15:27:23 +01:00
Max Kellermann
8e0575ca9b archive/zzip: fix memory leak 2013-01-30 15:25:29 +01:00
Max Kellermann
5e8f51a963 output/httpd: use the BufferedSocket class for HttpdClient 2013-01-30 15:08:09 +01:00
Max Kellermann
be3d2188d6 event/SocketMonitor: wake up the event loop after flag change 2013-01-30 15:08:09 +01:00
Max Kellermann
18e429a87e event/Loop: add method WakeUp() 2013-01-30 15:08:09 +01:00
Max Kellermann
3576a8fd9f Main: delete the EventLoop after everything else
Fixes crash when another object attempts to access the EventLoop
during destruction.
2013-01-30 15:08:09 +01:00
Max Kellermann
f260cd031c input/Rewind: remove bogus assertion 2013-01-30 15:05:54 +01:00
Max Kellermann
18c4b536f2 event/ServerSocket: add method GetEventLoop() 2013-01-30 14:23:01 +01:00
Max Kellermann
fa51db449f ServerSocket: replace callback with virtual method 2013-01-30 14:16:04 +01:00
Max Kellermann
cb9a05ac77 output/httpd: safer cast, consider offset 2013-01-30 14:14:42 +01:00
Max Kellermann
f1f22019f5 output/httpd: forward-declare class HttpdClient 2013-01-30 13:42:16 +01:00
Max Kellermann
6d79a1cdfc output/httpd: add constructor, destructor, Configure() 2013-01-30 13:41:27 +01:00
Max Kellermann
ad5eb2f8d6 ServerSocket: expose the class
Eliminate the C wrappers.
2013-01-30 13:40:56 +01:00
Max Kellermann
39d56d6b65 ServerSocket: move to libevent.a 2013-01-30 13:39:12 +01:00
Max Kellermann
a291415326 event/BufferedSocket: move output buffer to FullyBufferedSocket
BufferedSocket has just an input buffer, and FullyBufferedSocket adds
the output buffer.
2013-01-30 11:03:44 +01:00
Max Kellermann
4ad7456428 event/SocketMonitor: OnSocketReady() returns bool 2013-01-30 11:03:44 +01:00
Max Kellermann
73f36858bb event/SocketMonitor: add methods Read(), Write() 2013-01-30 10:39:17 +01:00
Max Kellermann
fe3f0332f7 page: convert to C++ 2013-01-30 09:18:52 +01:00
Max Kellermann
718fd97612 icy_server: convert to C++ 2013-01-30 09:17:03 +01:00
Max Kellermann
f8ff45b212 icy_server: pass pointer to _metadata_page()
Don't use va_list.
2013-01-30 09:13:46 +01:00
Max Kellermann
f5c0b0d316 ArchiveFile: convert to a class 2013-01-29 23:26:51 +01:00
Max Kellermann
ba51045d9e refcount: convert to C++ 2013-01-29 23:20:19 +01:00
Max Kellermann
fa34dd7bd3 test/visit_archive: new debug program 2013-01-29 22:54:56 +01:00
Max Kellermann
9f0fb8f6a8 ArchivePlugin: replace scan_reset(), scan_next() with visit()
Add the interface ArchiveVisitor.
2013-01-29 21:21:07 +01:00
Max Kellermann
a42f9fd4e2 ArchivePlugin: scan_next() returns const string 2013-01-29 21:11:04 +01:00
Max Kellermann
e66005563e playlist/despotify: various code simplifications 2013-01-29 20:36:28 +01:00
Max Kellermann
8cad20585d playlist/memory: use std::forward_list instead of GSList 2013-01-29 20:32:54 +01:00
Max Kellermann
a8b75dc4df playlist/{asx,rss,soundcloud,xspf}: merge code to MemoryPlaylistProvider 2013-01-29 18:56:35 +01:00
Max Kellermann
e4455962c6 ClientSubscribe: remove obsolete typedef 2013-01-29 18:37:40 +01:00
Max Kellermann
20f85745e7 require GLib 2.24 2013-01-29 18:33:37 +01:00
Max Kellermann
feb8d5b82f ConfigFile, CommandLine: use the Path class 2013-01-29 18:09:39 +01:00
Max Kellermann
eb8922f346 test/{read_conf,run_filter}: convert to C++ 2013-01-29 17:23:58 +01:00
Max Kellermann
84eb95466b output/osx: convert to C++ 2013-01-29 16:59:21 +01:00
Max Kellermann
3dd8beb380 decoder/faad: use the newer NeAAC* API
Drop support for the old faacDec* API.
2013-01-29 16:17:15 +01:00
Max Kellermann
ae77406b8e faad.m4: clear FAAD_LIBS if faad got auto-disabled
Fixes build errors on systems without libfaad, when --disable-aac was
not specified.
2013-01-29 15:52:43 +01:00
Max Kellermann
2d16069211 faad.m4: don't add -I. to temporary CFLAGS 2013-01-29 15:51:31 +01:00
Max Kellermann
d18314fa05 faad.m4: remove faad --with-* options
Some of these are not implemented properly and never worked.  And the
others are not useful; you can easily set environment variables
instead.
2013-01-29 15:40:44 +01:00
Max Kellermann
26a9ce7b29 output/{alsa,oss}: convert to C++ 2013-01-29 14:32:32 +01:00
Max Kellermann
76417d4446 InputStream: use std::string 2013-01-28 23:41:45 +01:00
Max Kellermann
cffc78ad6a InputStream: store references instead of pointers 2013-01-28 23:35:01 +01:00
Max Kellermann
dcf55c7e32 InputStream: add constructor/destructor
Eliminate input_stream_init() and input_stream_deinit().
2013-01-28 23:29:43 +01:00
Max Kellermann
e565cd4404 input/despotify: add constructor/destructor 2013-01-28 23:13:19 +01:00
Max Kellermann
5934ccbb74 input/despotify: rename class 2013-01-28 23:12:10 +01:00
Max Kellermann
e39969a0d0 input/iso9660: add constructor/destructor 2013-01-28 22:54:07 +01:00
Max Kellermann
d68185aa28 input/iso9660: rename the classes 2013-01-28 22:52:40 +01:00
Max Kellermann
4cab151ed2 input/zzip: add constructor/destructor 2013-01-28 22:48:04 +01:00
Max Kellermann
8ac9b77e5c input/zzip: rename the classes 2013-01-28 22:43:59 +01:00
Max Kellermann
1b9da5d978 input/bzip2: add constructor/destructor 2013-01-28 22:39:09 +01:00
Max Kellermann
ab2b7358cb archive/bzip2: rename the classes 2013-01-28 22:17:40 +01:00
Max Kellermann
8ceea85813 DatabaseLock, input/bzip2: remove obsolete Glib/gcc workaround 2013-01-28 22:17:40 +01:00
Max Kellermann
d0a812d2df input/Soup: move code into the class 2013-01-28 22:00:24 +01:00
Max Kellermann
3dad2e1c0f input/soup: rename the class 2013-01-28 21:59:40 +01:00
Max Kellermann
70e4399334 input/ffmpeg: add constructor/destructor 2013-01-28 21:46:38 +01:00
Max Kellermann
00f8c2d46f input/ffmpeg: rename the class 2013-01-28 21:45:44 +01:00
Max Kellermann
0dd4b52b63 decoder/ffmpeg: require ffmpeg/libav 0.7.6
This is the version present in Ubuntu Oneiric, the oldest distribution
with gcc 4.6.  Debian Squeeze is off target, because it has gcc 4.4,
which is unable to compile MPD anyway.

This commit drops all API compatibility hacks for older versions.
2013-01-28 21:32:14 +01:00
Max Kellermann
88c17926e4 decoder/mp4ff: delete obsolete plugin
The underlying library has been obsolete for many years.
2013-01-28 21:32:14 +01:00
Max Kellermann
541192c941 db/Proxy: explicitly request first element of array
Works around gcc 4.6 bug.
2013-01-28 21:32:14 +01:00
Max Kellermann
2e9f054ec0 audio_config: include cleanup 2013-01-28 20:30:47 +01:00
Max Kellermann
2aa34882b7 output/httpd: move functions into the HttpdOutput class 2013-01-27 23:23:46 +01:00
Max Kellermann
27f8ef2f33 output/httpd: rename struct httpd_output 2013-01-27 23:21:39 +01:00
Max Kellermann
2cbe21c791 ZeroconfAvahi: pass GMainContext to avahi_glib_poll_new() 2013-01-27 22:53:21 +01:00
Max Kellermann
0988056471 ZeroconfBonjour: use SocketMonitor instead of GIOChannel 2013-01-27 22:38:14 +01:00
Max Kellermann
95c3f57b30 zeroconf: convert to C++ 2013-01-27 22:38:14 +01:00
Max Kellermann
068f191c0d event/SocketMonitor: add method Steal() 2013-01-27 22:38:14 +01:00
Max Kellermann
6bf6c9215b Makefile.cxx: fix test/run_input.cxx path 2013-01-27 22:17:47 +01:00
Max Kellermann
a65afa8090 PlayerControl: work around std::nanf() not being available on MacPorts 2013-01-27 21:58:35 +01:00
Max Kellermann
8155784990 string_util: add fallback for strnlen()
Usually, when strndup() is not available, strndup() isn't either,
because both are POSIX 2008.
2013-01-27 21:43:27 +01:00
Max Kellermann
44725e485d configure.ac: disable libwrap if not compatible with C++
The libwrap version on Mac OS X is broken, it will not work with C++
due to broken function prototypes.
2013-01-27 21:43:04 +01:00
Denis Krjuchkov
e98e2a0b07 Path::FromUTF8() returns nulled instance on error, add error handling where required 2013-01-28 00:13:46 +06:00
Denis Krjuchkov
943064bb51 Path: convert remaining funcs to methods, keep fs_charset as std::string 2013-01-28 00:13:46 +06:00
Denis Krjuchkov
7149a8ae4f Path: merge utf8_to_fs_charset() into Path::FromUTF8() 2013-01-28 00:13:45 +06:00
Denis Krjuchkov
3c7cf94643 Path: convert fs_charset_to_utf8() to static method Path::ToUTF8() 2013-01-28 00:13:45 +06:00
Denis Krjuchkov
3bd35d1883 Path: introduce MPD_PATH_MAX_UTF8 2013-01-28 00:13:45 +06:00
Max Kellermann
6f3d70b5e2 DecoderControl, InputStream: use Mutex/Cond instead of GMutex/GCond 2013-01-27 18:39:32 +01:00
Max Kellermann
257a0dee75 playlist/*: convert to C++ 2013-01-27 17:38:09 +01:00
Denis Krjuchkov
e995cd928c Path: define MPD_PATH_MAX to 260 on Windows 2013-01-26 11:18:12 +06:00
Denis Krjuchkov
292d7c3fdf Path: ToUTF() returns std::string 2013-01-26 11:16:12 +06:00
Max Kellermann
0273cd44b0 input_stream: forward-declare the struct
Hide the definition from C code, to prepare the transition to C++.
2013-01-26 01:24:01 +01:00
Max Kellermann
3203a7dd8c tag_file: convert to C++ 2013-01-26 01:23:02 +01:00
Max Kellermann
86b0adc82c playlist/*: convert to C++ 2013-01-26 01:17:43 +01:00
Max Kellermann
ba49f20f68 decoder/ffmpeg: convert to C++ 2013-01-26 01:17:43 +01:00
Denis Krjuchkov
a3ee26da64 Mapper: improve usage of Path class 2013-01-26 01:14:13 +01:00
Max Kellermann
a9b62a2ece PlayerControl: add second Cond object
This fixes a deadlock bug introduced by 18076ac9.  After all, the
second Cond was necessary.

The problem: two threads can wait for a signal at the same time.  The
player thread waits for the output thread to finish playback.  The
main thread waits for the player thread to complete a command.  The
output thread finishes playback, and sends a signal, which
unfortunately does not wake up the player thread, but the main
thread.  The main thread sees that the command is still not finished,
and waits again.  The signal is lost forever, and MPD is deadlocked.
2013-01-25 23:53:43 +01:00
Max Kellermann
49567f1f3e input_{internal,plugin}: convert to C++ 2013-01-25 22:43:01 +01:00
Max Kellermann
94fffb332b archive/*: convert to C++ 2013-01-24 19:18:58 +01:00
Max Kellermann
dc2e64c92b DecoderControl: fix typo in assertion check 2013-01-23 18:02:40 +01:00
Denis Krjuchkov
06fb7c671b Makefile.am: introduce libfs 2013-01-22 01:31:29 +06:00
Denis Krjuchkov
ef93cdf4a8 Path: move to fs subdirectory 2013-01-22 01:24:53 +06:00
Denis Krjuchkov
4ad90e2d52 FileSystem: extract DirectoryReader, improve the rest
- DirectoryReader is extracted to separate header
- FileSystem.cxx/FileSystem.hxx/DirectoryReader.hxx moved to fs/ subdir
- Functions return true on success, instead of 0 (where applicable)
- ReadLink return result instead of out parameter
- UnlinkFile is renamed to RemoveFile
- CheckExists/CheckIsRegular/CheckIsDirectory are renamed
  to PathExists/FileExists/DirectoryExists
2013-01-22 01:05:30 +06:00
Max Kellermann
7c0e4dfb56 input/archive: fix memory leak in error handler 2013-01-21 19:08:35 +01:00
Max Kellermann
9ec069104f input,playlist/despotify: convert to C++ 2013-01-21 19:01:10 +01:00
Max Kellermann
7d21d60dba despotify_utils: fix indent 2013-01-21 19:00:50 +01:00
Max Kellermann
ed8562c300 despotify_utils: include cleanup 2013-01-21 19:00:01 +01:00
Max Kellermann
22ec1c3498 despotify_utils: add missing copyright header 2013-01-21 18:59:37 +01:00
Max Kellermann
9cc90b1fbe input/cdio_paranoia: convert to C++ 2013-01-21 17:58:30 +01:00
Max Kellermann
0c9f22507f input/ffmpeg: convert to C++ 2013-01-21 17:50:43 +01:00
Max Kellermann
9c870e4276 input/rewind: convert to C++ 2013-01-21 17:36:19 +01:00
Max Kellermann
5cffe693b0 input/file,mms: convert to C++ 2013-01-21 10:52:40 +01:00
Max Kellermann
e01615fd1e input_internal.h: add extern "C" 2013-01-21 10:52:19 +01:00
Max Kellermann
c1daa857a5 test/run_tcp_connect: delete obsolete source file 2013-01-21 10:47:38 +01:00
Max Kellermann
3928c4e9ae UpdateRemove: Mutex/Cond instead of GMutex/GCond 2013-01-21 10:42:47 +01:00
Max Kellermann
32799fef5c DecoderControl: move functions into the class 2013-01-21 10:13:29 +01:00
Max Kellermann
e1b03b4a71 PlayerControl: move functions into the class 2013-01-20 17:48:23 +01:00
Denis Krjuchkov
e6ed592b8a FileSystem: new library for Path-friendly file system routines 2013-01-20 19:08:36 +06:00
Denis Krjuchkov
6f4560184c dummy.cxx: remove unused file
This file was used previously to force C++ linkage.
It's no longer required because most of the code is C++ anyway.
2013-01-19 12:45:50 +06:00
Max Kellermann
e5039c478a Path: new class "Path" wraps filesystem path strings 2013-01-18 15:34:01 +01:00
Max Kellermann
8901514506 Playlist, Song: clarify parameter encoding 2013-01-18 15:34:01 +01:00
Max Kellermann
21fe376d1d path: convert to C++ 2013-01-17 00:43:27 +01:00
Max Kellermann
e22ef6c481 output/roar: convert to C++ 2013-01-16 23:29:56 +01:00
Max Kellermann
2bb01093c0 Idle: don't wake up event loop on duplicate event 2013-01-16 23:27:17 +01:00
Max Kellermann
36c814d26e Idle: use std::atomic instead of GMutex 2013-01-16 23:23:47 +01:00
Max Kellermann
d769b74d61 Main: fix comment typo 2013-01-16 23:23:47 +01:00
Max Kellermann
601495fa0f ClientList: convert to a class 2013-01-16 23:00:13 +01:00
Max Kellermann
1998633739 ClientGlobal: move client_close_all() to ClientList.cxx 2013-01-16 22:56:52 +01:00
Max Kellermann
0194217f9d Revert "ClientList: allow deleting clients in client_list_foreach() callback"
This reverts commit f56c6a18c1.  This
fix is not necessary anymore because clients are now being deleted by
the timer callback.
2013-01-16 22:49:51 +01:00
Max Kellermann
b0bbb8b693 Client: use TimeoutMonitor to track connection timeout
Don't use a global loop over the whole client list.
2013-01-16 21:51:08 +01:00
Max Kellermann
cab84af72e Client: move "idle" functions into the class 2013-01-16 21:46:13 +01:00
Max Kellermann
74500eacca Merge branch 'v0.17.x' 2013-01-16 20:05:26 +01:00
Brice Jaglin
1105e61f29 decoder/ffmpeg: support float planar audio 2013-01-16 19:54:54 +01:00
Max Kellermann
b7cf279d6d zeroconf-avahi: eliminate "goto" 2013-01-16 00:23:00 +01:00
Max Kellermann
c614e550d9 valgrind.suppressions: more GLib suppressions 2013-01-15 23:44:21 +01:00
Max Kellermann
452a30d7af input/Curl: break loop when remaining length becomes 0
Fixes assertion failure (regression).
2013-01-15 23:39:32 +01:00
Max Kellermann
49e79620fd PlayerControl: initialise attribute "border_pause" 2013-01-15 23:21:14 +01:00
Max Kellermann
ae5a721df9 Playlist: initialise attribute "playing" 2013-01-15 23:09:18 +01:00
Max Kellermann
0dd5f2915a ServerSocket: use the SocketMonitor class 2013-01-15 22:56:06 +01:00
Max Kellermann
a0ebd444ad event/SocketMonitor: add method Open()
Allow creating a closed SocketMonitor instance.
2013-01-15 22:56:06 +01:00
Max Kellermann
0c6072c4e4 ServerSocket: move more code to methods 2013-01-15 22:53:14 +01:00
Max Kellermann
8917264110 ServerSocket, SocketUtil: use the SocketError library
Use WinSock errors on Windows.
2013-01-15 22:42:15 +01:00
Max Kellermann
e90d606f0a socket_util: convert to C++ 2013-01-15 22:41:56 +01:00
Max Kellermann
5bb2d64ddb SocketError: merge duplicate FormatMessage() calls
Make a class that contains the formatting code and the buffer.
2013-01-15 22:41:56 +01:00
Max Kellermann
bc66dc45e6 server_socket: convert to C++ 2013-01-15 21:42:55 +01:00
Max Kellermann
7087935656 output/httpd: convert to C++ 2013-01-15 20:20:51 +01:00
Max Kellermann
5822daa63d output_internal, ...: add extern "C" 2013-01-15 20:20:51 +01:00
Max Kellermann
4808c7ef39 encoder/{Vorbis,Opus}: use new/delete 2013-01-15 20:20:51 +01:00
Max Kellermann
7071126770 InotifySource: use the SocketMonitor class 2013-01-15 18:18:34 +01:00
Max Kellermann
2101daef5a mixer/Alsa: use MultiSocketMonitor 2013-01-15 18:18:00 +01:00
Max Kellermann
083065f433 input/Curl: move code to class MultiSocketMonitor 2013-01-15 18:16:55 +01:00
Max Kellermann
4cfc4a5a94 input/Curl: simpler GPollFD initialisation
Using initializer list.
2013-01-15 18:16:38 +01:00
Max Kellermann
1c7ee737e6 input/Curl: don't remove/add modified GPollFD
Not necessary, GLib will pick up the updated GPollFD automatically.
2013-01-15 18:16:15 +01:00
Max Kellermann
39439b80f5 Client: rebase on the new BufferedSocket class 2013-01-15 12:15:33 +01:00
Max Kellermann
396480cf94 event/SocketMonitor: wrapper class for GSource + GPollFD 2013-01-15 11:00:48 +01:00
Max Kellermann
3e03527930 Client: move output buffer code to new class PeakBuffer 2013-01-15 10:59:28 +01:00
Max Kellermann
4fa724461e util/fifo_buffer: add method _init() 2013-01-15 10:59:28 +01:00
Max Kellermann
1e2018ce83 Client: move connection functions into the class 2013-01-15 10:59:28 +01:00
Max Kellermann
3fcf17cb79 SignalHandlers: emit GlobalEvents::SHUTDOWN
.. instead of calling g_main_loop_quit(), which may dead-lock.
2013-01-15 10:59:28 +01:00
Max Kellermann
f9fc3a42cc fifo_buffer: move to util/ 2013-01-15 01:02:13 +01:00
Max Kellermann
76bc28ab1e fifo_buffer: add extern "C" 2013-01-15 01:01:25 +01:00
Max Kellermann
f47f86ef02 socket_error: new library for errno / WSAGetLastError() 2013-01-15 00:53:12 +01:00
Max Kellermann
31268ffa24 io_error: add function new_error_errno() 2013-01-15 00:53:12 +01:00
Max Kellermann
0634be9724 Client*: include check.h / config.h 2013-01-14 23:50:01 +01:00
Dark Raven
f56c6a18c1 ClientList: allow deleting clients in client_list_foreach() callback 2013-01-14 11:24:54 +01:00
Max Kellermann
aa4c506fcd Revert "ClientList.cxx: copy client list before iterating"
This reverts commit f53dadcc6d, to
prepare for a better solution.
2013-01-14 11:24:29 +01:00
Max Kellermann
d3a479b7fa event/TimeoutMonitor: wrapper for g_timeout_source_new() 2013-01-14 11:12:28 +01:00
Max Kellermann
92fb0e829a StateFile: convert to a class 2013-01-14 11:00:22 +01:00
Max Kellermann
43a9928537 gcc.h: add C++11 "final" fallback macro 2013-01-14 10:56:42 +01:00
Max Kellermann
c8b408beae InotifyQueue: convert to a class 2013-01-14 10:13:28 +01:00
Max Kellermann
8e3982dd42 InotifySource: convert to a class 2013-01-14 10:08:26 +01:00
Max Kellermann
e83f805b8f Main, IOThread: move GMainLoop setup code to class EventLoop 2013-01-14 09:15:49 +01:00
Max Kellermann
be98afe34d IOThread: use gcc.h 2013-01-14 09:15:49 +01:00
Denis Krjuchkov
f53dadcc6d ClientList.cxx: copy client list before iterating
It seems that it is not safe to remove the item from std::list
while it's being iterated somewhere else.

This is a very simple quick fix to make things work
until some better solution is implemented.
2013-01-13 15:36:25 +06:00
Denis Krjuchkov
90ab65f8c7 WakeFD.cxx: use two sockets instead of pipe on Win32
Pipes aren't really pollable on Windows.
GLib emulates polling on pipes using separate reader/writer threads.
This adds significant overhead and keeps a strong dependency on GLib.

socketpair() function is absent on Windows as well.
We implement it here in a loose way.
2013-01-13 15:30:53 +06:00
Denis Krjuchkov
abb0fcb203 Win32Main.cxx: more clean shutdown
This change fixes two issues:

1) console_handler is called from a separate thread.
   Thread-safe primitive is required for correct operation.

2) If console_handler returns TRUE our process is immediately terminated.
   We use Sleep() to give main thread an opportunity to shutdown correctly.
2013-01-13 15:20:32 +06:00
Denis Krjuchkov
eef4f33a29 configure.ac: use correct variable for checking libmpdclient presence 2013-01-11 16:47:56 +06:00
Max Kellermann
0226440a2d thread/{Mutex,Cond}: new backend for WIN32
Use CRITICAL_SECTION and CONDITION_VARIABLE.  This requires Windows
Vista or newer.  It fixes problems with GLib threading objects that
were implicitly created by static constructors before g_thread_init().
2013-01-11 11:11:07 +01:00
Max Kellermann
9d770d6084 GlobalEvents: #undef DELETE on Windows
Work around a build failure due to windows.h macro.
2013-01-11 11:10:46 +01:00
Max Kellermann
7f0297dc44 configure.ac: require Windows Vista or newer
We're going to use Vista features soon.  Sorry for those poor people
still on XP (or Windows, anyway).
2013-01-11 11:09:27 +01:00
Max Kellermann
49f3855407 configure.ac: enable WIN32_LEAN_AND_MEAN on Windows 2013-01-11 11:06:16 +01:00
Denis Krjuchkov
905d493fd7 .gitignore: add src/win/mpd_win32_rc.rc
This file is generated during configuration and should be ignored.
2013-01-11 15:30:59 +06:00
Denis Krjuchkov
5def2a09bd mpdconf.example: example improvements
- Add mandatory "name" setting for winmm/openal examples.

- Fix the language in openal sample (a -> an)
2013-01-11 15:28:21 +06:00
Denis Krjuchkov
a98aa66620 string_util.c: provide fallback strndup() implementation
This patch also adds extern "C" { } wrapper around string_util.h
to allow its usage in C++ code
2013-01-11 13:51:39 +06:00
Max Kellermann
631a268996 input/curl: use std::list instead of GQueue 2013-01-10 23:00:23 +01:00
Max Kellermann
85074f5ac6 icy_metadata: convert to C++ 2013-01-10 22:33:16 +01:00
Max Kellermann
12a8ed39d4 input/Curl: add constructor to input_curl class 2013-01-10 22:25:57 +01:00
Max Kellermann
b9ac5e9e76 input/Curl: remove unused source/source_id attributes 2013-01-10 22:25:33 +01:00
Max Kellermann
2758a734a2 input/Curl: remove redundant attribute "url"
Use the "url" attribute from the base class instead.
2013-01-10 22:21:30 +01:00
Max Kellermann
01f3131c81 input/Curl: use std::forward_list instead of GSList 2013-01-10 20:52:58 +01:00
Max Kellermann
2ca9236864 input/Curl: remove unused attribute "fds" 2013-01-10 20:52:44 +01:00
Max Kellermann
3bb711837e input/Curl: require libcurl 7.18 2013-01-10 20:46:47 +01:00
Max Kellermann
ed8798e82f output/shout: refactor check_block_param() to a function
Don't use macro magic, don't dereference the block_param.
2013-01-10 18:46:33 +01:00
Max Kellermann
38474961fd Log, ...: include cleanup 2013-01-10 18:34:40 +01:00
Max Kellermann
3dd38e7b7f decoder/wavpack: convert to C++ 2013-01-10 18:18:14 +01:00
Max Kellermann
3711a97657 decoder/wavpack: include cleanup 2013-01-10 18:18:02 +01:00
Max Kellermann
911411e630 conf: convert to C++ 2013-01-10 18:18:02 +01:00
Max Kellermann
c02cc199bc path: move code to IsSupportedCharset() 2013-01-10 18:06:21 +01:00
Max Kellermann
dd6c21e092 path: make the "win_charset" buffer static
It is illegal to use it after going out of scope.
2013-01-10 17:54:11 +01:00
Denis Krjuchkov
7801ca86b9 mpdconf.example: provide an example of openal output 2013-01-10 15:50:00 +06:00
Denis Krjuchkov
10fc288c91 mpdconf.example: provide an example of winmm output 2013-01-10 15:46:30 +06:00
Max Kellermann
b8cda53bd3 notify: convert to C++ 2013-01-10 10:44:04 +01:00
Denis Krjuchkov
43806d524d mpdconf.example: improve documentation for replay gain
- Added replaygain_missing_preamp and replaygain_limit settings

- Added information about "auto" replay gain mode
2013-01-10 15:34:25 +06:00
Max Kellermann
e0a97a030f io_thread: convert to C++ 2013-01-10 10:33:20 +01:00
Max Kellermann
33ba288622 input/{curl,soup}: convert to C++ 2013-01-10 10:23:20 +01:00
Max Kellermann
d5516dee00 input_stream: convert to C++ (internally) 2013-01-10 10:15:09 +01:00
Max Kellermann
06e0741a52 PlayerControl: switch to the Mutex/Cond classes 2013-01-10 10:12:54 +01:00
Max Kellermann
0b93445380 thread/Cond: new wrapper for pthread_cond_t or GCond 2013-01-10 10:03:19 +01:00
Max Kellermann
483ba5ea1c thread/GLibMutex: new Mutex implementation
Switch WIN32 to this implementation to be able to use condition
variables, which is impossible with CriticalSection.
2013-01-10 10:03:18 +01:00
Max Kellermann
18076ac9b7 PlayerThread: use pc.cond instead of main_cond
The main_cond variable was completely unnecessary.  The pc.cond object
can be used for both main->pc and pc->main.
2013-01-10 10:01:24 +01:00
Max Kellermann
ad15ca7104 DecoderControl: take ownership of client_cond
Don't let the "client" pass its own GCond.  This was not used
consistently.
2013-01-10 10:01:18 +01:00
Max Kellermann
53117ac204 DecoderThread: signal the client after decoder finishes
Fixes potential dead lock bug.
2013-01-10 10:00:53 +01:00
Max Kellermann
51a8c109ab thread/PosixMutex: fix indent 2013-01-10 10:00:52 +01:00
Denis Krjuchkov
ea25e0ee55 configure.ac: change newline position to fit into 80 chars 2013-01-10 14:47:15 +06:00
Denis Krjuchkov
e6fdae431f configure.ac: print results of libmpdclient detection 2013-01-10 14:42:10 +06:00
Denis Krjuchkov
34afc272fd configure.ac: print results of AdPlug detection 2013-01-10 14:33:10 +06:00
Denis Krjuchkov
a5673fcb28 configure.ac: consistently use Opus name 2013-01-10 14:32:18 +06:00
Max Kellermann
5c3c506638 GlobalEvents: lock-less operation using std::atomic
Use a bit field instead of a mutex-protected bool array.
2013-01-10 00:57:18 +01:00
Max Kellermann
ecd5eb02c5 event/WakeFD: use eventfd() if available 2013-01-10 00:10:01 +01:00
Max Kellermann
3be57dc4a3 fd_util: support eventfd() 2013-01-10 00:10:01 +01:00
Max Kellermann
a93caf3cfe GlobalEvents: move code to class WakeFD 2013-01-09 23:47:38 +01:00
Max Kellermann
26ebfc04b0 EventPipe: rename to GlobalEvents 2013-01-09 23:31:43 +01:00
Max Kellermann
8782f6d232 EventPipe: use Mutex instead of GMutex 2013-01-09 23:30:07 +01:00
Max Kellermann
5faf443038 event_pipe.h: convert to C++ 2013-01-09 22:37:47 +01:00
Max Kellermann
8eacd13ce7 sig_handlers, log: convert to C++ 2013-01-09 22:33:06 +01:00
Max Kellermann
d3e1b72d38 mixer/{alsa,pulse}: convert to C++ 2013-01-09 22:25:24 +01:00
Max Kellermann
b5e1bd5705 Playlist.hxx: move prototype to PlaylistGlobal.hxx 2013-01-09 22:23:37 +01:00
Max Kellermann
4bef0a1e62 Playlist: move playlist_increment_version_all() into the class 2013-01-09 22:21:16 +01:00
Max Kellermann
3e5f09be0b event_pipe: convert to C++ 2013-01-09 13:02:13 +01:00
Max Kellermann
e86e77ad67 idle: convert to C++ 2013-01-09 13:01:38 +01:00
Max Kellermann
3c4bb9ff4e test/FakeReplayGainConfig: move fake symbols from a few debug programs 2013-01-09 12:26:07 +01:00
Max Kellermann
a890dadfd2 test/run_decoder,read_tags: remove obsolete dummy functions 2013-01-09 12:25:39 +01:00
Max Kellermann
6b4374583a ReplayGainCoinfig: initialize replay_gain_limit with default value 2013-01-09 12:25:14 +01:00
Denis Krjuchkov
78f4171a7a configure.ac: improve detection of libgme
At least in my configuration libgme lacks .pc file
thus could not be detected with pkg-config.
2013-01-09 14:35:25 +06:00
Max Kellermann
f8a99a391e ReplayGainCoinfig: make DEFAULT_REPLAYGAIN_LIMIT static 2013-01-09 08:56:16 +01:00
Max Kellermann
2564f763d7 ClientList: don't use GLib
Use std::list instead of GList.
2013-01-09 08:12:44 +01:00
Max Kellermann
377a2b9e07 ClientList: add header ClientList.hxx 2013-01-09 08:08:36 +01:00
Max Kellermann
045993001c zeroconf-bonjour: include Listen.hxx instead of listen.h
Should fix the OS X build.
2013-01-09 08:07:26 +01:00
Max Kellermann
affc446690 Queue: use std::stable_sort() instead of g_qsort_with_data() 2013-01-08 16:51:21 +01:00
Max Kellermann
255ee646c2 song: don't use GLib 2013-01-08 16:47:12 +01:00
Max Kellermann
0308ec564e util/list: don't use GLib 2013-01-08 16:41:36 +01:00
Max Kellermann
6cafec8ae6 Queue: allocate memory with new/delete 2013-01-08 16:35:09 +01:00
Max Kellermann
8ef87be482 Queue: use signed integer instead of G_MAXUINT
The check for unsigned underflow is fragile and unreliable.
2013-01-08 16:33:33 +01:00
Max Kellermann
6c57047362 Queue: move code to new class IdTable 2013-01-08 16:11:25 +01:00
Max Kellermann
e29bc6912b Queue: rename internal types 2013-01-08 16:05:10 +01:00
Max Kellermann
ce57b8b6df Queue: move HASH_MULT and Item into the Queue class 2013-01-08 16:04:10 +01:00
Max Kellermann
d81a9029db Queue: move GenerateId() and others into the class 2013-01-08 15:38:10 +01:00
Max Kellermann
620ae7790b test: rename debug programs back to old names 2013-01-08 15:33:58 +01:00
Denis Krjuchkov
23b2b7144b Makefile.am: distribute mpc.ico 2013-01-08 17:46:04 +06:00
Max Kellermann
bf4311cd9b decoder/OggUtil,Opus: move code to new class OggSyncState 2013-01-08 11:04:14 +01:00
Max Kellermann
8f7adf79a3 decoder/Opus: read total time 2013-01-08 01:38:02 +01:00
Max Kellermann
97b164d03b decoder/OggUtil: add OggExpectPageSeek() 2013-01-08 01:30:44 +01:00
Max Kellermann
61e7e531c2 decoder/Opus: move page reader into the decoder class 2013-01-08 01:22:11 +01:00
Max Kellermann
ceb652915f decoder/Opus: move code to HandlePackets() 2013-01-08 01:20:03 +01:00
Max Kellermann
cdaf504ab8 decoder/Opus: make internal methods inline 2013-01-08 01:19:18 +01:00
Max Kellermann
9fb5aad157 decoder/OggUtil: add OggExpectFirstPage() and OggExpectPageIn() 2013-01-08 01:08:01 +01:00
Max Kellermann
a6301d45f4 decoder/Opus: use OggExpectPage() in main loop 2013-01-08 01:05:59 +01:00
Max Kellermann
b83d069266 decoder/OggUtil: add struct forward declarations 2013-01-08 01:02:06 +01:00
Max Kellermann
960b9a9664 input_stream: add method _cheap_seeking()
Move code from the Vorbis decoder plugin.
2013-01-07 23:25:08 +01:00
Max Kellermann
acb45caa42 decoder/ogg_codec: convert to C++ 2013-01-07 22:14:52 +01:00
Max Kellermann
39060b528a decoder/vorbis: convert to C++ 2013-01-07 22:04:58 +01:00
Max Kellermann
4a36323f1b Queue: don't include glib.h 2013-01-07 22:01:56 +01:00
Max Kellermann
c6281b2680 Queue: use C++ random instead of GLib's GRand 2013-01-07 22:00:57 +01:00
Max Kellermann
5b8b7d1412 util/LazyRandomEngine: lazy wrapper for std::mt19937 2013-01-07 21:27:51 +01:00
Max Kellermann
53e5139b99 Queue: move queue_shuffle_order_first() into the class 2013-01-07 21:26:22 +01:00
Max Kellermann
2b8ce83c9b Queue: move queue_shuffle_order_range() into the class 2013-01-07 21:17:01 +01:00
Max Kellermann
52638c68f5 Playlist: convert functions to methods 2013-01-07 11:35:35 +01:00
Max Kellermann
400ff1c812 DatabaseQueue: pass DatabaseSelection to Add...() 2013-01-07 11:33:00 +01:00
Max Kellermann
d360f17a59 Client: add Partition reference attribute
playlist and player_control are deprecated.
2013-01-07 10:59:56 +01:00
Max Kellermann
a6ee6be960 TagPool: use the Mutex class instead of GStaticMutex 2013-01-07 10:49:21 +01:00
Max Kellermann
47911f9544 tag: convert to C++ 2013-01-07 10:36:27 +01:00
Max Kellermann
48025c2279 DatabaseLock: use the Mutex class instead of GLib's GMutex 2013-01-07 10:34:55 +01:00
Max Kellermann
a68302e50b thread/Mutex: don't use std::mutex
Use a custom pthread_mutex_t wrapper because std::mutex adds overhead.
2013-01-07 10:33:37 +01:00
Max Kellermann
333a08ebf9 replay_gain_info, ...: use cmath instead of math.h in C++ mode
Fixes build problems with mingw32.
2013-01-07 10:19:02 +01:00
Max Kellermann
989c9a7317 filter/replay_gain: convert to C++ 2013-01-07 10:17:16 +01:00
Max Kellermann
975370c084 decoder_api.h, ...: add "extern C" 2013-01-07 10:07:40 +01:00
Max Kellermann
c3c776bc6a mixer_all: convert to C++ 2013-01-07 09:05:06 +01:00
Max Kellermann
9f4b906e6c volume: convert to C++ 2013-01-07 09:05:01 +01:00
Max Kellermann
804900df36 audio_config, volume, mixer_all: include cleanup 2013-01-07 08:54:01 +01:00
Max Kellermann
3781f6cf39 Merge tag 'release-0.17.3' 2013-01-07 08:46:55 +01:00
Avuton Olrich
227da2377a Modify version string to post-release version 0.17.4~git 2013-01-06 16:47:09 -08:00
Avuton Olrich
ffb3a9f526 mpd version 0.17.3 2013-01-06 16:47:09 -08:00
Max Kellermann
6936c0e2ab Queue: use std::swap 2013-01-06 23:48:34 +01:00
Max Kellermann
108242042e queue: convert all functions to methods 2013-01-06 21:33:58 +01:00
Max Kellermann
70652abf97 Queue: add constructor and destructor 2013-01-06 18:59:39 +01:00
Max Kellermann
e202b407ec Playlist: add constructor and destructor 2013-01-06 18:59:33 +01:00
Max Kellermann
2cc89e60cc DatabaseQueue: force passing playlist reference to std::bind()
Avoid implicit copy.
2013-01-06 18:59:01 +01:00
Max Kellermann
d536944beb Partition: new class, container for Playlist and PlayerControl
This is the beginning of multi-player support.  There will be support
for multiple Partition objects in one MPD process.
2013-01-05 02:43:00 +01:00
Max Kellermann
1a8ef3cdab filter/ReplayGain: add method _set_mode()
Push the new mode to the filter instead of accessing global variables
through replay_gain_get_real_mode().
2013-01-05 02:40:33 +01:00
Max Kellermann
7be33eba48 DecoderAPI: don't use replay_gain_get_real_mode()
replay_gain_get_real_mode() accesses dangerous globals.  Let's just
use the global variable replay_gain_mode, and assume "AUTO" means
"TRACK".  At this point, this is the best we can do, because neither
the decoder nor the player should know about the current replay gain
mode.  This is applied as a filter in the output thread.
2013-01-05 02:40:32 +01:00
Max Kellermann
46ed91b53d DecoderAPI: _replay_gain() returns void
Let the function decoder_replay_gain() update
decoder_control::replay_gain_db instead of letting each decoder plugin
take care for that.
2013-01-05 02:40:29 +01:00
Max Kellermann
73f6fc428a test: revert debug program renames 2013-01-05 02:39:32 +01:00
Max Kellermann
44d260f911 replay_gain_*: convert to C++ 2013-01-04 23:50:58 +01:00
Max Kellermann
07249fc395 replay_gain_config: remove unused variable replay_gain_mode_names 2013-01-04 23:49:41 +01:00
Max Kellermann
bc1e8e01f3 DatabaseQueue: pass playlist object
Don't use the global variable "g_playlist".
2013-01-04 23:19:46 +01:00
Max Kellermann
fe8e77e556 Client: add "playlist" attribute
Reduce access to the global variable "g_playlist".
2013-01-04 23:07:11 +01:00
Max Kellermann
b0833084a6 PlayerControl: initialize all attributes 2013-01-04 23:04:42 +01:00
Max Kellermann
3cacaa5dad Client: initialize num_subscriptions 2013-01-04 23:02:35 +01:00
Max Kellermann
e89bd30db5 Playlist: pass max_length to playlist_init()
Move the configuration lookup to Main.cxx.
2013-01-04 22:55:11 +01:00
Max Kellermann
2a9d933a81 PlayerControl: add constructor and destructor 2013-01-04 22:45:14 +01:00
Max Kellermann
81f3d893d9 player_control.h: convert header to C++ 2013-01-04 22:31:53 +01:00
Max Kellermann
05c91082e3 playlist: convert to C++ 2013-01-04 22:12:33 +01:00
Max Kellermann
7267558ba1 DecoderThread: move code to destructor 2013-01-04 22:02:52 +01:00
Max Kellermann
ac6803e7b7 DecoderInternal: initialize replay_gain_serial 2013-01-04 22:01:13 +01:00
Max Kellermann
ffabf8b013 DecoderInternal: move initializers to constructor 2013-01-04 21:59:03 +01:00
Max Kellermann
e9b71a0d28 MusicChunk: move functions to methods 2013-01-04 21:38:46 +01:00
Max Kellermann
efbfe66f21 Mutex: new wrapper for std::mutex, replaces GMutex 2013-01-04 21:24:29 +01:00
Max Kellermann
6886063703 MusicPipe: allocate with new/delete 2013-01-04 21:22:07 +01:00
Max Kellermann
c04e1ad401 mpd_error.h: add missing glib.h include 2013-01-04 21:20:10 +01:00
Max Kellermann
223b90d0d4 MusicBuffer: return memory to kernel when stopping playback
Use the new HugeAllocator as backend for SliceBuffer and call
HugeDiscard() when the last chunk was returned.
2013-01-04 20:48:28 +01:00
Max Kellermann
692b2cfb79 HugeAllocator: new memory allocator 2013-01-04 20:38:06 +01:00
Max Kellermann
447a86c922 SliceBuffer: lazy initialization
Avoid page faults on MPD startup.  This saves a lot of memory for an
idle MPD.
2013-01-04 20:29:47 +01:00
Max Kellermann
e3a2bd3a1e MusicBuffer: move code to template class SliceBuffer 2013-01-04 17:12:21 +01:00
Max Kellermann
f0be6a4b9e MusicBuffer: allocate with new/delete 2013-01-04 17:03:50 +01:00
Max Kellermann
bdab5d5f6e MusicBuffer: disable memory poisoning
This is harmful for memory usage, because it forces the kernel to
allocate physical memory, even before playback has started.  No bug
has been found in a few years with this, so it's safe to assume that
this code is not necessary.
2013-01-04 15:42:15 +01:00
Max Kellermann
15a4246ead Client, Inotify: use std::list instead of std::deque
Random access is not necessary here.
2013-01-04 14:44:06 +01:00
Max Kellermann
9a71845700 crossfade: convert to C++ 2013-01-04 10:31:59 +01:00
Max Kellermann
22f0a1547c buffer, pipe: convert to C++ 2013-01-04 10:16:16 +01:00
Max Kellermann
de0ab43bc1 output_*: convert to C++ 2013-01-04 09:46:41 +01:00
Max Kellermann
e12cc01aa4 decoder_*: convert to C++ 2013-01-04 09:41:45 +01:00
Max Kellermann
71c697288b pcm_convert: make C++ safe 2013-01-04 08:49:15 +01:00
Max Kellermann
a7d1daee93 CommandListBuilder: use std::list instead of GSList 2013-01-04 01:17:25 +01:00
Max Kellermann
77a99cc61d CommandListBuilder: rename attributes 2013-01-04 01:16:22 +01:00
Max Kellermann
fb337418a5 Client: move code to class CommandListBuilder 2013-01-04 00:50:13 +01:00
Max Kellermann
9d312ab208 PlaylistFile: reuse classes PlaylistInfo and PlaylistVector
.. instead of rolling own classes.
2013-01-04 00:02:09 +01:00
Max Kellermann
06be0a1997 PlaylistInfo: remove the obsolete list_head attribute 2013-01-04 00:01:01 +01:00
Max Kellermann
9e4509b846 ClientNew: initialise the "idle" attributes
Make valgrind happy.
2013-01-03 23:59:45 +01:00
Max Kellermann
fc1f0eeda7 Client: add constructor and destructor
Move code from client_new() and client_close().
2013-01-03 23:59:45 +01:00
Max Kellermann
3d5c094804 PlaylistFile: fix memory leak 2013-01-03 23:59:45 +01:00
Max Kellermann
6abc94ec07 valgrind.suppressions: add more suppressions 2013-01-03 23:59:02 +01:00
Max Kellermann
6837e5a6a0 Merge branch 'v0.17.x' 2013-01-03 22:53:53 +01:00
Max Kellermann
9761abf3b5 cue_parser: fix CUE files with only one track
Track whether _finish() has been called, and deliver all partial
results then.  Fixes Mantis ticket 0003621.
2013-01-03 21:58:20 +01:00
Max Kellermann
599a562170 cue_parser: add code comments 2013-01-03 21:38:38 +01:00
Max Kellermann
d29a251547 .gitignore: add more debug programs 2013-01-03 21:21:32 +01:00
Max Kellermann
31da4bc566 cue_parser: fix memory leak 2013-01-03 21:02:59 +01:00
Denis Krjuchkov
0f1a180e15 mpd_auto.m4: Pass libraries to AC_CHECK_LIB in MPD_AUTO_PKG_LIB
Rationale: vanilla libid3tag does not have any pkg-config stuff
and fails to detect because symbols from libz are not found.
2013-01-03 19:59:41 +01:00
Denis Krjuchkov
01a45a53aa cmdline: bunch of fixes related to config file selection
- fix potential memory leak of system_path

  'Potential' because currently g_get_system_config_dirs()
  returns single entry on Windows, but that might change.

- remove incorrect g_free() call

  It's not required at all because
  g_get_system_config_dirs() returns GLib owned memory.

- remove extra semicolon
2013-01-03 19:45:51 +01:00
Max Kellermann
59400d38a9 Client: use std::deque for messages 2013-01-03 18:07:48 +01:00
Max Kellermann
5155b0f608 ClientMessage: turn into a class 2013-01-03 17:58:22 +01:00
Max Kellermann
d919f8d50a ClientInternal: use std::set for subscriptions 2013-01-03 17:49:47 +01:00
Max Kellermann
d67aa7c19d ClientNew: allocate/dispose client objects with new/delete
Prepare for adding non-trivial attributes.
2013-01-03 17:47:39 +01:00
Max Kellermann
7a982169c9 Client: rename the struct client to class Client 2013-01-03 17:36:28 +01:00
Max Kellermann
f2510d60fa ls.h: rename to ls.hxx 2013-01-03 17:34:51 +01:00
Max Kellermann
1e0ea57dc4 cmdline: convert to C++ 2013-01-03 17:31:38 +01:00
Max Kellermann
70b87f2eb6 client: convert to C++ 2013-01-03 11:16:18 +01:00
Max Kellermann
94b2ee627c decoder_print: convert to C++ 2013-01-03 11:14:36 +01:00
Max Kellermann
e30a2dd2d7 listen: convert to C++ 2013-01-03 11:05:44 +01:00
Max Kellermann
7e07daf8cb ls: convert to C++ 2013-01-03 11:01:02 +01:00
Max Kellermann
981906ecd1 output_print: convert to C++ 2013-01-03 10:58:39 +01:00
Max Kellermann
90fe4c5124 TextFile: convert to a class 2013-01-03 10:16:05 +01:00
Max Kellermann
2452447c81 text_file: convert to C++ 2013-01-03 10:12:41 +01:00
Max Kellermann
93f0bb8307 ExcludeList: convert to a class 2013-01-03 10:02:43 +01:00
Max Kellermann
47fc08bffe exclude: convert to C++ 2013-01-03 10:02:33 +01:00
Max Kellermann
c0f2024a2e exclude: make variables more local 2013-01-03 10:02:26 +01:00
Max Kellermann
28f3e190c8 InotifyQueue: use std::deque instead of GSList 2013-01-03 10:02:26 +01:00
Max Kellermann
c4090b670d Permission: use std::map instead of GHashTable 2013-01-03 03:11:39 +01:00
Max Kellermann
ddf112378b permission: convert to C++ 2013-01-03 03:09:50 +01:00
Max Kellermann
b25cce464a client_new: convert to C++ 2013-01-03 03:07:16 +01:00
Max Kellermann
a2297558ff MessageCommands: use std::set instead of GHashTable 2013-01-03 02:40:21 +01:00
Max Kellermann
84cdf0cacc StickerDatabase: use std::map instead of GHashTable 2013-01-03 02:39:08 +01:00
Max Kellermann
9e99e5bef9 strset: delete obsolete library 2013-01-03 02:31:47 +01:00
Max Kellermann
9023ba4a81 PlaylistVector: use std::list 2013-01-03 02:25:06 +01:00
Max Kellermann
83488848e1 Directory: initialise in default constructor 2013-01-03 02:12:34 +01:00
Max Kellermann
f5a92d6cc3 Directory: add constructor and destructor 2013-01-03 01:36:28 +01:00
Max Kellermann
3e8047e583 Directory: rename struct directory to Directory 2013-01-03 01:10:47 +01:00
Max Kellermann
440ac51cf0 database.h: rename to DatabaseSimple.hxx 2013-01-03 01:06:11 +01:00
Max Kellermann
d3293b889d database.h: move prototypes to DatabaseGlue.hxx 2013-01-03 01:04:18 +01:00
Max Kellermann
b4b0b34e5a database.h: eliminate db_*_song()
Use the C++ API.
2013-01-03 00:37:18 +01:00
Max Kellermann
fa3d1156a6 playlist_edit: convert to C++ 2013-01-03 00:35:05 +01:00
Max Kellermann
0eb05b827f Directory: turn functions to methods 2013-01-02 23:06:10 +01:00
Max Kellermann
0c245bc271 Directory: make the header C++ only 2013-01-02 22:52:08 +01:00
Max Kellermann
d65ad1bf15 mapper: convert to C++ 2013-01-02 22:43:56 +01:00
Max Kellermann
43cbbe111b song_update: convert to C++ 2013-01-02 22:42:12 +01:00
Max Kellermann
9ceb8a717a sticker: convert to C++ 2013-01-02 22:25:17 +01:00
Max Kellermann
8331de424a PlaylistInfo: rename class, use std::string 2013-01-02 22:16:05 +01:00
Max Kellermann
98dbdf72b3 PlaylistVector: move struct playlist_metadata to PlaylistInfo.hxx 2013-01-02 22:01:04 +01:00
Max Kellermann
51a2d09eb7 db_lock: convert to C++ 2013-01-02 20:56:21 +01:00
Max Kellermann
22f0ef6d6b don't include stdbool.h in C++ sources
The "bool" type is built-in.
2013-01-02 20:56:04 +01:00
Max Kellermann
975deca85b {decoder,player}_thread: convert to C++ 2013-01-02 20:36:28 +01:00
Max Kellermann
3bbb502387 *_print: convert to C++ 2013-01-02 20:29:24 +01:00
Max Kellermann
0023dffd0b playlist_vector: convert to C++ 2013-01-02 20:25:20 +01:00
Max Kellermann
b715e522cf db_save, state_file: convert to C++ 2013-01-02 20:22:59 +01:00
Max Kellermann
4b0b8315a9 string_util: use const_cast in C++ mode 2013-01-02 20:22:59 +01:00
Max Kellermann
a654f146d1 update: convert to C++ 2013-01-02 19:22:15 +01:00
Max Kellermann
67b46a151d playlist_{any,song,queue}: convert to C++ 2013-01-02 19:19:58 +01:00
Max Kellermann
83c7e1e129 configure.ac: disable C++ RTTI
RTTI adds overhead to the binary, and we don't need that.
2013-01-02 19:19:58 +01:00
Max Kellermann
a6371e2e66 configure.ac: disable C++ exceptions
We don't use exceptions currently.  Since allowing exceptions means a
lot of overhead, this commit disables the feature.
2013-01-02 19:12:27 +01:00
Max Kellermann
7768baa4d1 configure.ac: hide internal symbols
Allows eliminating more dead code.  Adds two more C++ options that may
reduce the binary size.
2013-01-02 19:04:23 +01:00
John
a9a5907a0f mpd.service: depend on network.target
Since some configurations use the "bind_to_address" option in their
/etc/mpd.conf, the systemd service file must wait for the
network.target or else mpd will start before it and thus fail due to
no iface.
2012-11-21 17:26:23 +01:00
Jurgen Kramer
dc32d1f3f3 Add tag support for DSD (DSDIFF & DSF) decoders 2012-10-27 11:42:34 +02:00
Max Kellermann
cbdaa1369f Merge branch 'v0.17.x'
Conflicts:
	src/PlaylistSave.cxx
2012-10-05 17:12:44 +02:00
Max Kellermann
8fb20fcdf8 playlist_song: fix potential charset bug in apply_song_metadata()
The song's URI must be UTF-8, not filesystem character set.
2012-10-05 17:01:04 +02:00
Max Kellermann
72bf226608 playlist_save: use temp2 instead of temp
Fixes minor Windows compatibility problem.
2012-10-05 16:55:30 +02:00
Max Kellermann
d4b5699403 decoder/ffmpeg: support planar audio
Implements Mantis feature request 3582.
2012-10-05 16:40:25 +02:00
Max Kellermann
1dc27be015 decoder/ffmpeg: fix playback of planar PCM data
Interleaving was completely wrong.  This code was never used, so it
didn't have an effect.
2012-10-05 16:38:55 +02:00
Max Kellermann
230a3eb400 decoder/ffmpeg: move code to copy_interleave_frame2() 2012-10-05 16:37:07 +02:00
Max Kellermann
e39382dedd decoder/ffmpeg: ignore negative time stamps
Works around assertion failure in decoder_timestamp().
2012-10-05 16:37:07 +02:00
Max Kellermann
fd016f4507 decoder/ffmpeg: show unsupported sample format name
Use av_get_sample_fmt_string() to obtain a human-readable string.
2012-10-05 15:24:53 +02:00
Max Kellermann
9d728b365d decoder/ffmpeg: pass AVSampleFormat to ffmpeg_sample_format()
API simplification.
2012-10-05 15:14:57 +02:00
Max Kellermann
ddc0283339 decoder/ffmpeg: remove duplicate sample format error message 2012-10-05 14:52:30 +02:00
Max Kellermann
b8fdb452be decoder/flac: support FLAC files inside archives
Implement the "scan_stream" method that can read tags from any
input_stream object.  This requires a FLAC__IOCallbacks implementation
based on the input_stream API.
2012-10-04 10:37:09 +02:00
Max Kellermann
6b416ce6be decoder/flac: move flac_scan_file2() to main plugin file 2012-10-04 10:32:52 +02:00
Max Kellermann
ef0392e854 input/file: use errno_quark() 2012-10-04 10:32:04 +02:00
Max Kellermann
efbf184fe8 PlaylistFile, client_file, tag_id3: don't use g_file_error_quark()
g_file_error_quark() is meant to be used with the GFileError enum
which does not correspond with errno, but must be converted with
g_file_error_from_errno().

At the same time, this removes g_strerror() use for
g_file_error_quark().
2012-10-04 10:31:53 +02:00
Max Kellermann
dd577fb857 test/read_tags: wait until input_stream becomes ready
Improved support for scanning http:// resources.
2012-10-04 09:28:13 +02:00
Max Kellermann
ebd90dbb1a decoder/flac: move callbacks to class FLACInput 2012-10-02 19:59:49 +02:00
Max Kellermann
c9e700f079 decoder/flac: add ctor/dtor to struct flac_data 2012-10-02 19:47:31 +02:00
Max Kellermann
3c2d73d161 decoder/flac: add method FLACMetadataChain::Scan()
Merge common code.
2012-10-02 18:24:15 +02:00
Max Kellermann
343de8b8ab decoder/flac: don't use FLAC__Metadata_SimpleIterator
Use the new FLACMetadataIterator C++ class, which is more powerful.
2012-10-02 17:38:21 +02:00
Max Kellermann
c645b906f3 decoder/flac: add C++ libFLAC wrappers
Not using libFLAC++ because this library adds a lot of overhead due to
virtual method calls.  This new class library is zero-overhead.
2012-10-02 17:37:07 +02:00
Max Kellermann
9c1d1ef268 decoder/flac: eliminate the obsolete "track number" code
This has been deprecated by the "embcue" playlist plugin.
2012-10-02 17:36:54 +02:00
Max Kellermann
ade0483641 Merge branch 'v0.17.x' 2012-10-02 17:34:03 +02:00
Gregory Smith
03a401e477 OSX: Set mDataByteSize correctly on AudioBuffers during render. 2012-10-02 17:27:52 +02:00
Max Kellermann
9994521b8c test/dump_playlist: add missing newline to error message 2012-10-02 17:27:47 +02:00
Max Kellermann
e5fd1924db decoder/flac: remove unused function flac_tag_load() 2012-10-02 11:39:10 +02:00
Max Kellermann
cbdd042adc decoder/flac: use C++ compiler 2012-10-02 10:59:56 +02:00
Max Kellermann
a9419da09c Makefile.am: eliminate FLAC_COMMON 2012-10-02 10:58:53 +02:00
Max Kellermann
ccd7104cdc {decoder,encoder}/flac: drop support for libFLAC 1.1 2012-10-02 10:04:44 +02:00
Max Kellermann
1cf4b5ce47 encoder/opus: implement lookahead
The "opusinfo" program complained about preskip value that was too
small.  This commit uses OPUS_GET_LOOKAHEAD to obtain the number of
frames that shall be silence at the beginning.
2012-10-02 09:42:03 +02:00
Max Kellermann
1badb3b5d5 encoder/opus: initialize the "granulepos" packet attribute 2012-10-02 09:16:44 +02:00
Max Kellermann
038d216f18 encoder/{vorbis,opus}: merge code to new class OggStream 2012-10-02 09:06:03 +02:00
Max Kellermann
9e3f843291 encoder/vorbis: accept floating point input samples
Improves quality by not squeezing 32 bit samples down to 16 bit, and
then back to 32 bit floating point.  Reduces CPU usage by skipping a
conversion step.
2012-10-02 08:39:39 +02:00
Max Kellermann
e166ddf46f pcm_channels: support floating point samples 2012-10-02 08:39:12 +02:00
Max Kellermann
31e1be7570 encoder/opus: call ogg_stream_flush() only in the last iteration
If there are multiple pages, the last partial page must be flushed.
2012-10-02 08:13:48 +02:00
Max Kellermann
d793b7c03f encoder/opus: new encoder plugin for the Opus codec 2012-10-02 00:45:24 +02:00
Max Kellermann
9a715267ad output/shout: move code to my_shout_configure()
Eliminate the evil goto.
2012-10-02 00:39:21 +02:00
Max Kellermann
eafa432cc6 encoder/vorbis: use C++ compiler 2012-10-02 00:37:19 +02:00
Max Kellermann
d95e538020 Merge branch 'v0.17.x' 2012-10-02 00:36:05 +02:00
Max Kellermann
adbe8c409a output/{recorder,shout}: call encoder_read() in a loop
This is necessary for Ogg packets that span more than one page.
2012-10-02 00:26:40 +02:00
Max Kellermann
58e600f408 output/recorder: move code to _write_to_file() 2012-10-02 00:26:40 +02:00
Max Kellermann
d34e55c370 output/recorder: fix write() error check
We can only check for negative values if the variable is signed.
2012-10-02 00:20:42 +02:00
Max Kellermann
fbcbcdc001 output/recorder: make variables more local 2012-10-02 00:20:32 +02:00
Max Kellermann
4227a325a5 output/httpd: make variables more local 2012-10-02 00:20:13 +02:00
Max Kellermann
d115507502 encoder/vorbis: make variables more local 2012-10-02 00:20:01 +02:00
Max Kellermann
43d8252050 output/recorder, test/*: invoke encoder_read() after _open()
Make sure the file header gets written at the beginning, before
_write() gets called.
2012-10-02 00:18:18 +02:00
Max Kellermann
674b4ab647 output/shout: eliminate struct shout_buffer
Move the raw buffer to struct shout_data.
2012-10-02 00:18:04 +02:00
Max Kellermann
fe8fc1081a output/shout: remove shout_buffer.len
Make it a local variable instead.
2012-10-02 00:17:53 +02:00
Max Kellermann
c7748fedab output/shout: fix memory leak in error handler 2012-10-02 00:17:27 +02:00
Max Kellermann
c392efb481 output/shout: make variables more local 2012-10-02 00:17:17 +02:00
Max Kellermann
1ddd9dd52a test/run_encoder: fix encoder_open() call 2012-10-02 00:17:08 +02:00
Max Kellermann
aa171dcc18 configure.ac: fix AC_CONFIG_SRCDIR call
main.c has been renamed to Main.cxx.
2012-10-01 13:37:02 +02:00
Max Kellermann
b4d8cb7bc1 Merge tag 'release-0.17.2' 2012-10-01 11:06:54 +02:00
Avuton Olrich
f672e4016f Modify version string to post-release version 0.17.3~git 2012-09-30 03:27:38 -07:00
Avuton Olrich
76e3dec723 mpd version 0.17.2 2012-09-30 03:27:38 -07:00
Max Kellermann
d0c3fa0150 main: use C++ compiler 2012-09-28 00:40:00 +02:00
Max Kellermann
609f6ce66d PlaylistFile: use std::list instead of GPtrArray 2012-09-28 00:10:02 +02:00
Max Kellermann
7298b6c846 stored_playlist, playlist_save: use C++ compiler 2012-09-28 00:08:15 +02:00
Max Kellermann
acec9c4fd7 stored_playlist: make variables more local 2012-09-28 00:05:21 +02:00
Max Kellermann
9cdbde4f5e output: new option "tags" may be used to disable sending tags
Implements Mantis ticket 0003340.
2012-09-25 23:31:07 +02:00
Max Kellermann
f9147a0706 NEWS: mention the AdPlug decoder 2012-09-25 23:31:07 +02:00
Max Kellermann
33364edfb3 decoder/adplug: new decoder plugin 2012-09-25 22:03:44 +02:00
Simon Hosie
5e9ccdec63 decoder/vorbis: skip 16 bit quantisation, provide float samples
Internally the vorbis (non-Tremor) decoder is working in floating
point, and it's not really necessary to cut the output back to 16-bit
if the soundcard or OS supports higher resolution.

The decoder can be trivially modified to bypass its internal
quantisation and produce floating-point output, and a separate
quantisation can be used as appropriate to the platform.
2012-09-25 21:27:50 +02:00
Max Kellermann
071aca60be decoder/vorbis: rename local variables 2012-09-25 21:26:27 +02:00
Max Kellermann
133e4d5c51 decoder/vorbis: improved support for initial seek
Call decoder_get_command() before doing anything else.
2012-09-25 21:26:27 +02:00
Max Kellermann
fd56461d5f decoder/vorbis: make variables more local 2012-09-25 21:11:38 +02:00
Max Kellermann
d5f59f8c86 INSTALL: correct the libopus URL 2012-09-25 21:09:05 +02:00
Max Kellermann
a5d8b27671 command.h: move function prototypes to AllCommands.h 2012-09-25 12:20:36 +02:00
Max Kellermann
f3f25d5d40 command.h: remove obsolete command_success() prototype
This lives in protocol/result.h now.
2012-09-25 12:20:33 +02:00
Max Kellermann
f118812c34 playlist: include cleanup 2012-09-25 12:20:30 +02:00
Max Kellermann
98dbc95913 rename CommandError.h to CommandError.hxx 2012-09-25 12:20:15 +02:00
Max Kellermann
145c1d214c *Commands: remove extern"C" from C++ headers 2012-09-25 12:19:18 +02:00
Max Kellermann
b62a8e3e3e command: add COMMAND_RETURN_IDLE
Eliminate the hack in handle_idle().
2012-09-25 12:04:20 +02:00
Max Kellermann
e47240931a command: add documentation for "enum command_return" 2012-09-25 12:02:08 +02:00
Max Kellermann
a84874426d command: remove enum integer values
Just use the values assigned by the compiler.
2012-09-25 12:01:53 +02:00
Max Kellermann
f38dfd9231 command: rename to AllCommands.cxx 2012-09-25 11:56:37 +02:00
Max Kellermann
510c4a3ef1 command: move remaining handlers to OtherCommands.cxx 2012-09-25 11:44:49 +02:00
Max Kellermann
e7e52c24f5 gcc.h: require gcc 4.6
We use range-based for and nullptr, which was not implemented prior to
gcc 4.6.
2012-09-25 11:39:46 +02:00
Max Kellermann
e2a574e2a0 Merge branch 'v0.17.x'
Conflicts:
	src/locate.c
2012-09-25 11:39:01 +02:00
Max Kellermann
ba6ef53ef9 decoder_control: remove MixRamp debug messages
These are confusing, and since MixRamp development has ceased, not
useful to anybody.
2012-09-25 11:08:16 +02:00
Max Kellermann
c93a28c641 configure.ac: don't auto-detect the Vorbis encoder when Tremor is enabled
libvorbisidec and libvorbis export the same symbols, which is a
dangerous thing.  Since libvorbisenc depends on libvorbis, this can
get nasty, so let's disable the Vorbis encoder unless the user
explicitly wants it.
2012-09-25 10:41:39 +02:00
Max Kellermann
7088a679a2 decoder/wavpack: support all APEv2 tags
WavPack tags are always APEv2, by definition.  Reuse the tag_table
from tag_ape.c, instead of rolling our own.
2012-09-25 09:37:16 +02:00
Max Kellermann
04c02a1eb8 locate: cast enum tag_type to int before comparing with integer
Avoids clang pickiness.  This code is not correct, but we'll fix that
another day.
2012-09-22 09:48:27 +02:00
Max Kellermann
1536b5a9d6 src/decoder/opus: new decoder plugin for the Opus codec
Using libopus and libogg.
2012-09-05 23:01:17 +02:00
Max Kellermann
bab756a5d0 decoder/{flac,vorbis}: move tag table to XiphTags.c
Merge duplicate data.
2012-09-05 22:56:57 +02:00
Max Kellermann
8c763fe458 Makefile.am: rename HAVE_OGG_COMMON to HAVE_XIPH 2012-09-05 22:56:17 +02:00
Max Kellermann
886255e38a db/SimpleDatabasePlugin: fix memory leak in Visit()
When visiting a song, GetSong() was called, but this object was never
returned by calling ReturnSong().  This patch locks the database only
once in Visit() and passes the original song object to the visitor,
avoiding the copy.
2012-09-05 20:56:20 +02:00
Max Kellermann
0240e75426 db_lock: add C++ helper class ScopeDatabaseLock 2012-09-05 20:52:02 +02:00
Max Kellermann
7102ed8026 decoder/ogg_codec: return UNKNOWN on error 2012-09-04 13:46:12 +02:00
Max Kellermann
ebf481e1a1 decoder/ogg_common: rename to ogg_codec.c 2012-09-04 13:05:12 +02:00
Max Kellermann
5a52e91350 decoder/ogg_common: pass decoder to _type_detect()
Allow the function to be cancelled.
2012-09-04 12:49:02 +02:00
Max Kellermann
18e458154a decoder/ogg_common: apply coding style 2012-09-04 11:52:18 +02:00
Max Kellermann
015e1ab183 decoder/_ogg_common: rename to ogg_common.c 2012-09-04 11:28:36 +02:00
Max Kellermann
2a4c799471 Merge branch 'v0.17.x' 2012-09-04 11:28:13 +02:00
Max Kellermann
41487426f5 decoder/_ogg_common: fix buffer size check
Fixes potential access to uninitialised memory.
2012-09-04 11:22:15 +02:00
Max Kellermann
0d24250aa7 decoder/_ogg_common: simplify the large "if" expression 2012-09-04 11:22:05 +02:00
Wieland Hoffmann
2050e2f886 mpd.conf(5): Use the correct default value for max_playlist_length 2012-09-03 22:49:51 +02:00
Max Kellermann
013e8479af AudioCompress: abort on out-of-memory
This library crashes on out-of-memory (NULL pointer dereference).
There's not much useful MPD can do in such a situation, so let's
explicitly abort instead, just like GLib does.
2012-09-03 22:45:33 +02:00
Max Kellermann
27535a7f78 update_walk: fix unsafe readlink() usage 2012-09-03 22:41:04 +02:00
Max Kellermann
333d226ed0 SongFilter: convert to a C++ class 2012-08-29 20:19:02 +02:00
Max Kellermann
04a9dec952 playlist_print: rename to PlaylistPrint.cxx 2012-08-29 20:17:13 +02:00
Max Kellermann
6ee76b7154 DatabaseSelection: add method Match() 2012-08-29 20:03:37 +02:00
Max Kellermann
36b1c08ad7 locate: rename to SongFilter.cxx 2012-08-29 19:12:26 +02:00
Max Kellermann
7b35d5e9d4 queue_print: rename to QueuePrint.cxx 2012-08-29 19:07:30 +02:00
Max Kellermann
6d4ca071a5 dbUtils.h: eliminate this header 2012-08-29 18:55:49 +02:00
Max Kellermann
684a3d30a6 command: move code to *Commands.cxx 2012-08-29 17:42:06 +02:00
Max Kellermann
25740d27bf Stats: stats_print() returns void 2012-08-29 17:41:26 +02:00
Max Kellermann
fb0a52a34a decoder/mad, output_thread: add gcc_unlikely() 2012-08-29 17:41:22 +02:00
Max Kellermann
c852970cf6 Makefile.am: distribute DatabaseCommands.hxx 2012-08-29 17:41:22 +02:00
Max Kellermann
def21cc87e Merge branch 'v0.17.x'
Conflicts:
	src/queue_save.c
2012-08-25 10:28:33 +02:00
Max Kellermann
488c1eb87b test/test_queue_priority: fix SIGABRT 2012-08-25 10:24:34 +02:00
Max Kellermann
acaa725478 playlist/cue: map "PERFORMER" to "artist" or "album artist"
Implements Mantis ticket 0003549.
2012-08-25 09:56:14 +02:00
Max Kellermann
f351550534 player_thread: disable cross-fading in "single" mode
This commit reimplements the core of the "single" mode.  Instead of
doing the detection in the playlist code from the outside, it is moved
to the player thread, which gets a new option called "border_pause".
It will now pause playback exactly at the beginning of the new song,
making the feature more reliable.

Now that the player thread knows what will happen, it can suppress
cross-fading.

Fixes mantis tickets 0003055 and 0003166.
2012-08-25 09:38:41 +02:00
Max Kellermann
e8df7e8da5 Database*: fix nullptr dereference when no database is configured 2012-08-22 21:40:20 +02:00
Max Kellermann
af4252bc80 fd_util: make C++ safe 2012-08-22 15:51:56 +02:00
Max Kellermann
695ffedef9 Makefile.am: swap libdb_plugins.a and -lmpdclient order
With some linkers, it is important to specify the static library
first, and then libmpdclient.  Fixes linker failures.
2012-08-22 13:54:31 +02:00
Max Kellermann
66ecf39efe command: make "single" a bool 2012-08-21 19:38:08 +02:00
Max Kellermann
5ad21d7e98 queue_save: save song priorities 2012-08-21 19:17:14 +02:00
Max Kellermann
1c3e03837c configure.ac: set VERSION_MINOR to 18
Updates the WIN32 version number for the upcoming 0.18 release.
2012-08-21 18:42:48 +02:00
Max Kellermann
7968fa3779 ProxyDatabase: implement GetSong() 2012-08-16 00:29:25 +02:00
Max Kellermann
31009bb1f6 ProxyDatabase: clear libmpdclient errors in CheckError()
Auto-recover from soft errors.
2012-08-16 00:29:25 +02:00
Max Kellermann
3b8532f3fb DatabasePlugin: add method ReturnSong()
Allow the plugin to allocate the GetSong() return value.
2012-08-16 00:04:14 +02:00
Max Kellermann
f45616e5f6 Merge branch 'v0.17.x' 2012-08-16 00:04:03 +02:00
Max Kellermann
ef5125f8f4 playlist_print: fix memory leak 2012-08-16 00:01:01 +02:00
Max Kellermann
bf2e07074b playlist_song: pass const song to _check_load_song() 2012-08-16 00:00:50 +02:00
Max Kellermann
20695ef369 playlist_song: fix user-after-free bug 2012-08-16 00:00:21 +02:00
Max Kellermann
e391f4b17b ProxyDatabase: pass "detached" objects to visitors
Fixes wrong object URIs with duplicate base names.
2012-08-15 23:10:59 +02:00
Max Kellermann
2bd344549b queue: duplicate all song objects
Make sure the queue "owns" all song objects, so nobody else can free
them.
2012-08-15 23:10:00 +02:00
Max Kellermann
e96779de48 player_control: duplicate the song object
Make sure the player "owns" the next_song object, so nobody else can
free it.
2012-08-15 23:09:22 +02:00
Max Kellermann
eb54337c40 decoder_control: duplicate the song object
Make sure the decoder "owns" the song object, so nobody else can free
it.
2012-08-15 23:08:39 +02:00
Max Kellermann
916a020173 Song: add function song_dup_detached()
Initial support for "detached" songs that come from the database, but
are private copies.
2012-08-15 23:07:24 +02:00
Max Kellermann
c2e4fe983d Song: add function song_equals()
decoder_is_current_song() now recognizes different instances of the
same physical song.
2012-08-15 23:06:59 +02:00
Max Kellermann
81e898375b Song: move trivial inline functions up 2012-08-15 23:06:48 +02:00
Max Kellermann
3c0dea811d DatabasePlugin: add method GetStats()
Optimize the ProxyDatabase by invoking "stats" on the peer, instead of
visiting all songs.
2012-08-15 23:05:08 +02:00
Max Kellermann
a6ac0f8965 DatabasePlugin: add method VisitUniqueTags()
Optimize the ProxyDatabase by invoking "list" on the peer, instead of
visiting all songs.
2012-08-15 23:02:27 +02:00
Max Kellermann
4e1eb03287 ProxyDatabase: obey visitor return values 2012-08-15 23:02:00 +02:00
Max Kellermann
fcf0f8291d ProxyDatabasePlugin: add OO wrapper for mpd_entity
Let the C++ compiler take care for freeing the objects safely.
2012-08-15 23:01:08 +02:00
Max Kellermann
0ed71fa027 ProxyDatabasePlugin: move tag table to the global name space 2012-08-15 23:00:44 +02:00
Max Kellermann
affe21f7c1 db_visitor: delete obsolete header 2012-08-15 22:57:20 +02:00
Max Kellermann
9facf7897d DatabasePrint: remove bogus "nonnull" attributes 2012-08-15 22:56:24 +02:00
Max Kellermann
8422402c39 Merge branch 'v0.17.x'
Conflicts:
	src/player_thread.c
2012-08-15 22:56:11 +02:00
Max Kellermann
9374e0f445 player_thread: add local variable "start_ms"
Just in case "song" becomes invalid at some point.
2012-08-15 22:51:48 +02:00
Max Kellermann
19ed233118 playlist: fix unprotected player_control access 2012-08-15 22:47:08 +02:00
Max Kellermann
faa4fff4dd filter/volume: include cleanup 2012-08-15 22:45:03 +02:00
Max Kellermann
2276e7677b mapper: fix potential crash in file permission check 2012-08-15 22:44:13 +02:00
Max Kellermann
b5fde6dfa5 decoder_control: add function _is_current_song()
Replaces _current_song().
2012-08-15 17:58:15 +02:00
Max Kellermann
784d666a8e decoder_control: add assertion to dc_get_error() 2012-08-15 17:58:09 +02:00
Max Kellermann
c035910df9 decoder_thread: create GError for mapper failure
Fixes crash.
2012-08-15 17:57:55 +02:00
Max Kellermann
efccb6ac82 Merge branch 'v0.17.x' 2012-08-15 01:04:34 +02:00
Max Kellermann
93f9c2ab6b doc/user: add wildmidi documentation 2012-08-15 01:03:16 +02:00
Max Kellermann
4a993cd79e decoder/fluidsynth: add "sample_rate" setting 2012-08-15 00:57:32 +02:00
Max Kellermann
02325d2ede decoder/fluidsynth: add "soundfont" setting
Replaces the old global "soundfont" which never worked.
2012-08-15 00:51:45 +02:00
Max Kellermann
9c83464b95 configure.ac: auto-detect libfluidsynth
Now that the libfluidsynth API was sanitized, we can enable the plugin
automatically if libfluidsynth is installed.
2012-08-15 00:48:52 +02:00
Max Kellermann
b1bbd70f0f decoder/fluidsynth: stop playback at end of file
Use libfluidsynth's new function fluid_player_get_status().
2012-08-15 00:47:10 +02:00
Max Kellermann
c31d11bfe0 decoder/fluidsynth: don't duplicate path
The libfluidsynth now accepts const strings.
2012-08-15 00:39:22 +02:00
Max Kellermann
c8ec85d649 decoder/fluidsynth: check if file is really a MIDI
Use fluid_is_midifile() to verify the file format.
2012-08-15 00:36:04 +02:00
Max Kellermann
e291f3d257 decoder/fluidsynth: remove throttle (requires libfluidsynth 1.1)
The libfluidsynth API is now sane, and does not require real-time
decoding.
2012-08-15 00:29:38 +02:00
Max Kellermann
7d27d2ea5e Merge branch 'v0.17.x' 2012-08-14 23:58:54 +02:00
Max Kellermann
dc22846d58 log: store duplicated path string
Don't free the string right after calling log_init_file().  Add a new
function log_deinit() that frees the string on shutdown.

This fixes cycling the log file after SIGHUP (Mantis ticket 0003524).
2012-08-14 23:16:46 +02:00
Max Kellermann
c9aaabb5d4 output/jack: implement method delay()
Eliminate the g_usleep() call.
2012-08-14 22:47:25 +02:00
Max Kellermann
335d5d5d72 output/pulse: implement method delay()
Reduce command latency while paused.
2012-08-14 22:30:46 +02:00
Max Kellermann
51d793bec1 output/pulse: simplify _wait_stream()
One large loop and only one pa_stream_get_state() call.
2012-08-14 22:22:55 +02:00
Max Kellermann
249dcd967e output/httpd: move delay from _pause() to _delay() 2012-08-14 21:54:47 +02:00
Max Kellermann
302972e9fc output/httpd: fix throttling bug after resuming playback
Reset the timer when paused and no client is connected.

This fixes Mantis ticket 0003527.
2012-08-14 21:39:33 +02:00
Max Kellermann
31b380b266 output/httpd: move code to _has_clients() 2012-08-14 20:22:32 +02:00
Max Kellermann
a869dfea85 timer: use monotonic clock if available 2012-08-14 19:07:31 +02:00
Max Kellermann
12838c6294 input/ffmpeg: remove fallback AV_VERSION_INT definition
This is part of libavutil.
2012-08-14 19:07:27 +02:00
Wieland Hoffmann
49c7102547 mpd.conf(5): Document the existence of musicbrainz_ tags
Additionally, update mpdconf.example to refer to mpd.conf(5) for the
complete list of tags instead of trying to repeat it.
2012-08-14 09:43:18 +02:00
Max Kellermann
5cc3338267 Merge branch 'v0.17.x'
Conflicts:
	src/mapper.h
2012-08-14 02:39:03 +02:00
Max Kellermann
1ae8972859 mapper: fix non-UTF8 music directory name
Duplicate the music_dir variable: one encoded in UTF-8, and another
one using the configured filesystem character set.  This fixes an
ancient MPD bug.
2012-08-14 02:28:04 +02:00
Max Kellermann
adcd2c8eac playlist_song: use map_to_relative_path() 2012-08-14 02:25:19 +02:00
Max Kellermann
45ff355835 playlist_song: improve const-correctness 2012-08-14 02:24:16 +02:00
Max Kellermann
f8bf3afeae playlist_song: move code to playlist_check_load_song() 2012-08-14 02:17:25 +02:00
Max Kellermann
f703da1516 valgrind.suppressions: suppressions for GStaticMutex and more 2012-08-14 01:58:17 +02:00
Max Kellermann
a582deee2c input_stream, main: remove obsolete GLib version checks
MPD requires GLib 2.16.
2012-08-14 01:57:53 +02:00
Max Kellermann
3047bdf653 Merge branch 'v0.17.x'
Conflicts:
	NEWS
	configure.ac
	src/client_file.h
2012-08-13 07:59:19 +02:00
Anton Khirnov
12be9e818f client_file: remove pure attribute from client_allow_file().
That function is not pure, it writes to error.

When marked as pure, the compiler is allowed to assume it does not do
anything to error, so it can remain NULL, which would result in an
invalid read in print_error().
2012-08-13 07:55:40 +02:00
Max Kellermann
a0478f98af Directory: move code to directory_allocate() 2012-08-09 21:04:07 +02:00
Max Kellermann
5e2c62db2f valgrind.suppressions: suppressions for GStaticMutex and more 2012-08-09 20:59:48 +02:00
Max Kellermann
d488d796f4 player_control: add GError attribute
Rewrite of the pc_get_error_message() function, now using a GError
object instead of the complicated "errored_song" attribute.
2012-08-08 22:54:49 +02:00
Max Kellermann
f794b1e1aa output_all: add basic GError support 2012-08-08 22:48:59 +02:00
Max Kellermann
8c425c758c decoder_control: add GError attribute 2012-08-08 22:38:16 +02:00
Max Kellermann
0b9e912297 player_control: rename attribute "error" to "error_type" 2012-08-08 22:29:09 +02:00
Max Kellermann
d35d2b269f player_control: rename player_error enum values 2012-08-08 22:28:59 +02:00
Max Kellermann
fa84ed412d player_control: remove unused enum player_error values 2012-08-08 22:28:49 +02:00
Max Kellermann
16951099d1 player_control: inline trivial functions 2012-08-08 22:27:00 +02:00
Max Kellermann
050ba302cb song: use C++ compiler 2012-08-08 21:08:37 +02:00
Max Kellermann
c1f90a99f4 tag_pool: use GStaticMutex
Eliminates explicit global initialisation.
2012-08-08 21:01:25 +02:00
Max Kellermann
510097cc37 song: include cleanup 2012-08-08 20:14:24 +02:00
Max Kellermann
6a83721c55 directory: use gcc.h macros, not GLib 2012-08-08 20:07:47 +02:00
Max Kellermann
ca9795c30a conf: add a "database" block
The new block overrides the "db_file" setting, and allows configuring
any database plugin.
2012-08-08 09:28:13 +02:00
Max Kellermann
dc2fa246a9 DatabaseGlue: look up the database plugin
No more hard-coded "simple" plugin.
2012-08-08 09:28:13 +02:00
Max Kellermann
b46bb611b3 DatabaseGlue: pass block to db_init()
Let the caller take care for legacy conversion.
2012-08-08 09:28:13 +02:00
Max Kellermann
aa55d759f5 DatabaseGlue: add function db_is_simple()
Preparing for non-"simple" database plugins.
2012-08-08 09:28:13 +02:00
Max Kellermann
2043579f71 main: don't call db_init() without database
Useless call.
2012-08-08 09:28:13 +02:00
Max Kellermann
346e31efa0 ProxyDatabasePlugin: obey the "recursive" flag 2012-08-08 09:28:13 +02:00
Max Kellermann
b504d63117 ProxyDatabasePlugin: use an artificial "root" directory
Fixes assertion failures in the Directory library.
2012-08-08 09:27:42 +02:00
Max Kellermann
b4b1728b6f DatabasePrint: don't print Last-Modified if unknown 2012-08-08 09:27:42 +02:00
Max Kellermann
21792386d8 time_print: new library, function time_print()
Implements error checking for the gmtime_r() call, which was missing
in two code locations.
2012-08-08 09:27:12 +02:00
Max Kellermann
63a2ac21e1 ProxyDatabasePlugin: new database plugin using libmpdclient
Implementation incomplete, but sort-of-works.  DumpDatabase works, but
MPD is still hard-coded on the "simple" plugin.
2012-08-08 01:20:45 +02:00
Max Kellermann
c42b206292 DatabaseCommands: allow empty criteria for "list"
Fixes regression.
2012-08-08 01:16:47 +02:00
Max Kellermann
733d6a6b16 DatabaseSelection: add "match" attribute
Let the database plugin do the match.
2012-08-08 00:55:02 +02:00
Max Kellermann
8d2725234e DatabaseCommands: merge duplicate search/find code 2012-08-08 00:49:07 +02:00
Max Kellermann
0823711106 locate: add a per-item "fold_case" flag
Merge locate_song_search() and locate_song_match().
2012-08-08 00:47:45 +02:00
Max Kellermann
860e9eb8c9 locate: make "tag" unsigned 2012-08-08 00:45:46 +02:00
Max Kellermann
3d2092ee23 locate: make the structs opaque 2012-08-07 23:52:11 +02:00
Max Kellermann
8855efebc0 locate: don't allow empty list 2012-08-07 23:45:00 +02:00
Max Kellermann
7725577a53 locate: pass unsigned integer to _parse() 2012-08-07 23:44:43 +02:00
Max Kellermann
668e3f664f locate: add "pure" attributes 2012-08-07 23:43:36 +02:00
Max Kellermann
9e51733c71 DatabaseCommands: remove stray locate_item_list_parse() call 2012-08-07 23:41:35 +02:00
Max Kellermann
6b39a5621d locate: add "casefold" flag to parser
Fold the case during construction, without having to create another
copy.
2012-08-07 23:27:23 +02:00
Max Kellermann
0d46e11826 locate: remove unused function locate_item_free() 2012-08-07 23:27:08 +02:00
Max Kellermann
ff58207034 db_selection: rename to DatabaseSelection 2012-08-07 23:12:26 +02:00
Max Kellermann
b3d76b7e5c db_print.h: rename to DatabasePrint.hxx 2012-08-07 23:10:34 +02:00
Max Kellermann
4d6c816abb dbUtils.h: move to DatabaseQueue.hxx, DatabasePlaylist.hxx 2012-08-07 22:57:18 +02:00
Max Kellermann
f35ceaee0a command: move code to DatabaseCommands.cxx
Prepare to use the DatabasePlugin C++ API directly.
2012-08-07 22:36:18 +02:00
Max Kellermann
a64a2a65a9 command: move print_error() to CommandError.cxx
Prepare for splitting command.c.
2012-08-07 22:26:14 +02:00
Max Kellermann
1a75abffa5 Database{Plugin,Visitor}: pass references 2012-08-07 21:32:08 +02:00
Max Kellermann
c6a0f5d3f9 test/DumpDatabase: new debug program 2012-08-07 20:21:10 +02:00
Max Kellermann
bb75e3ea55 DatabaseRegistry: list of plugins 2012-08-07 20:07:17 +02:00
Max Kellermann
814eebf976 configure.ac: copy missing file m4/ax_check_link_flag.m4
Needed by ax_append_link_flags.m4.
2012-08-03 14:40:04 +02:00
Max Kellermann
e08d4f28aa Makefile.am: add libdb_plugins.a 2012-08-02 19:25:18 +02:00
Max Kellermann
6f3c65dc64 DatabaseGlue: remove db_walk(), db_visit()
Unused.
2012-08-02 19:15:01 +02:00
Max Kellermann
0a3ada4fea stats: convert to C++ 2012-08-02 19:14:53 +02:00
Max Kellermann
8bdf7917c4 db_print: convert to C++ 2012-08-02 19:14:40 +02:00
Max Kellermann
67d16a086e dbUtils: split to Database{Queue,Playlist}.cxx 2012-08-02 19:14:09 +02:00
Max Kellermann
b8018f12ba DatabaseGlue: add function GetDatabase()
Allow using the object outside of DatabaseGlue.cxx.
2012-08-02 19:13:58 +02:00
Max Kellermann
607780b7f9 DatabasePlugin: add simpler Visit() wrapepr 2012-08-02 19:12:42 +02:00
Max Kellermann
af1c497759 DatabasePlugin: make Visit() const 2012-08-02 19:12:27 +02:00
Max Kellermann
8e331cfc65 gcc.h: re-add gcc_const and gcc_pure
Remove GLib dependency from some headers.
2012-08-02 19:12:18 +02:00
Max Kellermann
edf811fa02 DatabaseVisitor, ...: use GError forward declaration 2012-08-02 19:12:06 +02:00
Max Kellermann
b25b7693ba configure.ac: enable --gc-sections
Produce a smaller binary by removing all unused functions.
2012-08-02 19:09:29 +02:00
Max Kellermann
9dc9459f3a db_plugin: convert to C++ 2012-08-01 09:59:12 +02:00
Max Kellermann
37b92967c5 gcc.h: require g++ 4.5 or newer
Soon we'll use C++11 lambdas which were implemented in gcc 4.5.
2012-08-01 09:59:12 +02:00
Max Kellermann
768504e956 configure.ac: enable C++ warnings 2012-08-01 09:59:12 +02:00
Max Kellermann
2571accfc3 configure.ac: require C++11 compiler
We'll add some C++11 code soon.
2012-08-01 09:59:12 +02:00
Max Kellermann
0d2abdb5d9 gcc.h: add fallback for C++11 "override" 2012-08-01 09:59:12 +02:00
Max Kellermann
79200a8611 decoder/sidplay: fix C++ compiler warnings 2012-08-01 09:59:12 +02:00
Max Kellermann
123ae985d5 util/list: make safe for C++ 2012-08-01 09:59:12 +02:00
Max Kellermann
659d1c7cf7 Modify version string to post-release version 0.18~git 2012-08-01 09:58:42 +02:00
Avuton Olrich
281cd7c057 Modify version string to post-release version 0.17.2~git 2012-07-31 19:05:52 -07:00
Avuton Olrich
63e8766091 mpd version 0.17.1 2012-07-31 19:05:52 -07:00
Max Kellermann
18da582c87 configure.ac: replace MPD_CHECK_FLAG with autoconf-archive scripts
Use standard scripts instead of MPD's custom implementation.
2012-07-30 11:10:04 +02:00
Max Kellermann
0562cf99ba configure.ac: add -I to CPPFLAGS, not CFLAGS 2012-07-30 11:05:12 +02:00
Max Kellermann
60ac702038 tcp_socket, ...: remove obsolet RAOP sources 2012-07-30 06:57:49 +02:00
Max Kellermann
1dedb96478 tag_ape: return false if no usable tag was found
Ignore APE tags that have no usable tags, and use the ID3 tag instead.
This is useful when the APE tag only contains replay gain, and the
real tags are stored as ID3.  This implements feature request Mantis
#0003521.
2012-07-29 18:44:03 +02:00
Max Kellermann
7537722a44 cue_parser: support file types "MP3", "AIFF"
These two strings are common "FILE" types.
2012-07-26 23:01:40 +02:00
Max Kellermann
4ebd69193e Makefile.am: updated web server for "upload" target 2012-07-13 10:19:38 +02:00
Jurgen Kramer
d4d92ac1a7 Add song duration to DSF and DSDIFF DSD decoders. 2012-07-13 10:14:17 +02:00
Max Kellermann
5385d1fa80 aiff: support the AIFC format 2012-07-10 01:53:46 +02:00
Max Kellermann
dbee2f1996 output_init: put the "convert" filter at the end of the list
No, really!  This fixes a regression of commit 74617389, which
changed the order of filter plugins.
2012-07-10 01:30:22 +02:00
Max Kellermann
6dd70926fa test/test_pcm: add pcm_volume tests 2012-07-10 01:30:02 +02:00
Max Kellermann
5dfc0918c3 require GLib 2.16
GLib 2.16 was released more than 4 years ago.  Let's remove some cruft
from the glib_compat.h header, and avoid new cruft to it.
2012-07-10 01:28:52 +02:00
Max Kellermann
2eb14658d3 Merge branch 'fix-typo' of https://github.com/sol/mpd 2012-07-10 00:32:09 +02:00
Jonathan Neuschäfer
c1f196dbec command: require appropriate permissions for searchadd{,pl} 2012-07-10 00:23:19 +02:00
Max Kellermann
ce108acebb configure.ac: increment version number to 0.17.1 2012-07-09 22:50:32 +02:00
Simon Hengel
0555e2c781 Fix typo 2012-07-08 09:19:12 +02:00
Max Kellermann
6bfd1f1727 mpd version 0.17 2012-06-27 11:38:13 +02:00
Max Kellermann
baa77c8ae3 Makefile.am: distribute src/output/*.h 2012-06-27 10:11:21 +02:00
Jurgen Kramer
7235dbadfd patch to split DSD decoder into separate decoders for DSF en DFF. Move common
functions to new dsdlib. Update user doc.
2012-06-27 09:54:24 +02:00
geneticdrift
ecec41025f Documentation for commands searchadd, searchaddpl, and for tcp keepalive config options 2012-06-27 09:50:35 +02:00
geneticdrift
799843cc97 New command searchaddpl
Search and add search result to a stored playlist.
2012-06-27 09:49:17 +02:00
geneticdrift
16e91baa79 New command searchadd similar to command findadd. 2012-06-27 09:41:15 +02:00
Max Kellermann
f2536445f7 locate: make variables more local 2012-06-27 09:36:02 +02:00
Max Kellermann
ede70ee3a4 update_walk: move code to update_song.c 2012-06-13 22:14:16 +02:00
Max Kellermann
66ed427a57 update_walk: move code to update_container.c 2012-06-13 22:11:43 +02:00
Max Kellermann
c9e63e9fdb update_walk: move code to update_archive.c 2012-06-13 21:52:46 +02:00
Max Kellermann
ddf7f5c131 update_internal.h: split header 2012-06-13 21:38:28 +02:00
Max Kellermann
660e40d07e update_walk: split update_regular_file() 2012-06-13 21:33:23 +02:00
Max Kellermann
9f3db5a70b directory: require db lock for _{add,remove}_song() 2012-06-13 21:26:32 +02:00
Max Kellermann
1a59730782 update_walk: add "pure" attributes 2012-06-13 21:22:41 +02:00
Max Kellermann
20029e7ce8 update_walk: move code to make_directory_if_modified() 2012-06-13 21:22:00 +02:00
Max Kellermann
fcb7950811 update_walk: fix coding style 2012-06-13 20:48:30 +02:00
Max Kellermann
4eb57e1e9a Merge branch 'v0.16.x'
Conflicts:
	src/cmdline.c
	src/decoder/wildmidi_decoder_plugin.c
	src/gcc.h
	src/glib_compat.h
	src/input_stream.c
	src/output_list.c
	src/output_thread.c
	valgrind.suppressions
2012-06-12 23:22:03 +02:00
Max Kellermann
1d52e2cc77 valgrind.suppressions: GLib 2.32 updates 2012-06-12 22:54:58 +02:00
Max Kellermann
209aceeb14 valgrind.suppressions: merge changes from master 2012-06-12 22:39:54 +02:00
Max Kellermann
ae70875f45 cmdline: consistent plugin listings 2012-06-12 22:29:04 +02:00
Max Kellermann
eda7410f4c cmdline: dump list of input plugins 2012-06-12 22:24:42 +02:00
Max Kellermann
e60141b4dd input_registry: add _for_each() macros 2012-06-12 22:21:48 +02:00
Max Kellermann
5b21742095 cmdline: dump list of playlist plugins 2012-06-12 22:16:13 +02:00
Max Kellermann
5665de5ee7 playlist_list: add _for_each() macros 2012-06-12 22:12:06 +02:00
Max Kellermann
d5b9be0393 cmdline: change --version formatting 2012-06-12 21:15:46 +02:00
Max Kellermann
d2d9b45a81 decoder_list: add _for_each() macros 2012-06-12 21:15:46 +02:00
Max Kellermann
9ebbdb9b0b archive_list: add _for_each() macros 2012-06-12 20:58:43 +02:00
Max Kellermann
48da345e79 cmdline: don't initalise archive plugins for --version
Dump all archive plugins, even those that fail to initialise.
2012-06-12 20:52:04 +02:00
Max Kellermann
edbfa46cbc encoder_list: add macro _for_each() 2012-06-12 20:39:53 +02:00
Max Kellermann
90709a6de4 encoder_list: make the list truly "const" 2012-06-12 20:36:53 +02:00
Max Kellermann
992c2fa2d4 output_list: declare variables inside _plugins_for_each()
Don't require the caller to provide them.
2012-06-12 20:31:32 +02:00
Max Kellermann
ed915fed92 output_list: make the list truly "const" 2012-06-12 20:30:55 +02:00
Max Kellermann
8aa29d5a66 output_list: simplify audio_output_plugins_for_each() call 2012-06-12 20:22:40 +02:00
Max Kellermann
9604e0aad2 cmdline: update copyright year 2012-06-12 19:55:30 +02:00
Denis Krjuchkov
25d053cbf2 Work around incorrect g_file_test() behavior on Win32
g_file_test is redefined to be g_file_test_utf8 and thus can't handle
non-ASCII characters. This fix adds simple wrapper (taken from glib)
that fixes encoding and calls g_file_test_utf8. All required inclusions
of glib_compat.h are added as well.
2012-06-12 19:31:19 +02:00
Max Kellermann
055257a210 audio-parser, output_thread: work around -Wmaybe-uninitialized
False positives in gcc 4.7.
2012-06-12 19:31:19 +02:00
Max Kellermann
50cfb997cc gcc.h: backport GCC_CHECK_VERSION() from v0.17.x 2012-06-12 19:22:20 +02:00
Max Kellermann
d662c4c0cc Merge branch 'v0.16.x'
Conflicts:
	NEWS
2012-05-29 23:46:10 +02:00
Max Kellermann
457d98c860 output/raop: delete the RAOP plugin
This plugin is horrible code, I mean it.  Last year, I tried hard to
fix it, but I figured would take less time to do a full rewrite.
Given that I don't even have any device that supports RAOP, I can't do
that properly.  After 16 months, nobody volunteered for fixing it.
Hereby, I delete it, because having no RAOP plugin is better than
having this mess.  Sorry.
2012-05-29 23:15:41 +02:00
Max Kellermann
6bb166aaaa decoder_api: log the decoder plugin name 2012-05-29 22:52:50 +02:00
Jonathan Neuschäfer
cca9bc5176 decoder/ffmpeg: improve "decoding failed" message
"Frame skipped" might cause the impression that the decoding of a whole
song failed.
2012-05-29 22:46:27 +02:00
Jonathan Neuschäfer
8b6b25220d decoder/ffmpeg: add webm as a supported format 2012-05-29 22:38:40 +02:00
Jurgen Kramer
3c3f1b7ff2 Add support for DSF files to DSDIFF decoder - v4
Version 4 of my patch to add DSF support to the DSDIFF
decoder plugin.

This time I have taken a different approach and created a new
read_metadata function specific for reading DSF files. This saves an
indent (and for me a lot of indent nightmares) and also useful for
splitting the DSF and DFF decoders later on.

There are still a few lines which exceed the 80 character width limit by
a few chars. I was not able to stay within the limit and create (for me)
readable code.

Jurgen
2012-05-02 08:47:02 +02:00
Jonathan Dieter
57d89131e9 tag_rva2: parse multiple ID3 "RVA2" tags 2012-04-23 23:29:56 +02:00
Jonathan Dieter
7c6d1896a4 tag_rva2: support separate album/track replay gain 2012-04-23 23:29:53 +02:00
Max Kellermann
ad83c7f704 tag_rva2: move code to rva2_apply_frame() 2012-04-23 23:28:34 +02:00
Max Kellermann
6b52d040b1 test/read_rva2: new debug program for the RVA2 library 2012-04-23 23:00:41 +02:00
Max Kellermann
404fa89937 tag_id3: export tag_id3_load() 2012-04-23 22:51:45 +02:00
Max Kellermann
89377556cd output/alsa: multiply writei() result with out_frame_size
.. and not in_frame_size, because this relates to the frame size being
sent to ALSA.  pcm_export_source_size() will then turn it back into
the in_frame_size scale.
2012-04-23 21:54:09 +02:00
Max Kellermann
ec93114347 pcm_export: consider the pack24 flag in _source_size() 2012-04-23 21:54:09 +02:00
Max Kellermann
df1c5ce314 pcm_export: add _frame_size()
Move code from the ALSA output plugin.
2012-04-23 21:54:09 +02:00
Max Kellermann
a0e4b6e266 output/alsa: fix out_frame_size formula, multiply with channels
The hard-coded "3 bytes" was wrong because it ignored the number of
channels.
2012-04-23 21:54:08 +02:00
Max Kellermann
0de39b64cb configure.ac: work around syntax error
.. when HAVE_WINDOWS was not set.
2012-04-23 21:54:08 +02:00
Max Kellermann
36a7b4e275 Merge branch 'v0.16.x'
Conflicts:
	NEWS
	configure.ac
2012-04-06 15:42:41 +02:00
Avuton Olrich
d3cc8e0ac0 Modify version string to post-release version 0.16.9~git 2012-04-04 18:37:47 -07:00
Avuton Olrich
db1ce4eeeb mpd version 0.16.8 2012-04-04 18:37:47 -07:00
Max Kellermann
c22cbbf828 Merge branch 'v0.16.x'
Conflicts:
	src/output/osx_plugin.c
	src/text_input_stream.c
2012-04-05 00:45:39 +02:00
Max Kellermann
5acee73fc8 encoder/vorbis: generate end-of-stream packet when playback ends
Add the encoder_plugin method end().  This is important for the
recorder plugin.
2012-04-05 00:21:53 +02:00
Max Kellermann
466c337bcb encoder_plugin: add state assertions 2012-04-05 00:05:21 +02:00
Max Kellermann
98a468a101 encoder/vorbis: generate end-of-stream packet before tag
Don't reset the ogg_stream_state object, because this discards the
end-of-stream packet that was just added.
2012-04-04 23:59:06 +02:00
Max Kellermann
47c58c01d1 test/test_vorbis_encoder: program to debug the vorbis encoder 2012-04-04 23:58:00 +02:00
Max Kellermann
a9edf85a69 output/jack: check for connection failure before starting playback 2012-04-04 21:40:56 +02:00
Max Kellermann
e7a1862517 output/jack: workaround for libjack1 crash bug 2012-04-04 21:38:29 +02:00
Jurgen Kramer
f930f37d35 Add support for DSD-over-USB version 1.0, remove pre-v1 support 2012-04-04 20:13:15 +02:00
Max Kellermann
4feb57e895 db_lock, archive/bz2, ...: workaround for G_STATIC_MUTEX_INIT warning 2012-04-04 20:13:15 +02:00
Max Kellermann
712e3eb120 input/curl: use g_source_get_time()
g_source_get_current_time() is deprecated since GLib 2.28.  This patch
adds a compatibility wrapper for older GLib versions to glib_compat.h.
2012-04-04 20:05:48 +02:00
Max Kellermann
d8e423df1a directory: use strrchr() instead of g_basename()
g_basename() is deprecated in GLib 2.32.
2012-04-04 19:08:05 +02:00
Max Kellermann
09aa0dc676 uri: remove g_basename() call from uri_get_suffix()
g_basename() is deprecated in GLib 2.32.  Instead, verify that the
suffix does not have a backslash, to catch Windows path names.
2012-04-04 12:22:16 +02:00
Anton Khirnov
83174de420 update: properly skip symlinks in path that is to be updated. 2012-04-04 08:56:45 +02:00
Max Kellermann
8ff0197a43 output/osx: use the fifo_buffer library instead of rolling own
The existing buffer implementation has a major flaw: it is unable to
re-fill the buffer until it has been consumed completely, leading to
many occasions where the render callback needs to generate silence,
just because the play() implementation was unable to append more
data.  The fifo_buffer library handles that well.
2012-03-28 21:51:17 +02:00
Max Kellermann
a2b5db0003 audio_format: remove SAMPLE_FORMAT_DSD_OVER_USB
DSD-over-USB should not be a MPD core format, because it is not a
"natural" format; it is just a temnporary over-the-wire format.  This
format has been implemented in pcm_export, and does not need to be
supported by pcm_convert.
2012-03-27 01:22:50 +02:00
Max Kellermann
2803ec2e96 output/alsa: support 32 bit DSD-over-USB 2012-03-27 01:22:50 +02:00
Max Kellermann
ddd4f675a2 pcm_export: implement 24 to 32 bit conversion
For 32 bit DSD-over-USB support.
2012-03-27 01:22:50 +02:00
Max Kellermann
d271dd2cce output/alsa: use pcm_export for the DSD-over-USB conversion 2012-03-27 01:22:50 +02:00
Max Kellermann
ebfdd37451 pcm_export: support DSD to DSD-over-USB conversion
Prepare for removing SAMPLE_FORMAT_DSD_OVER_USB.
2012-03-27 01:17:11 +02:00
Max Kellermann
f6d6110aaa output/alsa: move pcm_export_open() to caller
Give the caller more control, prepare for DSD-over-USB improvements.
2012-03-27 01:17:11 +02:00
Max Kellermann
a0730cf264 pcm_export: support packing SAMPLE_FORMAT_DSD_OVER_USB
It's a padded 24 bit format.
2012-03-27 00:37:14 +02:00
Max Kellermann
ec61b3a5fc pcm_export: initialize the "pack" buffer 2012-03-27 00:14:37 +02:00
Max Kellermann
521f2294cb pcm_export: fix API documentation 2012-03-27 00:14:37 +02:00
Max Kellermann
2f0674807c output/alsa: more debug output 2012-03-27 00:14:37 +02:00
Dan McGee
de0f46b947 Use g_message and not g_debug when removing song
When adding or updating a song, we get a log message even if debug is not
enabled. It seems odd that removing a song shouldn't be done at the same log
level; otherwise looking at the log leads you to believe songs are never
removed from the library on update.

Signed-off-by: Dan McGee <dan@archlinux.org>
2012-03-26 17:32:18 +02:00
Dan McGee
1a57fa095f Fix processing of sticker database path
After a previous refactor, the current code fails on paths that need
expansion (e.g, '~/.mpd/sticker.db'), because we are not passing the correct
path to the sticker database code. Pass the expanded (and previously unused)
string instead of the original string.

Signed-off-by: Dan McGee <dan@archlinux.org>
2012-03-26 17:30:06 +02:00
Max Kellermann
167242fec0 output/alsa: add option to enable DSD over USB 2012-03-22 01:30:16 +01:00
Max Kellermann
81208d78ac pcm_dsd: implement DSD to 24 bit USB conversion
Implements the dCS suggested standard:

 http://www.dcsltd.co.uk/page/assets/DSDoverUSB.pdf
2012-03-22 01:14:51 +01:00
Max Kellermann
da8b01771f playlist/soundcloud: libyajl2 uses size_t for string lengths
Fixes build failure on 64 bit.
2012-03-22 01:07:49 +01:00
Max Kellermann
725fbe946b output/alsa: split the frame_size attribute
Make it in_frame_size and out_frame_size, to account for packing.
2012-03-22 01:01:11 +01:00
Max Kellermann
b99ecb4dc9 audio_format: remove the packed S24 format
For simplicity, the MPD core should not have to deal with packing.  It
is rarely used, and those plugins that need it should use the
pcm_export library instead.
2012-03-22 00:42:12 +01:00
Max Kellermann
208a96b211 output/alsa: use pcm_export to pack 24 bit samples 2012-03-22 00:33:59 +01:00
Max Kellermann
43774455cc output/oss: use pcm_export to pack 24 bit samples 2012-03-22 00:33:40 +01:00
Max Kellermann
5b61e077e0 pcm_export: add option "pack"
Converts padded 24 bit samples to packed 24 bit samples.  Will replace
the packed S24 sample format, which is not used internally.
2012-03-22 00:33:40 +01:00
Max Kellermann
921cc3e5db output/oss: remember the real OSS format
Improving oss_reopen() by using the very same value that was used
initially.
2012-03-22 00:33:40 +01:00
Max Kellermann
51dce3d161 output/alsa: simplify setup_format() 2012-03-22 00:29:56 +01:00
Max Kellermann
c10f013fc2 output/alsa: don't pass audio_format to _try_format()
Let the caller configure the audio_format object.
2012-03-22 00:24:56 +01:00
Max Kellermann
2874d68bdb output/alsa: simplify alsa_output_try_format_both()
Merge three functions into one and call get_bitformat() only once.
2012-03-22 00:23:07 +01:00
Max Kellermann
11e83eb7e7 output/oss: move code to oss_probe_sample_format() 2012-03-21 22:28:18 +01:00
Max Kellermann
9ec9a8705e pcm_export: use the byte_reverse library directly
Delete the now-unused pcm_byteswap library, and optimize the
pcm_export_state object.
2012-03-21 21:18:11 +01:00
Max Kellermann
170635e3a6 output/{alsa,oss}: move endian code to new library pcm_export 2012-03-21 21:16:50 +01:00
Max Kellermann
a5d1444ef4 pcm_pack: fix regression in unpack_sample()
Should have been "==", not "!=".
2012-03-21 21:16:46 +01:00
Max Kellermann
55708b39c3 audio_format: DSD_OVER_USB is padded to 32 bit
For simplicity, pad the dCS samples to 32 bit.  Packed 24 bit samples
are rarely used.  This patch does not include a real code change,
because there is no user of DSD_OVER_USB yet.
2012-03-21 19:41:41 +01:00
Max Kellermann
8c5ebdff36 audio_format: remove the reverse_endian attribute
Eliminate support for reverse endian samples from the MPD core.  This
moves a lot of complexity to the plugins that really need it (only
ALSA and CDIO currently).
2012-03-21 19:31:04 +01:00
Max Kellermann
1c84f324a1 output/oss: always receive host byte order samples
Don't use audio_format.reverse_endian.
2012-03-21 19:25:59 +01:00
Max Kellermann
3dba09f339 output/alsa: always receive host byte order samples
Don't use audio_format.reverse_endian.
2012-03-21 19:14:05 +01:00
Max Kellermann
7ebf8e66c9 decoder/pcm: always supply host byte order samples
Don't use audio_format.reverse_endian.
2012-03-21 19:10:57 +01:00
Max Kellermann
62218fe59d test: add unit test for util/byte_reverse.c 2012-03-21 19:08:32 +01:00
Max Kellermann
95d9bb6dfc pcm_byteswap: move code to libutil 2012-03-21 18:58:19 +01:00
Max Kellermann
33986075ef Makefile.am: link src/util/*.c into libutil.a 2012-03-21 18:58:19 +01:00
Max Kellermann
766905ba9f output/alsa: merge alsa_data_free() into destructor 2012-03-21 18:58:11 +01:00
Max Kellermann
a29c64b6c7 audio_format: hack for DSD to USB conversion
Halve the sample rate for *:dsdusb:*.
2012-03-21 10:33:43 +01:00
Max Kellermann
777e1cabc5 test/run_convert: allow the out format to be a mask 2012-03-21 10:33:43 +01:00
Rich Healey
396e97fc94 Fix the build on OSX 2012-03-21 10:32:54 +01:00
Max Kellermann
9c6a4505c8 audio_format: remove the format SAMPLE_FORMAT_DSD_LSBFIRST
This format is unused since the DSDIFF decoder plugin now reverses the
bit order.
2012-03-21 09:06:48 +01:00
Max Kellermann
238c3adad1 decoder/dsdiff: reverse bits to most significant bit first
Allow to remove this complexity from the MPD core.
2012-03-21 09:01:56 +01:00
Max Kellermann
c1d0a8b5ce dsd2pcm: move the bit reversing code to a generic library
Instead of doing run-time initialisation, use a constant lookup table.
2012-03-21 08:44:43 +01:00
Max Kellermann
08ce24ec3f audio_format: basic support for DSD-over-USB 2012-03-19 23:49:29 +01:00
Max Kellermann
79eb7623ef event_pipe, test: explicitly ignore write() return value
Some compilers are very picky, but we really aren't interested in the
return value.
2012-03-19 23:26:47 +01:00
Jonathan Neuschäfer
b9e64d0472 decoder/audiofile: fix compiler warnings with libaudiofile 0.3.3
This might break older versions, I didn't test.
2012-03-19 23:21:12 +01:00
Max Kellermann
4f500149af text_input_stream: detect end-of-file
Fixes endless loop when the last line of a text file was not
terminated (bug 3470).
2012-03-19 23:17:56 +01:00
Robert Vollmert
281b8714ef playlist/soundcloud: support libyajl2
[mk: backwars compatibility and autoconf check]
2012-03-19 21:16:48 +01:00
Max Kellermann
d5be3cce9c text_input_stream: detect end-of-file
Fixes endless loop when the last line of a text file was not
terminated (bug 3470).
2012-03-19 20:37:25 +01:00
Max Kellermann
8dcefaf2e3 test/dump_text_file: debug program for text_input_stream.c 2012-03-19 20:37:25 +01:00
Max Kellermann
48e3432a63 test/run_input: use input_stream_*lock() 2012-03-19 20:37:25 +01:00
Max Kellermann
69d3c611aa util/list: allow typeof() with clang 2012-03-19 20:37:25 +01:00
Max Kellermann
36827e1134 event_pipe, test: explicitly ignore write() return value
Some compilers are very picky, but we really aren't interested in the
return value.
2012-03-19 20:37:25 +01:00
Max Kellermann
351ac4a2c0 command: read arbitrary local files with "lsinfo"
Requires UNIX domain socket connection.
2012-03-06 22:23:10 +01:00
Max Kellermann
36fff59a38 client_file: always allow access if client uid equals mpd uid 2012-03-06 22:22:27 +01:00
Max Kellermann
1e60a4386a playlist_edit: move UID check to client_allow_file() 2012-03-06 22:10:54 +01:00
Max Kellermann
e9f1b53ae6 command, ack: add ack_quark()
To pass ack values around.
2012-03-06 22:08:54 +01:00
Max Kellermann
5016839b90 use g_strerror() instead of strerror()
Make sure we get a UTF-8 encoded string.
2012-03-06 22:06:08 +01:00
Max Kellermann
faf35e6082 command: fix the "DENIED" ACK code
Use ACK_ERROR_PERMISSION instead of ACK_ERROR_NO_EXIST.
2012-03-06 21:37:10 +01:00
Max Kellermann
d07a6edd2f configure.ac: detect libyajl for playlist/soundcloud 2012-03-01 20:18:16 +01:00
Max Kellermann
553d4e9283 playlist/soundcloud: use config_dup_block_string() 2012-03-01 20:11:09 +01:00
Robert Vollmert
7cef52478d A soundcloud playlist plugin.
Requires YAJL to build, and this doesn't include the necessary
automake changes. Can be built using
./configure CFLAGS="-I/usr/include/yajl" LIBS="-lyajl" --enable-soundcloud

Add the following to your config:

playlist_plugin {
        name "soundcloud"
        enabled "true"
        apikey "c4c979fd6f241b5b30431d722af212e8"
}

Then you can stream from soundcloud using calls like:

mpc load soundcloud://track/<track-id>
mpc load soundcloud://playlist/<playlist-id>
mpc load soundcloud://url/http://soundcloud.com/some/track/or/playlist

For the last case, you can leave off the http:// or
http://soundcloud.com/ .
2012-03-01 20:11:09 +01:00
Max Kellermann
e7ce362d22 song_update, udp_server: workarounds for gcc 4.1 warnings
Annoying false positives.
2012-03-01 20:11:09 +01:00
Kurt Van Dijck
c551c8b31b raop_output: fix raop_session inbalance
raop_session_free must be called from raop_output_finish,
not from raop_output_remove.
In raop_output_remove, do close the ntp_server & control port.

Signed-off-by: Kurt Van Dijck <kurt.van.dijck@skynet.be>
2012-03-01 09:51:37 +01:00
Max Kellermann
9c36e71081 decoder/dsdiff: don't convert to PCM
Move the responsibility for the conversion to the PCM library.  This
will allow passing the verbatim DSD samples to an output plugin.
2012-03-01 02:05:40 +01:00
Max Kellermann
c9c57af5f7 pcm_convert: support the DSD format 2012-03-01 02:00:12 +01:00
Max Kellermann
2516496993 audio_format: add DSD sample format
Basic support for Direct Stream Digital.  No conversion yet, and no
decoder/output plugin support.
2012-03-01 01:15:22 +01:00
Max Kellermann
3b565b5f97 pcm_convert: add method _reset()
Resets the libsamplerate state.  Not being used yet.
2012-03-01 00:59:53 +01:00
Avuton Olrich
0742976138 win32: Add a Windows OS resource file and icon 2012-02-23 06:32:30 -08:00
Max Kellermann
1a63663c85 Merge remote branches 'jn/ffmpeg' and 'jn/wsp' 2012-02-15 21:49:20 +01:00
Jonathan Neuschäfer
00a20fc8a5 decoder/ffmpeg: always use AV_VERSION_INT 2012-02-15 21:42:52 +01:00
Jonathan Neuschäfer
6ab4fb368c input/cdio_paranoia: whitespace-fix a comment 2012-02-15 21:22:49 +01:00
Jonathan Neuschäfer
fa39bb0a50 doc/protocol: fix some grammar
(Maybe it should be "A new message is indicated...", I don't know.)
(                                ^^                               )
2012-02-15 21:17:19 +01:00
Max Kellermann
645663cdfe Merge branch 'af' of git://git.musicpd.org/jn/mpd 2012-02-15 21:06:53 +01:00
Jonathan Neuschäfer
ee2bcbb41d decoder/audiofile: fix compiler warnings with libaudiofile 0.3.3
This might break older versions, I didn't test.
2012-02-15 20:52:48 +01:00
Jonathan Neuschäfer
12b4ebf8d4 use audio_output_plugins_for_each's plugin iterator 2012-02-15 20:37:29 +01:00
Jonathan Neuschäfer
8da4750ee2 rtsp_client: strncat -> g_strlcat
The main difference is that strncat takes the maximum number of
characters to copy as its third argument, while g_strlcat takes
the size of the buffer, which is how the code was using strncat.

Incomplete requests may still be constructed as a result of the
reqest buffer filling up.
2012-02-15 20:37:29 +01:00
Jonathan Neuschäfer
d22df2915c main: handle negative strtol return value
size_t is unsigned most of the time, so we can't really use it to
check for negative values. Also handle strtol overflow.
2012-02-15 20:35:06 +01:00
Jonathan Neuschäfer
e77d96cf89 decoder/sidplay: remove unused variable 'ret' 2012-02-15 20:35:05 +01:00
Max Kellermann
ae28ba84d2 command: move code to protocol/argparser.c 2012-02-14 19:13:04 +01:00
Max Kellermann
b3f3b01958 command: use standard error messages in check_int() 2012-02-14 19:02:11 +01:00
Max Kellermann
52e9cab1c1 command: check for empty string after strtol()
An empty string is obviously not a valid integer.
2012-02-14 18:59:41 +01:00
Max Kellermann
1baaaa40cc command: parse unsigned integers and booleans where applicable 2012-02-14 18:57:43 +01:00
Max Kellermann
b8ed420058 command: move functions to protocol/result.c 2012-02-14 18:57:29 +01:00
Max Kellermann
ed16ee3029 command: eliminate local buffer "unknown" 2012-02-14 18:57:12 +01:00
Max Kellermann
7338b16c18 listen: implement systemd socket activation 2012-02-13 21:32:42 +01:00
Max Kellermann
f529441400 server_socket: add method _add_fd() 2012-02-13 21:32:42 +01:00
Max Kellermann
03664d0426 server_socket: move code to set_fd() 2012-02-13 21:32:42 +01:00
Max Kellermann
652cfb7caf zeroconf: skip initialisation if there is no port 2012-02-13 21:05:05 +01:00
Max Kellermann
5540fbaec2 command: new command "config" 2012-02-13 20:30:27 +01:00
Max Kellermann
0a0b473765 mapper: add mapper_get_music_directory()
Shortcut for map_directory_fs(db_get_root()).
2012-02-13 20:10:19 +01:00
Max Kellermann
df2d041483 database: add "pure" attributes 2012-02-13 20:08:50 +01:00
Max Kellermann
ffc6e19548 database: remove obsolete prototype db_check() 2012-02-13 20:08:47 +01:00
Max Kellermann
d874d7661f mapper: add "pure" attributes 2012-02-13 20:06:23 +01:00
Max Kellermann
1d66e714e6 client: add function client_is_local() 2012-02-13 20:05:31 +01:00
Max Kellermann
d98a863b82 client: add "pure" attributes 2012-02-13 20:05:15 +01:00
Max Kellermann
3b6790c7dc command: never print "bad name" in response to "load"
Work around a confusing error message.
2012-02-13 19:51:27 +01:00
Max Kellermann
5ee3a9a9ca playlist_vector: require database lock for all functions 2012-02-13 19:26:04 +01:00
Max Kellermann
dd26fa67f2 playlist_vector: add new playlist to the end of the list
Avoid reversing the order after every update.
2012-02-13 19:26:03 +01:00
Max Kellermann
89f5e60422 directory.h: move DIRECTORY_DIR to directory_save.c 2012-02-13 19:24:17 +01:00
Max Kellermann
c616165f81 Merge branch 'v0.16.x'
Conflicts:
	NEWS
	configure.ac
	src/decoder/ffmpeg_decoder_plugin.c
	test/read_tags.c
2012-02-13 19:15:18 +01:00
Max Kellermann
103832742d decoder/ffmpeg: read the "year" tag
This was disabled when compiled with a new ffmpeg version.  Older
ffmpeg versions used it explicitly, while newer ones may pass it
through from the codec.
2012-02-13 19:05:39 +01:00
Max Kellermann
3e7e0bcb18 test/run_decoder: initialize GThread 2012-02-13 19:00:23 +01:00
Max Kellermann
7d3d8f20ab test/read_tags: call g_thread_init() 2012-02-13 18:37:09 +01:00
Max Kellermann
e1e3ce980a decoder_api: check state before emitting initial seek command
This fixes seeking in the vorbis decoder during MPD startup.
2012-02-13 18:27:43 +01:00
Max Kellermann
7855a32579 pcm_buffer: pcm_buffer_get() never returns NULL
This fixes a bug when libsamplerate returns an empty buffer for a very
small input buffer.  The caller thinks this is an error, bug there is
no GError object.
2012-02-13 18:17:05 +01:00
Max Kellermann
9c92afa5fe output/winmm: remove pointless NULL check
pcm_buffer_get() cannot ever return NULL.
2012-02-13 18:10:36 +01:00
treblid
edac498d03 directory: fix reverse order of child directories
Directories are loaded in reverse order when MPD starts. Only fixed
when doing a rescan.
2012-02-13 14:44:28 +01:00
Max Kellermann
d7d9dbd2c2 playlist/flac: delete this obsolete plugin
The FLAC playlist plugin has been superseded by the "embcue" playlist
plugin, which can read the embedded CUE sheets of all formats.
2012-02-12 19:57:27 +01:00
Max Kellermann
f8eece22c8 playlist/embcue: ignore "FILE", always point to container song file
An embedded CUE sheet must always point to the song file it is
contained in.
2012-02-12 19:48:02 +01:00
Max Kellermann
df563db294 song: add function song_replace_uri() 2012-02-12 19:48:02 +01:00
Max Kellermann
01b0d9eb97 db_print: print extra "playlist" object for embedded CUE sheets
This finally enables the new embedded CUE sheet code: when a song file
contains a playlist, it is printed in the "lsinfo" output, so clients
get to know about this.
2012-02-12 18:41:25 +01:00
Max Kellermann
a7f13d841f song_update: update the "has_playlist" flag 2012-02-12 18:40:55 +01:00
Max Kellermann
686d8bbe69 tag_handler: add new handler that updates has_playlist 2012-02-12 18:40:55 +01:00
Max Kellermann
4b36af4a34 tag: add attribute "has_playlist" 2012-02-12 18:29:05 +01:00
Max Kellermann
4a23a4bfee tag_{ape,id3}: remove the _load() functions
Use _scan() instead, to have more control.
2012-02-12 18:29:05 +01:00
Max Kellermann
ac3ad452c0 playlist_vector: use the list_head library 2012-02-12 17:50:30 +01:00
Max Kellermann
027c01511c update_remove: add header update_remove.h 2012-02-12 17:43:23 +01:00
Max Kellermann
4fdcc0496f update_walk: move code to update_db.c 2012-02-12 17:41:34 +01:00
Max Kellermann
0c4a2bea69 update_walk: move code to update_io.c 2012-02-12 17:00:00 +01:00
Max Kellermann
2ba3401238 update_walk: move code to update_song_file() 2012-02-12 16:50:24 +01:00
Max Kellermann
1735284a2a playlist/embcue: new plugin for reading embedded cue sheets
Parses CUE data from the "CUESHEET" tag.  Needs further integration in
the update thread.
2012-02-12 16:10:20 +01:00
Max Kellermann
8a3192ffc1 decoder/wavpack: bigger tag value buffer
Prepare for big CUESHEET tags.
2012-02-12 16:10:20 +01:00
Max Kellermann
ffea273a28 tag_handler: handle arbitrary name/value pairs
The new method pair() receives an arbitrary name/value pair.  Support
for this is being added to a few decoder plugins.
2012-02-12 13:41:48 +01:00
Max Kellermann
1783aac438 decoder/wavpack: move code to wavpack_scan_tag_item()
Remove clutter from wavpack_scan_file(), and use a (large) fixed
buffer for the tag item.
2012-02-11 19:36:59 +01:00
Max Kellermann
29bf3d2c04 decoder/wavpack: use the tag_table library 2012-02-11 19:34:10 +01:00
Max Kellermann
ee16fc958c decoder/{mikmod,fluidsynth,mp4ff}: adapt to tag_handler API
Fixes build regression.
2012-02-11 19:28:56 +01:00
Max Kellermann
5d73215a8d decoder_plugin: scan tags with callback table
Pass a callback table to scan_file() and scan_stream(), instead of
returning a tag object.
2012-02-11 17:04:29 +01:00
Max Kellermann
b7356bc526 decoder/gme: convert runtime check to assertion
When gme_track_info() returns with success, then the gme_info_t
pointer must be set.
2012-02-11 16:59:24 +01:00
Max Kellermann
8ec8282f38 decoder/ffmpeg: use the tag_table library 2012-02-11 16:39:03 +01:00
Max Kellermann
43b7b98949 decoder/ffmpeg: move code to ffmpeg_metadata.c 2012-02-11 16:37:29 +01:00
Max Kellermann
f791065a98 decoder/ffmpeg: remove AV_VERSION_INT definition
All supported ffmpeg/libav versions have this.
2012-02-11 16:37:25 +01:00
Max Kellermann
d95db28695 decoder/flac: check for errors only after _process_single()
The only other libFLAC call (seek) does not produce fatal errors.
2012-02-11 12:57:18 +01:00
Max Kellermann
851fb16e7c decoder/flac: symmetric FLAC__stream_decoder_finish() calls
Call it in the function that also invokved
FLAC__stream_decoder_init_*().
2012-02-11 12:56:52 +01:00
Max Kellermann
a4cbaafd10 decoder/flac: use error messages from libFLAC 2012-02-11 12:37:24 +01:00
Max Kellermann
c5f2cdb822 decoder/flac: eliminate the remaining "gotos"
https://www.xkcd.com/292/
2012-02-11 12:37:24 +01:00
Max Kellermann
1892d29be0 decoder/{vorbis,flac}: use the tag_table library 2012-02-11 12:37:24 +01:00
Max Kellermann
9e5a49b8cb tag_id3: use the tag_table library for TXXX 2012-02-11 12:37:24 +01:00
Max Kellermann
767ade02f4 tag_table: convert to a struct
The struct is smaller because it is sparse.  Its traversal is also
more efficient.
2012-02-11 12:37:24 +01:00
Max Kellermann
6e05071a47 decoder_api: correct decoder_seek_error() documentation 2012-02-11 12:37:23 +01:00
Max Kellermann
c8a990b9d3 decoder/vorbis: move code to vorbis_comment.c 2012-02-11 10:04:02 +01:00
Max Kellermann
6868ceae9b INSTALL: mention libav 2012-02-11 09:58:06 +01:00
Max Kellermann
cace646346 INSTALL: remove mention of libcue 2012-02-10 08:26:10 +01:00
Max Kellermann
abcc225763 cue_parser: new line based CUE sheet parser
To replace libcue, the unmaintained and crashy library.
2012-02-10 00:12:29 +01:00
Max Kellermann
b9673fc521 command: add optional range parameter to "load" 2012-02-09 23:55:34 +01:00
Max Kellermann
b0ea3f4261 playlist_save: add start/end_index parameters 2012-02-09 23:54:31 +01:00
Max Kellermann
0103219f00 playlist_queue: add start/end_index parameters 2012-02-09 23:44:33 +01:00
Max Kellermann
e15b4f40d6 Merge commit 'release-0.16.7'
Conflicts:
	NEWS
	configure.ac
2012-02-05 18:33:58 +01:00
Avuton Olrich
66235fddff Modify version string to post-release version 0.16.8~git 2012-02-04 14:41:59 -08:00
Avuton Olrich
f9c5d026f4 mpd version 0.16.7 2012-02-04 14:41:59 -08:00
Max Kellermann
c46239af22 Merge branch 'v0.16.x'
Conflicts:
	src/decoder/ffmpeg_decoder_plugin.c
	test/read_tags.c
	test/run_decoder.c
2012-02-04 17:23:53 +01:00
Max Kellermann
48eb3ff8d9 test/run_decoder: initialize the tag_pool library 2012-02-04 17:18:37 +01:00
Max Kellermann
5646dcc791 test/read_tags: initialize the tag_pool library 2012-02-04 14:32:17 +01:00
Max Kellermann
5d9876e338 decoder/ffmpeg: use AV_SAMPLE_FMT_* if available
Implements support for libavcodec 0.9, which removes the compatibility
macros SAMPLE_FMT_*
2012-02-03 09:55:25 +01:00
Max Kellermann
083340a937 decoder/ffmpeg: use sentinel for the ffmpeg_tag_maps table
Minor optimisation.
2012-02-03 09:18:05 +01:00
Max Kellermann
378fa5ee6a decoder/ffmpeg: support all MPD tags
Use the tag_item_names table to look up the names of all MPD tags, and
remove the duplicate entries from ffmpeg_tag_maps.
2012-02-03 09:10:48 +01:00
Max Kellermann
4764daf3c2 decoder/ffmpeg: pass tag_type and name to _copy_metadata()
Allow using this function without the ffmpeg_tag_map struct.
2012-02-03 09:09:18 +01:00
Max Kellermann
6357496d17 decoder/ffmpeg: merge code to _copy_dictionary()
Eliminate some duplicate code.
2012-02-03 09:09:18 +01:00
Max Kellermann
001e2a604b decoder/ffmpeg: add macros emulating AVDictionary
Move the #ifdefs out of _copy_metadata().
2012-02-03 09:02:14 +01:00
Max Kellermann
f370911c15 decoder/ffmpeg: _copy_metadata() returns void
No interest in this return value.
2012-02-03 08:59:26 +01:00
Max Kellermann
ef5cf40fa6 directory: require the caller to lock the db_mutex
Reduce the number of lock/unlock cycles, and make database handling
safer.
2012-02-02 18:06:33 +01:00
Max Kellermann
837bd79b20 db_lock: add assertions 2012-02-02 17:59:51 +01:00
Max Kellermann
3edd4a24af update_walk: use directory_make_child() 2012-02-02 17:59:51 +01:00
Max Kellermann
535a61b5a9 directory: add new objects to the end of the linked list
This was the cause of the reversed ordering when loading a database
file.
2012-02-02 09:59:38 +01:00
Max Kellermann
e87b7daab5 input/soup: use #pragma only with gcc 4.6+
It seems gcc 4.5 does not allow #pragma within function:

 src/input/soup_input_plugin.c:284:9: error: #pragma GCC diagnostic not allowed inside functions
2012-01-29 14:46:05 +01:00
Max Kellermann
f20689519d directory: fix deep path lookup
This commit fixes a major regression in directory_lookup_directory(),
which broke the deep lookup of directories.
2012-01-29 14:42:28 +01:00
Max Kellermann
ee9c460f74 directory: mark unused parameter 2012-01-24 22:27:42 +01:00
Max Kellermann
84ba14fa29 directory: replace songvec with doubly linked list 2012-01-24 22:26:43 +01:00
Max Kellermann
3c75963352 directory: add function directory_get_song(), ...
Wrap songvec_find() and other songvec methods.
2012-01-24 22:26:43 +01:00
Max Kellermann
5f9dd8287c valgrind.suppressions: misc updates 2012-01-24 22:26:43 +01:00
Max Kellermann
d99f074eb7 directory: replace dirvec with doubly linked list
Random access is not needed, and a linked list is easier to manage: we
don't need to (re-)allocate the pointer array.
2012-01-24 20:49:53 +01:00
Max Kellermann
a989140a07 util/list.h: import the Linux kernel's linked list library 2012-01-24 20:49:52 +01:00
Max Kellermann
420a4c163d directory: simplify constructors and clarify API documentation
Pass only the "name" to a directory, instead of the full (relative)
path.
2012-01-24 20:03:18 +01:00
Max Kellermann
1bab735580 dirvec: unlock mutex in dirvec_find() in all branches 2012-01-24 20:02:32 +01:00
Max Kellermann
a0fcd0cf22 dirvec: don't call g_path_get_basename() on parameter
This overhead is completely useless, because no caller expects this
behaviour.
2012-01-24 18:27:00 +01:00
Max Kellermann
5d5c753c74 songvec: move code to songvec_find_pointer() 2012-01-24 18:06:52 +01:00
Max Kellermann
7e7e3eb8d5 songvec: _delete() returns void
The given song must exist, or MPD will abort.  Calling it with an
unknown song is illegal.
2012-01-24 18:06:25 +01:00
Max Kellermann
2e5f8aeba1 refcount: add missing stdbool.h include 2012-01-24 17:16:42 +01:00
Max Kellermann
c2fe961db1 decoder/ffmpeg: remove debug code 2012-01-24 17:15:29 +01:00
Max Kellermann
2a6acc04a1 dirvec: remove unused functions _clear(), _for_each() 2012-01-21 11:32:06 +01:00
Max Kellermann
a467128093 db_lock: new unified lock for songvec and dirvec 2012-01-21 10:51:53 +01:00
Max Kellermann
abf41eb85c .gitignore: add new output files 2012-01-21 10:51:53 +01:00
Max Kellermann
d83dea4463 db/simple: pass the correct GError pointer 2012-01-12 18:59:26 +01:00
Max Kellermann
ec43721c3c Merge branch 'v0.16.x'
Conflicts:
	src/decoder/ffmpeg_decoder_plugin.c
2012-01-12 18:59:21 +01:00
Max Kellermann
39d52762d1 decoder/ffmpeg: check libavutil version for AVDictionaryEntry
Require libavutil 51.5.0.
2012-01-12 18:45:18 +01:00
Max Kellermann
8d45d0d104 decoder/ffmpeg: raise version dependency for avformat_find_stream_info()
This function was added when the libavformat version was 53.2.0, but
the actual release 53.2.0 did not have it.
2012-01-12 18:28:19 +01:00
Max Kellermann
26ec62714c mixer/alsa: listen for external volume changes
Use libasound's polling functions, implement a bridge to GSource /
GPollFD and send idle events to clients when an external program
changes the ALSA mixer volume.
2012-01-05 01:52:40 +01:00
Max Kellermann
7873b5e78b mixer/alsa: move code to alsa_mixer_setup()
Better error handling.
2012-01-05 01:52:05 +01:00
Max Kellermann
1b889c527f mixer/alsa: move code to alsa_mixer_lookup_elem() 2012-01-05 00:52:41 +01:00
Max Kellermann
9937ff8ac0 Merge branch 'v0.16.x'
Conflicts:
	src/decoder/ffmpeg_decoder_plugin.c
	src/input/ffmpeg_input_plugin.c
2012-01-05 00:33:23 +01:00
Max Kellermann
abd1949825 decoder/ffmpeg: support libavformat 0.8 2012-01-05 00:17:56 +01:00
Max Kellermann
4e6bc77a70 decoder/ffmpeg: use avcodec_decode_audio4(), support libavcodec 0.8 2012-01-04 22:10:38 +01:00
Max Kellermann
531948358b decoder/ffmpeg: include libavutil/mathematics.h
Needed for av_rescale_q() in ffmpeg 0.8.
2012-01-04 21:54:54 +01:00
Max Kellermann
0d3ec9c324 configure.ac: disable -Wno-deprecated-declarations 2012-01-04 21:48:30 +01:00
Max Kellermann
21caca4aea decoder/ffmpeg: use avcodec_open2() on newer ffmpeg versions
avcodec_open() has been deprecated.
2012-01-04 21:48:30 +01:00
Max Kellermann
fbf3edf07d decoder/ffpmeg: don't use av_metadata_conv() in ffmpeg 0.7
It's a no-op and deprecated.
2012-01-04 21:47:56 +01:00
Max Kellermann
76fcf25898 decoder/ffmpeg: use AVIOContext instead of ByteIOContext 2012-01-04 21:47:47 +01:00
Max Kellermann
56257f072b input/ffmpeg: use the new AVIOContext API
URLContext is deprecated.
2012-01-04 21:47:19 +01:00
Max Kellermann
44401158e8 input/ffmpeg: define AV_VERSION_INT if not present
Support ancient ffmpeg versions.
2012-01-04 21:47:01 +01:00
Max Kellermann
95b2df8261 output/osx: fix memory leak after AudioUnitSetProperty() failure 2012-01-04 20:47:41 +01:00
Max Kellermann
1ebadf8620 output/osx: implement 32 bit playback 2011-12-24 18:18:42 +01:00
Max Kellermann
9179d9592d output/osx: allocate the device in enable()
Keep the device open as long as the output is enabled, but initialize
it only when playback starts.
2011-12-24 18:15:24 +01:00
Max Kellermann
f208217412 test/run_output: enable and disable the output 2011-12-24 18:15:20 +01:00
Max Kellermann
43c5058682 Merge branch 'v0.16.x' 2011-12-24 18:15:17 +01:00
Max Kellermann
97b4a6b51f output/osx: clear render buffer when there's not enough data
When we don't have enough data, generate some silence, hoping the
input buffer will fill soon.  Reducing the render buffer size is not
legal.
2011-12-24 17:59:36 +01:00
Max Kellermann
f405d27c56 output/osx: remove sleep call from render callback
Blocking inside the render callback is forbidden, and this sleep call
didn't make any sense.
2011-12-24 17:56:10 +01:00
Max Kellermann
99949c8f6f command: new command "seekcur"
For simpler seeking within current song.
2011-12-24 11:20:02 +01:00
Maarten Sebregts
3a9697adf2 Playlist: fix bug in moving after current song
Moving songs using either 'move' or 'moveid' to position -1 (after the
current song) would fail for a song which is just before the current
song.
This patch corrects the check to see if the current song is in the range
to be moved. Since the range is from `start` up to `end` (exclusive) the
check was incorrect, but is now fixed.
2011-12-21 10:29:07 +01:00
Max Kellermann
78c4351e04 output/openal: improve synchronization
This plugin's use of the "Timer" library was wrong; it added the same
amount of virtual data in every iteration in _play(), but did not
actually play something.  This created an artificial, but useless,
delay.  This patch implements the method _cancel(), and implements
hard-coded sleep values.  This is only slightly better, but does not
attempt to look sane.
2011-12-13 22:02:05 +01:00
Max Kellermann
0a427890fe output/openal: move code to inline functions 2011-12-13 22:00:18 +01:00
Max Kellermann
e735abe334 output/openal: use alGetSourcei(AL_BUFFER) to force-unqueue buffers
The implementation of cancel() did not work well: you cannot use
alSourceUnqueueBuffers() to unqueue queued buffers, and our function
openal_unqueue_buffers() left the OpenAL library in a rather undefined
state; nothing was supposed to be queued, but the "filled" variable
was not reset.
2011-12-13 21:59:10 +01:00
Max Kellermann
c0070b2f13 output/openal: make attribute "filled" unsigned 2011-12-13 21:58:13 +01:00
Max Kellermann
cfedc6e9b4 output/openal: remove bogus format check from _open()
The expression "!format" does not make sense, and cannot occur.
2011-12-13 21:58:09 +01:00
Max Kellermann
b66d7f7e0b output/fifo: implement output_plugin method delay() 2011-12-13 21:58:07 +01:00
Max Kellermann
e01df06cd7 output/null: implement output_plugin method delay() 2011-12-13 21:58:02 +01:00
Max Kellermann
6584897b69 output/null: don't initialize the "timer" attribute in _init()
Unnecessary overhead.
2011-12-13 21:57:59 +01:00
Max Kellermann
aa4f45b9a5 Merge branch 'v0.16.x'
Conflicts:
	NEWS
	configure.ac
2011-12-13 21:57:44 +01:00
Max Kellermann
96ad5b8444 output/openal: force 16 bit playback, as 8 bit doesn't work
The OpenAL specification says that AL_FORMAT_MONO8 and
AL_FORMAT_STEREO8 expect unsigned 8 bit samples, but MPD uses unsigned
samples.
2011-12-13 21:32:19 +01:00
Max Kellermann
097e5dfbdc timer: fix time unit mixup in timer_delay()
The local variable was already divided by 1000, and the return value
was being divided by 1000 again - doh!  This caused delays in the
httpd output plugin that were too small by three orders of magnitude,
and the buffer was filled too quickly.
2011-12-13 21:02:48 +01:00
Max Kellermann
2ef7ee6ca7 update_walk: print debug message for song_file_load() 2011-12-13 20:26:24 +01:00
Max Kellermann
2685b53b30 configure.ac: suppress warnings in the GLib headers
Replace -I with -isystem in GLIB_CFLAGS.
2011-12-13 20:12:49 +01:00
Max Kellermann
533e4fcdad decoder/mp4ff: work around assertion failure in read() callback
This workaround leads to an infinite loop instead of an assertion
failure, but hey, now it's libmp4ff's fault.
2011-12-13 20:08:31 +01:00
Max Kellermann
006b8fa3f0 pcm_buffer: poison the old buffer before returning it
Make valgrind find more buffer misuses.  Buffer contents are not
persistent, they get invalidated by pcm_buffer_get(), because this
function may allocate a new buffer, but will not copy old data.
2011-12-13 19:55:41 +01:00
Max Kellermann
6a01153ce4 pcm_buffer, output_plugin, ...: include config.h 2011-12-13 19:48:37 +01:00
Max Kellermann
34aab116ae pcm_buffer: eliminate merge conflict fallout 2011-12-13 19:48:33 +01:00
Denis Krjuchkov
33232face9 winmm_output_plugin: fail if wrong device specified instead of using fallback.
Silently choosing default is misleading and can cause hours of investigation.
It's better to fail immediately telling user what is wrong with config.
2011-12-13 19:12:33 +01:00
Denis Krjuchkov
b88b2b3d79 output_init: initialize replay gain filters to NULL in ao_base_init()
If output plugin fails to init it will try to call ao_base_finish() immediately,
which segfaults because replay gain filters are not initialized yet and contain
garbage values.
2011-12-13 19:12:30 +01:00
Max Kellermann
744d729dab input/soup: disable -Wcast-qual to work around libsoup header problem 2011-12-12 10:15:04 +01:00
Avuton Olrich
71b5e43153 configure.ac: Refactor the musepack section
It appears the musepack section has not really been reviewed in some
time, many parts unfunctional, others, just unnecessary.
2011-12-12 10:02:27 +01:00
Avuton Olrich
8459f27312 configure.ac: AC_HAVE_LIBRARY has been depreciated, move to AC_CHECK_LIB 2011-12-12 10:02:15 +01:00
Avuton Olrich
7dfbdef505 configure.ac: Update to methods which autoconf is going to 2011-12-12 10:02:05 +01:00
Avuton Olrich
94386374ff configure.ac: Realphabetize and 80 column the pretty output 2011-12-12 10:02:02 +01:00
Avuton Olrich
f5d3859238 cmdline: Remove duplicate g_free()s 2011-12-12 09:20:00 +01:00
Avuton Olrich
ef39da5973 configure/utils: Add ipv6 support for mingw build 2011-12-12 09:19:34 +01:00
Avuton Olrich
81e8c4bbff gitignore: Add mpd.service 2011-12-12 09:16:51 +01:00
Avuton Olrich
8ca3642429 Modify version string to post-release version 0.16.7~git 2011-12-01 05:44:53 -08:00
Avuton Olrich
1dc000c06a mpd version 0.16.6 2011-12-01 05:44:53 -08:00
Max Kellermann
4f093d5b97 Merge branch 'v0.16.x'
Conflicts:
	Makefile.am
	NEWS
	configure.ac
	src/encoder/flac_encoder.c
	src/log.c
	src/pcm_buffer.c
2011-11-28 11:56:01 +01:00
Max Kellermann
e1b032cbad decoder/ffmpeg: work around bogus channel count
Initialize the audio_format before calling avcodec_open(), because
avcodec_open() will fill bogus values.
2011-11-28 11:39:21 +01:00
Max Kellermann
6f365c30eb mapper: check "r" permission on music directory
Yet another common support case.
2011-11-28 09:57:21 +01:00
Max Kellermann
718e180423 mapper: check "x" permission on music directory
This is a common support case, and hopefully, the new error message
will allow the user to understand the error without requiring support.
2011-11-28 09:51:21 +01:00
Max Kellermann
cead5e5bd7 mapper: fix the bogus "not a directory" error message
Use stat() instead of g_file_test() to detect other types of errors,
such as "permission denied".
2011-11-28 09:50:44 +01:00
Max Kellermann
cf15629aea mapper: move code to check_directory() 2011-11-28 09:35:50 +01:00
Max Kellermann
a727d0bb0b log: print reason for failure 2011-11-28 09:31:43 +01:00
Max Kellermann
0a218ee56a encoder/wave: support packed 24 bit samples
Convert to padded 24 bit samples, instead of falling back to 16 bit.
2011-11-28 09:25:42 +01:00
Max Kellermann
74beefcaf6 encoder/null: use fifo_buffer instead of pcm_buffer
This fixes a buffer corruption bug; pcm_buffer is not designed to be a
persistent buffers, and will discard anything between two consecutive
calls.
2011-11-28 09:23:36 +01:00
Max Kellermann
399a3abefc encoder/wave: use fifo_buffer instead of pcm_buffer
This fixes a buffer corruption bug; pcm_buffer is not designed to be a
persistent buffers, and will discard anything between two consecutive
calls.
2011-11-28 09:23:12 +01:00
Max Kellermann
cee5036aca encoder/flac: use fifo_buffer instead of pcm_buffer
This fixes a buffer corruption bug; pcm_buffer is not designed to be a
persistent buffers, and will discard anything between two consecutive
calls.
2011-11-28 09:21:32 +01:00
Max Kellermann
790823abb4 growing_fifo: new utility library for growing fifo_buffer 2011-11-28 09:11:11 +01:00
Max Kellermann
f546849352 fifo_buffer: add function fifo_buffer_realloc()
For growing FIFO buffers.
2011-11-28 07:45:15 +01:00
Max Kellermann
a85af593f1 fifo_buffer: add functions _capacity() and _available() 2011-11-27 21:11:47 +01:00
Max Kellermann
07067f8b95 pcm_buffer: add assertions 2011-11-27 20:17:52 +01:00
Max Kellermann
a1e824ada0 pcm_buffer: move formula to new function align_8k() 2011-11-27 20:17:14 +01:00
Max Kellermann
f5f1bfbef1 pcm_buffer: un-inline pcm_buffer_get()
This method is too complex for inlining.
2011-11-27 20:17:12 +01:00
Max Kellermann
cd108ba3aa directory: rename attribute "stat" to "have_stat"
"stat" is a macro on mingw32, which is a pretty stupid thing, and this
commit works around this build failure.
2011-11-27 20:15:25 +01:00
Max Kellermann
2bb5bfa74e directory: convert "stat" to a bool 2011-11-27 20:11:45 +01:00
Max Kellermann
624e7a447d stats: explicitly cast "time_t" to "long"
Fixes warning on mingw32.
2011-11-27 20:07:14 +01:00
Max Kellermann
37420c342b io_thread: fix race condition during startup
Ensure that the io.thread variable is set before entering the event
loop.
2011-11-27 19:28:26 +01:00
Max Kellermann
ef40e362c9 decoder_api: cancel initial seek when song is not seekable
Fixes assertion failure.
2011-11-27 19:19:43 +01:00
Avuton Olrich
ef369c2e2b Makefile.am: Add PULSE_LIBS for linking the mixer when compiling with pulse
Commit 3a3158 introduced a small bug where the pulseaudio mixer would not link
with the main binary in some situations.
2011-11-14 05:09:18 -08:00
Denis Krjuchkov
6452461c39 path: autodetect filesystem encoding on Win32
WinAPI explicitly declares filesystem encoding.
It can be determined by GetACP().
Use that instead of Glib routine that always "detects" UTF-8 on Win32,
which is incorrect for MPD case.
2011-10-23 16:29:58 +02:00
Max Kellermann
1e89ca0994 decoder/dsdiff: provide floating point samples
Eliminate the conversion to integer samples, the MPD core can do this
now.
2011-10-20 03:01:31 +02:00
Max Kellermann
92bb10eed8 decoder/wavpack: read float samples as-is, don't convert to integer
For MPD's new floating point support: when a decoded wavpack file
needs to be resampled, don't convert float to int and back to float.
2011-10-20 02:55:05 +02:00
Max Kellermann
8465c5fe0e pcm_format: implement conversion to float 2011-10-20 02:55:05 +02:00
Max Kellermann
42e248a8da pcm_convert: add function pcm_convert_channels()
For future internal use.
2011-10-20 02:55:05 +02:00
Max Kellermann
e71a652985 pcm_mix: implement float samples 2011-10-20 02:36:26 +02:00
Max Kellermann
bfef0fbff3 pcm_volume: implement float samples 2011-10-20 02:33:51 +02:00
Max Kellermann
545685bc32 audio_format: basic support for floating point samples
Support for conversion from float to 16, 24 and 32 bit integer
samples.
2011-10-20 02:32:39 +02:00
Max Kellermann
13ad2b4dc2 pcm_mix: return bool, make unimplemented format non-fatal
Let the caller deal with a failure.
2011-10-20 02:27:41 +02:00
Max Kellermann
d019343017 pcm_volume: pass an "end" pointer instead of a sample count 2011-10-20 02:27:41 +02:00
Max Kellermann
e977ec924c pcm_volume: remove "default" statement
Don't suppress gcc warnings.
2011-10-20 02:24:25 +02:00
Max Kellermann
b7d5652bf6 pcm_volume: "length" is a "size_t", not "int" 2011-10-20 02:24:25 +02:00
Max Kellermann
725e48fce4 pcm_resample: add function pcm_resample_float()
A version of the resampler that doesn't need int->float->int
conversion.
2011-10-20 02:24:25 +02:00
Max Kellermann
43816c268b pcm_format: move "case" code to separate functions
Reduce the mess with local variables inside switch{}.
2011-10-20 02:24:25 +02:00
Max Kellermann
72e80db823 pcm_*: add "restrict" keywords
Allow more compiler optimizations.
2011-10-20 02:24:25 +02:00
Max Kellermann
7b33c343f8 crossfade: include cleanup 2011-10-20 02:24:25 +02:00
Jonathan Neuschäfer
6d0601b99f doc/protocol.xml: the replay gain "auto" mode was added in MPD 0.16 2011-10-19 23:59:44 +02:00
Jonathan Neuschäfer
b6e713711d doc/protocol.xml: document {en,dis}ableoutput's parameter 2011-10-19 23:32:19 +02:00
Max Kellermann
c53edeeb6c pcm_format: pass an "end" pointer instead of a sample count 2011-10-19 22:36:47 +02:00
Max Kellermann
dfb98417b3 pcm_channels: pass an "end" pointer instead of a sample count 2011-10-19 22:17:30 +02:00
Max Kellermann
9716c3a30e pcm_{channels,resample}: pass channel count as integer, not uint8_t
Reduces number of implicit integer conversions.
2011-10-19 22:14:43 +02:00
Max Kellermann
c4c44c4445 pcm_{channels,format}: add alignment assertions 2011-10-19 22:14:08 +02:00
Max Kellermann
0debe9bd6f pcm_utils: add function pcm_end_pointer() 2011-10-19 22:13:23 +02:00
Max Kellermann
f1da118a6c test: add GLib testing compatibility header
Didn't compile on GLib < 2.16.
2011-10-19 21:14:14 +02:00
Max Kellermann
c30c46cd5f configure.ac: define WINVER
Ensure that WINVER is defined early enough, so other system headers
won't fall back to their default value.  Specifically, this solves a
build failure (-Werror) with mingw-w64 ("WINVER redefined").
2011-10-13 09:23:32 +02:00
Max Kellermann
d394017926 decoder_thread: add missing stdio.h include 2011-10-13 09:09:58 +02:00
Max Kellermann
04525c0259 event_pipe: fix WIN32 regression
The event pipe is not a socket, and the patch that introduced
g_io_channel_new_socket() to the event pipe library was wrong.
2011-10-13 09:08:37 +02:00
Max Kellermann
08a0bb756d pcm_byteswap: use "end" pointer instead of buffer size 2011-10-10 10:24:06 +02:00
Max Kellermann
20c6159c04 pcm_dither: pass an "end" pointer instead of a sample count
This is easier and more efficient to loop on, because only two
variables get modified (src and dest).
2011-10-10 10:24:06 +02:00
Max Kellermann
a47e9d1a4b pcm_pack: pass an "end" pointer instead of a sample count 2011-10-10 10:24:05 +02:00
Max Kellermann
e93dd374a4 pcm_byteswap: use GLib byte swapping macros
GLib's macros are implemented with inline assembly, and probably a lot
faster than our naive bit shifting implementation.
2011-10-10 10:24:05 +02:00
Max Kellermann
0847ca4ec2 pcm_{mix,volume}: pass only sample_format to pcm_mix()
The other audio_format attributes are not used.
2011-10-10 10:24:05 +02:00
Max Kellermann
572d8d0cc4 test: add unit test for the PCM library 2011-10-10 10:24:05 +02:00
Max Kellermann
c9a57d354d pcm_buffer: un-inline pcm_buffer_get()
This function is too complex for being inlined everywhere.
2011-10-10 10:13:43 +02:00
Max Kellermann
52b77f6e31 input/cdio_paranoia: pass byte order swapping to the PCM "decoder"
Send another "magic" MIME type when the byte order must be reversed.
This also fixes byte order issues when big-endian was involved (input
data or host byte order) - that was completely broken.
2011-10-10 10:13:43 +02:00
Max Kellermann
4c9782ee28 decoder/pcm: support reverse byte order 2011-10-10 10:13:43 +02:00
Max Kellermann
26225307d3 decoder_api: convert data to host byte order 2011-10-10 10:13:43 +02:00
Max Kellermann
0129d1e158 pcm_convert: support reverse endian input 2011-10-10 10:13:43 +02:00
Max Kellermann
ece6037a1e pcm_byteswap: add function with sample_format overload 2011-10-10 10:13:43 +02:00
Max Kellermann
bea678a7cd audio_format: convert reverse_endian to a "bool" 2011-10-10 10:13:43 +02:00
Max Kellermann
1fb3fbb4de audio_format: un-inline audio_format_mask_apply()
This function is not critical for performance, and the inline
expansion looks too expensive.
2011-10-10 10:13:43 +02:00
Max Kellermann
2c38d19af2 audio_format: add function attributes
For better optimization.
2011-10-10 10:13:43 +02:00
Max Kellermann
311e627463 audio: rename audio.[ch] to audio_config.[ch] 2011-10-10 10:13:43 +02:00
Max Kellermann
8e1e36a0d5 doc/doxygen.conf: enable "quiet" mode 2011-10-10 10:13:43 +02:00
Max Kellermann
db0bb425e7 Makefile.am: cue_tag.c belongs to libplaylist_plugins.a 2011-10-09 18:48:20 +02:00
Max Kellermann
e001dd2d45 Makefile.am: remove redundant GLIB_CFLAGS specifications 2011-10-09 18:45:37 +02:00
Max Kellermann
c38772c97f Makefile.am: add static library libpcm.a 2011-10-09 18:42:32 +02:00
Max Kellermann
3a31589fdd Makefile.am: generate static library from plugins
Compile the plugins only once with the same C flags.
2011-10-09 18:33:02 +02:00
Max Kellermann
460522bb67 configure.ac: enable automake option "silent-rules" 2011-10-09 18:32:57 +02:00
Max Kellermann
176debaf37 Makefile.am: require automake 1.11
Prepare for enabling "silent-rules".
2011-10-09 18:32:55 +02:00
Max Kellermann
072f83b240 configure.ac: use $LIBS instead of $MPD_LIBS 2011-10-09 18:29:25 +02:00
Max Kellermann
cbd6770f2f configure.ac: substitute FAAD_CFLAGS, FAAD_LIBS
Don't use MPC_CFLAGS, MPD_LIBS.
2011-10-09 18:25:09 +02:00
Max Kellermann
0c3a7bcf12 configure.ac: substitute MPCDEC_LIBS, MPCDEC_CFLAGS
Don't use MPD_LIBS, MPC_CFLAGS.
2011-10-09 17:58:36 +02:00
Max Kellermann
389fbaaca2 configure.ac: add variable BZ2_LIBS
Don't use MPD_LIBS.
2011-10-09 17:56:46 +02:00
Max Kellermann
9652efd107 don't define WINVER in *.c files
In a C file, that is too late, because _mingw.h defaults to 0x0502,
and ours would be illegal redefintion.
2011-10-09 17:52:56 +02:00
Max Kellermann
f3ea834322 decoder/{pcm,dsdiff}: add missing stdio.h include 2011-10-09 17:40:37 +02:00
Max Kellermann
02a6a46e86 configure.ac: don't append DESPOTIFY_LIBS to MPD_LIBS
Use DESPOTIFY_LIBS in Makefile.am instead.  Also, use
DESPOTIFY_CFLAGS.
2011-10-09 17:39:24 +02:00
Max Kellermann
75ad90abc7 configure.ac: remove gprof support
gprof is obsolete, it's better to use perfcounters in every aspect.
2011-10-09 17:35:19 +02:00
Max Kellermann
4104593180 configure.ac: use AC_SEARCH_LIBS for socket, gethostbyname, exp
AC_SEARCH_LIBS allows the function to be present in libc.
2011-10-09 17:31:57 +02:00
Max Kellermann
78e1704122 configure.ac: detect syslog() with AC_SEARCH_LIBS
One call to AC_SEARCH_LIBS replaces AC_CHECK_FUNCS and AC_CHECK_LIB.
2011-10-09 17:03:44 +02:00
Max Kellermann
b9e99575ce Merge commit 'release-0.16.5'
Conflicts:
	NEWS
	configure.ac
2011-10-09 16:32:36 +02:00
Avuton Olrich
fa5e06f95d Modify version string to post-release version 0.16.6~git 2011-10-09 04:44:51 -07:00
Avuton Olrich
3041409334 mpd version 0.16.5 2011-10-09 04:44:51 -07:00
Max Kellermann
71536eb412 decoder/wavpack: don't call WavpackGetMode() twice
Use local variable "is_float".
2011-10-08 15:37:47 +02:00
Max Kellermann
fe77230d84 pcm_convert: fix typo in error message 2011-10-08 15:36:55 +02:00
Max Kellermann
accd262561 audio_format: move code to sample_format_size()
Cast to enum sample_format.  Without the cast, it's just a plain
integer, and gcc cannot know that a "case" statement is missing.
2011-10-08 15:04:04 +02:00
Max Kellermann
3057d19cdf pcm_resample_lsr: move common code to lsr_process() 2011-10-08 14:51:26 +02:00
Max Kellermann
8dd83a2cf3 output/roar: move code to _use_audio_format() 2011-10-08 14:51:19 +02:00
Max Kellermann
49b84f9229 db_print: print absolute URI of playlist entries
The protocol mandates that playlist URIs are absolute (i.e. full URI
relative to the music directory, not relative to the parent
directory).  This adds the parameter "directory" to the "playlist"
visitor method.
2011-10-08 14:51:18 +02:00
Max Kellermann
b43bf4dd74 Merge branch 'v0.16.x' 2011-10-08 14:50:44 +02:00
Max Kellermann
5ed0eb51d1 output/openal: auto-fallback to mono if channel count is unsupported
.. instead of failing playback completely.
2011-10-08 14:41:22 +02:00
Max Kellermann
72a1ca3b99 output/alsa: remove "default" case from switch
Allow gcc to warn when a new format isn't supported.
2011-10-08 14:41:11 +02:00
Max Kellermann
14424281a0 pcm_resample: add internal function _lsr_init()
Let the libsamplerate code initialize itself.
2011-10-08 13:32:29 +02:00
Max Kellermann
2b3fd0d4d3 pcm_resample: one-time global initialization
Load the samplerate_converter on MPD startup.  Fail if the converter
name is invalid.
2011-10-08 13:14:29 +02:00
Max Kellermann
894b9cfdb9 decoder/dsdiff: add option "lsbitfirst"
Defaults to "no", which fixes the noise problems.
2011-10-07 10:10:43 +02:00
Max Kellermann
72ff9bd3e6 configure.ac: disable systemd service by default
Defaulting to "with systemd" causes problems for users who install MPD
as an unprivileged user, and it breaks "make distcheck".  It looks
like enabling it by default creates too many practical problems for
unexperienced users.

With --with-systemdsystemunitdir (without a parameter), configure.ac
attempts to auto-detect systemd.
2011-10-07 09:56:38 +02:00
Max Kellermann
7ecbb0454f decoder/dsdiff: add documentation 2011-10-07 06:38:23 +02:00
Max Kellermann
fa7fa2a55f playlist_song: allow references to songs outside the musicdir
When we have an absolute path that's not inside the music directory,
allow loading it anyway, if we're in "secure" mode (i.e. the client is
connected via UNIX socket).
2011-10-06 22:57:14 +02:00
Max Kellermann
5c0576ca55 Merge branch 'v0.16.x'
Conflicts:
	configure.ac
	src/player_control.c
	src/player_thread.c
	src/playlist_song.c
2011-10-06 22:45:02 +02:00
Jesús Bravo Álvarez
039b354490 playlist_song: fix absolute path support in playlists
Right now, a playlist with absolute pathnames can only add songs that
are in the same the directory of the playlist or under it.

If uri is an absolute pathname and base_uri is set,
playlist_check_translate_song() will check that base_uri is a prefix
of uri, excluding every other song in the music directory outside
base_uri.

I think in this case base_uri should be completely ignored (and made
NULL) and uri should just be checked against music root directory.
2011-10-06 22:21:24 +02:00
Max Kellermann
b2f03e76ff player_thread: add flag "output_open", fixes assertion failure
Previously, the condition "defined(play_audio_format)" was used to see
if an output device has been opened, but if the device had failed on
startup, an assertion failure could occur.  This patch adds a separate
flag.
2011-10-06 21:22:48 +02:00
Max Kellermann
63b33b6ec5 player_thread: move code to player_open_output()
Common function that manages "player" attributes after
audio_output_all_open() has returned.
2011-10-06 20:55:52 +02:00
Max Kellermann
23670795db output_control: remove unused prototype _close_locked() 2011-10-06 19:51:37 +02:00
Max Kellermann
8ea6c113b5 player_control: auto-start playback when seeking is requested
Now that the player thread can handle SEEK commands while not (yet)
playing, we can remove the "pc.state" check from pc_seek().
2011-10-06 00:35:54 +02:00
Max Kellermann
37f026a0a6 player_thread: handle SEEK while not playing 2011-10-06 00:35:53 +02:00
Max Kellermann
f67136df19 decoder_api: call _prepare_initial_seek() in decoder_tag()
This checks both conditions: pending and running.  Fixes yet another
assertion failure!
2011-10-06 00:35:53 +02:00
Max Kellermann
e07073ff28 decoder_api: move code to _prepare_initial_seek()
.. and add a few code comments.
2011-10-06 00:35:53 +02:00
Max Kellermann
64b0ba6da7 decoder_control: add attributes start_ms, end_ms
Don't read song.start_ms and song.end_ms, let the player thread manage
this logic instead.
2011-10-05 23:15:22 +02:00
Max Kellermann
99d4ae0c1a decoder_api: don't copy tag to pipe during initial seek
Fixes one more assertion failure.
2011-10-05 22:54:30 +02:00
Max Kellermann
f185b35088 decoder_api: clear initial_seek_running on error
Fixes possible assertion failure.
2011-10-04 22:29:31 +02:00
Max Kellermann
4e909f9411 decoder/dsdiff: new decoder plugin
Doesn't seem to work yet, getting just noise from a test file.
Seeking isn't implemented yet.
2011-10-04 21:41:03 +02:00
Max Kellermann
99f49e266c Makefile.am: build the "dsd2pcm" program 2011-10-04 21:40:59 +02:00
Max Kellermann
0458211ebc dsd2pcm/noiseshape: fix typo in C++ check 2011-10-04 21:40:56 +02:00
Max Kellermann
8a7b9d9f45 dsd2pcm: fix prototypes
Fixes gcc warnings.
2011-10-04 21:40:31 +02:00
Sebastian Gesemann
3fcf463f9e import dsd2pcm_src.zip
[this is the code from dsd2pcm_src.zip, published on a forum by
Sebastian Gesemann.  Upon request, he has given permission to
redistribute and modify his code, without referring to a specific
license. - mk]
2011-10-04 21:34:30 +02:00
Max Kellermann
f77cd63286 audio_format: add constant MAX_CHANNELS
To be used in fixed-size arrays.
2011-10-04 20:41:32 +02:00
Max Kellermann
2378c2d754 configure.ac: add automake conditional HAVE_CXX 2011-10-03 19:28:54 +02:00
Max Kellermann
bbdb4a67e1 test/run_decoder: initialize GThread
Needed for the I/O thread.
2011-10-03 19:28:54 +02:00
Steven Blackburn
21851c0673 Add support for streaming to a DLNA client
The Naim Uniti does not appear to support icecast-style streaming of FLAC
music but does support the codec from a DLNA server. This change looks for
"transferMode.dlna.org: Streaming" in the HTTP request header and responds
with something the Uniti (and hopefully other DLNA clients) accepts.

The only difference in the DLNA streaming mode is the reponse header and
that icecast metadata is disabled. If a client request indicates both modes
are supported, the DLNA mode is preferred (as the Uniti says it supports
both but then rejects a FLAC ICY stream).

Note: This change may be specific to Naim equipment (the only device it was
tested on). E.g. the hardcoding of Content-Length which works but is not a
logically correct value. The change should be backwards-compatible, so
only those clients requesting a DLNA stream will see any difference.
2011-09-30 08:53:09 +02:00
Miklos Vajna
83f6498aac Install systemd service file if systemd is available 2011-09-30 08:37:36 +02:00
Max Kellermann
7e219c362c Merge branch 'v0.16.x'
Conflicts:
	src/player_thread.c
2011-09-22 00:27:34 +02:00
Max Kellermann
525a791987 decoder_api: emulate SEEK command for initial seek to CUE track
When playing a CUE track, the player thread waited for the decoder to
become ready, and then sent a SEEK command to the beginning of the CUE
track.  If that is near the start of the song file, and the track is
short enough, the decoder could have finished decoding already at that
point, and seeking fails.

This commit makes this initial seek more robust: instead of letting
the player thread deal with the difficult timings, let the decoder API
emulate a SEEK command, and return it to the decoder plugin, as soon
as the plugin finishes its initialization.
2011-09-22 00:04:48 +02:00
Max Kellermann
fb19210cfd decoder_internal.h: more API documentation 2011-09-22 00:04:20 +02:00
Jonathan Neuschäfer
203f48d1fd protocol: drop G_GNUC_PURE from client_message_dup 2011-09-21 17:56:07 +02:00
Jonathan Neuschäfer
371c82b2bf utils: mark sockaddr_to_string() as G_GNUC_MALLOC 2011-09-21 17:56:06 +02:00
Dan McGee
8176880173 Simplify setsockopt() casting workaround
On Win32, the third setsockopt parameter has type (char *) while on POSIX
systems it is (void *). However, given that it is a no-op cast to go from a
char pointer to a void pointer, we can cast to a char pointer (with a
possible const modifier) on all platforms and satisfy the compiler.

Signed-off-by: Dan McGee <dan@archlinux.org>
2011-09-21 17:54:44 +02:00
Jonathan Neuschäfer
b0b2c5b3e0 utils: uri.h: fix a typo: "schema" 2011-09-21 17:47:28 +02:00
Max Kellermann
29742d23d3 configure.ac: fix --enable-id3 help string 2011-09-20 22:18:42 +02:00
Max Kellermann
533a6b0240 tcp_connect: generic library for establishing TCP connections 2011-09-20 21:27:17 +02:00
Max Kellermann
0c0400b6fc io_thread: add function _timeout_add()
Same as _timeout_add_seconds(), but this one has millisecond
resolution.
2011-09-20 21:27:17 +02:00
Max Kellermann
2e83af7c21 io_thread: _timeout_add_seconds() returns GSource*
The numeric ID isn't so useful.
2011-09-20 21:26:30 +02:00
Max Kellermann
a3f7947ad2 server_socket: use resolve_host_port() instead of getaddrinfo()
Allow port specification in "bind_to_address" settings.
2011-09-20 21:15:22 +02:00
Max Kellermann
7d9d459ac2 resolver: add function resolve_host_port() 2011-09-20 21:15:05 +02:00
Max Kellermann
3ea1073809 socket_util: move sockaddr_to_string() to resolver.c 2011-09-20 08:49:36 +02:00
Max Kellermann
76a959a578 rtsp_client, output/raop: use close_socket() instead of close() 2011-09-20 08:48:48 +02:00
Max Kellermann
f43873dc5f tcp_socket, udp_server: use g_io_channel_new_socket() 2011-09-20 08:47:42 +02:00
Max Kellermann
921553d7bb Merge branch 'v0.16.x' 2011-09-20 08:47:06 +02:00
Max Kellermann
c476819cb1 fd_util: add function close_socket()
Wrap close(), use closesocket() on WIN32/WinSock.
2011-09-20 08:38:58 +02:00
Max Kellermann
77a56c7c5a fd_util: check HAVE_INOTIFY_INIT in header
Don't provide the prototype if inotify_init() was not detected.
2011-09-20 08:38:17 +02:00
Max Kellermann
46deb7ca82 fd_util: include check.h, verify config.h was included 2011-09-20 08:38:08 +02:00
Max Kellermann
b03f9ece05 glib_socket.h: wrap g_io_channel_*_new() calls portably
The server_socket library (used by the httpd output plugin) didn't
check for WIN32, that's fixed now.
2011-09-20 08:35:25 +02:00
Dan McGee
27946a981f Set socket TCP keepalive option on incoming connections
If a connected host disappears without our knowledge, as can happen over
wireless or a hibernating machine, we continue to hold the port open waiting
for messages. Because we never try to send anything down this now-broken
pipe, the connection will sit idle taking up a slot in our allowed incoming
connections list.

If enough of these happen, an unintended Denial of Service takes place,
where all connection slots are filled with now-broken, never ending
connections. Setting the TCP keepalive option at least allows these to time
out after the default two hours, which is sufficient in the non-malicious
case.

Signed-off-by: Dan McGee <dan@archlinux.org>
2011-09-19 17:11:09 +02:00
Max Kellermann
74617389c8 output_plugin: the plugin allocates the audio_output object
Pass audio_output objects around instead of void pointers.  This will
give some more control to the plugin, and prepares for non-blocking
audio outputs.
2011-09-19 09:41:21 +02:00
Max Kellermann
1d8840412f configure.ac: add option --enable-solaris-output
Allow enabling the plugin explicitly without running Solaris, to test
the build.
2011-09-19 09:39:35 +02:00
Max Kellermann
df1152ee0f configure.ac: fix solaris result display
Wrong variable name.
2011-09-19 09:39:05 +02:00
Max Kellermann
b4a8b8c0d4 Makefile.am: rename SPARSE_SOURCES to SPARSE_SRC
Work around automake warning.
2011-09-19 08:03:31 +02:00
Max Kellermann
ffa9f4b47f output/roar: check return values
Fixes gcc warnings.
2011-09-18 12:07:06 +02:00
Max Kellermann
667e22bbc7 output/roar: unknown volume is -1, not 0 2011-09-18 12:06:46 +02:00
Max Kellermann
d4d838c8bb output/roar: move code to roar_cancel_locked() and others
Wrap the locking code.
2011-09-18 11:51:18 +02:00
Max Kellermann
c61a889c86 output/roar: use GLib memory allocation functions
GLib has a built-in OOM handler.
2011-09-17 20:12:45 +02:00
Max Kellermann
567fe89a77 output/roar: use config_get_block_string() for temporary 2011-09-17 20:11:51 +02:00
Max Kellermann
950772ab8a output/roar: reorder methods 2011-09-17 20:10:26 +02:00
Max Kellermann
0bd0e2a3ec output: rename plugin variables
Consistent naming.
2011-09-17 20:04:18 +02:00
Max Kellermann
47774ce882 Merge branch 'v0.16.x' 2011-09-17 19:59:52 +02:00
Max Kellermann
3c9bcdd347 output: per-plugin header
Move the "extern" declarations from output_list.c, for more type
safety.
2011-09-17 19:51:41 +02:00
Max Kellermann
3934d2d30c output/pulse: don't expose internal struct in public header
Provide _lock() and _unlock() to wrap all accesses from the mixer
plugin.
2011-09-17 19:50:36 +02:00
Max Kellermann
423ce9557a output/raop: don't expose internal structs in public header 2011-09-17 19:44:30 +02:00
Max Kellermann
947848ebf6 output/roar: export volume methods
Use these instead of exposing the internal roar_t struct.
2011-09-17 19:33:51 +02:00
Max Kellermann
5e22fe488e output: rename plugin source files 2011-09-17 08:54:50 +02:00
Max Kellermann
c666cf1c44 output/pulse: move code to _setup_stream() 2011-09-17 08:53:53 +02:00
Tim Harder
79435dbdec decoder/audiofile: include stdio header for SEEK_* defines
The stdio header is no longer pulled in by af_vfs.h in audiofile-0.3.0.
2011-09-17 07:33:42 +02:00
Max Kellermann
27206368da output/pulse: improve locking
Always lock the main loop when operating on PULSE objects.  Document
this.
2011-09-17 07:30:59 +02:00
Max Kellermann
2be245b75e input/soup: wait some more before resuming the stream 2011-09-16 21:50:05 +02:00
Max Kellermann
17927f5c26 input/soup: improve error messages
Copy the reason_phrase from the SoupMessage, and check for transport
errors in the session callback.
2011-09-16 21:50:05 +02:00
Max Kellermann
754f26a97c input_stream: non-blocking I/O
Add GMutex, GCond attributes which will be used by callers to
conditionally wait on the stream.

Remove the (now-useless) plugin method buffer(), wait on GCond
instead.  Lock the input_stream before each method call.  Do the same
with the playlist plugins.
2011-09-16 21:22:13 +02:00
Max Kellermann
29241c4f83 input_plugin: add method check()
To check for errors without reading.  The decoder thread wants to do
that, before it passes the input stream to the plugin.
2011-09-16 21:22:02 +02:00
Max Kellermann
6f655eb9b9 input/{soup,curl}: free unused postponed_error
Fix memory leak.
2011-09-16 21:13:25 +02:00
Max Kellermann
65dfd90141 input/soup: move libsoup calls to the I/O thread
libsoup's asynchronous API is not thread safe.  By moving the calls
into the I/O thread, several crash bugs will be fixed.
2011-09-16 20:34:47 +02:00
Max Kellermann
59abdbd2dd input/soup: wait for _cancel_message() to complete
Add the "complete" attribute, and set it in _session_callback().
_close() waits for it to become true.
2011-09-16 20:34:47 +02:00
Max Kellermann
a6d6873856 input/soup: return real GErrors to the caller
Add attribute postponed_error, pass this GError to the caller.
2011-09-16 11:36:09 +02:00
Max Kellermann
e99df3a3be input/soup: set the "ready" flag on failure
Fix deadlock.
2011-09-16 11:35:02 +02:00
Max Kellermann
8b657255cc input/soup: remove redundant flag "ready"
We'll add proper locking now, and there's no need to carry this
duplicate flag.
2011-09-16 11:34:50 +02:00
Max Kellermann
0e1dc79321 input/soup: report failure in _read()
To report failures to callers who don't use _buffer().
2011-09-16 11:30:56 +02:00
Max Kellermann
0ef15e5fac input/soup: unlock before cancelling the soup message
Avoid recursive deadlock in _session_callback().
2011-09-16 11:30:30 +02:00
Max Kellermann
9ea8a840a9 decoder_api: remove the loop from decoder_read()
This was useless, because input_stream_read() blocks until data is
available.  Calling it in a loop doesn't make sense.
2011-09-16 09:15:10 +02:00
Max Kellermann
7b88089593 decoder_api: move code to decoder_check_cancel_read() 2011-09-16 09:15:10 +02:00
Max Kellermann
b513943893 input/curl: wait some more before resuming the stream
Pausing and resuming after every little chunk adds lots of overhead.
Add a lower level for resuming the stream.
2011-09-16 09:14:29 +02:00
Max Kellermann
edffc56600 input/curl: clear the "paused" flag before resuming
curl_easy_pause(CURLPAUSE_CONT) may have added enough data to go into
pause again.
2011-09-16 09:11:15 +02:00
Max Kellermann
856b0e6886 input/curl: remove _schedule_update()
Call _update_fds() directly.  This is possible because it's only
called from within the I/O thread.
2011-09-16 09:11:09 +02:00
Max Kellermann
bf1eb46b87 input/curl: unlock the mutex for io_thread_call()
Fix deadlock.
2011-09-16 09:10:39 +02:00
Max Kellermann
7e27d660e2 test/test_queue_priority: work around "set but not used" warning 2011-09-16 09:10:39 +02:00
Max Kellermann
53174ea45f input/soup: fix "unused local variable" warnings 2011-09-16 09:10:33 +02:00
Max Kellermann
87b624f5d5 Merge branch 'v0.16.x' 2011-09-16 07:52:39 +02:00
Max Kellermann
443e96381a configure.ac: disable assertions in the non-debugging build
Add -DNDEBUG to AM_CPPFLAGS.
2011-09-16 07:41:41 +02:00
Max Kellermann
1cbba4fc59 input/curl, output/pulse: fix "unused local variable" warnings 2011-09-16 07:41:41 +02:00
Max Kellermann
344b6dd179 configure.ac: enable -Werror for C++ 2011-09-16 07:38:00 +02:00
Max Kellermann
d8c829fa0c configure.ac: pass AM_CXXFLAGS, AM_CPPFLAGS to Makefile.am 2011-09-16 07:35:46 +02:00
Max Kellermann
e1efc71ad3 input_stream: add "nonnull" attributes 2011-09-15 22:40:44 +02:00
Max Kellermann
f804a739b1 Merge branch 'v0.16.x'
Conflicts:
	NEWS
	configure.ac
2011-09-15 21:48:33 +02:00
Max Kellermann
2ed870c854 decoder/ffmpeg: flush the codec after seeking
Let the codec start with fresh buffers.  This should fix the remaining
seeking issues.
2011-09-15 21:41:25 +02:00
Max Kellermann
ce35ba9ac9 decoder/ffmpeg: explicitly specify the current stream for seeking
Use AVStream.time_base to convert the decoder_seek_where() value, and
pass the current stream number to av_seek_frame().
2011-09-15 21:35:29 +02:00
Max Kellermann
724a59aaf7 decoder/ffmpeg: don't require key frame for seeking
Use flag AV_TIME_BASE.
2011-09-15 21:32:29 +02:00
Max Kellermann
42d8c2981f decoder/ffmpeg: higher precision timestamps 2011-09-15 21:30:27 +02:00
Max Kellermann
9aa91e0f17 decoder/ffmpeg: move formula to time_from_ffmpeg() 2011-09-15 21:23:48 +02:00
Max Kellermann
5aabee8996 decoder/ffmpeg: add local variable "av_stream"
Code simplification.
2011-09-15 21:14:53 +02:00
Max Kellermann
48a84ca23e input/rewind: copy the MIME type only once
Reduce heap usage by reducing the number of malloc() / free() calls.
2011-09-15 20:24:15 +02:00
Max Kellermann
8751783a1b input/curl: per-request mutex/cond
The global data structures are now lock-free, because they are
accessed only from the I/O thread.  By using per-request locks, we
have finer grained locking, preparing for locks shared with the
client.
2011-09-15 10:24:50 +02:00
Max Kellermann
3a2ec50d5f input/curl: move all libCURL calls to the I/O thread
This adds some overheads for indirect calls to the I/O thread, but
reduces the amount of global locks.  Next step will be switching to
per-request locks.
2011-09-15 09:48:36 +02:00
Max Kellermann
ce9aeed4cb input/file: return NULL instead of "false" 2011-09-15 09:48:36 +02:00
Max Kellermann
f2be6432a9 Makefile.am: allow out-of-tree sparse call 2011-09-15 09:48:36 +02:00
Max Kellermann
e96f8c0444 input/curl: don't set "ready" on _easy_free()
Move the assignment to _request_done(), right before the GCond is
signalled.  This might fix spurious wakeups.
2011-09-15 09:27:16 +02:00
Max Kellermann
2bf3bc3e10 input/curl: add assertions on io_thread_inside() 2011-09-15 09:27:15 +02:00
Max Kellermann
28143f86f9 input/curl: merge _request_abort() into _request_done()
This is a trivial function.  Merge some duplicate code, e.g. the
g_cond_broadcast() call.
2011-09-15 09:27:13 +02:00
Max Kellermann
76ec3d3248 udp_server: disable -Wmissing-field-initializers 2011-09-15 09:25:53 +02:00
Max Kellermann
d0c85a5a96 gcc.h: add macro GCC_CHECK_VERSION 2011-09-15 09:22:48 +02:00
Max Kellermann
46ed717af4 input/curl: API documentation fix 2011-09-15 06:44:20 +02:00
Max Kellermann
ad37c88f80 input_plugin: add method update()
Update the struct attributes, important for facades like the "rewind"
plugin.  To replace buffer().
2011-09-14 22:25:29 +02:00
Max Kellermann
8c6e8a6eb8 input_internal: add assertions 2011-09-14 22:06:57 +02:00
Max Kellermann
dd33317f45 input_stream: move input_stream_init(), _deinit() to _internal.c 2011-09-14 22:01:55 +02:00
Max Kellermann
c344d63fb3 decoder_internal: don't call input_stream_buffer()
This is not necessary since all relevant input plugins have been moved
to the I/O thread, and there is no remaining useful buffer()
implementation.  This also fixes a busy loop when playing radio.
2011-09-14 09:41:27 +02:00
Max Kellermann
62557f4d6b test/read_tags: initialize the tag_pool library 2011-09-13 22:46:47 +02:00
Max Kellermann
9c46cc4ea0 test/read_tags: call g_thread_init()
Needed for the I/O thread.
2011-09-13 22:42:21 +02:00
Max Kellermann
a236a439cc db_print: move code to function db_selection_print()
Use it in handle_lsinfo(), and eliminate some duplicate code.
2011-09-13 22:09:37 +02:00
Max Kellermann
c779e2674a db_visitor: add method playlist() 2011-09-13 22:02:37 +02:00
Max Kellermann
a94d4be466 db_plugin: add method visit() 2011-09-13 21:47:00 +02:00
Max Kellermann
b7d2d4cfe8 database: don't allow uri==NULL
Add nonnull attributes and fix all callers.
2011-09-13 21:39:07 +02:00
Max Kellermann
a6c797ee4b gcc.h: add macro gcc_nonnull 2011-09-13 21:38:27 +02:00
Max Kellermann
3e40b2249f gcc.h: change "mpd_" prefix to "gcc_"
This is specific to gcc, not to mpd.
2011-09-13 21:37:33 +02:00
Max Kellermann
2fe1b5034d db_plugin: add method get_song()
New db_get_song() implementation.
2011-09-13 21:01:35 +02:00
Max Kellermann
b4430839a3 database: generate GError when database is disabled 2011-09-13 20:54:27 +02:00
Max Kellermann
412cf974a4 directory: don't visit "self" in _walk()
Let the caller decide if the current directory should be visited.
2011-09-13 20:44:35 +02:00
Max Kellermann
3fc6beeff0 locate: remove unused function locate_item_new() 2011-09-13 20:44:00 +02:00
Max Kellermann
2ff35c8bfa directory: don't require a "directory" visitor
.. to recurse.  A visitor may not have one, but still be interested in
a recursive search.
2011-09-13 20:44:00 +02:00
Max Kellermann
169db88c20 database: add struct db_visitor
Use this struct for db_walk().
2011-09-13 19:37:28 +02:00
Max Kellermann
ca419c84b8 stored_playlist: return GError, code is playlist_result
Improve error reporting and handling.  command.c gets the new function
print_error(), which sends a GError to the client.
2011-09-11 07:57:50 +02:00
Max Kellermann
aede71b1dc playlist: move enum playlist_result to playlist_error.h
Reduce header dependencies.
2011-09-11 07:55:51 +02:00
Max Kellermann
14d573cbf1 playlist: move PLAYLIST_COMMENT to stored_playlist.c
Only used there.
2011-09-11 07:55:19 +02:00
Max Kellermann
7819aa6b20 db_plugin: introducing a plugin API for the song database
First draft, not really pluggable currently - hard-coded to use the
"simple" plugin, and calls several of its internal functions.

The API is very simple currently, all searches are still performed
over the root "directory" object.  Future changes to the API will move
those search implementations into the plugin, to allow more efficient
implementations, or implementations that don't have the whole tree in
memory all the time.
2011-09-10 07:58:43 +02:00
Max Kellermann
7cc6b63aac database: move code to db_save.c 2011-09-10 07:48:05 +02:00
Max Kellermann
4af6362751 directory_save: pass const pointer to _save() 2011-09-10 07:48:05 +02:00
Max Kellermann
d54075197f tag_internal: add missing tag.h include
For TAG_NUM_OF_ITEM_TYPES.
2011-09-10 07:48:05 +02:00
Max Kellermann
5cce56199b conf: export config_param_free() 2011-09-09 23:59:46 +02:00
Max Kellermann
3cc12817f6 conf: _get_next_param() returns a const pointer
No writers.
2011-09-09 23:59:46 +02:00
Max Kellermann
68875ba600 database: return GError on failure 2011-09-09 23:28:27 +02:00
Max Kellermann
c345c5ebae .gitignore: add doxygen.conf 2011-09-09 23:21:20 +02:00
Max Kellermann
2119a16e24 .gitignore: add doxygen.conf 2011-09-09 23:04:32 +02:00
Max Kellermann
9f5c938ff3 conf: add config_dup_block_path() 2011-09-09 23:01:22 +02:00
Max Kellermann
b42a8d2364 utils: parsePath() returns GError on failure
Better error messages.
2011-09-09 22:55:57 +02:00
Max Kellermann
61fc01e79e utils: pass a const string to parsePath()
Remove the slash hack, allocate memory for the user name.
2011-09-09 22:55:57 +02:00
Max Kellermann
cceaec1d74 utils: eliminate local variable "pos"
Just advance the "path" pointer.
2011-09-09 22:55:57 +02:00
Max Kellermann
8e5f9c8160 conf: turn config_get_path() into config_dup_path()
config_get_path() was somewhat flawed, because it pretended to be a
function, when it really had a side effect.  The second flaw was that
it did not return the parser error, instead it aborted the whole
process, which is bad style.  The new function returns a duplicated
(modified) string that must be freed by the caller, and returns a
GError on failure.
2011-09-09 22:55:57 +02:00
Max Kellermann
c620fd42f4 glib_compat.h: emulate g_prefix_error() 2011-09-09 22:55:57 +02:00
Max Kellermann
2a859f870a log: print detailed errno message on open() failure 2011-09-09 21:53:42 +02:00
Max Kellermann
b680753db8 log: return GError on initialization failure 2011-09-09 21:53:42 +02:00
Max Kellermann
35af940166 conf: get_block_param() returns a const pointer
No caller needs to write.
2011-09-09 21:36:41 +02:00
Max Kellermann
bc0fec0afe conf: move duplicate check to _read_name_value()
config_add_block_param() cannot fail, which makes it easier to use.
2011-09-09 21:36:41 +02:00
Max Kellermann
e3eca82cc3 conf: move code to config_read_name_value()
Reduce indent.
2011-09-09 21:36:35 +02:00
Max Kellermann
e7651d0d0f conf: add gcc optimization attributes 2011-09-09 21:01:19 +02:00
Max Kellermann
5cf4ce9318 pcm_format: fix 32-to-24 bit conversion (the "silence" bug)
D'oh, we were reading 16 bit integers instead of 32 bit integers!
That caused silence when trying to play a 32 bit input file on a 24
bit sound card (e.g. USB sound chips with 24 bit packed samples).
2011-09-08 23:47:32 +02:00
Max Kellermann
6a6f28668f dbUtils: move code to db_print.c 2011-09-06 00:03:51 +02:00
Max Kellermann
dadf1339b5 dbUtils: pass player_control to findAddIn()
Allow calling findAddIn() without a client object.
2011-09-05 23:14:39 +02:00
Max Kellermann
c2c4228722 Merge commit 'release-0.16.4'
Conflicts:
	NEWS
	configure.ac
2011-09-02 06:38:01 +02:00
Avuton Olrich
5469941f2b Modify version string to post-release version 0.16.5~git 2011-09-01 17:58:29 -07:00
Avuton Olrich
e888c9e827 mpd version 0.16.4 2011-09-01 17:58:28 -07:00
Max Kellermann
3d3bca5338 decoder/oggflac: delete this obsolete plugin
libOggFLAC has been deprecated for 5 years now, and we havn't been
testing it for a long time.  Let's delete it.
2011-09-01 19:29:04 +02:00
Max Kellermann
6a3008d7ff Merge branch 'v0.16.x'
Conflicts:
	configure.ac
	src/output_control.c
2011-09-01 19:19:42 +02:00
Max Kellermann
2556449b36 configure.ac: fail if Vorbis was enabled explicitly, but not found
.. and a minor tweak for libFLAC+libogg detection.
2011-09-01 19:02:23 +02:00
Max Kellermann
446f9973cc configure.ac: fail if FLAC was enabled explicitly, but not found 2011-09-01 19:02:22 +02:00
Max Kellermann
596f36bb78 output/osx: don't drain the buffer when closing
Eliminate an unnecessary source of deadlocks.
2011-09-01 18:21:46 +02:00
Max Kellermann
e7abdab58d output/osx: signal the GCond while mutex is locked 2011-09-01 18:21:46 +02:00
Max Kellermann
13cdc9a9f8 configure.ac: auto-detect libmad without pkg-config
The pkg-config file was added by the Debian package maintainers, and
unfortunately, the rest of the world doesn't have it.
2011-09-01 11:06:08 +02:00
Max Kellermann
a1b8806422 configure.ac: fail if libid3tag was enabled explicitly, but not found
Add M4 function MPD_AUTO_PKG_LIB for pkg-config with AC_CHECK_LIB
fallback.
2011-09-01 10:58:36 +02:00
Max Kellermann
e635d47912 configure.ac: use MPD_AUTO_PKG to detect avahi
Don't abort the configure script when avahi could not be
auto-detected.  It previously did, because there was no custom "fail"
action for PKG_CHECK_MODULES.
2011-09-01 10:11:23 +02:00
Max Kellermann
53ac72a878 Makefile.am: use AVAHI_CFLAGS, AVAHI_LIBS
Don't add those to MPD_CFLAGS / MPD_LIBS.
2011-09-01 10:09:46 +02:00
Max Kellermann
2be6184c8d output_all: move _lock_signal() to output_control.c
Better name, better documentation.
2011-09-01 07:59:15 +02:00
Max Kellermann
8b0b4ff086 output_thread: reimplement CANCEL synchronization
The output thread could hang indefinitely after finishing CANCEL,
because it could have missed the signal while the output was not
unlocked in ao_command_finished().

This patch removes the wait() call after CANCEL, and adds the flag
"allow_play" instead.  While this flag is set, playback is skipped.
With this flag, there will not be any excess wait() call after the
pipe has been cleared.

This patch fixes a bug that causes mpd to discontinue playback after
seeking, due to the race condition described above.
2011-09-01 07:13:21 +02:00
Max Kellermann
60f7ff3de5 output/pulse: reset callbacks before closing stream/context
Fixes assertion failure when a stream callback is invoked too late
after a format change.
2011-08-31 21:01:34 +02:00
Max Kellermann
e76c752987 output/pulse: add function _delete_stream()
Merge common code.
2011-08-31 21:01:22 +02:00
Max Kellermann
042c1abc6e output/pulse: use _delete_context()
Eliminate duplicate code.
2011-08-31 20:58:36 +02:00
Max Kellermann
1401621913 output/raop: remove Audio-Jack-Status check
The value of this is not used, the code is commented out - let's get
rid of it.
2011-08-31 20:19:36 +02:00
Max Kellermann
3c034b0a0c output/raop: remove empty function raopcl_stream_connect() 2011-08-31 20:17:24 +02:00
Max Kellermann
395191bd75 rtsp_client: use the I/O thread
Make the code portable.
2011-08-31 08:32:09 +02:00
Max Kellermann
ec7d8fb6bd udp_server: don't use MSG_DONTWAIT on WIN32
Doesn't exist on mingw32.
2011-08-31 08:32:09 +02:00
Max Kellermann
062948b110 mixer/raop: include cleanup 2011-08-31 08:31:26 +02:00
Max Kellermann
7f3dc5f040 output/raop: cast sendto() parameter to void pointer
Fix compilation on mingw32.
2011-08-31 08:30:26 +02:00
Max Kellermann
dd0798a317 rtsp_client: use g_usleep()
usleep() is not portable.
2011-08-31 08:30:26 +02:00
Max Kellermann
9209ccfa40 rtsp_client: allow parameter "kd" to be NULL
When the caller isn't interested in the values.
2011-08-31 08:16:55 +02:00
Max Kellermann
2525d32e17 rtsp_client: don't wait if packet is over due
Check if the time difference is negative.  That would have caused
sleeping forever.
2011-08-31 07:47:01 +02:00
Max Kellermann
f3ac8a7cd9 io_thread: allow _call() from inside the thread 2011-08-31 07:33:07 +02:00
Max Kellermann
f3d95f70e2 rtsp_client: free attribute "kd" in _close()
Fix yet another memory leak.
2011-08-31 07:13:42 +02:00
Max Kellermann
57526067f5 output/raop: move code to raop_session_new()
.. and fix a few memory leaks.
2011-08-30 22:36:54 +02:00
Max Kellermann
0545bab35d valgrind.suppressions: more OpenSSL and other suppressions 2011-08-30 22:33:19 +02:00
Max Kellermann
293836494d output_control: move code to audio_output_destruct()
.. and destruct the output object properly in test/run_output.
2011-08-30 22:28:15 +02:00
Max Kellermann
ae8bda190e test/run_output: clean up after open failure 2011-08-30 22:20:32 +02:00
Max Kellermann
34d9d8abd4 output/raop: merge raopcl_close() into _finish()
.. and fix a double free bug.
2011-08-30 22:20:32 +02:00
Max Kellermann
bd67e986f4 output/raop: free the raop_data object in finish() 2011-08-30 22:02:55 +02:00
Max Kellermann
e587518d85 output/raop: remove from the session when opening fails 2011-08-30 22:00:19 +02:00
Max Kellermann
210b6c38bd output/raop: move code to raop_output_remove() 2011-08-30 21:56:57 +02:00
Max Kellermann
9592c0b466 rtsp_client: increment "dp" after terminating the string
This fixes a bug that caused all values to be an empty string.
2011-08-30 21:33:02 +02:00
Max Kellermann
a33537b2b9 rtsp_client: simplify whitespace elimination
Just move a pointer, don't call strlen() in every iteration.
2011-08-30 21:31:46 +02:00
Max Kellermann
81d5c9757c rtsp_client: check "new_kd" instead of "i"
Eliminate the redundant local variable "i".
2011-08-30 21:30:06 +02:00
Max Kellermann
f34124a50b rtsp_client: move "new_kd" out of the loop
This must persist iterations.
2011-08-30 21:29:19 +02:00
Max Kellermann
74a39c715b ntp_server: move code to udp_server.c 2011-08-30 07:39:05 +02:00
Max Kellermann
195496333b output/raop: move RTSP client code to rtsp_client.c
Restore some of the original file structure from from raop_play.
2011-08-29 11:27:08 +02:00
Max Kellermann
9ccaa90439 ntp_server: use the I/O thread 2011-08-29 11:23:51 +02:00
Max Kellermann
4733c5fef0 io_thread: add function io_thread_quit() 2011-08-29 10:25:04 +02:00
Max Kellermann
a97ddc8cb9 test/run_ntp_server: quit on SIGINT or SIGTERM
Clean up the process before exiting.
2011-08-29 10:18:54 +02:00
Max Kellermann
59a5b000e0 ntp_server: check for select() failures
Fix freeze after signal was handled.
2011-08-29 10:18:54 +02:00
Max Kellermann
d49a2ccb08 ntp_server: fix socket types
Cast recvfrom(), sendto() buffers to "void*" to avoid "char*" /
"unsigned char*" confusion.  Use ssize_t for the return value, and
socklen_t for the socket address size.
2011-08-29 09:52:51 +02:00
Max Kellermann
4a75acb46c io_thread: add function io_thread_run() 2011-08-29 09:52:03 +02:00
Max Kellermann
453368078b configure.ac: add OpenSSL check for RAOP output plugin
Auto-enable the plugin when OpenSSL was found.
2011-08-29 09:39:03 +02:00
Max Kellermann
6e3b643bdf ntp_server: add debug program "run_ntp_server" 2011-08-29 09:39:03 +02:00
Max Kellermann
a769352a74 output/raop: fallback for g_set_error_literal()
This function was added in GLib 2.18.  Make the plugin compatible with
older GLib versions.
2011-08-29 09:39:03 +02:00
Max Kellermann
8a63c27925 output/raop: move NTP code to separate library 2011-08-28 16:44:12 +02:00
Jonathan Neuschäfer
310895f060 rename 'Timer' to 'struct timer' 2011-08-27 11:30:34 +02:00
Jonathan Neuschäfer
4428894aba let doxygen find the source code
[Unfortunately,] @top_srcdir@ is replaced by the package's top-level
directory relative to the directory of the .in file being processed,
e.g. if you unpack the MPD source to /usr/src/mpd, and build it in the
same directory, @top_srcdir@/src/ in doc/doxygen.conf.in will be re-
placed by "../src/", and, as doxygen is invoked from the top directory,
is will expect the source code in /usr/src/src/, which is obviously
wrong.
To work around this problem, this patch changes @top_srcdir@ to
@abs_top_srcdir@, which expands to the absolute path of the top source
directory[1].

[1] http://www.gnu.org/s/hello/manual/autoconf/Preset-Output-Variables.html
2011-08-27 11:30:30 +02:00
Jonathan Neuschäfer
3d12d7de62 doc/developer.xml: change the coing style example return type to int 2011-08-27 11:27:32 +02:00
Jonathan Neuschäfer
87593f95d4 scripts/makedist.sh: fix test usage
Checkbashisms (part of the Debian devscripts) pionted this out.
2011-08-27 11:27:16 +02:00
Max Kellermann
11626e48bf input/curl: implement a hard-coded timeout of 10 seconds
Be sure to stop the operation at some point when the server isn't
responding.
2011-08-26 19:28:09 +02:00
Max Kellermann
4f021cbced input/curl: use the I/O thread
Background buffering and better timeout handling.  This patch sort of
obsoletes the input_plugin method buffer().
2011-08-25 19:20:57 +02:00
Max Kellermann
ba31d176c8 input/curl: eliminate attribute "eof"
Assume the flag is true when the "easy" CURL handle is NULL.  That
way, we don't need to keep track if CURL has sent us the "DONE"
information yet.
2011-08-25 19:20:28 +02:00
Max Kellermann
68edbc3e4a input/curl: release "easy" CURL handle as early as possible
Release it immediately when end-of-file has been reached.  We don't
need that handle anymore, because the rest is delivered from the
buffers.
2011-08-25 19:19:31 +02:00
Max Kellermann
5068227a46 input/curl: move code to input_curl_flush_buffers()
Allow closing the handle while preserving the remaining buffers.
2011-08-25 18:48:05 +02:00
Max Kellermann
f8f3bc89e7 input/curl: pass input_curl to fill_buffer()
Remove a cast.
2011-08-25 18:43:26 +02:00
Max Kellermann
635f7026b0 io_thread: add helper functions 2011-08-25 18:43:14 +02:00
Max Kellermann
0f1e4f0326 io_thread: move global variables into a struct 2011-08-25 18:43:05 +02:00
Max Kellermann
89355edb8a glib_compat.h: add g_timeout_source_new_seconds() 2011-08-25 18:42:44 +02:00
Max Kellermann
37c8f5c1da input/curl: set GError when init() fails
Let the caller know what happened, he's responsible for logging.
2011-08-25 08:43:05 +02:00
Max Kellermann
5bba2df526 input/soup: free all resources in method close() 2011-08-24 19:31:59 +02:00
Max Kellermann
1935694440 valgrind.suppressions: suppress g_resolver_get_default() 2011-08-24 19:31:59 +02:00
Max Kellermann
12dd6ea8bb valgrind.suppressions: suppress g_data_initialize()
This function initializes global variables.
2011-08-24 19:31:59 +02:00
Max Kellermann
a1f922b040 valgrind.suppressions: add libsoup suppressions 2011-08-24 19:31:59 +02:00
Max Kellermann
017cf088a1 valgrind.suppressions: add GType suppressions
libsoup uses GType.
2011-08-24 19:15:59 +02:00
Max Kellermann
df627cc417 valgrind.suppressions: suppress g_intern_static_string() 2011-08-24 19:15:59 +02:00
Max Kellermann
1b20300b73 valgrind.suppressions: use wildcards 2011-08-24 18:47:48 +02:00
Max Kellermann
3b9ffea36f input/soup: new input plugin based on libsoup
To demonstrate the new I/O thread.  libsoup is well-integrated into
the GLib main loop, which made this plugin pretty easy to write.

As a side effect, we have to initialize the I/O thread in all debug
programs that use the input API.
2011-08-24 03:33:49 +02:00
Max Kellermann
e242f3999c io_thread: new thread for non-blocking background I/O
Try to eliminate the remaining blocking I/O.
2011-08-24 02:55:05 +02:00
Max Kellermann
523f89cc8c input/curl: remove obsolete function input_curl_reinit() 2011-08-24 02:55:05 +02:00
Max Kellermann
0575a6d652 output/raop: use GLib byte order macros 2011-08-24 02:19:40 +02:00
Max Kellermann
08b88714e0 output/raop: use fill_int() in fill_time_...()
Eliminate duplicate code.
2011-08-24 02:18:51 +02:00
Max Kellermann
bcaff4b844 output/raop: check if the "host" option is present
Better than dereferencing NULL.
2011-08-24 01:47:31 +02:00
Max Kellermann
82f336a78f output/raop: remove excessive debug messages 2011-08-24 01:47:27 +02:00
Max Kellermann
350aa33022 output/raop: consistently use GError 2011-08-24 01:47:26 +02:00
Max Kellermann
d6290a2f1a output/raop: use GLib heap functions 2011-08-24 01:47:25 +02:00
Max Kellermann
71e9d08863 output/raop: functions that always succeed return void
No point in returning true, and checking that.
2011-08-24 01:47:23 +02:00
Max Kellermann
9729dc7594 output/raop: rtspcl_connect() returns false on error
.. and not -1, which is "true".
2011-08-24 01:47:22 +02:00
Max Kellermann
92c1b8f31e output/raop: error checking in send_control_command() 2011-08-24 01:47:21 +02:00
Max Kellermann
9ffa2604f8 output/raop: make some allocations static
Allocate objects on the stack to reduce heap overhead.
2011-08-24 01:47:20 +02:00
Max Kellermann
03b1fad4d4 output/raop: remove unused local variables 2011-08-24 01:47:18 +02:00
Max Kellermann
72eb4c534f output/raop: make some exec_request parameters const 2011-08-24 01:47:17 +02:00
Max Kellermann
47d936e9cc output/raop: use "char*" for string buffers
Not unsigned char.  Eliminate useless casts.
2011-08-24 01:47:15 +02:00
Max Kellermann
8e08407090 output/raop: make send_control_command() static
Only used internally.
2011-08-24 01:47:14 +02:00
Max Kellermann
c0a4558c62 output/raop: remove useless test_default_device() implementation
This defaults to "false" when the method pointer is NULL.
2011-08-24 01:47:13 +02:00
Max Kellermann
5ecb6fecc4 Merge branch 'v0.16.x' 2011-08-24 01:47:10 +02:00
Max Kellermann
b3df4dc2c9 output/pulse: fix deadlock when the stream was suspended
Check if the stream is suspended; wake up the main loop when it
becomes suspended.
2011-08-23 23:02:13 +02:00
Max Kellermann
3db9ab82ea output/pulse: add assertions 2011-08-23 22:48:22 +02:00
Max Kellermann
2dc3acc5f0 output/pulse: return 0 on error
Not a bool.
2011-08-23 22:48:22 +02:00
Max Kellermann
25686e5bce pulse/output: fix deadlock when resuming the stream
Unlock the mainloop in all code paths.
2011-08-23 22:45:47 +02:00
Max Kellermann
8d70f808d9 input/curl: limit the receive buffer size 2011-08-23 20:46:51 +02:00
Max Kellermann
7c887af1ea output/httpd: add assertions 2011-08-23 18:14:39 +02:00
Max Kellermann
b7f435b50e output/httpd: don't warn on client disconnect
This warning should only be logged when we really received something.
When the client disconnects, G_IO_IN is triggered, and the read
returns G_IO_STATUS_EOF.
2011-08-23 18:02:56 +02:00
Max Kellermann
d3b15f8fda decoder/mpcdec: fix gcc warning
Move the variable "vbr_update_acc" into the #ifdef block.
2011-08-23 17:58:56 +02:00
Jonathan Neuschäfer
eea726740b output/raop: rewrite remove_char_from_string 2011-07-25 11:23:22 +02:00
Max Kellermann
0ea4c970d7 Merge branch 'v0.16.x'
Conflicts:
	src/player_thread.c
	src/playlist_control.c
2011-07-20 21:46:05 +02:00
Max Kellermann
57936a1374 output/raop: use memset() instead of bzero()
There's no bzero() on WIN32.
2011-07-20 21:20:23 +02:00
Max Kellermann
9242fde6b8 output/raop: include winsock.h on WIN32 2011-07-20 21:18:55 +02:00
Max Kellermann
d1f653be65 output/raop: use GMutex instead of pthread_mutex_t
Be portable on WIN32.
2011-07-20 21:11:06 +02:00
Max Kellermann
0035dceb0a output/raop: add missing mutex unlock call in error handler 2011-07-20 21:09:39 +02:00
Max Kellermann
838f7cd210 encoder_plugin: add method pre_tag()
In the "vorbis" plugin, this is a copy of the old flush() method,
while flush() gets a lot of code remove, it just sets the "flush" flag
and nothing else.  It doesn't start a new stream now, which should fix
a few problems in some players.
2011-07-20 20:54:34 +02:00
Max Kellermann
13539961b2 output/httpd: explicitly convert size_t to bool in pause() 2011-07-20 19:16:47 +02:00
Max Kellermann
a26f2ef17d pipe: lock the mutex in music_pipe_size() 2011-07-20 19:05:32 +02:00
Max Kellermann
d97c46bcdc pipe: make read-only functions "pure"
Enable gcc optimizations.
2011-07-20 19:05:26 +02:00
Max Kellermann
2b6542467c output_thread: unlock the mutex while calling cancel()
The method may take longer, and we shouldn't be holding the lock.
2011-07-20 19:05:08 +02:00
Max Kellermann
8fa51faa38 player_thread: lock the player while setting the bite_rate 2011-07-20 19:04:54 +02:00
Max Kellermann
b2175629fd update_walk: apply follow_inside_symlinks to absolute symlinks 2011-07-20 14:15:20 +02:00
Max Kellermann
2e28ed8f81 wavpack: obey all decoder commands, stop at CUE track border
It used to ignore the decoder_data() return value.
2011-07-20 12:54:30 +02:00
Max Kellermann
4c4f8bf02a decoder/wavpack: use the correct integer types
libwavpack provides int32_t samples, and wants uin32_t for sample
counts.
2011-07-20 12:54:22 +02:00
Max Kellermann
e464be5f39 decoder/wavpack: simplify the WavpackUnpackSamples()==0 check
.. and remove one indent level.
2011-07-20 12:32:48 +02:00
Max Kellermann
d7d717f2ce playlist_control: don't resume playback when seeking to another song while paused
Use a shortcut in playlist_seek_song(), don't call
playlist_play_order() because that would reset the "paused" state.
2011-07-20 11:33:51 +02:00
Max Kellermann
d1eeed6a5b output/alsa: fix SIGFPE when alsa announces a period size of 0 2011-07-20 06:54:51 +02:00
Max Kellermann
b159bc0c5f queue: implement song "priorities"
Sorts remaining songs by priority.  This can be used for the
much-demanded "queue feature".
2011-07-19 00:34:33 +02:00
Jonathan Neuschäfer
a222c4879c output/shout: fix a memory leak 2011-07-19 00:24:48 +02:00
Max Kellermann
eb2f413cf0 Merge branch 'v0.16.x'
Conflicts:
	NEWS
	configure.ac
2011-07-19 00:24:20 +02:00
Max Kellermann
736fd0e293 decoder/ffmpeg: use avformat_open_input() if available
av_open_input_stream() has been deprecated.
2011-07-18 23:31:47 +02:00
Max Kellermann
6592ca9f88 decoder: use AVDictionary instead of AVMetadata
AVMetadata has been deprecated.
2011-07-18 23:31:31 +02:00
Max Kellermann
762712c756 database: require X_OK on parent directory, not R_OK
For accessing the child of a directory, one needs X_OK on the
directory.
2011-07-18 22:48:07 +02:00
Max Kellermann
73f9e17951 NEWS: fix memory leaks 2011-07-18 22:47:51 +02:00
Jonathan Neuschäfer
7d6a605a85 output/shout: fix a memory leak 2011-07-18 22:04:48 +02:00
Jonathan Neuschäfer
a6a8bdffc3 output/recorder: fix a memory leak 2011-07-18 22:04:10 +02:00
Jonathan Neuschäfer
296085ff23 output/httpd: add missing g_free in error path 2011-07-18 22:04:06 +02:00
Jonathan Neuschäfer
36aa8ce3c9 output/ao: add missing g_free in error path 2011-07-18 22:03:48 +02:00
Jonathan Neuschäfer
c49c69d6ea conf: add missing fclose in error path
This patch seems a bit ugly, maybe it would be a bit cleaner with gotos.
2011-07-18 22:03:40 +02:00
Jonathan Neuschäfer
d5684f7444 sticker: fix a memory leak 2011-07-18 22:03:37 +02:00
Jonathan Neuschäfer
affb4bd923 ape: add missing g_free in error path 2011-07-18 22:03:34 +02:00
Max Kellermann
65772a74e0 configure: correct avahi/bonjour state on result page
Was always displayed as "no", even if one was found.
2011-07-03 15:42:22 +02:00
Max Kellermann
cca2c2f4ca test/run_filter: remove unused variable "frame_size" 2011-07-03 15:21:40 +02:00
Max Kellermann
52e2fa91c4 test/read_conf: make variables more local 2011-07-03 15:20:39 +02:00
Max Kellermann
dca405a746 test/read_conf: fix -Wunused-but-set-variable 2011-07-03 15:20:28 +02:00
Skottish
e54748d355 decoder/ffmpeg: use AVIO_FLAG_READ on newer ffmpeg versions
FFmpeg/libav have dropped AVIO_RDONLY in favor of AVIO_FLAG_READ. This
patch fixes that in MPD.
2011-07-03 15:17:44 +02:00
Jonathan Ballet
3680a6bbbb doc/protocol: add some missing specifications 2011-07-03 15:05:04 +02:00
Max Kellermann
6aa6a9c272 decoder/flac: validate the sample rate when scanning the tag
Don't calculate the song duration when the sample rate is 0 (division
by zero crash).
2011-07-03 14:57:56 +02:00
oblique
8d1c7ca206 ffmpeg: workaround for semantic API change in recent ffmpeg versions 2011-07-03 14:54:56 +02:00
Tony Miller
52b8e0f9ec doc/user: Typo in playlist plugin documentation, 'playlist plugin' not 'filter'.
This patch fixes a typo in doc/user about playlist plugins.

Its in the top commit in my repository in a branch called 'doc_fix':
git://github.com/mcfiredrill/mpd.git
2011-07-03 14:53:37 +02:00
Max Kellermann
08e2e2e791 fd_util: add function socketpair_cloexec_nonblock() 2011-07-01 10:50:15 +02:00
Avuton Olrich
3c4f4793b5 Modify version string to post-release version 0.16.4~git 2011-06-04 07:37:34 -07:00
Max Kellermann
531c0067ec Makefile.am: distribute client_idle.h 2011-06-03 17:27:43 +02:00
Max Kellermann
e228caaca6 Merge branch 'v0.16.x'
Conflicts:
	src/decoder/ffmpeg_decoder_plugin.c
2011-06-03 16:58:09 +02:00
Qball Cow
9ac8f89b1d cue_tag: show CUE track numbers 2011-05-09 21:26:36 +02:00
Max Kellermann
c6a72a14ac decoder/ffpmeg: don't use av_metadata_conv() in ffmpeg 0.7
It's a no-op and deprecated.
2011-05-09 21:24:18 +02:00
Max Kellermann
c74edd0e33 decoder/ffmpeg: use AVIOContext instead of ByteIOContext 2011-05-09 21:23:58 +02:00
Max Kellermann
98acf3f281 input/ffmpeg: use the new AVIOContext API
URLContext is deprecated.
2011-05-09 21:23:24 +02:00
Max Kellermann
fe30db935b decoder/ffmpeg: use avcodec_decode_audio3() if available
avcodec_decode_audio3() has been added in libavformat 52.25.0, and the
predecessor avcodec_decode_audio2() has been deprecated.
2011-04-12 08:20:35 +02:00
Max Kellermann
6303d54cbb decoder/ffmpeg: make variables more local 2011-04-12 08:17:30 +02:00
Anton Khirnov
9d91aa23e6 decoder/ffmpeg: drop support for pre-0.5 ffmpeg
All modern distros ship 0.5, so there's no need to support old and buggy
ffmpeg versions.
2011-04-12 08:14:14 +02:00
Max Kellermann
c2ada39fd3 Merge branch 'v0.16.x'
Conflicts:
	NEWS
	configure.ac
2011-04-12 08:11:33 +02:00
Simon Kagstrom
77b6e27500 playlist: Despotify plugin: Correct init in daemon mode
There is a global despotify session, so it should not be initialized
until needed.
2011-04-12 07:28:00 +02:00
Simon Kagstrom
99640171e2 doc: Add despotify user documentation 2011-04-12 07:27:59 +02:00
Simon Kagstrom
38b3ab791f doc: INSTALL: Add despotify dependencies 2011-04-12 07:27:59 +02:00
Simon Kagstrom
a86fc52eea configure.ac: Correct error message for missing despotify package 2011-04-12 07:27:59 +02:00
Jonathan Neuschäfer
6d3ed3f16f fix common misspellings
These fixes were mostly generated with `codespell' [0] and manually
reviewed.

[0] http://git.profusion.mobi/cgit.cgi/lucas/codespell/
2011-03-31 21:46:01 +02:00
Simon Kagstrom
be798998bf build: Add despotify to build system 2011-03-29 17:01:16 +02:00
Simon Kagstrom
c3b425d570 doc: Add configuration help for despotify 2011-03-29 17:01:16 +02:00
Simon Kagstrom
a25743875f playlist: Add despotify playlist plugin
For spotify playlists or tracks. Uses a spt uri, so with mpc you can
add playlists with

  mpc load spt://spotify:user:simon.kagstrom:playlist:3SUwkOe5VbVHysZcidEZtH
2011-03-29 17:01:16 +02:00
Simon Kagstrom
124d1a5942 input: Add despotify input plugin
For Spotify tracks. Uses a spt URI, so with mpc you can play tracks
with e.g.,

  mpc add spt://spotify:track:5qENVY0YEdZ7fiuOax70x1
  mpc play

Uses the pcm_decoder_plugin for the output
2011-03-29 17:01:16 +02:00
Simon Kagstrom
eec77b3ae7 despotify: Add support utilities
Used to connect and authenticate to despotify. Provides a singleton
session and a desptoify-track-to-tags function.
2011-03-29 17:01:16 +02:00
Simon Kagstrom
640bac1aa4 decoder: PCM decoder: Inherit seekable from the input stream
E.g., spotify isn't seekable.
2011-03-23 22:13:11 +01:00
Simon Kagstrom
0b12fae84d decoder: PCM decoder: Break loop if EOF is encountered
Otherwise the song playing might go on forever.
2011-03-23 22:13:08 +01:00
Hans-Kristian Arntzen
d9353c4fd3 Remove unused headers in Roar plugin.
Should fix build errors for Win32.
2011-03-23 21:59:22 +01:00
Max Kellermann
0c9fc2f809 Merge commit 'release-0.16.2'
Conflicts:
	Makefile.am
	NEWS
	configure.ac
2011-03-19 09:58:07 +01:00
Hans-Kristian Arntzen
1a954748a0 RoarAudio output plugin 2011-03-16 17:57:47 +01:00
Max Kellermann
2abad0f479 command: "update" and "rescan" need only "CONTROL" permission
From http://bugs.debian.org/513291

 "In mpd.conf, the "admin" permission covers updating the db and
 killing mpd.

 "Since there are quite some usecases in which the user can upload
 music to the mpd's directory by means of anonymous FTP or so, it is
 desirable that any user may issue a db update, while killing the mpd
 should not be possible.

 "I'd suggest to remove the db update from the admin group and either
 add it to "control" or an own group."
2011-02-27 23:35:00 +01:00
Max Kellermann
2fb40fe728 playlist_state: add option "restore_paused"
When set, MPD will not auto-start playback on startup; it will be in
"paused" state.
2011-02-23 09:10:23 +01:00
Max Kellermann
b57330cf75 playlist_state: declare local variable as enum 2011-02-23 09:10:23 +01:00
Max Kellermann
8cd91fabf9 configure.ac: disable -Wno-deprecated-declarations 2011-02-23 09:01:53 +01:00
Max Kellermann
e0580ee385 configure.ac: protocol version 0.17
The client-to-client protocol was added, and that justifies increasing
the protocol version.
2011-02-22 09:16:32 +01:00
Thomas Jansen
144d092637 output/shout: add possibility to set url
Added a new optional parameter for the shout plugin called "url".
2011-02-09 22:42:51 +01:00
Thomas Jansen
2bde9afdb9 configure.ac: fix copy&paste error 2011-01-29 13:49:32 +01:00
Max Kellermann
f8b09c194f protocol: support client-to-client communication 2011-01-29 10:43:54 +01:00
Max Kellermann
0e69ad32c1 client_idle: export client_idle_add() 2011-01-29 10:43:54 +01:00
Max Kellermann
9b4e14df71 client_idle: add header client_idle.h 2011-01-29 10:43:54 +01:00
Max Kellermann
03f7803f26 test/read_mixer: add workaround for missing RAOP symbols 2011-01-29 10:43:54 +01:00
Max Kellermann
c6cbcc2c25 copyright year 2011 2011-01-29 10:13:54 +01:00
Ian Zimmerman
27aa34d4ae input/curl: enable CURLOPT_NETRC
I wanted mpd to play a mp3 stream from a music website.  The stream is
only available to subscribers, which restriction is enforced through
normal http authentication.  However, the URL I get from the website
is not the final URL of the stream, but a generic URL which points to
the real one through a redirect (code 301).  Thus, I cannot predict
the final URL, and so I cannot use the username:password hack to force
the authentication, and mpd (libcurl on mpds behalf) fails to grab the
stream.

libcurl allows the option CURLOPT_NETRC to be set and then the
credentials can be stored in the good old .netrc file (in this case it
would be ~mpd/.netrc, of course).  But mpd doesn't set this option.  I
think it should.
2011-01-29 08:43:30 +01:00
Dustin Puckett
79e0db4ca0 output/raop: new output plugin
Remote Audio Output Protocol (RAOP), for Apple devices.
2011-01-28 21:17:09 +01:00
Yuriy Kaminskiy
9ae3acf2e7 mpg123 decoder: implement seeking 2011-01-21 15:37:08 +01:00
Yuriy Kaminskiy
731ea9b489 mpg123 decoder: report bitrate 2011-01-21 15:37:08 +01:00
Max Kellermann
18b30b5019 decoder_thread: fix assertion failure at song end
Don't finish the current command twice.

This bug was never noticed, but was revealed by a new assertion check.
2011-01-16 17:52:03 +01:00
Max Kellermann
24d51b9d14 doc: add a list of encoder plugins 2011-01-10 23:13:01 +01:00
Max Kellermann
a1edc199df output_control: document internal functions 2011-01-10 22:16:44 +01:00
Max Kellermann
db4aa81528 output_control: move code to ao_lock_command() 2011-01-10 21:54:43 +01:00
Max Kellermann
319ba94a52 output_control: ao_command() calls ao_command_async()
Merge some code.
2011-01-10 21:52:38 +01:00
Max Kellermann
1025f0be91 update_remove: use plain GCond instead of notify
GMutex/GCond guarantee that the access to removed_song is protected.
2011-01-10 21:40:15 +01:00
Max Kellermann
77d3b5e8f1 include cleanup 2011-01-10 21:38:11 +01:00
Max Kellermann
a0ad96a787 decoder_control: store GCond object, not a player_control
Remove the decoder dependency on player_control.  All player_control
was needed for is to signal the player thread, and we can do that with
a simple GCond as well.
2011-01-10 21:27:43 +01:00
Max Kellermann
39c5af5dbc decoder_thread: move code to decoder_command_finished_locked() 2011-01-10 21:08:16 +01:00
Max Kellermann
acca6a799b decoder_control: remove unused function dc_command_wait()
Only dc_command_wait_locked() is really being used.
2011-01-10 21:08:16 +01:00
Max Kellermann
b77e62260a decoder_control: replace dc_init() with dc_new()
dc_new() allocates the object and returns it.  dc_free() frees it
(replaces dc_deinit()).
2011-01-10 20:46:04 +01:00
Max Kellermann
b6995ca011 player_control: removed the global variable "pc"
Allocate a player_control object where needed, and pass it around.
Each "client" object is associated with a "player_control" instance.

This prepares multi-player support.
2011-01-10 19:46:23 +01:00
Max Kellermann
715844fd08 dbUtils: don't use directoryAddSongToPlaylist() twice
In findAddInDirectory(), call playlist_append_song() directly, to have
some more type checking.
2011-01-10 19:46:14 +01:00
Max Kellermann
2b29ca796e Merge commit 'release-0.16.1'
Conflicts:
	NEWS
2011-01-10 11:47:14 +01:00
Max Kellermann
5184008812 input_init: add assertions on completeness of plugins 2011-01-08 18:27:57 +01:00
Max Kellermann
cf696ce443 input/cdio_paranoia: add module name
Seems like we forgot to give this module a name...  this can crash MPD
on startup.
2011-01-08 18:27:57 +01:00
Max Kellermann
1a2ea4c06c Merge branch 'v0.16.x'
Conflicts:
	NEWS
	configure.ac
2011-01-07 23:52:23 +01:00
Anton Khirnov
a800afcbf8 docs: mention 'sticker' idle event 2011-01-05 13:03:17 +01:00
Ben Kibbey
ff4534613a Build fix for Linux. Define _GNU_SOURCE in src/server_socket.c. 2010-12-27 04:36:23 +01:00
Max Kellermann
b8fe2c74bc Makefile.am: generate doxygen.conf
Don't create a modified copy for out-of-tree builds.
2010-12-24 00:25:31 +01:00
Max Kellermann
be3b5199b0 stored_playlist: remove database lookups from spl_load()
Don't look up songs in the database, no caller needs this.
2010-12-23 16:25:37 +01:00
Max Kellermann
d849a40af6 stored_playlist: ignore empty lines 2010-12-23 16:25:22 +01:00
Max Kellermann
4f48c10312 stored_playlist: use the text_file library to read lines 2010-12-23 16:25:05 +01:00
Max Kellermann
5274fee8a7 playlist_song: add flag "secure"
Optionally allow all local files.

"Insecure" mode is used for printing playlists.
2010-12-23 16:24:00 +01:00
Max Kellermann
5462f34ed0 string_util: add function strchug_fast()
Replace g_strchug() calls with a cheaper implementation.
2010-12-23 16:23:20 +01:00
Max Kellermann
0958ed5844 utils: move string_array_contains() to string_util.c 2010-12-23 16:23:04 +01:00
Max Kellermann
e3cba18532 decoder: new "pcm" decoder plugin
Just there to support the "cdio_paranoia" input plugin.
2010-12-22 09:48:48 +01:00
Max Kellermann
9bf7fde49f configure.ac: hook the cdio_paranoia input plugin 2010-12-22 09:44:02 +01:00
Max Kellermann
4783ebc918 input/cdda: rename plugin to "cdio_paranoia" 2010-12-22 09:43:57 +01:00
Max Kellermann
8bda52783b input/cdda: support reading the whole disc 2010-12-22 09:43:53 +01:00
Max Kellermann
07feec7ea6 input/cdda: remove unused function input_cdda_archive_extract_trackno() 2010-12-22 09:43:49 +01:00
Max Kellermann
e7471f589a input/cdda: import missing pcm16_to_wave() from the wave encoder 2010-12-22 09:43:47 +01:00
Max Kellermann
24208be5cf input/cdda: implement parse_cdda_uri()
Was missing.
2010-12-22 09:43:41 +01:00
Max Kellermann
8db5f66498 input/cdda: call input_cdda_close() with an input_stream pointer
Another build fix.
2010-12-22 09:43:27 +01:00
Max Kellermann
be670bfd1f input/cdda: move code to cdda_detect_drive() 2010-12-22 09:43:20 +01:00
Max Kellermann
19acf090ed input/cdda: remove newlines from error messages 2010-12-22 09:43:16 +01:00
Max Kellermann
2de7f6b457 input/cdda: remove debug code 2010-12-22 09:42:10 +01:00
Max Kellermann
a2e265e9a2 input/cdda: some general build failure fixes 2010-12-22 07:44:56 +01:00
Viliam Mateicka
28d7b29d72 input_cdda_plugin: new plugin to handle cdda:// protocol to access CD-DA audio CD's 2010-12-22 07:36:14 +01:00
Greg Ward
9cb4aaf3c2 osx_output: always pass OS X result code to g_set_error().
Should be safe on OS X 10.4 (32-bit), since Apple's OSStatus boils
down to "signed long", and g_set_error() takes gint, which is really
just "int".  Assigning "signed long" to "int" on 32-bit Unix should be
just fine, since both are signed 32-bit ints.

No idea if this is safe on 64-bit OS X.
2010-12-21 07:37:54 +01:00
Greg Ward
80dc602193 osx_output: allow user to specify other audio devices.
Add new config parameter 'device' to audio_output type "osx":
- if not supplied or set to "default", open default device
- if set to "system", open system device
- otherwise 'device' should be an audio device name: mpd will find and
  open the specified audio device, falling back to the default
  device if it's not found
2010-12-21 07:36:28 +01:00
Avuton Olrich
c7f5a87258 Modify version string to post-release version 0.17~git 2010-12-11 04:19:49 -08:00
1854 changed files with 165514 additions and 74911 deletions

66
.gitignore vendored
View File

@@ -1,61 +1,11 @@
*.Plo
*.Po
*.a
*.bz2
*.d
*.gz
*.la
*.lo
*.o
.deps
.dirstamp
Makefile
Makefile.in
aclocal.m4
autom4te.cache
compile
config.guess
config.h
config.h.in
config.log
config.mk
config.status
config.sub
config_detected.h
config_detected.mk
configure
configure.lineno
depcomp
depmode
install-sh
libtool
ltmain.sh
missing
mkinstalldirs
mpd
mpd.exe
stamp-h1
tags
*~
.#*
.stgit*
doc/protocol.html
doc/protocol
doc/user
doc/developer
doc/sticker
doc/api
test/software_volume
test/run_convert
test/run_decoder
test/read_tags
test/run_filter
test/run_encoder
test/run_output
test/read_conf
test/run_input
test/read_mixer
test/dump_playlist
test/run_normalize
test/tmp
test/run_inotify
/output/
__pycache__/
/.clangd/
/compile_commands.json

179
.travis.yml Normal file
View File

@@ -0,0 +1,179 @@
language: cpp
jobs:
include:
# Ubuntu Bionic (18.04) with GCC 7
- os: linux
dist: bionic
addons:
apt:
sources:
- sourceline: 'ppa:deadsnakes/ppa' # for Python 3.7 (required by Meson)
packages:
- libgtest-dev
- libboost-dev
- python3.6
- python3-urllib3
- ninja-build
before_install:
- wget https://bootstrap.pypa.io/get-pip.py
- /usr/bin/python3.6 get-pip.py --user --no-cache-dir
install:
- /usr/bin/python3.6 $HOME/.local/bin/pip install --user meson --no-cache-dir
env:
- MATRIX_EVAL="export PATH=\$HOME/.local/bin:\$PATH"
# Ubuntu Bionic (18.04) with GCC 7 on big-endian
- os: linux
arch: s390x
dist: bionic
addons:
apt:
sources:
- sourceline: 'ppa:deadsnakes/ppa' # for Python 3.7 (required by Meson)
packages:
- libgtest-dev
- libboost-dev
- python3.6
- python3-urllib3
- ninja-build
before_install:
- wget https://bootstrap.pypa.io/get-pip.py
- /usr/bin/python3.6 get-pip.py --user --no-cache-dir
install:
- /usr/bin/python3.6 $HOME/.local/bin/pip install --user meson --no-cache-dir
env:
- MATRIX_EVAL="export PATH=\$HOME/.local/bin:\$PATH"
# Ubuntu Bionic (18.04) with GCC 7 on ARM64
- os: linux
arch: arm64
dist: bionic
addons:
apt:
sources:
- sourceline: 'ppa:deadsnakes/ppa' # for Python 3.7 (required by Meson)
packages:
- libgtest-dev
- libboost-dev
- python3.6
- python3-urllib3
- ninja-build
before_install:
- wget https://bootstrap.pypa.io/get-pip.py
- /usr/bin/python3.6 get-pip.py --user --no-cache-dir
install:
- /usr/bin/python3.6 $HOME/.local/bin/pip install --user meson --no-cache-dir
env:
- MATRIX_EVAL="export PATH=\$HOME/.local/bin:\$PATH"
# Ubuntu Trusty (16.04) with GCC 6
- os: linux
dist: trusty
addons:
apt:
sources:
- ubuntu-toolchain-r-test
- sourceline: 'ppa:mhier/libboost-latest'
- sourceline: 'ppa:mstipicevic/ninja-build-1-7-2'
- sourceline: 'ppa:deadsnakes/ppa' # for Python 3.7 (required by Meson)
packages:
- g++-6
- libgtest-dev
- boost1.67
- python3.6
- python3-urllib3
- ninja-build
before_install:
- wget https://bootstrap.pypa.io/get-pip.py
- /usr/bin/python3.6 get-pip.py --user --no-cache-dir
install:
- /usr/bin/python3.6 $HOME/.local/bin/pip install --user meson --no-cache-dir
env:
# use gold as workaround for https://sourceware.org/bugzilla/show_bug.cgi?id=17068
- MATRIX_EVAL="export CC='ccache gcc-6' CXX='ccache g++-6' LDFLAGS=-fuse-ld=gold PATH=\$HOME/.local/bin:\$PATH"
# Ubuntu Trusty (16.04) with GCC 8
- os: linux
dist: trusty
addons:
apt:
sources:
- ubuntu-toolchain-r-test
- sourceline: 'ppa:mhier/libboost-latest'
- sourceline: 'ppa:mstipicevic/ninja-build-1-7-2'
- sourceline: 'ppa:deadsnakes/ppa' # for Python 3.7 (required by Meson)
packages:
- g++-8
- libgtest-dev
- boost1.67
- python3.6
- python3-urllib3
- ninja-build
before_install:
- wget https://bootstrap.pypa.io/get-pip.py
- /usr/bin/python3.6 get-pip.py --user --no-cache-dir
install:
- /usr/bin/python3.6 $HOME/.local/bin/pip install --user meson --no-cache-dir
env:
# use gold as workaround for https://sourceware.org/bugzilla/show_bug.cgi?id=17068
- MATRIX_EVAL="export CC='ccache gcc-8' CXX='ccache g++-8' LDFLAGS=-fuse-ld=gold PATH=\$HOME/.local/bin:\$PATH"
- os: osx
osx_image: xcode9.4
addons:
homebrew:
packages:
- ccache
- meson
- icu4c
- ffmpeg
- libnfs
- yajl
- libupnp
- libid3tag
- chromaprint
- libsamplerate
- libsoxr
# libzzip appears to be broken on Homebrew: "ld: library not found for -lzzip"
#- libzzip
- flac
- opus
- libvorbis
- faad2
- wavpack
- libmpdclient
update: true
env:
- MATRIX_EVAL="export PATH=/usr/local/opt/ccache/libexec:$PATH HOMEBREW_NO_ANALYTICS=1"
cache:
apt: true
ccache: true
directories:
- $HOME/Library/Caches/Homebrew
before_cache:
- test "$TRAVIS_OS_NAME" != "osx" || brew cleanup
before_install:
- eval "${MATRIX_EVAL}"
install:
# C++14
# Work around "Target /usr/local/lib/libgtest.a is a symlink
# belonging to nss. You can unlink it" during gtest install
- test "$TRAVIS_OS_NAME" != "osx" || brew unlink nss
- test "$TRAVIS_OS_NAME" != "osx" || brew install https://gist.githubusercontent.com/Kronuz/96ac10fbd8472eb1e7566d740c4034f8/raw/gtest.rb
before_script:
- ccache -s
script:
- eval "${MATRIX_EVAL}"
- OPTIONS="-Dtest=true"
- meson . output --werror $OPTIONS
- ninja -C output -v test
- ccache -s

112
AUTHORS
View File

@@ -1,67 +1,49 @@
Current Developers
------------------
Music Player Daemon - http://www.musicpd.org
Copyright 2003-2018 The Music Player Daemon Project
Avuton Olrich <avuton@gmail.com>
release manager
The following people have contributed code to MPD:
Max Kellermann <max@duempel.org>
lead developer
Laszlo Ashin <kodest@gmail.com>
WavPack support
Viliam Mateicka <viliam.mateicka@gmail.com>
FFmpeg support, mixer and archive API
Eric Wollesen <encoded@xmtp.net>
encoder API, shout output
Thomas Jansen <mithi@mithi.net>
multithreading tweaks, miscellaneous
Romain Bignon <romain@peerfuse.org>
playlist manipulation
David Guibert <david.guibert@gmail.com>
PulseAudio mixer
Jochen Keil <jochen.keil@gmail.com>
CUE sheet support
Jeffrey Middleton <jefromi@gmail.com>
playlist manipulation
Sean McNamara <smcnam@gmail.com>
WIN32 compatibility
Former Developers
-----------------
Warren Dukes <warren.dukes@gmail.com>
former lead developer and project founder
Niklas Hofer
'next' and 'previous' patch
Jim Ramsay <i.am@jimramsay.com>
Zerconf/avahi support
Guus Sliepen <guus@sliepen.eu.org>
libsamplerate code
J. Alexander Treuman <jat@spatialrift.net>
general, MP3, ID3, PulseAudio, format conversion, stored playlists
AudioCompress, much much more...
Eric Wong
former lead developer
José Anarch <anarchsss@gmail.com>
JACK plugin
Patrik Weiskircher <pat@icore.at>
Stored playlist commands
Nick Welch <mack@incise.org>
Sighandlers
Warren Dukes <warren.dukes@gmail.com>
Avuton Olrich <avuton@gmail.com>
Max Kellermann <max.kellermann@gmail.com>
Laszlo Ashin <kodest@gmail.com>
Viliam Mateicka <viliam.mateicka@gmail.com>
Eric Wollesen <encoded@xmtp.net>
Thomas Jansen <mithi@mithi.net>
Romain Bignon <romain@peerfuse.org>
David Guibert <david.guibert@gmail.com>
Jochen Keil <jochen.keil@gmail.com>
Jeffrey Middleton <jefromi@gmail.com>
Sean McNamara <smcnam@gmail.com>
Niklas Hofer
Jim Ramsay <i.am@jimramsay.com>
Guus Sliepen <guus@sliepen.eu.org>
J. Alexander Treuman <jat@spatialrift.net>
Eric Wong
José Anarch <anarchsss@gmail.com>
Patrik Weiskircher <pat@icore.at>
Nick Welch <mack@incise.org>
Jonathan Neuschäfer <j.neuschaefer@gmx.net>
Anton Khirnov <anton@khirnov.net>
Simon Kagstrom <simon.kagstrom@gmail.com>
Denis Krjuchkov <denis@crazydev.net>
Jurgen Kramer <gtmkramer@xs4all.nl>
Jean-Francois Dockes <jf@dockes.org>
Yue Wang <yuleopen@gmail.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>
Andrew Basterfield <abasterfield@gmail.com>
Bart Nagel <bart@tremby.net>
Christian Kröner <ckroener@gmx.net>
Christopher Zimmermann <madroach@gmerlin.de>
John Regan <john@jrjrtech.com>
Joshua Wise <joshua@joshuawise.com>
Ryan Walklin
Stefan Roellin <stefan@roellin-baumann.ch>
Stefano Miccoli <stefano.miccoli@polimi.it>
Steven O'Brien <steven_obrien1@yahoo.co.uk>
Thomas Zander <thomas.e.zander@googlemail.com>

214
INSTALL
View File

@@ -1,214 +0,0 @@
Music Player Daemon (MPD) - INSTALL
Introduction
------------
This document is a very small amount of documentation about what is needed to
install MPD. If more information is desired see the community wiki at
http://mpd.wikia.com.
Dependencies
------------
gcc - http://gcc.gnu.org/
Any other C99 compliant compiler should also work.
GLib 2.12 - http://www.gtk.org/
General-purpose utility library.
Optional Output Dependencies
----------------------------
You will need at least one of these to compile MPD.
Most of these are available as packages on major distributions. Be sure to
install both the library package as well as the development package.
AO - http://www.xiph.org/ao/
A portable library that abstracts many audio output types as one API. Should
be used only if there is no native plugin available or if the native plugin
doesn't work. You will need libao.
ALSA - http://www.alsa-project.org/
The Advanced Linux Sound Architecture. Recommended audio output if you use
Linux. You will need libasound.
FIFO
This is a mostly undocumented, developer plugin to transmit raw data.
MVP - http://en.wikipedia.org/wiki/Hauppauge_MediaMVP
A network media player.
OSS - http://www.opensound.com
Open Sound System.
OSX - http://www.apple.com
Necessary if you are on Mac OSX.
PulseAudio - http://www.pulseaudio.org/
An advanced sound daemon. You will need libpulse.
JACK - http://www.jackaudio.org/
A low-latency sound daemon.
libshout - http://www.icecast.org/
For streaming to an Icecast or Shoutcast server.
You also need an encoder: either libvorbisenc (ogg), or liblame (mp3).
OpenAL - http://kcat.strangesoft.net/openal.html
Open Audio Library
libffado - http://www.ffado.org/
For FireWire audio devices.
Optional Input Dependencies
---------------------------
You will need at least one of these to compile MPD.
Most of these are available as packages on major distributions. Be sure to
install both the library package as well as the development package.
MAD - http://www.underbit.com/products/mad/
For MP3 support. You will need libmad, and optionally libid3tag if you want
ID3 tag support.
libmpg123 - http://www.mpg123.de/
Alternative for MP3 support.
Ogg Vorbis - http://www.xiph.org/ogg/vorbis/
For Ogg Vorbis support. You will need libogg and libvorbis.
FLAC - http://flac.sourceforge.net/
For FLAC support. You will need version 1.1.0 or higher of libflac.
OggFLAC - http://www.xiph.org/ogg/vorbis/ and http://flac.sourceforge.net/
For OggFLAC support. You will need liboggflac, which can be built from the
FLAC sources if libogg is already installed. Versions of flac 1.1.3 and
greater will automatically detect and use OggFLAC if it's available.
Audio File - http://www.68k.org/~michael/audiofile/
For WAVE, AIFF, and AU support. You will need libaudiofile.
FAAD2 - http://www.audiocoding.com/
For MP4/AAC support. You will need libmp4ff.
libmpcdec - http://www.musepack.net/
For Musepack support.
MikMod - http://mikmod.raphnet.net/
For MOD support. You will need libmikmod.
libavcodec, libavformat (ffmpeg) - http://ffmpeg.mplayerhq.hu/
Multi-codec library.
libsidplay2 - http://sidplay2.sourceforge.net/
For C64 SID support.
libfluidsynth - http://fluidsynth.resonance.org/
For MIDI support (DO NOT USE - use libwildmidi instead)
libwildmidi - http://wildmidi.sourceforge.net/
For MIDI support.
libsndfile - http://www.mega-nerd.com/libsndfile/
WAVE, AIFF, and many others.
libwavpack - http://www.wavpack.com/
For WavPack playback.
Optional Miscellaneous Dependencies
-----------------------------------
Avahi - http://www.avahi.org/
For Zeroconf support.
libsamplerate - http://www.mega-nerd.com/SRC/
For advanced samplerate conversions.
libcurl - http://curl.haxx.se/
For playing HTTP streams.
libmms - https://launchpad.net/libmms
For playing MMS streams.
SQLite - http://www.sqlite.org/
For the sticker database.
libcue - http://libcue.sourceforge.net/
For CUE sheet support.
pkg-config
----------
MPD uses pkg-config to locate most external libraries. If you do not
have pkg-config, or if your version of the library does not ship the
".pc" file, you have to provide the library's build options in
environment variables. These variables are documented in "./configure
--help". Example:
FLAC_CFLAGS=-I/usr/include/FLAC FLAC_LIBS=-lFLAC ./configure
Download
--------
Get the latest release from of MPD from <http://www.musicpd.org/>.
Compile
-------
1) unzip and untar the archive
$ tar zxvf mpd-x.x.x.tar.gz
or
$ tar jxvf mpd-x.x.x.tar.bz2
2) change to directory created
$ cd mpd-x.x.x
3) Run configure script (this will determine what dependencies you have)
$ ./configure
4) Compile
$ make
Install (Optional)
-------
(as root)
$ make install
Run
---
1) run mpd:
$ mpd <config file>
First default is ~/.mpdconf then ~/.mpd/mpd.conf then /etc/mpd.conf. If
neither of these exist a mpd configuration file must be specified at
runtime.
A sample config file is included with the source of MPD, mpdconf.example.
The first time MPD is run it will attempt to discover all music in your
music root, recursively. This can be affected by the symbolic link
options specified in the example mpd.conf.
Using MPD
---------
You can download many different interfaces for MPD at
<http://mpd.wikia.com/wiki/Clients>
MPD can be interfaced directly using telnet (see COMMANDS, if you are brave).

File diff suppressed because it is too large Load Diff

1469
NEWS

File diff suppressed because it is too large Load Diff

17
README
View File

@@ -1,17 +0,0 @@
Music Player Daemon (MPD)
http://www.musicpd.org
A daemon for playing music of various formats. Music is played through the
server's audio device. The daemon stores info about all available music,
and this info can be easily searched and retrieved. Player control, info
retrieval, and playlist management can all be managed remotely.
For basic installation information see the INSTALL file.
MPD is released under the GNU General Public License version 2, which is
distributed in the COPYING file.
You should have received a copy of the GNU General Public License along with
this program. If not, see <http://www.gnu.org/licenses/>.

29
README.md Normal file
View File

@@ -0,0 +1,29 @@
# Music Player Daemon
http://www.musicpd.org
A daemon for playing music of various formats. Music is played through the
server's audio device. The daemon stores info about all available music,
and this info can be easily searched and retrieved. Player control, info
retrieval, and playlist management can all be managed remotely.
For basic installation instructions
[read the manual](https://www.musicpd.org/doc/user/install.html).
# Users
- [Manual](http://www.musicpd.org/doc/user/)
- [Forum](http://forum.musicpd.org/)
- [IRC](irc://chat.freenode.net/#mpd)
- [Bug tracker](https://github.com/MusicPlayerDaemon/MPD/issues/)
# Developers
- [Protocol specification](http://www.musicpd.org/doc/protocol/)
- [Developer manual](http://www.musicpd.org/doc/developer/)
# Legal
MPD is released under the
[GNU General Public License version 2](https://www.gnu.org/licenses/gpl-2.0.txt),
which is distributed in the COPYING file.

View File

@@ -1,92 +0,0 @@
Music Player Daemon (MPD) - UPGRADING
Upgrading to 0.14
-----------------
The filesystem character set is determined by GLib, if it is not
configured. GLib has an affinity towards UTF-8, while older MPD
versions used to choose ISO-Latin-1.
Upgrading to 0.13.0
-------------------
JACK, Avahi, and libsamplerate have been added as optional dependencies.
FLAC/OggFLAC now supports the 1.1.3 API, and libmikmod 3.2.0 betas are
supported as well.
New mpd.conf parameters include zeroconf_name, samplerate_converter, and
gapless_mp3_playback. See the mpd.conf man page or updated mpconf.example for
more information on these parameters.
Support for the ID3v2 "Original Artist/Performer" tag has been added. Your
MP3s will need to be rescanned for these tags to be included in the database.
This can be done by running mpd --create-db.
Upgrading to 0.12.0
-------------------
The ao_driver and ao_driver_options config parameters have been removed and
replaced with the audio_output config section. You will have to update your
config file to use this instead. See the mpd.conf man page or the new
mpdconf.example for details on specifying audio_output sections.
The db_file parameter is no longer optional. If you did not specify it in your
old config file then you will have to add it in order to run 0.12.0.
Support for OggFLAC and Musepack audio files has been added. Additionally,
scanning of MP3 files has been improved. To make use of these updates it is
highly recommended that you run mpd --create-db to recreate your entire
database.
Upgrading to 0.11.0
-------------------
The database format has changed a little bit, but in a backward compatible way.
This means that if you upgrade to 0.11.0 from 0.10.x, you do not need to make
any changes. However, if you downgrade back to 0.10.x, then you will need
to recreate your db.
The default port for MPD is now 6600, so update your mpd and client
configurations appropriately.
Upgrading to 0.10.0
-------------------
All information is now stored in the db in UTF-8 format, and the character
set used for the filesystem is stored in the db. Thus, it is highly
recommended that you recreate the db. To do so, run mpd with the
"--create-db" command line option. Also, note that the filesystem
character set will be determined from your current locale settings.
If your locale settings are not the same as those used for the filesystem,
then use the config file parameter "filesystem_charset" to specify the
correct character set (this maybe necessary if you create the db with root).
Upgrading to 0.9.3
------------------
Wave support was added, so to have your wave files added, update the db (mpc
update).
Also, song lengths are now stored in the db. To get this stuff
added to the db, you will need to recreate the db from scratch. To do this,
run mpd with the "--create-db" commandline option.
Upgrading to 0.9.0
------------------
The "stop_on_error" config parameter was removed, so be sure to remove this
parameter from your config file.
Upgrading to 0.8.x
------------------
If you have FLACs, then to have them added to your list of available music,
just use "update".
Upgrading from 0.5.x to 0.6.x
-----------------------------
If you have not compiled MPD with "make ogg", then nothing is needed.
If you compiled with "make ogg", just use "update" (available via the phpMp
interface) to add your OGGs to MPD's list of available music.

View File

@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.musicpd"
android:installLocation="auto"
android:versionCode="49"
android:versionName="0.21.26">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28"/>
<uses-feature android:name="android.software.leanback"
android:required="false" />
<uses-feature android:name="android.hardware.touchscreen"
android:required="false" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<application android:allowBackup="true"
android:icon="@drawable/icon"
android:banner="@drawable/icon"
android:label="@string/app_name">
<activity android:name=".Settings"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Settings"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".Receiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service android:name=".Main" android:process=":main"/>
</application>
</manifest>

View File

@@ -0,0 +1,21 @@
#!/bin/sh -e
S=`dirname "$0"`
ANDROID_ABI=$1
STRIP=$2
ZIP=$3
UNSIGNED_APK=$4
LIBMPD_SO=$5
CLASSES_DEX=$6
RESOURCES_APK=$7
D=`dirname "$UNSIGNED_APK"`
rm -rf "$D/apk"
mkdir -p "$D/apk/lib/$ANDROID_ABI"
"$STRIP" "$LIBMPD_SO" -o "$D/apk/lib/$ANDROID_ABI/`basename $LIBMPD_SO`"
cp "$CLASSES_DEX" "$D/apk/"
cp "$RESOURCES_APK" "$UNSIGNED_APK"
cd "$D/apk"
exec zip -q -r -X "../`basename $UNSIGNED_APK`" .

59
android/apk/meson.build Normal file
View File

@@ -0,0 +1,59 @@
unsigned_apk = custom_target(
'mpd-unsigned.apk',
output: 'mpd-unsigned.apk',
input: [mpd, classes_dex, resources_apk[0]],
command: [
join_paths(meson.current_source_dir(), 'make-unsigned-apk.sh'),
android_abi,
get_option('android_strip'),
zip,
'@OUTPUT0@',
'@INPUT@',
],
)
if get_option('android_debug_keystore') != ''
debug_apk = custom_target(
'mpd-debug.apk',
output: 'mpd-debug.apk',
input: unsigned_apk,
command: [
jarsigner,
'-keystore', get_option('android_debug_keystore'),
'-storepass', 'android',
'-signedjar', '@OUTPUT@',
'@INPUT@',
'androiddebugkey',
],
build_by_default: true
)
endif
if get_option('android_keystore') != '' and get_option('android_keyalias') != '' and get_option('android_keypass') != ''
unaligned_apk = custom_target(
'mpd-unaligned.apk',
output: 'mpd-unaligned.apk',
input: unsigned_apk,
command: [
jarsigner,
'-digestalg', 'SHA1', '-sigalg', 'MD5withRSA',
'-keystore', get_option('android_keystore'),
'-storepass', get_option('android_keypass'),
'-signedjar', '@OUTPUT@',
'@INPUT@',
get_option('android_keyalias'),
],
)
apk = custom_target(
'mpd.apk',
output: 'mpd.apk',
input: unaligned_apk,
command: [
android_zipalign,
'-f', '4',
'@INPUT@', '@OUTPUT@',
],
build_by_default: true
)
endif

201
android/build.py Executable file
View File

@@ -0,0 +1,201 @@
#!/usr/bin/env python3
import os, os.path
import sys, subprocess
if len(sys.argv) < 4:
print("Usage: build.py SDK_PATH NDK_PATH ABI [configure_args...]", file=sys.stderr)
sys.exit(1)
sdk_path = sys.argv[1]
ndk_path = sys.argv[2]
android_abi = sys.argv[3]
configure_args = sys.argv[4:]
if not os.path.isfile(os.path.join(sdk_path, 'tools', 'android')):
print("SDK not found in", ndk_path, file=sys.stderr)
sys.exit(1)
if not os.path.isdir(ndk_path):
print("NDK not found in", ndk_path, file=sys.stderr)
sys.exit(1)
android_abis = {
'armeabi-v7a': {
'arch': 'arm-linux-androideabi',
'ndk_arch': 'arm',
'toolchain_arch': 'arm-linux-androideabi',
'llvm_triple': 'armv7-linux-androideabi',
'cflags': '-fpic -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp',
},
'arm64-v8a': {
'arch': 'aarch64-linux-android',
'ndk_arch': 'arm64',
'toolchain_arch': 'aarch64-linux-android',
'llvm_triple': 'aarch64-linux-android',
'cflags': '-fpic',
},
'x86': {
'arch': 'i686-linux-android',
'ndk_arch': 'x86',
'toolchain_arch': 'x86',
'llvm_triple': 'i686-linux-android',
'cflags': '-fPIC -march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32',
},
'x86_64': {
'arch': 'x86_64-linux-android',
'ndk_arch': 'x86_64',
'toolchain_arch': 'x86_64',
'llvm_triple': 'x86_64-linux-android',
'cflags': '-fPIC -m64',
},
}
# select the NDK target
abi_info = android_abis[android_abi]
arch = abi_info['arch']
# the path to the MPD sources
mpd_path = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]) or '.', '..'))
sys.path[0] = os.path.join(mpd_path, 'python')
# output directories
from build.dirs import lib_path, tarball_path, src_path
from build.meson import configure as run_meson
arch_path = os.path.join(lib_path, arch)
build_path = os.path.join(arch_path, 'build')
# build host configuration
build_arch = 'linux-x86_64'
# set up the NDK toolchain
class AndroidNdkToolchain:
def __init__(self, tarball_path, src_path, build_path,
use_cxx):
self.tarball_path = tarball_path
self.src_path = src_path
self.build_path = build_path
ndk_arch = abi_info['ndk_arch']
android_api_level = '21'
# select the NDK compiler
gcc_version = '4.9'
install_prefix = os.path.join(arch_path, 'root')
self.arch = arch
self.install_prefix = install_prefix
toolchain_path = os.path.join(ndk_path, 'toolchains', abi_info['toolchain_arch'] + '-' + gcc_version, 'prebuilt', build_arch)
llvm_path = os.path.join(ndk_path, 'toolchains', 'llvm', 'prebuilt', build_arch)
llvm_triple = abi_info['llvm_triple'] + android_api_level
common_flags = '-Os -g'
common_flags += ' ' + abi_info['cflags']
toolchain_bin = os.path.join(toolchain_path, 'bin')
llvm_bin = os.path.join(llvm_path, 'bin')
self.cc = os.path.join(llvm_bin, 'clang')
self.cxx = os.path.join(llvm_bin, 'clang++')
common_flags += ' -target ' + llvm_triple + ' -integrated-as -gcc-toolchain ' + toolchain_path
common_flags += ' -fvisibility=hidden -fdata-sections -ffunction-sections'
# required flags from https://android.googlesource.com/platform/ndk/+/ndk-release-r20/docs/BuildSystemMaintainers.md#additional-required-arguments
common_flags += ' -fno-addrsig'
self.ar = os.path.join(toolchain_bin, arch + '-ar')
self.ranlib = os.path.join(toolchain_bin, arch + '-ranlib')
self.nm = os.path.join(toolchain_bin, arch + '-nm')
self.strip = os.path.join(toolchain_bin, arch + '-strip')
self.cflags = common_flags
self.cxxflags = common_flags
self.cppflags = ' -isystem ' + os.path.join(install_prefix, 'include')
self.ldflags = ' -L' + os.path.join(install_prefix, 'lib') + \
' -Wl,--exclude-libs=ALL' + \
' ' + common_flags
self.ldflags = common_flags
self.libs = ''
self.is_arm = ndk_arch == 'arm'
self.is_armv7 = self.is_arm and 'armv7' in self.cflags
self.is_aarch64 = ndk_arch == 'arm64'
self.is_windows = False
libstdcxx_flags = ''
libstdcxx_cxxflags = ''
libstdcxx_ldflags = ''
libstdcxx_libs = '-static-libstdc++'
if self.is_armv7:
# On 32 bit ARM, clang generates no ".eh_frame" section;
# instead, the LLVM unwinder library is used for unwinding
# the stack after a C++ exception was thrown
libstdcxx_libs += ' -lunwind'
if use_cxx:
self.cxxflags += ' ' + libstdcxx_cxxflags
self.ldflags += ' ' + libstdcxx_ldflags
self.libs += ' ' + libstdcxx_libs
self.env = dict(os.environ)
# redirect pkg-config to use our root directory instead of the
# default one on the build host
import shutil
bin_dir = os.path.join(install_prefix, 'bin')
try:
os.makedirs(bin_dir)
except:
pass
self.pkg_config = shutil.copy(os.path.join(mpd_path, 'build', 'pkg-config.sh'),
os.path.join(bin_dir, 'pkg-config'))
self.env['PKG_CONFIG'] = self.pkg_config
# a list of third-party libraries to be used by MPD on Android
from build.libs import *
thirdparty_libs = [
libmpdclient,
libogg,
libvorbis,
opus,
flac,
libid3tag,
libmodplug,
wildmidi,
gme,
ffmpeg,
curl,
libexpat,
libnfs,
boost,
]
# build the third-party libraries
for x in thirdparty_libs:
toolchain = AndroidNdkToolchain(tarball_path, src_path, build_path,
use_cxx=x.use_cxx)
if not x.is_installed(toolchain):
x.build(toolchain)
# configure and build MPD
toolchain = AndroidNdkToolchain(tarball_path, src_path, build_path,
use_cxx=True)
configure_args += [
'-Dandroid_sdk=' + sdk_path,
'-Dandroid_ndk=' + ndk_path,
'-Dandroid_abi=' + android_abi,
'-Dandroid_strip=' + toolchain.strip,
]
from build.meson import configure as run_meson
run_meson(toolchain, mpd_path, '.', configure_args)
subprocess.check_call(['/usr/bin/ninja'], env=toolchain.env)

11
android/custom_rules.xml Normal file
View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="mpd_rules">
<!-- setting these two properties works around a bug in Android
SDK's build.xml, which deletes all .class files every time -->
<property name="build.last.is.packaging.debug" value="true" />
<property name="build.is.packaging.debug" value="true" />
<target name="compile-jni-classes"
depends="-set-debug-mode,-compile"/>
</project>

24
android/make-resources-apk.sh Executable file
View File

@@ -0,0 +1,24 @@
#!/bin/sh -e
S=`dirname "$0"`
AAPT=$1
BASE_JAR=$2
JAVA_PKG=$3
JAVA_PKG_PATH=$4
APK_FILE="$5"
D=`dirname "$APK_FILE"`
rm -rf "$D/res"
mkdir -p "$D/res/drawable" "$D/src"
cp "$D/icon.png" "$D/notification_icon.png" "$D/res/drawable/"
"$AAPT" package -f -m --auto-add-overlay \
--custom-package "$JAVA_PKG" \
-M "$S/AndroidManifest.xml" \
-S "$D/res" \
-S "$S/res" \
-J "$D/src" \
-I "$BASE_JAR" \
-F "$D/resources.apk"
cp "$D/src/$JAVA_PKG_PATH/R.java" "$D/"

140
android/meson.build Normal file
View File

@@ -0,0 +1,140 @@
android_package = 'org.musicpd'
android_package_path = join_paths(android_package.split('.'))
android_ndk = get_option('android_ndk')
android_sdk = get_option('android_sdk')
android_abi = get_option('android_abi')
android_sdk_build_tools_version = '27.0.0'
android_sdk_platform = 'android-23'
android_build_tools_dir = join_paths(android_sdk, 'build-tools', android_sdk_build_tools_version)
android_sdk_platform_dir = join_paths(android_sdk, 'platforms', android_sdk_platform)
android_aidl = join_paths(android_build_tools_dir, 'aidl')
android_aapt = join_paths(android_build_tools_dir, 'aapt')
android_dx = join_paths(android_build_tools_dir, 'dx')
android_zipalign = join_paths(android_build_tools_dir, 'zipalign')
javac = find_program('javac')
jarsigner = find_program('jarsigner')
rsvg_convert = find_program('rsvg-convert')
convert = find_program('convert')
zip = find_program('zip')
common_cppflags += '-I' + join_paths(meson.current_build_dir(), 'include')
#
# AIDL
#
IMainCallback_java = custom_target(
'IMainCallback.java',
output: 'IMainCallback.java',
input: join_paths(meson.current_source_dir(), 'src', 'IMainCallback.aidl'),
command: [
join_paths(meson.current_source_dir(), 'run-aidl.sh'),
android_aidl,
'@INPUT@',
'@OUTPUT@',
join_paths(meson.current_build_dir(), 'src'),
android_package_path,
],
)
IMain_java = custom_target(
'IMain.java',
output: 'IMain.java',
input: join_paths(meson.current_source_dir(), 'src', 'IMain.aidl'),
depends: IMainCallback_java,
command: [
join_paths(meson.current_source_dir(), 'run-aidl.sh'),
android_aidl,
'@INPUT@',
'@OUTPUT@',
join_paths(meson.current_build_dir(), 'src'),
android_package_path,
],
)
#
# Resources
#
android_icon = custom_target(
'Android icon',
output: 'icon.png',
input: '../mpd.svg',
command: [
rsvg_convert, '--width=48', '--height=48', '@INPUT@', '-o', '@OUTPUT@',
],
)
android_notification_icon = custom_target(
'Android notification icon',
output: 'notification_icon.png',
input: android_icon,
command: [
convert, '@INPUT@', '-colorspace', 'Gray', '-gamma', '2.2', '@OUTPUT@',
],
)
resources_apk = custom_target(
'resources.apk',
output: ['resources.apk', 'R.java'],
input: [
'res/layout/custom_notification_gb.xml',
'res/layout/log_item.xml',
'res/layout/settings.xml',
'res/values/strings.xml',
android_icon,
android_notification_icon,
],
command: [
join_paths(meson.current_source_dir(), 'make-resources-apk.sh'),
android_aapt,
join_paths(android_sdk_platform_dir, 'android.jar'),
android_package,
android_package_path,
'@OUTPUT0@',
],
)
#
# Compile Java
#
classes_jar = custom_target(
'classes.jar',
output: 'classes.jar',
input: [
'src/Bridge.java',
'src/Loader.java',
'src/Main.java',
'src/Receiver.java',
'src/Settings.java',
IMain_java,
IMainCallback_java,
resources_apk[1],
],
command: [
join_paths(meson.current_source_dir(), 'run-javac.sh'),
javac,
join_paths(android_sdk_platform_dir, 'android.jar'),
android_package_path,
zip,
'@OUTPUT@',
'@INPUT@',
],
)
classes_dex = custom_target(
'classes.dex',
output: 'classes.dex',
input: classes_jar,
command: [
android_dx,
'--dex', '--output', '@OUTPUT@',
'@INPUT@',
],
)

View File

@@ -0,0 +1,22 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp" >
<ImageView android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_alignParentLeft="true"
android:layout_marginRight="10dp" />
<TextView android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/image"
style="Custom Notification Title" />
<TextView android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/image"
android:layout_below="@id/title"
style="Custom Notification Text" />
</RelativeLayout>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:typeface="monospace" />

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<ToggleButton
android:id="@+id/run"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textOn="@string/toggle_button_run_on"
android:textOff="@string/toggle_button_run_off" />
<CheckBox
android:id="@+id/run_on_boot"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/checkbox_run_on_boot" />
<CheckBox
android:id="@+id/wakelock"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/checkbox_wakelock" />
<TextView
android:id="@+id/status"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ListView
android:id="@+id/log_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="10dip" />
</LinearLayout>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">MPD</string>
<string name="notification_title_mpd_running">Music Player Daemon is running</string>
<string name="notification_text_mpd_running">Touch for MPD options.</string>
<string name="toggle_button_run_on">MPD is running</string>
<string name="toggle_button_run_off">MPD is not running</string>
<string name="checkbox_run_on_boot">Run MPD automatically on boot</string>
<string name="checkbox_wakelock">Prevent suspend when MPD is running (Wakelock)</string>
</resources>

12
android/run-aidl.sh Executable file
View File

@@ -0,0 +1,12 @@
#!/bin/sh -e
AIDL=$1
SRC=$2
DST=$3
GENSRC=$4
JAVA_PKG_PATH=$5
mkdir -p "$GENSRC/$JAVA_PKG_PATH"
cp "$SRC" "$GENSRC/$JAVA_PKG_PATH/"
"$AIDL" -I"$GENSRC" -o"$GENSRC" "$GENSRC/$JAVA_PKG_PATH/`basename $SRC`"
exec cp "$GENSRC/$JAVA_PKG_PATH/`basename $DST`" "$DST"

22
android/run-javac.sh Executable file
View File

@@ -0,0 +1,22 @@
#!/bin/sh -e
JAVAC=$1
CLASSPATH=$2
JAVA_PKG_PATH=$3
ZIP=$4
JARFILE=`realpath "$5"`
shift 5
D=`dirname "$JARFILE"`
GENSRC="$D/src"
GENCLASS="$D/classes"
GENINCLUDE="$D/include"
mkdir -p "$GENSRC/$JAVA_PKG_PATH"
"$JAVAC" -source 1.6 -target 1.6 -Xlint:-options \
-cp "$CLASSPATH" \
-h "$GENINCLUDE" \
-d "$GENCLASS" \
"$@"
cd "$GENCLASS"
zip -q -r "$JARFILE" .

36
android/src/Bridge.java Normal file
View File

@@ -0,0 +1,36 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.musicpd;
import android.content.Context;
/**
* Bridge to native code.
*/
public class Bridge {
/* used by jni */
public interface LogListener {
public void onLog(int priority, String msg);
}
public static native void run(Context context, LogListener logListener);
public static native void shutdown();
}

12
android/src/IMain.aidl Normal file
View File

@@ -0,0 +1,12 @@
package org.musicpd;
import org.musicpd.IMainCallback;
interface IMain
{
void start();
void stop();
void setWakelockEnabled(boolean enabled);
boolean isRunning();
void registerCallback(IMainCallback cb);
void unregisterCallback(IMainCallback cb);
}

View File

@@ -0,0 +1,9 @@
package org.musicpd;
interface IMainCallback
{
void onStarted();
void onStopped();
void onError(String error);
void onLog(int priority, String msg);
}

39
android/src/Loader.java Normal file
View File

@@ -0,0 +1,39 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.musicpd;
import android.util.Log;
public class Loader {
private static final String TAG = "MPD";
public static boolean loaded = false;
public static String error;
static {
try {
System.loadLibrary("mpd");
loaded = true;
} catch (UnsatisfiedLinkError e) {
Log.e(TAG, e.getMessage());
error = e.getMessage();
}
}
}

419
android/src/Main.java Normal file
View File

@@ -0,0 +1,419 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.musicpd;
import android.annotation.TargetApi;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Build;
import android.os.IBinder;
import android.os.PowerManager;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.util.Log;
import android.widget.RemoteViews;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Main extends Service implements Runnable {
private static final String TAG = "Main";
private static final String REMOTE_ERROR = "MPD process was killed";
private static final int MAIN_STATUS_ERROR = -1;
private static final int MAIN_STATUS_STOPPED = 0;
private static final int MAIN_STATUS_STARTED = 1;
private static final int MSG_SEND_STATUS = 0;
private static final int MSG_SEND_LOG = 1;
private Thread mThread = null;
private int mStatus = MAIN_STATUS_STOPPED;
private boolean mAbort = false;
private String mError = null;
private final RemoteCallbackList<IMainCallback> mCallbacks = new RemoteCallbackList<IMainCallback>();
private final IBinder mBinder = new MainStub(this);
private PowerManager.WakeLock mWakelock = null;
static class MainStub extends IMain.Stub {
private Main mService;
MainStub(Main service) {
mService = service;
}
public void start() {
mService.start();
}
public void stop() {
mService.stop();
}
public void setWakelockEnabled(boolean enabled) {
mService.setWakelockEnabled(enabled);
}
public boolean isRunning() {
return mService.isRunning();
}
public void registerCallback(IMainCallback cb) {
mService.registerCallback(cb);
}
public void unregisterCallback(IMainCallback cb) {
mService.unregisterCallback(cb);
}
}
private synchronized void sendMessage(int what, int arg1, int arg2, Object obj) {
int i = mCallbacks.beginBroadcast();
while (i > 0) {
i--;
final IMainCallback cb = mCallbacks.getBroadcastItem(i);
try {
switch (what) {
case MSG_SEND_STATUS:
switch (arg1) {
case MAIN_STATUS_ERROR:
cb.onError((String)obj);
break;
case MAIN_STATUS_STOPPED:
cb.onStopped();
break;
case MAIN_STATUS_STARTED:
cb.onStarted();
break;
}
break;
case MSG_SEND_LOG:
cb.onLog(arg1, (String) obj);
break;
}
} catch (RemoteException e) {
}
}
mCallbacks.finishBroadcast();
}
private Bridge.LogListener mLogListener = new Bridge.LogListener() {
@Override
public void onLog(int priority, String msg) {
sendMessage(MSG_SEND_LOG, priority, 0, msg);
}
};
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
start();
if (intent != null && intent.getBooleanExtra("wakelock", false))
setWakelockEnabled(true);
return START_STICKY;
}
@Override
public void run() {
if (!Loader.loaded) {
final String error = "Failed to load the native MPD libary.\n" +
"Report this problem to us, and include the following information:\n" +
"SUPPORTED_ABIS=" + String.join(", ", Build.SUPPORTED_ABIS) + "\n" +
"PRODUCT=" + Build.PRODUCT + "\n" +
"FINGERPRINT=" + Build.FINGERPRINT + "\n" +
"error=" + Loader.error;
setStatus(MAIN_STATUS_ERROR, error);
stopSelf();
return;
}
synchronized (this) {
if (mAbort)
return;
setStatus(MAIN_STATUS_STARTED, null);
}
Bridge.run(this, mLogListener);
setStatus(MAIN_STATUS_STOPPED, null);
}
private synchronized void setStatus(int status, String error) {
mStatus = status;
mError = error;
sendMessage(MSG_SEND_STATUS, mStatus, 0, mError);
}
private Notification.Builder createNotificationBuilderWithChannel() {
final NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
if (notificationManager == null)
return null;
final String id = "org.musicpd";
final String name = "MPD service";
final int importance = 3; /* NotificationManager.IMPORTANCE_DEFAULT */
try {
Class<?> ncClass = Class.forName("android.app.NotificationChannel");
Constructor<?> ncCtor = ncClass.getConstructor(String.class, CharSequence.class, int.class);
Object nc = ncCtor.newInstance(id, name, importance);
Method nmCreateNotificationChannelMethod =
NotificationManager.class.getMethod("createNotificationChannel", ncClass);
nmCreateNotificationChannelMethod.invoke(notificationManager, nc);
Constructor nbCtor = Notification.Builder.class.getConstructor(Context.class, String.class);
return (Notification.Builder) nbCtor.newInstance(this, id);
} catch (Exception e)
{
Log.e(TAG, "error creating the NotificationChannel", e);
return null;
}
}
private void start() {
if (mThread != null)
return;
final Intent mainIntent = new Intent(this, Settings.class);
mainIntent.setAction("android.intent.action.MAIN");
mainIntent.addCategory("android.intent.category.LAUNCHER");
final PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
mainIntent, PendingIntent.FLAG_CANCEL_CURRENT);
Notification.Builder nBuilder;
if (Build.VERSION.SDK_INT >= 26 /* Build.VERSION_CODES.O */)
{
nBuilder = createNotificationBuilderWithChannel();
if (nBuilder == null)
return;
}
else
nBuilder = new Notification.Builder(this);
Notification notification = nBuilder.setContentTitle(getText(R.string.notification_title_mpd_running))
.setContentText(getText(R.string.notification_text_mpd_running))
.setSmallIcon(R.drawable.notification_icon)
.setContentIntent(contentIntent)
.build();
mThread = new Thread(this);
mThread.start();
startForeground(R.string.notification_title_mpd_running, notification);
startService(new Intent(this, Main.class));
}
private void stop() {
if (mThread != null) {
if (mThread.isAlive()) {
synchronized (this) {
if (mStatus == MAIN_STATUS_STARTED)
Bridge.shutdown();
else
mAbort = true;
}
}
try {
mThread.join();
mThread = null;
mAbort = false;
} catch (InterruptedException ie) {}
}
setWakelockEnabled(false);
stopForeground(true);
stopSelf();
}
private void setWakelockEnabled(boolean enabled) {
if (enabled && mWakelock == null) {
PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
mWakelock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
mWakelock.acquire();
Log.d(TAG, "Wakelock acquired");
} else if (!enabled && mWakelock != null) {
mWakelock.release();
mWakelock = null;
Log.d(TAG, "Wakelock released");
}
}
private boolean isRunning() {
return mThread != null && mThread.isAlive();
}
private void registerCallback(IMainCallback cb) {
if (cb != null) {
mCallbacks.register(cb);
sendMessage(MSG_SEND_STATUS, mStatus, 0, mError);
}
}
private void unregisterCallback(IMainCallback cb) {
if (cb != null) {
mCallbacks.unregister(cb);
}
}
/*
* Client that bind the Main Service in order to send commands and receive callback
*/
public static class Client {
public interface Callback {
public void onStarted();
public void onStopped();
public void onError(String error);
public void onLog(int priority, String msg);
}
private boolean mBound = false;
private final Context mContext;
private Callback mCallback;
private IMain mIMain = null;
private final IMainCallback.Stub mICallback = new IMainCallback.Stub() {
@Override
public void onStopped() throws RemoteException {
mCallback.onStopped();
}
@Override
public void onStarted() throws RemoteException {
mCallback.onStarted();
}
@Override
public void onError(String error) throws RemoteException {
mCallback.onError(error);
}
@Override
public void onLog(int priority, String msg) throws RemoteException {
mCallback.onLog(priority, msg);
}
};
private final ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
synchronized (this) {
mIMain = IMain.Stub.asInterface(service);
try {
if (mCallback != null)
mIMain.registerCallback(mICallback);
} catch (RemoteException e) {
if (mCallback != null)
mCallback.onError(REMOTE_ERROR);
}
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
if (mCallback != null)
mCallback.onError(REMOTE_ERROR);
}
};
public Client(Context context, Callback cb) throws IllegalArgumentException {
if (context == null)
throw new IllegalArgumentException("Context can't be null");
mContext = context;
mCallback = cb;
mBound = mContext.bindService(new Intent(mContext, Main.class), mServiceConnection, Context.BIND_AUTO_CREATE);
}
public boolean start() {
synchronized (this) {
if (mIMain != null) {
try {
mIMain.start();
return true;
} catch (RemoteException e) {
}
}
return false;
}
}
public boolean stop() {
synchronized (this) {
if (mIMain != null) {
try {
mIMain.stop();
return true;
} catch (RemoteException e) {
}
}
return false;
}
}
public boolean setWakelockEnabled(boolean enabled) {
synchronized (this) {
if (mIMain != null) {
try {
mIMain.setWakelockEnabled(enabled);
return true;
} catch (RemoteException e) {
}
}
return false;
}
}
public boolean isRunning() {
synchronized (this) {
if (mIMain != null) {
try {
return mIMain.isRunning();
} catch (RemoteException e) {
}
}
return false;
}
}
public void release() {
if (mBound) {
synchronized (this) {
if (mIMain != null && mICallback != null) {
try {
if (mCallback != null)
mIMain.unregisterCallback(mICallback);
} catch (RemoteException e) {
}
}
}
mBound = false;
mContext.unbindService(mServiceConnection);
}
}
}
/*
* start Main service without any callback
*/
public static void start(Context context, boolean wakelock) {
context.startService(new Intent(context, Main.class).putExtra("wakelock", wakelock));
}
}

41
android/src/Receiver.java Normal file
View File

@@ -0,0 +1,41 @@
/*
* Copyright (C) 2003-2014 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.musicpd;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("Receiver", "onReceive: " + intent);
if (intent.getAction() == "android.intent.action.BOOT_COMPLETED") {
if (Settings.Preferences.getBoolean(context,
Settings.Preferences.KEY_RUN_ON_BOOT, false)) {
final boolean wakelock = Settings.Preferences.getBoolean(context,
Settings.Preferences.KEY_WAKELOCK, false);
Main.start(context, wakelock);
}
}
}
}

290
android/src/Settings.java Normal file
View File

@@ -0,0 +1,290 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.musicpd;
import java.util.LinkedList;
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.ToggleButton;
public class Settings extends Activity {
private static final String TAG = "Settings";
private Main.Client mClient;
private TextView mTextStatus;
private ToggleButton mRunButton;
private boolean mFirstRun;
private LinkedList<String> mLogListArray = new LinkedList<String>();
private ListView mLogListView;
private ArrayAdapter<String> mLogListAdapter;
private static final int MAX_LOGS = 500;
private static final int MSG_ERROR = 0;
private static final int MSG_STOPPED = 1;
private static final int MSG_STARTED = 2;
private static final int MSG_LOG = 3;
public static class Preferences {
public static final String KEY_RUN_ON_BOOT ="run_on_boot";
public static final String KEY_WAKELOCK ="wakelock";
public static SharedPreferences get(Context context) {
return context.getSharedPreferences(TAG, MODE_PRIVATE);
}
public static void putBoolean(Context context, String key, boolean value) {
final SharedPreferences prefs = get(context);
if (prefs == null)
return;
final Editor editor = prefs.edit();
editor.putBoolean(key, value);
editor.apply();
}
public static boolean getBoolean(Context context, String key, boolean defValue) {
final SharedPreferences prefs = get(context);
return prefs != null ? prefs.getBoolean(key, defValue) : defValue;
}
}
private Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case MSG_ERROR:
Log.d(TAG, "onError");
mClient.release();
connectClient();
mRunButton.setEnabled(false);
mRunButton.setChecked(false);
mTextStatus.setText((String)msg.obj);
mFirstRun = true;
break;
case MSG_STOPPED:
Log.d(TAG, "onStopped");
mRunButton.setEnabled(true);
if (!mFirstRun && Preferences.getBoolean(Settings.this, Preferences.KEY_RUN_ON_BOOT, false))
mRunButton.setChecked(true);
else
mRunButton.setChecked(false);
mFirstRun = true;
mTextStatus.setText("");
break;
case MSG_STARTED:
Log.d(TAG, "onStarted");
mRunButton.setChecked(true);
mFirstRun = true;
mTextStatus.setText("MPD service started");
break;
case MSG_LOG:
if (mLogListArray.size() > MAX_LOGS)
mLogListArray.remove(0);
String priority;
switch (msg.arg1) {
case Log.DEBUG:
priority = "D";
break;
case Log.ERROR:
priority = "E";
break;
case Log.INFO:
priority = "I";
break;
case Log.VERBOSE:
priority = "V";
break;
case Log.WARN:
priority = "W";
break;
default:
priority = "";
}
mLogListArray.add(priority + "/ " + (String)msg.obj);
mLogListAdapter.notifyDataSetChanged();
break;
}
return true;
}
});
private final OnCheckedChangeListener mOnRunChangeListener = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (mClient != null) {
if (isChecked) {
mClient.start();
if (Preferences.getBoolean(Settings.this,
Preferences.KEY_WAKELOCK, false))
mClient.setWakelockEnabled(true);
} else {
mClient.stop();
}
}
}
};
private final OnCheckedChangeListener mOnRunOnBootChangeListener = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Preferences.putBoolean(Settings.this, Preferences.KEY_RUN_ON_BOOT, isChecked);
if (isChecked && mClient != null && !mRunButton.isChecked())
mRunButton.setChecked(true);
}
};
private final OnCheckedChangeListener mOnWakelockChangeListener = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Preferences.putBoolean(Settings.this, Preferences.KEY_WAKELOCK, isChecked);
if (mClient != null && mClient.isRunning())
mClient.setWakelockEnabled(isChecked);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
/* TODO: this sure is the wrong place to request
permissions - it will cause MPD to quit
immediately; we should request permissions when we
need them, but implementing that is complicated, so
for now, we do it here to give users a quick
solution for the problem */
requestAllPermissions();
setContentView(R.layout.settings);
mRunButton = (ToggleButton) findViewById(R.id.run);
mRunButton.setOnCheckedChangeListener(mOnRunChangeListener);
mTextStatus = (TextView) findViewById(R.id.status);
mLogListAdapter = new ArrayAdapter<String>(this, R.layout.log_item, mLogListArray);
mLogListView = (ListView) findViewById(R.id.log_list);
mLogListView.setAdapter(mLogListAdapter);
mLogListView.setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);
CheckBox checkbox = (CheckBox) findViewById(R.id.run_on_boot);
checkbox.setOnCheckedChangeListener(mOnRunOnBootChangeListener);
if (Preferences.getBoolean(this, Preferences.KEY_RUN_ON_BOOT, false))
checkbox.setChecked(true);
checkbox = (CheckBox) findViewById(R.id.wakelock);
checkbox.setOnCheckedChangeListener(mOnWakelockChangeListener);
if (Preferences.getBoolean(this, Preferences.KEY_WAKELOCK, false))
checkbox.setChecked(true);
super.onCreate(savedInstanceState);
}
private void checkRequestPermission(String permission) {
if (checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED)
return;
try {
this.requestPermissions(new String[]{permission}, 0);
} catch (Exception e) {
Log.e(TAG, "requestPermissions(" + permission + ") failed",
e);
}
}
private void requestAllPermissions() {
if (android.os.Build.VERSION.SDK_INT < 23)
/* we don't need to request permissions on
this old Android version */
return;
/* starting with Android 6.0, we need to explicitly
request all permissions before using them;
mentioning them in the manifest is not enough */
checkRequestPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
}
private void connectClient() {
mClient = new Main.Client(this, new Main.Client.Callback() {
private void removeMessages() {
/* don't remove log messages */
mHandler.removeMessages(MSG_STOPPED);
mHandler.removeMessages(MSG_STARTED);
mHandler.removeMessages(MSG_ERROR);
}
@Override
public void onStopped() {
removeMessages();
mHandler.sendEmptyMessage(MSG_STOPPED);
}
@Override
public void onStarted() {
removeMessages();
mHandler.sendEmptyMessage(MSG_STARTED);
}
@Override
public void onError(String error) {
removeMessages();
mHandler.sendMessage(Message.obtain(mHandler, MSG_ERROR, error));
}
@Override
public void onLog(int priority, String msg) {
mHandler.sendMessage(Message.obtain(mHandler, MSG_LOG, priority, 0, msg));
}
});
}
@Override
protected void onStart() {
mFirstRun = false;
connectClient();
super.onStart();
}
@Override
protected void onStop() {
mClient.release();
mClient = null;
super.onStop();
}
}

View File

@@ -1,137 +0,0 @@
#!/bin/sh
# Run this to set up the build system: configure, makefiles, etc.
# (at one point this was based on the version in enlightenment's cvs)
package="mpd"
olddir="`pwd`"
srcdir="`dirname $0`"
test -z "$srcdir" && srcdir=.
cd "$srcdir"
DIE=
AM_VERSIONGREP="sed -e s/.*[^0-9\.]\([0-9]\.[0-9][0-9]*\).*/\1/"
AC_VERSIONGREP="sed -e s/.*[^0-9\.]\([0-9]\.[0-9][0-9]\).*/\1/"
VERSIONMKINT="sed -e s/[^0-9]//"
if test -n "$AM_FORCE_VERSION"
then
AM_VERSIONS="$AM_FORCE_VERSION"
else
AM_VERSIONS='1.11 1.10'
fi
if test -n "$AC_FORCE_VERSION"
then
AC_VERSIONS="$AC_FORCE_VERSION"
else
AC_VERSIONS='2.60 2.61'
fi
versioned_bins ()
{
bin="$1"
needed_int=`echo $VERNEEDED | $VERSIONMKINT`
for i in $VERSIONS
do
i_int=`echo $i | $VERSIONMKINT`
if test $i_int -ge $needed_int
then
echo $bin-$i $bin$i $bin-$i_int $bin$i_int
fi
done
echo $bin
}
for c in autoconf autoheader automake aclocal
do
uc=`echo $c | tr '[:lower:]' '[:upper:]'`
eval "val=`echo '$'$uc`"
if test -n "$val"
then
echo "$uc=$val in environment, will not attempt to auto-detect"
continue
fi
case "$c" in
autoconf|autoheader)
VERNEEDED=`fgrep AC_PREREQ configure.ac | $AC_VERSIONGREP`
VERSIONS="$AC_VERSIONS"
pkg=autoconf
;;
automake|aclocal)
VERNEEDED=`fgrep AUTOMAKE_OPTIONS Makefile.am | $AM_VERSIONGREP`
VERSIONS="$AM_VERSIONS"
pkg=automake
;;
esac
printf "checking for $c ... "
for x in `versioned_bins $c`; do
($x --version < /dev/null > /dev/null 2>&1) > /dev/null 2>&1
if test $? -eq 0
then
echo $x
eval $uc=$x
break
fi
done
eval "val=`echo '$'$uc`"
if test -z "$val"
then
if test $c = $pkg
then
DIE="$DIE $c=$VERNEEDED"
else
DIE="$DIE $c($pkg)=$VERNEEDED"
fi
fi
done
if test -n "$DIE"
then
echo "You must have the following installed to compile $package:"
for i in $DIE
do
printf ' '
echo $i | sed -e 's/(/ (from /' -e 's/=\(.*\)/ (>= \1)/'
done
echo "Download the appropriate package(s) for your system,"
echo "or get the source from one of the GNU ftp sites"
echo "listed in http://www.gnu.org/order/ftp.html"
exit 1
fi
echo "Generating configuration files for $package, please wait...."
ACLOCAL_FLAGS="$ACLOCAL_FLAGS -I m4"
# /usr/share/aclocal is most likely included by default, already...
ac_local_paths='
/usr/local/share/aclocal
/sw/share/aclocal
/usr/pkg/share/aclocal
/opt/share/aclocal
/usr/gnu/share/aclocal
'
for i in $ac_local_paths; do
if test -d "$i"; then
ACLOCAL_FLAGS="$ACLOCAL_FLAGS -I $i"
# we probably only want one of these...
break
fi
done
echo " $ACLOCAL $ACLOCAL_FLAGS"
$ACLOCAL $ACLOCAL_FLAGS || exit 1
echo " $AUTOHEADER"
$AUTOHEADER || exit 1
echo " $AUTOMAKE --add-missing $AUTOMAKE_FLAGS"
$AUTOMAKE --add-missing $AUTOMAKE_FLAGS || exit 1
echo " $AUTOCONF"
$AUTOCONF || exit 1
cd "$olddir"
if test x$NOCONFIGURE = x; then
"$srcdir"/configure "$@" || exit 1
fi

13
build/pkg-config.sh Executable file
View File

@@ -0,0 +1,13 @@
#!/bin/sh -e
# This is a wrapper for pkg-config which helps with cross-compiling;
# it sets up environment variables to pkg-config searches for
# libraries in the sysroot where a copy of this script is located.
BIN=`dirname $0`
ROOT=`dirname "$BIN"`
export PKG_CONFIG_DIR=
export PKG_CONFIG_LIBDIR="${ROOT}/lib/pkgconfig:${ROOT}/share/pkgconfig"
exec /usr/bin/pkg-config "$@"

File diff suppressed because it is too large Load Diff

214
doc/conf.py Normal file
View File

@@ -0,0 +1,214 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = ['sphinx.ext.intersphinx']
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
# The encoding of source files.
#
# source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = 'Music Player Daemon'
copyright = '2003-2018 The Music Player Daemon Project'
author = 'Max Kellermann'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '0.21.26'
# The full version, including alpha/beta/rc tags.
release = version
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#
# today = ''
#
# Else, today_fmt is used as the format for a strftime call.
#
# today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This patterns also effect to html_static_path and html_extra_path
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
# The reST default role (used for this markup: `text`) to use for all
# documents.
#
# default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#
# add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#
# add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#
# show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
# modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
# keep_warnings = False
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'classic'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#
# html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
# html_theme_path = []
# The name for this set of Sphinx documents.
# "<project> v<release> documentation" by default.
#
# html_title = ''
# A shorter title for the navigation bar. Default is the same as html_title.
#
# html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#
# html_logo = None
# The name of an image file (relative to this directory) to use as a favicon of
# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#
# html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#
# html_extra_path = []
# If not None, a 'Last updated on:' timestamp is inserted at every page
# bottom, using the given strftime format.
# The empty string is equivalent to '%b %d, %Y'.
#
# html_last_updated_fmt = None
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#
# html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#
# html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#
# html_additional_pages = {}
# If false, no module index is generated.
#
# html_domain_indices = True
# If false, no index is generated.
#
# html_use_index = True
# If true, the index is split into individual pages for each letter.
#
# html_split_index = False
# If true, links to the reST sources are added to the pages.
#
# html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#
# html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#
# html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#
# html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
# html_file_suffix = None
# Language to be used for generating the HTML full-text search index.
# Sphinx supports the following languages:
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja'
# 'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr', 'zh'
#
# html_search_language = 'en'
# A dictionary with options for the search language support, empty by default.
# 'ja' uses this config value.
# 'zh' user can custom change `jieba` dictionary path.
#
# html_search_options = {'type': 'default'}
# The name of a javascript file (relative to the configuration directory) that
# implements a search results scorer. If empty, the default will be used.
#
# html_search_scorer = 'scorer.js'

99
doc/developer.rst Normal file
View File

@@ -0,0 +1,99 @@
Developer's Manual
##################
Introduction
************
This is a guide for those who wish to hack on the MPD source code. MPD is an open project, and we are always happy about contributions. So far, more than 150 people have contributed patches. This document is work in progress. Most of it may be incomplete yet. Please help!
Code Style
**********
* indent with tabs (width 8)
* don't write CPP when you can write C++: use inline functions and constexpr instead of macros
* comment your code, document your APIs
* the code should be C++14 compliant, and must compile with :program:`GCC` 6.0 and :program:`clang` 3.4
* report error conditions with C++ exceptions, preferable derived from :envvar:`std::runtime_error`
* all code must be exception-safe
* classes and functions names use CamelCase; variables are lower-case with words separated by underscore
Some example code:
.. code-block:: c
Foo(const char *abc, int xyz)
{
if (abc == nullptr) {
LogWarning("Foo happened!");
return -1;
}
return xyz;
}
Hacking The Source
******************
MPD sources are managed in a git repository on
`Github <https://github.com/MusicPlayerDaemon/>`_.
Always write your code against the latest git:
.. code-block:: none
git clone git://github.com/MusicPlayerDaemon/MPD
If you already have a clone, update it:
.. code-block:: none
git pull --rebase git://github.com/MusicPlayerDaemon/MPD master
You can do without :code:`--rebase`, but we recommend that you rebase
your repository on the "master" repository all the time.
Configure with the option :code:`--werror`. Enable as many plugins as
possible, to be sure that you don't break any disabled code.
Don't mix several changes in one single patch. Create a separate patch for every change. Tools like :program:`stgit` help you with that. This way, we can review your patches more easily, and we can pick the patches we like most first.
Basic stgit usage
=================
stgit allows you to create a set of patches and refine all of them: you can go back to any patch at any time, and re-edit it (both the code and the commit message). You can reorder patches and insert new patches at any position. It encourages creating separate patches for tiny changes.
stgit needs to be initialized on a git repository:
.. code-block:: sh
stg init
Before you edit the code, create a patch:
.. code-block:: sh
stg new my-patch-name
stgit now asks you for the commit message.
Now edit the code. Once you're finished, you have to "refresh" the patch, i.e. your edits are incorporated into the patch you have created:
.. code-block:: sh
stg refresh
You may now continue editing the same patch, and refresh it as often as you like. Create more patches, edit and refresh them.
To view the list of patches, type stg series. To go back to a specific patch, type stg goto my-patch-name; now you can re-edit it (don't forget stg refresh when you're finished with that patch).
When the whole patch series is finished, convert stgit patches to git commits:
.. code-block:: sh
stg commit
Submitting Patches
******************
Submit pull requests on GitHub:
https://github.com/MusicPlayerDaemon/MPD/pulls

View File

@@ -1,105 +0,0 @@
<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"docbook/dtd/xml/4.2/docbookx.dtd">
<book>
<title>The Music Player Daemon - Developer's Manual</title>
<chapter>
<title>Introduction</title>
<para>
This is a guide for those who wish to hack on the MPD source
code. MPD is an open project, and we are always happy about
contributions. So far, more than 50 people have contributed
patches.
</para>
<para>
This document is work in progress. Most of it may be incomplete
yet. Please help!
</para>
</chapter>
<chapter>
<title>Code Style</title>
<itemizedlist>
<listitem>
<para>
indent with tabs (width 8)
</para>
</listitem>
<listitem>
<para>
don't write CPP when you can write C: use inline functions
and enums instead of macros
</para>
</listitem>
<listitem>
<para>
the code should be C99 compliant, and must compile with
<application>GCC</application>;
<application>clang</application> support is highly desirable
</para>
</listitem>
<listitem>
<para>
C++ is ok (for integrating C++ only libraries), but it
should be avoided
</para>
</listitem>
<listitem>
<para>
Some example code:
</para>
<programlisting lang="C">static inline bool
foo(const char *abc, int xyz)
{
if (abc == NULL) {
g_warning("Foo happened!\n");
return -1;
}
return xyz;
}
</programlisting>
</listitem>
</itemizedlist>
</chapter>
<chapter>
<title>Hacking The Source</title>
<para>
Always write your code against the latest git:
</para>
<programlisting>git clone git://git.musicpd.org/master/mpd.git</programlisting>
<para>
Configure with the options <option>--enable-debug
--enable-werror</option>. Enable as many plugins as possible,
to be sure that you don't break any disabled code.
</para>
<para>
Don't mix several changes in one single patch. Create a
separate patch for every change. Tools like
<application>stgit</application> help you with that.
</para>
</chapter>
<chapter>
<title>Submitting Patches</title>
<para>
Send your patches to the mailing list:
musicpd-dev-team@lists.sourceforge.net
</para>
</chapter>
</book>

File diff suppressed because it is too large Load Diff

2430
doc/doxygen.conf.in Normal file

File diff suppressed because it is too large Load Diff

18
doc/index.rst Normal file
View File

@@ -0,0 +1,18 @@
Music Player Daemon
===================
.. toctree::
:maxdepth: 2
:caption: Contents:
user
plugins
developer
protocol
Indices and tables
==================
* :ref:`genindex`
* :ref:`search`

33
doc/meson.build Normal file
View File

@@ -0,0 +1,33 @@
install_man(['mpd.1', 'mpd.conf.5'])
sphinx = find_program('sphinx-build')
sphinx_output = custom_target(
'HTML documentation',
output: 'html',
input: [
'index.rst', 'user.rst', 'developer.rst',
'plugins.rst',
'protocol.rst',
'conf.py',
],
command: [sphinx, '-q', '-b', 'html', '-d', '@OUTDIR@/doctrees', meson.current_source_dir(), '@OUTPUT@'],
build_by_default: true,
install: true,
install_dir: join_paths(get_option('datadir'), 'doc', meson.project_name()),
)
custom_target(
'upload',
input: sphinx_output,
output: 'upload',
build_always_stale: true,
command: [
'rsync', '-vpruz', '--delete', meson.current_build_dir() + '/',
'www.musicpd.org:/var/www/mpd/doc/',
'--chmod=Dug+rwx,Do+rx,Fug+rw,Fo+r',
'--include=html', '--include=html/**',
'--exclude=*',
],
)

View File

@@ -12,29 +12,29 @@ stores info about all available music, and this info can be easily searched and
retrieved. Player control, info retrieval, and playlist management can all be
managed remotely.
MPD searches for a config file in \fB~/.mpdconf\fP then \fB/etc/mpd.conf\fP or
uses CONF_FILE.
MPD searches for a config file in \fB$XDG_CONFIG_HOME/mpd/mpd.conf\fP then
\fB~/.mpdconf\fP then \fB/etc/mpd.conf\fP or uses CONF_FILE.
Read more about MPD at <\fBhttp://www.musicpd.org/\fP>.
.SH OPTIONS
.TP
.BI --help
.BI \-\-help
Output a brief help message.
.TP
.BI --kill
.BI \-\-kill
Kill the currently running mpd session. The pid_file parameter must be
specified in the config file for this to work.
.TP
.BI --no-daemon
.BI \-\-no\-daemon
Don't detach from console.
.TP
.BI --stderr
.BI \-\-stderr
Print messages stderr.
.TP
.BI --verbose
.BI \-\-verbose
Verbose logging.
.TP
.BI --version
.BI \-\-version
Print version information.
.SH FILES
.TP
@@ -48,8 +48,8 @@ mpd.conf(5), mpc(1)
.SH BUGS
If you find a bug, please report it at
.br
<\fBhttp://www.musicpd.org/mantis/bug_report_page.php\fP>.
<\fBhttps://github.com/MusicPlayerDaemon/MPD/issues/\fP>.
.SH AUTHORS
Warren Dukes <warren.dukes@gmail.com>
Max Kellermann <max.kellermann@gmail.com>
Special thanks to all the people that provided feedback and patches.

View File

@@ -3,8 +3,9 @@
mpd.conf \- Music Player Daemon configuration file
.SH DESCRIPTION
\fBmpd.conf\fP is the configuration file for mpd(1). If not specified on the
command line, MPD first searches for it at \fB~/.mpdconf\fP then at
\fB~/.mpd/mpd.conf\fP and then in \fB/etc/mpd.conf\fP.
command line, MPD first searches for it at \fB$XDG_CONFIG_HOME/mpd/mpd.conf\fP
then at \fB~/.mpdconf\fP then at \fB~/.mpd/mpd.conf\fP and then in
\fB/etc/mpd.conf\fP.
Lines beginning with a "#" character are comments. All other non-empty lines
specify parameters and their values. These lines contain the parameter name
@@ -27,31 +28,24 @@ paths.
See \fBdocs/mpdconf.example\fP in the source tarball for an example
configuration file.
This manual is not complete, it lists only the most important options.
Please read the MPD user manual for a complete configuration guide:
<\fBhttp://www.musicpd.org/doc/user/\fP>
.SH REQUIRED PARAMETERS
.TP
.B follow_outside_symlinks <yes or no>
Control if MPD will follow symbolic links pointing outside the music dir.
You must recreate the database after changing this option.
The default is "yes".
.TP
.B follow_inside_symlinks <yes or no>
Control if MPD will follow symbolic links pointing inside the music dir,
potentially adding duplicates to the database.
You must recreate the database after changing this option.
The default is "yes".
.TP
.B db_file <file>
This specifies where the db file will be stored.
.TP
.B sticker_file <file>
The location of the sticker database. This is a database which
manages dynamic information attached to songs.
.TP
.B log_file <file>
This specifies where the log file should be located.
The special value "syslog" makes MPD use the local syslog daemon.
.SH OPTIONAL PARAMETERS
.TP
.B sticker_file <file>
The location of the sticker database. This is a database which
manages dynamic information attached to songs.
.TP
.B pid_file <file>
This specifies the file to save mpd's process ID in.
.TP
@@ -69,20 +63,15 @@ mpd will be saved to this file when mpd is terminated by a TERM signal or by
the "kill" command. When mpd is restarted, it will read the state file and
restore the state of mpd (including the playlist).
.TP
.B restore_paused <yes or no>
Put MPD into pause mode instead of starting playback after startup.
.TP
.B user <username>
This specifies the user that MPD will run as, if set. MPD should
never run as root, and you may use this option to make MPD change its
user id after initialization. Do not use this option if you start MPD
as an unprivileged user.
.TP
.B bind_to_address <ip address or hostname or any>
This specifies which address mpd binds to and listens on. Multiple
bind_to_address parameters may be specified. The default is "any", which binds
to all available addresses.
To bind to a Unix domain socket, specify an absolute path. For a
system-wide MPD, we suggest the path "\fB/var/run/mpd/socket\fP".
.TP
.B port <port>
This specifies the port that mpd listens on. The default is 6600.
.TP
@@ -92,6 +81,17 @@ reports from what address a connection is opened, and when it is closed, and
"verbose" records excessive amounts of information for debugging purposes. The
default is "default".
.TP
.B follow_outside_symlinks <yes or no>
Control if MPD will follow symbolic links pointing outside the music dir.
You must recreate the database after changing this option.
The default is "yes".
.TP
.B follow_inside_symlinks <yes or no>
Control if MPD will follow symbolic links pointing inside the music dir,
potentially adding duplicates to the database.
You must recreate the database after changing this option.
The default is "yes".
.TP
.B zeroconf_enabled <yes or no>
If yes, and MPD has been compiled with support for Avahi or Bonjour, service
information will be published with Zeroconf. The default is yes.
@@ -99,23 +99,8 @@ information will be published with Zeroconf. The default is yes.
.B zeroconf_name <name>
If Zeroconf is enabled, this is the service name to publish. This name should
be unique to your local network, but name collisions will be properly dealt
with. The default is "Music Player".
.TP
.B password <password@permissions>
This specifies a password for access to mpd. The format is
"password@permissions" where permissions is a comma delimited list composed
of "read", "add", "control", and/or "admin". "read" allows for reading of the
database, displaying the current playlist, and current status of mpd. "add"
allows for adding songs and loading playlists. "control" allows for all other
player and playlist manipulations. "admin" allows the db to be updated and for
the client to kill mpd. An example value is "somePassword@read,add". Multiple
password parameters may be specified.
.TP
.B default_permissions <permissions>
This specifies the permissions of a client that has not been authenticated
using a password. The format of permissions is specified in the description of
the "password" config parameter. If no passwords are specified, the default is
"read,add,control,admin", otherwise it is "" (no permissions).
with. The default is "Music Player @ %h", where %h will be replaced with the
hostname of the machine running MPD.
.TP
.B audio_output
See \fBDESCRIPTION\fP and the various \fBAUDIO OUTPUT PARAMETERS\fP sections
@@ -123,53 +108,6 @@ for the format of this parameter. Multiple audio_output sections may be
specified. If no audio_output section is specified, then MPD will scan for a
usable audio output.
.TP
.B audio_output_format <sample_rate:bits:channels>
This specifies the sample rate, bits per sample, and number of channels of
audio that is sent to each audio output. Note that audio outputs may specify
their own audio format which will be used for actual output to the audio
device. An example is "44100:16:2" for 44100Hz, 16 bits, and 2 channels. The
default is to use the audio format of the input file.
Any of the three attributes may be an asterisk to specify that this
attribute should not be enforced
.TP
.B samplerate_converter <integer or prefix>
This specifies the libsamplerate converter to use. The supplied value should
either be an integer or a prefix of the name of a converter. The default is
"Fastest Sinc Interpolator".
At the time of this writing, the following converters are available:
.RS
.TP
Best Sinc Interpolator (0)
Band limited sinc interpolation, best quality, 97dB SNR, 96% BW.
.TP
Medium Sinc Interpolator (1)
Band limited sinc interpolation, medium quality, 97dB SNR, 90% BW.
.TP
Fastest Sinc Interpolator (2)
Band limited sinc interpolation, fastest, 97dB SNR, 80% BW.
.TP
ZOH Interpolator (3)
Zero order hold interpolator, very fast, very poor quality with audible
distortions.
.TP
Linear Interpolator (4)
Linear interpolator, very fast, poor quality.
.TP
internal
Poor quality, no floating point operations. This is the default (and
only choice) if MPD was compiled without libsamplerate.
.RE
.IP
For an up-to-date list of available converters, please see the libsamplerate
documentation (available online at <\fBhttp://www.mega-nerd.com/SRC/\fP>).
.TP
.B replaygain <off or album or track or auto>
If specified, mpd will adjust the volume of songs played using ReplayGain tags
(see <\fBhttp://www.replaygain.org/\fP>). Setting this to "album" will adjust
@@ -179,80 +117,23 @@ tags if random play is activated otherwise the album ReplayGain tags. Currently
only FLAC, Ogg Vorbis, Musepack, and MP3 (through ID3v2 ReplayGain tags, not
APEv2) are supported.
.TP
.B replaygain_preamp <-15 to 15>
.B replaygain_preamp <\-15 to 15>
This is the gain (in dB) applied to songs with ReplayGain tags.
.TP
.B volume_normalization <yes or no>
If yes, mpd will normalize the volume of songs as they play. The default is no.
.TP
.B audio_buffer_size <size in KiB>
This specifies the size of the audio buffer in kibibytes. The default is 2048,
large enough for nearly 12 seconds of CD-quality audio.
.TP
.B buffer_before_play <0-100%>
This specifies how much of the audio buffer should be filled before playing a
song. Try increasing this if you hear skipping when manually changing songs.
The default is 10%, a little over 1 second of CD-quality audio with the default
buffer size.
.TP
.B http_proxy_host <hostname>
This setting is deprecated. Use the "proxy" setting in the "curl"
input block. See MPD user manual for details.
.TP
.B connection_timeout <seconds>
If a client does not send any new data in this time period, the connection is
closed. The default is 60.
.TP
.B max_connections <number>
This specifies the maximum number of clients that can be connected to mpd. The
default is 5.
.TP
.B max_playlist_length <number>
This specifies the maximum number of songs that can be in the playlist. The
default is 4096.
.TP
.B max_command_list_size <size in KiB>
This specifies the maximum size a command list can be. The default is 2048.
.TP
.B max_output_buffer_size <size in KiB>
This specifies the maximum size of the output buffer to a client. The default
is 8192.
.TP
.B filesystem_charset <charset>
This specifies the character set used for the filesystem. A list of supported
character sets can be obtained by running "iconv -l". The default is
character sets can be obtained by running "iconv \-l". The default is
determined from the locale when the db was originally created.
.TP
.B id3v1_encoding <charset>
This specifies the character set which ID3v1 tags are encoded in. A list of
supported character sets can be obtained by running "iconv -l". The default is
to let libid3tag convert them (from ISO-8859-1, as the standard specifies) and
do no additional conversion.
.TP
.B gapless_mp3_playback <yes or no>
This specifies whether to support gapless playback of MP3s which have the
necessary headers. Useful if your MP3s have headers with incorrect
information. If you have such MP3s, it is highly recommended that you fix them
using vbrfix (available from <http://www.willwap.co.uk/Programs/vbrfix.php>)
instead of disabling gapless MP3 playback. The default is to support gapless
MP3 playback.
.TP
.B save_absolute_paths_in_playlists <yes or no>
This specifies whether relative or absolute paths for song filenames are used
when saving playlists. The default is "no".
.TP
.B metadata_to_use <tags>
This specifies the tag types that will be scanned for and made available to
clients. Note that you must recreate (not update) your database for changes to
this parameter to take effect. Possible values are artist, album, title,
track, name, genre, date, composer, performer, comment, and disc. Multiple
tags may be specified as a comma separated list. An example value is
"artist,album,title,track". The special value "none" may be used alone to
disable all metadata. The default is to use all known tag types except for
comments.
.TP
.B auto_update <yes or no>
This specifies the wheter to support automatic update of music database when
This specifies the whether to support automatic update of music database when
files are changed in music_directory. The default is to disable autoupdate
of database.
.TP
@@ -263,7 +144,7 @@ the music directory itself. There is no limit by default.
.TP
.B type <type>
This specifies the audio output type. See the list of supported outputs in mpd
--version for possible values.
\-\-version for possible values.
.TP
.B name <name>
This specifies a unique name for the audio output.
@@ -282,190 +163,12 @@ Specifies how replay gain is applied. The default is "software",
which uses an internal software volume control. "mixer" uses the
configured (hardware) mixer control. "none" disables replay gain on
this audio output.
.SH OPTIONAL ALSA OUTPUT PARAMETERS
.TP
.B device <dev>
This specifies the device to use for audio output. The default is "default".
.TP
.B mixer_type <hardware, software or none>
Specifies which mixer should be used for this audio output: the
hardware mixer (available for ALSA, OSS and PulseAudio), the software
mixer or no mixer ("none"). By default, the hardware mixer is used
for devices which support it, and none for the others.
.TP
.B mixer_device <mixer dev>
This specifies which mixer to use. The default is "default". To use
the second sound card in a system, use "hw:1".
.TP
.B mixer_control <mixer ctrl>
This specifies which mixer control to use (sometimes referred to as
the "device"). The default is "PCM". Use "amixer scontrols" to see
the list of possible controls.
.TP
.B mixer_index <mixer index>
A number identifying the index of the named mixer control. This is
probably only useful if your alsa device has more than one
identically\-named mixer control. The default is "0". Use "amixer
scontrols" to see the list of controls with their indexes.
.TP
.B use_mmap <yes or no>
Setting this allows you to use memory-mapped I/O. Certain hardware setups may
benefit from this, but most do not. Most users do not need to set this. The
default is to not use memory-mapped I/O.
.TP
.B auto_resample <yes or no>
Setting this to "no" disables ALSA's software resampling, if the
hardware does not support a specific sample rate. This lets MPD do
the resampling. "yes" is the default and allows ALSA to resample.
.TP
.B auto_channels <yes or no>
Setting this to "no" disables ALSA's channel conversion, if the
hardware does not support a specific number of channels. Default: "yes".
.TP
.B auto_format <yes or no>
Setting this to "no" disables ALSA's sample format conversion, if the
hardware does not support a specific sample format. Default: "yes".
.TP
.B buffer_time <time in microseconds>
This sets the length of the hardware sample buffer in microseconds. Increasing
it may help to reduce or eliminate skipping on certain setups. Most users do
not need to change this. The default is 500000 microseconds (0.5 seconds).
.TP
.B period_time <time in microseconds>
This sets the time between hardware sample transfers in microseconds.
Increasing this can reduce CPU usage while lowering it can reduce underrun
errors on bandwidth-limited devices. Some users have reported good results
with this set to 50000, but not all devices support values this high. Most
users do not need to change this. The default is 256000000 / sample_rate(kHz),
or 5804 microseconds for CD-quality audio.
.SH OPTIONAL OSS OUTPUT PARAMETERS
.TP
.B device <dev>
This specifies the device to use for audio output. The default is "/dev/dsp".
.TP
.B mixer_device <mixer dev>
This specifies which mixer to use. The default is "/dev/mixer".
.TP
.B mixer_control <mixer ctrl>
This specifies which mixer control to use (sometimes referred to as the
"device"). The default is to use the main PCM mixer. An example is "Pcm".
.SH OPTIONAL PULSE OUTPUT PARAMETERS
.TP
.B server <server list>
A space separated list of servers to try to connect to. See
<\fBhttp://www.pulseaudio.org/wiki/ServerStrings\fP> for more details. The
default is to let PulseAudio choose a server.
If you specify more than one server name, MPD tries to connect to one
after another until it successfully establishes a connection.
.TP
.B sink <sink>
The sink to output to. The default is to let PulseAudio choose a sink.
.SH OPTIONAL JACK OUTPUT PARAMETERS
.TP
.B client_name <name>
The client name to use when connecting to JACK. The output ports <name>:left
and <name>:right will also be created for the left and right channels,
respectively.
.TP
.B ports <left_port,right_port>
This specifies the left and right ports to connect to for the left and right
channels, respectively. The default is to let JACK choose a pair of ports.
.TP
.B ringbuffer_size <size in bytes>
This specifies the size of the ringbuffer in bytes. The default is 32768.
.SH OPTIONAL AO OUTPUT PARAMETERS
.TP
.B driver <driver>
This specifies the libao driver to use for audio output. Possible values
depend on what libao drivers are available. See
<\fBhttp://www.xiph.org/ao/doc/drivers.html\fP> for information on some
commonly used drivers. Typical values for Linux include "oss" and "alsa09".
The default is "default", which causes libao to select an appropriate plugin.
.TP
.B options <opts>
This specifies the options to use for the selected libao driver. For oss, the
only option available is "dsp". For alsa09, the available options are: "dev",
"buf_size", and "periods". See <\fBhttp://www.xiph.org/ao/doc/drivers.html\fP>
for available options for some commonly used drivers. Options are assigned
using "=", and ";" is used to separate options. An example for oss:
"dsp=/dev/dsp". An example for alsa09: "dev=hw:0,0;buf_size=4096". The
default is "".
.TP
.B write_size <size in bytes>
This specifies how many bytes to write to the audio device at once. This
parameter is to work around a bug in older versions of libao on sound cards
with very small buffers. The default is 1024.
.SH REQUIRED FIFO OUTPUT PARAMETERS
.TP
.B path <path>
This specifies the path of the FIFO to output to. Must be an absolute path.
If the path does not exist it will be created when mpd is started, and removed
when mpd is stopped. The FIFO will be created with the same user and group as
mpd is running as. Default permissions can be modified by using the builtin
shell command "umask". If a FIFO already exists at the specified path it will
be reused, and will \fBnot\fP be removed when mpd is stopped. You can use the
"mkfifo" command to create this, and then you may modify the permissions to
your liking.
.SH REQUIRED SHOUT OUTPUT PARAMETERS
.TP
.B name <name>
This specifies not only the unique audio output name, but also the stream
title.
.TP
.B host <hostname>
This specifies the hostname of the icecast server to connect to.
.TP
.B port <port>
This specifies the port of the icecast server to connect to.
.TP
.B mount <mountpoint>
This specifies the icecast mountpoint to use.
.TP
.B password <password>
This specifies the password to use when logging in to the icecast server.
.TP
.B quality <quality>
This specifies the encoding quality to use. The value must be between 0
and 10. Fractional values, such as 2.5, are permitted. Either the quality or
the bitrate parameter must be specified, but not both. For Ogg, a
higher quality number produces higher quality output. For MP3, it's
just the opposite, with lower numbers producing higher quality output.
.TP
.B bitrate <kbps>
This specifies the bitrate to use for encoding. Either the quality or the
bitrate parameter must be specified, but not both.
.TP
.B format <sample_rate:bits:channels>
This specifies the sample rate, bits per sample, and number of channels to use
for encoding.
.SH OPTIONAL SHOUT OUTPUT PARAMETERS
.TP
.B encoding <encoding>
This specifies which output encoding to use. Should be either "ogg"
or "mp3", "mp3" is needed for shoutcast streaming. The default is "ogg".
.TP
.B protocol <protocol>
This specifies the protocol that wil be used to connect to the
icecast/shoutcast server. The options are "shoutcast", "icecast1" and
"icecast2". The default is "icecast2".
.TP
.B user <username>
This specifies the username to use when logging in to the icecast server. The
default is "source".
.TP
.B public <yes or no>
This specifies whether to request that the stream be listed in all public
stream directories that the icecast server knows about. The default is no.
.TP
.B timeout <seconds>
This specifies the number of seconds to wait before giving up on trying to
connect to the icecast server. The default is 2 seconds.
.TP
.B description <description>
This specifies a description of the stream.
.TP
.B genre <genre>
This specifies the genre(s) of the stream.
.SH FILES
.TP
.BI ~/.mpdconf

View File

@@ -1,5 +1,5 @@
# An example configuration file for MPD
# See the mpd.conf man page for a more detailed description of each parameter.
# An example configuration file for MPD.
# Read the user manual for documentation: http://www.musicpd.org/doc/user/
# Files and directories #######################################################
@@ -32,7 +32,7 @@
# settings.
#
# The special value "syslog" makes MPD use the local syslog daemon. This
# setting defaults to logging to syslog, otherwise logging is disabled.
# setting defaults to logging to syslog.
#
#log_file "~/.mpd/log"
#
@@ -75,7 +75,8 @@
#
# This setting sets the address for the daemon to listen on. Careful attention
# should be paid if this is assigned to anything other then the default, any.
# This setting can deny access to control of the daemon.
# This setting can deny access to control of the daemon. Not effective if
# systemd socket activiation is in use.
#
# For network
#bind_to_address "any"
@@ -95,25 +96,25 @@
#
#log_level "default"
#
# If you have a problem with your MP3s ending abruptly it is recommended that
# you set this argument to "no" to attempt to fix the problem. If this solves
# the problem, it is highly recommended to fix the MP3 files with vbrfix
# (available from <http://www.willwap.co.uk/Programs/vbrfix.php>), at which
# point gapless MP3 playback can be enabled.
# Setting "restore_paused" to "yes" puts MPD into pause mode instead
# of starting playback after startup.
#
#gapless_mp3_playback "yes"
#restore_paused "no"
#
# This setting enables MPD to create playlists in a format usable by other
# music players.
#
#save_absolute_paths_in_playlists "no"
#
# This setting defines a list of tag types that will be extracted during the
# audio file discovery process. Optionally, 'comment' can be added to this
# list.
#
# This setting defines a list of tag types that will be extracted during the
# audio file discovery process. The complete list of possible values can be
# found in the user manual.
#metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc"
#
# This example just enables the "comment" tag without disabling all
# the other supported tags:
#metadata_to_use "+comment"
#
# This setting enables automatic update of MPD's database when files in
# music_directory are changed.
#
@@ -150,9 +151,9 @@
#zeroconf_enabled "yes"
#
# The argument to this setting will be the Zeroconf / Avahi unique name for
# this MPD server on the network.
# this MPD server on the network. %h will be replaced with the hostname.
#
#zeroconf_name "Music Player"
#zeroconf_name "Music Player @ %h"
#
###############################################################################
@@ -160,7 +161,7 @@
# Permissions #################################################################
#
# If this setting is set, MPD will require password authorization. The password
# can setting can be specified multiple times for different password profiles.
# setting can be specified multiple times for different password profiles.
#
#password "password@read,add,control,admin"
#
@@ -171,6 +172,15 @@
###############################################################################
# Database #######################################################################
#
#database {
# plugin "proxy"
# host "other.mpd.host"
# port "6600"
#}
# Input #######################################################################
#
@@ -191,16 +201,12 @@ input {
# blocks. Setting this block is optional, though the server will only attempt
# autodetection for one sound card.
#
# See <http://mpd.wikia.com/wiki/Configuration#Audio_Outputs> for examples of
# other audio outputs.
#
# An example of an ALSA output:
#
#audio_output {
# type "alsa"
# name "My ALSA Device"
## device "hw:0,0" # optional
## format "44100:16:2" # optional
## mixer_type "hardware" # optional
## mixer_device "default" # optional
## mixer_control "PCM" # optional
@@ -213,7 +219,6 @@ input {
# type "oss"
# name "My OSS Device"
## device "/dev/dsp" # optional
## format "44100:16:2" # optional
## mixer_type "hardware" # optional
## mixer_device "/dev/mixer" # optional
## mixer_control "PCM" # optional
@@ -223,7 +228,7 @@ input {
#
#audio_output {
# type "shout"
# encoding "ogg" # optional
# encoder "vorbis" # optional
# name "My Shout Stream"
# host "localhost"
# port "8000"
@@ -235,6 +240,7 @@ input {
## protocol "icecast2" # optional
## user "source" # optional
## description "My Stream Description" # optional
## url "http://example.com" # optional
## genre "jazz" # optional
## public "no" # optional
## timeout "2" # optional
@@ -276,6 +282,42 @@ input {
## sink "remote_server_sink" # optional
#}
#
# An example of a winmm output (Windows multimedia API).
#
#audio_output {
# type "winmm"
# name "My WinMM output"
## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
# or
## device "0" # optional
## mixer_type "hardware" # optional
#}
#
# An example of an openal output.
#
#audio_output {
# type "openal"
# name "My OpenAL output"
## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
#}
#
# An example of an sndio output.
#
#audio_output {
# type "sndio"
# name "sndio output"
# mixer_type "hardware"
#}
#
# An example of an OS X output:
#
#audio_output {
# type "osx"
# name "My OS X Device"
## device "Built-in Output" # optional
## channel_map "-1,-1,0,1" # optional
#}
#
## Example "pipe" output:
#
#audio_output {
@@ -297,27 +339,17 @@ input {
# mixer_type "none" # optional
#}
#
# This setting will change all decoded audio to be converted to the specified
# format before being passed to the audio outputs. By default, this setting is
# disabled.
#
#audio_output_format "44100:16:2"
#
# If MPD has been compiled with libsamplerate support, this setting specifies
# the sample rate converter to use. Possible values can be found in the
# mpd.conf man page or the libsamplerate documentation. By default, this is
# setting is disabled.
#
#samplerate_converter "Fastest Sinc Interpolator"
#
###############################################################################
# Normalization automatic volume adjustments ##################################
#
# This setting specifies the type of ReplayGain to use. This setting can have
# the argument "off", "album" or "track". See <http://www.replaygain.org>
# for more details. This setting is off by default.
# the argument "off", "album", "track" or "auto". "auto" is a special mode that
# chooses between "track" and "album" depending on the current state of
# random playback. If random playback is enabled then "track" mode is used.
# See <http://www.replaygain.org> for more details about ReplayGain.
# This setting is off by default.
#
#replaygain "album"
#
@@ -326,6 +358,20 @@ input {
#
#replaygain_preamp "0"
#
# This setting sets the pre-amp used for files that do NOT have ReplayGain tags.
# By default this setting is disabled.
#
#replaygain_missing_preamp "0"
#
# This setting enables or disables ReplayGain limiting.
# MPD calculates actual amplification based on the ReplayGain tags
# and replaygain_preamp / replaygain_missing_preamp setting.
# If replaygain_limit is enabled MPD will never amplify audio signal
# above its original level. If replaygain_limit is disabled such amplification
# might occur. By default this setting is enabled.
#
#replaygain_limit "yes"
#
# This setting enables on-the-fly normalization volume adjustment. This will
# result in the volume of all playing audio to be adjusted so the output has
# equal "loudness". This setting is disabled by default.
@@ -334,39 +380,6 @@ input {
#
###############################################################################
# MPD Internal Buffering ######################################################
#
# This setting adjusts the size of internal decoded audio buffering. Changing
# this may have undesired effects. Don't change this if you don't know what you
# are doing.
#
#audio_buffer_size "2048"
#
# This setting controls the percentage of the buffer which is filled before
# beginning to play. Increasing this reduces the chance of audio file skipping,
# at the cost of increased time prior to audio playback.
#
#buffer_before_play "10%"
#
###############################################################################
# Resource Limitations ########################################################
#
# These settings are various limitations to prevent MPD from using too many
# resources. Generally, these settings should be minimized to prevent security
# risks, depending on the operating resources.
#
#connection_timeout "60"
#max_connections "10"
#max_playlist_length "16384"
#max_command_list_size "2048"
#max_output_buffer_size "8192"
#
###############################################################################
# Character Encoding ##########################################################
#
# If file or directory names do not display correctly for your locale then you
@@ -374,34 +387,4 @@ input {
#
#filesystem_charset "UTF-8"
#
# This setting controls the encoding that ID3v1 tags should be converted from.
#
#id3v1_encoding "ISO-8859-1"
#
###############################################################################
# SIDPlay decoder #############################################################
#
# songlength_database:
# Location of your songlengths file, as distributed with the HVSC.
# The sidplay plugin checks this for matching MD5 fingerprints.
# See http://www.c64.org/HVSC/DOCUMENTS/Songlengths.faq
#
# default_songlength:
# This is the default playing time in seconds for songs not in the
# songlength database, or in case you're not using a database.
# A value of 0 means play indefinitely.
#
# filter:
# Turns the SID filter emulation on or off.
#
#decoder {
# plugin "sidplay"
# songlength_database "/media/C64Music/DOCUMENTS/Songlengths.txt"
# default_songlength "120"
# filter "true"
#}
#
###############################################################################

1179
doc/plugins.rst Normal file

File diff suppressed because it is too large Load Diff

1329
doc/protocol.rst Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1064
doc/user.rst Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,192 +0,0 @@
AC_DEFUN([AM_PATH_FAAD],
[dnl ##
dnl faad
dnl ##
AC_ARG_ENABLE(aac,
AS_HELP_STRING([--disable-aac],
[disable AAC support (default: enable)]),,
enable_aac=yes)
AC_ARG_WITH(faad,
AS_HELP_STRING([--with-faad=PFX],
[prefix where faad2 is installed (optional)]),,
faad_prefix="")
AC_ARG_WITH(faad-libraries,
AS_HELP_STRING([--with-faad-libraries=DIR],
[directory where faad2 library is installed (optional)]),,
faad_libraries="")
AC_ARG_WITH(faad-includes,
AS_HELP_STRING([--with-faad-includes=DIR],
[directory where faad2 header files are installed (optional)]),,
faad_includes="")
if test x$enable_aac = xyes; then
if test "x$faad_libraries" != "x" ; then
FAAD_LIBS="-L$faad_libraries"
elif test "x$faad_prefix" != "x" ; then
FAAD_LIBS="-L$faad_prefix/lib"
fi
FAAD_LIBS="$FAAD_LIBS -lfaad"
if test "x$faad_includes" != "x" ; then
FAAD_CFLAGS="-I$faad_includes"
elif test "x$faad_prefix" != "x" ; then
FAAD_CFLAGS="-I$faad_prefix/include"
fi
oldcflags=$CFLAGS
oldlibs=$LIBS
oldcppflags=$CPPFLAGS
CFLAGS="$CFLAGS $MPD_CFLAGS $FAAD_CFLAGS -I."
LIBS="$LIBS $MPD_LIBS $FAAD_LIBS"
CPPFLAGS=$CFLAGS
AC_CHECK_HEADER(faad.h,,enable_aac=no)
if test x$enable_aac = xyes; then
AC_CHECK_DECL(FAAD2_VERSION,,enable_aac=no,[#include <faad.h>])
fi
if test x$enable_aac = xyes; then
AC_CHECK_DECL(faacDecInit2,,enable_aac=no,[#include <faad.h>])
fi
if test x$enable_aac = xyes; then
AC_CHECK_LIB(faad,faacDecInit2,[MPD_LIBS="$MPD_LIBS $FAAD_LIBS";MPD_CFLAGS="$MPD_CFLAGS $FAAD_CFLAGS"],enable_aac=no)
if test x$enable_aac = xno; then
enable_aac=yes
AC_CHECK_LIB(faad,NeAACDecInit2,[MPD_LIBS="$MPD_LIBS $FAAD_LIBS";MPD_CFLAGS="$MPD_CFLAGS $FAAD_CFLAGS"],enable_aac=no)
fi
fi
if test x$enable_aac = xyes; then
AC_MSG_CHECKING(that FAAD2 uses buffer and bufferlen)
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
#include <faad.h>
int main() {
char buffer;
long bufferlen = 0;
faacDecHandle decoder;
faacDecFrameInfo frameInfo;
faacDecConfigurationPtr config;
unsigned char channels;
long sampleRate;
mp4AudioSpecificConfig mp4ASC;
decoder = faacDecOpen();
config = faacDecGetCurrentConfiguration(decoder);
config->outputFormat = FAAD_FMT_16BIT;
faacDecSetConfiguration(decoder,config);
AudioSpecificConfig(&buffer, bufferlen, &mp4ASC);
faacDecInit(decoder,&buffer,bufferlen,&sampleRate,&channels);
faacDecInit2(decoder,&buffer,bufferlen,&sampleRate,&channels);
faacDecDecode(decoder,&frameInfo,&buffer,bufferlen);
return 0;
}
])],[AC_MSG_RESULT(yes);AC_DEFINE(HAVE_FAAD_BUFLEN_FUNCS,1,[Define if FAAD2 uses buflen in function calls])],[AC_MSG_RESULT(no);
AC_MSG_CHECKING(that FAAD2 can even be used)
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
#include <faad.h>
int main() {
char buffer;
faacDecHandle decoder;
faacDecFrameInfo frameInfo;
faacDecConfigurationPtr config;
unsigned char channels;
long sampleRate;
long bufferlen = 0;
unsigned long dummy1_32;
unsigned char dummy2_8, dummy3_8, dummy4_8, dummy5_8, dummy6_8,
dummy7_8, dummy8_8;
decoder = faacDecOpen();
config = faacDecGetCurrentConfiguration(decoder);
config->outputFormat = FAAD_FMT_16BIT;
faacDecSetConfiguration(decoder,config);
AudioSpecificConfig(&buffer,&dummy1_32,&dummy2_8,
&dummy3_8,&dummy4_8,&dummy5_8,
&dummy6_8,&dummy7_8,&dummy8_8);
faacDecInit(decoder,&buffer,&sampleRate,&channels);
faacDecInit2(decoder,&buffer,bufferlen,&sampleRate,&channels);
faacDecDecode(decoder,&frameInfo,&buffer);
faacDecClose(decoder);
return 0;
}
])],AC_MSG_RESULT(yes),[AC_MSG_RESULT(no);enable_aac=no])
])
fi
if test x$enable_aac = xyes; then
AC_CHECK_MEMBERS([faacDecConfiguration.downMatrix,faacDecConfiguration.dontUpSampleImplicitSBR,faacDecFrameInfo.samplerate],,,[#include <faad.h>])
AC_DEFINE(HAVE_FAAD,1,[Define to use FAAD2 for AAC decoding])
else
AC_MSG_WARN([faad2 lib needed for MP4/AAC support -- disabling MP4/AAC support])
fi
CFLAGS=$oldcflags
LIBS=$oldlibs
CPPFLAGS=$oldcppflags
fi
if test x$enable_aac = xyes; then
oldcflags=$CFLAGS
oldlibs=$LIBS
oldcppflags=$CPPFLAGS
CFLAGS="$CFLAGS $MPD_CFLAGS $FAAD_CFLAGS -Werror"
LIBS="$LIBS $MPD_LIBS $FAAD_LIBS"
CPPFLAGS=$CFLAGS
AC_MSG_CHECKING(for broken libfaad headers)
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
#include <faad.h>
#include <stddef.h>
#include <stdint.h>
int main() {
unsigned char channels;
uint32_t sample_rate;
faacDecInit2(NULL, NULL, 0, &sample_rate, &channels);
return 0;
}
])],
[AC_MSG_RESULT(correct)],
[AC_MSG_RESULT(broken);
AC_DEFINE(HAVE_FAAD_LONG, 1, [Define if faad.h uses the broken "unsigned long" pointers])])
CFLAGS=$oldcflags
LIBS=$oldlibs
CPPFLAGS=$oldcppflags
fi
if test x$enable_aac = xyes; then
enable_mp4=yes
MP4FF_LIBS="-lmp4ff"
oldcflags=$CFLAGS
oldlibs=$LIBS
oldcppflags=$CPPFLAGS
CFLAGS="$CFLAGS $FAAD_CFLAGS"
LIBS="$LIBS $FAAD_LIBS $MP4FF_LIBS"
CPPFLAGS=$CFLAGS
AC_CHECK_HEADER(mp4ff.h,,enable_mp4=no)
if test x$enable_mp4 = xyes; then
AC_CHECK_LIB(mp4ff,mp4ff_open_read,,enable_mp4=no)
fi
if test x$enable_mp4 = xyes; then
AC_SUBST(MP4FF_LIBS)
AC_DEFINE(HAVE_MP4, 1, [Define to use FAAD2+mp4ff for MP4 decoding])
else
AC_MSG_WARN([libmp4ff needed for MP4 support -- disabling MP4 support])
unset MP4FF_LIBS
fi
CFLAGS=$oldcflags
LIBS=$oldlibs
CPPFLAGS=$oldcppflags
else
enable_mp4=no
fi
])

View File

@@ -1,14 +0,0 @@
dnl
dnl Usage:
dnl AC_CHECK_LIBWRAP([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
dnl
AC_DEFUN([AC_CHECK_LIBWRAP],[
AC_CHECK_HEADERS([tcpd.h],
AC_CHECK_LIB([wrap], [request_init],
[LIBWRAP_CFLAGS=""
LIBWRAP_LDFLAGS="-lwrap"
$1],
$2),
$2)
])

View File

@@ -1,65 +0,0 @@
AC_DEFUN([MPD_AUTO_ENABLED], [
var="enable_$1"
feature="$2"
if eval "test x`echo '$'$var` = xauto"; then
AC_MSG_NOTICE([auto-detected $feature])
eval "$var=yes"
fi
])
AC_DEFUN([MPD_AUTO_DISABLED], [
var="enable_$1"
feature="$2"
msg="$3"
if eval "test x`echo '$'$var` = xauto"; then
AC_MSG_WARN([$msg -- disabling $feature])
eval "$var=no"
elif eval "test x`echo '$'$var` = xyes"; then
AC_MSG_ERROR([$feature: $msg])
fi
])
dnl Check whether a prerequisite for a feature was found. This is
dnl very similar to MPD_AUTO_RESULT, but does not finalize the
dnl detection; it assumes that more checks will follow.
AC_DEFUN([MPD_AUTO_PRE], [
name="$1"
var="enable_$1"
found="found_$name"
feature="$2"
msg="$3"
if eval "test x`echo '$'$var` != xno" && eval "test x`echo '$'$found` = xno"; then
MPD_AUTO_DISABLED([$name], [$feature], [$msg])
fi
])
AC_DEFUN([MPD_AUTO_RESULT], [
name="$1"
var="enable_$1"
found="found_$name"
feature="$2"
msg="$3"
if eval "test x`echo '$'$var` = xno"; then
eval "$found=no"
fi
if eval "test x`echo '$'$found` = xyes"; then
MPD_AUTO_ENABLED([$name], [$feature])
else
MPD_AUTO_DISABLED([$name], [$feature], [$msg])
fi
])
AC_DEFUN([MPD_AUTO_PKG], [
if eval "test x`echo '$'enable_$1` != xno"; then
PKG_CHECK_MODULES([$2], [$3],
[eval "found_$1=yes"],
[eval "found_$1=no"])
fi
MPD_AUTO_RESULT([$1], [$4], [$5])
])

View File

@@ -1,18 +0,0 @@
AC_DEFUN([MPD_CHECK_FLAG],[
var=`echo "$1" | tr "=-" "__"`
AC_CACHE_CHECK([whether the C compiler accepts $1],
[mpd_check_cflag_$var],[
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $1"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
int main(void) { return 0; }
])], [ eval "mpd_check_cflag_$var=yes"
], [ eval "mpd_check_cflag_$var=no" ])
CFLAGS="$save_CFLAGS"
])
if eval "test x`echo '$mpd_check_cflag_'$var` = xyes"
then
AM_CFLAGS="$AM_CFLAGS $1"
fi
])
])

157
m4/pkg.m4
View File

@@ -1,157 +0,0 @@
# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
#
# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# PKG_PROG_PKG_CONFIG([MIN-VERSION])
# ----------------------------------
AC_DEFUN([PKG_PROG_PKG_CONFIG],
[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
fi
if test -n "$PKG_CONFIG"; then
_pkg_min_version=m4_default([$1], [0.9.0])
AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
PKG_CONFIG=""
fi
fi[]dnl
])# PKG_PROG_PKG_CONFIG
# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
#
# Check to see whether a particular set of modules exists. Similar
# to PKG_CHECK_MODULES(), but does not set variables or print errors.
#
#
# Similar to PKG_CHECK_MODULES, make sure that the first instance of
# this or PKG_CHECK_MODULES is called, or make sure to call
# PKG_CHECK_EXISTS manually
# --------------------------------------------------------------
AC_DEFUN([PKG_CHECK_EXISTS],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
if test -n "$PKG_CONFIG" && \
AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
m4_ifval([$2], [$2], [:])
m4_ifvaln([$3], [else
$3])dnl
fi])
# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
# ---------------------------------------------
m4_define([_PKG_CONFIG],
[if test -n "$PKG_CONFIG"; then
if test -n "$$1"; then
pkg_cv_[]$1="$$1"
else
PKG_CHECK_EXISTS([$3],
[pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
[pkg_failed=yes])
fi
else
pkg_failed=untried
fi[]dnl
])# _PKG_CONFIG
# _PKG_SHORT_ERRORS_SUPPORTED
# -----------------------------
AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
_pkg_short_errors_supported=yes
else
_pkg_short_errors_supported=no
fi[]dnl
])# _PKG_SHORT_ERRORS_SUPPORTED
# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
# [ACTION-IF-NOT-FOUND])
#
#
# Note that if there is a possibility the first call to
# PKG_CHECK_MODULES might not happen, you should be sure to include an
# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
#
#
# --------------------------------------------------------------
AC_DEFUN([PKG_CHECK_MODULES],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
pkg_failed=no
AC_MSG_CHECKING([for $1])
_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
_PKG_CONFIG([$1][_LIBS], [libs], [$2])
m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
and $1[]_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.])
if test $pkg_failed = yes; then
_PKG_SHORT_ERRORS_SUPPORTED
if test $_pkg_short_errors_supported = yes; then
$1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"`
else
$1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
fi
# Put the nasty error message in config.log where it belongs
echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
ifelse([$4], , [AC_MSG_ERROR(dnl
[Package requirements ($2) were not met:
$$1_PKG_ERRORS
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
_PKG_TEXT
])],
[AC_MSG_RESULT([no])
$4])
elif test $pkg_failed = untried; then
ifelse([$4], , [AC_MSG_FAILURE(dnl
[The pkg-config script could not be found or is too old. Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full
path to pkg-config.
_PKG_TEXT
To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.])],
[$4])
else
$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
$1[]_LIBS=$pkg_cv_[]$1[]_LIBS
AC_MSG_RESULT([yes])
ifelse([$3], , :, [$3])
fi[]dnl
])# PKG_CHECK_MODULES

View File

@@ -1,19 +0,0 @@
AC_DEFUN([results], [
dnl This is a hack to allow "with" names, otherwise "enable".
num=`expr $1 : 'with'`
if test "$num" != "0"; then
var="`echo '$'$1`"
else
var="`echo '$'enable_$1`"
fi
printf '('
if eval "test x$var = xyes"; then
printf '+'
elif test -n "$3" && eval "test x$var = x$3"; then
printf '+'
else
printf '-'
fi
printf '%s) ' "$2"
])

View File

@@ -1,32 +0,0 @@
# Check if "struct ucred" is available. If not, try harder with
# _GNU_SOURCE.
#
# Author: Max Kellermann <max@duempel.org>
AC_DEFUN([STRUCT_UCRED],[
AC_MSG_CHECKING([for struct ucred])
AC_CACHE_VAL(mpd_cv_have_struct_ucred, [
AC_TRY_COMPILE([#include <sys/socket.h>],
[struct ucred cred;],
mpd_cv_have_struct_ucred=yes,
mpd_cv_have_struct_ucred=no)
if test x$mpd_cv_have_struct_ucred = xno; then
# glibc 2.8 forces _GNU_SOURCE on us
AC_TRY_COMPILE(
[#define _GNU_SOURCE
#include <sys/socket.h>],
[struct ucred cred;],
mpd_cv_have_struct_ucred=yes,
mpd_cv_have_struct_ucred=no)
if test x$mpd_cv_have_struct_ucred = xyes; then
# :(
MPD_CFLAGS="$MPD_CFLAGS -D_GNU_SOURCE"
fi
fi
])
AC_MSG_RESULT($mpd_cv_have_struct_ucred)
if test x$mpd_cv_have_struct_ucred = xyes; then
AC_DEFINE(HAVE_STRUCT_UCRED, 1, [Define if struct ucred is present from sys/socket.h])
fi
])

510
meson.build Normal file
View File

@@ -0,0 +1,510 @@
project(
'mpd',
['c', 'cpp'],
version: '0.21.26',
meson_version: '>= 0.49.0',
default_options: [
'c_std=c99',
'cpp_std=c++14',
'warning_level=2',
],
license: 'GPLv2+',
)
version_cxx = vcs_tag(input: 'src/GitVersion.cxx', output: 'GitVersion.cxx')
compiler = meson.get_compiler('cpp')
c_compiler = meson.get_compiler('c')
if compiler.get_id() == 'gcc' and compiler.version().version_compare('<6')
warning('Your GCC version is too old. You need at least version 6.')
elif compiler.get_id() == 'clang' and compiler.version().version_compare('<3')
warning('Your clang version is too old. You need at least version 3.')
endif
conf = configuration_data()
conf.set_quoted('PACKAGE', meson.project_name())
conf.set_quoted('PACKAGE_NAME', meson.project_name())
conf.set_quoted('PACKAGE_VERSION', meson.project_version())
conf.set_quoted('VERSION', meson.project_version())
conf.set_quoted('PROTOCOL_VERSION', '0.21.11')
conf.set_quoted('SYSTEM_CONFIG_FILE_LOCATION', join_paths(get_option('prefix'), get_option('sysconfdir'), 'mpd.conf'))
common_cppflags = [
'-D_GNU_SOURCE',
]
common_cflags = [
]
common_cxxflags = [
]
test_common_flags = [
'-fvisibility=hidden',
'-ffast-math',
'-ftree-vectorize',
]
test_cxxflags = test_common_flags + [
'-fno-threadsafe-statics',
'-fmerge-all-constants',
'-Wmissing-declarations',
'-Wshadow',
'-Wpointer-arith',
'-Wcast-qual',
'-Wwrite-strings',
'-Wsign-compare',
'-Wno-non-virtual-dtor',
# work around bogus GCC7 warning "mangled name for ... will change
# in C++17 because the exception specification is part of a function
# type"
'-Wno-noexcept-type',
]
if compiler.get_id() == 'clang'
# Workaround for clang bug
# https://bugs.llvm.org/show_bug.cgi?id=32611
test_cxxflags += '-funwind-tables'
endif
test_cflags = test_common_flags + [
'-Wmissing-prototypes',
'-Wshadow',
'-Wpointer-arith',
'-Wstrict-prototypes',
'-Wcast-qual',
'-Wwrite-strings',
'-pedantic',
]
test_ldflags = [
]
if get_option('buildtype') != 'debug'
test_cxxflags += [
'-ffunction-sections',
'-fdata-sections',
]
test_cflags += [
'-ffunction-sections',
'-fdata-sections',
]
test_ldflags += [
'-Wl,--gc-sections',
]
endif
add_global_arguments(common_cxxflags + compiler.get_supported_arguments(test_cxxflags), language: 'cpp')
add_global_arguments(common_cflags + c_compiler.get_supported_arguments(test_cflags), language: 'c')
add_global_link_arguments(compiler.get_supported_link_arguments(test_ldflags), language: 'cpp')
is_linux = host_machine.system() == 'linux'
is_android = get_option('android_ndk') != ''
is_darwin = host_machine.system() == 'darwin'
is_windows = host_machine.system() == 'windows'
is_haiku = host_machine.system() == 'haiku'
if is_android
common_cppflags += '-DANDROID'
endif
if is_windows
common_cppflags += [
'-DWIN32_LEAN_AND_MEAN',
'-DWINVER=0x0600', '-D_WIN32_WINNT=0x0600',
'-DSTRICT',
'-DUNICODE', '-D_UNICODE',
]
subdir('win32')
endif
if is_android
subdir('android')
endif
add_global_arguments(common_cppflags, language: 'c')
add_global_arguments(common_cppflags, language: 'cpp')
enable_daemon = not is_windows and not is_android and get_option('daemon')
conf.set('ENABLE_DAEMON', enable_daemon)
conf.set('HAVE_LOCALE_H', compiler.has_header('locale.h'))
conf.set('HAVE_GETPWNAM_R', compiler.has_function('getpwnam_r'))
conf.set('HAVE_GETPWUID_R', compiler.has_function('getpwuid_r'))
conf.set('HAVE_INITGROUPS', compiler.has_function('initgroups'))
conf.set('HAVE_FNMATCH', compiler.has_function('fnmatch'))
# Explicitly exclude Windows in this check because
# https://github.com/mesonbuild/meson/issues/3672 (reported in 2018,
# still not fixed in 2020) causes Meson to believe it exists, because
# __builtin_strndup() exists (but strndup() still cannot be used).
conf.set('HAVE_STRNDUP', not is_windows and compiler.has_function('strndup', prefix: '#define _GNU_SOURCE\n#include <string.h>'))
conf.set('HAVE_STRCASESTR', compiler.has_function('strcasestr'))
conf.set('HAVE_PRCTL', is_linux)
conf.set('USE_EVENTFD', is_linux and get_option('eventfd'))
conf.set('USE_SIGNALFD', is_linux and get_option('signalfd'))
if is_windows
conf.set('USE_WINSELECT', true)
elif is_linux and get_option('epoll')
conf.set('USE_EPOLL', true)
else
conf.set('USE_POLL', true)
endif
if not get_option('syslog').disabled()
if compiler.has_function('syslog')
conf.set('HAVE_SYSLOG', true)
elif get_option('syslog').enabled()
error('syslog() not found')
endif
endif
enable_database = get_option('database')
conf.set('ENABLE_DATABASE', enable_database)
enable_inotify = get_option('inotify') and is_linux and enable_database
conf.set('ENABLE_INOTIFY', enable_inotify)
conf.set('ENABLE_DSD', get_option('dsd'))
inc = include_directories(
'src',
# for the generated config.h
'.',
)
boost_dep = dependency('boost', version: '>= 1.58')
if boost_dep.version() == '1.67'
# https://github.com/MusicPlayerDaemon/MPD/pull/384
# https://github.com/boostorg/lockfree/commit/12726cda009a855073b9bedbdce57b6ce7763da2
warning('Your Boost version 1.67 is known to be buggy, and the MPD build will fail. Please upgrade to Boost 1.68 or later.')
endif
sources = [
version_cxx,
'src/Main.cxx',
'src/protocol/Ack.cxx',
'src/protocol/ArgParser.cxx',
'src/protocol/Result.cxx',
'src/command/CommandError.cxx',
'src/command/AllCommands.cxx',
'src/command/QueueCommands.cxx',
'src/command/TagCommands.cxx',
'src/command/PlayerCommands.cxx',
'src/command/PlaylistCommands.cxx',
'src/command/FileCommands.cxx',
'src/command/OutputCommands.cxx',
'src/command/MessageCommands.cxx',
'src/command/ClientCommands.cxx',
'src/command/PartitionCommands.cxx',
'src/command/OtherCommands.cxx',
'src/command/CommandListBuilder.cxx',
'src/Idle.cxx',
'src/IdleFlags.cxx',
'src/decoder/Domain.cxx',
'src/decoder/Thread.cxx',
'src/decoder/Control.cxx',
'src/decoder/Bridge.cxx',
'src/decoder/DecoderPrint.cxx',
'src/client/Listener.cxx',
'src/client/Client.cxx',
'src/client/ClientEvent.cxx',
'src/client/ClientExpire.cxx',
'src/client/ClientGlobal.cxx',
'src/client/ClientIdle.cxx',
'src/client/ClientList.cxx',
'src/client/ClientNew.cxx',
'src/client/ClientProcess.cxx',
'src/client/ClientRead.cxx',
'src/client/ClientWrite.cxx',
'src/client/ClientMessage.cxx',
'src/client/ClientSubscribe.cxx',
'src/client/ClientFile.cxx',
'src/client/Response.cxx',
'src/Listen.cxx',
'src/LogInit.cxx',
'src/LogBackend.cxx',
'src/Log.cxx',
'src/ls.cxx',
'src/Instance.cxx',
'src/win32/Win32Main.cxx',
'src/MusicBuffer.cxx',
'src/MusicPipe.cxx',
'src/MusicChunk.cxx',
'src/MusicChunkPtr.cxx',
'src/Mapper.cxx',
'src/Partition.cxx',
'src/Permission.cxx',
'src/player/CrossFade.cxx',
'src/player/Thread.cxx',
'src/player/Control.cxx',
'src/PlaylistError.cxx',
'src/PlaylistPrint.cxx',
'src/PlaylistSave.cxx',
'src/playlist/PlaylistStream.cxx',
'src/playlist/PlaylistMapper.cxx',
'src/playlist/PlaylistAny.cxx',
'src/playlist/PlaylistSong.cxx',
'src/playlist/PlaylistQueue.cxx',
'src/playlist/Print.cxx',
'src/db/PlaylistVector.cxx',
'src/queue/Queue.cxx',
'src/queue/QueuePrint.cxx',
'src/queue/QueueSave.cxx',
'src/queue/Playlist.cxx',
'src/queue/PlaylistControl.cxx',
'src/queue/PlaylistEdit.cxx',
'src/queue/PlaylistTag.cxx',
'src/queue/PlaylistState.cxx',
'src/ReplayGainGlobal.cxx',
'src/LocateUri.cxx',
'src/SongUpdate.cxx',
'src/SongLoader.cxx',
'src/SongPrint.cxx',
'src/SongSave.cxx',
'src/StateFile.cxx',
'src/StateFileConfig.cxx',
'src/Stats.cxx',
'src/TagPrint.cxx',
'src/TagSave.cxx',
'src/TagFile.cxx',
'src/TagStream.cxx',
'src/TimePrint.cxx',
'src/mixer/Volume.cxx',
'src/PlaylistFile.cxx',
]
if not is_android
sources += [
'src/CommandLine.cxx',
'src/unix/SignalHandlers.cxx',
]
else
sources += [
'src/android/Context.cxx',
'src/android/AudioManager.cxx',
'src/android/Environment.cxx',
'src/android/LogListener.cxx',
]
endif
if enable_daemon
sources += 'src/unix/Daemon.cxx'
endif
if enable_database
sources += [
'src/queue/PlaylistUpdate.cxx',
'src/command/StorageCommands.cxx',
'src/command/DatabaseCommands.cxx',
]
endif
subdir('src/util')
subdir('src/time')
subdir('src/system')
subdir('src/thread')
subdir('src/net')
subdir('src/event')
subdir('src/apple')
subdir('src/lib/dbus')
subdir('src/lib/icu')
subdir('src/lib/smbclient')
subdir('src/lib/zlib')
subdir('src/lib/alsa')
subdir('src/lib/curl')
subdir('src/lib/expat')
subdir('src/lib/ffmpeg')
subdir('src/lib/gcrypt')
subdir('src/lib/nfs')
subdir('src/lib/oss')
subdir('src/lib/pcre')
subdir('src/lib/pulse')
subdir('src/lib/sndio')
subdir('src/lib/sqlite')
subdir('src/lib/systemd')
subdir('src/lib/upnp')
subdir('src/lib/yajl')
subdir('src/fs')
subdir('src/config')
subdir('src/tag')
subdir('src/pcm')
subdir('src/neighbor')
subdir('src/input')
subdir('src/archive')
subdir('src/filter')
subdir('src/mixer')
subdir('src/output')
subdir('src/lib/xiph')
subdir('src/decoder')
subdir('src/encoder')
subdir('src/song')
subdir('src/playlist')
subdir('src/zeroconf')
if curl_dep.found()
sources += 'src/RemoteTagCache.cxx'
endif
if sqlite_dep.found()
sources += [
'src/command/StickerCommands.cxx',
'src/sticker/StickerDatabase.cxx',
'src/sticker/StickerPrint.cxx',
'src/sticker/SongSticker.cxx',
]
endif
basic = static_library(
'basic',
'src/ReplayGainInfo.cxx',
'src/ReplayGainMode.cxx',
'src/SingleMode.cxx',
include_directories: inc,
)
basic_dep = declare_dependency(
link_with: basic,
)
if enable_database
subdir('src/storage')
else
storage_glue_dep = dependency('', required: false)
endif
subdir('src/db')
if neighbor_glue_dep.found()
sources += 'src/command/NeighborCommands.cxx'
endif
if archive_glue_dep.found()
sources += [
'src/TagArchive.cxx',
]
if enable_database
sources += ['src/db/update/Archive.cxx']
endif
endif
if is_windows
sources += windows_resources
endif
link_args = []
more_deps = []
if is_android
subdir('src/java')
target_type = 'shared_library'
target_name = 'mpd'
link_args += [
'-Wl,--no-undefined,-shared,-Bsymbolic',
'-llog',
'-lz',
]
more_deps += [
declare_dependency(sources: [classes_jar]),
java_dep,
]
elif is_haiku
target_type = 'executable'
target_name = 'mpd.nores'
link_args += [
'-lnetwork',
'-lbe',
]
else
target_type = 'executable'
target_name = 'mpd'
endif
mpd = build_target(
target_name,
sources,
target_type: target_type,
include_directories: inc,
dependencies: [
basic_dep,
config_dep,
dbus_dep,
fs_dep,
net_dep,
util_dep,
event_dep,
thread_dep,
neighbor_glue_dep,
input_glue_dep,
archive_glue_dep,
output_glue_dep,
mixer_glue_dep,
decoder_glue_dep,
encoder_glue_dep,
playlist_glue_dep,
db_glue_dep,
storage_glue_dep,
song_dep,
systemd_dep,
sqlite_dep,
zeroconf_dep,
more_deps,
],
link_args: link_args,
install: not is_android and not is_haiku,
)
if is_android
subdir('android/apk')
endif
if is_haiku
subdir('src/haiku')
custom_target(
'mpd',
output: 'mpd',
input: [mpd, rsrc],
command: [addres, '@OUTPUT@', '@INPUT0@', '@INPUT1@'],
install: true,
install_dir: get_option('bindir'),
)
endif
configure_file(output: 'config.h', configuration: conf)
if systemd_dep.found()
subdir('systemd')
endif
install_data(
'mpd.svg',
install_dir: join_paths(get_option('datadir'), 'icons', 'hicolor', 'scalable', 'apps'),
)
install_data(
'AUTHORS', 'COPYING', 'NEWS', 'README.md',
install_dir: join_paths(get_option('datadir'), 'doc', meson.project_name()),
)
if get_option('documentation')
subdir('doc')
endif
if get_option('test')
subdir('test')
endif

187
meson_options.txt Normal file
View File

@@ -0,0 +1,187 @@
option('documentation', type: 'boolean', value: false, description: 'Build documentation')
option('test', type: 'boolean', value: false, description: 'Build the unit tests and debug programs')
option('syslog', type: 'feature', description: 'syslog support')
option('inotify', type: 'boolean', value: true, description: 'inotify support (for automatic database update)')
option('daemon', type: 'boolean', value: true, description: 'enable daemonization')
option('systemd', type: 'feature', description: 'systemd support')
option('systemd_system_unit_dir', type: 'string', description: 'systemd system service directory')
option('systemd_user_unit_dir', type: 'string', description: 'systemd user service directory')
#
# Android
#
option('android_sdk', type: 'string', description: 'The path where Android SDK is installed')
option('android_ndk', type: 'string', description: 'The path where Android NDK is installed')
option('android_abi', type: 'string', value: 'armeabi-v7a', description: 'The Android ABI to be built')
option('android_strip', type: 'string', value: 'strip', description: 'The "strip" tool from the NDK')
option('android_debug_keystore', type: 'string', description: 'The keystore file used to sign debug APK files')
option('android_keystore', type: 'string', description: 'The keystore file used to sign APK files')
option('android_keyalias', type: 'string', description: 'The key alias used to sign APK files')
option('android_keypass', type: 'string', description: 'The password of the keystore used to sign APK files')
#
# System call support
#
option('epoll', type: 'boolean', value: true, description: 'Use epoll on Linux')
option('eventfd', type: 'boolean', value: true, description: 'Use eventfd() on Linux')
option('signalfd', type: 'boolean', value: true, description: 'Use signalfd() on Linux')
#
# Network support
#
option('tcp', type: 'boolean', value: true, description: 'Support for clients connecting via TCP')
option('ipv6', type: 'feature', description: 'Support for IPv6')
option('local_socket', type: 'boolean', value: true, description: 'Support for clients connecting via local sockets')
#
# Audio formats
#
option('dsd', type: 'boolean', value: true, description: 'Support the DSD audio format')
#
# Database plugins
#
option('database', type: 'boolean', value: true, description: 'enable support for the music database')
option('upnp', type: 'feature', description: 'UPnP client support')
option('libmpdclient', type: 'feature', description: 'libmpdclient support (for the proxy database plugin)')
#
# Neighbor plugins
#
option('neighbor', type: 'boolean', value: true, description: 'enable support for neighbor discovery')
#
# Storage plugins
#
option('udisks', type: 'feature', description: 'Support for removable media using udisks2')
option('webdav', type: 'feature', description: 'WebDAV support using CURL and Expat')
#
# Playlist plugins
#
option('cue', type: 'boolean', value: true, description: 'CUE sheet support')
#
# Input plugins
#
option('cdio_paranoia', type: 'feature', description: 'libcdio_paranoia input plugin')
option('curl', type: 'feature', description: 'HTTP client using CURL')
option('mms', type: 'feature', description: 'MMS protocol support using libmms')
option('nfs', type: 'feature', description: 'NFS protocol support using libnfs')
option('smbclient', type: 'feature', description: 'SMB support using libsmbclient')
#
# Commercial services
#
option('qobuz', type: 'feature', description: 'Qobuz client')
option('soundcloud', type: 'feature', description: 'SoundCloud client')
option('tidal', type: 'feature', description: 'Tidal client')
#
# Archive plugins
#
option('bzip2', type: 'feature', description: 'bzip2 support using libbz2')
option('iso9660', type: 'feature', description: 'ISO9660 support using libiso9660')
option('zzip', type: 'feature', description: 'ZIP support using zziplib')
#
# Tag plugins
#
option('id3tag', type: 'feature', description: 'ID3 support using libid3tag')
option('chromaprint', type: 'feature', description: 'ChromaPrint / AcoustID support')
#
# Decoder plugins
#
option('adplug', type: 'feature', description: 'AdPlug decoder plugin')
option('audiofile', type: 'feature', description: 'libaudiofile decoder plugin')
option('faad', type: 'feature', description: 'AAC decoder using libfaad')
option('ffmpeg', type: 'feature', description: 'FFmpeg codec support')
option('flac', type: 'feature', description: 'FLAC decoder plugin')
option('fluidsynth', type: 'feature', description: 'fluidsynth MIDI decoder plugin')
option('gme', type: 'feature', description: 'Game Music Emulator decoder plugin')
option('mad', type: 'feature', description: 'MP3 decoder using libmad')
option('mikmod', type: 'feature', description: 'MikMod decoder plugin')
option('modplug', type: 'feature', description: 'Modplug decoder plugin')
option('mpcdec', type: 'feature', description: 'Musepack decoder plugin')
option('mpg123', type: 'feature', description: 'MP3 decoder using libmpg123')
option('opus', type: 'feature', description: 'Opus decoder plugin')
option('sidplay', type: 'feature', description: 'C64 SID support via libsidplayfp or libsidplay2')
option('sndfile', type: 'feature', description: 'libsndfile decoder plugin')
option('tremor', type: 'feature', description: 'Fixed-point vorbis decoder plugin')
option('vorbis', type: 'feature', description: 'Vorbis decoder plugin')
option('wavpack', type: 'feature', description: 'WavPack decoder plugin')
option('wildmidi', type: 'feature', description: 'WildMidi decoder plugin')
#
# Encoder plugins
#
option('vorbisenc', type: 'feature', description: 'Vorbis encoder plugin')
option('lame', type: 'feature', description: 'LAME MP3 encoder plugin')
option('twolame', type: 'feature', description: 'TwoLAME MP2 encoder plugin')
option('shine', type: 'feature', description: 'shine MP3 encoder plugin')
option('wave_encoder', type: 'boolean', value: true, description: 'PCM wave encoder encoder plugin')
#
# Filter plugins
#
option('libsamplerate', type: 'feature', description: 'libsamplerate resampler')
option('soxr', type: 'feature', description: 'libsoxr resampler')
#
# Output plugins
#
option('alsa', type: 'feature', description: 'ALSA support')
option('ao', type: 'feature', description: 'libao output plugin')
option('fifo', type: 'boolean', value: true, description: 'FIFO output plugin')
option('httpd', type: 'boolean', value: true, description: 'HTTP streaming output plugin')
option('jack', type: 'feature', description: 'JACK output plugin')
option('openal', type: 'feature', description: 'OpenAL output plugin')
option('oss', type: 'feature', description: 'Open Sound System support')
option('pipe', type: 'boolean', value: true, description: 'Pipe output plugin')
option('pulse', type: 'feature', description: 'PulseAudio support')
option('recorder', type: 'boolean', value: true, description: 'Recorder output plugin')
option('shout', type: 'feature', description: 'Shoutcast streaming support using libshout')
option('sndio', type: 'feature', description: 'sndio output plugin')
option('solaris_output', type: 'feature', description: 'Solaris /dev/audio support')
#
# Misc libraries
#
option('dbus', type: 'feature', description: 'D-Bus support')
option('expat', type: 'feature', description: 'Expat XML support')
option('icu', type: 'feature', description: 'Use libicu for Unicode')
option('iconv', type: 'feature', description: 'Use iconv() for character set conversion')
option('pcre', type: 'feature', description: 'Enable regular expression support (using libpcre)')
option('sqlite', type: 'feature', description: 'SQLite database support (for stickers)')
option('yajl', type: 'feature', description: 'libyajl for YAML support')
option('zlib', type: 'feature', description: 'zlib support (for database compression)')
option('zeroconf', type: 'combo',
choices: ['auto', 'avahi', 'bonjour', 'disabled'],
value: 'auto',
description: 'Zeroconf support')

857
mpd.svg Normal file
View File

@@ -0,0 +1,857 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Sodipodi ("http://www.sodipodi.com/") -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.0"
x="0"
y="0"
width="128"
height="128"
id="svg1"
sodipodi:version="0.32"
sodipodi:docname="mpd.svg"
inkscape:version="0.47pre4 r22446"
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-test5.png"
inkscape:export-xdpi="76.799988"
inkscape:export-ydpi="76.799988">
<sodipodi:namedview
id="base"
inkscape:zoom="2.6884788"
inkscape:cx="71.610485"
inkscape:cy="61.484977"
inkscape:window-width="1680"
inkscape:window-height="994"
inkscape:window-x="0"
inkscape:window-y="0"
showguides="true"
inkscape:guide-bbox="true"
showgrid="false"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<defs
id="defs3">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 80 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="160 : 80 : 1"
inkscape:persp3d-origin="80 : 53.333333 : 1"
id="perspective118" />
<linearGradient
id="linearGradient919">
<stop
style="stop-color:#000000;stop-opacity:0.86092716;"
offset="0.0000000"
id="stop920" />
<stop
style="stop-color:#ffffff;stop-opacity:0.0000000;"
offset="1.0000000"
id="stop921" />
</linearGradient>
<linearGradient
id="linearGradient1068">
<stop
offset="0.0000000"
style="stop-color:#d2d2d2;stop-opacity:1.0000000;"
id="stop1070" />
<stop
offset="1.0000000"
style="stop-color:#ffffff;stop-opacity:1.0000000;"
id="stop1069" />
</linearGradient>
<linearGradient
id="linearGradient1065">
<stop
offset="0.0000000"
style="stop-color:#ffffff;stop-opacity:1.0000000;"
id="stop1067" />
<stop
offset="1.0000000"
style="stop-color:#c2bfbf;stop-opacity:0.99607843;"
id="stop1066" />
</linearGradient>
<linearGradient
id="linearGradient1060">
<stop
offset="0.0000000"
style="stop-color:#878787;stop-opacity:1.0000000;"
id="stop1063" />
<stop
offset="1.0000000"
style="stop-color:#000000;stop-opacity:0.99607843;"
id="stop1061" />
</linearGradient>
<linearGradient
id="linearGradient645">
<stop
style="stop-color:#aca597;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop646" />
<stop
style="stop-color:#ffffff;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop647" />
</linearGradient>
<linearGradient
id="linearGradient593">
<stop
style="stop-color:#478acf;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop594" />
<stop
style="stop-color:#65c6f7;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop595" />
</linearGradient>
<linearGradient
id="linearGradient574">
<stop
style="stop-color:#85ad92;stop-opacity:1.0000;"
offset="0"
id="stop575" />
<stop
style="stop-color:#559db2;stop-opacity:0.7725;"
offset="1"
id="stop576" />
</linearGradient>
<linearGradient
id="linearGradient570">
<stop
style="stop-color:#999999;stop-opacity:0.7176;"
offset="0"
id="stop571" />
<stop
style="stop-color:#ffffff;stop-opacity:0.3725;"
offset="1"
id="stop572" />
</linearGradient>
<linearGradient
id="linearGradient573"
xlink:href="#linearGradient1068"
x1="40.458553"
y1="389.65582"
x2="36.063946"
y2="357.28375"
gradientTransform="matrix(2.3025192,0,0,0.29683004,-0.91913426,-1.5117091)"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient1213"
xlink:href="#linearGradient1068"
x1="123.71407"
y1="141.41566"
x2="98.353867"
y2="113.41083"
gradientTransform="matrix(0.91680324,0,0,0.74547827,-0.91913426,-1.5117091)"
gradientUnits="userSpaceOnUse" />
<radialGradient
id="radialGradient581"
xlink:href="#linearGradient919"
cx="0.095785439"
cy="0.16814159"
r="1.5409589"
fx="0.095785439"
fy="0.16814159" />
<linearGradient
id="linearGradient580"
xlink:href="#linearGradient1068"
x1="132.0352"
y1="135.68469"
x2="119.62381"
y2="111.07157"
gradientTransform="matrix(0.90170536,0,0,0.75796032,-0.91913426,-1.5117091)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#linearGradient1060"
id="linearGradient901"
x1="0.93491787"
y1="0.92044502"
x2="-0.052546836"
y2="0.20347559" />
<linearGradient
xlink:href="#linearGradient593"
id="linearGradient902" />
<linearGradient
xlink:href="#linearGradient1068"
id="linearGradient916"
x1="0.14831461"
y1="-1.6875"
x2="0.43370786"
y2="1.8125" />
<defs
id="defs890">
<linearGradient
id="linearGradient922"
x1="0"
y1="0.5"
x2="1"
y2="0.5"
gradientUnits="objectBoundingBox"
spreadMethod="pad"
xlink:href="#linearGradient1065" />
<linearGradient
id="linearGradient908"
x1="0"
y1="0.5"
x2="1"
y2="0.5"
gradientUnits="objectBoundingBox"
spreadMethod="pad"
xlink:href="#linearGradient1060" />
<linearGradient
id="linearGradient894"
x1="0"
y1="0.5"
x2="1"
y2="0.5"
gradientUnits="objectBoundingBox"
spreadMethod="pad"
xlink:href="#linearGradient1068" />
<linearGradient
xlink:href="#linearGradient894"
id="linearGradient897"
x1="0.5955056"
y1="-0.33587787"
x2="0.61348313"
y2="1.1908396" />
<linearGradient
xlink:href="#linearGradient894"
id="linearGradient898"
x1="0.96449792"
y1="1.0278323"
x2="0.46738392"
y2="0.21800731" />
<linearGradient
xlink:href="#linearGradient908"
id="linearGradient907"
x1="0.57078654"
y1="2.3770492"
x2="0.33258426"
y2="0.49180329" />
<linearGradient
xlink:href="#linearGradient922"
id="linearGradient921"
x1="0.47058824"
y1="0.15384616"
x2="0.46547315"
y2="0.98380566" />
<linearGradient
xlink:href="#linearGradient922"
id="linearGradient948" />
<defs
id="defs987">
<linearGradient
id="linearGradient855"
x1="0"
y1="0.5"
x2="1"
y2="0.5"
gradientUnits="objectBoundingBox"
spreadMethod="pad"
xlink:href="#linearGradient908" />
<linearGradient
id="linearGradient1188"
x1="0"
y1="0.5"
x2="1"
y2="0.5"
gradientUnits="objectBoundingBox"
spreadMethod="pad"
xlink:href="#linearGradient922" />
<linearGradient
id="linearGradient831">
<stop
style="stop-color:#94897f;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop832" />
<stop
style="stop-color:#fff5fe;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop833" />
</linearGradient>
<linearGradient
xlink:href="#linearGradient1188"
id="linearGradient834"
x1="0.87550199"
y1="0.34817815"
x2="-0.29317269"
y2="0.93522269"
gradientUnits="objectBoundingBox"
spreadMethod="pad" />
<radialGradient
xlink:href="#linearGradient1188"
id="radialGradient835"
r="0.55628061"
fy="0.28125"
fx="0.59090906"
cy="0.28125"
cx="0.59090906"
spreadMethod="pad" />
<linearGradient
xlink:href="#linearGradient1188"
id="linearGradient893"
x1="0.12793733"
y1="0.76923078"
x2="0.49608356"
y2="0.70850199" />
<linearGradient
xlink:href="#linearGradient855"
id="linearGradient625"
x1="0.035955057"
y1="1.0276498"
x2="0.053932585"
y2="-0.359447" />
<linearGradient
xlink:href="#linearGradient1188"
id="linearGradient627"
x1="1.2826855"
y1="0.12550607"
x2="-0.15547703"
y2="0.96356273" />
<radialGradient
xlink:href="#linearGradient1188"
id="radialGradient628"
r="1.5982224"
fy="0.4866707"
fx="0.36789617"
cy="0.4866707"
cx="0.36789617"
gradientTransform="scale(0.877379,1.139758)" />
<linearGradient
xlink:href="#linearGradient1188"
id="linearGradient628"
x1="0.76923078"
y1="0.14979757"
x2="0.41909814"
y2="0.73279351" />
</defs>
<sodipodi:namedview
id="namedview898"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="3.4732669"
inkscape:cx="50.051177"
inkscape:cy="18.096983"
inkscape:window-width="1022"
inkscape:window-height="670"
showguides="false"
snaptoguides="false"
showgrid="false"
snaptogrid="false"
inkscape:window-x="0"
inkscape:window-y="25">
<sodipodi:guide
orientation="vertical"
position="28.705556"
id="guide879" />
<sodipodi:guide
orientation="horizontal"
position="30.130655"
id="guide880" />
</sodipodi:namedview>
</defs>
<sodipodi:namedview
id="namedview1003"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.3368738"
inkscape:cx="24.541029"
inkscape:cy="14.368596"
inkscape:window-width="640"
inkscape:window-height="499"
showguides="true"
snaptoguides="true"
inkscape:window-x="138"
inkscape:window-y="169" />
<linearGradient
xlink:href="#linearGradient1060"
id="linearGradient1304"
x1="-0.20218579"
y1="0.21681416"
x2="0.67759562"
y2="0.57522124" />
<linearGradient
xlink:href="#linearGradient1065"
id="linearGradient1322"
x1="0.32404181"
y1="0.77876109"
x2="0.24041812"
y2="0.26548672" />
<defs
id="defs989">
<linearGradient
id="linearGradient850">
<stop
style="stop-color:#eed680;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop852" />
<stop
style="stop-color:#dfb546;stop-opacity:1.0000000;"
offset="0.68035328"
id="stop858" />
<stop
style="stop-color:#d8a429;stop-opacity:1.0000000;"
offset="0.77277374"
id="stop859" />
<stop
style="stop-color:#d1940c;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop857" />
</linearGradient>
<linearGradient
xlink:href="#linearGradient850"
id="linearGradient569"
x1="0.11875"
y1="0.12612613"
x2="0.59375"
y2="0.66066068"
spreadMethod="pad" />
<linearGradient
id="linearGradient839">
<stop
style="stop-color:#46a046;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop840" />
<stop
style="stop-color:#df421e;stop-opacity:1.0000000;"
offset="0.39364964"
id="stop841" />
<stop
style="stop-color:#ada7c8;stop-opacity:1.0000000;"
offset="0.72036445"
id="stop842" />
<stop
style="stop-color:#eed680;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop843" />
</linearGradient>
<linearGradient
xlink:href="#linearGradient839"
id="linearGradient836"
x1="1.3267924e-17"
y1="0.5"
x2="1"
y2="0.5" />
<defs
id="defs604">
<linearGradient
id="linearGradient622">
<stop
style="stop-color:#f8e29d;stop-opacity:0.4471;"
offset="0"
id="stop623" />
<stop
style="stop-color:#272d2d;stop-opacity:0.4784;"
offset="1"
id="stop624" />
</linearGradient>
<linearGradient
id="linearGradient617">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop618" />
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="1"
id="stop619" />
</linearGradient>
<linearGradient
id="linearGradient613">
<stop
style="stop-color:#ffffff;stop-opacity:0.6235;"
offset="0"
id="stop614" />
<stop
style="stop-color:#5d6567;stop-opacity:1;"
offset="1"
id="stop615" />
</linearGradient>
<linearGradient
id="linearGradient607">
<stop
style="stop-color:#d7d5d5;stop-opacity:1;"
offset="0"
id="stop608" />
<stop
style="stop-color:#000000;stop-opacity:0.4039;"
offset="1"
id="stop609" />
</linearGradient>
<radialGradient
xlink:href="#linearGradient607"
id="radialGradient610"
cx="1.4287461"
cy="0.75323397"
r="0.85534656"
fx="1.4287461"
fy="0.75323397"
gradientTransform="matrix(1,2.268336e-6,-1.975559e-5,1,5.713033e-8,3.856326e-8)" />
<linearGradient
xlink:href="#linearGradient617"
id="linearGradient612"
x1="7.7024956"
y1="-2.0263922"
x2="62.759903"
y2="56.137772"
gradientTransform="scale(0.9953779,1.0046436)"
gradientUnits="userSpaceOnUse" />
<radialGradient
xlink:href="#linearGradient613"
id="radialGradient616"
cx="58.70882"
cy="53.831562"
r="43.551846"
fx="58.70882"
fy="53.831562"
gradientTransform="scale(0.99517298,1.0048504)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#linearGradient617"
id="linearGradient621" />
<linearGradient
xlink:href="#linearGradient617"
id="linearGradient626"
x1="72.060211"
y1="55.161442"
x2="32.409"
y2="12.126946"
gradientTransform="matrix(0.995134,-1.068631e-5,-1.31398e-7,1.00489,0,0)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#linearGradient607"
id="linearGradient687"
x1="67.707405"
y1="49.314793"
x2="-10.031048"
y2="4.6068792"
gradientTransform="scale(0.99522839,1.0047945)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#linearGradient617"
id="linearGradient742"
x1="-7.4378386"
y1="25.923714"
x2="18.009745"
y2="10.089797"
gradientTransform="scale(0.889853,1.123781)" />
</defs>
<sodipodi:namedview
id="namedview889"
showguides="true"
snaptoguides="true"
inkscape:zoom="7.5625000"
inkscape:cx="24.000000"
inkscape:cy="24.000000"
inkscape:window-width="640"
inkscape:window-height="496"
inkscape:window-x="0"
inkscape:window-y="26" />
</defs>
<sodipodi:namedview
id="namedview1023"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="3.5521067"
inkscape:cx="66.459318"
inkscape:cy="62.629296"
inkscape:window-width="1150"
inkscape:window-height="752"
showgrid="true"
snaptogrid="true"
inkscape:window-x="0"
inkscape:window-y="29">
<inkscape:grid
id="GridFromPre046Settings"
type="xygrid"
originx="0px"
originy="0px"
spacingx="1.0000000mm"
spacingy="1.0000000mm"
color="#0000ff"
empcolor="#0000ff"
opacity="0.2"
empopacity="0.4"
empspacing="5" />
</sodipodi:namedview>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient1068"
id="linearGradient2924"
x1="41.673889"
y1="320.40921"
x2="36.082947"
y2="279.22458"
gradientTransform="matrix(2.3376099,0,0,0.29237422,-0.91913426,-1.5117091)"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient1068"
id="linearGradient2926"
x1="134.95444"
y1="108.16693"
x2="102.05431"
y2="71.835884"
gradientTransform="matrix(0.91680324,0,0,0.74547824,-0.91913426,-1.5117091)"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient1068"
id="linearGradient2928"
x1="145.32188"
y1="101.97199"
x2="129.22044"
y2="70.041069"
gradientTransform="matrix(0.90170536,0,0,0.75796032,-0.91913426,-1.5117091)"
gradientUnits="userSpaceOnUse" />
</defs>
<rect
style="fill-opacity:0.47154475;fill-rule:evenodd;stroke-width:3pt"
id="rect918"
width="48.72493"
height="42.16835"
ry="0.74231374"
x="67.536102"
y="66.474693"
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
inkscape:export-xdpi="721.66998"
inkscape:export-ydpi="721.66998"
rx="0.7811048" />
<rect
style="fill-opacity:0.47154475;fill-rule:evenodd;stroke-width:3pt"
id="rect1006"
width="63.211483"
height="54.705563"
ry="0.74231374"
x="64.47226"
y="30.558294"
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
inkscape:export-xdpi="721.66998"
inkscape:export-ydpi="721.66998"
rx="0.7811048" />
<rect
style="fill:#000000;fill-opacity:0.47058824;fill-rule:evenodd"
id="rect1005"
width="57.843418"
height="9.0050545"
ry="0.62889248"
x="65.398254"
y="82.153206"
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
inkscape:export-xdpi="721.66998"
inkscape:export-ydpi="721.66998"
rx="0.66175652" />
<rect
style="fill:url(#linearGradient2924);fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.82671446"
id="rect1007"
width="54.910637"
height="6.1445785"
ry="0.42912331"
x="64.622299"
y="82.282539"
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
inkscape:export-xdpi="721.66998"
inkscape:export-ydpi="721.66998"
rx="0.44939452" />
<rect
width="57.905403"
height="47.084496"
ry="1.7822117"
x="63.784973"
y="32.456562"
style="font-size:12px;fill:url(#linearGradient2926);fill-rule:evenodd;stroke:#000000;stroke-width:0"
id="rect1009"
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
inkscape:export-xdpi="721.66998"
inkscape:export-ydpi="721.66998"
rx="1.6336281" />
<rect
style="fill:#000000;fill-opacity:0.47058824;fill-rule:evenodd"
id="rect971"
width="44.58709"
height="6.9413123"
ry="0.62889248"
x="68.249886"
y="106.24529"
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
inkscape:export-xdpi="721.66998"
inkscape:export-ydpi="721.66998"
rx="0.66175652" />
<rect
width="64.637024"
height="54.068516"
ry="1.4120796"
x="59.853096"
y="28.740753"
style="font-size:12px;fill:url(#linearGradient2928);fill-rule:evenodd;stroke:#000000;stroke-width:1.65869105"
id="rect1008"
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
inkscape:export-xdpi="721.66998"
inkscape:export-ydpi="721.66998"
rx="1.3970968" />
<rect
width="51.129478"
height="39.964478"
ry="0.5422883"
x="66.358932"
y="34.89621"
style="font-size:12px;fill:#00b4ed;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.79054338;stroke-linejoin:round"
id="rect976"
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
inkscape:export-xdpi="721.66998"
inkscape:export-ydpi="721.66998"
rx="0.5422883" />
<metadata
id="metadata982">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<rect
width="44.634872"
height="36.293858"
ry="1.7822117"
x="67.006332"
y="67.937927"
style="font-size:12px;fill:url(#linearGradient1213);fill-rule:evenodd;stroke:#000000;stroke-width:0"
id="rect575"
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
inkscape:export-xdpi="721.66998"
inkscape:export-ydpi="721.66998"
rx="1.633628" />
<path
sodipodi:type="arc"
style="font-size:12px;fill:#444040;fill-opacity:0.47058824;fill-rule:evenodd"
id="path672"
d="m 68.473,57.85183 a 23.629898,3.2222576 0 1 1 -47.259797,0 23.629898,3.2222576 0 1 1 47.259797,0 z"
sodipodi:cx="44.843102"
sodipodi:cy="57.85183"
sodipodi:rx="23.629898"
sodipodi:ry="3.2222576"
transform="matrix(1.4221482,0,-0.30247168,1.9834766,9.6201687,-10.428817)"
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big2.png"
inkscape:export-xdpi="721.66998"
inkscape:export-ydpi="721.66998" />
<path
sodipodi:type="arc"
style="font-size:12px;fill:#4e4d4b;fill-rule:evenodd;stroke:#000000;stroke-width:2.30019999;stroke-opacity:0.9565"
id="path625"
d="m 58.291138,27.531645 a 19.367088,19.556963 0 1 1 -38.734177,0 19.367088,19.556963 0 1 1 38.734177,0 z"
sodipodi:cx="38.924049"
sodipodi:cy="27.531645"
sodipodi:rx="19.367088"
sodipodi:ry="19.556963"
transform="matrix(-1.0172416,-0.47376693,-0.5523759,1.3286212,116.84611,57.272851)"
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big2.png"
inkscape:export-xdpi="721.66998"
inkscape:export-ydpi="721.66998" />
<path
sodipodi:type="arc"
style="font-size:12px;fill:url(#linearGradient612);fill-rule:evenodd;stroke:#000000;stroke-width:2.06100011;stroke-opacity:0.9565"
id="path605"
d="m 58.291138,27.531645 a 19.367088,19.556963 0 1 1 -38.734177,0 19.367088,19.556963 0 1 1 38.734177,0 z"
sodipodi:cx="38.924049"
sodipodi:cy="27.531645"
sodipodi:rx="19.367088"
sodipodi:ry="19.556963"
transform="matrix(-1.4321234,-0.79696518,-1.1299666,2.2349846,128.07685,29.383033)"
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big2.png"
inkscape:export-xdpi="721.66998"
inkscape:export-ydpi="721.66998" />
<path
sodipodi:type="arc"
style="font-size:12px;fill:url(#radialGradient616);fill-rule:evenodd;stroke:#000000;stroke-width:0.317;stroke-opacity:0.97829997"
id="path606"
d="m 58.291138,27.531645 a 19.367088,19.556963 0 1 1 -38.734177,0 19.367088,19.556963 0 1 1 38.734177,0 z"
sodipodi:cx="38.924049"
sodipodi:cy="27.531645"
sodipodi:rx="19.367088"
sodipodi:ry="19.556963"
transform="matrix(-1.1546358,-0.69851175,-0.95634664,1.9588777,108.06887,31.115628)"
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big2.png"
inkscape:export-xdpi="721.66998"
inkscape:export-ydpi="721.66998" />
<path
sodipodi:type="arc"
style="font-size:12px;fill-rule:evenodd;stroke-width:1.63499999"
id="path686"
d="m 58.291138,27.531645 a 19.367088,19.556963 0 1 1 -38.734177,0 19.367088,19.556963 0 1 1 38.734177,0 z"
sodipodi:cx="38.924049"
sodipodi:cy="27.531645"
sodipodi:rx="19.367088"
sodipodi:ry="19.556963"
transform="matrix(-0.39495459,-0.4546194,-0.52881207,0.94219495,73.198184,52.427791)"
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big2.png"
inkscape:export-xdpi="721.66998"
inkscape:export-ydpi="721.66998" />
<path
sodipodi:type="arc"
style="font-size:12px;fill:url(#linearGradient687);fill-rule:evenodd;stroke:#3f3b3b;stroke-width:0.77380002"
id="path611"
d="m 58.291138,27.531645 a 19.367088,19.556963 0 1 1 -38.734177,0 19.367088,19.556963 0 1 1 38.734177,0 z"
sodipodi:cx="38.924049"
sodipodi:cy="27.531645"
sodipodi:rx="19.367088"
sodipodi:ry="19.556963"
transform="matrix(-0.36949013,-0.40957751,-0.49471918,0.84885391,70.248021,52.066881)"
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big2.png"
inkscape:export-xdpi="721.66998"
inkscape:export-ydpi="721.66998" />
<rect
style="fill:url(#linearGradient573);fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.82671446"
id="rect934"
width="42.326431"
height="4.7363882"
ry="0.42912331"
x="67.651756"
y="106.34497"
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
inkscape:export-xdpi="721.66998"
inkscape:export-ydpi="721.66998"
rx="0.44939449" />
<rect
width="49.823761"
height="41.677303"
ry="1.4120796"
x="63.975548"
y="65.073692"
style="font-size:12px;fill:url(#linearGradient580);fill-rule:evenodd;stroke:#000000;stroke-width:1.27855873;stroke-opacity:1"
id="rect562"
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
inkscape:export-xdpi="721.66998"
inkscape:export-ydpi="721.66998"
rx="1.3970969" />
<rect
width="39.411831"
height="30.805574"
ry="0.5422883"
x="68.990387"
y="70.097008"
style="font-size:12px;fill:#003d88;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.61407685;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.93023257"
id="rect975"
inkscape:export-filename="/cowserver/documents/httpd/vhosts/images/mpd-big7.png"
inkscape:export-xdpi="721.66998"
inkscape:export-ydpi="721.66998"
rx="0.5422883" />
</svg>

After

Width:  |  Height:  |  Size: 27 KiB

64
python/build/autotools.py Normal file
View File

@@ -0,0 +1,64 @@
import os.path, subprocess, sys
from build.makeproject import MakeProject
class AutotoolsProject(MakeProject):
def __init__(self, url, md5, installed, configure_args=[],
autogen=False,
autoreconf=False,
cppflags='',
ldflags='',
libs='',
subdirs=None,
**kwargs):
MakeProject.__init__(self, url, md5, installed, **kwargs)
self.configure_args = configure_args
self.autogen = autogen
self.autoreconf = autoreconf
self.cppflags = cppflags
self.ldflags = ldflags
self.libs = libs
self.subdirs = subdirs
def configure(self, toolchain):
src = self.unpack(toolchain)
if self.autogen:
if sys.platform == 'darwin':
subprocess.check_call(['glibtoolize', '--force'], cwd=src)
else:
subprocess.check_call(['libtoolize', '--force'], cwd=src)
subprocess.check_call(['aclocal'], cwd=src)
subprocess.check_call(['automake', '--add-missing', '--force-missing', '--foreign'], cwd=src)
subprocess.check_call(['autoconf'], cwd=src)
if self.autoreconf:
subprocess.check_call(['autoreconf', '-vif'], cwd=src)
build = self.make_build_path(toolchain)
configure = [
os.path.join(src, 'configure'),
'CC=' + toolchain.cc,
'CXX=' + toolchain.cxx,
'CFLAGS=' + toolchain.cflags,
'CXXFLAGS=' + toolchain.cxxflags,
'CPPFLAGS=' + toolchain.cppflags + ' ' + self.cppflags,
'LDFLAGS=' + toolchain.ldflags + ' ' + self.ldflags,
'LIBS=' + toolchain.libs + ' ' + self.libs,
'AR=' + toolchain.ar,
'RANLIB=' + toolchain.ranlib,
'STRIP=' + toolchain.strip,
'--host=' + toolchain.arch,
'--prefix=' + toolchain.install_prefix,
'--enable-silent-rules',
] + self.configure_args
subprocess.check_call(configure, cwd=build, env=toolchain.env)
return build
def build(self, toolchain):
build = self.configure(toolchain)
if self.subdirs is not None:
for subdir in self.subdirs:
MakeProject.build(self, toolchain, os.path.join(build, subdir))
else:
MakeProject.build(self, toolchain, build)

23
python/build/boost.py Normal file
View File

@@ -0,0 +1,23 @@
import os, shutil
import re
from build.project import Project
class BoostProject(Project):
def __init__(self, url, md5, installed,
**kwargs):
m = re.match(r'.*/boost_(\d+)_(\d+)_(\d+)\.tar\.bz2$', url)
version = "%s.%s.%s" % (m.group(1), m.group(2), m.group(3))
Project.__init__(self, url, md5, installed,
name='boost', version=version,
**kwargs)
def build(self, toolchain):
src = self.unpack(toolchain)
# install the headers manually; don't build any library
# (because right now, we only use header-only libraries)
includedir = os.path.join(toolchain.install_prefix, 'include')
dest = os.path.join(includedir, 'boost')
shutil.rmtree(dest, ignore_errors=True)
shutil.copytree(os.path.join(src, 'boost'), dest)

45
python/build/cmake.py Normal file
View File

@@ -0,0 +1,45 @@
import subprocess
from build.project import Project
def configure(toolchain, src, build, args=()):
cross_args = []
if toolchain.is_windows:
cross_args.append('-DCMAKE_SYSTEM_NAME=Windows')
cross_args.append('-DCMAKE_RC_COMPILER=' + toolchain.windres)
configure = [
'cmake',
src,
'-DCMAKE_INSTALL_PREFIX=' + toolchain.install_prefix,
'-DCMAKE_BUILD_TYPE=release',
'-DCMAKE_C_COMPILER=' + toolchain.cc,
'-DCMAKE_CXX_COMPILER=' + toolchain.cxx,
'-DCMAKE_C_FLAGS=' + toolchain.cflags + ' ' + toolchain.cppflags,
'-DCMAKE_CXX_FLAGS=' + toolchain.cxxflags + ' ' + toolchain.cppflags,
'-GNinja',
] + cross_args + args
subprocess.check_call(configure, env=toolchain.env, cwd=build)
class CmakeProject(Project):
def __init__(self, url, md5, installed, configure_args=[],
**kwargs):
Project.__init__(self, url, md5, installed, **kwargs)
self.configure_args = configure_args
def configure(self, toolchain):
src = self.unpack(toolchain)
build = self.make_build_path(toolchain)
configure(toolchain, src, build, self.configure_args)
return build
def build(self, toolchain):
build = self.configure(toolchain)
subprocess.check_call(['ninja', 'install'],
cwd=build, env=toolchain.env)

9
python/build/dirs.py Normal file
View File

@@ -0,0 +1,9 @@
import os.path
lib_path = os.path.abspath('lib')
shared_path = lib_path
if 'MPD_SHARED_LIB' in os.environ:
shared_path = os.environ['MPD_SHARED_LIB']
tarball_path = os.path.join(shared_path, 'download')
src_path = os.path.join(shared_path, 'src')

26
python/build/download.py Normal file
View File

@@ -0,0 +1,26 @@
from build.verify import verify_file_digest
import os
import urllib.request
def download_and_verify(url, md5, parent_path):
"""Download a file, verify its MD5 checksum and return the local path."""
os.makedirs(parent_path, exist_ok=True)
path = os.path.join(parent_path, os.path.basename(url))
try:
if verify_file_digest(path, md5): return path
os.unlink(path)
except FileNotFoundError:
pass
tmp_path = path + '.tmp'
print("download", url)
urllib.request.urlretrieve(url, tmp_path)
if not verify_file_digest(tmp_path, md5):
os.unlink(tmp_path)
raise RuntimeError("Digest mismatch")
os.rename(tmp_path, path)
return path

56
python/build/ffmpeg.py Normal file
View File

@@ -0,0 +1,56 @@
import os.path, subprocess
from build.project import Project
class FfmpegProject(Project):
def __init__(self, url, md5, installed, configure_args=[],
cppflags='',
**kwargs):
Project.__init__(self, url, md5, installed, **kwargs)
self.configure_args = configure_args
self.cppflags = cppflags
def _filter_cflags(self, flags):
# FFmpeg expects the GNU as syntax
flags = flags.replace(' -integrated-as ', ' -no-integrated-as ')
return flags
def build(self, toolchain):
src = self.unpack(toolchain)
build = self.make_build_path(toolchain)
if toolchain.is_arm:
arch = 'arm'
elif toolchain.is_aarch64:
arch = 'aarch64'
else:
arch = 'x86'
if toolchain.is_windows:
target_os = 'mingw32'
else:
target_os = 'linux'
configure = [
os.path.join(src, 'configure'),
'--cc=' + toolchain.cc,
'--cxx=' + toolchain.cxx,
'--nm=' + toolchain.nm,
'--extra-cflags=' + self._filter_cflags(toolchain.cflags) + ' ' + toolchain.cppflags + ' ' + self.cppflags,
'--extra-cxxflags=' + self._filter_cflags(toolchain.cxxflags) + ' ' + toolchain.cppflags + ' ' + self.cppflags,
'--extra-ldflags=' + toolchain.ldflags,
'--extra-libs=' + toolchain.libs,
'--ar=' + toolchain.ar,
'--ranlib=' + toolchain.ranlib,
'--enable-cross-compile',
'--arch=' + arch,
'--target-os=' + target_os,
'--prefix=' + toolchain.install_prefix,
] + self.configure_args
if toolchain.is_armv7:
configure.append('--cpu=cortex-a8')
subprocess.check_call(configure, cwd=build, env=toolchain.env)
subprocess.check_call(['/usr/bin/make', '--quiet', '-j12'], cwd=build, env=toolchain.env)
subprocess.check_call(['/usr/bin/make', '--quiet', 'install'], cwd=build, env=toolchain.env)

439
python/build/libs.py Normal file
View File

@@ -0,0 +1,439 @@
import re
from os.path import abspath
from build.project import Project
from build.zlib import ZlibProject
from build.meson import MesonProject
from build.cmake import CmakeProject
from build.autotools import AutotoolsProject
from build.ffmpeg import FfmpegProject
from build.boost import BoostProject
libmpdclient = MesonProject(
'https://www.musicpd.org/download/libmpdclient/2/libmpdclient-2.19.tar.xz',
'158aad4c2278ab08e76a3f2b0166c99b39fae00ee17231bd225c5a36e977a189',
'lib/libmpdclient.a',
)
libogg = AutotoolsProject(
'http://downloads.xiph.org/releases/ogg/libogg-1.3.4.tar.xz',
'c163bc12bc300c401b6aa35907ac682671ea376f13ae0969a220f7ddf71893fe',
'lib/libogg.a',
[
'--disable-shared', '--enable-static',
],
)
libvorbis = AutotoolsProject(
'http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.7.tar.xz',
'b33cc4934322bcbf6efcbacf49e3ca01aadbea4114ec9589d1b1e9d20f72954b',
'lib/libvorbis.a',
[
'--disable-shared', '--enable-static',
],
edits={
# this option is not understood by clang
'configure': lambda data: data.replace('-mno-ieee-fp', ' '),
}
)
opus = AutotoolsProject(
'https://archive.mozilla.org/pub/opus/opus-1.3.1.tar.gz',
'65b58e1e25b2a114157014736a3d9dfeaad8d41be1c8179866f144a2fb44ff9d',
'lib/libopus.a',
[
'--disable-shared', '--enable-static',
'--disable-doc',
'--disable-extra-programs',
],
# suppress "visibility default" from opus_defines.h
cppflags='-DOPUS_EXPORT=',
)
flac = AutotoolsProject(
'http://downloads.xiph.org/releases/flac/flac-1.3.3.tar.xz',
'213e82bd716c9de6db2f98bcadbc4c24c7e2efe8c75939a1a84e28539c4e1748',
'lib/libFLAC.a',
[
'--disable-shared', '--enable-static',
'--disable-xmms-plugin', '--disable-cpplibs',
'--disable-doxygen-docs',
],
subdirs=['include', 'src/libFLAC'],
)
zlib = ZlibProject(
'http://zlib.net/zlib-1.2.11.tar.xz',
'4ff941449631ace0d4d203e3483be9dbc9da454084111f97ea0a2114e19bf066',
'lib/libz.a',
)
libid3tag = AutotoolsProject(
'ftp://ftp.mars.org/pub/mpeg/libid3tag-0.15.1b.tar.gz',
'e5808ad997ba32c498803822078748c3',
'lib/libid3tag.a',
[
'--disable-shared', '--enable-static',
# without this, libid3tag's configure.ac ignores -O* and -f*
'--disable-debugging',
],
autogen=True,
edits={
# fix bug in libid3tag's configure.ac which discards all but the last optimization flag
'configure.ac': lambda data: re.sub(r'optimize="\$1"', r'optimize="$optimize $1"', data, count=1),
}
)
libmad = AutotoolsProject(
'ftp://ftp.mars.org/pub/mpeg/libmad-0.15.1b.tar.gz',
'1be543bc30c56fb6bea1d7bf6a64e66c',
'lib/libmad.a',
[
'--disable-shared', '--enable-static',
# without this, libmad's configure.ac ignores -O* and -f*
'--disable-debugging',
],
autogen=True,
)
liblame = AutotoolsProject(
'http://downloads.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz',
'ddfe36cab873794038ae2c1210557ad34857a4b6bdc515785d1da9e175b1da1e',
'lib/libmp3lame.a',
[
'--disable-shared', '--enable-static',
'--disable-gtktest', '--disable-analyzer-hooks',
'--disable-decoder', '--disable-frontend',
],
)
libmodplug = AutotoolsProject(
'https://downloads.sourceforge.net/modplug-xmms/libmodplug/0.8.9.0/libmodplug-0.8.9.0.tar.gz',
'457ca5a6c179656d66c01505c0d95fafaead4329b9dbaa0f997d00a3508ad9de',
'lib/libmodplug.a',
[
'--disable-shared', '--enable-static',
],
)
wildmidi = CmakeProject(
'https://codeload.github.com/Mindwerks/wildmidi/tar.gz/wildmidi-0.4.3',
'498e5a96455bb4b91b37188ad6dcb070824e92c44f5ed452b90adbaec8eef3c5',
'lib/libWildMidi.a',
[
'-DBUILD_SHARED_LIBS=OFF',
'-DWANT_PLAYER=OFF',
'-DWANT_STATIC=ON',
],
base='wildmidi-wildmidi-0.4.3',
name='wildmidi',
version='0.4.3',
)
gme = CmakeProject(
'https://bitbucket.org/mpyne/game-music-emu/downloads/game-music-emu-0.6.3.tar.xz',
'aba34e53ef0ec6a34b58b84e28bf8cfbccee6585cebca25333604c35db3e051d',
'lib/libgme.a',
[
'-DBUILD_SHARED_LIBS=OFF',
'-DENABLE_UBSAN=OFF',
'-DZLIB_INCLUDE_DIR=OFF',
'-DSDL2_DIR=OFF',
],
)
ffmpeg = FfmpegProject(
'http://ffmpeg.org/releases/ffmpeg-4.3.1.tar.xz',
'ad009240d46e307b4e03a213a0f49c11b650e445b1f8be0dda2a9212b34d2ffb',
'lib/libavcodec.a',
[
'--disable-shared', '--enable-static',
'--enable-gpl',
'--enable-small',
'--disable-pthreads',
'--disable-programs',
'--disable-doc',
'--disable-avdevice',
'--disable-swresample',
'--disable-swscale',
'--disable-postproc',
'--disable-avfilter',
'--disable-lzo',
'--disable-faan',
'--disable-pixelutils',
'--disable-network',
'--disable-encoders',
'--disable-muxers',
'--disable-protocols',
'--disable-devices',
'--disable-filters',
'--disable-v4l2_m2m',
'--disable-parser=bmp',
'--disable-parser=cavsvideo',
'--disable-parser=dvbsub',
'--disable-parser=dvdsub',
'--disable-parser=dvd_nav',
'--disable-parser=flac',
'--disable-parser=g729',
'--disable-parser=gsm',
'--disable-parser=h261',
'--disable-parser=h263',
'--disable-parser=h264',
'--disable-parser=hevc',
'--disable-parser=mjpeg',
'--disable-parser=mlp',
'--disable-parser=mpeg4video',
'--disable-parser=mpegvideo',
'--disable-parser=opus',
'--disable-parser=vc1',
'--disable-parser=vp3',
'--disable-parser=vp8',
'--disable-parser=vp9',
'--disable-parser=png',
'--disable-parser=pnm',
'--disable-parser=xma',
'--disable-demuxer=aqtitle',
'--disable-demuxer=ass',
'--disable-demuxer=bethsoftvid',
'--disable-demuxer=bink',
'--disable-demuxer=cavsvideo',
'--disable-demuxer=cdxl',
'--disable-demuxer=dvbsub',
'--disable-demuxer=dvbtxt',
'--disable-demuxer=h261',
'--disable-demuxer=h263',
'--disable-demuxer=h264',
'--disable-demuxer=ico',
'--disable-demuxer=image2',
'--disable-demuxer=jacosub',
'--disable-demuxer=lrc',
'--disable-demuxer=microdvd',
'--disable-demuxer=mjpeg',
'--disable-demuxer=mjpeg_2000',
'--disable-demuxer=mpegps',
'--disable-demuxer=mpegvideo',
'--disable-demuxer=mpl2',
'--disable-demuxer=mpsub',
'--disable-demuxer=pjs',
'--disable-demuxer=rawvideo',
'--disable-demuxer=realtext',
'--disable-demuxer=sami',
'--disable-demuxer=scc',
'--disable-demuxer=srt',
'--disable-demuxer=stl',
'--disable-demuxer=subviewer',
'--disable-demuxer=subviewer1',
'--disable-demuxer=swf',
'--disable-demuxer=tedcaptions',
'--disable-demuxer=vobsub',
'--disable-demuxer=vplayer',
'--disable-demuxer=webvtt',
'--disable-demuxer=yuv4mpegpipe',
# we don't need these decoders, because we have the dedicated
# libraries
'--disable-decoder=flac',
'--disable-decoder=opus',
'--disable-decoder=vorbis',
# audio codecs nobody uses
'--disable-decoder=atrac1',
'--disable-decoder=atrac3',
'--disable-decoder=atrac3al',
'--disable-decoder=atrac3p',
'--disable-decoder=atrac3pal',
'--disable-decoder=binkaudio_dct',
'--disable-decoder=binkaudio_rdft',
'--disable-decoder=bmv_audio',
'--disable-decoder=dsicinaudio',
'--disable-decoder=dvaudio',
'--disable-decoder=metasound',
'--disable-decoder=paf_audio',
'--disable-decoder=ra_144',
'--disable-decoder=ra_288',
'--disable-decoder=ralf',
'--disable-decoder=qdm2',
'--disable-decoder=qdmc',
# disable lots of image and video codecs
'--disable-decoder=ass',
'--disable-decoder=asv1',
'--disable-decoder=asv2',
'--disable-decoder=apng',
'--disable-decoder=avrn',
'--disable-decoder=avrp',
'--disable-decoder=bethsoftvid',
'--disable-decoder=bink',
'--disable-decoder=bmp',
'--disable-decoder=bmv_video',
'--disable-decoder=cavs',
'--disable-decoder=ccaption',
'--disable-decoder=cdgraphics',
'--disable-decoder=clearvideo',
'--disable-decoder=dirac',
'--disable-decoder=dsicinvideo',
'--disable-decoder=dvbsub',
'--disable-decoder=dvdsub',
'--disable-decoder=dvvideo',
'--disable-decoder=exr',
'--disable-decoder=ffv1',
'--disable-decoder=ffvhuff',
'--disable-decoder=ffwavesynth',
'--disable-decoder=flic',
'--disable-decoder=flv',
'--disable-decoder=fraps',
'--disable-decoder=gif',
'--disable-decoder=h261',
'--disable-decoder=h263',
'--disable-decoder=h263i',
'--disable-decoder=h263p',
'--disable-decoder=h264',
'--disable-decoder=hevc',
'--disable-decoder=hnm4_video',
'--disable-decoder=hq_hqa',
'--disable-decoder=hqx',
'--disable-decoder=idcin',
'--disable-decoder=iff_ilbm',
'--disable-decoder=indeo2',
'--disable-decoder=indeo3',
'--disable-decoder=indeo4',
'--disable-decoder=indeo5',
'--disable-decoder=interplay_video',
'--disable-decoder=jacosub',
'--disable-decoder=jpeg2000',
'--disable-decoder=jpegls',
'--disable-decoder=microdvd',
'--disable-decoder=mimic',
'--disable-decoder=mjpeg',
'--disable-decoder=mmvideo',
'--disable-decoder=mpl2',
'--disable-decoder=motionpixels',
'--disable-decoder=mpeg1video',
'--disable-decoder=mpeg2video',
'--disable-decoder=mpeg4',
'--disable-decoder=mpegvideo',
'--disable-decoder=mscc',
'--disable-decoder=msmpeg4_crystalhd',
'--disable-decoder=msmpeg4v1',
'--disable-decoder=msmpeg4v2',
'--disable-decoder=msmpeg4v3',
'--disable-decoder=msvideo1',
'--disable-decoder=mszh',
'--disable-decoder=mvc1',
'--disable-decoder=mvc2',
'--disable-decoder=on2avc',
'--disable-decoder=paf_video',
'--disable-decoder=png',
'--disable-decoder=qdraw',
'--disable-decoder=qpeg',
'--disable-decoder=rawvideo',
'--disable-decoder=realtext',
'--disable-decoder=roq',
'--disable-decoder=roq_dpcm',
'--disable-decoder=rscc',
'--disable-decoder=rv10',
'--disable-decoder=rv20',
'--disable-decoder=rv30',
'--disable-decoder=rv40',
'--disable-decoder=sami',
'--disable-decoder=sheervideo',
'--disable-decoder=snow',
'--disable-decoder=srt',
'--disable-decoder=stl',
'--disable-decoder=subrip',
'--disable-decoder=subviewer',
'--disable-decoder=subviewer1',
'--disable-decoder=svq1',
'--disable-decoder=svq3',
'--disable-decoder=tiff',
'--disable-decoder=tiertexseqvideo',
'--disable-decoder=truemotion1',
'--disable-decoder=truemotion2',
'--disable-decoder=truemotion2rt',
'--disable-decoder=twinvq',
'--disable-decoder=utvideo',
'--disable-decoder=vc1',
'--disable-decoder=vmdvideo',
'--disable-decoder=vp3',
'--disable-decoder=vp5',
'--disable-decoder=vp6',
'--disable-decoder=vp7',
'--disable-decoder=vp8',
'--disable-decoder=vp9',
'--disable-decoder=vqa',
'--disable-decoder=webvtt',
'--disable-decoder=wmv1',
'--disable-decoder=wmv2',
'--disable-decoder=wmv3',
'--disable-decoder=yuv4',
],
)
curl = AutotoolsProject(
'http://curl.haxx.se/download/curl-7.72.0.tar.xz',
'0ded0808c4d85f2ee0db86980ae610cc9d165e9ca9da466196cc73c346513713',
'lib/libcurl.a',
[
'--disable-shared', '--enable-static',
'--disable-debug',
'--enable-http',
'--enable-ipv6',
'--disable-ftp', '--disable-file',
'--disable-ldap', '--disable-ldaps',
'--disable-rtsp', '--disable-proxy', '--disable-dict', '--disable-telnet',
'--disable-tftp', '--disable-pop3', '--disable-imap', '--disable-smtp',
'--disable-smb',
'--disable-gopher',
'--disable-manual',
'--disable-threaded-resolver', '--disable-verbose', '--disable-sspi',
'--disable-crypto-auth', '--disable-ntlm-wb', '--disable-tls-srp', '--disable-cookies',
'--disable-doh',
'--disable-mime',
'--disable-netrc',
'--disable-progress-meter',
'--disable-alt-svc',
'--without-ssl', '--without-gnutls', '--without-nss', '--without-libssh2',
],
patches='src/lib/curl/patches',
)
libexpat = AutotoolsProject(
'https://github.com/libexpat/libexpat/releases/download/R_2_2_9/expat-2.2.9.tar.bz2',
'f1063084dc4302a427dabcca499c8312b3a32a29b7d2506653ecc8f950a9a237',
'lib/libexpat.a',
[
'--disable-shared', '--enable-static',
'--without-docbook',
],
)
libnfs = AutotoolsProject(
'https://github.com/sahlberg/libnfs/archive/libnfs-4.0.0.tar.gz',
'6ee77e9fe220e2d3e3b1f53cfea04fb319828cc7dbb97dd9df09e46e901d797d',
'lib/libnfs.a',
[
'--disable-shared', '--enable-static',
'--disable-debug',
# work around -Wtautological-compare
'--disable-werror',
'--disable-utils', '--disable-examples',
],
base='libnfs-libnfs-4.0.0',
autoreconf=True,
)
boost = BoostProject(
'https://dl.bintray.com/boostorg/release/1.74.0/source/boost_1_74_0.tar.bz2',
'83bfc1507731a0906e387fc28b7ef5417d591429e51e788417fe9ff025e116b1',
'include/boost/version.hpp',
)

View File

@@ -0,0 +1,28 @@
import subprocess
from build.project import Project
class MakeProject(Project):
def __init__(self, url, md5, installed,
install_target='install',
**kwargs):
Project.__init__(self, url, md5, installed, **kwargs)
self.install_target = install_target
def get_simultaneous_jobs(self):
return 12
def get_make_args(self, toolchain):
return ['--quiet', '-j' + str(self.get_simultaneous_jobs())]
def get_make_install_args(self, toolchain):
return ['--quiet', self.install_target]
def make(self, toolchain, wd, args):
subprocess.check_call(['/usr/bin/make'] + args,
cwd=wd, env=toolchain.env)
def build(self, toolchain, wd, install=True):
self.make(toolchain, wd, self.get_make_args(toolchain))
if install:
self.make(toolchain, wd, self.get_make_install_args(toolchain))

116
python/build/meson.py Normal file
View File

@@ -0,0 +1,116 @@
import os.path, subprocess, sys
from build.project import Project
def make_cross_file(toolchain):
if toolchain.is_windows:
system = 'windows'
windres = "windres = '%s'" % toolchain.windres
else:
system = 'linux'
windres = ''
if toolchain.is_arm:
cpu_family = 'arm'
if toolchain.is_armv7:
cpu = 'armv7'
else:
cpu = 'armv6'
elif toolchain.is_aarch64:
cpu_family = 'aarch64'
cpu = 'arm64-v8a'
else:
cpu_family = 'x86'
if 'x86_64' in toolchain.arch:
cpu = 'x86_64'
else:
cpu = 'i686'
# TODO: support more CPUs
endian = 'little'
# TODO: write pkg-config wrapper
path = os.path.join(toolchain.build_path, 'meson.cross')
os.makedirs(toolchain.build_path, exist_ok=True)
with open(path, 'w') as f:
f.write("""
[binaries]
c = '%s'
cpp = '%s'
ar = '%s'
strip = '%s'
pkgconfig = '%s'
%s
[properties]
root = '%s'
c_args = %s
c_link_args = %s
cpp_args = %s
cpp_link_args = %s
# Keep Meson from executing Android-x86 test binariees
needs_exe_wrapper = true
[host_machine]
system = '%s'
cpu_family = '%s'
cpu = '%s'
endian = '%s'
""" % (toolchain.cc, toolchain.cxx, toolchain.ar, toolchain.strip,
toolchain.pkg_config,
windres,
toolchain.install_prefix,
repr((toolchain.cppflags + ' ' + toolchain.cflags).split()),
repr(toolchain.ldflags.split() + toolchain.libs.split()),
repr((toolchain.cppflags + ' ' + toolchain.cxxflags).split()),
repr(toolchain.ldflags.split() + toolchain.libs.split()),
system, cpu_family, cpu, endian))
return path
def configure(toolchain, src, build, args=()):
cross_file = make_cross_file(toolchain)
configure = [
'meson',
src, build,
'--prefix', toolchain.install_prefix,
# this is necessary because Meson uses Debian's build machine
# MultiArch path (e.g. "lib/x86_64-linux-gnu") for cross
# builds, which is obviously wrong
'--libdir', 'lib',
'--buildtype', 'plain',
'--default-library=static',
'--cross-file', cross_file,
] + args
env = toolchain.env.copy()
# Meson 0.54 requires the BOOST_ROOT environment variable
env['BOOST_ROOT'] = toolchain.install_prefix
subprocess.check_call(configure, env=env)
class MesonProject(Project):
def __init__(self, url, md5, installed, configure_args=[],
**kwargs):
Project.__init__(self, url, md5, installed, **kwargs)
self.configure_args = configure_args
def configure(self, toolchain):
src = self.unpack(toolchain)
build = self.make_build_path(toolchain)
configure(toolchain, src, build, self.configure_args)
return build
def build(self, toolchain):
build = self.configure(toolchain)
subprocess.check_call(['ninja', 'install'],
cwd=build, env=toolchain.env)

81
python/build/project.py Normal file
View File

@@ -0,0 +1,81 @@
import os, shutil
import re
from build.download import download_and_verify
from build.tar import untar
from build.quilt import push_all
class Project:
def __init__(self, url, md5, installed, name=None, version=None,
base=None,
patches=None,
edits=None,
use_cxx=False):
if base is None:
basename = os.path.basename(url)
m = re.match(r'^(.+)\.(tar(\.(gz|bz2|xz|lzma))?|zip)$', basename)
if not m: raise
self.base = m.group(1)
else:
self.base = base
if name is None or version is None:
m = re.match(r'^([-\w]+)-(\d[\d.]*[a-z]?[\d.]*)$', self.base)
if name is None: name = m.group(1)
if version is None: version = m.group(2)
self.name = name
self.version = version
self.url = url
self.md5 = md5
self.installed = installed
if patches is not None:
srcdir = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
patches = os.path.join(srcdir, patches)
self.patches = patches
self.edits = edits
self.use_cxx = use_cxx
def download(self, toolchain):
return download_and_verify(self.url, self.md5, toolchain.tarball_path)
def is_installed(self, toolchain):
tarball = self.download(toolchain)
installed = os.path.join(toolchain.install_prefix, self.installed)
tarball_mtime = os.path.getmtime(tarball)
try:
return os.path.getmtime(installed) >= tarball_mtime
except FileNotFoundError:
return False
def unpack(self, toolchain, out_of_tree=True):
if out_of_tree:
parent_path = toolchain.src_path
else:
parent_path = toolchain.build_path
path = untar(self.download(toolchain), parent_path, self.base)
if self.patches is not None:
push_all(toolchain, path, self.patches)
if self.edits is not None:
for filename, function in self.edits.items():
with open(os.path.join(path, filename), 'r+t') as f:
old_data = f.read()
new_data = function(old_data)
f.seek(0)
f.truncate(0)
f.write(new_data)
return path
def make_build_path(self, toolchain):
path = os.path.join(toolchain.build_path, self.base)
try:
shutil.rmtree(path)
except FileNotFoundError:
pass
os.makedirs(path, exist_ok=True)
return path

9
python/build/quilt.py Normal file
View File

@@ -0,0 +1,9 @@
import subprocess
def run_quilt(toolchain, cwd, patches_path, *args):
env = dict(toolchain.env)
env['QUILT_PATCHES'] = patches_path
subprocess.check_call(['quilt'] + list(args), cwd=cwd, env=env)
def push_all(toolchain, src_path, patches_path):
run_quilt(toolchain, src_path, patches_path, 'push', '-a')

11
python/build/tar.py Normal file
View File

@@ -0,0 +1,11 @@
import os, shutil, subprocess
def untar(tarball_path, parent_path, base):
path = os.path.join(parent_path, base)
try:
shutil.rmtree(path)
except FileNotFoundError:
pass
os.makedirs(parent_path, exist_ok=True)
subprocess.check_call(['/bin/tar', 'xfC', tarball_path, parent_path])
return path

42
python/build/verify.py Normal file
View File

@@ -0,0 +1,42 @@
import hashlib
def feed_file(h, f):
"""Feed data read from an open file into the hashlib instance."""
while True:
data = f.read(65536)
if len(data) == 0:
# end of file
break
h.update(data)
def feed_file_path(h, path):
"""Feed data read from a file (to be opened by this function) into the hashlib instance."""
with open(path, 'rb') as f:
feed_file(h, f)
def file_digest(algorithm, path):
"""Calculate the digest of a file and return it in hexadecimal notation."""
h = algorithm()
feed_file_path(h, path)
return h.hexdigest()
def guess_digest_algorithm(digest):
l = len(digest)
if l == 32:
return hashlib.md5
elif l == 40:
return hashlib.sha1
elif l == 64:
return hashlib.sha256
else:
return None
def verify_file_digest(path, expected_digest):
"""Verify the digest of a file, and return True if the digest matches with the given expected digest."""
algorithm = guess_digest_algorithm(expected_digest)
assert(algorithm is not None)
return file_digest(algorithm, path) == expected_digest

22
python/build/zlib.py Normal file
View File

@@ -0,0 +1,22 @@
import os.path, subprocess
from build.project import Project
class ZlibProject(Project):
def __init__(self, url, md5, installed,
**kwargs):
Project.__init__(self, url, md5, installed, **kwargs)
def build(self, toolchain):
src = self.unpack(toolchain, out_of_tree=False)
subprocess.check_call(['/usr/bin/make', '--quiet',
'-f', 'win32/Makefile.gcc',
'PREFIX=' + toolchain.arch + '-',
'-j12',
'install',
'INCLUDE_PATH='+ os.path.join(toolchain.install_prefix, 'include'),
'LIBRARY_PATH=' + os.path.join(toolchain.install_prefix, 'lib'),
'BINARY_PATH=' + os.path.join(toolchain.install_prefix, 'bin'),
],
cwd=src, env=toolchain.env)

View File

@@ -1,47 +0,0 @@
#!/usr/bin/env ruby
#
# This script verifies that every source includes config.h first.
# This is very important for consistent Large File Support.
#
def check_file(file)
first = true
file.each_line do |line|
if line =~ /^\#include\s+(\S+)/ then
if $1 == '"config.h"'
unless first
puts "#{file.path}: config.h included too late"
end
else
if first
puts "#{file.path}: config.h missing"
end
end
first = false
end
end
end
def check_path(path)
File.open(path) do |file|
check_file(file)
end
end
if ARGV.empty?
Dir["src/*.c"].each do |path|
check_path(path)
end
Dir["src/*/*.c"].each do |path|
check_path(path)
end
Dir["test/*.c"].each do |path|
check_path(path)
end
else
ARGV.each do |path|
check_path(path)
end
end

View File

@@ -1,25 +0,0 @@
#!/bin/sh
PWD=`pwd`
## If we're not in the scripts directory
## assume the base directory.
if test "`basename $PWD`" == "scripts"; then
cd ../
else
MYOLDPWD=`pwd`
cd `dirname $0`/../
fi
if test -e Makefile
then
make distclean
fi
./autogen.sh
make
make dist
if test "`basename $PWD`" == "scripts"; then
cd contrib/
else
cd $MYOLDPWD
fi

View File

@@ -1,6 +0,0 @@
#!/bin/sh
indent -npro -kr -i8 -ts8 -sob -l80 -ss -ncs -cdw -cd0 -c0 -cp0 "$@"
# there doesn't seem to be an indent switch for this, but this
# forces goto labels to the left-most column, without indentation
perl -i -p -e 's/^\s+(\w+):/$1:/g unless /^\s+default:/' "$@"

View File

@@ -1,93 +0,0 @@
#!/bin/sh -e
#
# This shell script tests the build of MPD with various compile-time
# options.
#
# Author: Max Kellermann <max@duempel.org>
PREFIX=/tmp/mpd
rm -rf $PREFIX
test "x$MAKE" != x || MAKE=make
export CFLAGS="-Os"
test -x configure || NOCONFIGURE=1 ./autogen.sh
# all features on
./configure --prefix=$PREFIX/full \
--disable-dependency-tracking --enable-debug --enable-werror \
--enable-un \
--enable-modplug \
--enable-ao --enable-mikmod --enable-mvp
$MAKE install
$MAKE distclean
# no UN, no oggvorbis, no flac, enable oggflac
./configure --prefix=$PREFIX/small \
--disable-dependency-tracking --enable-debug --enable-werror \
--disable-un \
--disable-flac --disable-vorbis --enable-oggflac
$MAKE install
$MAKE distclean
# strip down (disable TCP, disable nearly all plugins)
CFLAGS="$CFLAGS -DNDEBUG" \
./configure --prefix=$PREFIX/tiny \
--disable-dependency-tracking --disable-debug --enable-werror \
--disable-tcp \
--disable-curl \
--disable-id3 --disable-lsr \
--disable-ao --disable-alsa --disable-jack --disable-pulse --disable-fifo \
--disable-shout-ogg --disable-shout-mp3 --disable-lame-encoder \
--disable-ffmpeg --disable-wavpack --disable-mpc --disable-aac \
--disable-flac --disable-vorbis --disable-oggflac --disable-audiofile \
--disable-cue \
--with-zeroconf=no
$MAKE install
$MAKE distclean
# shout: ogg without mp3
# sndfile instead of modplug
./configure --prefix=$PREFIX/shout_ogg \
--disable-dependency-tracking --disable-debug --enable-werror \
--disable-tcp \
--disable-curl \
--disable-id3 --disable-lsr \
--disable-ao --disable-alsa --disable-jack --disable-pulse --disable-fifo \
--enable-shout-ogg --disable-shout-mp3 --disable-lame-encoder \
--disable-ffmpeg --disable-wavpack --disable-mpc --disable-aac \
--disable-flac --enable-vorbis --disable-oggflac --disable-audiofile \
--disable-modplug --enable-sndfile \
--with-zeroconf=no
$MAKE install
$MAKE distclean
# shout: mp3 without ogg
./configure --prefix=$PREFIX/shout_mp3 \
--disable-dependency-tracking --disable-debug --enable-werror \
--disable-tcp \
--disable-curl \
--disable-id3 --disable-lsr \
--disable-ao --disable-alsa --disable-jack --disable-pulse --disable-fifo \
--disable-shout-ogg --enable-shout-mp3 --enable-lame-encoder \
--disable-ffmpeg --disable-wavpack --disable-mpc --disable-aac \
--disable-flac --disable-vorbis --disable-oggflac --disable-audiofile \
--with-zeroconf=no
$MAKE install
$MAKE distclean
# oggvorbis + oggflac
./configure --prefix=$PREFIX/oggvorbisflac \
--disable-dependency-tracking --disable-debug --enable-werror \
--disable-tcp \
--disable-curl \
--disable-id3 --disable-lsr \
--disable-mp3 \
--disable-ao --disable-alsa --disable-jack --disable-pulse --disable-fifo \
--disable-shout-ogg --disable-shout-mp3 --disable-lame-encoder \
--disable-ffmpeg --disable-wavpack --disable-mpc --disable-aac \
--disable-flac --enable-vorbis --enable-oggflac --disable-audiofile \
--with-zeroconf=no
$MAKE install
$MAKE distclean

View File

@@ -33,6 +33,9 @@ struct Compressor {
struct Compressor *Compressor_new(unsigned int history)
{
struct Compressor *obj = malloc(sizeof(struct Compressor));
if (obj == NULL)
/* out of memory, not much we can do */
abort();
obj->prefs.target = TARGET;
obj->prefs.maxgain = GAINMAX;
@@ -61,6 +64,10 @@ void Compressor_delete(struct Compressor *obj)
static int *resizeArray(int *data, int newsz, int oldsz)
{
data = realloc(data, newsz*sizeof(int));
if (data == NULL)
/* out of memory, not much we can do */
abort();
if (newsz > oldsz)
memset(data + oldsz, 0, sizeof(int)*(newsz - oldsz));
return data;

View File

@@ -19,6 +19,10 @@ struct CompressorConfig {
struct Compressor;
#ifdef __cplusplus
extern "C" {
#endif
//! Create a new compressor (use history value of 0 for default)
struct Compressor *Compressor_new(unsigned int history);
@@ -34,7 +38,12 @@ struct CompressorConfig *Compressor_getConfig(struct Compressor *);
//! Process 16-bit signed data
void Compressor_Process_int16(struct Compressor *, int16_t *data, unsigned int count);
#ifdef __cplusplus
}
#endif
//! TODO: Compressor_Process_int32, Compressor_Process_float, others as needed
//! TODO: functions for getting at the peak/gain/clip history buffers (for monitoring)
#endif

75
src/AudioFormat.cxx Normal file
View File

@@ -0,0 +1,75 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "AudioFormat.hxx"
#include "util/StringBuffer.hxx"
#include "util/StringFormat.hxx"
#include <assert.h>
void
AudioFormat::ApplyMask(AudioFormat mask) noexcept
{
assert(IsValid());
assert(mask.IsMaskValid());
if (mask.sample_rate != 0)
sample_rate = mask.sample_rate;
if (mask.format != SampleFormat::UNDEFINED)
format = mask.format;
if (mask.channels != 0)
channels = mask.channels;
assert(IsValid());
}
StringBuffer<24>
ToString(const AudioFormat af) noexcept
{
StringBuffer<24> buffer;
char *p = buffer.data();
if (af.format == SampleFormat::DSD && af.sample_rate > 0 &&
af.sample_rate % 44100 == 0) {
/* use shortcuts such as "dsd64" which implies the
sample rate */
p += sprintf(p, "dsd%u:", af.sample_rate * 8 / 44100);
} else {
const char *sample_format = af.format != SampleFormat::UNDEFINED
? sample_format_to_string(af.format)
: "*";
if (af.sample_rate > 0)
p += sprintf(p, "%u:%s:", af.sample_rate,
sample_format);
else
p += sprintf(p, "*:%s:", sample_format);
}
if (af.channels > 0)
p += sprintf(p, "%u", af.channels);
else {
*p++ = '*';
*p = 0;
}
return buffer;
}

245
src/AudioFormat.hxx Normal file
View File

@@ -0,0 +1,245 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef MPD_AUDIO_FORMAT_HXX
#define MPD_AUDIO_FORMAT_HXX
#include "pcm/SampleFormat.hxx" // IWYU pragma: export
#include "util/Compiler.h"
#include <chrono>
#include <stdint.h>
#include <stddef.h>
template<size_t CAPACITY> class StringBuffer;
static constexpr unsigned MAX_CHANNELS = 8;
/**
* This structure describes the format of a raw PCM stream.
*/
struct AudioFormat {
/**
* The sample rate in Hz. A better name for this attribute is
* "frame rate", because technically, you have two samples per
* frame in stereo sound.
*/
uint32_t sample_rate;
/**
* The format samples are stored in. See the #sample_format
* enum for valid values.
*/
SampleFormat format;
/**
* The number of channels.
*
* Channel order follows the FLAC convention
* (https://xiph.org/flac/format.html):
*
* - 1 channel: mono
* - 2 channels: left, right
* - 3 channels: left, right, center
* - 4 channels: front left, front right, back left, back right
* - 5 channels: front left, front right, front center, back/surround left, back/surround right
* - 6 channels: front left, front right, front center, LFE, back/surround left, back/surround right
* - 7 channels: front left, front right, front center, LFE, back center, side left, side right
* - 8 channels: front left, front right, front center, LFE, back left, back right, side left, side right
*/
uint8_t channels;
AudioFormat() = default;
constexpr AudioFormat(uint32_t _sample_rate,
SampleFormat _format, uint8_t _channels)
:sample_rate(_sample_rate),
format(_format), channels(_channels) {}
static constexpr AudioFormat Undefined() {
return AudioFormat(0, SampleFormat::UNDEFINED,0);
}
/**
* Clears the object, i.e. sets all attributes to an undefined
* (invalid) value.
*/
void Clear() {
sample_rate = 0;
format = SampleFormat::UNDEFINED;
channels = 0;
}
/**
* Checks whether the object has a defined value.
*/
constexpr bool IsDefined() const {
return sample_rate != 0;
}
/**
* Checks whether the object is full, i.e. all attributes are
* defined. This is more complete than IsDefined(), but
* slower.
*/
constexpr bool IsFullyDefined() const {
return sample_rate != 0 && format != SampleFormat::UNDEFINED &&
channels != 0;
}
/**
* Checks whether the object has at least one defined value.
*/
constexpr bool IsMaskDefined() const {
return sample_rate != 0 || format != SampleFormat::UNDEFINED ||
channels != 0;
}
bool IsValid() const;
bool IsMaskValid() const;
constexpr bool operator==(const AudioFormat other) const {
return sample_rate == other.sample_rate &&
format == other.format &&
channels == other.channels;
}
constexpr bool operator!=(const AudioFormat other) const {
return !(*this == other);
}
void ApplyMask(AudioFormat mask) noexcept;
gcc_pure
AudioFormat WithMask(AudioFormat mask) const noexcept {
AudioFormat result = *this;
result.ApplyMask(mask);
return result;
}
gcc_pure
bool MatchMask(AudioFormat mask) const noexcept {
return WithMask(mask) == *this;
}
/**
* Returns the size of each (mono) sample in bytes.
*/
unsigned GetSampleSize() const;
/**
* Returns the size of each full frame in bytes.
*/
unsigned GetFrameSize() const;
template<typename D>
constexpr auto TimeToFrames(D t) const noexcept {
using Period = typename D::period;
return ((t.count() * sample_rate) / Period::den) * Period::num;
}
template<typename D>
constexpr size_t TimeToSize(D t) const noexcept {
return size_t(size_t(TimeToFrames(t)) * GetFrameSize());
}
template<typename D>
constexpr D FramesToTime(std::uintmax_t size) const noexcept {
using Rep = typename D::rep;
using Period = typename D::period;
return D(((Rep(1) * size / Period::num) * Period::den) / sample_rate);
}
template<typename D>
constexpr D SizeToTime(std::uintmax_t size) const noexcept {
return FramesToTime<D>(size / GetFrameSize());
}
};
/**
* Checks whether the sample rate is valid.
*
* @param sample_rate the sample rate in Hz
*/
static constexpr inline bool
audio_valid_sample_rate(unsigned sample_rate)
{
return sample_rate > 0 && sample_rate < (1 << 30);
}
/**
* Checks whether the number of channels is valid.
*/
static constexpr inline bool
audio_valid_channel_count(unsigned channels)
{
return channels >= 1 && channels <= MAX_CHANNELS;
}
/**
* Returns false if the format is not valid for playback with MPD.
* This function performs some basic validity checks.
*/
inline bool
AudioFormat::IsValid() const
{
return audio_valid_sample_rate(sample_rate) &&
audio_valid_sample_format(format) &&
audio_valid_channel_count(channels);
}
/**
* Returns false if the format mask is not valid for playback with
* MPD. This function performs some basic validity checks.
*/
inline bool
AudioFormat::IsMaskValid() const
{
return (sample_rate == 0 ||
audio_valid_sample_rate(sample_rate)) &&
(format == SampleFormat::UNDEFINED ||
audio_valid_sample_format(format)) &&
(channels == 0 || audio_valid_channel_count(channels));
}
inline unsigned
AudioFormat::GetSampleSize() const
{
return sample_format_size(format);
}
inline unsigned
AudioFormat::GetFrameSize() const
{
return GetSampleSize() * channels;
}
/**
* Renders the #AudioFormat object into a string, e.g. for printing
* it in a log file.
*
* @param af the #AudioFormat object
* @return the string buffer
*/
gcc_const
StringBuffer<24>
ToString(AudioFormat af) noexcept;
#endif

187
src/AudioParser.cxx Normal file
View File

@@ -0,0 +1,187 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/*
* Parser functions for audio related objects.
*
*/
#include "AudioParser.hxx"
#include "AudioFormat.hxx"
#include "util/RuntimeError.hxx"
#include <assert.h>
#include <string.h>
#include <stdlib.h>
static uint32_t
ParseSampleRate(const char *src, bool mask, const char **endptr_r)
{
unsigned long value;
char *endptr;
if (mask && *src == '*') {
*endptr_r = src + 1;
return 0;
}
value = strtoul(src, &endptr, 10);
if (endptr == src) {
throw std::invalid_argument("Failed to parse the sample rate");
} else if (!audio_valid_sample_rate(value))
throw FormatInvalidArgument("Invalid sample rate: %lu", value);
*endptr_r = endptr;
return value;
}
static SampleFormat
ParseSampleFormat(const char *src, bool mask, const char **endptr_r)
{
unsigned long value;
char *endptr;
SampleFormat sample_format;
if (mask && *src == '*') {
*endptr_r = src + 1;
return SampleFormat::UNDEFINED;
}
if (*src == 'f') {
*endptr_r = src + 1;
return SampleFormat::FLOAT;
}
if (memcmp(src, "dsd", 3) == 0) {
*endptr_r = src + 3;
return SampleFormat::DSD;
}
value = strtoul(src, &endptr, 10);
if (endptr == src)
throw std::invalid_argument("Failed to parse the sample format");
switch (value) {
case 8:
sample_format = SampleFormat::S8;
break;
case 16:
sample_format = SampleFormat::S16;
break;
case 24:
if (memcmp(endptr, "_3", 2) == 0)
/* for backwards compatibility */
endptr += 2;
sample_format = SampleFormat::S24_P32;
break;
case 32:
sample_format = SampleFormat::S32;
break;
default:
throw FormatInvalidArgument("Invalid sample format: %lu",
value);
}
assert(audio_valid_sample_format(sample_format));
*endptr_r = endptr;
return sample_format;
}
static uint8_t
ParseChannelCount(const char *src, bool mask, const char **endptr_r)
{
unsigned long value;
char *endptr;
if (mask && *src == '*') {
*endptr_r = src + 1;
return 0;
}
value = strtoul(src, &endptr, 10);
if (endptr == src)
throw std::invalid_argument("Failed to parse the channel count");
else if (!audio_valid_channel_count(value))
throw FormatInvalidArgument("Invalid channel count: %u",
value);
*endptr_r = endptr;
return value;
}
AudioFormat
ParseAudioFormat(const char *src, bool mask)
{
AudioFormat dest;
dest.Clear();
if (strncmp(src, "dsd", 3) == 0) {
/* allow format specifications such as "dsd64" which
implies the sample rate */
char *endptr;
auto dsd = strtoul(src + 3, &endptr, 10);
if (endptr > src + 3 && *endptr == ':' &&
dsd >= 32 && dsd <= 4096 && dsd % 2 == 0) {
dest.sample_rate = dsd * 44100 / 8;
dest.format = SampleFormat::DSD;
src = endptr + 1;
dest.channels = ParseChannelCount(src, mask, &src);
if (*src != 0)
throw FormatInvalidArgument("Extra data after channel count: %s",
src);
return dest;
}
}
/* parse sample rate */
dest.sample_rate = ParseSampleRate(src, mask, &src);
if (*src++ != ':')
throw std::invalid_argument("Sample format missing");
/* parse sample format */
dest.format = ParseSampleFormat(src, mask, &src);
if (*src++ != ':')
throw std::invalid_argument("Channel count missing");
/* parse channel count */
dest.channels = ParseChannelCount(src, mask, &src);
if (*src != 0)
throw FormatInvalidArgument("Extra data after channel count: %s",
src);
assert(mask
? dest.IsMaskValid()
: dest.IsValid());
return dest;
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2010 The Music Player Daemon Project
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -22,28 +22,21 @@
* Parser functions for audio related objects.
*/
#ifndef AUDIO_PARSER_H
#define AUDIO_PARSER_H
#ifndef MPD_AUDIO_PARSER_HXX
#define MPD_AUDIO_PARSER_HXX
#include <glib.h>
#include <stdbool.h>
struct audio_format;
struct AudioFormat;
/**
* Parses a string in the form "SAMPLE_RATE:BITS:CHANNELS" into an
* #audio_format.
* #AudioFormat.
*
* Throws #std::runtime_error on error.
*
* @param dest the destination #audio_format struct
* @param src the input string
* @param mask if true, then "*" is allowed for any number of items
* @param error_r location to store the error occuring, or NULL to
* ignore errors
* @return true on success
*/
bool
audio_format_parse(struct audio_format *dest, const char *src,
bool mask, GError **error_r);
AudioFormat
ParseAudioFormat(const char *src, bool mask);
#endif

41
src/BulkEdit.hxx Normal file
View File

@@ -0,0 +1,41 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef MPD_BULK_EDIT_HXX
#define MPD_BULK_EDIT_HXX
#include "Partition.hxx"
/**
* Begin a "bulk edit" and commit it automatically.
*/
class ScopeBulkEdit {
Partition &partition;
public:
ScopeBulkEdit(Partition &_partition):partition(_partition) {
partition.playlist.BeginBulk();
}
~ScopeBulkEdit() {
partition.playlist.CommitBulk(partition.pc);
}
};
#endif

61
src/CheckAudioFormat.cxx Normal file
View File

@@ -0,0 +1,61 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "CheckAudioFormat.hxx"
#include "AudioFormat.hxx"
#include "util/RuntimeError.hxx"
#include <stdexcept>
#include <assert.h>
void
CheckSampleRate(unsigned long sample_rate)
{
if (!audio_valid_sample_rate(sample_rate))
throw FormatRuntimeError("Invalid sample rate: %lu",
sample_rate);
}
void
CheckSampleFormat(SampleFormat sample_format)
{
if (!audio_valid_sample_format(sample_format))
throw FormatRuntimeError("Invalid sample format: %u",
unsigned(sample_format));
}
void
CheckChannelCount(unsigned channels)
{
if (!audio_valid_channel_count(channels))
throw FormatRuntimeError("Invalid channel count: %u",
channels);
}
AudioFormat
CheckAudioFormat(unsigned long sample_rate,
SampleFormat sample_format, unsigned channels)
{
CheckSampleRate(sample_rate);
CheckSampleFormat(sample_format);
CheckChannelCount(channels);
return AudioFormat(sample_rate, sample_format, channels);
}

44
src/CheckAudioFormat.hxx Normal file
View File

@@ -0,0 +1,44 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef MPD_CHECK_AUDIO_FORMAT_HXX
#define MPD_CHECK_AUDIO_FORMAT_HXX
#include "AudioFormat.hxx"
void
CheckSampleRate(unsigned long sample_rate);
void
CheckSampleFormat(SampleFormat sample_format);
void
CheckChannelCount(unsigned sample_format);
/**
* Check #AudioFormat attributes and construct an #AudioFormat
* instance.
*
* Throws #std::runtime_error on error.
*/
AudioFormat
CheckAudioFormat(unsigned long sample_rate,
SampleFormat sample_format, unsigned channels);
#endif

225
src/Chrono.hxx Normal file
View File

@@ -0,0 +1,225 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef MPD_CHRONO_HXX
#define MPD_CHRONO_HXX
#include <chrono>
#include <utility>
#include <cstdint>
using FloatDuration = std::chrono::duration<double>;
/**
* A time stamp within a song. Granularity is 1 millisecond and the
* maximum value is about 49 days.
*/
class SongTime : public std::chrono::duration<std::uint32_t, std::milli> {
typedef std::chrono::duration<std::uint32_t, std::milli> Base;
public:
SongTime() = default;
template<typename T>
explicit constexpr SongTime(T t):Base(t) {}
static constexpr SongTime zero() {
return SongTime(Base::zero());
}
template<typename D>
static constexpr SongTime Cast(D src) {
return SongTime(std::chrono::duration_cast<Base>(src));
}
static constexpr SongTime FromS(unsigned s) {
return SongTime(rep(s) * 1000);
}
static constexpr SongTime FromS(float s) {
return SongTime(rep(s * 1000));
}
static constexpr SongTime FromS(double s) {
return SongTime(rep(s * 1000));
}
static constexpr SongTime FromMS(rep ms) {
return SongTime(ms);
}
constexpr rep ToS() const {
return count() / rep(1000);
}
constexpr rep RoundS() const {
return (count() + 500) / rep(1000);
}
constexpr rep ToMS() const {
return count();
}
template<typename T=rep>
constexpr T ToScale(unsigned scale) const {
return count() * T(scale) / 1000;
}
/**
* Convert a scalar value with the given scale to a #SongTime
* instance.
*
* @param value the input value
* @param scale the value's scale in Hz
*/
template<typename T=rep>
static constexpr SongTime FromScale(T value, unsigned scale) {
return SongTime(value * T(1000) / T(scale));
}
constexpr double ToDoubleS() const {
return double(count()) / 1000.;
};
constexpr bool IsZero() const {
return count() == 0;
}
constexpr bool IsPositive() const {
return count() > 0;
}
constexpr SongTime operator+(const SongTime &other) const {
return SongTime(*(const Base *)this + (const Base &)other);
}
constexpr SongTime operator-(const SongTime &other) const {
return SongTime(*(const Base *)this - (const Base &)other);
}
};
/**
* A variant of #SongTime that is based on a signed integer. It can
* be used for relative values.
*/
class SignedSongTime : public std::chrono::duration<std::int32_t, std::milli> {
typedef std::chrono::duration<std::int32_t, std::milli> Base;
public:
SignedSongTime() = default;
template<typename T>
explicit constexpr SignedSongTime(T t):Base(t) {}
/**
* Allow implicit conversion from SongTime to SignedSongTime.
*/
constexpr SignedSongTime(SongTime t):Base(t) {}
static constexpr SignedSongTime zero() {
return SignedSongTime(Base::zero());
}
/**
* Generate a negative value.
*/
static constexpr SignedSongTime Negative() {
return SignedSongTime(-1);
}
template<typename D>
static constexpr SongTime Cast(D src) {
return SongTime(std::chrono::duration_cast<Base>(src));
}
static constexpr SignedSongTime FromS(int s) {
return SignedSongTime(rep(s) * 1000);
}
static constexpr SignedSongTime FromS(unsigned s) {
return SignedSongTime(rep(s) * 1000);
}
static constexpr SignedSongTime FromS(float s) {
return SignedSongTime(rep(s * 1000));
}
static constexpr SignedSongTime FromS(double s) {
return SignedSongTime(rep(s * 1000));
}
static constexpr SignedSongTime FromMS(rep ms) {
return SignedSongTime(ms);
}
constexpr rep ToS() const {
return count() / rep(1000);
}
constexpr rep RoundS() const {
return (count() + 500) / rep(1000);
}
constexpr rep ToMS() const {
return count();
}
template<typename T=rep>
constexpr T ToScale(unsigned scale) const {
return count() * T(scale) / 1000;
}
/**
* Convert a scalar value with the given scale to a
* #SignedSongTime instance.
*
* @param value the input value
* @param scale the value's scale in Hz
*/
template<typename T=rep>
static constexpr SignedSongTime FromScale(T value, unsigned scale) {
return SignedSongTime(value * T(1000) / T(scale));
}
constexpr double ToDoubleS() const {
return double(count()) / 1000.;
};
constexpr bool IsZero() const {
return count() == 0;
}
constexpr bool IsPositive() const {
return count() > 0;
}
constexpr bool IsNegative() const {
return count() < 0;
}
constexpr SignedSongTime operator+(const SignedSongTime &other) const {
return SignedSongTime(*(const Base *)this + (const Base &)other);
}
constexpr SignedSongTime operator-(const SignedSongTime &other) const {
return SignedSongTime(*(const Base *)this - (const Base &)other);
}
};
#endif

405
src/CommandLine.cxx Normal file
View File

@@ -0,0 +1,405 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "config.h"
#include "CommandLine.hxx"
#include "GitVersion.hxx"
#include "ls.hxx"
#include "LogInit.hxx"
#include "Log.hxx"
#include "config/File.hxx"
#include "decoder/DecoderList.hxx"
#include "decoder/DecoderPlugin.hxx"
#include "output/Registry.hxx"
#include "output/OutputPlugin.hxx"
#include "input/Registry.hxx"
#include "input/InputPlugin.hxx"
#include "playlist/PlaylistRegistry.hxx"
#include "playlist/PlaylistPlugin.hxx"
#include "fs/AllocatedPath.hxx"
#include "fs/NarrowPath.hxx"
#include "fs/Traits.hxx"
#include "fs/FileSystem.hxx"
#include "fs/StandardDirectory.hxx"
#include "system/Error.hxx"
#include "util/RuntimeError.hxx"
#include "util/Domain.hxx"
#include "util/OptionDef.hxx"
#include "util/OptionParser.hxx"
#ifdef ENABLE_DATABASE
#include "db/Registry.hxx"
#include "db/DatabasePlugin.hxx"
#include "storage/Registry.hxx"
#include "storage/StoragePlugin.hxx"
#endif
#ifdef ENABLE_NEIGHBOR_PLUGINS
#include "neighbor/Registry.hxx"
#include "neighbor/NeighborPlugin.hxx"
#endif
#ifdef ENABLE_ENCODER
#include "encoder/EncoderList.hxx"
#include "encoder/EncoderPlugin.hxx"
#endif
#ifdef ENABLE_ARCHIVE
#include "archive/ArchiveList.hxx"
#include "archive/ArchivePlugin.hxx"
#endif
#include <stdio.h>
#include <stdlib.h>
namespace {
#ifdef _WIN32
constexpr auto CONFIG_FILE_LOCATION = Path::FromFS(PATH_LITERAL("mpd\\mpd.conf"));
constexpr auto APP_CONFIG_FILE_LOCATION = Path::FromFS(PATH_LITERAL("conf\\mpd.conf"));
#else
constexpr auto USER_CONFIG_FILE_LOCATION1 = Path::FromFS(PATH_LITERAL(".mpdconf"));
constexpr auto USER_CONFIG_FILE_LOCATION2 = Path::FromFS(PATH_LITERAL(".mpd/mpd.conf"));
constexpr auto USER_CONFIG_FILE_LOCATION_XDG = Path::FromFS(PATH_LITERAL("mpd/mpd.conf"));
#endif
}
enum Option {
OPTION_KILL,
OPTION_NO_CONFIG,
OPTION_NO_DAEMON,
OPTION_STDOUT,
OPTION_STDERR,
OPTION_VERBOSE,
OPTION_VERSION,
OPTION_HELP,
OPTION_HELP2,
};
static constexpr OptionDef option_defs[] = {
{"kill", "kill the currently running mpd session"},
{"no-config", "don't read from config"},
{"no-daemon", "don't detach from console"},
{"stdout", nullptr}, // hidden, compatibility with old versions
{"stderr", "print messages to stderr"},
{"verbose", 'v', "verbose logging"},
{"version", 'V', "print version number"},
{"help", 'h', "show help options"},
{nullptr, '?', nullptr}, // hidden, standard alias for --help
};
static constexpr Domain cmdline_domain("cmdline");
gcc_noreturn
static void version(void)
{
printf("Music Player Daemon " VERSION " (%s)"
"\n"
"Copyright 2003-2007 Warren Dukes <warren.dukes@gmail.com>\n"
"Copyright 2008-2018 Max Kellermann <max.kellermann@gmail.com>\n"
"This is free software; see the source for copying conditions. There is NO\n"
"warranty; not even MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n",
GIT_VERSION);
#ifdef ENABLE_DATABASE
printf("\n"
"Database plugins:\n");
for (auto i = database_plugins; *i != nullptr; ++i)
printf(" %s", (*i)->name);
printf("\n\n"
"Storage plugins:\n");
for (auto i = storage_plugins; *i != nullptr; ++i)
printf(" %s", (*i)->name);
printf("\n");
#endif
#ifdef ENABLE_NEIGHBOR_PLUGINS
printf("\n"
"Neighbor plugins:\n");
for (auto i = neighbor_plugins; *i != nullptr; ++i)
printf(" %s", (*i)->name);
#endif
printf("\n"
"\n"
"Decoders plugins:\n");
decoder_plugins_for_each([](const DecoderPlugin &plugin){
printf(" [%s]", plugin.name);
const char *const*suffixes = plugin.suffixes;
if (suffixes != nullptr)
for (; *suffixes != nullptr; ++suffixes)
printf(" %s", *suffixes);
printf("\n");
});
printf("\n"
"Filters:\n"
#ifdef ENABLE_LIBSAMPLERATE
" libsamplerate"
#endif
#ifdef ENABLE_SOXR
" soxr"
#endif
"\n\n"
"Tag plugins:\n"
#ifdef ENABLE_ID3TAG
" id3tag"
#endif
"\n\n"
"Output plugins:\n");
audio_output_plugins_for_each(plugin)
printf(" %s", plugin->name);
printf("\n"
#ifdef ENABLE_ENCODER
"\n"
"Encoder plugins:\n");
encoder_plugins_for_each(plugin)
printf(" %s", plugin->name);
printf("\n"
#endif
#ifdef ENABLE_ARCHIVE
"\n"
"Archive plugins:\n");
archive_plugins_for_each(plugin) {
printf(" [%s]", plugin->name);
const char *const*suffixes = plugin->suffixes;
if (suffixes != nullptr)
for (; *suffixes != nullptr; ++suffixes)
printf(" %s", *suffixes);
printf("\n");
}
printf(""
#endif
"\n"
"Input plugins:\n"
" file"
#ifdef ENABLE_ARCHIVE
" archive"
#endif
);
input_plugins_for_each(plugin)
printf(" %s", plugin->name);
printf("\n\n"
"Playlist plugins:\n");
playlist_plugins_for_each(plugin)
printf(" %s", plugin->name);
printf("\n\n"
"Protocols:\n");
print_supported_uri_schemes_to_fp(stdout);
printf("\n"
"Other features:\n"
#ifdef HAVE_AVAHI
" avahi"
#endif
#ifdef ENABLE_DBUS
" dbus"
#endif
#ifdef ENABLE_UDISKS
" udisks"
#endif
#ifdef USE_EPOLL
" epoll"
#endif
#ifdef HAVE_ICONV
" iconv"
#endif
#ifdef HAVE_ICU
" icu"
#endif
#ifdef ENABLE_INOTIFY
" inotify"
#endif
#ifdef HAVE_IPV6
" ipv6"
#endif
#ifdef ENABLE_SYSTEMD_DAEMON
" systemd"
#endif
#ifdef HAVE_TCP
" tcp"
#endif
#ifdef HAVE_UN
" un"
#endif
"\n");
exit(EXIT_SUCCESS);
}
static void PrintOption(const OptionDef &opt)
{
if (opt.HasShortOption())
printf(" -%c, --%-12s%s\n",
opt.GetShortOption(),
opt.GetLongOption(),
opt.GetDescription());
else
printf(" --%-16s%s\n",
opt.GetLongOption(),
opt.GetDescription());
}
gcc_noreturn
static void help(void)
{
printf("Usage:\n"
" mpd [OPTION...] [path/to/mpd.conf]\n"
"\n"
"Music Player Daemon - a daemon for playing music.\n"
"\n"
"Options:\n");
for (const auto &i : option_defs)
if(i.HasDescription() == true) // hide hidden options from help print
PrintOption(i);
exit(EXIT_SUCCESS);
}
class ConfigLoader
{
ConfigData &config;
public:
explicit ConfigLoader(ConfigData &_config) noexcept
:config(_config) {}
bool TryFile(const Path path);
bool TryFile(const AllocatedPath &base_path, Path path);
};
bool ConfigLoader::TryFile(Path path)
{
if (FileExists(path)) {
ReadConfigFile(config, path);
return true;
}
return false;
}
bool ConfigLoader::TryFile(const AllocatedPath &base_path, Path path)
{
if (base_path.IsNull())
return false;
auto full_path = base_path / path;
return TryFile(full_path);
}
void
ParseCommandLine(int argc, char **argv, struct options &options,
ConfigData &config)
{
bool use_config_file = true;
// First pass: handle command line options
OptionParser parser(option_defs, argc, argv);
while (auto o = parser.Next()) {
switch (Option(o.index)) {
case OPTION_KILL:
options.kill = true;
break;
case OPTION_NO_CONFIG:
use_config_file = false;
break;
case OPTION_NO_DAEMON:
options.daemon = false;
break;
case OPTION_STDOUT:
case OPTION_STDERR:
options.log_stderr = true;
break;
case OPTION_VERBOSE:
options.verbose = true;
break;
case OPTION_VERSION:
version();
case OPTION_HELP:
case OPTION_HELP2:
help();
}
}
/* initialize the logging library, so the configuration file
parser can use it already */
log_early_init(options.verbose);
if (!use_config_file) {
LogDebug(cmdline_domain,
"Ignoring config, using daemon defaults");
return;
}
// Second pass: find non-option parameters (i.e. config file)
const char *config_file = nullptr;
for (const char *i : parser.GetRemaining()) {
if (config_file == nullptr) {
config_file = i;
continue;
}
throw std::runtime_error("too many arguments");
}
if (config_file != nullptr) {
/* use specified configuration file */
ReadConfigFile(config, FromNarrowPath(config_file));
return;
}
/* use default configuration file path */
ConfigLoader loader(config);
bool found =
#ifdef _WIN32
loader.TryFile(GetUserConfigDir(), CONFIG_FILE_LOCATION) ||
loader.TryFile(GetSystemConfigDir(), CONFIG_FILE_LOCATION) ||
loader.TryFile(GetAppBaseDir(), APP_CONFIG_FILE_LOCATION);
#else
loader.TryFile(GetUserConfigDir(),
USER_CONFIG_FILE_LOCATION_XDG) ||
loader.TryFile(GetHomeDir(), USER_CONFIG_FILE_LOCATION1) ||
loader.TryFile(GetHomeDir(), USER_CONFIG_FILE_LOCATION2) ||
loader.TryFile(Path::FromFS(SYSTEM_CONFIG_FILE_LOCATION));
#endif
if (!found)
throw std::runtime_error("No configuration file found");
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2010 The Music Player Daemon Project
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -17,22 +17,20 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef CMDLINE_H
#define CMDLINE_H
#ifndef MPD_COMMAND_LINE_HXX
#define MPD_COMMAND_LINE_HXX
#include <glib.h>
#include <stdbool.h>
struct ConfigData;
struct options {
gboolean kill;
gboolean daemon;
gboolean log_stderr;
gboolean verbose;
bool kill = false;
bool daemon = true;
bool log_stderr = false;
bool verbose = false;
};
bool
parse_cmdline(int argc, char **argv, struct options *options,
GError **error_r);
void
ParseCommandLine(int argc, char **argv, struct options &options,
ConfigData &config);
#endif

22
src/GitVersion.cxx Normal file
View File

@@ -0,0 +1,22 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "GitVersion.hxx"
char GIT_VERSION[] = "@VCS_TAG@";

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2010 The Music Player Daemon Project
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -17,9 +17,9 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef MPD_SIG_HANDLERS_H
#define MPD_SIG_HANDLERS_H
#ifndef MPD_GIT_VERSION_HXX
#define MPD_GIT_VERSION_HXX
void initSigHandlers(void);
extern char GIT_VERSION[];
#endif

250
src/IcyMetaDataParser.cxx Normal file
View File

@@ -0,0 +1,250 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "IcyMetaDataParser.hxx"
#include "tag/Tag.hxx"
#include "tag/Builder.hxx"
#include "util/Domain.hxx"
#include "util/StringView.hxx"
#include "Log.hxx"
#include <assert.h>
#include <string.h>
static constexpr Domain icy_metadata_domain("icy_metadata");
void
IcyMetaDataParser::Reset() noexcept
{
if (!IsDefined())
return;
if (data_rest == 0 && meta_size > 0)
delete[] meta_data;
tag.reset();
data_rest = data_size;
meta_size = 0;
}
size_t
IcyMetaDataParser::Data(size_t length) noexcept
{
assert(length > 0);
if (!IsDefined())
return length;
if (data_rest == 0)
return 0;
if (length >= data_rest) {
length = data_rest;
data_rest = 0;
} else
data_rest -= length;
return length;
}
static void
icy_add_item(TagBuilder &tag, TagType type, const char *value) noexcept
{
size_t length = strlen(value);
if (length >= 2 && value[0] == '\'' && value[length - 1] == '\'') {
/* strip the single quotes */
++value;
length -= 2;
}
if (length > 0)
tag.AddItem(type, {value, length});
}
static void
icy_parse_tag_item(TagBuilder &tag,
const char *name, const char *value) noexcept
{
if (strcmp(name, "StreamTitle") == 0)
icy_add_item(tag, TAG_TITLE, value);
else
FormatDebug(icy_metadata_domain,
"unknown icy-tag: '%s'", name);
}
/**
* Find a single quote that is followed by a semicolon (or by the end
* of the string). If that fails, return the first single quote. If
* that also fails, return #end.
*/
static char *
find_end_quote(char *p, char *const end) noexcept
{
char *fallback = std::find(p, end, '\'');
if (fallback >= end - 1 || fallback[1] == ';')
return fallback;
p = fallback + 1;
while (true) {
p = std::find(p, end, '\'');
if (p == end)
return fallback;
if (p == end - 1 || p[1] == ';')
return p;
++p;
}
}
static std::unique_ptr<Tag>
icy_parse_tag(char *p, char *const end) noexcept
{
assert(p != nullptr);
assert(end != nullptr);
assert(p <= end);
TagBuilder tag;
while (p != end) {
const char *const name = p;
char *eq = std::find(p, end, '=');
if (eq == end)
break;
*eq = 0;
p = eq + 1;
if (*p != '\'') {
/* syntax error; skip to the next semicolon,
try to recover */
char *semicolon = std::find(p, end, ';');
if (semicolon == end)
break;
p = semicolon + 1;
continue;
}
++p;
const char *const value = p;
char *quote = find_end_quote(p, end);
if (quote == end)
break;
*quote = 0;
p = quote + 1;
icy_parse_tag_item(tag, name, value);
char *semicolon = std::find(p, end, ';');
if (semicolon == end)
break;
p = semicolon + 1;
}
return tag.CommitNew();
}
size_t
IcyMetaDataParser::Meta(const void *data, size_t length) noexcept
{
const unsigned char *p = (const unsigned char *)data;
assert(IsDefined());
assert(data_rest == 0);
assert(length > 0);
if (meta_size == 0) {
/* read meta_size from the first byte of a meta
block */
meta_size = *p++ * 16;
if (meta_size == 0) {
/* special case: no metadata */
data_rest = data_size;
return 1;
}
/* 1 byte was consumed (must be re-added later for the
return value */
--length;
/* initialize metadata reader, allocate enough
memory (+1 for the null terminator) */
meta_position = 0;
meta_data = new char[meta_size + 1];
}
assert(meta_position < meta_size);
if (length > meta_size - meta_position)
length = meta_size - meta_position;
memcpy(meta_data + meta_position, p, length);
meta_position += length;
if (p != data)
/* re-add the first byte (which contained meta_size) */
++length;
if (meta_position == meta_size) {
/* parse */
tag = icy_parse_tag(meta_data, meta_data + meta_size);
delete[] meta_data;
/* change back to normal data mode */
meta_size = 0;
data_rest = data_size;
}
return length;
}
size_t
IcyMetaDataParser::ParseInPlace(void *data, size_t length) noexcept
{
uint8_t *const dest0 = (uint8_t *)data;
uint8_t *dest = dest0;
const uint8_t *src = dest0;
while (length > 0) {
size_t chunk = Data(length);
if (chunk > 0) {
memmove(dest, src, chunk);
dest += chunk;
src += chunk;
length -= chunk;
if (length == 0)
break;
}
chunk = Meta(src, length);
if (chunk > 0) {
src += chunk;
length -= chunk;
}
}
return dest - dest0;
}

91
src/IcyMetaDataParser.hxx Normal file
View File

@@ -0,0 +1,91 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef MPD_ICY_META_DATA_PARSER_HXX
#define MPD_ICY_META_DATA_PARSER_HXX
#include "tag/Tag.hxx"
#include <memory>
#include <stddef.h>
class IcyMetaDataParser {
size_t data_size = 0, data_rest;
size_t meta_size, meta_position;
char *meta_data;
std::unique_ptr<Tag> tag;
public:
~IcyMetaDataParser() noexcept {
Reset();
}
/**
* Initialize an enabled icy_metadata object with the specified
* data_size (from the icy-metaint HTTP response header).
*/
void Start(size_t _data_size) noexcept {
data_size = data_rest = _data_size;
meta_size = 0;
tag = nullptr;
}
/**
* Resets the icy_metadata. Call this after rewinding the stream.
*/
void Reset() noexcept;
/**
* Checks whether the icy_metadata object is enabled.
*/
bool IsDefined() const noexcept {
return data_size > 0;
}
/**
* Evaluates data. Returns the number of bytes of normal data which
* can be read by the caller, but not more than "length". If the
* return value is smaller than "length", the caller should invoke
* icy_meta().
*/
size_t Data(size_t length) noexcept;
/**
* Reads metadata from the stream. Returns the number of bytes
* consumed. If the return value is smaller than "length", the caller
* should invoke icy_data().
*/
size_t Meta(const void *data, size_t length) noexcept;
/**
* Parse data and eliminate metadata.
*
* @return the number of data bytes remaining in the buffer
*/
size_t ParseInPlace(void *data, size_t length) noexcept;
std::unique_ptr<Tag> ReadTag() noexcept {
return std::exchange(tag, nullptr);
}
};
#endif

37
src/Idle.cxx Normal file
View File

@@ -0,0 +1,37 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/*
* Support library for the "idle" command.
*
*/
#include "Idle.hxx"
#include "Main.hxx"
#include "Instance.hxx"
#include <assert.h>
void
idle_add(unsigned flags)
{
assert(flags != 0);
instance->EmitIdle(flags);
}

37
src/Idle.hxx Normal file
View File

@@ -0,0 +1,37 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/*
* Support library for the "idle" command.
*
*/
#ifndef MPD_IDLE_HXX
#define MPD_IDLE_HXX
#include "IdleFlags.hxx"
/**
* Adds idle flag (with bitwise "or") and queues notifications to all
* clients.
*/
void
idle_add(unsigned flags);
#endif

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2010 The Music Player Daemon Project
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -22,15 +22,10 @@
*
*/
#include "config.h"
#include "idle.h"
#include "event_pipe.h"
#include "IdleFlags.hxx"
#include "util/ASCII.hxx"
#include <assert.h>
#include <glib.h>
static unsigned idle_flags;
static GMutex *idle_mutex = NULL;
static const char *const idle_names[] = {
"database",
@@ -42,51 +37,31 @@ static const char *const idle_names[] = {
"options",
"sticker",
"update",
NULL
"subscription",
"message",
"neighbor",
"mount",
"partition",
nullptr
};
void
idle_init(void)
{
g_assert(idle_mutex == NULL);
idle_mutex = g_mutex_new();
}
void
idle_deinit(void)
{
g_assert(idle_mutex != NULL);
g_mutex_free(idle_mutex);
idle_mutex = NULL;
}
void
idle_add(unsigned flags)
{
assert(flags != 0);
g_mutex_lock(idle_mutex);
idle_flags |= flags;
g_mutex_unlock(idle_mutex);
event_pipe_emit(PIPE_EVENT_IDLE);
}
unsigned
idle_get(void)
{
unsigned flags;
g_mutex_lock(idle_mutex);
flags = idle_flags;
idle_flags = 0;
g_mutex_unlock(idle_mutex);
return flags;
}
const char*const*
idle_get_names(void)
idle_get_names() noexcept
{
return idle_names;
}
unsigned
idle_parse_name(const char *name) noexcept
{
#if !CLANG_CHECK_VERSION(3,6)
/* disabled on clang due to -Wtautological-pointer-compare */
assert(name != nullptr);
#endif
for (unsigned i = 0; idle_names[i] != nullptr; ++i)
if (StringEqualsCaseASCII(name, idle_names[i]))
return 1 << i;
return 0;
}

88
src/IdleFlags.hxx Normal file
View File

@@ -0,0 +1,88 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/*
* Support library for the "idle" command.
*
*/
#ifndef MPD_IDLE_FLAGS_HXX
#define MPD_IDLE_FLAGS_HXX
#include "util/Compiler.h"
/** song database has been updated*/
static constexpr unsigned IDLE_DATABASE = 0x1;
/** a stored playlist has been modified, created, deleted or
renamed */
static constexpr unsigned IDLE_STORED_PLAYLIST = 0x2;
/** the current playlist has been modified */
static constexpr unsigned IDLE_PLAYLIST = 0x4;
/** the player state has changed: play, stop, pause, seek, ... */
static constexpr unsigned IDLE_PLAYER = 0x8;
/** the volume has been modified */
static constexpr unsigned IDLE_MIXER = 0x10;
/** an audio output device has been enabled or disabled */
static constexpr unsigned IDLE_OUTPUT = 0x20;
/** options have changed: crossfade; random; repeat; ... */
static constexpr unsigned IDLE_OPTIONS = 0x40;
/** a sticker has been modified. */
static constexpr unsigned IDLE_STICKER = 0x80;
/** a database update has started or finished. */
static constexpr unsigned IDLE_UPDATE = 0x100;
/** a client has subscribed or unsubscribed to/from a channel */
static constexpr unsigned IDLE_SUBSCRIPTION = 0x200;
/** a message on the subscribed channel was received */
static constexpr unsigned IDLE_MESSAGE = 0x400;
/** a neighbor was found or lost */
static constexpr unsigned IDLE_NEIGHBOR = 0x800;
/** the mount list has changed */
static constexpr unsigned IDLE_MOUNT = 0x1000;
/** the partition list has changed */
static constexpr unsigned IDLE_PARTITION = 0x2000;
/**
* Get idle names
*/
gcc_const
const char*const*
idle_get_names() noexcept;
/**
* Parse an idle name and return its mask. Returns 0 if the given
* name is unknown.
*/
gcc_nonnull_all gcc_pure
unsigned
idle_parse_name(const char *name) noexcept;
#endif

168
src/Instance.cxx Normal file
View File

@@ -0,0 +1,168 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "config.h"
#include "Instance.hxx"
#include "Partition.hxx"
#include "Idle.hxx"
#include "Stats.hxx"
#ifdef ENABLE_CURL
#include "RemoteTagCache.hxx"
#include "util/UriUtil.hxx"
#endif
#ifdef ENABLE_DATABASE
#include "db/DatabaseError.hxx"
#include "db/Interface.hxx"
#include "db/update/Service.hxx"
#include "storage/StorageInterface.hxx"
#ifdef ENABLE_SQLITE
#include "sticker/StickerDatabase.hxx"
#include "sticker/SongSticker.hxx"
#endif
#endif
#include <exception>
Instance::Instance()
:rtio_thread(true),
#ifdef ENABLE_SYSTEMD_DAEMON
systemd_watchdog(event_loop),
#endif
idle_monitor(event_loop, BIND_THIS_METHOD(OnIdle))
{
}
Instance::~Instance() noexcept
{
#ifdef ENABLE_DATABASE
delete update;
if (database != nullptr) {
database->Close();
database.reset();
}
delete storage;
#endif
}
Partition *
Instance::FindPartition(const char *name) noexcept
{
for (auto &partition : partitions)
if (partition.name == name)
return &partition;
return nullptr;
}
#ifdef ENABLE_DATABASE
const Database &
Instance::GetDatabaseOrThrow() const
{
if (database == nullptr)
throw DatabaseError(DatabaseErrorCode::DISABLED,
"No database");
return *database;
}
void
Instance::OnDatabaseModified()
{
assert(database != nullptr);
/* propagate the change to all subsystems */
stats_invalidate();
for (auto &partition : partitions)
partition.DatabaseModified(*database);
}
void
Instance::OnDatabaseSongRemoved(const char *uri)
{
assert(database != nullptr);
#ifdef ENABLE_SQLITE
/* if the song has a sticker, remove it */
if (sticker_enabled()) {
try {
sticker_song_delete(uri);
} catch (...) {
}
}
#endif
for (auto &partition : partitions)
partition.StaleSong(uri);
}
#endif
#ifdef ENABLE_NEIGHBOR_PLUGINS
void
Instance::FoundNeighbor(gcc_unused const NeighborInfo &info) noexcept
{
for (auto &partition : partitions)
partition.EmitIdle(IDLE_NEIGHBOR);
}
void
Instance::LostNeighbor(gcc_unused const NeighborInfo &info) noexcept
{
for (auto &partition : partitions)
partition.EmitIdle(IDLE_NEIGHBOR);
}
#endif
#ifdef ENABLE_CURL
void
Instance::LookupRemoteTag(const char *uri) noexcept
{
if (!uri_has_scheme(uri))
return;
if (!remote_tag_cache)
remote_tag_cache = std::make_unique<RemoteTagCache>(event_loop,
*this);
remote_tag_cache->Lookup(uri);
}
void
Instance::OnRemoteTag(const char *uri, const Tag &tag) noexcept
{
if (!tag.IsDefined())
/* boring */
return;
for (auto &partition : partitions)
partition.TagModified(uri, tag);
}
#endif

200
src/Instance.hxx Normal file
View File

@@ -0,0 +1,200 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef MPD_INSTANCE_HXX
#define MPD_INSTANCE_HXX
#include "config.h"
#include "event/Loop.hxx"
#include "event/Thread.hxx"
#include "event/MaskMonitor.hxx"
#include "util/Compiler.h"
#ifdef ENABLE_SYSTEMD_DAEMON
#include "lib/systemd/Watchdog.hxx"
#endif
#ifdef ENABLE_CURL
#include "RemoteTagCacheHandler.hxx"
#endif
#ifdef ENABLE_NEIGHBOR_PLUGINS
#include "neighbor/Listener.hxx"
class NeighborGlue;
#endif
#ifdef ENABLE_DATABASE
#include "db/DatabaseListener.hxx"
#include "db/Ptr.hxx"
class Storage;
class UpdateService;
#endif
#include <memory>
#include <list>
class ClientList;
struct Partition;
class StateFile;
class RemoteTagCache;
/**
* A utility class which, when used as the first base class, ensures
* that the #EventLoop gets initialized before the other base classes.
*/
struct EventLoopHolder {
EventLoop event_loop;
};
struct Instance final
: EventLoopHolder
#if defined(ENABLE_DATABASE) || defined(ENABLE_NEIGHBOR_PLUGINS)
,
#endif
#ifdef ENABLE_DATABASE
public DatabaseListener
#ifdef ENABLE_NEIGHBOR_PLUGINS
,
#endif
#endif
#ifdef ENABLE_NEIGHBOR_PLUGINS
public NeighborListener
#endif
#ifdef ENABLE_CURL
, public RemoteTagCacheHandler
#endif
{
/**
* A thread running an #EventLoop for non-blocking (bulk) I/O.
*/
EventThread io_thread;
/**
* Another thread running an #EventLoop for non-blocking
* (real-time) I/O. This is used instead of #io_thread for
* events which require low latency, e.g. for filling hardware
* ring buffers.
*/
EventThread rtio_thread;
#ifdef ENABLE_SYSTEMD_DAEMON
Systemd::Watchdog systemd_watchdog;
#endif
MaskMonitor idle_monitor;
#ifdef ENABLE_NEIGHBOR_PLUGINS
NeighborGlue *neighbors;
#endif
#ifdef ENABLE_DATABASE
DatabasePtr database;
/**
* This is really a #CompositeStorage. To avoid heavy include
* dependencies, we declare it as just #Storage.
*/
Storage *storage = nullptr;
UpdateService *update = nullptr;
#endif
#ifdef ENABLE_CURL
std::unique_ptr<RemoteTagCache> remote_tag_cache;
#endif
ClientList *client_list;
std::list<Partition> partitions;
StateFile *state_file = nullptr;
Instance();
~Instance() noexcept;
/**
* Wrapper for EventLoop::Break(). Call to initiate shutdown.
*/
void Break() {
event_loop.Break();
}
void EmitIdle(unsigned mask) {
idle_monitor.OrMask(mask);
}
/**
* Find a #Partition with the given name. Returns nullptr if
* no such partition was found.
*/
gcc_pure
Partition *FindPartition(const char *name) noexcept;
void BeginShutdownPartitions() noexcept;
#ifdef ENABLE_DATABASE
/**
* Returns the global #Database instance. May return nullptr
* if this MPD configuration has no database (no
* music_directory was configured).
*/
Database *GetDatabase() {
return database.get();
}
/**
* Returns the global #Database instance. Throws
* DatabaseError if this MPD configuration has no database (no
* music_directory was configured).
*/
const Database &GetDatabaseOrThrow() const;
#endif
void BeginShutdownUpdate() noexcept;
#ifdef ENABLE_CURL
void LookupRemoteTag(const char *uri) noexcept;
#else
void LookupRemoteTag(const char *) noexcept {
/* no-op */
}
#endif
private:
#ifdef ENABLE_DATABASE
void OnDatabaseModified() override;
void OnDatabaseSongRemoved(const char *uri) override;
#endif
#ifdef ENABLE_NEIGHBOR_PLUGINS
/* virtual methods from class NeighborListener */
void FoundNeighbor(const NeighborInfo &info) noexcept override;
void LostNeighbor(const NeighborInfo &info) noexcept override;
#endif
#ifdef ENABLE_CURL
/* virtual methods from class RemoteTagCacheHandler */
void OnRemoteTag(const char *uri, const Tag &tag) noexcept override;
#endif
/* callback for #idle_monitor */
void OnIdle(unsigned mask);
};
#endif

161
src/Listen.cxx Normal file
View File

@@ -0,0 +1,161 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "config.h"
#include "Listen.hxx"
#include "Log.hxx"
#include "client/Listener.hxx"
#include "config/Param.hxx"
#include "config/Data.hxx"
#include "config/Option.hxx"
#include "config/Net.hxx"
#include "net/AllocatedSocketAddress.hxx"
#include "net/UniqueSocketDescriptor.hxx"
#include "net/SocketUtil.hxx"
#include "system/Error.hxx"
#include "util/RuntimeError.hxx"
#include "fs/AllocatedPath.hxx"
#include "fs/XDG.hxx"
#include <sys/stat.h>
#include <string.h>
#include <assert.h>
#ifdef ENABLE_SYSTEMD_DAEMON
#include <systemd/sd-daemon.h>
#endif
#define DEFAULT_PORT 6600
int listen_port;
#ifdef ENABLE_SYSTEMD_DAEMON
static bool
listen_systemd_activation(ClientListener &listener)
{
int n = sd_listen_fds(true);
if (n <= 0) {
if (n < 0)
throw MakeErrno(-n, "sd_listen_fds() failed");
return false;
}
for (int i = SD_LISTEN_FDS_START, end = SD_LISTEN_FDS_START + n;
i != end; ++i)
listener.AddFD(UniqueSocketDescriptor(i));
return true;
}
#endif
/**
* Listen on "$XDG_RUNTIME_DIR/mpd/socket" (if applicable).
*
* @return true if a listener socket was added
*/
static bool
ListenXdgRuntimeDir(ClientListener &listener) noexcept
{
#if defined(USE_XDG) && defined(HAVE_UN)
if (geteuid() == 0)
/* this MPD instance is a system-wide daemon; don't
use $XDG_RUNTIME_DIR */
return false;
Path xdg_runtime_dir = Path::FromFS(getenv("XDG_RUNTIME_DIR"));
if (xdg_runtime_dir.IsNull())
return false;
const auto mpd_runtime_dir = xdg_runtime_dir / Path::FromFS("mpd");
mkdir(mpd_runtime_dir.c_str(), 0700);
const auto socket_path = mpd_runtime_dir / Path::FromFS("socket");
unlink(socket_path.c_str());
AllocatedSocketAddress address;
address.SetLocal(socket_path.c_str());
try {
auto fd = socket_bind_listen(AF_LOCAL, SOCK_STREAM, 0,
address, 5);
chmod(socket_path.c_str(), 0600);
listener.AddFD(std::move(fd), std::move(address));
return true;
} catch (...) {
FormatError(std::current_exception(),
"Failed to listen on '%s' (not fatal)",
socket_path.c_str());
return false;
}
#else
(void)listener;
return false;
#endif
}
void
listen_global_init(const ConfigData &config, ClientListener &listener)
{
int port = config.GetPositive(ConfigOption::PORT, DEFAULT_PORT);
#ifdef ENABLE_SYSTEMD_DAEMON
if (listen_systemd_activation(listener))
return;
#endif
for (const auto &param : config.GetParamList(ConfigOption::BIND_TO_ADDRESS)) {
try {
ServerSocketAddGeneric(listener, param.value.c_str(),
port);
} catch (...) {
std::throw_with_nested(FormatRuntimeError("Failed to listen on %s (line %i)",
param.value.c_str(),
param.line));
}
}
bool have_xdg_runtime_listener = false;
if (listener.IsEmpty()) {
/* no "bind_to_address" configured, bind the
configured port on all interfaces */
have_xdg_runtime_listener = ListenXdgRuntimeDir(listener);
try {
listener.AddPort(port);
} catch (...) {
std::throw_with_nested(FormatRuntimeError("Failed to listen on *:%d: ", port));
}
}
try {
listener.Open();
} catch (...) {
if (have_xdg_runtime_listener)
LogError(std::current_exception(),
"Default TCP listener setup failed, but this is okay because we have a $XDG_RUNTIME_DIR listener");
else
throw;
}
listen_port = port;
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2010 The Music Player Daemon Project
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -17,18 +17,15 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef MPD_LISTEN_H
#define MPD_LISTEN_H
#ifndef MPD_LISTEN_HXX
#define MPD_LISTEN_HXX
#include <glib.h>
#include <stdbool.h>
struct ConfigData;
class ClientListener;
extern int listen_port;
bool
listen_global_init(GError **error_r);
void listen_global_finish(void);
void
listen_global_init(const ConfigData &config, ClientListener &listener);
#endif

125
src/LocateUri.cxx Normal file
View File

@@ -0,0 +1,125 @@
/*
* Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "config.h"
#include "LocateUri.hxx"
#include "client/Client.hxx"
#include "fs/AllocatedPath.hxx"
#include "ls.hxx"
#include "util/UriUtil.hxx"
#include "util/ASCII.hxx"
#ifdef ENABLE_DATABASE
#include "storage/StorageInterface.hxx"
#endif
#include <stdexcept>
static LocatedUri
LocateFileUri(const char *uri, const Client *client
#ifdef ENABLE_DATABASE
, const Storage *storage
#endif
)
{
auto path = AllocatedPath::FromUTF8Throw(uri);
#ifdef ENABLE_DATABASE
if (storage != nullptr) {
const char *suffix = storage->MapToRelativeUTF8(uri);
if (suffix != nullptr)
/* this path was relative to the music
directory */
return LocatedUri(LocatedUri::Type::RELATIVE, suffix);
}
#endif
if (client != nullptr)
client->AllowFile(path);
return LocatedUri(LocatedUri::Type::PATH, uri, std::move(path));
}
static LocatedUri
LocateAbsoluteUri(UriPluginKind kind, const char *uri
#ifdef ENABLE_DATABASE
, const Storage *storage
#endif
)
{
switch (kind) {
case UriPluginKind::INPUT:
case UriPluginKind::STORAGE: // TODO: separate check for storage plugins
if (!uri_supported_scheme(uri))
throw std::runtime_error("Unsupported URI scheme");
break;
case UriPluginKind::PLAYLIST:
/* for now, no validation for playlist URIs; this is
more complicated because there are three ways to
identify which plugin to use: URI scheme, filename
suffix and MIME type */
break;
}
#ifdef ENABLE_DATABASE
if (storage != nullptr) {
const char *suffix = storage->MapToRelativeUTF8(uri);
if (suffix != nullptr)
return LocatedUri(LocatedUri::Type::RELATIVE, suffix);
}
#endif
return LocatedUri(LocatedUri::Type::ABSOLUTE, uri);
}
LocatedUri
LocateUri(UriPluginKind kind,
const char *uri, const Client *client
#ifdef ENABLE_DATABASE
, const Storage *storage
#endif
)
{
/* skip the obsolete "file://" prefix */
const char *path_utf8 = StringAfterPrefixCaseASCII(uri, "file://");
if (path_utf8 != nullptr) {
if (!PathTraitsUTF8::IsAbsolute(path_utf8))
throw std::runtime_error("Malformed file:// URI");
return LocateFileUri(path_utf8, client
#ifdef ENABLE_DATABASE
, storage
#endif
);
} else if (PathTraitsUTF8::IsAbsolute(uri))
return LocateFileUri(uri, client
#ifdef ENABLE_DATABASE
, storage
#endif
);
else if (uri_has_scheme(uri))
return LocateAbsoluteUri(kind, uri
#ifdef ENABLE_DATABASE
, storage
#endif
);
else
return LocatedUri(LocatedUri::Type::RELATIVE, uri);
}

Some files were not shown because too many files have changed in this diff Show More