Compare commits

...

3733 Commits

Author SHA1 Message Date
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
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
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
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
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
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
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
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
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
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
2f51285349 Merge branch 'v0.18.x' 2014-01-20 09:05:36 +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
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
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
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
959d7ca9d0 valgrind.suppressions: add libsmbclient suppressions 2014-01-08 20:57:53 +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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
1369 changed files with 95110 additions and 54230 deletions

137
.gitignore vendored
View File

@@ -6,76 +6,83 @@
*.lo
*.o
*.exe
.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
/test-driver
mpd
mpd.service
stamp-h1
tags
*~
.#*
.stgit*
src/dsd2pcm/dsd2pcm
src/win/mpd_win32_rc.rc
doc/doxygen.conf
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
test/test_queue_priority
test/run_ntp_server
test/run_resolver
test/run_tcp_connect
test/test_pcm
test/dump_rva2
test/dump_text_file
test/test_util
test/test_byte_reverse
test/test_mixramp
test/test_vorbis_encoder
test/DumpDatabase
.deps
.dirstamp
tags
/Makefile
/Makefile.in
/aclocal.m4
/autom4te.cache
/config.h
/config.h.in
/config.log
/config.mk
/config.status
/config_detected.h
/config_detected.mk
/configure
/configure.lineno
/depmode
/libtool
/ltmain.sh
/mkinstalldirs
/build
/src/mpd
/systemd/system/mpd.service
/systemd/user/mpd.service
/stamp-h1
/src/dsd2pcm/dsd2pcm
/src/win32/mpd_win32_rc.rc
/doc/doxygen.conf
/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
/test/test_queue_priority
/test/test_protocol
/test/run_ntp_server
/test/run_resolver
/test/run_tcp_connect
/test/test_pcm
/test/dump_rva2
/test/dump_text_file
/test/test_util
/test/test_byte_reverse
/test/test_mixramp
/test/test_vorbis_encoder
/test/DumpDatabase
/lib/
/*.tar.gz
/*.tar.bz2
/*.tar.xz
/mpd-*/
__pycache__/

View File

@@ -1,5 +1,5 @@
Music Player Daemon - http://www.musicpd.org
Copyright (C) 2003-2013 The Music Player Daemon Project
Copyright 2003-2017 The Music Player Daemon Project
The following people have contributed code to MPD:
@@ -29,3 +29,4 @@ The following people have contributed code to MPD:
Denis Krjuchkov <denis@crazydev.net>
Jurgen Kramer <gtmkramer@xs4all.nl>
Jean-Francois Dockes <jf@dockes.org>
Yue Wang <yuleopen@gmail.com>

View File

@@ -12,12 +12,11 @@ install MPD. If more information is desired, read the user manual:
Dependencies
------------
gcc 4.6 or later - http://gcc.gnu.org/
gcc 4.7 or later - http://gcc.gnu.org/
clang 3.2 or later - http://clang.llvm.org/
Any other C++11 compliant compiler should also work.
GLib 2.28 - http://www.gtk.org/
General-purpose utility library.
Boost 1.46 - http://www.boost.org/
Optional Output Dependencies
@@ -114,9 +113,6 @@ For WavPack playback.
libadplug - http://adplug.sourceforge.net/
For AdLib playback.
despotify - https://github.com/SimonKagstrom/despotify
For Spotify playback.
Optional Miscellaneous Dependencies
-----------------------------------

File diff suppressed because it is too large Load Diff

474
NEWS
View File

@@ -1,3 +1,477 @@
ver 0.20.1 (2017/01/09)
* input
- curl: fix crash bug
- curl: fix freeze bug
* decoder
- wavpack: fix crash bug
* storage
- curl: new storage plugin for WebDAV (work in progress)
* mixer
- alsa: normalize displayed volume according to human perception
* fix crash with volume_normalization enabled
ver 0.20 (2017/01/04)
* protocol
- "commands" returns playlist commands only if playlist_directory configured
- "search"/"find" have a "window" parameter
- report song duration with milliseconds precision
- "sticker find" can match sticker values
- drop the "file:///" prefix for absolute file paths
- add range parameter to command "plchanges" and "plchangesposid"
- send verbose error message to client
* input
- curl: fix memory leak
* tags
- ape, ogg: drop support for non-standard tag "album artist"
affected filetypes: vorbis, flac, opus & all files with ape2 tags
(most importantly some mp3s)
- id3: remove the "id3v1_encoding" setting; by definition, all ID3v1 tags
are ISO-Latin-1
- ape: support APE replay gain on remote files
- read ID3 tags from NFS/SMB
* decoder
- improved error logging
- report I/O errors to clients
- ffmpeg: support ReplayGain and MixRamp
- ffmpeg: support stream tags
- gme: add option "accuracy"
- gme: provide the TRACK tag
- gme: faster scanning
- mad: reduce memory usage while scanning tags
- mpcdec: read the bit rate
- pcm: support audio/L16 (RFC 2586) and audio/x-mpd-float
- sidplay: faster scanning
- wavpack: large file support
- wavpack: support DSD (WavPack 5)
- wavpack: archive support
* playlist
- cue: don't skip pregap
- embcue: fix last track
- flac: new plugin which reads the "CUESHEET" metadata block
* output
- alsa: fix multi-channel order
- alsa: remove option "use_mmap"
- alsa: support DSD_U32
- alsa: disable DoP if it fails
- jack: reduce CPU usage
- pulse: set channel map to WAVE-EX
- recorder: record tags
- recorder: allow dynamic file names
- sndio: new output plugin
* mixer
- null: new plugin
* resampler
- new block "resampler" in configuration file
replacing the old "samplerate_converter" setting
- soxr: allow multi-threaded resampling
* player
- reset song priority on playback
- reduce xruns
* write database and state file atomically
* always write UTF-8 to the log file.
* remove dependency on GLib
* support libsystemd (instead of the older libsystemd-daemon)
* database
- proxy: add TCP keepalive option
* update
- apply .mpdignore matches to subdirectories
* switch the code base to C++14
- GCC 4.9 or clang 3.4 (or newer) recommended
ver 0.19.21 (2016/12/13)
* decoder
- ffmpeg: fix crash bug
* fix unit test failure after recent "setprio" change
* systemd: add user unit
ver 0.19.20 (2016/12/09)
* protocol
- "setprio" re-enqueues old song if priority has been raised
* decoder
- ffmpeg: ignore empty packets
- pcm: fix corruption bug with partial frames (after short read)
- sidplay: fix playback speed with libsidplayfp
* output
- winmm: fix 8 bit playback
* fix gcc 7.0 -Wimplicit-fallthrough
* systemd: paranoid security settings
ver 0.19.19 (2016/08/23)
* decoder
- ffmpeg: bug fix for FFmpeg 3.1 support
- wildmidi: support libWildMidi 0.4
* output
- pulse: support 32 bit, 24 bit and floating point playback
* support non-x86 NetBSD
* fix clang 3.9 warnings
ver 0.19.18 (2016/08/05)
* decoder
- ffmpeg: fix crash with older FFmpeg versions (< 3.0)
- ffmpeg: log detailed error message
- ffmpeg: support FFmpeg 3.1
- sidplay: detect libsidplay2 with pkg-config
- sidplay: log detailed error message
- sidplay: read the "date" tag
- sidplay: allow building with libsidplayfp instead of libsidplay2
* output
- shout: recognize setting "encoder" instead of "encoding"
* fix memory leak after stream failure
* fix build failure with Boost 1.61
* require gcc 4.7 or newer
ver 0.19.17 (2016/07/09)
* decoder
- flac: fix assertion failure while seeking
- flac: fix stream duration indicator
- fix seek problems in several plugins
* fix spurious seek error "Failed to allocate silence buffer"
* replay gain: fix "replay_gain_handler mixer" setting
* DSD: use 0x69 as silence pattern
* fix use-after-free bug on "close" and "kill"
ver 0.19.16 (2016/06/13)
* faster seeking
* fix system include path order
* add missing DocBook file to tarball
ver 0.19.15 (2016/04/30)
* decoder
- ffmpeg: support FFmpeg 3.0
- ffmpeg: use as fallback instead of "mad" if no plugin matches
- opus: support bigger OpusTags packets
* fix more build failures on non-glibc builds due to constexpr Mutex
* fix build failure due to missing include
* fix unit test on Alpha
ver 0.19.14 (2016/03/18)
* decoder
- dsdiff: fix off-by-one buffer overflow
- opus: limit tag size to 64 kB
* archive
- iso9660: fix buffer overflow
* fix quadratic runtime bug in the tag pool
* fix build failures on non-glibc builds due to constexpr Mutex
ver 0.19.13 (2016/02/23)
* tags
- aiff, riff: fix ID3 chunk padding
* decoder
- ffmpeg: support the TAK codec
* fix disappearing duration of remote songs during playback
* initialize supplementary groups with glibc 2.19+
ver 0.19.12 (2015/12/15)
* fix assertion failure on malformed UTF-8 tag
* fix build failure on non-Linux systems
* fix LimitRTTIME in systemd unit file
ver 0.19.11 (2015/10/27)
* tags
- ape: fix buffer overflow
* decoder
- ffmpeg: fix crash due to wrong avio_alloc_context() call
- gme: don't loop forever, fall back to GME's default play length
* encoder
- flac: fix crash with 32 bit playback
* mixer
- fix mixer lag after enabling/disabling output
ver 0.19.10 (2015/06/21)
* input
- curl: fix deadlock on small responses
- smbclient: fix DFF playback
* decoder
- ffmpeg: improve seeking accuracy
- fix stuck stream tags
* encoder
- opus: fix bogus granulepos
* output
- fix failure to open device right after booting
* neighbor
- nfs: fix deadlock when connecting
* fix "single" mode breakage due to queue edits
ver 0.19.9 (2015/02/06)
* decoder
- dsdiff, dsf: raise ID3 tag limit to 1 MB
* playlist: fix loading duplicate tag types from state file
* despotify: remove defunct plugin
* fix clock integer overflow on OS X
* fix gcc 5.0 warnings
* fix build failure with uClibc
* fix build failure on non-POSIX operating systems
* fix dependency issue on parallel Android build
* fix database/state file saving on Windows
ver 0.19.8 (2015/01/14)
* input
- curl: fix bug after rewinding from end-of-file
- mms: reduce delay at the beginning of playback
* decoder
- dsdiff, dsf: allow ID3 tags larger than 4 kB
- ffmpeg: support interleaved floating point
* fix clang 3.6 warnings
* fix build failure on NetBSD
ver 0.19.7 (2014/12/17)
* input
- nfs: fix crash while canceling a failing file open operation
- nfs: fix memory leak on connection failure
- nfs: fix reconnect after mount failure
- nfs: implement mount timeout (60 seconds)
* storage
- nfs: implement I/O timeout (60 seconds)
* playlist
- embcue: fix filename suffix detection
- don't skip non-existent songs in "listplaylist"
* decoder
- ffmpeg: fix time stamp underflow
* fix memory allocator bug on Windows
ver 0.19.6 (2014/12/08)
* decoder
- ffmpeg: support FFmpeg 2.5
* fix build failure with musl
* android
- update libFLAC to 1.3.1
- update FFmpeg to 2.5
ver 0.19.5 (2014/11/26)
* input
- nfs: fix crash on connection failure
* archive
- zzip: fix crash after seeking
* decoder
- dsdiff, dsf, opus: fix deadlock while seeking
- mp4v2: remove because of incompatible license
ver 0.19.4 (2014/11/18)
* protocol
- workaround for buggy clients that send "add /"
* decoder
- ffmpeg: support opus
- opus: add MIME types audio/ogg and application/ogg
* fix crash on failed filename charset conversion
* fix local socket detection from uid=0 (root)
ver 0.19.3 (2014/11/11)
* protocol
- fix "(null)" result string to "list" when AlbumArtist is disabled
* database
- upnp: fix breakage due to malformed URIs
* input
- curl: another fix for redirected streams
* decoder
- audiofile: fix crash while playing streams
- audiofile: fix bit rate calculation
- ffmpeg: support opus
- opus: fix bogus duration on streams
- opus: support chained streams
- opus: improved error logging
* fix distorted audio with soxr resampler
* fix build failure on Mac OS X with non-Apple compilers
ver 0.19.2 (2014/11/02)
* input
- curl: fix redirected streams
* playlist
- don't allow empty playlist name
- m3u: don't ignore unterminated last line
- m3u: recognize the file suffix ".m3u8"
* decoder
- ignore URI query string for plugin detection
- faad: remove workaround for ancient libfaad2 ABI bug
- ffmpeg: recognize MIME type audio/aacp
- mad: fix negative replay gain values
* output
- fix memory leak after filter initialization error
- fall back to PCM if given DSD sample rate is not supported
* fix assertion failure on unsupported PCM conversion
* auto-disable plugins that require GLib when --disable-glib is used
ver 0.19.1 (2014/10/19)
* input
- mms: fix deadlock bug
* playlist
- extm3u: fix Extended M3U detection
- m3u, extm3u, cue: fix truncated lines
* fix build failure on Mac OS X
* add missing file systemd/mpd.socket to tarball
ver 0.19 (2014/10/10)
* protocol
- new commands "addtagid", "cleartagid", "listfiles", "listmounts",
"listneighbors", "mount", "rangeid", "unmount"
- "lsinfo" and "readcomments" allowed for remote files
- "listneighbors" lists file servers on the local network
- "playlistadd" supports file:///
- "idle" with unrecognized event name fails
- "list" on album artist falls back to the artist tag
- "list" and "count" allow grouping
- new "search"/"find" filter "modified-since"
- "seek*" allows fractional position
- close connection after syntax error
* database
- proxy: forward "idle" events
- proxy: forward the "update" command
- proxy: copy "Last-Modified" from remote directories
- simple: compress the database file using gzip
- upnp: new plugin
- cancel the update on shutdown
* storage
- music_directory can point to a remote file server
- nfs: new plugin
- smbclient: new plugin
* playlist
- cue: fix bogus duration of the last track
- cue: restore CUE tracks from state file
- soundcloud: use https instead of http
- soundcloud: add default API key
* archive
- read tags from songs in an archive
* input
- alsa: new input plugin
- curl: options "verify_peer" and "verify_host"
- ffmpeg: update offset after seeking
- ffmpeg: improved error messages
- mms: non-blocking I/O
- nfs: new input plugin
- smbclient: new input plugin
* filter
- volume: improved software volume dithering
* decoder:
- vorbis, flac, opus: honor DESCRIPTION= tag in Xiph-based files as a comment to the song
- audiofile: support scanning remote files
- audiofile: log libaudiofile errors
- dsdiff, dsf: report bit rate
- dsdiff, dsf: implement seeking
- dsf: support DSD512
- dsf: support multi-channel files
- dsf: fix big-endian bugs
- dsf: fix noise at end of malformed file
- mpg123: support ID3v2, ReplayGain and MixRamp
- sndfile: support scanning remote files
- sndfile: support tags "comment", "album", "track", "genre"
- sndfile: native floating point playback
- sndfile: optimized 16 bit playback
- mp4v2: support playback of MP4 files.
* encoder:
- shine: new encoder plugin
* output
- alsa: support native DSD playback
- alsa: rename "DSD over USB" to "DoP"
- osx: fix hang after (un)plugging headphones
* threads:
- the update thread runs at "idle" priority
- the output thread runs at "real-time" priority
- increase kernel timer slack on Linux
- name each thread (for debugging)
* configuration
- allow playlist directory without music directory
- use XDG to auto-detect "music_directory" and "db_file"
* add tags "AlbumSort", "MUSICBRAINZ_RELEASETRACKID"
* disable global Latin-1 fallback for tag values
* new resampler option using libsoxr
* ARM NEON optimizations
* install systemd unit for socket activation
* Android port
ver 0.18.23 (2015/02/06)
* despotify: remove defunct plugin
* fix clock integer overflow on OS X
* fix gcc 5.0 warnings
ver 0.18.22 (2015/01/14)
* fix clang 3.6 warnings
ver 0.18.21 (2014/12/17)
* playlist
- embcue: fix filename suffix detection
* decoder
- ffmpeg: fix time stamp underflow
ver 0.18.20 (2014/12/08)
* decoder
- ffmpeg: support FFmpeg 2.5
* fix build failure with musl
ver 0.18.19 (2014/11/26)
* archive
- zzip: fix crash after seeking
ver 0.18.18 (2014/11/18)
* decoder
- ffmpeg: support opus
* fix crash on failed filename charset conversion
* fix local socket detection from uid=0 (root)
ver 0.18.17 (2014/11/02)
* playlist
- don't allow empty playlist name
- m3u: recognize the file suffix ".m3u8"
* decoder
- ignore URI query string for plugin detection
- faad: remove workaround for ancient libfaad2 ABI bug
- ffmpeg: recognize MIME type audio/aacp
ver 0.18.16 (2014/09/26)
* fix DSD breakage due to typo in configure.ac
ver 0.18.15 (2014/09/26)
* command
- list: reset used size after the list has been processed
* fix MixRamp
* work around build failure on NetBSD
ver 0.18.14 (2014/09/11)
* protocol
- fix range parser bug on certain 32 bit architectures
* decoder
- audiofile: fix crash after seeking
- ffmpeg: fix crash with ffmpeg/libav version 11
- fix assertion failure after seeking
ver 0.18.13 (2014/08/31)
* protocol
- don't change song on "seekcur" in random mode
* decoder
- dsdiff, dsf: fix endless loop on malformed file
- ffmpeg: support ffmpeg/libav version 11
- gme: fix song duration
* output
- alsa: fix endless loop at end of file in dsd_usb mode
* fix state file saver
* fix build failure on Darwin
ver 0.18.12 (2014/07/30)
* database
- proxy: fix build failure with libmpdclient 2.2
- proxy: fix add/search and other commands with libmpdclient < 2.9
* decoder
- audiofile: improve responsiveness
- audiofile: fix WAV stream playback
- dsdiff, dsf: fix stream playback
- dsdiff: fix metadata parser bug (uninitialized variables)
- faad: estimate song duration for remote files
- sndfile: improve responsiveness
* randomize next song when enabling "random" mode while not playing
* randomize next song when adding to single-song queue
ver 0.18.11 (2014/05/12)
* decoder
- opus: fix missing song length on high-latency files
* fix race condition when using GLib event loop (non-Linux)
ver 0.18.10 (2014/04/10)
* decoder
- ffmpeg: fix seeking bug
- ffmpeg: handle unknown stream start time
- gme: fix memory leak
- sndfile: work around libsndfile bug on partial read
* don't interrupt playback when current song gets deleted
ver 0.18.9 (2014/03/02)
* protocol
- "findadd" requires the "add" permission

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/>.

28
README.md Normal file
View File

@@ -0,0 +1,28 @@
# 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 information see the INSTALL file.
# Users
- [Manual](http://www.musicpd.org/doc/user/)
- [Forum](http://forum.musicpd.org/)
- [IRC](irc://chat.freenode.net/#mpd)
- [Bug tracker](http://bugs.musicpd.org/)
# 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.

1
android/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/build

View File

@@ -0,0 +1,24 @@
<?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="13"
android:versionName="0.19.9">
<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="17"/>
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Main"
android:label="@string/app_name"
android:launchMode="singleInstance">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

153
android/build.py Executable file
View File

@@ -0,0 +1,153 @@
#!/usr/bin/env python3
import os, os.path
import sys, subprocess
if len(sys.argv) < 3:
print("Usage: build.py SDK_PATH NDK_PATH [configure_args...]", file=sys.stderr)
sys.exit(1)
sdk_path = sys.argv[1]
ndk_path = sys.argv[2]
configure_args = sys.argv[3:]
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)
# select the NDK target
arch = 'arm-linux-androideabi'
# 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
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
self.ndk_arch = 'arm'
android_abi = 'armeabi-v7a'
ndk_platform = 'android-14'
# select the NDK compiler
gcc_version = '4.9'
ndk_platform_path = os.path.join(ndk_path, 'platforms', ndk_platform)
sysroot = os.path.join(ndk_platform_path, 'arch-' + self.ndk_arch)
install_prefix = os.path.join(arch_path, 'root')
self.arch = arch
self.install_prefix = install_prefix
self.sysroot = sysroot
toolchain_path = os.path.join(ndk_path, 'toolchains', arch + '-' + gcc_version, 'prebuilt', build_arch)
llvm_path = os.path.join(ndk_path, 'toolchains', 'llvm', 'prebuilt', build_arch)
llvm_triple = 'armv7-none-linux-androideabi'
common_flags = '-march=armv7-a -mfloat-abi=softfp'
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
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 = '-Os -g ' + common_flags
self.cxxflags = '-Os -g ' + common_flags
self.cppflags = '--sysroot=' + self.sysroot + ' -isystem ' + os.path.join(install_prefix, 'include')
self.ldflags = '--sysroot=' + self.sysroot + ' ' + common_flags + ' -L' + os.path.join(install_prefix, 'lib')
self.libs = ''
self.is_arm = self.ndk_arch == 'arm'
self.is_armv7 = self.is_arm and 'armv7' in self.cflags
self.is_windows = False
libstdcxx_path = os.path.join(ndk_path, 'sources/cxx-stl/gnu-libstdc++', gcc_version)
libstdcxx_cppflags = '-isystem ' + os.path.join(libstdcxx_path, 'include') + ' -isystem ' + os.path.join(libstdcxx_path, 'libs', android_abi, 'include')
libstdcxx_ldadd = os.path.join(libstdcxx_path, 'libs', android_abi, 'libgnustl_static.a')
if use_cxx:
self.libs += ' ' + libstdcxx_ldadd
self.cppflags += ' ' + libstdcxx_cppflags
self.env = dict(os.environ)
# redirect pkg-config to use our root directory instead of the
# default one on the build host
self.env['PKG_CONFIG_LIBDIR'] = os.path.join(install_prefix, 'lib/pkgconfig')
# a list of third-party libraries to be used by MPD on Android
from build.libs import *
thirdparty_libs = [
libogg,
libvorbis,
opus,
flac,
libid3tag,
libmad,
ffmpeg,
curl,
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 = [
os.path.join(mpd_path, 'configure'),
'CC=' + toolchain.cc,
'CXX=' + toolchain.cxx,
'CFLAGS=' + toolchain.cflags,
'CXXFLAGS=' + toolchain.cxxflags,
'CPPFLAGS=' + toolchain.cppflags,
'LDFLAGS=' + toolchain.ldflags,
'LIBS=' + toolchain.libs,
'AR=' + toolchain.ar,
'RANLIB=' + toolchain.ranlib,
'STRIP=' + toolchain.strip,
'--host=' + toolchain.arch,
'--prefix=' + toolchain.install_prefix,
'--with-sysroot=' + toolchain.sysroot,
'--with-android-sdk=' + sdk_path,
'--enable-silent-rules',
'--disable-icu',
] + configure_args
subprocess.check_call(configure, env=toolchain.env)
subprocess.check_call(['/usr/bin/make', '--quiet', '-j12'], 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>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">MPD</string>
</resources>

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

@@ -0,0 +1,30 @@
/*
* Copyright 2003-2017 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 {
public static native void run(Context context);
public static native void shutdown();
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2013 The Music Player Daemon Project
* Copyright 2003-2017 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -17,9 +17,23 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "TagSettings.h"
package org.musicpd;
bool ignore_tag_items[TAG_NUM_OF_ITEM_TYPES] = {
/* ignore comments by default */
[TAG_COMMENT] = true,
};
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();
}
}
}

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

@@ -0,0 +1,75 @@
/*
* Copyright 2003-2017 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.app.Activity;
import android.os.Bundle;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
import android.util.Log;
public class Main extends Activity implements Runnable {
private static final String TAG = "MPD";
Thread thread;
TextView textView;
final Handler quitHandler = new Handler() {
public void handleMessage(Message msg) {
textView.setText("Music Player Daemon has quit");
// TODO: what now? restart?
}
};
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!Loader.loaded) {
TextView tv = new TextView(this);
tv.setText("Failed to load the native MPD libary.\n" +
"Report this problem to us, and include the following information:\n" +
"ABI=" + Build.CPU_ABI + "\n" +
"PRODUCT=" + Build.PRODUCT + "\n" +
"FINGERPRINT=" + Build.FINGERPRINT + "\n" +
"error=" + Loader.error);
setContentView(tv);
return;
}
if (thread == null || !thread.isAlive()) {
thread = new Thread(this, "NativeMain");
thread.start();
}
textView = new TextView(this);
textView.setText("Music Player Daemon is running"
+ "\nCAUTION: this version is EXPERIMENTAL!");
setContentView(textView);
}
@Override public void run() {
Bridge.run(this);
quitHandler.sendMessage(quitHandler.obtainMessage());
}
}

View File

@@ -1,137 +1,11 @@
#!/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"
set -e
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'
fi
if test -n "$AC_FORCE_VERSION"
then
AC_VERSIONS="$AC_FORCE_VERSION"
else
AC_VERSIONS='2.60 2.61'
fi
rm -rf config.cache build
mkdir build
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
aclocal -I m4 $ACLOCAL_FLAGS
autoheader
automake --add-missing $AUTOMAKE_FLAGS
autoconf

File diff suppressed because it is too large Load Diff

View File

@@ -1,16 +1,17 @@
<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"docbook/dtd/xml/4.2/docbookx.dtd">
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<book>
<title>The Music Player Daemon - Developer's Manual</title>
<chapter>
<chapter id="introduction">
<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
contributions. So far, more than 150 people have contributed
patches.
</para>
@@ -20,7 +21,7 @@
</para>
</chapter>
<chapter>
<chapter id="code_style">
<title>Code Style</title>
<itemizedlist>
@@ -39,9 +40,35 @@
<listitem>
<para>
the code should be C++11 compliant, and must compile with
<application>GCC</application> 4.6 and
<application>clang</application> 3.2
comment your code, document your APIs
</para>
</listitem>
<listitem>
<para>
the code should be C++14 compliant, and must compile with
<application>GCC</application> 4.9 and
<application>clang</application> 3.4
</para>
</listitem>
<listitem>
<para>
report error conditions with C++ exceptions, preferable
derived from <varname>std::runtime_error</varname>
</para>
</listitem>
<listitem>
<para>
all code must be exception-safe
</para>
</listitem>
<listitem>
<para>
classes and functions names use CamelCase; variables are
lower-case with words separated by underscore
</para>
</listitem>
@@ -51,9 +78,9 @@
</para>
<programlisting lang="C">static inline int
foo(const char *abc, int xyz)
Foo(const char *abc, int xyz)
{
if (abc == NULL) {
if (abc == nullptr) {
LogWarning("Foo happened!");
return -1;
}
@@ -65,7 +92,7 @@ foo(const char *abc, int xyz)
</itemizedlist>
</chapter>
<chapter>
<chapter id="hacking">
<title>Hacking The Source</title>
<para>
@@ -150,12 +177,65 @@ foo(const char *abc, int xyz)
</section>
</chapter>
<chapter>
<chapter id="submitting_patches">
<title>Submitting Patches</title>
<para>
Send your patches to the mailing list:
mpd-devel@musicpd.org
<email>mpd-devel@musicpd.org</email> (<ulink
url="http://mailman.blarg.de/listinfo/mpd-devel">subscribe
here</ulink>)
</para>
<para>
<command>git pull</command> requests are preferred. Regular
contributors can get <ulink
url="http://git.musicpd.org/account-policy.html">an account on
git.musicpd.org</ulink>, but any public git repository will do.
</para>
<para>
There is <ulink url="https://github.com/MaxKellermann/MPD">a
mirror of the <application>MPD</application> git repository on
GitHub</ulink>, and you can use that as well to submit pull
requests.
</para>
</chapter>
<chapter id="tools">
<title>Development Tools</title>
<section>
<title>Clang Static Analyzer</title>
<para>
The <ulink url="http://clang-analyzer.llvm.org/">clang static
analyzer</ulink> is a tool that helps find bugs. To run it on
the MPD code base, install LLVM and clang. Configure MPD to
use clang:
</para>
<programlisting>./configure --enable-debug CXX=clang++ CC=clang ...</programlisting>
<para>
It is recommended to use <option>--enable-debug</option>,
because the analyzer takes advantage of
<function>assert()</function> calls, which are only enabled in
the debug build.
</para>
<para>
Now run the analyzer:
</para>
<programlisting>scan-build --use-c++=clang++ --use-cc=clang make</programlisting>
<para>
The options <option>--use-c++</option> and
<option>--use-cc</option> are necessary because it invokes
<command>cc</command> for actually compiling the sources by
default. That breaks, because MPD requires a C99 compiler.
</para>
</section>
</chapter>
</book>

File diff suppressed because it is too large Load Diff

154
doc/include/tags.xml Normal file
View File

@@ -0,0 +1,154 @@
<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE itemizedlist PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<itemizedlist>
<listitem>
<para>
<varname>artist</varname>: the artist name. Its meaning is not
well-defined; see <varname>composer</varname> and
<varname>performer</varname> for more specific tags.
</para>
</listitem>
<listitem>
<para>
<varname>artistsort</varname>: same as
<varname>artist</varname>, but for sorting. This usually omits
prefixes such as "The".
</para>
</listitem>
<listitem>
<para>
<varname>album</varname>: the album name.
</para>
</listitem>
<listitem>
<para>
<varname>albumsort</varname>: same as <varname>album</varname>,
but for sorting.
</para>
</listitem>
<listitem>
<para>
<varname>albumartist</varname>: on multi-artist albums, this is
the artist name which shall be used for the whole album. The
exact meaning of this tag is not well-defined.
</para>
</listitem>
<listitem>
<para>
<varname>albumartistsort</varname>: same as
<varname>albumartist</varname>, but for sorting.
</para>
</listitem>
<listitem>
<para>
<varname>title</varname>: the song title.
</para>
</listitem>
<listitem>
<para>
<varname>track</varname>: the track number within the album.
</para>
</listitem>
<listitem>
<para>
<varname>name</varname>: a name for this song. This is not the
song title. The exact meaning of this tag is not well-defined.
It is often used by badly configured internet radio stations
with broken tags to squeeze both the artist name and the song
title in one tag.
</para>
</listitem>
<listitem>
<para>
<varname>genre</varname>: the music genre.
</para>
</listitem>
<listitem>
<para>
<varname>date</varname>: the song's release date. This is
usually a 4-digit year.
</para>
</listitem>
<listitem>
<para>
<varname>composer</varname>: the artist who composed the song.
</para>
</listitem>
<listitem>
<para>
<varname>performer</varname>: the artist who performed the song.
</para>
</listitem>
<listitem>
<para>
<varname>comment</varname>: a human-readable comment about this
song. The exact meaning of this tag is not well-defined.
</para>
</listitem>
<listitem>
<para>
<varname>disc</varname>: the disc number in a multi-disc album.
</para>
</listitem>
<listitem>
<para>
<varname>musicbrainz_artistid</varname>: the artist id in the
<ulink
url="http://musicbrainz.org/doc/MusicBrainzTag">MusicBrainz</ulink>
database.
</para>
</listitem>
<listitem>
<para>
<varname>musicbrainz_albumid</varname>: the album id in the
<ulink
url="http://musicbrainz.org/doc/MusicBrainzTag">MusicBrainz</ulink>
database.
</para>
</listitem>
<listitem>
<para>
<varname>musicbrainz_albumartistid</varname>: the album artist
id in the <ulink
url="http://musicbrainz.org/doc/MusicBrainzTag">MusicBrainz</ulink>
database.
</para>
</listitem>
<listitem>
<para>
<varname>musicbrainz_trackid</varname>: the track id in the
<ulink
url="http://musicbrainz.org/doc/MusicBrainzTag">MusicBrainz</ulink>
database.
</para>
</listitem>
<listitem>
<para>
<varname>musicbrainz_releasetrackid</varname>: the release track
id in the <ulink
url="http://musicbrainz.org/doc/MusicBrainzTag">MusicBrainz</ulink>
database.
</para>
</listitem>
</itemizedlist>

View File

@@ -136,53 +136,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
@@ -198,50 +151,11 @@ This is the gain (in dB) applied to songs with ReplayGain tags.
.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 4096,
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 16384.
.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
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
@@ -254,17 +168,6 @@ MP3 playback.
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, disc,
musicbrainz_artistid, musicbrainz_albumid, musicbrainz_albumartistid,
musicbrainz_trackid. 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 and those starting with "musicbrainz".
.TP
.B auto_update <yes or no>
This specifies the whether to support automatic update of music database when
files are changed in music_directory. The default is to disable autoupdate
@@ -274,16 +177,6 @@ of database.
Limit the depth of the directories being watched, 0 means only watch
the music directory itself. There is no limit by default.
.TP
.B despotify_user <name>
This specifies the user to use when logging in to Spotify using the despotify plugins.
.TP
.B despotify_password <name>
This specifies the password to use when logging in to Spotify using the despotify plugins.
.TP
.B despotify_high_bitrate <yes or no>
This specifies if the requested bitrate for Spotify should be high or not. Higher sounds
better but requires more processing and higher bandwidth. Default is yes.
.TP
.SH REQUIRED AUDIO OUTPUT PARAMETERS
.TP
.B type <type>
@@ -333,11 +226,6 @@ 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

View File

@@ -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"
@@ -115,7 +116,7 @@
#
# 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 mpd.conf man page.
# found in the user manual.
#metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc"
#
# This setting enables automatic update of MPD's database when files in
@@ -164,7 +165,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"
#
@@ -231,7 +232,7 @@ input {
#
#audio_output {
# type "shout"
# encoding "ogg" # optional
# encoder "vorbis" # optional
# name "My Shout Stream"
# host "localhost"
# port "8000"
@@ -304,6 +305,23 @@ input {
## 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 "software"
#}
#
# 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 {
@@ -325,13 +343,6 @@ input {
# mixer_type "none" # optional
#}
#
# 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"
#
###############################################################################
@@ -373,38 +384,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 "4096"
#
# 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
@@ -412,34 +391,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"
#}
#
###############################################################################

View File

@@ -1,21 +1,22 @@
<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"docbook/dtd/xml/4.2/docbookx.dtd">
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<book>
<title>The Music Player Daemon protocol</title>
<chapter>
<chapter id="syntax">
<title>General protocol syntax</title>
<section>
<title>Protocol overview</title>
<para>
The MPD command protocol exchanges line-based text records
between client and server over TCP. Once the client is
connected to the server, they conduct a conversation until the
client closes the connection. The conversation flow is always
initiated by the client.
The <application>MPD</application> command protocol exchanges
line-based text records between client and server over TCP.
Once the client is connected to the server, they conduct a
conversation until the client closes the connection. The
conversation flow is always initiated by the client.
</para>
<para>
@@ -38,7 +39,7 @@
</para>
</section>
<section>
<section id="request_syntax">
<title>Requests</title>
<cmdsynopsis>
@@ -65,12 +66,12 @@
<function>strcpy</function> just fine with UTF-8 encoded
strings. For example: <returnvalue>OK</returnvalue> encoded in
UTF-8 is simply <returnvalue>OK</returnvalue>. For more
information on UTF=8:
http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8)
information on UTF-8:
<ulink url="http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8"/>)
</para>
</section>
<section>
<section id="response_syntax">
<title>Responses</title>
<para>
@@ -79,7 +80,7 @@
denote the end of command execution.
</para>
<section>
<section id="failure_response_syntax">
<title>Failure responses</title>
<para>
@@ -188,7 +189,7 @@
</para>
</section>
<section>
<section id="range_syntax">
<title>Ranges</title>
<para>
@@ -201,23 +202,42 @@
omitted, then the maximum possible value is assumed.
</para>
</section>
<section id="tags">
<title>Tags</title>
<para>
The following tags are supported by
<application>MPD</application>:
</para>
<xi:include href="include/tags.xml"
xmlns:xi="http://www.w3.org/2001/XInclude"/>
<para>
There can be multiple values for some of these tags. For
example, <application>MPD</application> may return multiple
lines with a <varname>performer</varname> tag. A tag value is
a UTF-8 string.
</para>
</section>
</chapter>
<chapter>
<chapter id="recipes">
<title>Recipes</title>
<section>
<section id="queuing_recipe">
<title>Queuing</title>
<para>
Often, users run MPD with "<link
Often, users run <application>MPD</application> with "<link
linkend="command_random">random</link>" enabled, but want to
be able to insert songs "before" the rest of the playlist.
That is commonly called "queuing".
</para>
<para>
MPD implements this by allowing the client to specify a
<application>MPD</application> implements this by allowing the client to specify a
"priority" for each song in the playlist (commands <link
linkend="command_prio"><command>prio</command></link> and
<link
@@ -227,24 +247,26 @@
</para>
<para>
In "random" mode, MPD maintains an internal randomized
sequence of songs. In this sequence, songs with a higher
priority come first, and all songs with the same priority are
shuffled (by default, all songs are shuffled, because all have
the same priority "0"). When you increase the priority of a
song, it is moved to the front of the sequence according to
its new priority, but always after the current one. A song
that has been played already (it's "before" the current song
in that sequence) will only be scheduled for repeated playback
if its priority has become bigger than the priority of the
current song. Decreasing the priority of a song will moved it
farther to the end of the sequence. Changing the priority of
the current song has no effect on the sequence.
In "random" mode, <application>MPD</application> maintains an
internal randomized sequence of songs. In this sequence,
songs with a higher priority come first, and all songs with
the same priority are shuffled (by default, all songs are
shuffled, because all have the same priority "0"). When you
increase the priority of a song, it is moved to the front of
the sequence according to its new priority, but always after
the current one. A song that has been played already (it's
"before" the current song in that sequence) will only be
scheduled for repeated playback if its priority has become
bigger than the priority of the current song. Decreasing the
priority of a song will move it farther to the end of the
sequence. Changing the priority of the current song has no
effect on the sequence. During playback, a song's priority is
reset to zero.
</para>
</section>
</chapter>
<chapter>
<chapter id="command_reference">
<title>Command reference</title>
<note>
@@ -255,12 +277,12 @@
commands using song ids should be used instead of the commands
that manipulate and control playback based on playlist
position. Using song ids is a safer method when multiple
clients are interacting with MPD.
clients are interacting with <application>MPD</application>.
</para>
</note>
<section>
<title>Querying MPD's status</title>
<section id="status_commands">
<title>Querying <application>MPD</application>'s status</title>
<variablelist>
<varlistentry id="command_clearerror">
@@ -298,12 +320,14 @@
</term>
<listitem>
<para>
<footnote id="since_0_14"><simpara>Introduced with MPD 0.14</simpara></footnote>
<footnote id="since_0_14"><simpara>Introduced with
<application>MPD</application> 0.14</simpara></footnote>
Waits until there is a noteworthy change in one or more
of MPD's subsystems. As soon as there is one, it lists
all changed systems in a line in the format
<returnvalue>changed: SUBSYSTEM</returnvalue>, where
SUBSYSTEM is one of the following:
of <application>MPD</application>'s subsystems. As soon
as there is one, it lists all changed systems in a line
in the format <returnvalue>changed:
SUBSYSTEM</returnvalue>, where SUBSYSTEM is one of the
following:
</para>
<itemizedlist>
<listitem>
@@ -385,14 +409,15 @@
to wait for events as long as mpd runs. The
<command>idle</command> command can be canceled by
sending the command <command>noidle</command> (no other
commands are allowed). MPD will then leave
<command>idle</command> mode and print results
immediately; might be empty at this time.
commands are allowed). <application>MPD</application>
will then leave <command>idle</command> mode and print
results immediately; might be empty at this time.
</para>
<para>
If the optional <varname>SUBSYSTEMS</varname> argument is used,
MPD will only send notifications when something changed in
one of the specified subsytems.
If the optional <varname>SUBSYSTEMS</varname> argument
is used, <application>MPD</application> will only send
notifications when something changed in one of the
specified subsytems.
</para>
</listitem>
</varlistentry>
@@ -429,7 +454,7 @@
<listitem>
<para>
<varname>single</varname>:
<footnote id="since_0_15"><simpara>Introduced with MPD 0.15</simpara></footnote>
<footnote id="since_0_15"><simpara>Introduced with <application>MPD</application> 0.15</simpara></footnote>
<returnvalue>0 or 1</returnvalue>
</para>
</listitem>
@@ -504,13 +529,22 @@
<listitem>
<para>
<varname>elapsed</varname>:
<footnote id="since_0_16"><simpara>Introduced with MPD 0.16</simpara></footnote>
<footnote id="since_0_16"><simpara>Introduced with <application>MPD</application> 0.16</simpara></footnote>
<returnvalue>
Total time elapsed within the current song, but
with higher resolution.
</returnvalue>
</para>
</listitem>
<listitem>
<para>
<varname>duration</varname>:
<footnote id="since_0_20"><simpara>Introduced with <application>MPD</application> 0.20</simpara></footnote>
<returnvalue>
Duration of the current song in seconds.
</returnvalue>
</para>
</listitem>
<listitem>
<para>
<varname>bitrate</varname>:
@@ -576,7 +610,12 @@
</listitem>
<listitem>
<para>
<varname>songs</varname>: number of albums
<varname>albums</varname>: number of albums
</para>
</listitem>
<listitem>
<para>
<varname>songs</varname>: number of songs
</para>
</listitem>
<listitem>
@@ -607,7 +646,7 @@
</variablelist>
</section>
<section>
<section id="playback_option_commands">
<title>Playback options</title>
<variablelist>
@@ -740,7 +779,7 @@
<parameter>album</parameter>,
<parameter>auto</parameter><footnote
id="replay_gain_auto_since_0_16">
<simpara>added in MPD 0.16</simpara>
<simpara>added in <application>MPD</application> 0.16</simpara>
</footnote>.
</para>
<para>
@@ -790,7 +829,7 @@
</variablelist>
</section>
<section>
<section id="playback_commands">
<title>Controlling playback</title>
<variablelist>
@@ -877,8 +916,8 @@
<listitem>
<para>
Seeks to the position <varname>TIME</varname> (in
seconds) of entry <varname>SONGPOS</varname> in the
playlist.
seconds; fractions allowed) of entry
<varname>SONGPOS</varname> in the playlist.
</para>
</listitem>
</varlistentry>
@@ -893,7 +932,8 @@
<listitem>
<para>
Seeks to the position <varname>TIME</varname> (in
seconds) of song <varname>SONGID</varname>.
seconds; fractions allowed) of song
<varname>SONGID</varname>.
</para>
</listitem>
</varlistentry>
@@ -907,9 +947,10 @@
</term>
<listitem>
<para>
Seeks to the position <varname>TIME</varname> within the
current song. If prefixed by '+' or '-', then the time
is relative to the current playing position.
Seeks to the position <varname>TIME</varname> (in
seconds; fractions allowed) within the current song. If
prefixed by '+' or '-', then the time is relative to the
current playing position.
</para>
</listitem>
</varlistentry>
@@ -929,7 +970,7 @@
</variablelist>
</section>
<section>
<section id="queue">
<title>The current playlist</title>
<variablelist>
@@ -1030,7 +1071,7 @@ OK
at <varname>START:END</varname> to <varname>TO</varname>
in the playlist.
<footnote id="range_since_0_15">
<simpara>Ranges are supported since MPD 0.15</simpara>
<simpara>Ranges are supported since <application>MPD</application> 0.15</simpara>
</footnote>
</para>
</listitem>
@@ -1130,7 +1171,7 @@ OK
</term>
<listitem>
<para>
Searches case-sensitively for partial matches in the
Searches case-insensitively for partial matches in the
current playlist.
</para>
</listitem>
@@ -1140,12 +1181,15 @@ OK
<cmdsynopsis>
<command>plchanges</command>
<arg choice="req"><replaceable>VERSION</replaceable></arg>
<arg><replaceable>START:END</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Displays changed songs currently in the playlist since
<varname>VERSION</varname>.
<varname>VERSION</varname>. Start and end positions may
be given to limit the output to changes in the given
range.
</para>
<para>
To detect songs that were deleted at the end of the
@@ -1158,6 +1202,7 @@ OK
<cmdsynopsis>
<command>plchangesposid</command>
<arg choice="req"><replaceable>VERSION</replaceable></arg>
<arg><replaceable>START:END</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
@@ -1213,6 +1258,28 @@ OK
</listitem>
</varlistentry>
<varlistentry id="command_rangeid">
<term>
<cmdsynopsis>
<command>rangeid</command>
<arg choice="req"><replaceable>ID</replaceable></arg>
<arg choice="req"><replaceable>START:END</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
<footnote id="since_0_19"><simpara>Since <application>MPD</application>
0.19</simpara></footnote> Specifies the portion of the
song that shall be played. <varname>START</varname> and
<varname>END</varname> are offsets in seconds
(fractional seconds allowed); both are optional.
Omitting both (i.e. sending just ":") means "remove the
range, play everything". A song that is currently
playing cannot be manipulated this way.
</para>
</listitem>
</varlistentry>
<varlistentry id="command_shuffle">
<term>
<cmdsynopsis>
@@ -1258,10 +1325,48 @@ OK
</para>
</listitem>
</varlistentry>
<varlistentry id="command_addtagid">
<term>
<cmdsynopsis>
<command>addtagid</command>
<arg choice="req"><replaceable>SONGID</replaceable></arg>
<arg choice="req"><replaceable>TAG</replaceable></arg>
<arg choice="req"><replaceable>VALUE</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Adds a tag to the specified song. Editing song tags is
only possible for remote songs. This change is
volatile: it may be overwritten by tags received from
the server, and the data is gone when the song gets
removed from the queue.
</para>
</listitem>
</varlistentry>
<varlistentry id="command_cleartagid">
<term>
<cmdsynopsis>
<command>cleartagid</command>
<arg choice="req"><replaceable>SONGID</replaceable></arg>
<arg choice="opt"><replaceable>TAG</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Removes tags from the specified song. If
<varname>TAG</varname> is not specified, then all tag
values will be removed. Editing song tags is only
possible for remote songs.
</para>
</listitem>
</varlistentry>
</variablelist>
</section>
<section>
<section id="playlist_files">
<title>Stored playlists</title>
<para>
@@ -1394,15 +1499,15 @@ OK
<cmdsynopsis>
<command>playlistmove</command>
<arg choice="req"><replaceable>NAME</replaceable></arg>
<arg choice="req"><replaceable>SONGID</replaceable></arg>
<arg choice="req"><replaceable>SONGPOS</replaceable></arg>
<arg choice="req"><replaceable>FROM</replaceable></arg>
<arg choice="req"><replaceable>TO</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Moves <varname>SONGID</varname> in the playlist
<filename>NAME.m3u</filename> to the position
<varname>SONGPOS</varname>.
Moves the song at position <varname>FROM</varname> in
the playlist <filename>NAME.m3u</filename> to the
position <varname>TO</varname>.
</para>
</listitem>
</varlistentry>
@@ -1451,16 +1556,20 @@ OK
</variablelist>
</section>
<section>
<section id="database">
<title>The music database</title>
<variablelist>
<varlistentry id="command_count">
<term>
<cmdsynopsis>
<command>count</command>
<arg choice="req"><replaceable>TAG</replaceable></arg>
<arg choice="req"><replaceable>NEEDLE</replaceable></arg>
<arg choice="opt"><replaceable>...</replaceable></arg>
<arg choice="opt">group</arg>
<arg choice="opt"><replaceable>GROUPTYPE</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
@@ -1468,8 +1577,15 @@ OK
Counts the number of songs and their total playtime in
the db matching <varname>TAG</varname> exactly.
</para>
<para>
The <parameter>group</parameter> keyword may be used to
group the results by a tag. The following prints
per-artist counts:
</para>
<programlisting>count group artist</programlisting>
</listitem>
</varlistentry>
<varlistentry id="command_find">
<term>
<cmdsynopsis>
@@ -1477,21 +1593,57 @@ OK
<arg choice="req"><replaceable>TYPE</replaceable></arg>
<arg choice="req"><replaceable>WHAT</replaceable></arg>
<arg choice="opt"><replaceable>...</replaceable></arg>
<arg choice="opt">window <replaceable>START</replaceable>:<replaceable>END</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Finds songs in the db that are exactly
<varname>WHAT</varname>. <varname>TYPE</varname> can
be any tag supported by MPD, or one of the three special
parameters<parameter>file</parameter> to search by
be any tag supported by <application>MPD</application>, or one of the special
parameters:
</para>
full path (relative to the music directory),
<parameter>in</parameter> to restrict the search to
songs in the given directory (also relative to the music
directory) and
<parameter>any</parameter> to match against all
available tags. <varname>WHAT</varname> is what to find.
<itemizedlist>
<listitem>
<para>
<parameter>any</parameter> checks all tag values
</para>
</listitem>
<listitem>
<para>
<parameter>file</parameter> checks the full path
(relative to the music directory)
</para>
</listitem>
<listitem>
<para>
<parameter>base</parameter> restricts the search to
songs in the given directory (also relative to the
music directory)
</para>
</listitem>
<listitem>
<para>
<parameter>modified-since</parameter> compares the
file's time stamp with the given value (ISO 8601 or
UNIX time stamp)
</para>
</listitem>
</itemizedlist>
<para>
<varname>WHAT</varname> is what to find.
</para>
<para>
<varname>window</varname> can be used to query only a
portion of the real response. The parameter is two
zero-based record numbers; a start number and an end
number.
</para>
</listitem>
</varlistentry>
@@ -1512,27 +1664,43 @@ OK
</para>
</listitem>
</varlistentry>
<varlistentry id="command_list">
<term>
<cmdsynopsis>
<command>list</command>
<arg choice="req"><replaceable>TYPE</replaceable></arg>
<arg><replaceable>ARTIST</replaceable></arg>
<arg choice="opt"><replaceable>FILTERTYPE</replaceable></arg>
<arg choice="opt"><replaceable>FILTERWHAT</replaceable></arg>
<arg choice="opt"><replaceable>...</replaceable></arg>
<arg choice="opt">group</arg>
<arg choice="opt"><replaceable>GROUPTYPE</replaceable></arg>
<arg choice="opt"><replaceable>...</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Lists all tags of the specified type.
<varname>TYPE</varname> can be any tag supported by MPD or
Lists unique tags values of the specified type.
<varname>TYPE</varname> can be any tag supported by
<application>MPD</application> or
<parameter>file</parameter>.
</para>
<para>
<varname>ARTIST</varname> is an optional parameter when
type is album, this specifies to list albums by an
artist.
Additional arguments may specify a filter like the one
in the <link
linkend="command_find"><command>find</command>
command</link>.
</para>
<para>
The <parameter>group</parameter> keyword may be used
(repeatedly) to group the results by one or more tags.
The following example lists all album names,
grouped by their respective (album) artist:
</para>
<programlisting>list album group albumartist</programlisting>
</listitem>
</varlistentry>
<varlistentry id="command_listall">
<term>
<cmdsynopsis>
@@ -1545,6 +1713,14 @@ OK
Lists all songs and directories in
<varname>URI</varname>.
</para>
<para>
Do not use this command. Do not manage a client-side
copy of <application>MPD</application>'s database. That
is fragile and adds huge overhead. It will break with
large databases. Instead, query
<application>MPD</application> whenever you need
something.
</para>
</listitem>
</varlistentry>
<varlistentry id="command_listallinfo">
@@ -1560,6 +1736,40 @@ OK
returns metadata info in the same format as
<command>lsinfo</command>.
</para>
<para>
Do not use this command. Do not manage a client-side
copy of <application>MPD</application>'s database. That
is fragile and adds huge overhead. It will break with
large databases. Instead, query
<application>MPD</application> whenever you need
something.
</para>
</listitem>
</varlistentry>
<varlistentry id="command_listfiles">
<term>
<cmdsynopsis>
<command>listfiles</command>
<arg><replaceable>URI</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Lists the contents of the directory
<varname>URI</varname>, including files are not
recognized by <application>MPD</application>.
<varname>URI</varname> can be a path relative to the
music directory or an URI understood by one of the
storage plugins. The response contains at least one
line for each directory entry with the prefix "file: "
or "directory: ", and may be followed by file attributes
such as "Last-Modified" and "size".
</para>
<para>
For example, "smb://SERVER" returns a list of all shares
on the given SMB/CIFS server; "nfs://servername/path"
obtains a directory listing from the NFS server.
</para>
</listitem>
</varlistentry>
<varlistentry id="command_lsinfo">
@@ -1579,10 +1789,14 @@ OK
the list of stored playlists. This behavior is
deprecated; use "listplaylists" instead.
</para>
<para>
This command may be used to list metadata of remote
files (e.g. URI beginning with "http://" or "smb://").
</para>
<para>
Clients that are connected via UNIX domain socket may
use this command to read the tags of an arbitrary local
file (URI beginning with "file:///").
file (URI is an absolute path).
</para>
</listitem>
</varlistentry>
@@ -1597,8 +1811,11 @@ OK
<para>
Read "comments" (i.e. key-value pairs) from the file
specified by "URI". This "URI" can be a path relative
to the music directory or a URL in the form
"file:///foo/bar.ogg".
to the music directory or an absolute path.
</para>
<para>
This command may be used to list metadata of remote
files (e.g. URI beginning with "http://" or "smb://").
</para>
<para>
The response consists of lines in the form "KEY: VALUE".
@@ -1619,6 +1836,7 @@ OK
<arg choice="req"><replaceable>TYPE</replaceable></arg>
<arg choice="req"><replaceable>WHAT</replaceable></arg>
<arg choice="opt"><replaceable>...</replaceable></arg>
<arg choice="opt">window <replaceable>START</replaceable>:<replaceable>END</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
@@ -1717,22 +1935,131 @@ OK
</variablelist>
</section>
<section>
<section id="mount">
<title>Mounts and neighbors</title>
<para>
A "storage" provides access to files in a directory tree. The
most basic storage plugin is the "local" storage plugin which
accesses the local file system, and there are plugins to
access NFS and SMB servers.
</para>
<para>
Multiple storages can be "mounted" together, similar to the
<application>mount</application> command on many operating
systems, but without cooperation from the kernel. No
superuser privileges are necessary, beause this mapping exists
only inside the <application>MPD</application> process
</para>
<variablelist>
<varlistentry id="command_mount">
<term>
<cmdsynopsis>
<command>mount</command>
<arg choice="req"><replaceable>PATH</replaceable></arg>
<arg choice="req"><replaceable>URI</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Mount the specified remote storage URI at the given
path. Example:
</para>
<programlisting>mount foo nfs://192.168.1.4/export/mp3</programlisting>
</listitem>
</varlistentry>
<varlistentry id="command_umount">
<term>
<cmdsynopsis>
<command>unmount</command>
<arg choice="req"><replaceable>PATH</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Unmounts the specified path. Example:
</para>
<programlisting>unmount foo</programlisting>
</listitem>
</varlistentry>
<varlistentry id="command_listmounts">
<term>
<cmdsynopsis>
<command>listmounts</command>
</cmdsynopsis>
</term>
<listitem>
<para>
Queries a list of all mounts. By default, this contains
just the configured <varname>music_directory</varname>.
Example:
</para>
<programlisting>listmounts
mount:
storage: /home/foo/music
mount: foo
storage: nfs://192.168.1.4/export/mp3
OK
</programlisting>
</listitem>
</varlistentry>
<varlistentry id="command_listneighbors">
<term>
<cmdsynopsis>
<command>listneighbors</command>
</cmdsynopsis>
</term>
<listitem>
<para>
Queries a list of "neighbors" (e.g. accessible file
servers on the local net). Items on that list may be
used with the <link
linkend="command_mount"><command>mount</command></link>
command. Example:
</para>
<programlisting>listneighbors
neighbor: smb://FOO
name: FOO (Samba 4.1.11-Debian)
OK
</programlisting>
</listitem>
</varlistentry>
</variablelist>
</section>
<section id="stickers">
<title>Stickers</title>
<para>
"Stickers"<footnoteref linkend="since_0_15"/> are pieces of
information attached to existing MPD objects (e.g. song files,
information attached to existing
<application>MPD</application> objects (e.g. song files,
directories, albums). Clients can create arbitrary name/value
pairs. MPD itself does not assume any special meaning in
them.
pairs. <application>MPD</application> itself does not assume
any special meaning in them.
</para>
<para>
The goal is to allow clients to share additional (possibly
dynamic) information about songs, which is neither stored on
the client (not available to other clients), nor stored in the
song files (MPD has no write access).
song files (<application>MPD</application> has no write
access).
</para>
<para>
@@ -1834,10 +2161,34 @@ OK
</para>
</listitem>
</varlistentry>
<varlistentry id="command_sticker_find_equals">
<term>
<cmdsynopsis>
<command>sticker</command>
<arg choice="plain">find</arg>
<arg choice="req"><replaceable>TYPE</replaceable></arg>
<arg choice="req"><replaceable>URI</replaceable></arg>
<arg choice="req"><replaceable>NAME</replaceable></arg>
<arg choice="plain">=</arg>
<arg choice="req"><replaceable>VALUE</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Searches for stickers with the given value.
</para>
<para>
Other supported operators are:
"<function>&lt;</function>", "<function>&gt;</function>"
</para>
</listitem>
</varlistentry>
</variablelist>
</section>
<section>
<section id="connection_commands">
<title>Connection settings</title>
<variablelist>
@@ -1849,7 +2200,8 @@ OK
</term>
<listitem>
<para>
Closes the connection to MPD. MPD will try to send the
Closes the connection to <application>MPD</application>.
<application>MPD</application> will try to send the
remaining output buffer before it actually closes the
connection, but that cannot be guaranteed. This command
will not generate a response.
@@ -1864,7 +2216,7 @@ OK
</term>
<listitem>
<para>
Kills MPD.
Kills <application>MPD</application>.
</para>
</listitem>
</varlistentry>
@@ -1898,7 +2250,7 @@ OK
</variablelist>
</section>
<section>
<section id="output_commands">
<title>Audio output devices</title>
<variablelist>
@@ -1952,12 +2304,38 @@ OK
<para>
Shows information about all outputs.
</para>
<screen>
outputid: 0
outputname: My ALSA Device
outputenabled: 0
OK
</screen>
<para>
Return information:
</para>
<itemizedlist>
<listitem>
<para>
<varname>outputid</varname>: ID of the output. May change between executions
</para>
</listitem>
<listitem>
<para>
<varname>outputname</varname>: Name of the output. It can be any.
</para>
</listitem>
<listitem>
<para>
<varname>outputenabled</varname>: Status of the output. 0 if disabled, 1 if enabled.
</para>
</listitem>
</itemizedlist>
</listitem>
</varlistentry>
</variablelist>
</section>
<section>
<section id="reflection_commands">
<title>Reflection</title>
<variablelist>
@@ -2073,7 +2451,7 @@ suffix: mpc</programlisting>
</variablelist>
</section>
<section>
<section id="client_to_client">
<title>Client to client</title>
<para>

File diff suppressed because it is too large Load Diff

View File

@@ -4,7 +4,7 @@
#
# SYNOPSIS
#
# AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS])
# AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS], [INPUT])
#
# DESCRIPTION
#
@@ -20,6 +20,8 @@
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
# force the compiler to issue an error when a bad flag is given.
#
# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
#
# NOTE: This macro depends on the AX_APPEND_FLAG and
# AX_CHECK_COMPILE_FLAG. Please keep this macro in sync with
# AX_APPEND_LINK_FLAGS.
@@ -54,10 +56,12 @@
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
#serial 2
#serial 5
AC_DEFUN([AX_APPEND_COMPILE_FLAGS],
[for flag in $1; do
AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3])
[AX_REQUIRE_DEFINED([AX_CHECK_COMPILE_FLAG])
AX_REQUIRE_DEFINED([AX_APPEND_FLAG])
for flag in $1; do
AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3], [$4])
done
])dnl AX_APPEND_COMPILE_FLAGS

View File

@@ -49,21 +49,23 @@
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
#serial 2
#serial 6
AC_DEFUN([AX_APPEND_FLAG],
[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX
AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])dnl
AS_VAR_SET_IF(FLAGS,
[case " AS_VAR_GET(FLAGS) " in
*" $1 "*)
AC_RUN_LOG([: FLAGS already contains $1])
;;
*)
AC_RUN_LOG([: FLAGS="$FLAGS $1"])
AS_VAR_SET(FLAGS, ["AS_VAR_GET(FLAGS) $1"])
;;
esac],
[AS_VAR_SET(FLAGS,["$1"])])
[dnl
AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF
AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])
AS_VAR_SET_IF(FLAGS,[
AS_CASE([" AS_VAR_GET(FLAGS) "],
[*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])],
[
AS_VAR_APPEND(FLAGS,[" $1"])
AC_RUN_LOG([: FLAGS="$FLAGS"])
])
],
[
AS_VAR_SET(FLAGS,[$1])
AC_RUN_LOG([: FLAGS="$FLAGS"])
])
AS_VAR_POPDEF([FLAGS])dnl
])dnl AX_APPEND_FLAG

View File

@@ -4,7 +4,7 @@
#
# SYNOPSIS
#
# AX_APPEND_LINK_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS])
# AX_APPEND_LINK_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS], [INPUT])
#
# DESCRIPTION
#
@@ -19,6 +19,8 @@
# EXTRA-FLAGS FLAG". This can for example be used to force the linker to
# issue an error when a bad flag is given.
#
# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
#
# NOTE: This macro depends on the AX_APPEND_FLAG and AX_CHECK_LINK_FLAG.
# Please keep this macro in sync with AX_APPEND_COMPILE_FLAGS.
#
@@ -52,10 +54,12 @@
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
#serial 2
#serial 5
AC_DEFUN([AX_APPEND_LINK_FLAGS],
[for flag in $1; do
AX_CHECK_LINK_FLAG([$flag], [AX_APPEND_FLAG([$flag], [m4_default([$2], [LDFLAGS])])], [], [$3])
[AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG])
AX_REQUIRE_DEFINED([AX_APPEND_FLAG])
for flag in $1; do
AX_CHECK_LINK_FLAG([$flag], [AX_APPEND_FLAG([$flag], [m4_default([$2], [LDFLAGS])])], [], [$3], [$4])
done
])dnl AX_APPEND_LINK_FLAGS

285
m4/ax_boost_base.m4 Normal file
View File

@@ -0,0 +1,285 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_boost_base.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_BOOST_BASE([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
#
# DESCRIPTION
#
# Test for the Boost C++ libraries of a particular version (or newer)
#
# If no path to the installed boost library is given the macro searchs
# under /usr, /usr/local, /opt and /opt/local and evaluates the
# $BOOST_ROOT environment variable. Further documentation is available at
# <http://randspringer.de/boost/index.html>.
#
# This macro calls:
#
# AC_SUBST(BOOST_CPPFLAGS) / AC_SUBST(BOOST_LDFLAGS)
#
# And sets:
#
# HAVE_BOOST
#
# LICENSE
#
# Copyright (c) 2008 Thomas Porschberg <thomas@randspringer.de>
# Copyright (c) 2009 Peter Adolphs
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#serial 27
AC_DEFUN([AX_BOOST_BASE],
[
AC_ARG_WITH([boost],
[AS_HELP_STRING([--with-boost@<:@=ARG@:>@],
[use Boost library from a standard location (ARG=yes),
from the specified location (ARG=<path>),
or disable it (ARG=no)
@<:@ARG=yes@:>@ ])],
[
if test "$withval" = "no"; then
want_boost="no"
elif test "$withval" = "yes"; then
want_boost="yes"
ac_boost_path=""
else
want_boost="yes"
ac_boost_path="$withval"
fi
],
[want_boost="yes"])
AC_ARG_WITH([boost-libdir],
AS_HELP_STRING([--with-boost-libdir=LIB_DIR],
[Force given directory for boost libraries. Note that this will override library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located.]),
[
if test -d "$withval"
then
ac_boost_lib_path="$withval"
else
AC_MSG_ERROR(--with-boost-libdir expected directory name)
fi
],
[ac_boost_lib_path=""]
)
if test "x$want_boost" = "xyes"; then
boost_lib_version_req=ifelse([$1], ,1.20.0,$1)
boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([[0-9]]*\.[[0-9]]*\)'`
boost_lib_version_req_major=`expr $boost_lib_version_req : '\([[0-9]]*\)'`
boost_lib_version_req_minor=`expr $boost_lib_version_req : '[[0-9]]*\.\([[0-9]]*\)'`
boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'`
if test "x$boost_lib_version_req_sub_minor" = "x" ; then
boost_lib_version_req_sub_minor="0"
fi
WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor`
AC_MSG_CHECKING(for boostlib >= $boost_lib_version_req)
succeeded=no
dnl On 64-bit systems check for system libraries in both lib64 and lib.
dnl The former is specified by FHS, but e.g. Debian does not adhere to
dnl this (as it rises problems for generic multi-arch support).
dnl The last entry in the list is chosen by default when no libraries
dnl are found, e.g. when only header-only libraries are installed!
libsubdirs="lib"
ax_arch=`uname -m`
case $ax_arch in
x86_64)
libsubdirs="lib64 libx32 lib lib64"
;;
ppc64|s390x|sparc64|aarch64|ppc64le)
libsubdirs="lib64 lib lib64"
;;
esac
dnl allow for real multi-arch paths e.g. /usr/lib/x86_64-linux-gnu. Give
dnl them priority over the other paths since, if libs are found there, they
dnl are almost assuredly the ones desired.
AC_REQUIRE([AC_CANONICAL_HOST])
libsubdirs="lib/${host_cpu}-${host_os} $libsubdirs"
case ${host_cpu} in
i?86)
libsubdirs="lib/i386-${host_os} $libsubdirs"
;;
esac
dnl first we check the system location for boost libraries
dnl this location ist chosen if boost libraries are installed with the --layout=system option
dnl or if you install boost with RPM
if test "$ac_boost_path" != ""; then
BOOST_CPPFLAGS="-I$ac_boost_path/include"
for ac_boost_path_tmp in $libsubdirs; do
if test -d "$ac_boost_path"/"$ac_boost_path_tmp" ; then
BOOST_LDFLAGS="-L$ac_boost_path/$ac_boost_path_tmp"
break
fi
done
elif test "$cross_compiling" != yes; then
for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then
for libsubdir in $libsubdirs ; do
if ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
done
BOOST_LDFLAGS="-L$ac_boost_path_tmp/$libsubdir"
BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include"
break;
fi
done
fi
dnl overwrite ld flags if we have required special directory with
dnl --with-boost-libdir parameter
if test "$ac_boost_lib_path" != ""; then
BOOST_LDFLAGS="-L$ac_boost_lib_path"
fi
CPPFLAGS_SAVED="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
export CPPFLAGS
LDFLAGS_SAVED="$LDFLAGS"
LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
export LDFLAGS
AC_REQUIRE([AC_PROG_CXX])
AC_LANG_PUSH(C++)
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
@%:@include <boost/version.hpp>
]], [[
#if BOOST_VERSION >= $WANT_BOOST_VERSION
// Everything is okay
#else
# error Boost version is too old
#endif
]])],[
AC_MSG_RESULT(yes)
succeeded=yes
found_system=yes
],[
])
AC_LANG_POP([C++])
dnl if we found no boost with system layout we search for boost libraries
dnl built and installed without the --layout=system option or for a staged(not installed) version
if test "x$succeeded" != "xyes"; then
CPPFLAGS="$CPPFLAGS_SAVED"
LDFLAGS="$LDFLAGS_SAVED"
BOOST_CPPFLAGS=
BOOST_LDFLAGS=
_version=0
if test "$ac_boost_path" != ""; then
if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
_version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
V_CHECK=`expr $_version_tmp \> $_version`
if test "$V_CHECK" = "1" ; then
_version=$_version_tmp
fi
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE"
done
dnl if nothing found search for layout used in Windows distributions
if test -z "$BOOST_CPPFLAGS"; then
if test -d "$ac_boost_path/boost" && test -r "$ac_boost_path/boost"; then
BOOST_CPPFLAGS="-I$ac_boost_path"
fi
fi
fi
else
if test "$cross_compiling" != yes; then
for ac_boost_path in /usr /usr/local /opt /opt/local ; do
if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
_version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
V_CHECK=`expr $_version_tmp \> $_version`
if test "$V_CHECK" = "1" ; then
_version=$_version_tmp
best_path=$ac_boost_path
fi
done
fi
done
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE"
if test "$ac_boost_lib_path" = ""; then
for libsubdir in $libsubdirs ; do
if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
done
BOOST_LDFLAGS="-L$best_path/$libsubdir"
fi
fi
if test "x$BOOST_ROOT" != "x"; then
for libsubdir in $libsubdirs ; do
if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
done
if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then
version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'`
stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'`
stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'`
V_CHECK=`expr $stage_version_shorten \>\= $_version`
if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then
AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT)
BOOST_CPPFLAGS="-I$BOOST_ROOT"
BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir"
fi
fi
fi
fi
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
export CPPFLAGS
LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
export LDFLAGS
AC_LANG_PUSH(C++)
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
@%:@include <boost/version.hpp>
]], [[
#if BOOST_VERSION >= $WANT_BOOST_VERSION
// Everything is okay
#else
# error Boost version is too old
#endif
]])],[
AC_MSG_RESULT(yes)
succeeded=yes
found_system=yes
],[
])
AC_LANG_POP([C++])
fi
if test "$succeeded" != "yes" ; then
if test "$_version" = "0" ; then
AC_MSG_NOTICE([[We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in <boost/version.hpp>. See http://randspringer.de/boost for more documentation.]])
else
AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).])
fi
# execute ACTION-IF-NOT-FOUND (if present):
ifelse([$3], , :, [$3])
else
AC_SUBST(BOOST_CPPFLAGS)
AC_SUBST(BOOST_LDFLAGS)
AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available])
# execute ACTION-IF-FOUND (if present):
ifelse([$2], , :, [$2])
fi
CPPFLAGS="$CPPFLAGS_SAVED"
LDFLAGS="$LDFLAGS_SAVED"
fi
])

View File

@@ -4,7 +4,7 @@
#
# SYNOPSIS
#
# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS])
# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
#
# DESCRIPTION
#
@@ -19,6 +19,8 @@
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
# force the compiler to issue an error when a bad flag is given.
#
# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
#
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
#
@@ -53,19 +55,19 @@
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
#serial 2
#serial 4
AC_DEFUN([AX_CHECK_COMPILE_FLAG],
[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
_AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
[AS_VAR_SET(CACHEVAR,[yes])],
[AS_VAR_SET(CACHEVAR,[no])])
_AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes],
AS_VAR_IF(CACHEVAR,yes,
[m4_default([$2], :)],
[m4_default([$3], :)])
AS_VAR_POPDEF([CACHEVAR])dnl

View File

@@ -4,7 +4,7 @@
#
# SYNOPSIS
#
# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS])
# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
#
# DESCRIPTION
#
@@ -19,6 +19,8 @@
# EXTRA-FLAGS FLAG". This can for example be used to force the linker to
# issue an error when a bad flag is given.
#
# INPUT gives an alternative input source to AC_LINK_IFELSE.
#
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
# macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG.
#
@@ -53,18 +55,19 @@
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
#serial 2
#serial 4
AC_DEFUN([AX_CHECK_LINK_FLAG],
[AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl
AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [
ax_check_save_flags=$LDFLAGS
LDFLAGS="$LDFLAGS $4 $1"
AC_LINK_IFELSE([AC_LANG_PROGRAM()],
AC_LINK_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
[AS_VAR_SET(CACHEVAR,[yes])],
[AS_VAR_SET(CACHEVAR,[no])])
LDFLAGS=$ax_check_save_flags])
AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes],
AS_VAR_IF(CACHEVAR,yes,
[m4_default([$2], :)],
[m4_default([$3], :)])
AS_VAR_POPDEF([CACHEVAR])dnl

564
m4/ax_cxx_compile_stdcxx.m4 Normal file
View File

@@ -0,0 +1,564 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional])
#
# DESCRIPTION
#
# Check for baseline language coverage in the compiler for the specified
# version of the C++ standard. If necessary, add switches to CXX and
# CXXCPP to enable support. VERSION may be '11' (for the C++11 standard)
# or '14' (for the C++14 standard).
#
# The second argument, if specified, indicates whether you insist on an
# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
# -std=c++11). If neither is specified, you get whatever works, with
# preference for an extended mode.
#
# The third argument, if specified 'mandatory' or if left unspecified,
# indicates that baseline support for the specified C++ standard is
# required and that the macro should error out if no mode with that
# support is found. If specified 'optional', then configuration proceeds
# regardless, after defining HAVE_CXX${VERSION} if and only if a
# supporting mode is found.
#
# LICENSE
#
# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
# Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
# Copyright (c) 2015 Paul Norman <penorman@mac.com>
# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#serial 4
dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro
dnl (serial version number 13).
AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
m4_if([$1], [11], [],
[$1], [14], [],
[$1], [17], [m4_fatal([support for C++17 not yet implemented in AX_CXX_COMPILE_STDCXX])],
[m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl
m4_if([$2], [], [],
[$2], [ext], [],
[$2], [noext], [],
[m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl
m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true],
[$3], [mandatory], [ax_cxx_compile_cxx$1_required=true],
[$3], [optional], [ax_cxx_compile_cxx$1_required=false],
[m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])])
AC_LANG_PUSH([C++])dnl
ac_success=no
AC_CACHE_CHECK(whether $CXX supports C++$1 features by default,
ax_cv_cxx_compile_cxx$1,
[AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
[ax_cv_cxx_compile_cxx$1=yes],
[ax_cv_cxx_compile_cxx$1=no])])
if test x$ax_cv_cxx_compile_cxx$1 = xyes; then
ac_success=yes
fi
m4_if([$2], [noext], [], [dnl
if test x$ac_success = xno; then
for switch in -std=gnu++$1 -std=gnu++0x; do
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
$cachevar,
[ac_save_CXX="$CXX"
CXX="$CXX $switch"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
[eval $cachevar=yes],
[eval $cachevar=no])
CXX="$ac_save_CXX"])
if eval test x\$$cachevar = xyes; then
CXX="$CXX $switch"
if test -n "$CXXCPP" ; then
CXXCPP="$CXXCPP $switch"
fi
ac_success=yes
break
fi
done
fi])
m4_if([$2], [ext], [], [dnl
if test x$ac_success = xno; then
dnl HP's aCC needs +std=c++11 according to:
dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf
dnl Cray's crayCC needs "-h std=c++11"
for switch in -std=c++$1 -std=c++0x +std=c++$1 "-h std=c++$1"; do
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
$cachevar,
[ac_save_CXX="$CXX"
CXX="$CXX $switch"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
[eval $cachevar=yes],
[eval $cachevar=no])
CXX="$ac_save_CXX"])
if eval test x\$$cachevar = xyes; then
CXX="$CXX $switch"
if test -n "$CXXCPP" ; then
CXXCPP="$CXXCPP $switch"
fi
ac_success=yes
break
fi
done
fi])
AC_LANG_POP([C++])
if test x$ax_cxx_compile_cxx$1_required = xtrue; then
if test x$ac_success = xno; then
AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.])
fi
fi
if test x$ac_success = xno; then
HAVE_CXX$1=0
AC_MSG_NOTICE([No compiler with C++$1 support was found])
else
HAVE_CXX$1=1
AC_DEFINE(HAVE_CXX$1,1,
[define if the compiler supports basic C++$1 syntax])
fi
AC_SUBST(HAVE_CXX$1)
])
dnl Test body for checking C++11 support
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11],
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11
)
dnl Test body for checking C++14 support
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14],
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11
_AX_CXX_COMPILE_STDCXX_testbody_new_in_14
)
dnl Tests for new features in C++11
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[
// If the compiler admits that it is not ready for C++11, why torture it?
// Hopefully, this will speed up the test.
#ifndef __cplusplus
#error "This is not a C++ compiler"
#elif __cplusplus < 201103L
#error "This is not a C++11 compiler"
#else
namespace cxx11
{
namespace test_static_assert
{
template <typename T>
struct check
{
static_assert(sizeof(int) <= sizeof(T), "not big enough");
};
}
namespace test_final_override
{
struct Base
{
virtual void f() {}
};
struct Derived : public Base
{
virtual void f() override {}
};
}
namespace test_double_right_angle_brackets
{
template < typename T >
struct check {};
typedef check<void> single_type;
typedef check<check<void>> double_type;
typedef check<check<check<void>>> triple_type;
typedef check<check<check<check<void>>>> quadruple_type;
}
namespace test_decltype
{
int
f()
{
int a = 1;
decltype(a) b = 2;
return a + b;
}
}
namespace test_type_deduction
{
template < typename T1, typename T2 >
struct is_same
{
static const bool value = false;
};
template < typename T >
struct is_same<T, T>
{
static const bool value = true;
};
template < typename T1, typename T2 >
auto
add(T1 a1, T2 a2) -> decltype(a1 + a2)
{
return a1 + a2;
}
int
test(const int c, volatile int v)
{
static_assert(is_same<int, decltype(0)>::value == true, "");
static_assert(is_same<int, decltype(c)>::value == false, "");
static_assert(is_same<int, decltype(v)>::value == false, "");
auto ac = c;
auto av = v;
auto sumi = ac + av + 'x';
auto sumf = ac + av + 1.0;
static_assert(is_same<int, decltype(ac)>::value == true, "");
static_assert(is_same<int, decltype(av)>::value == true, "");
static_assert(is_same<int, decltype(sumi)>::value == true, "");
static_assert(is_same<int, decltype(sumf)>::value == false, "");
static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
return (sumf > 0.0) ? sumi : add(c, v);
}
}
namespace test_noexcept
{
int f() { return 0; }
int g() noexcept { return 0; }
static_assert(noexcept(f()) == false, "");
static_assert(noexcept(g()) == true, "");
}
namespace test_constexpr
{
template < typename CharT >
unsigned long constexpr
strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
{
return *s ? strlen_c_r(s + 1, acc + 1) : acc;
}
template < typename CharT >
unsigned long constexpr
strlen_c(const CharT *const s) noexcept
{
return strlen_c_r(s, 0UL);
}
static_assert(strlen_c("") == 0UL, "");
static_assert(strlen_c("1") == 1UL, "");
static_assert(strlen_c("example") == 7UL, "");
static_assert(strlen_c("another\0example") == 7UL, "");
}
namespace test_rvalue_references
{
template < int N >
struct answer
{
static constexpr int value = N;
};
answer<1> f(int&) { return answer<1>(); }
answer<2> f(const int&) { return answer<2>(); }
answer<3> f(int&&) { return answer<3>(); }
void
test()
{
int i = 0;
const int c = 0;
static_assert(decltype(f(i))::value == 1, "");
static_assert(decltype(f(c))::value == 2, "");
static_assert(decltype(f(0))::value == 3, "");
}
}
namespace test_uniform_initialization
{
struct test
{
static const int zero {};
static const int one {1};
};
static_assert(test::zero == 0, "");
static_assert(test::one == 1, "");
}
namespace test_lambdas
{
void
test1()
{
auto lambda1 = [](){};
auto lambda2 = lambda1;
lambda1();
lambda2();
}
int
test2()
{
auto a = [](int i, int j){ return i + j; }(1, 2);
auto b = []() -> int { return '0'; }();
auto c = [=](){ return a + b; }();
auto d = [&](){ return c; }();
auto e = [a, &b](int x) mutable {
const auto identity = [](int y){ return y; };
for (auto i = 0; i < a; ++i)
a += b--;
return x + identity(a + b);
}(0);
return a + b + c + d + e;
}
int
test3()
{
const auto nullary = [](){ return 0; };
const auto unary = [](int x){ return x; };
using nullary_t = decltype(nullary);
using unary_t = decltype(unary);
const auto higher1st = [](nullary_t f){ return f(); };
const auto higher2nd = [unary](nullary_t f1){
return [unary, f1](unary_t f2){ return f2(unary(f1())); };
};
return higher1st(nullary) + higher2nd(nullary)(unary);
}
}
namespace test_variadic_templates
{
template <int...>
struct sum;
template <int N0, int... N1toN>
struct sum<N0, N1toN...>
{
static constexpr auto value = N0 + sum<N1toN...>::value;
};
template <>
struct sum<>
{
static constexpr auto value = 0;
};
static_assert(sum<>::value == 0, "");
static_assert(sum<1>::value == 1, "");
static_assert(sum<23>::value == 23, "");
static_assert(sum<1, 2>::value == 3, "");
static_assert(sum<5, 5, 11>::value == 21, "");
static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
}
// http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
// Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
// because of this.
namespace test_template_alias_sfinae
{
struct foo {};
template<typename T>
using member = typename T::member_type;
template<typename T>
void func(...) {}
template<typename T>
void func(member<T>*) {}
void test();
void test() { func<foo>(0); }
}
} // namespace cxx11
#endif // __cplusplus >= 201103L
]])
dnl Tests for new features in C++14
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[
// If the compiler admits that it is not ready for C++14, why torture it?
// Hopefully, this will speed up the test.
#ifndef __cplusplus
#error "This is not a C++ compiler"
#elif __cplusplus < 201300L
#error "This is not a C++14 compiler"
#else
namespace cxx14
{
namespace test_polymorphic_lambdas
{
int
test()
{
const auto lambda = [](auto&&... args){
const auto istiny = [](auto x){
return (sizeof(x) == 1UL) ? 1 : 0;
};
const int aretiny[] = { istiny(args)... };
return aretiny[0];
};
return lambda(1, 1L, 1.0f, '1');
}
}
namespace test_binary_literals
{
constexpr auto ivii = 0b0000000000101010;
static_assert(ivii == 42, "wrong value");
}
#ifdef DISALLOW_GCC48
namespace test_generalized_constexpr
{
template < typename CharT >
constexpr unsigned long
strlen_c(const CharT *const s) noexcept
{
auto length = 0UL;
for (auto p = s; *p; ++p)
++length;
return length;
}
static_assert(strlen_c("") == 0UL, "");
static_assert(strlen_c("x") == 1UL, "");
static_assert(strlen_c("test") == 4UL, "");
static_assert(strlen_c("another\0test") == 7UL, "");
}
#endif
namespace test_lambda_init_capture
{
int
test()
{
auto x = 0;
const auto lambda1 = [a = x](int b){ return a + b; };
const auto lambda2 = [a = lambda1(x)](){ return a; };
return lambda2();
}
}
namespace test_digit_seperators
{
constexpr auto ten_million = 100'000'000;
static_assert(ten_million == 100000000, "");
}
namespace test_return_type_deduction
{
auto f(int& x) { return x; }
decltype(auto) g(int& x) { return x; }
template < typename T1, typename T2 >
struct is_same
{
static constexpr auto value = false;
};
template < typename T >
struct is_same<T, T>
{
static constexpr auto value = true;
};
int
test()
{
auto x = 0;
static_assert(is_same<int, decltype(f(x))>::value, "");
static_assert(is_same<int&, decltype(g(x))>::value, "");
return x;
}
}
} // namespace cxx14
#endif // __cplusplus >= 201402L
]])

View File

@@ -1,107 +0,0 @@
# ============================================================================
# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_0x.html
# ============================================================================
#
# SYNOPSIS
#
# AX_CXX_COMPILE_STDCXX_0X
#
# DESCRIPTION
#
# Check for baseline language coverage in the compiler for the C++0x
# standard.
#
# LICENSE
#
# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#serial 7
AU_ALIAS([AC_CXX_COMPILE_STDCXX_0X], [AX_CXX_COMPILE_STDCXX_0X])
AC_DEFUN([AX_CXX_COMPILE_STDCXX_0X], [
AC_CACHE_CHECK(if g++ supports C++0x features without additional flags,
ax_cv_cxx_compile_cxx0x_native,
[AC_LANG_SAVE
AC_LANG_CPLUSPLUS
AC_TRY_COMPILE([
template <typename T>
struct check
{
static_assert(sizeof(int) <= sizeof(T), "not big enough");
};
typedef check<check<bool>> right_angle_brackets;
int a;
decltype(a) b;
typedef check<int> check_type;
check_type c;
check_type&& cr = static_cast<check_type&&>(c);],,
ax_cv_cxx_compile_cxx0x_native=yes, ax_cv_cxx_compile_cxx0x_native=no)
AC_LANG_RESTORE
])
AC_CACHE_CHECK(if g++ supports C++0x features with -std=c++0x,
ax_cv_cxx_compile_cxx0x_cxx,
[AC_LANG_SAVE
AC_LANG_CPLUSPLUS
ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS -std=c++0x"
AC_TRY_COMPILE([
template <typename T>
struct check
{
static_assert(sizeof(int) <= sizeof(T), "not big enough");
};
typedef check<check<bool>> right_angle_brackets;
int a;
decltype(a) b;
typedef check<int> check_type;
check_type c;
check_type&& cr = static_cast<check_type&&>(c);],,
ax_cv_cxx_compile_cxx0x_cxx=yes, ax_cv_cxx_compile_cxx0x_cxx=no)
CXXFLAGS="$ac_save_CXXFLAGS"
AC_LANG_RESTORE
])
AC_CACHE_CHECK(if g++ supports C++0x features with -std=gnu++0x,
ax_cv_cxx_compile_cxx0x_gxx,
[AC_LANG_SAVE
AC_LANG_CPLUSPLUS
ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS -std=gnu++0x"
AC_TRY_COMPILE([
template <typename T>
struct check
{
static_assert(sizeof(int) <= sizeof(T), "not big enough");
};
typedef check<check<bool>> right_angle_brackets;
int a;
decltype(a) b;
typedef check<int> check_type;
check_type c;
check_type&& cr = static_cast<check_type&&>(c);],,
ax_cv_cxx_compile_cxx0x_gxx=yes, ax_cv_cxx_compile_cxx0x_gxx=no)
CXXFLAGS="$ac_save_CXXFLAGS"
AC_LANG_RESTORE
])
if test "$ax_cv_cxx_compile_cxx0x_native" = yes ||
test "$ax_cv_cxx_compile_cxx0x_cxx" = yes ||
test "$ax_cv_cxx_compile_cxx0x_gxx" = yes; then
AC_DEFINE(HAVE_STDCXX_0X,,[Define if g++ supports C++0x features. ])
fi
])

View File

@@ -0,0 +1,34 @@
# ============================================================================
# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_14.html
# ============================================================================
#
# SYNOPSIS
#
# AX_CXX_COMPILE_STDCXX_14([ext|noext], [mandatory|optional])
#
# DESCRIPTION
#
# Check for baseline language coverage in the compiler for the C++14
# standard; if necessary, add switches to CXX and CXXCPP to enable
# support.
#
# This macro is a convenience alias for calling the AX_CXX_COMPILE_STDCXX
# macro with the version set to C++14. The two optional arguments are
# forwarded literally as the second and third argument respectively.
# Please see the documentation for the AX_CXX_COMPILE_STDCXX macro for
# more information. If you want to use this macro, you also need to
# download the ax_cxx_compile_stdcxx.m4 file.
#
# LICENSE
#
# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#serial 4
AX_REQUIRE_DEFINED([AX_CXX_COMPILE_STDCXX])
AC_DEFUN([AX_CXX_COMPILE_STDCXX_14], [AX_CXX_COMPILE_STDCXX([14], [$1], [$2])])

485
m4/ax_pthread.m4 Normal file
View File

@@ -0,0 +1,485 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_pthread.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
#
# DESCRIPTION
#
# This macro figures out how to build C programs using POSIX threads. It
# sets the PTHREAD_LIBS output variable to the threads library and linker
# flags, and the PTHREAD_CFLAGS output variable to any special C compiler
# flags that are needed. (The user can also force certain compiler
# flags/libs to be tested by setting these environment variables.)
#
# Also sets PTHREAD_CC to any special C compiler that is needed for
# multi-threaded programs (defaults to the value of CC otherwise). (This
# is necessary on AIX to use the special cc_r compiler alias.)
#
# NOTE: You are assumed to not only compile your program with these flags,
# but also to link with them as well. For example, you might link with
# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
#
# If you are only building threaded programs, you may wish to use these
# variables in your default LIBS, CFLAGS, and CC:
#
# LIBS="$PTHREAD_LIBS $LIBS"
# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
# CC="$PTHREAD_CC"
#
# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to
# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
#
# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
# PTHREAD_PRIO_INHERIT symbol is defined when compiling with
# PTHREAD_CFLAGS.
#
# ACTION-IF-FOUND is a list of shell commands to run if a threads library
# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it
# is not found. If ACTION-IF-FOUND is not specified, the default action
# will define HAVE_PTHREAD.
#
# Please let the authors know if this macro fails on any platform, or if
# you have any other suggestions or comments. This macro was based on work
# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help
# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by
# Alejandro Forero Cuervo to the autoconf macro repository. We are also
# grateful for the helpful feedback of numerous users.
#
# Updated for Autoconf 2.68 by Daniel Richard G.
#
# LICENSE
#
# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
# Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.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 3 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, see <http://www.gnu.org/licenses/>.
#
# As a special exception, the respective Autoconf Macro's copyright owner
# gives unlimited permission to copy, distribute and modify the configure
# scripts that are the output of Autoconf when processing the Macro. You
# need not follow the terms of the GNU General Public License when using
# or distributing such scripts, even though portions of the text of the
# Macro appear in them. The GNU General Public License (GPL) does govern
# all other use of the material that constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the Autoconf
# Macro released by the Autoconf Archive. When you make and distribute a
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
#serial 23
AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
AC_DEFUN([AX_PTHREAD], [
AC_REQUIRE([AC_CANONICAL_HOST])
AC_REQUIRE([AC_PROG_CC])
AC_REQUIRE([AC_PROG_SED])
AC_LANG_PUSH([C])
ax_pthread_ok=no
# We used to check for pthread.h first, but this fails if pthread.h
# requires special compiler flags (e.g. on Tru64 or Sequent).
# It gets checked for in the link test anyway.
# First of all, check if the user has set any of the PTHREAD_LIBS,
# etcetera environment variables, and if threads linking works using
# them:
if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
ax_pthread_save_CC="$CC"
ax_pthread_save_CFLAGS="$CFLAGS"
ax_pthread_save_LIBS="$LIBS"
AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"])
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
LIBS="$PTHREAD_LIBS $LIBS"
AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS])
AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes])
AC_MSG_RESULT([$ax_pthread_ok])
if test "x$ax_pthread_ok" = "xno"; then
PTHREAD_LIBS=""
PTHREAD_CFLAGS=""
fi
CC="$ax_pthread_save_CC"
CFLAGS="$ax_pthread_save_CFLAGS"
LIBS="$ax_pthread_save_LIBS"
fi
# We must check for the threads library under a number of different
# names; the ordering is very important because some systems
# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
# libraries is broken (non-POSIX).
# Create a list of thread flags to try. Items starting with a "-" are
# C compiler flags, and other items are library names, except for "none"
# which indicates that we try without any flags at all, and "pthread-config"
# which is a program returning the flags for the Pth emulation library.
ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
# The ordering *is* (sometimes) important. Some notes on the
# individual items follow:
# pthreads: AIX (must check this before -lpthread)
# none: in case threads are in libc; should be tried before -Kthread and
# other compiler flags to prevent continual compiler warnings
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64
# (Note: HP C rejects this with "bad form for `-t' option")
# -pthreads: Solaris/gcc (Note: HP C also rejects)
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
# doesn't hurt to check since this sometimes defines pthreads and
# -D_REENTRANT too), HP C (must be checked before -lpthread, which
# is present but should not be used directly; and before -mthreads,
# because the compiler interprets this as "-mt" + "-hreads")
# -mthreads: Mingw32/gcc, Lynx/gcc
# pthread: Linux, etcetera
# --thread-safe: KAI C++
# pthread-config: use pthread-config program (for GNU Pth library)
case $host_os in
freebsd*)
# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
ax_pthread_flags="-kthread lthread $ax_pthread_flags"
;;
hpux*)
# From the cc(1) man page: "[-mt] Sets various -D flags to enable
# multi-threading and also sets -lpthread."
ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags"
;;
openedition*)
# IBM z/OS requires a feature-test macro to be defined in order to
# enable POSIX threads at all, so give the user a hint if this is
# not set. (We don't define these ourselves, as they can affect
# other portions of the system API in unpredictable ways.)
AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING],
[
# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS)
AX_PTHREAD_ZOS_MISSING
# endif
],
[AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])])
;;
solaris*)
# On Solaris (at least, for some versions), libc contains stubbed
# (non-functional) versions of the pthreads routines, so link-based
# tests will erroneously succeed. (N.B.: The stubs are missing
# pthread_cleanup_push, or rather a function called by this macro,
# so we could check for that, but who knows whether they'll stub
# that too in a future libc.) So we'll check first for the
# standard Solaris way of linking pthreads (-mt -lpthread).
ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags"
;;
esac
# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
AS_IF([test "x$GCC" = "xyes"],
[ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"])
# The presence of a feature test macro requesting re-entrant function
# definitions is, on some systems, a strong hint that pthreads support is
# correctly enabled
case $host_os in
darwin* | hpux* | linux* | osf* | solaris*)
ax_pthread_check_macro="_REENTRANT"
;;
aix*)
ax_pthread_check_macro="_THREAD_SAFE"
;;
*)
ax_pthread_check_macro="--"
;;
esac
AS_IF([test "x$ax_pthread_check_macro" = "x--"],
[ax_pthread_check_cond=0],
[ax_pthread_check_cond="!defined($ax_pthread_check_macro)"])
# Are we compiling with Clang?
AC_CACHE_CHECK([whether $CC is Clang],
[ax_cv_PTHREAD_CLANG],
[ax_cv_PTHREAD_CLANG=no
# Note that Autoconf sets GCC=yes for Clang as well as GCC
if test "x$GCC" = "xyes"; then
AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG],
[/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
# if defined(__clang__) && defined(__llvm__)
AX_PTHREAD_CC_IS_CLANG
# endif
],
[ax_cv_PTHREAD_CLANG=yes])
fi
])
ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
ax_pthread_clang_warning=no
# Clang needs special handling, because older versions handle the -pthread
# option in a rather... idiosyncratic way
if test "x$ax_pthread_clang" = "xyes"; then
# Clang takes -pthread; it has never supported any other flag
# (Note 1: This will need to be revisited if a system that Clang
# supports has POSIX threads in a separate library. This tends not
# to be the way of modern systems, but it's conceivable.)
# (Note 2: On some systems, notably Darwin, -pthread is not needed
# to get POSIX threads support; the API is always present and
# active. We could reasonably leave PTHREAD_CFLAGS empty. But
# -pthread does define _REENTRANT, and while the Darwin headers
# ignore this macro, third-party headers might not.)
PTHREAD_CFLAGS="-pthread"
PTHREAD_LIBS=
ax_pthread_ok=yes
# However, older versions of Clang make a point of warning the user
# that, in an invocation where only linking and no compilation is
# taking place, the -pthread option has no effect ("argument unused
# during compilation"). They expect -pthread to be passed in only
# when source code is being compiled.
#
# Problem is, this is at odds with the way Automake and most other
# C build frameworks function, which is that the same flags used in
# compilation (CFLAGS) are also used in linking. Many systems
# supported by AX_PTHREAD require exactly this for POSIX threads
# support, and in fact it is often not straightforward to specify a
# flag that is used only in the compilation phase and not in
# linking. Such a scenario is extremely rare in practice.
#
# Even though use of the -pthread flag in linking would only print
# a warning, this can be a nuisance for well-run software projects
# that build with -Werror. So if the active version of Clang has
# this misfeature, we search for an option to squash it.
AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread],
[ax_cv_PTHREAD_CLANG_NO_WARN_FLAG],
[ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
# Create an alternate version of $ac_link that compiles and
# links in two steps (.c -> .o, .o -> exe) instead of one
# (.c -> exe), because the warning occurs only in the second
# step
ax_pthread_save_ac_link="$ac_link"
ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"`
ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
ax_pthread_save_CFLAGS="$CFLAGS"
for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
AS_IF([test "x$ax_pthread_try" = "xunknown"], [break])
CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS"
ac_link="$ax_pthread_save_ac_link"
AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
[ac_link="$ax_pthread_2step_ac_link"
AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
[break])
])
done
ac_link="$ax_pthread_save_ac_link"
CFLAGS="$ax_pthread_save_CFLAGS"
AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no])
ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
])
case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in
no | unknown) ;;
*) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;;
esac
fi # $ax_pthread_clang = yes
if test "x$ax_pthread_ok" = "xno"; then
for ax_pthread_try_flag in $ax_pthread_flags; do
case $ax_pthread_try_flag in
none)
AC_MSG_CHECKING([whether pthreads work without any flags])
;;
-mt,pthread)
AC_MSG_CHECKING([whether pthreads work with -mt -lpthread])
PTHREAD_CFLAGS="-mt"
PTHREAD_LIBS="-lpthread"
;;
-*)
AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag])
PTHREAD_CFLAGS="$ax_pthread_try_flag"
;;
pthread-config)
AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])
AS_IF([test "x$ax_pthread_config" = "xno"], [continue])
PTHREAD_CFLAGS="`pthread-config --cflags`"
PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
;;
*)
AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag])
PTHREAD_LIBS="-l$ax_pthread_try_flag"
;;
esac
ax_pthread_save_CFLAGS="$CFLAGS"
ax_pthread_save_LIBS="$LIBS"
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
LIBS="$PTHREAD_LIBS $LIBS"
# Check for various functions. We must include pthread.h,
# since some functions may be macros. (On the Sequent, we
# need a special flag -Kthread to make this header compile.)
# We check for pthread_join because it is in -lpthread on IRIX
# while pthread_create is in libc. We check for pthread_attr_init
# due to DEC craziness with -lpthreads. We check for
# pthread_cleanup_push because it is one of the few pthread
# functions on Solaris that doesn't have a non-functional libc stub.
# We try pthread_create on general principles.
AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
# if $ax_pthread_check_cond
# error "$ax_pthread_check_macro must be defined"
# endif
static void routine(void *a) { a = 0; }
static void *start_routine(void *a) { return a; }],
[pthread_t th; pthread_attr_t attr;
pthread_create(&th, 0, start_routine, 0);
pthread_join(th, 0);
pthread_attr_init(&attr);
pthread_cleanup_push(routine, 0);
pthread_cleanup_pop(0) /* ; */])],
[ax_pthread_ok=yes],
[])
CFLAGS="$ax_pthread_save_CFLAGS"
LIBS="$ax_pthread_save_LIBS"
AC_MSG_RESULT([$ax_pthread_ok])
AS_IF([test "x$ax_pthread_ok" = "xyes"], [break])
PTHREAD_LIBS=""
PTHREAD_CFLAGS=""
done
fi
# Various other checks:
if test "x$ax_pthread_ok" = "xyes"; then
ax_pthread_save_CFLAGS="$CFLAGS"
ax_pthread_save_LIBS="$LIBS"
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
LIBS="$PTHREAD_LIBS $LIBS"
# Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
AC_CACHE_CHECK([for joinable pthread attribute],
[ax_cv_PTHREAD_JOINABLE_ATTR],
[ax_cv_PTHREAD_JOINABLE_ATTR=unknown
for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
[int attr = $ax_pthread_attr; return attr /* ; */])],
[ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break],
[])
done
])
AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \
test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \
test "x$ax_pthread_joinable_attr_defined" != "xyes"],
[AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE],
[$ax_cv_PTHREAD_JOINABLE_ATTR],
[Define to necessary symbol if this constant
uses a non-standard name on your system.])
ax_pthread_joinable_attr_defined=yes
])
AC_CACHE_CHECK([whether more special flags are required for pthreads],
[ax_cv_PTHREAD_SPECIAL_FLAGS],
[ax_cv_PTHREAD_SPECIAL_FLAGS=no
case $host_os in
solaris*)
ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
;;
esac
])
AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \
test "x$ax_pthread_special_flags_added" != "xyes"],
[PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS"
ax_pthread_special_flags_added=yes])
AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
[ax_cv_PTHREAD_PRIO_INHERIT],
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]],
[[int i = PTHREAD_PRIO_INHERIT;]])],
[ax_cv_PTHREAD_PRIO_INHERIT=yes],
[ax_cv_PTHREAD_PRIO_INHERIT=no])
])
AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \
test "x$ax_pthread_prio_inherit_defined" != "xyes"],
[AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])
ax_pthread_prio_inherit_defined=yes
])
CFLAGS="$ax_pthread_save_CFLAGS"
LIBS="$ax_pthread_save_LIBS"
# More AIX lossage: compile with *_r variant
if test "x$GCC" != "xyes"; then
case $host_os in
aix*)
AS_CASE(["x/$CC"],
[x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
[#handle absolute path differently from PATH based program lookup
AS_CASE(["x$CC"],
[x/*],
[AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])],
[AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])])
;;
esac
fi
fi
test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
AC_SUBST([PTHREAD_LIBS])
AC_SUBST([PTHREAD_CFLAGS])
AC_SUBST([PTHREAD_CC])
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
if test "x$ax_pthread_ok" = "xyes"; then
ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1])
:
else
ax_pthread_ok=no
$2
fi
AC_LANG_POP
])dnl AX_PTHREAD

37
m4/ax_require_defined.m4 Normal file
View File

@@ -0,0 +1,37 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_require_defined.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_REQUIRE_DEFINED(MACRO)
#
# DESCRIPTION
#
# AX_REQUIRE_DEFINED is a simple helper for making sure other macros have
# been defined and thus are available for use. This avoids random issues
# where a macro isn't expanded. Instead the configure script emits a
# non-fatal:
#
# ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found
#
# It's like AC_REQUIRE except it doesn't expand the required macro.
#
# Here's an example:
#
# AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG])
#
# LICENSE
#
# Copyright (c) 2014 Mike Frysinger <vapier@gentoo.org>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#serial 1
AC_DEFUN([AX_REQUIRE_DEFINED], [dnl
m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])])
])dnl AX_REQUIRE_DEFINED

View File

@@ -1,102 +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)
if test x$enable_aac = xyes; then
FAAD_LIBS="-lfaad"
FAAD_CFLAGS=""
oldcflags=$CFLAGS
oldlibs=$LIBS
oldcppflags=$CPPFLAGS
CFLAGS="$CFLAGS $FAAD_CFLAGS"
LIBS="$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_LIB(faad,NeAACDecInit2,,enable_aac=no)
fi
if test x$enable_aac = xyes; then
AC_MSG_CHECKING(that FAAD2 can even be used)
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
#include <faad.h>
int main() {
char buffer;
NeAACDecHandle decoder;
NeAACDecFrameInfo frameInfo;
NeAACDecConfigurationPtr config;
unsigned char channels;
long sampleRate;
long bufferlen = 0;
decoder = NeAACDecOpen();
config = NeAACDecGetCurrentConfiguration(decoder);
config->outputFormat = FAAD_FMT_16BIT;
NeAACDecSetConfiguration(decoder,config);
NeAACDecInit(decoder,&buffer,bufferlen,&sampleRate,&channels);
NeAACDecInit2(decoder,&buffer,bufferlen,&sampleRate,&channels);
NeAACDecDecode(decoder,&frameInfo,&buffer,bufferlen);
NeAACDecClose(decoder);
return 0;
}
])],AC_MSG_RESULT(yes),[AC_MSG_RESULT(no);enable_aac=no])
fi
if test x$enable_aac = xyes; then
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 $FAAD_CFLAGS -Werror"
LIBS="$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;
NeAACDecInit2(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
else
FAAD_LIBS=""
FAAD_CFLAGS=""
fi
AC_SUBST(FAAD_CFLAGS)
AC_SUBST(FAAD_LIBS)
])

View File

@@ -1,23 +1,18 @@
dnl Parameters: varname1, description
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"
if test x$[]enable_$1 = xauto; then
AC_MSG_NOTICE([auto-detected $2])
enable_$1=yes
fi
])
dnl Parameters: varname1, description, errmsg
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])
if test x$[]enable_$1 = xauto; then
AC_MSG_WARN([$3 -- disabling $2])
enable_$1=no
elif test x$[]enable_$1 = xyes; then
AC_MSG_ERROR([$2: $3])
fi
])
@@ -25,59 +20,59 @@ 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])
if test x$[]enable_$1 != xno && test x$[]found_$1 = xno; then
MPD_AUTO_DISABLED([$1], [$2], [$3])
fi
])
dnl Evaluate a check's result. Abort if the feature was requested
dnl explicitly but is unavailable.
dnl
dnl Parameters: varname1, description, errmsg
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"
if test x$[]enable_$1 = xno; then
found_$1=no
fi
if eval "test x`echo '$'$found` = xyes"; then
MPD_AUTO_ENABLED([$name], [$feature])
if test x$[]found_$1 = xyes; then
MPD_AUTO_ENABLED([$1], [$2])
else
MPD_AUTO_DISABLED([$name], [$feature], [$msg])
MPD_AUTO_DISABLED([$1], [$2], [$3])
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"])
dnl Invoke a check if its configuration is "yes" or "auto" and call
dnl MPD_AUTO_RESULT.
dnl
dnl Parameters: varname1, description, errmsg, check
AC_DEFUN([MPD_AUTO], [
if test x$[]enable_$1 != xno; then
$4
fi
MPD_AUTO_RESULT([$1], [$2], [$3])
])
MPD_AUTO_RESULT([$1], [$4], [$5])
dnl Wrapper for MPD_AUTO and PKG_CHECK_MODULES.
dnl
dnl Parameters: varname1, varname2, pkgname, description, errmsg
AC_DEFUN([MPD_AUTO_PKG], [
MPD_AUTO([$1], [$4], [$5],
[PKG_CHECK_MODULES([$2], [$3],
[found_$1=yes],
[found_$1=no])])
])
dnl Check with pkg-config first, fall back to AC_CHECK_LIB.
dnl
dnl Parameters: varname1, varname2, pkgname, libname, symname, libs, cflags, description, errmsg
AC_DEFUN([MPD_AUTO_PKG_LIB], [
if eval "test x`echo '$'enable_$1` != xno"; then
PKG_CHECK_MODULES([$2], [$3],
[eval "found_$1=yes"],
MPD_AUTO([$1], [$8], [$9],
[PKG_CHECK_MODULES([$2], [$3],
[found_$1=yes],
AC_CHECK_LIB($4, $5,
[eval "found_$1=yes $2_LIBS='$6' $2_CFLAGS='$7'"],
[eval "found_$1=no"],
[$6]))
fi
MPD_AUTO_RESULT([$1], [$8], [$9])
[found_$1=yes $2_LIBS='$6' $2_CFLAGS='$7'],
[found_$1=no],
[$6]))])
])
dnl Wrapper for AC_CHECK_LIB.
@@ -87,12 +82,104 @@ AC_DEFUN([MPD_AUTO_LIB], [
AC_SUBST([$2_LIBS], [])
AC_SUBST([$2_CFLAGS], [])
if eval "test x`echo '$'enable_$1` != xno"; then
AC_CHECK_LIB($3, $4,
[eval "found_$1=yes $2_LIBS='$5' $2_CFLAGS='$6'"],
[eval "found_$1=no"],
[$5])
fi
MPD_AUTO_RESULT([$1], [$7], [$8])
MPD_AUTO([$1], [$7], [$8],
[AC_CHECK_LIB($3, $4,
[found_$1=yes $2_LIBS='$5' $2_CFLAGS='$6'],
[found_$1=no],
[$5])])
])
dnl Wrapper for AC_CHECK_HEADER.
dnl
dnl Parameters: varname1, varname2, header, libs, cflags, description, errmsg
AC_DEFUN([MPD_AUTO_HEADER], [
AC_SUBST([$2_LIBS], [])
AC_SUBST([$2_CFLAGS], [])
MPD_AUTO([$1], [$6], [$7],
[AC_CHECK_HEADER([$3],
[found_$1=yes $2_LIBS='$4' $2_CFLAGS='$5'],
[found_$1=no])])
])
dnl Convert the given string into a string for the "default value" in
dnl the help text. If the string is a literal, then it is returned
dnl as-is; if it contains a variable reference, just "auto" is
dnl emitted.
dnl
dnl Parameters: varname1
AC_DEFUN([MPD_FORMAT_DEFAULT],
[ifelse([$1], [], [auto],
index([$1], [$]), [-1], [$1],
[auto])])
dnl Wrapper for AC_ARG_ENABLE, AC_DEFINE and AM_CONDITIONAL
dnl
dnl Parameters: varname1, varname2, description, default, check
AC_DEFUN([MPD_ARG_ENABLE], [
AC_ARG_ENABLE(translit([$1], [_], [-]),
AS_HELP_STRING([--enable-]translit([$1], [_], [-]),
[enable $3 (default: ]MPD_FORMAT_DEFAULT([$4])[)]),,
[enable_$1=]ifelse([$4], [], [auto], [$4]))
$5
MPD_DEFINE_CONDITIONAL(enable_$1, ENABLE_$2, [$3])
])
dnl Wrapper for MPD_ARG_ENABLE and MPD_AUTO
dnl
dnl Parameters: varname1, varname2, description, errmsg, default, check
AC_DEFUN([MPD_ENABLE_AUTO], [
MPD_ARG_ENABLE([$1], [$2], [$3], [$5], [
MPD_AUTO([$1], [$3], [$4], [$6])
])
])
dnl Wrapper for AC_ARG_ENABLE and MPD_AUTO_PKG
dnl
dnl Parameters: varname1, varname2, pkg, description, errmsg, default, pre
AC_DEFUN([MPD_ENABLE_AUTO_PKG], [
MPD_ARG_ENABLE([$1], [$2], [$4], [$6], [
$7
MPD_AUTO_PKG($1, $2, $3, $4, $5)
])
])
dnl Wrapper for AC_ARG_ENABLE and MPD_AUTO_PKG_LIB
dnl
dnl Parameters: varname1, varname2, pkg, libname, symname, libs, cflags, description, errmsg, default, pre
AC_DEFUN([MPD_ENABLE_AUTO_PKG_LIB], [
MPD_ARG_ENABLE([$1], [$2], [$8], [$10], [
$11
MPD_AUTO_PKG_LIB($1, $2, $3, $4, $5, $6, $7, $8, $9)
])
])
dnl Wrapper for AC_ARG_ENABLE and MPD_AUTO_LIB
dnl
dnl Parameters: varname1, varname2, libname, symname, libs, cflags, description, errmsg, default, pre
AC_DEFUN([MPD_ENABLE_AUTO_LIB], [
MPD_ARG_ENABLE([$1], [$2], [$7], [$9], [
$10
MPD_AUTO_LIB($1, $2, $3, $4, $5, $6, $7, $8)
])
])
dnl Wrapper for AC_ARG_ENABLE and MPD_AUTO_HEADER
dnl
dnl Parameters: varname1, varname2, header, libs, cflags, description, errmsg, default, pre
AC_DEFUN([MPD_ENABLE_AUTO_HEADER], [
MPD_ARG_ENABLE([$1], [$2], [$6], [$8], [
$9
MPD_AUTO_HEADER($1, $2, $3, $4, $5, $6, $7)
])
])
dnl Wrapper for MPD_ENABLE_AUTO_PKG and MPD_DEPENDS
dnl
dnl Parameters: varname1, varname2, pkg, description, errmsg, default, dep_variable, dep_errmsg
AC_DEFUN([MPD_ENABLE_AUTO_PKG_DEPENDS], [
MPD_ENABLE_AUTO_PKG([$1], [$2], [$3], [$4], [$5], [$6],
[MPD_DEPENDS([enable_$1], [$7], [$8])])
])

View File

@@ -0,0 +1,8 @@
dnl Wrapper for AC_DEFINE and AM_CONDITIONAL
dnl
dnl Parameters: varname1, varname2, description
AC_DEFUN([MPD_DEFINE_CONDITIONAL], [dnl
AM_CONDITIONAL($2, test x$[]$1 = xyes)
if test x$[]$1 = xyes; then
AC_DEFINE($2, 1, [Define to enable $3])
fi])

9
m4/mpd_depends.m4 Normal file
View File

@@ -0,0 +1,9 @@
AC_DEFUN([MPD_DEPENDS], [
if test x$$2 = xno; then
if test x$$1 = xauto; then
$1=no
elif test x$$1 = xyes; then
AC_MSG_ERROR([$3])
fi
fi
])

View File

@@ -6,7 +6,20 @@ AC_DEFUN([MPD_OPTIONAL_FUNC], [
AC_ARG_ENABLE([$1],
AS_HELP_STRING([--enable-$1],
[use the function "$1" (default: auto)]),
[test xenable_$1 = xyes && AC_DEFINE([$3], 1, [Define to use $1])],
[test x$[]enable_$1 = xyes && AC_DEFINE([$3], 1, [Define to use $1])],
[AC_CHECK_FUNC([$2],
[AC_DEFINE([$3], 1, [Define to use $1])],)])
])
dnl MPD_OPTIONAL_FUNC_NODEF(name, func)
dnl
dnl Allow the user to enable or disable the use of a function.
dnl Works similar to MPD_OPTIONAL_FUNC, however MPD_OPTIONAL_FUNC_NODEF
dnl does not invoke AC_DEFINE when function is enabled. Shell variable
dnl enable_$name is set to "yes" instead.
AC_DEFUN([MPD_OPTIONAL_FUNC_NODEF], [
AC_ARG_ENABLE([$1],
AS_HELP_STRING([--enable-$1],
[use the function "$1" (default: auto)]),,
[AC_CHECK_FUNC([$2], [enable_$1=yes],)])
])

23
m4/mpd_with_flags.m4 Normal file
View File

@@ -0,0 +1,23 @@
dnl Run code with the specified CFLAGS/CXXFLAGS and LIBS appended.
dnl Restores the old values afterwards.
dnl
dnl Parameters: cflags, libs, code
AC_DEFUN([MPD_WITH_FLAGS], [
ac_save_CFLAGS="$[]CFLAGS"
ac_save_CXXFLAGS="$[]CXXFLAGS"
ac_save_LIBS="$[]LIBS"
CFLAGS="$[]CFLAGS $1"
CXXFLAGS="$[]CXXFLAGS $1"
LIBS="$[]LIBS $2"
$3
CFLAGS="$[]ac_save_CFLAGS"
CXXFLAGS="$[]ac_save_CXXFLAGS"
LIBS="$[]ac_save_LIBS"
])
dnl Run code with the specified library's CFLAGS/CXXFLAGS and LIBS
dnl appended. Restores the old values afterwards.
dnl
dnl Parameters: libname, code
AC_DEFUN([MPD_WITH_LIBRARY],
[MPD_WITH_FLAGS([$[]$1_CFLAGS], [$[]$1_LIBS], [$2])])

274
m4/pkg.m4
View File

@@ -1,32 +1,68 @@
# 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.
dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
dnl serial 11 (pkg-config-0.29)
dnl
dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
dnl
dnl This program is free software; you can redistribute it and/or modify
dnl it under the terms of the GNU General Public License as published by
dnl the Free Software Foundation; either version 2 of the License, or
dnl (at your option) any later version.
dnl
dnl This program is distributed in the hope that it will be useful, but
dnl WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
dnl General Public License for more details.
dnl
dnl You should have received a copy of the GNU General Public License
dnl along with this program; if not, write to the Free Software
dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
dnl 02111-1307, USA.
dnl
dnl As a special exception to the GNU General Public License, if you
dnl distribute this file as part of a program that contains a
dnl configuration script generated by Autoconf, you may include it under
dnl the same distribution terms that you use for the rest of that
dnl program.
# PKG_PROG_PKG_CONFIG([MIN-VERSION])
# ----------------------------------
dnl PKG_PREREQ(MIN-VERSION)
dnl -----------------------
dnl Since: 0.29
dnl
dnl Verify that the version of the pkg-config macros are at least
dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's
dnl installed version of pkg-config, this checks the developer's version
dnl of pkg.m4 when generating configure.
dnl
dnl To ensure that this macro is defined, also add:
dnl m4_ifndef([PKG_PREREQ],
dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])])
dnl
dnl See the "Since" comment for each macro you use to see what version
dnl of the macros you require.
m4_defun([PKG_PREREQ],
[m4_define([PKG_MACROS_VERSION], [0.29])
m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
[m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
])dnl PKG_PREREQ
dnl PKG_PROG_PKG_CONFIG([MIN-VERSION])
dnl ----------------------------------
dnl Since: 0.16
dnl
dnl Search for the pkg-config tool and set the PKG_CONFIG variable to
dnl first found in the path. Checks that the version of pkg-config found
dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is
dnl used since that's the first version where most current features of
dnl pkg-config existed.
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
m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])
AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])
AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])
AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])
if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
fi
@@ -39,48 +75,49 @@ if test -n "$PKG_CONFIG"; then
AC_MSG_RESULT([no])
PKG_CONFIG=""
fi
fi[]dnl
])# PKG_PROG_PKG_CONFIG
])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
# --------------------------------------------------------------
dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
dnl -------------------------------------------------------------------
dnl Since: 0.18
dnl
dnl Check to see whether a particular set of modules exists. Similar to
dnl PKG_CHECK_MODULES(), but does not set variables or print errors.
dnl
dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
dnl only at the first occurence in configure.ac, so if the first place
dnl it's called might be skipped (such as if it is within an "if", you
dnl have 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_default([$2], [:])
m4_ifvaln([$3], [else
$3])dnl
fi])
# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
# ---------------------------------------------
dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
dnl ---------------------------------------------
dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting
dnl pkg_failed based on the result.
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
[if test -n "$$1"; then
pkg_cv_[]$1="$$1"
elif test -n "$PKG_CONFIG"; then
PKG_CHECK_EXISTS([$3],
[pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes ],
[pkg_failed=yes])
else
pkg_failed=untried
fi[]dnl
])# _PKG_CONFIG
])dnl _PKG_CONFIG
# _PKG_SHORT_ERRORS_SUPPORTED
# -----------------------------
dnl _PKG_SHORT_ERRORS_SUPPORTED
dnl ---------------------------
dnl Internal check to see if pkg-config supports short errors.
AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@@ -88,19 +125,17 @@ if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
else
_pkg_short_errors_supported=no
fi[]dnl
])# _PKG_SHORT_ERRORS_SUPPORTED
])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
#
#
# --------------------------------------------------------------
dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
dnl [ACTION-IF-NOT-FOUND])
dnl --------------------------------------------------------------
dnl Since: 0.4.0
dnl
dnl Note that if there is a possibility the first call to
dnl PKG_CHECK_MODULES might not happen, you should be sure to include an
dnl 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
@@ -117,16 +152,17 @@ 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
AC_MSG_RESULT([no])
_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"`
$1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
else
$1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
$1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
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
m4_default([$4], [AC_MSG_ERROR(
[Package requirements ($2) were not met:
$$1_PKG_ERRORS
@@ -134,24 +170,106 @@ $$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])
_PKG_TEXT])[]dnl
])
elif test $pkg_failed = untried; then
ifelse([$4], , [AC_MSG_FAILURE(dnl
AC_MSG_RESULT([no])
m4_default([$4], [AC_MSG_FAILURE(
[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])
To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl
])
else
$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
$1[]_LIBS=$pkg_cv_[]$1[]_LIBS
AC_MSG_RESULT([yes])
ifelse([$3], , :, [$3])
$3
fi[]dnl
])# PKG_CHECK_MODULES
])dnl PKG_CHECK_MODULES
dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
dnl [ACTION-IF-NOT-FOUND])
dnl ---------------------------------------------------------------------
dnl Since: 0.29
dnl
dnl Checks for existence of MODULES and gathers its build flags with
dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags
dnl and VARIABLE-PREFIX_LIBS from --libs.
dnl
dnl Note that if there is a possibility the first call to
dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to
dnl include an explicit call to PKG_PROG_PKG_CONFIG in your
dnl configure.ac.
AC_DEFUN([PKG_CHECK_MODULES_STATIC],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
_save_PKG_CONFIG=$PKG_CONFIG
PKG_CONFIG="$PKG_CONFIG --static"
PKG_CHECK_MODULES($@)
PKG_CONFIG=$_save_PKG_CONFIG[]dnl
])dnl PKG_CHECK_MODULES_STATIC
dnl PKG_INSTALLDIR([DIRECTORY])
dnl -------------------------
dnl Since: 0.27
dnl
dnl Substitutes the variable pkgconfigdir as the location where a module
dnl should install pkg-config .pc files. By default the directory is
dnl $libdir/pkgconfig, but the default can be changed by passing
dnl DIRECTORY. The user can override through the --with-pkgconfigdir
dnl parameter.
AC_DEFUN([PKG_INSTALLDIR],
[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])
m4_pushdef([pkg_description],
[pkg-config installation directory @<:@]pkg_default[@:>@])
AC_ARG_WITH([pkgconfigdir],
[AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],,
[with_pkgconfigdir=]pkg_default)
AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
m4_popdef([pkg_default])
m4_popdef([pkg_description])
])dnl PKG_INSTALLDIR
dnl PKG_NOARCH_INSTALLDIR([DIRECTORY])
dnl --------------------------------
dnl Since: 0.27
dnl
dnl Substitutes the variable noarch_pkgconfigdir as the location where a
dnl module should install arch-independent pkg-config .pc files. By
dnl default the directory is $datadir/pkgconfig, but the default can be
dnl changed by passing DIRECTORY. The user can override through the
dnl --with-noarch-pkgconfigdir parameter.
AC_DEFUN([PKG_NOARCH_INSTALLDIR],
[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])
m4_pushdef([pkg_description],
[pkg-config arch-independent installation directory @<:@]pkg_default[@:>@])
AC_ARG_WITH([noarch-pkgconfigdir],
[AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],,
[with_noarch_pkgconfigdir=]pkg_default)
AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])
m4_popdef([pkg_default])
m4_popdef([pkg_description])
])dnl PKG_NOARCH_INSTALLDIR
dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
dnl -------------------------------------------
dnl Since: 0.28
dnl
dnl Retrieves the value of the pkg-config variable for the given module.
AC_DEFUN([PKG_CHECK_VAR],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
_PKG_CONFIG([$1], [variable="][$3]["], [$2])
AS_VAR_COPY([$1], [pkg_cv_][$1])
AS_VAR_IF([$1], [""], [$5], [$4])dnl
])dnl PKG_CHECK_VAR

View File

@@ -1,16 +1,6 @@
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
if test x$[]enable_$1 = xyes; then
printf '+'
else
printf '-'

View File

@@ -1,5 +1,4 @@
# Check if "struct ucred" is available. If not, try harder with
# _GNU_SOURCE.
# Check if "struct ucred" is available.
#
# Author: Max Kellermann <max@duempel.org>
@@ -10,19 +9,6 @@ AC_DEFUN([STRUCT_UCRED],[
[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
# :(
CFLAGS="$CFLAGS -D_GNU_SOURCE"
fi
fi
])
AC_MSG_RESULT($mpd_cv_have_struct_ucred)

View File

@@ -1,9 +0,0 @@
[Unit]
Description=Music Player Daemon
After=network.target sound.target
[Service]
ExecStart=@prefix@/bin/mpd --no-daemon
[Install]
WantedBy=multi-user.target

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

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

@@ -0,0 +1,46 @@
import os.path, subprocess
from build.project import Project
class AutotoolsProject(Project):
def __init__(self, url, md5, installed, configure_args=[],
autogen=False,
cppflags='',
**kwargs):
Project.__init__(self, url, md5, installed, **kwargs)
self.configure_args = configure_args
self.autogen = autogen
self.cppflags = cppflags
def build(self, toolchain):
src = self.unpack(toolchain)
if self.autogen:
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)
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,
'LIBS=' + toolchain.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)
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)

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)

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

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

@@ -0,0 +1,54 @@
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'
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)

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

@@ -0,0 +1,109 @@
from build.project import Project
from build.zlib import ZlibProject
from build.autotools import AutotoolsProject
from build.ffmpeg import FfmpegProject
from build.boost import BoostProject
libogg = AutotoolsProject(
'http://downloads.xiph.org/releases/ogg/libogg-1.3.2.tar.xz',
'5c3a34309d8b98640827e5d0991a4015',
'lib/libogg.a',
['--disable-shared', '--enable-static'],
)
libvorbis = AutotoolsProject(
'http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.5.tar.xz',
'28cb28097c07a735d6af56e598e1c90f',
'lib/libvorbis.a',
['--disable-shared', '--enable-static'],
)
opus = AutotoolsProject(
'http://downloads.xiph.org/releases/opus/opus-1.1.3.tar.gz',
'32bbb6b557fe1b6066adc0ae1f08b629',
'lib/libopus.a',
['--disable-shared', '--enable-static'],
)
flac = AutotoolsProject(
'http://downloads.xiph.org/releases/flac/flac-1.3.2.tar.xz',
'91cfc3ed61dc40f47f050a109b08610667d73477af6ef36dcad31c31a4a8d53f',
'lib/libFLAC.a',
[
'--disable-shared', '--enable-static',
'--disable-xmms-plugin', '--disable-cpplibs',
],
)
zlib = ZlibProject(
'http://zlib.net/zlib-1.2.8.tar.xz',
'28f1205d8dd2001f26fec1e8c2cebe37',
'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'],
autogen=True,
)
libmad = AutotoolsProject(
'ftp://ftp.mars.org/pub/mpeg/libmad-0.15.1b.tar.gz',
'1be543bc30c56fb6bea1d7bf6a64e66c',
'lib/libmad.a',
['--disable-shared', '--enable-static'],
autogen=True,
)
ffmpeg = FfmpegProject(
'http://ffmpeg.org/releases/ffmpeg-3.2.2.tar.xz',
'3f01bd1fe1a17a277f8c84869e5d9192b4b978cb660872aa2b54c3cc8a2fedfc',
'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-network',
'--disable-encoders',
'--disable-protocols',
'--disable-outdevs',
'--disable-filters',
],
)
curl = AutotoolsProject(
'http://curl.haxx.se/download/curl-7.52.1.tar.lzma',
'44286d4b825936e2430fc44ad730ce899afb736a5d328cbb8b5d42462f3f2365',
'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-gopher',
'--disable-manual',
'--disable-threaded-resolver', '--disable-verbose', '--disable-sspi',
'--disable-crypto-auth', '--disable-ntlm-wb', '--disable-tls-srp', '--disable-cookies',
'--without-ssl', '--without-gnutls', '--without-nss', '--without-libssh2',
],
)
boost = BoostProject(
'http://downloads.sourceforge.net/project/boost/boost/1.63.0/boost_1_63_0.tar.bz2',
'beae2529f759f6b3bf3f4969a19c2e9d6f0c503edcb2de4a61d1428519fcb3b0',
'include/boost/version.hpp',
)

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

@@ -0,0 +1,59 @@
import os, shutil
import re
from build.download import download_and_verify
from build.tar import untar
class Project:
def __init__(self, url, md5, installed, name=None, version=None,
base=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]?)$', 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
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
return untar(self.download(toolchain), parent_path, self.base)
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

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'),
'SHARED_MODE=1'],
cwd=src, env=toolchain.env)

View File

@@ -1,52 +0,0 @@
/*
* Copyright (C) 2003-2013 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 "AudioConfig.hxx"
#include "AudioFormat.hxx"
#include "AudioParser.hxx"
#include "ConfigData.hxx"
#include "ConfigGlobal.hxx"
#include "ConfigOption.hxx"
#include "util/Error.hxx"
#include "system/FatalError.hxx"
static AudioFormat configured_audio_format;
AudioFormat
getOutputAudioFormat(AudioFormat inAudioFormat)
{
AudioFormat out_audio_format = inAudioFormat;
out_audio_format.ApplyMask(configured_audio_format);
return out_audio_format;
}
void initAudioConfig(void)
{
const struct config_param *param = config_get_param(CONF_AUDIO_OUTPUT_FORMAT);
if (param == nullptr)
return;
Error error;
if (!audio_format_parse(configured_audio_format, param->value.c_str(),
true, error))
FormatFatalError("error parsing line %i: %s",
param->line, error.GetMessage());
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2013 The Music Player Daemon Project
* Copyright 2003-2017 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2013 The Music Player Daemon Project
* Copyright 2003-2017 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -82,8 +82,19 @@ struct AudioFormat {
SampleFormat format;
/**
* The number of channels. Only mono (1) and stereo (2) are
* fully supported currently.
* 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;
@@ -99,8 +110,8 @@ struct AudioFormat {
}
/**
* Clears the #audio_format object, i.e. sets all attributes to an
* undefined (invalid) value.
* Clears the object, i.e. sets all attributes to an undefined
* (invalid) value.
*/
void Clear() {
sample_rate = 0;
@@ -148,6 +159,13 @@ struct AudioFormat {
void ApplyMask(AudioFormat mask);
gcc_pure
AudioFormat WithMask(AudioFormat mask) const {
AudioFormat result = *this;
result.ApplyMask(mask);
return result;
}
/**
* Returns the size of each (mono) sample in bytes.
*/
@@ -185,8 +203,6 @@ audio_valid_sample_rate(unsigned sample_rate)
/**
* Checks whether the sample format is valid.
*
* @param bits the number of significant bits per sample
*/
static inline bool
audio_valid_sample_format(SampleFormat format)
@@ -289,10 +305,10 @@ AudioFormat::GetTimeToSize() const
}
/**
* Renders a #sample_format enum into a string, e.g. for printing it
* Renders a #SampleFormat enum into a string, e.g. for printing it
* in a log file.
*
* @param format a #sample_format enum value
* @param format a #SampleFormat enum value
* @return the string
*/
gcc_pure gcc_malloc
@@ -300,12 +316,12 @@ const char *
sample_format_to_string(SampleFormat format);
/**
* Renders the #audio_format object into a string, e.g. for printing
* Renders the #AudioFormat object into a string, e.g. for printing
* it in a log file.
*
* @param af the #audio_format object
* @param af the #AudioFormat object
* @param s a buffer to print into
* @return the string, or nullptr if the #audio_format object is invalid
* @return the string, or nullptr if the #AudioFormat object is invalid
*/
gcc_pure gcc_malloc
const char *

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2013 The Music Player Daemon Project
* Copyright 2003-2017 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -25,73 +25,59 @@
#include "config.h"
#include "AudioParser.hxx"
#include "AudioFormat.hxx"
#include "CheckAudioFormat.hxx"
#include "util/Error.hxx"
#include "Compiler.h"
#include "util/RuntimeError.hxx"
#include <assert.h>
#include <string.h>
#include <stdlib.h>
static bool
parse_sample_rate(const char *src, bool mask, uint32_t *sample_rate_r,
const char **endptr_r, Error &error)
static uint32_t
ParseSampleRate(const char *src, bool mask, const char **endptr_r)
{
unsigned long value;
char *endptr;
if (mask && *src == '*') {
*sample_rate_r = 0;
*endptr_r = src + 1;
return true;
return 0;
}
value = strtoul(src, &endptr, 10);
if (endptr == src) {
error.Set(audio_format_domain,
"Failed to parse the sample rate");
return false;
} else if (!audio_check_sample_rate(value, error))
return false;
throw std::runtime_error("Failed to parse the sample rate");
} else if (!audio_valid_sample_rate(value))
throw FormatRuntimeError("Invalid sample rate: %lu",
value);
*sample_rate_r = value;
*endptr_r = endptr;
return true;
return value;
}
static bool
parse_sample_format(const char *src, bool mask,
SampleFormat *sample_format_r,
const char **endptr_r, Error &error)
static SampleFormat
ParseSampleFormat(const char *src, bool mask, const char **endptr_r)
{
unsigned long value;
char *endptr;
SampleFormat sample_format;
if (mask && *src == '*') {
*sample_format_r = SampleFormat::UNDEFINED;
*endptr_r = src + 1;
return true;
return SampleFormat::UNDEFINED;
}
if (*src == 'f') {
*sample_format_r = SampleFormat::FLOAT;
*endptr_r = src + 1;
return true;
return SampleFormat::FLOAT;
}
if (memcmp(src, "dsd", 3) == 0) {
*sample_format_r = SampleFormat::DSD;
*endptr_r = src + 3;
return true;
return SampleFormat::DSD;
}
value = strtoul(src, &endptr, 10);
if (endptr == src) {
error.Set(audio_format_domain,
"Failed to parse the sample format");
return false;
}
if (endptr == src)
throw std::runtime_error("Failed to parse the sample format");
switch (value) {
case 8:
@@ -115,99 +101,65 @@ parse_sample_format(const char *src, bool mask,
break;
default:
error.Format(audio_format_domain,
"Invalid sample format: %lu", value);
return false;
throw FormatRuntimeError("Invalid sample format: %lu", value);
}
assert(audio_valid_sample_format(sample_format));
*sample_format_r = sample_format;
*endptr_r = endptr;
return true;
return sample_format;
}
static bool
parse_channel_count(const char *src, bool mask, uint8_t *channels_r,
const char **endptr_r, Error &error)
static uint8_t
ParseChannelCount(const char *src, bool mask, const char **endptr_r)
{
unsigned long value;
char *endptr;
if (mask && *src == '*') {
*channels_r = 0;
*endptr_r = src + 1;
return true;
return 0;
}
value = strtoul(src, &endptr, 10);
if (endptr == src) {
error.Set(audio_format_domain,
"Failed to parse the channel count");
return false;
} else if (!audio_check_channel_count(value, error))
return false;
if (endptr == src)
throw std::runtime_error("Failed to parse the channel count");
else if (!audio_valid_channel_count(value))
throw FormatRuntimeError("Invalid channel count: %u", value);
*channels_r = value;
*endptr_r = endptr;
return true;
return value;
}
bool
audio_format_parse(AudioFormat &dest, const char *src,
bool mask, Error &error)
AudioFormat
ParseAudioFormat(const char *src, bool mask)
{
uint32_t rate;
SampleFormat sample_format;
uint8_t channels;
AudioFormat dest;
dest.Clear();
/* parse sample rate */
#if GCC_CHECK_VERSION(4,7)
/* workaround -Wmaybe-uninitialized false positive */
rate = 0;
#endif
dest.sample_rate = ParseSampleRate(src, mask, &src);
if (!parse_sample_rate(src, mask, &rate, &src, error))
return false;
if (*src++ != ':') {
error.Set(audio_format_domain, "Sample format missing");
return false;
}
if (*src++ != ':')
throw std::runtime_error("Sample format missing");
/* parse sample format */
#if GCC_CHECK_VERSION(4,7)
/* workaround -Wmaybe-uninitialized false positive */
sample_format = SampleFormat::UNDEFINED;
#endif
dest.format = ParseSampleFormat(src, mask, &src);
if (!parse_sample_format(src, mask, &sample_format, &src, error))
return false;
if (*src++ != ':') {
error.Set(audio_format_domain, "Channel count missing");
return false;
}
if (*src++ != ':')
throw std::runtime_error("Channel count missing");
/* parse channel count */
if (!parse_channel_count(src, mask, &channels, &src, error))
return false;
dest.channels = ParseChannelCount(src, mask, &src);
if (*src != 0) {
error.Format(audio_format_domain,
"Extra data after channel count: %s", src);
return false;
}
if (*src != 0)
throw FormatRuntimeError("Extra data after channel count: %s", src);
dest = AudioFormat(rate, sample_format, channels);
assert(mask
? dest.IsMaskValid()
: dest.IsValid());
return true;
return dest;
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2013 The Music Player Daemon Project
* Copyright 2003-2017 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -25,22 +25,21 @@
#ifndef MPD_AUDIO_PARSER_HXX
#define MPD_AUDIO_PARSER_HXX
#include "Compiler.h"
struct AudioFormat;
class Error;
/**
* 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 occurring, or NULL to
* ignore errors
* @return true on success
*/
bool
audio_format_parse(AudioFormat &dest, const char *src,
bool mask, Error &error);
gcc_pure
AudioFormat
ParseAudioFormat(const char *src, bool mask);
#endif

41
src/BulkEdit.hxx Normal file
View File

@@ -0,0 +1,41 @@
/*
* Copyright 2003-2017 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

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2013 The Music Player Daemon Project
* Copyright 2003-2017 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -20,61 +20,43 @@
#include "config.h"
#include "CheckAudioFormat.hxx"
#include "AudioFormat.hxx"
#include "util/Error.hxx"
#include "util/Domain.hxx"
#include "util/RuntimeError.hxx"
#include <stdexcept>
#include <assert.h>
const Domain audio_format_domain("audio_format");
bool
audio_check_sample_rate(unsigned long sample_rate, Error &error)
void
CheckSampleRate(unsigned long sample_rate)
{
if (!audio_valid_sample_rate(sample_rate)) {
error.Format(audio_format_domain,
"Invalid sample rate: %lu", sample_rate);
return false;
}
return true;
if (!audio_valid_sample_rate(sample_rate))
throw FormatRuntimeError("Invalid sample rate: %lu",
sample_rate);
}
bool
audio_check_sample_format(SampleFormat sample_format, Error &error)
void
CheckSampleFormat(SampleFormat sample_format)
{
if (!audio_valid_sample_format(sample_format)) {
error.Format(audio_format_domain,
"Invalid sample format: %u",
unsigned(sample_format));
return false;
}
return true;
if (!audio_valid_sample_format(sample_format))
throw FormatRuntimeError("Invalid sample format: %u",
unsigned(sample_format));
}
bool
audio_check_channel_count(unsigned channels, Error &error)
void
CheckChannelCount(unsigned channels)
{
if (!audio_valid_channel_count(channels)) {
error.Format(audio_format_domain,
"Invalid channel count: %u", channels);
return false;
}
return true;
if (!audio_valid_channel_count(channels))
throw FormatRuntimeError("Invalid channel count: %u",
channels);
}
bool
audio_format_init_checked(AudioFormat &af, unsigned long sample_rate,
SampleFormat sample_format, unsigned channels,
Error &error)
AudioFormat
CheckAudioFormat(unsigned long sample_rate,
SampleFormat sample_format, unsigned channels)
{
if (audio_check_sample_rate(sample_rate, error) &&
audio_check_sample_format(sample_format, error) &&
audio_check_channel_count(channels, error)) {
af = AudioFormat(sample_rate, sample_format, channels);
assert(af.IsValid());
return true;
} else
return false;
CheckSampleRate(sample_rate);
CheckSampleFormat(sample_format);
CheckChannelCount(channels);
return AudioFormat(sample_rate, sample_format, channels);
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2013 The Music Player Daemon Project
* Copyright 2003-2017 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -22,25 +22,23 @@
#include "AudioFormat.hxx"
class Error;
void
CheckSampleRate(unsigned long sample_rate);
extern const class Domain audio_format_domain;
void
CheckSampleFormat(SampleFormat sample_format);
bool
audio_check_sample_rate(unsigned long sample_rate, Error &error);
bool
audio_check_sample_format(SampleFormat sample_format, Error &error);
bool
audio_check_channel_count(unsigned sample_format, Error &error);
void
CheckChannelCount(unsigned sample_format);
/**
* Wrapper for audio_format_init(), which checks all attributes.
* Check #AudioFormat attributes and construct an #AudioFormat
* instance.
*
* Throws #std::runtime_error on error.
*/
bool
audio_format_init_checked(AudioFormat &af, unsigned long sample_rate,
SampleFormat sample_format, unsigned channels,
Error &error);
AudioFormat
CheckAudioFormat(unsigned long sample_rate,
SampleFormat sample_format, unsigned channels);
#endif

215
src/Chrono.hxx Normal file
View File

@@ -0,0 +1,215 @@
/*
* Copyright 2003-2017 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>
/**
* 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;
typedef Base::rep rep;
public:
SongTime() = default;
template<typename T>
explicit constexpr SongTime(T t):Base(t) {}
static constexpr SongTime zero() {
return SongTime(Base::zero());
}
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;
typedef Base::rep rep;
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);
}
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

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2013 The Music Player Daemon Project
* Copyright 2003-2017 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -22,58 +22,122 @@
#include "ls.hxx"
#include "LogInit.hxx"
#include "Log.hxx"
#include "ConfigGlobal.hxx"
#include "DecoderList.hxx"
#include "DecoderPlugin.hxx"
#include "OutputList.hxx"
#include "OutputPlugin.hxx"
#include "InputRegistry.hxx"
#include "InputPlugin.hxx"
#include "PlaylistRegistry.hxx"
#include "PlaylistPlugin.hxx"
#include "config/ConfigGlobal.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/Traits.hxx"
#include "fs/FileSystem.hxx"
#include "util/Error.hxx"
#include "fs/StandardDirectory.hxx"
#include "system/Error.hxx"
#include "util/Macros.hxx"
#include "util/RuntimeError.hxx"
#include "util/Domain.hxx"
#include "system/FatalError.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 "EncoderList.hxx"
#include "EncoderPlugin.hxx"
#include "encoder/EncoderList.hxx"
#include "encoder/EncoderPlugin.hxx"
#endif
#ifdef ENABLE_ARCHIVE
#include "ArchiveList.hxx"
#include "ArchivePlugin.hxx"
#include "archive/ArchiveList.hxx"
#include "archive/ArchivePlugin.hxx"
#endif
#include <glib.h>
#include <stdio.h>
#include <stdlib.h>
#ifdef WIN32
#define CONFIG_FILE_LOCATION "\\mpd\\mpd.conf"
#define CONFIG_FILE_LOCATION PATH_LITERAL("mpd\\mpd.conf")
#define APP_CONFIG_FILE_LOCATION PATH_LITERAL("conf\\mpd.conf")
#else
#define USER_CONFIG_FILE_LOCATION1 ".mpdconf"
#define USER_CONFIG_FILE_LOCATION2 ".mpd/mpd.conf"
#define USER_CONFIG_FILE_LOCATION_XDG "mpd/mpd.conf"
#define USER_CONFIG_FILE_LOCATION1 PATH_LITERAL(".mpdconf")
#define USER_CONFIG_FILE_LOCATION2 PATH_LITERAL(".mpd/mpd.conf")
#define USER_CONFIG_FILE_LOCATION_XDG PATH_LITERAL("mpd/mpd.conf")
#endif
static constexpr OptionDef opt_kill(
"kill", "kill the currently running mpd session");
static constexpr OptionDef opt_no_config(
"no-config", "don't read from config");
static constexpr OptionDef opt_no_daemon(
"no-daemon", "don't detach from console");
static constexpr OptionDef opt_stdout(
"stdout", nullptr); // hidden, compatibility with old versions
static constexpr OptionDef opt_stderr(
"stderr", "print messages to stderr");
static constexpr OptionDef opt_verbose(
"verbose", 'v', "verbose logging");
static constexpr OptionDef opt_version(
"version", 'V', "print version number");
static constexpr OptionDef opt_help(
"help", 'h', "show help options");
static constexpr OptionDef opt_help_alt(
nullptr, '?', nullptr); // hidden, standard alias for --help
static constexpr Domain cmdline_domain("cmdline");
gcc_noreturn
static void version(void)
{
puts("Music Player Daemon " VERSION "\n"
"\n"
"Copyright (C) 2003-2007 Warren Dukes <warren.dukes@gmail.com>\n"
"Copyright (C) 2008-2013 Max Kellermann <max@duempel.org>\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"
"\n"
"Decoders plugins:");
printf("Music Player Daemon " VERSION
#ifdef GIT_COMMIT
" (" GIT_COMMIT ")"
#endif
"\n"
"\n"
"Copyright (C) 2003-2007 Warren Dukes <warren.dukes@gmail.com>\n"
"Copyright (C) 2008-2015 Max Kellermann <max@duempel.org>\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"
#ifdef ENABLE_DATABASE
"\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
"\n"
"Neighbor plugins:\n");
for (auto i = neighbor_plugins; *i != nullptr; ++i)
printf(" %s", (*i)->name);
printf("\n"
#endif
"\n"
"Decoders plugins:\n");
decoder_plugins_for_each([](const DecoderPlugin &plugin){
printf(" [%s]", plugin.name);
@@ -83,26 +147,39 @@ static void version(void)
for (; *suffixes != nullptr; ++suffixes)
printf(" %s", *suffixes);
puts("");
printf("\n");
});
puts("\n"
"Output plugins:");
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);
puts("");
printf("\n"
#ifdef ENABLE_ENCODER
puts("\n"
"Encoder plugins:");
"\n"
"Encoder plugins:\n");
encoder_plugins_for_each(plugin)
printf(" %s", plugin->name);
puts("");
printf("\n"
#endif
#ifdef ENABLE_ARCHIVE
puts("\n"
"Archive plugins:");
"\n"
"Archive plugins:\n");
archive_plugins_for_each(plugin) {
printf(" [%s]", plugin->name);
@@ -111,143 +188,218 @@ static void version(void)
for (; *suffixes != nullptr; ++suffixes)
printf(" %s", *suffixes);
puts("");
printf("\n");
}
printf(""
#endif
puts("\n"
"Input plugins:");
"\n"
"Input plugins:\n");
input_plugins_for_each(plugin)
printf(" %s", plugin->name);
puts("\n\n"
"Playlist plugins:");
printf("\n\n"
"Playlist plugins:\n");
playlist_plugins_for_each(plugin)
printf(" %s", plugin->name);
puts("\n\n"
"Protocols:");
printf("\n\n"
"Protocols:\n");
print_supported_uri_schemes_to_fp(stdout);
printf("\n"
"Other features:\n"
#ifdef HAVE_AVAHI
" avahi"
#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 const char *summary =
"Music Player Daemon - a daemon for playing music.";
gcc_pure
static AllocatedPath
PathBuildChecked(const AllocatedPath &a, PathTraits::const_pointer b)
static void PrintOption(const OptionDef &opt)
{
if (a.IsNull())
return AllocatedPath::Null();
return AllocatedPath::Build(a, b);
if (opt.HasShortOption())
printf(" -%c, --%-12s%s\n",
opt.GetShortOption(),
opt.GetLongOption(),
opt.GetDescription());
else
printf(" --%-16s%s\n",
opt.GetLongOption(),
opt.GetDescription());
}
bool
parse_cmdline(int argc, char **argv, struct options *options,
Error &error)
gcc_noreturn
static void help(void)
{
GOptionContext *context;
bool ret;
static gboolean option_version,
option_no_daemon,
option_no_config;
const GOptionEntry entries[] = {
{ "kill", 0, 0, G_OPTION_ARG_NONE, &options->kill,
"kill the currently running mpd session", nullptr },
{ "no-config", 0, 0, G_OPTION_ARG_NONE, &option_no_config,
"don't read from config", nullptr },
{ "no-daemon", 0, 0, G_OPTION_ARG_NONE, &option_no_daemon,
"don't detach from console", nullptr },
{ "stdout", 0, 0, G_OPTION_ARG_NONE, &options->log_stderr,
nullptr, nullptr },
{ "stderr", 0, 0, G_OPTION_ARG_NONE, &options->log_stderr,
"print messages to stderr", nullptr },
{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &options->verbose,
"verbose logging", nullptr },
{ "version", 'V', 0, G_OPTION_ARG_NONE, &option_version,
"print version number", nullptr },
{ nullptr, 0, 0, G_OPTION_ARG_NONE, nullptr, nullptr, nullptr }
};
printf("Usage:\n"
" mpd [OPTION...] [path/to/mpd.conf]\n"
"\n"
"Music Player Daemon - a daemon for playing music.\n"
"\n"
"Options:\n");
PrintOption(opt_help);
PrintOption(opt_kill);
PrintOption(opt_no_config);
PrintOption(opt_no_daemon);
PrintOption(opt_stderr);
PrintOption(opt_verbose);
PrintOption(opt_version);
exit(EXIT_SUCCESS);
}
class ConfigLoader
{
public:
bool TryFile(const Path path);
bool TryFile(const AllocatedPath &base_path,
PathTraitsFS::const_pointer_type path);
};
bool ConfigLoader::TryFile(Path path)
{
if (FileExists(path)) {
ReadConfigFile(path);
return true;
}
return false;
}
bool ConfigLoader::TryFile(const AllocatedPath &base_path,
PathTraitsFS::const_pointer_type path)
{
if (base_path.IsNull())
return false;
auto full_path = AllocatedPath::Build(base_path, path);
return TryFile(full_path);
}
void
ParseCommandLine(int argc, char **argv, struct options *options)
{
bool use_config_file = true;
options->kill = false;
options->daemon = true;
options->log_stderr = false;
options->verbose = false;
context = g_option_context_new("[path/to/mpd.conf]");
g_option_context_add_main_entries(context, entries, nullptr);
// First pass: handle command line options
OptionParser parser(argc, argv);
while (parser.HasEntries()) {
if (!parser.ParseNext())
continue;
if (parser.CheckOption(opt_kill)) {
options->kill = true;
continue;
}
if (parser.CheckOption(opt_no_config)) {
use_config_file = false;
continue;
}
if (parser.CheckOption(opt_no_daemon)) {
options->daemon = false;
continue;
}
if (parser.CheckOption(opt_stderr, opt_stdout)) {
options->log_stderr = true;
continue;
}
if (parser.CheckOption(opt_verbose)) {
options->verbose = true;
continue;
}
if (parser.CheckOption(opt_version))
version();
if (parser.CheckOption(opt_help, opt_help_alt))
help();
g_option_context_set_summary(context, summary);
GError *gerror = nullptr;
ret = g_option_context_parse(context, &argc, &argv, &gerror);
g_option_context_free(context);
if (!ret)
FatalError("option parsing failed", gerror);
if (option_version)
version();
throw FormatRuntimeError("invalid option: %s",
parser.GetOption());
}
/* initialize the logging library, so the configuration file
parser can use it already */
log_early_init(options->verbose);
options->daemon = !option_no_daemon;
if (option_no_config) {
if (!use_config_file) {
LogDebug(cmdline_domain,
"Ignoring config, using daemon defaults");
return true;
} else if (argc <= 1) {
/* default configuration file path */
#ifdef WIN32
AllocatedPath path = PathBuildChecked(AllocatedPath::FromUTF8(g_get_user_config_dir()),
CONFIG_FILE_LOCATION);
if (!path.IsNull() && FileExists(path))
return ReadConfigFile(path, error);
const char *const*system_config_dirs =
g_get_system_config_dirs();
for (unsigned i = 0; system_config_dirs[i] != nullptr; ++i) {
path = PathBuildChecked(AllocatedPath::FromUTF8(system_config_dirs[i]),
CONFIG_FILE_LOCATION);
if (!path.IsNull() && FileExists(path))
return ReadConfigFile(path, error);
}
#else
AllocatedPath path = PathBuildChecked(AllocatedPath::FromUTF8(g_get_user_config_dir()),
USER_CONFIG_FILE_LOCATION_XDG);
if (!path.IsNull() && FileExists(path))
return ReadConfigFile(path, error);
path = PathBuildChecked(AllocatedPath::FromUTF8(g_get_home_dir()),
USER_CONFIG_FILE_LOCATION1);
if (!path.IsNull() && FileExists(path))
return ReadConfigFile(path, error);
path = PathBuildChecked(AllocatedPath::FromUTF8(g_get_home_dir()),
USER_CONFIG_FILE_LOCATION2);
if (!path.IsNull() && FileExists(path))
return ReadConfigFile(path, error);
path = AllocatedPath::FromUTF8(SYSTEM_CONFIG_FILE_LOCATION);
if (!path.IsNull() && FileExists(path))
return ReadConfigFile(path, error);
#endif
error.Set(cmdline_domain, "No configuration file found");
return false;
} else if (argc == 2) {
/* specified configuration file */
return ReadConfigFile(Path::FromFS(argv[1]), error);
} else {
error.Set(cmdline_domain, "too many arguments");
return false;
return;
}
// Second pass: find non-option parameters (i.e. config file)
const char *config_file = nullptr;
for (int i = 1; i < argc; ++i) {
if (OptionParser::IsOption(argv[i]))
continue;
if (config_file == nullptr) {
config_file = argv[i];
continue;
}
throw std::runtime_error("too many arguments");
}
if (config_file != nullptr) {
/* use specified configuration file */
#ifdef _UNICODE
wchar_t buffer[MAX_PATH];
auto result = MultiByteToWideChar(CP_ACP, 0, config_file, -1,
buffer, ARRAY_SIZE(buffer));
if (result <= 0)
throw MakeLastError("MultiByteToWideChar() failed");
ReadConfigFile(Path::FromFS(buffer));
#else
ReadConfigFile(Path::FromFS(config_file));
#endif
return;
}
/* use default configuration file path */
ConfigLoader loader;
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-2013 The Music Player Daemon Project
* Copyright 2003-2017 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -20,19 +20,14 @@
#ifndef MPD_COMMAND_LINE_HXX
#define MPD_COMMAND_LINE_HXX
#include <glib.h>
class Error;
struct options {
gboolean kill;
gboolean daemon;
gboolean log_stderr;
gboolean verbose;
bool kill;
bool daemon;
bool log_stderr;
bool verbose;
};
bool
parse_cmdline(int argc, char **argv, struct options *options,
Error &error);
void
ParseCommandLine(int argc, char **argv, struct options *options);
#endif

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2013 The Music Player Daemon Project
* Copyright 2003-2017 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -20,34 +20,62 @@
#ifndef COMPILER_H
#define COMPILER_H
#define GCC_CHECK_VERSION(major, minor) \
(defined(__GNUC__) && \
(__GNUC__ > (major) || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor))))
#define GCC_MAKE_VERSION(major, minor, patchlevel) ((major) * 10000 + (minor) * 100 + patchlevel)
#ifdef __GNUC__
#define GCC_VERSION (__GNUC__ * 10000 \
+ __GNUC_MINOR__ * 100 \
+ __GNUC_PATCHLEVEL__)
#define GCC_VERSION GCC_MAKE_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
#else
#define GCC_VERSION 0
#endif
#ifdef __clang__
# define CLANG_VERSION (__clang_major__ * 10000 \
+ __clang_minor__ * 100 \
+ __clang_patchlevel__)
# define CLANG_VERSION GCC_MAKE_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__)
#elif defined(__GNUC__)
# define CLANG_VERSION 0
#endif
/**
* Are we building with the specified version of gcc (not clang or any
* other compiler) or newer?
*/
#define GCC_CHECK_VERSION(major, minor) \
(CLANG_VERSION == 0 && \
GCC_VERSION >= GCC_MAKE_VERSION(major, minor, 0))
/**
* Are we building with clang (any version) or at least the specified
* gcc version?
*/
#define CLANG_OR_GCC_VERSION(major, minor) \
(CLANG_VERSION > 0 || GCC_CHECK_VERSION(major, minor))
/**
* Are we building with gcc (not clang or any other compiler) and a
* version older than the specified one?
*/
#define GCC_OLDER_THAN(major, minor) \
(GCC_VERSION > 0 && CLANG_VERSION == 0 && \
GCC_VERSION < GCC_MAKE_VERSION(major, minor, 0))
#ifdef __clang__
# if __clang_major__ < 3
# error Sorry, your clang version is too old. You need at least version 3.1.
# endif
#elif defined(__GNUC__)
# if !GCC_CHECK_VERSION(4,6)
# error Sorry, your gcc version is too old. You need at least version 4.6.
# if GCC_OLDER_THAN(4,9)
# error Sorry, your gcc version is too old. You need at least version 4.9.
# endif
#else
# warning Untested compiler. Use at your own risk!
#endif
#if GCC_CHECK_VERSION(4,0)
/**
* Are we building with the specified version of clang or newer?
*/
#define CLANG_CHECK_VERSION(major, minor) \
(CLANG_VERSION >= GCC_MAKE_VERSION(major, minor, 0))
#if CLANG_OR_GCC_VERSION(4,0)
/* GCC 4.x */
@@ -69,8 +97,6 @@
#define gcc_likely(x) __builtin_expect (!!(x), 1)
#define gcc_unlikely(x) __builtin_expect (!!(x), 0)
#define gcc_aligned(n) __attribute__((aligned(n)))
#define gcc_visibility_hidden __attribute__((visibility("hidden")))
#define gcc_visibility_default __attribute__((visibility("default")))
@@ -98,8 +124,6 @@
#define gcc_likely(x) (x)
#define gcc_unlikely(x) (x)
#define gcc_aligned(n)
#define gcc_visibility_hidden
#define gcc_visibility_default
@@ -107,7 +131,7 @@
#endif
#if GCC_CHECK_VERSION(4,3)
#if CLANG_OR_GCC_VERSION(4,3)
#define gcc_hot __attribute__((hot))
#define gcc_cold __attribute__((cold))
@@ -119,7 +143,7 @@
#endif /* ! GCC_UNUSED >= 40300 */
#if GCC_CHECK_VERSION(4,6) && !defined(__clang__)
#if GCC_CHECK_VERSION(4,6)
#define gcc_flatten __attribute__((flatten))
#else
#define gcc_flatten
@@ -128,7 +152,7 @@
#ifndef __cplusplus
/* plain C99 has "restrict" */
#define gcc_restrict restrict
#elif GCC_CHECK_VERSION(4,0)
#elif CLANG_OR_GCC_VERSION(4,0)
/* "__restrict__" is a GCC extension for C++ */
#define gcc_restrict __restrict__
#else
@@ -136,24 +160,6 @@
#define gcc_restrict
#endif
/* C++11 features */
#if defined(__cplusplus)
/* support for C++11 "override" was added in gcc 4.7 */
#if !defined(__clang__) && !GCC_CHECK_VERSION(4,7)
#define override
#define final
#endif
#if defined(__clang__) || GCC_CHECK_VERSION(4,8)
#define gcc_alignas(T, fallback) alignas(T)
#else
#define gcc_alignas(T, fallback) gcc_aligned(fallback)
#endif
#endif
#ifndef __has_feature
// define dummy macro for non-clang compilers
#define __has_feature(x) 0

View File

@@ -1,272 +0,0 @@
/*
* Copyright (C) 2003-2013 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 "ConfigFile.hxx"
#include "ConfigError.hxx"
#include "ConfigData.hxx"
#include "ConfigTemplates.hxx"
#include "util/Tokenizer.hxx"
#include "util/StringUtil.hxx"
#include "util/Error.hxx"
#include "util/Domain.hxx"
#include "fs/Limits.hxx"
#include "fs/Path.hxx"
#include "fs/FileSystem.hxx"
#include "Log.hxx"
#include <assert.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#define MAX_STRING_SIZE MPD_PATH_MAX+80
#define CONF_COMMENT '#'
static constexpr Domain config_file_domain("config_file");
static bool
config_read_name_value(struct config_param *param, char *input, unsigned line,
Error &error)
{
Tokenizer tokenizer(input);
const char *name = tokenizer.NextWord(error);
if (name == nullptr) {
assert(!tokenizer.IsEnd());
return false;
}
const char *value = tokenizer.NextString(error);
if (value == nullptr) {
if (tokenizer.IsEnd()) {
error.Set(config_file_domain, "Value missing");
} else {
assert(error.IsDefined());
}
return false;
}
if (!tokenizer.IsEnd() && tokenizer.CurrentChar() != CONF_COMMENT) {
error.Set(config_file_domain, "Unknown tokens after value");
return false;
}
const struct block_param *bp = param->GetBlockParam(name);
if (bp != nullptr) {
error.Format(config_file_domain,
"\"%s\" is duplicate, first defined on line %i",
name, bp->line);
return false;
}
param->AddBlockParam(name, value, line);
return true;
}
static struct config_param *
config_read_block(FILE *fp, int *count, char *string, Error &error)
{
struct config_param *ret = new config_param(*count);
while (true) {
char *line;
line = fgets(string, MAX_STRING_SIZE, fp);
if (line == nullptr) {
delete ret;
error.Set(config_file_domain,
"Expected '}' before end-of-file");
return nullptr;
}
(*count)++;
line = strchug_fast(line);
if (*line == 0 || *line == CONF_COMMENT)
continue;
if (*line == '}') {
/* end of this block; return from the function
(and from this "while" loop) */
line = strchug_fast(line + 1);
if (*line != 0 && *line != CONF_COMMENT) {
delete ret;
error.Format(config_file_domain,
"line %i: Unknown tokens after '}'",
*count);
return nullptr;
}
return ret;
}
/* parse name and value */
if (!config_read_name_value(ret, line, *count, error)) {
assert(*line != 0);
delete ret;
error.FormatPrefix("line %i: ", *count);
return nullptr;
}
}
}
gcc_nonnull_all
static void
Append(config_param *&head, config_param *p)
{
assert(p->next == nullptr);
config_param **i = &head;
while (*i != nullptr)
i = &(*i)->next;
*i = p;
}
static bool
ReadConfigFile(ConfigData &config_data, FILE *fp, Error &error)
{
assert(fp != nullptr);
char string[MAX_STRING_SIZE + 1];
int count = 0;
struct config_param *param;
while (fgets(string, MAX_STRING_SIZE, fp)) {
char *line;
const char *name, *value;
count++;
line = strchug_fast(string);
if (*line == 0 || *line == CONF_COMMENT)
continue;
/* the first token in each line is the name, followed
by either the value or '{' */
Tokenizer tokenizer(line);
name = tokenizer.NextWord(error);
if (name == nullptr) {
assert(!tokenizer.IsEnd());
error.FormatPrefix("line %i: ", count);
return false;
}
/* get the definition of that option, and check the
"repeatable" flag */
const ConfigOption o = ParseConfigOptionName(name);
if (o == CONF_MAX) {
error.Format(config_file_domain,
"unrecognized parameter in config file at "
"line %i: %s\n", count, name);
return false;
}
const unsigned i = unsigned(o);
const ConfigTemplate &option = config_templates[i];
config_param *&head = config_data.params[i];
if (head != nullptr && !option.repeatable) {
param = head;
error.Format(config_file_domain,
"config parameter \"%s\" is first defined "
"on line %i and redefined on line %i\n",
name, param->line, count);
return false;
}
/* now parse the block or the value */
if (option.block) {
/* it's a block, call config_read_block() */
if (tokenizer.CurrentChar() != '{') {
error.Format(config_file_domain,
"line %i: '{' expected", count);
return false;
}
line = strchug_fast(tokenizer.Rest() + 1);
if (*line != 0 && *line != CONF_COMMENT) {
error.Format(config_file_domain,
"line %i: Unknown tokens after '{'",
count);
return false;
}
param = config_read_block(fp, &count, string, error);
if (param == nullptr) {
return false;
}
} else {
/* a string value */
value = tokenizer.NextString(error);
if (value == nullptr) {
if (tokenizer.IsEnd())
error.Format(config_file_domain,
"line %i: Value missing",
count);
else
error.FormatPrefix("line %i: ", count);
return false;
}
if (!tokenizer.IsEnd() &&
tokenizer.CurrentChar() != CONF_COMMENT) {
error.Format(config_file_domain,
"line %i: Unknown tokens after value",
count);
return false;
}
param = new config_param(value, count);
}
Append(head, param);
}
return true;
}
bool
ReadConfigFile(ConfigData &config_data, Path path, Error &error)
{
assert(!path.IsNull());
const std::string path_utf8 = path.ToUTF8();
FormatDebug(config_file_domain, "loading file %s", path_utf8.c_str());
FILE *fp = FOpen(path, FOpenMode::ReadText);
if (fp == nullptr) {
error.FormatErrno("Failed to open %s", path_utf8.c_str());
return false;
}
bool result = ReadConfigFile(config_data, fp, error);
fclose(fp);
return result;
}

View File

@@ -1,90 +0,0 @@
/*
* Copyright (C) 2003-2013 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_CONFIG_OPTION_HXX
#define MPD_CONFIG_OPTION_HXX
#include "Compiler.h"
enum ConfigOption {
CONF_MUSIC_DIR,
CONF_PLAYLIST_DIR,
CONF_FOLLOW_INSIDE_SYMLINKS,
CONF_FOLLOW_OUTSIDE_SYMLINKS,
CONF_DB_FILE,
CONF_STICKER_FILE,
CONF_LOG_FILE,
CONF_PID_FILE,
CONF_STATE_FILE,
CONF_RESTORE_PAUSED,
CONF_USER,
CONF_GROUP,
CONF_BIND_TO_ADDRESS,
CONF_PORT,
CONF_LOG_LEVEL,
CONF_ZEROCONF_NAME,
CONF_ZEROCONF_ENABLED,
CONF_PASSWORD,
CONF_DEFAULT_PERMS,
CONF_AUDIO_OUTPUT,
CONF_AUDIO_OUTPUT_FORMAT,
CONF_MIXER_TYPE,
CONF_REPLAYGAIN,
CONF_REPLAYGAIN_PREAMP,
CONF_REPLAYGAIN_MISSING_PREAMP,
CONF_REPLAYGAIN_LIMIT,
CONF_VOLUME_NORMALIZATION,
CONF_SAMPLERATE_CONVERTER,
CONF_AUDIO_BUFFER_SIZE,
CONF_BUFFER_BEFORE_PLAY,
CONF_HTTP_PROXY_HOST,
CONF_HTTP_PROXY_PORT,
CONF_HTTP_PROXY_USER,
CONF_HTTP_PROXY_PASSWORD,
CONF_CONN_TIMEOUT,
CONF_MAX_CONN,
CONF_MAX_PLAYLIST_LENGTH,
CONF_MAX_COMMAND_LIST_SIZE,
CONF_MAX_OUTPUT_BUFFER_SIZE,
CONF_FS_CHARSET,
CONF_ID3V1_ENCODING,
CONF_METADATA_TO_USE,
CONF_SAVE_ABSOLUTE_PATHS,
CONF_DECODER,
CONF_INPUT,
CONF_GAPLESS_MP3_PLAYBACK,
CONF_PLAYLIST_PLUGIN,
CONF_AUTO_UPDATE,
CONF_AUTO_UPDATE_DEPTH,
CONF_DESPOTIFY_USER,
CONF_DESPOTIFY_PASSWORD,
CONF_DESPOTIFY_HIGH_BITRATE,
CONF_AUDIO_FILTER,
CONF_DATABASE,
CONF_MAX
};
/**
* @return #CONF_MAX if not found
*/
gcc_pure
enum ConfigOption
ParseConfigOptionName(const char *name);
#endif

View File

@@ -1,96 +0,0 @@
/*
* Copyright (C) 2003-2013 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 "ConfigTemplates.hxx"
#include "ConfigOption.hxx"
#include <string.h>
const ConfigTemplate config_templates[] = {
{ "music_directory", false, false },
{ "playlist_directory", false, false },
{ "follow_inside_symlinks", false, false },
{ "follow_outside_symlinks", false, false },
{ "db_file", false, false },
{ "sticker_file", false, false },
{ "log_file", false, false },
{ "pid_file", false, false },
{ "state_file", false, false },
{ "restore_paused", false, false },
{ "user", false, false },
{ "group", false, false },
{ "bind_to_address", true, false },
{ "port", false, false },
{ "log_level", false, false },
{ "zeroconf_name", false, false },
{ "zeroconf_enabled", false, false },
{ "password", true, false },
{ "default_permissions", false, false },
{ "audio_output", true, true },
{ "audio_output_format", false, false },
{ "mixer_type", false, false },
{ "replaygain", false, false },
{ "replaygain_preamp", false, false },
{ "replaygain_missing_preamp", false, false },
{ "replaygain_limit", false, false },
{ "volume_normalization", false, false },
{ "samplerate_converter", false, false },
{ "audio_buffer_size", false, false },
{ "buffer_before_play", false, false },
{ "http_proxy_host", false, false },
{ "http_proxy_port", false, false },
{ "http_proxy_user", false, false },
{ "http_proxy_password", false, false },
{ "connection_timeout", false, false },
{ "max_connections", false, false },
{ "max_playlist_length", false, false },
{ "max_command_list_size", false, false },
{ "max_output_buffer_size", false, false },
{ "filesystem_charset", false, false },
{ "id3v1_encoding", false, false },
{ "metadata_to_use", false, false },
{ "save_absolute_paths_in_playlists", false, false },
{ "decoder", true, true },
{ "input", true, true },
{ "gapless_mp3_playback", false, false },
{ "playlist_plugin", true, true },
{ "auto_update", false, false },
{ "auto_update_depth", false, false },
{ "despotify_user", false, false },
{ "despotify_password", false, false},
{ "despotify_high_bitrate", false, false },
{ "filter", true, true },
{ "database", false, true },
};
static constexpr unsigned n_config_templates =
sizeof(config_templates) / sizeof(config_templates[0]);
static_assert(n_config_templates == unsigned(CONF_MAX),
"Wrong number of config_templates");
ConfigOption
ParseConfigOptionName(const char *name)
{
for (unsigned i = 0; i < n_config_templates; ++i)
if (strcmp(config_templates[i].name, name) == 0)
return ConfigOption(i);
return CONF_MAX;
}

View File

@@ -1,159 +0,0 @@
/*
* Copyright (C) 2003-2013 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 "DatabaseGlue.hxx"
#include "DatabaseSimple.hxx"
#include "DatabaseRegistry.hxx"
#include "DatabaseSave.hxx"
#include "DatabaseError.hxx"
#include "Directory.hxx"
#include "util/Error.hxx"
#include "ConfigData.hxx"
#include "Stats.hxx"
#include "DatabasePlugin.hxx"
#include "db/SimpleDatabasePlugin.hxx"
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <assert.h>
#include <string.h>
#include <errno.h>
static Database *db;
static bool db_is_open;
static bool is_simple;
bool
DatabaseGlobalInit(const config_param &param, Error &error)
{
assert(db == nullptr);
assert(!db_is_open);
const char *plugin_name =
param.GetBlockValue("plugin", "simple");
is_simple = strcmp(plugin_name, "simple") == 0;
const DatabasePlugin *plugin = GetDatabasePluginByName(plugin_name);
if (plugin == nullptr) {
error.Format(db_domain,
"No such database plugin: %s", plugin_name);
return false;
}
db = plugin->create(param, error);
return db != nullptr;
}
void
DatabaseGlobalDeinit(void)
{
if (db_is_open)
db->Close();
if (db != nullptr)
delete db;
}
const Database *
GetDatabase()
{
assert(db == nullptr || db_is_open);
return db;
}
const Database *
GetDatabase(Error &error)
{
assert(db == nullptr || db_is_open);
if (db == nullptr)
error.Set(db_domain, DB_DISABLED, "No database");
return db;
}
bool
db_is_simple(void)
{
assert(db == nullptr || db_is_open);
return is_simple;
}
Directory *
db_get_root(void)
{
assert(db != nullptr);
assert(db_is_simple());
return ((SimpleDatabase *)db)->GetRoot();
}
Directory *
db_get_directory(const char *name)
{
if (db == nullptr)
return nullptr;
Directory *music_root = db_get_root();
if (name == nullptr)
return music_root;
return music_root->LookupDirectory(name);
}
bool
db_save(Error &error)
{
assert(db != nullptr);
assert(db_is_open);
assert(db_is_simple());
return ((SimpleDatabase *)db)->Save(error);
}
bool
DatabaseGlobalOpen(Error &error)
{
assert(db != nullptr);
assert(!db_is_open);
if (!db->Open(error))
return false;
db_is_open = true;
stats_update();
return true;
}
bool
db_exists()
{
assert(db != nullptr);
assert(db_is_open);
assert(db_is_simple());
return ((SimpleDatabase *)db)->GetUpdateStamp() > 0;
}

View File

@@ -1,59 +0,0 @@
/*
* Copyright (C) 2003-2013 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_DATABASE_GLUE_HXX
#define MPD_DATABASE_GLUE_HXX
#include "Compiler.h"
struct config_param;
class Database;
class Error;
/**
* Initialize the database library.
*
* @param param the database configuration block
*/
bool
DatabaseGlobalInit(const config_param &param, Error &error);
void
DatabaseGlobalDeinit(void);
bool
DatabaseGlobalOpen(Error &error);
/**
* Returns the global #Database instance. May return nullptr if this MPD
* configuration has no database (no music_directory was configured).
*/
gcc_pure
const Database *
GetDatabase();
/**
* Returns the global #Database instance. May return nullptr if this MPD
* configuration has no database (no music_directory was configured).
*/
gcc_pure
const Database *
GetDatabase(Error &error);
#endif

View File

@@ -1,156 +0,0 @@
/*
* Copyright (C) 2003-2013 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.
*/
/** \file
*
* This header declares the db_plugin class. It describes a
* plugin API for databases of song metadata.
*/
#ifndef MPD_DATABASE_PLUGIN_HXX
#define MPD_DATABASE_PLUGIN_HXX
#include "DatabaseVisitor.hxx"
#include "tag/TagType.h"
#include "Compiler.h"
#include <time.h>
struct config_param;
struct DatabaseSelection;
struct db_visitor;
struct Song;
class Error;
struct DatabaseStats {
/**
* Number of songs.
*/
unsigned song_count;
/**
* Total duration of all songs (in seconds).
*/
unsigned long total_duration;
/**
* Number of distinct artist names.
*/
unsigned artist_count;
/**
* Number of distinct album names.
*/
unsigned album_count;
void Clear() {
song_count = 0;
total_duration = 0;
artist_count = album_count = 0;
}
};
class Database {
public:
/**
* Free instance data.
*/
virtual ~Database() {}
/**
* Open the database. Read it into memory if applicable.
*/
virtual bool Open(gcc_unused Error &error) {
return true;
}
/**
* Close the database, free allocated memory.
*/
virtual void Close() {}
/**
* Look up a song (including tag data) in the database. When
* you don't need this anymore, call ReturnSong().
*
* @param uri_utf8 the URI of the song within the music
* directory (UTF-8)
*/
virtual Song *GetSong(const char *uri_utf8,
Error &error) const = 0;
/**
* Mark the song object as "unused". Call this on objects
* returned by GetSong().
*/
virtual void ReturnSong(Song *song) const = 0;
/**
* Visit the selected entities.
*/
virtual bool Visit(const DatabaseSelection &selection,
VisitDirectory visit_directory,
VisitSong visit_song,
VisitPlaylist visit_playlist,
Error &error) const = 0;
bool Visit(const DatabaseSelection &selection,
VisitDirectory visit_directory,
VisitSong visit_song,
Error &error) const {
return Visit(selection, visit_directory, visit_song,
VisitPlaylist(), error);
}
bool Visit(const DatabaseSelection &selection, VisitSong visit_song,
Error &error) const {
return Visit(selection, VisitDirectory(), visit_song, error);
}
/**
* Visit all unique tag values.
*/
virtual bool VisitUniqueTags(const DatabaseSelection &selection,
TagType tag_type,
VisitString visit_string,
Error &error) const = 0;
virtual bool GetStats(const DatabaseSelection &selection,
DatabaseStats &stats,
Error &error) const = 0;
/**
* Returns the time stamp of the last database update.
* Returns 0 if that is not not known/available.
*/
gcc_pure
virtual time_t GetUpdateStamp() const = 0;
};
struct DatabasePlugin {
const char *name;
/**
* Allocates and configures a database.
*/
Database *(*create)(const config_param &param,
Error &error);
};
#endif

View File

@@ -1,241 +0,0 @@
/*
* Copyright (C) 2003-2013 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 "DatabasePrint.hxx"
#include "DatabaseSelection.hxx"
#include "SongFilter.hxx"
#include "PlaylistVector.hxx"
#include "SongPrint.hxx"
#include "TimePrint.hxx"
#include "Directory.hxx"
#include "Client.hxx"
#include "tag/Tag.hxx"
#include "Song.hxx"
#include "DatabaseGlue.hxx"
#include "DatabasePlugin.hxx"
#include <functional>
static bool
PrintDirectoryBrief(Client &client, const Directory &directory)
{
if (!directory.IsRoot())
client_printf(client, "directory: %s\n", directory.GetPath());
return true;
}
static bool
PrintDirectoryFull(Client &client, const Directory &directory)
{
if (!directory.IsRoot()) {
client_printf(client, "directory: %s\n", directory.GetPath());
time_print(client, "Last-Modified", directory.mtime);
}
return true;
}
static void
print_playlist_in_directory(Client &client,
const Directory &directory,
const char *name_utf8)
{
if (directory.IsRoot())
client_printf(client, "playlist: %s\n", name_utf8);
else
client_printf(client, "playlist: %s/%s\n",
directory.GetPath(), name_utf8);
}
static bool
PrintSongBrief(Client &client, const Song &song)
{
assert(song.parent != nullptr);
song_print_uri(client, song);
if (song.tag != nullptr && song.tag->has_playlist)
/* this song file has an embedded CUE sheet */
print_playlist_in_directory(client, *song.parent, song.uri);
return true;
}
static bool
PrintSongFull(Client &client, const Song &song)
{
assert(song.parent != nullptr);
song_print_info(client, song);
if (song.tag != nullptr && song.tag->has_playlist)
/* this song file has an embedded CUE sheet */
print_playlist_in_directory(client, *song.parent, song.uri);
return true;
}
static bool
PrintPlaylistBrief(Client &client,
const PlaylistInfo &playlist,
const Directory &directory)
{
print_playlist_in_directory(client, directory, playlist.name.c_str());
return true;
}
static bool
PrintPlaylistFull(Client &client,
const PlaylistInfo &playlist,
const Directory &directory)
{
print_playlist_in_directory(client, directory, playlist.name.c_str());
if (playlist.mtime > 0)
time_print(client, "Last-Modified", playlist.mtime);
return true;
}
bool
db_selection_print(Client &client, const DatabaseSelection &selection,
bool full, Error &error)
{
const Database *db = GetDatabase(error);
if (db == nullptr)
return false;
using namespace std::placeholders;
const auto d = selection.filter == nullptr
? std::bind(full ? PrintDirectoryFull : PrintDirectoryBrief,
std::ref(client), _1)
: VisitDirectory();
const auto s = std::bind(full ? PrintSongFull : PrintSongBrief,
std::ref(client), _1);
const auto p = selection.filter == nullptr
? std::bind(full ? PrintPlaylistFull : PrintPlaylistBrief,
std::ref(client), _1, _2)
: VisitPlaylist();
return db->Visit(selection, d, s, p, error);
}
struct SearchStats {
int numberOfSongs;
unsigned long playTime;
};
static void printSearchStats(Client &client, SearchStats *stats)
{
client_printf(client, "songs: %i\n", stats->numberOfSongs);
client_printf(client, "playtime: %li\n", stats->playTime);
}
static bool
stats_visitor_song(SearchStats &stats, Song &song)
{
stats.numberOfSongs++;
stats.playTime += song.GetDuration();
return true;
}
bool
searchStatsForSongsIn(Client &client, const char *name,
const SongFilter *filter,
Error &error)
{
const Database *db = GetDatabase(error);
if (db == nullptr)
return false;
const DatabaseSelection selection(name, true, filter);
SearchStats stats;
stats.numberOfSongs = 0;
stats.playTime = 0;
using namespace std::placeholders;
const auto f = std::bind(stats_visitor_song, std::ref(stats),
_1);
if (!db->Visit(selection, f, error))
return false;
printSearchStats(client, &stats);
return true;
}
bool
printAllIn(Client &client, const char *uri_utf8, Error &error)
{
const DatabaseSelection selection(uri_utf8, true);
return db_selection_print(client, selection, false, error);
}
bool
printInfoForAllIn(Client &client, const char *uri_utf8,
Error &error)
{
const DatabaseSelection selection(uri_utf8, true);
return db_selection_print(client, selection, true, error);
}
static bool
PrintSongURIVisitor(Client &client, Song &song)
{
song_print_uri(client, song);
return true;
}
static bool
PrintUniqueTag(Client &client, TagType tag_type,
const char *value)
{
client_printf(client, "%s: %s\n", tag_item_names[tag_type], value);
return true;
}
bool
listAllUniqueTags(Client &client, int type,
const SongFilter *filter,
Error &error)
{
const Database *db = GetDatabase(error);
if (db == nullptr)
return false;
const DatabaseSelection selection("", true, filter);
if (type == LOCATE_TAG_FILE_TYPE) {
using namespace std::placeholders;
const auto f = std::bind(PrintSongURIVisitor,
std::ref(client), _1);
return db->Visit(selection, f, error);
} else {
using namespace std::placeholders;
const auto f = std::bind(PrintUniqueTag, std::ref(client),
(TagType)type, _1);
return db->VisitUniqueTags(selection, (TagType)type,
f, error);
}
}

View File

@@ -1,157 +0,0 @@
/*
* Copyright (C) 2003-2013 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 "DatabaseSave.hxx"
#include "DatabaseLock.hxx"
#include "DatabaseError.hxx"
#include "Directory.hxx"
#include "DirectorySave.hxx"
#include "Song.hxx"
#include "TextFile.hxx"
#include "tag/Tag.hxx"
#include "tag/TagSettings.h"
#include "fs/Charset.hxx"
#include "util/Error.hxx"
#include "Log.hxx"
#include <glib.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#define DIRECTORY_INFO_BEGIN "info_begin"
#define DIRECTORY_INFO_END "info_end"
#define DB_FORMAT_PREFIX "format: "
#define DIRECTORY_MPD_VERSION "mpd_version: "
#define DIRECTORY_FS_CHARSET "fs_charset: "
#define DB_TAG_PREFIX "tag: "
static constexpr unsigned DB_FORMAT = 1;
void
db_save_internal(FILE *fp, const Directory &music_root)
{
fprintf(fp, "%s\n", DIRECTORY_INFO_BEGIN);
fprintf(fp, DB_FORMAT_PREFIX "%u\n", DB_FORMAT);
fprintf(fp, "%s%s\n", DIRECTORY_MPD_VERSION, VERSION);
fprintf(fp, "%s%s\n", DIRECTORY_FS_CHARSET, GetFSCharset());
for (unsigned i = 0; i < TAG_NUM_OF_ITEM_TYPES; ++i)
if (!ignore_tag_items[i])
fprintf(fp, DB_TAG_PREFIX "%s\n", tag_item_names[i]);
fprintf(fp, "%s\n", DIRECTORY_INFO_END);
directory_save(fp, music_root);
}
bool
db_load_internal(TextFile &file, Directory &music_root, Error &error)
{
char *line;
unsigned format = 0;
bool found_charset = false, found_version = false;
bool success;
bool tags[TAG_NUM_OF_ITEM_TYPES];
/* get initial info */
line = file.ReadLine();
if (line == nullptr || strcmp(DIRECTORY_INFO_BEGIN, line) != 0) {
error.Set(db_domain, "Database corrupted");
return false;
}
memset(tags, false, sizeof(tags));
while ((line = file.ReadLine()) != nullptr &&
strcmp(line, DIRECTORY_INFO_END) != 0) {
if (g_str_has_prefix(line, DB_FORMAT_PREFIX)) {
format = atoi(line + sizeof(DB_FORMAT_PREFIX) - 1);
} else if (g_str_has_prefix(line, DIRECTORY_MPD_VERSION)) {
if (found_version) {
error.Set(db_domain, "Duplicate version line");
return false;
}
found_version = true;
} else if (g_str_has_prefix(line, DIRECTORY_FS_CHARSET)) {
const char *new_charset;
if (found_charset) {
error.Set(db_domain, "Duplicate charset line");
return false;
}
found_charset = true;
new_charset = line + sizeof(DIRECTORY_FS_CHARSET) - 1;
const char *const old_charset = GetFSCharset();
if (*old_charset != 0
&& strcmp(new_charset, old_charset) != 0) {
error.Format(db_domain,
"Existing database has charset "
"\"%s\" instead of \"%s\"; "
"discarding database file",
new_charset, old_charset);
return false;
}
} else if (g_str_has_prefix(line, DB_TAG_PREFIX)) {
const char *name = line + sizeof(DB_TAG_PREFIX) - 1;
TagType tag = tag_name_parse(name);
if (tag == TAG_NUM_OF_ITEM_TYPES) {
error.Format(db_domain,
"Unrecognized tag '%s', "
"discarding database file",
name);
return false;
}
tags[tag] = true;
} else {
error.Format(db_domain, "Malformed line: %s", line);
return false;
}
}
if (format != DB_FORMAT) {
error.Set(db_domain,
"Database format mismatch, "
"discarding database file");
return false;
}
for (unsigned i = 0; i < TAG_NUM_OF_ITEM_TYPES; ++i) {
if (!ignore_tag_items[i] && !tags[i]) {
error.Set(db_domain,
"Tag list mismatch, "
"discarding database file");
return false;
}
}
LogDebug(db_domain, "reading DB");
db_lock();
success = directory_load(file, music_root, error);
db_unlock();
return success;
}

View File

@@ -1,74 +0,0 @@
/*
* Copyright (C) 2003-2013 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_DATABASE_SIMPLE_HXX
#define MPD_DATABASE_SIMPLE_HXX
#include "Compiler.h"
#include <sys/time.h>
struct config_param;
struct Directory;
struct db_selection;
struct db_visitor;
class Error;
/**
* Check whether the default #SimpleDatabasePlugin is used. This
* allows using db_get_root(), db_save(), db_get_mtime() and
* db_exists().
*/
bool
db_is_simple(void);
/**
* Returns the root directory object. Returns NULL if there is no
* configured music directory.
*
* May only be used if db_is_simple() returns true.
*/
gcc_pure
Directory *
db_get_root(void);
/**
* Caller must lock the #db_mutex.
*/
gcc_nonnull(1)
gcc_pure
Directory *
db_get_directory(const char *name);
/**
* May only be used if db_is_simple() returns true.
*/
bool
db_save(Error &error);
/**
* Returns true if there is a valid database file on the disk.
*
* May only be used if db_is_simple() returns true.
*/
gcc_pure
bool
db_exists();
#endif

View File

@@ -1,547 +0,0 @@
/*
* Copyright (C) 2003-2013 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 "DecoderAPI.hxx"
#include "DecoderError.hxx"
#include "AudioConfig.hxx"
#include "ReplayGainConfig.hxx"
#include "MusicChunk.hxx"
#include "MusicBuffer.hxx"
#include "MusicPipe.hxx"
#include "DecoderControl.hxx"
#include "DecoderInternal.hxx"
#include "Song.hxx"
#include "InputStream.hxx"
#include "util/Error.hxx"
#include "Log.hxx"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
void
decoder_initialized(Decoder &decoder,
const AudioFormat audio_format,
bool seekable, float total_time)
{
DecoderControl &dc = decoder.dc;
struct audio_format_string af_string;
assert(dc.state == DecoderState::START);
assert(dc.pipe != nullptr);
assert(decoder.stream_tag == nullptr);
assert(decoder.decoder_tag == nullptr);
assert(!decoder.seeking);
assert(audio_format.IsDefined());
assert(audio_format.IsValid());
dc.in_audio_format = audio_format;
dc.out_audio_format = getOutputAudioFormat(audio_format);
dc.seekable = seekable;
dc.total_time = total_time;
dc.Lock();
dc.state = DecoderState::DECODE;
dc.client_cond.signal();
dc.Unlock();
FormatDebug(decoder_domain, "audio_format=%s, seekable=%s",
audio_format_to_string(dc.in_audio_format, &af_string),
seekable ? "true" : "false");
if (dc.in_audio_format != dc.out_audio_format)
FormatDebug(decoder_domain, "converting to %s",
audio_format_to_string(dc.out_audio_format,
&af_string));
}
/**
* Checks if we need an "initial seek". If so, then the initial seek
* is prepared, and the function returns true.
*/
gcc_pure
static bool
decoder_prepare_initial_seek(Decoder &decoder)
{
const DecoderControl &dc = decoder.dc;
assert(dc.pipe != nullptr);
if (dc.state != DecoderState::DECODE)
/* wait until the decoder has finished initialisation
(reading file headers etc.) before emitting the
virtual "SEEK" command */
return false;
if (decoder.initial_seek_running)
/* initial seek has already begun - override any other
command */
return true;
if (decoder.initial_seek_pending) {
if (!dc.seekable) {
/* seeking is not possible */
decoder.initial_seek_pending = false;
return false;
}
if (dc.command == DecoderCommand::NONE) {
/* begin initial seek */
decoder.initial_seek_pending = false;
decoder.initial_seek_running = true;
return true;
}
/* skip initial seek when there's another command
(e.g. STOP) */
decoder.initial_seek_pending = false;
}
return false;
}
/**
* Returns the current decoder command. May return a "virtual"
* synthesized command, e.g. to seek to the beginning of the CUE
* track.
*/
gcc_pure
static DecoderCommand
decoder_get_virtual_command(Decoder &decoder)
{
const DecoderControl &dc = decoder.dc;
assert(dc.pipe != nullptr);
if (decoder_prepare_initial_seek(decoder))
return DecoderCommand::SEEK;
return dc.command;
}
DecoderCommand
decoder_get_command(Decoder &decoder)
{
return decoder_get_virtual_command(decoder);
}
void
decoder_command_finished(Decoder &decoder)
{
DecoderControl &dc = decoder.dc;
dc.Lock();
assert(dc.command != DecoderCommand::NONE ||
decoder.initial_seek_running);
assert(dc.command != DecoderCommand::SEEK ||
decoder.initial_seek_running ||
dc.seek_error || decoder.seeking);
assert(dc.pipe != nullptr);
if (decoder.initial_seek_running) {
assert(!decoder.seeking);
assert(decoder.chunk == nullptr);
assert(dc.pipe->IsEmpty());
decoder.initial_seek_running = false;
decoder.timestamp = dc.start_ms / 1000.;
dc.Unlock();
return;
}
if (decoder.seeking) {
decoder.seeking = false;
/* delete frames from the old song position */
if (decoder.chunk != nullptr) {
dc.buffer->Return(decoder.chunk);
decoder.chunk = nullptr;
}
dc.pipe->Clear(*dc.buffer);
decoder.timestamp = dc.seek_where;
}
dc.command = DecoderCommand::NONE;
dc.client_cond.signal();
dc.Unlock();
}
double decoder_seek_where(gcc_unused Decoder & decoder)
{
const DecoderControl &dc = decoder.dc;
assert(dc.pipe != nullptr);
if (decoder.initial_seek_running)
return dc.start_ms / 1000.;
assert(dc.command == DecoderCommand::SEEK);
decoder.seeking = true;
return dc.seek_where;
}
void decoder_seek_error(Decoder & decoder)
{
DecoderControl &dc = decoder.dc;
assert(dc.pipe != nullptr);
if (decoder.initial_seek_running) {
/* d'oh, we can't seek to the sub-song start position,
what now? - no idea, ignoring the problem for now. */
decoder.initial_seek_running = false;
return;
}
assert(dc.command == DecoderCommand::SEEK);
dc.seek_error = true;
decoder.seeking = false;
decoder_command_finished(decoder);
}
/**
* Should be read operation be cancelled? That is the case when the
* player thread has sent a command such as "STOP".
*/
gcc_pure
static inline bool
decoder_check_cancel_read(const Decoder *decoder)
{
if (decoder == nullptr)
return false;
const DecoderControl &dc = decoder->dc;
if (dc.command == DecoderCommand::NONE)
return false;
/* ignore the SEEK command during initialization, the plugin
should handle that after it has initialized successfully */
if (dc.command == DecoderCommand::SEEK &&
(dc.state == DecoderState::START || decoder->seeking))
return false;
return true;
}
size_t
decoder_read(Decoder *decoder,
InputStream &is,
void *buffer, size_t length)
{
/* XXX don't allow decoder==nullptr */
assert(decoder == nullptr ||
decoder->dc.state == DecoderState::START ||
decoder->dc.state == DecoderState::DECODE);
assert(buffer != nullptr);
if (length == 0)
return 0;
is.Lock();
while (true) {
if (decoder_check_cancel_read(decoder)) {
is.Unlock();
return 0;
}
if (is.IsAvailable())
break;
is.cond.wait(is.mutex);
}
Error error;
size_t nbytes = is.Read(buffer, length, error);
assert(nbytes == 0 || !error.IsDefined());
assert(nbytes > 0 || error.IsDefined() || is.IsEOF());
is.Unlock();
if (gcc_unlikely(nbytes == 0 && error.IsDefined()))
LogError(error);
return nbytes;
}
void
decoder_timestamp(Decoder &decoder, double t)
{
assert(t >= 0);
decoder.timestamp = t;
}
/**
* Sends a #tag as-is to the music pipe. Flushes the current chunk
* (decoder.chunk) if there is one.
*/
static DecoderCommand
do_send_tag(Decoder &decoder, const Tag &tag)
{
struct music_chunk *chunk;
if (decoder.chunk != nullptr) {
/* there is a partial chunk - flush it, we want the
tag in a new chunk */
decoder_flush_chunk(decoder);
}
assert(decoder.chunk == nullptr);
chunk = decoder_get_chunk(decoder);
if (chunk == nullptr) {
assert(decoder.dc.command != DecoderCommand::NONE);
return decoder.dc.command;
}
chunk->tag = new Tag(tag);
return DecoderCommand::NONE;
}
static bool
update_stream_tag(Decoder &decoder, InputStream *is)
{
Tag *tag;
tag = is != nullptr
? is->LockReadTag()
: nullptr;
if (tag == nullptr) {
tag = decoder.song_tag;
if (tag == nullptr)
return false;
/* no stream tag present - submit the song tag
instead */
decoder.song_tag = nullptr;
}
delete decoder.stream_tag;
decoder.stream_tag = tag;
return true;
}
DecoderCommand
decoder_data(Decoder &decoder,
InputStream *is,
const void *data, size_t length,
uint16_t kbit_rate)
{
DecoderControl &dc = decoder.dc;
DecoderCommand cmd;
assert(dc.state == DecoderState::DECODE);
assert(dc.pipe != nullptr);
assert(length % dc.in_audio_format.GetFrameSize() == 0);
dc.Lock();
cmd = decoder_get_virtual_command(decoder);
dc.Unlock();
if (cmd == DecoderCommand::STOP || cmd == DecoderCommand::SEEK ||
length == 0)
return cmd;
/* send stream tags */
if (update_stream_tag(decoder, is)) {
if (decoder.decoder_tag != nullptr) {
/* merge with tag from decoder plugin */
Tag *tag = Tag::Merge(*decoder.decoder_tag,
*decoder.stream_tag);
cmd = do_send_tag(decoder, *tag);
delete tag;
} else
/* send only the stream tag */
cmd = do_send_tag(decoder, *decoder.stream_tag);
if (cmd != DecoderCommand::NONE)
return cmd;
}
if (dc.in_audio_format != dc.out_audio_format) {
Error error;
data = decoder.conv_state.Convert(dc.in_audio_format,
data, length,
dc.out_audio_format,
&length,
error);
if (data == nullptr) {
/* the PCM conversion has failed - stop
playback, since we have no better way to
bail out */
LogError(error);
return DecoderCommand::STOP;
}
}
while (length > 0) {
struct music_chunk *chunk;
bool full;
chunk = decoder_get_chunk(decoder);
if (chunk == nullptr) {
assert(dc.command != DecoderCommand::NONE);
return dc.command;
}
const auto dest =
chunk->Write(dc.out_audio_format,
decoder.timestamp -
dc.song->start_ms / 1000.0,
kbit_rate);
if (dest.IsNull()) {
/* the chunk is full, flush it */
decoder_flush_chunk(decoder);
continue;
}
size_t nbytes = dest.size;
assert(nbytes > 0);
if (nbytes > length)
nbytes = length;
/* copy the buffer */
memcpy(dest.data, data, nbytes);
/* expand the music pipe chunk */
full = chunk->Expand(dc.out_audio_format, nbytes);
if (full) {
/* the chunk is full, flush it */
decoder_flush_chunk(decoder);
}
data = (const uint8_t *)data + nbytes;
length -= nbytes;
decoder.timestamp += (double)nbytes /
dc.out_audio_format.GetTimeToSize();
if (dc.end_ms > 0 &&
decoder.timestamp >= dc.end_ms / 1000.0)
/* the end of this range has been reached:
stop decoding */
return DecoderCommand::STOP;
}
return DecoderCommand::NONE;
}
DecoderCommand
decoder_tag(Decoder &decoder, InputStream *is,
Tag &&tag)
{
gcc_unused const DecoderControl &dc = decoder.dc;
DecoderCommand cmd;
assert(dc.state == DecoderState::DECODE);
assert(dc.pipe != nullptr);
/* save the tag */
delete decoder.decoder_tag;
decoder.decoder_tag = new Tag(tag);
/* check for a new stream tag */
update_stream_tag(decoder, is);
/* check if we're seeking */
if (decoder_prepare_initial_seek(decoder))
/* during initial seek, no music chunk must be created
until seeking is finished; skip the rest of the
function here */
return DecoderCommand::SEEK;
/* send tag to music pipe */
if (decoder.stream_tag != nullptr) {
/* merge with tag from input stream */
Tag *merged;
merged = Tag::Merge(*decoder.stream_tag,
*decoder.decoder_tag);
cmd = do_send_tag(decoder, *merged);
delete merged;
} else
/* send only the decoder tag */
cmd = do_send_tag(decoder, *decoder.decoder_tag);
return cmd;
}
void
decoder_replay_gain(Decoder &decoder,
const ReplayGainInfo *replay_gain_info)
{
if (replay_gain_info != nullptr) {
static unsigned serial;
if (++serial == 0)
serial = 1;
if (REPLAY_GAIN_OFF != replay_gain_mode) {
ReplayGainMode rgm = replay_gain_mode;
if (rgm != REPLAY_GAIN_ALBUM)
rgm = REPLAY_GAIN_TRACK;
const auto &tuple = replay_gain_info->tuples[rgm];
const auto scale =
tuple.CalculateScale(replay_gain_preamp,
replay_gain_missing_preamp,
replay_gain_limit);
decoder.dc.replay_gain_db = 20.0 * log10f(scale);
}
decoder.replay_gain_info = *replay_gain_info;
decoder.replay_gain_serial = serial;
if (decoder.chunk != nullptr) {
/* flush the current chunk because the new
replay gain values affect the following
samples */
decoder_flush_chunk(decoder);
}
} else
decoder.replay_gain_serial = 0;
}
void
decoder_mixramp(Decoder &decoder, MixRampInfo &&mix_ramp)
{
DecoderControl &dc = decoder.dc;
dc.SetMixRamp(std::move(mix_ramp));
}

View File

@@ -1,190 +0,0 @@
/*
* Copyright (C) 2003-2013 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.
*/
/*! \file
* \brief The MPD Decoder API
*
* This is the public API which is used by decoder plugins to
* communicate with the mpd core.
*/
#ifndef MPD_DECODER_API_HXX
#define MPD_DECODER_API_HXX
#include "check.h"
#include "DecoderCommand.hxx"
#include "DecoderPlugin.hxx"
#include "ReplayGainInfo.hxx"
#include "tag/Tag.hxx"
#include "AudioFormat.hxx"
#include "MixRampInfo.hxx"
#include "ConfigData.hxx"
/**
* Notify the player thread that it has finished initialization and
* that it has read the song's meta data.
*
* @param decoder the decoder object
* @param audio_format the audio format which is going to be sent to
* decoder_data()
* @param seekable true if the song is seekable
* @param total_time the total number of seconds in this song; -1 if unknown
*/
void
decoder_initialized(Decoder &decoder,
AudioFormat audio_format,
bool seekable, float total_time);
/**
* Determines the pending decoder command.
*
* @param decoder the decoder object
* @return the current command, or DecoderCommand::NONE if there is no
* command pending
*/
gcc_pure
DecoderCommand
decoder_get_command(Decoder &decoder);
/**
* Called by the decoder when it has performed the requested command
* (dc->command). This function resets dc->command and wakes up the
* player thread.
*
* @param decoder the decoder object
*/
void
decoder_command_finished(Decoder &decoder);
/**
* Call this when you have received the DecoderCommand::SEEK command.
*
* @param decoder the decoder object
* @return the destination position for the week
*/
gcc_pure
double
decoder_seek_where(Decoder &decoder);
/**
* Call this instead of decoder_command_finished() when seeking has
* failed.
*
* @param decoder the decoder object
*/
void
decoder_seek_error(Decoder &decoder);
/**
* Blocking read from the input stream.
*
* @param decoder the decoder object
* @param is the input stream to read from
* @param buffer the destination buffer
* @param length the maximum number of bytes to read
* @return the number of bytes read, or 0 if one of the following
* occurs: end of file; error; command (like SEEK or STOP).
*/
size_t
decoder_read(Decoder *decoder, InputStream &is,
void *buffer, size_t length);
static inline size_t
decoder_read(Decoder &decoder, InputStream &is,
void *buffer, size_t length)
{
return decoder_read(&decoder, is, buffer, length);
}
/**
* Sets the time stamp for the next data chunk [seconds]. The MPD
* core automatically counts it up, and a decoder plugin only needs to
* use this function if it thinks that adding to the time stamp based
* on the buffer size won't work.
*/
void
decoder_timestamp(Decoder &decoder, double t);
/**
* This function is called by the decoder plugin when it has
* successfully decoded block of input data.
*
* @param decoder the decoder object
* @param is an input stream which is buffering while we are waiting
* for the player
* @param data the source buffer
* @param length the number of bytes in the buffer
* @return the current command, or DecoderCommand::NONE if there is no
* command pending
*/
DecoderCommand
decoder_data(Decoder &decoder, InputStream *is,
const void *data, size_t length,
uint16_t kbit_rate);
static inline DecoderCommand
decoder_data(Decoder &decoder, InputStream &is,
const void *data, size_t length,
uint16_t kbit_rate)
{
return decoder_data(decoder, &is, data, length, kbit_rate);
}
/**
* This function is called by the decoder plugin when it has
* successfully decoded a tag.
*
* @param decoder the decoder object
* @param is an input stream which is buffering while we are waiting
* for the player
* @param tag the tag to send
* @return the current command, or DecoderCommand::NONE if there is no
* command pending
*/
DecoderCommand
decoder_tag(Decoder &decoder, InputStream *is, Tag &&tag);
static inline DecoderCommand
decoder_tag(Decoder &decoder, InputStream &is, Tag &&tag)
{
return decoder_tag(decoder, &is, std::move(tag));
}
/**
* Set replay gain values for the following chunks.
*
* @param decoder the decoder object
* @param rgi the replay_gain_info object; may be nullptr to invalidate
* the previous replay gain values
*/
void
decoder_replay_gain(Decoder &decoder,
const ReplayGainInfo *replay_gain_info);
/**
* Store MixRamp tags.
*
* @param decoder the decoder object
* @param mixramp_start the mixramp_start tag; may be nullptr to invalidate
* @param mixramp_end the mixramp_end tag; may be nullptr to invalidate
*/
void
decoder_mixramp(Decoder &decoder, MixRampInfo &&mix_ramp);
#endif

View File

@@ -1,167 +0,0 @@
/*
* Copyright (C) 2003-2013 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 "DecoderBuffer.hxx"
#include "DecoderAPI.hxx"
#include <glib.h>
#include <assert.h>
#include <string.h>
struct DecoderBuffer {
Decoder *decoder;
InputStream *is;
/** the allocated size of the buffer */
size_t size;
/** the current length of the buffer */
size_t length;
/** number of bytes already consumed at the beginning of the
buffer */
size_t consumed;
/** the actual buffer (dynamic size) */
unsigned char data[sizeof(size_t)];
};
DecoderBuffer *
decoder_buffer_new(Decoder *decoder, InputStream &is,
size_t size)
{
DecoderBuffer *buffer = (DecoderBuffer *)
g_malloc(sizeof(*buffer) - sizeof(buffer->data) + size);
assert(size > 0);
buffer->decoder = decoder;
buffer->is = &is;
buffer->size = size;
buffer->length = 0;
buffer->consumed = 0;
return buffer;
}
void
decoder_buffer_free(DecoderBuffer *buffer)
{
assert(buffer != nullptr);
g_free(buffer);
}
bool
decoder_buffer_is_empty(const DecoderBuffer *buffer)
{
return buffer->consumed == buffer->length;
}
bool
decoder_buffer_is_full(const DecoderBuffer *buffer)
{
return buffer->consumed == 0 && buffer->length == buffer->size;
}
static void
decoder_buffer_shift(DecoderBuffer *buffer)
{
assert(buffer->consumed > 0);
buffer->length -= buffer->consumed;
memmove(buffer->data, buffer->data + buffer->consumed, buffer->length);
buffer->consumed = 0;
}
bool
decoder_buffer_fill(DecoderBuffer *buffer)
{
size_t nbytes;
if (buffer->consumed > 0)
decoder_buffer_shift(buffer);
if (buffer->length >= buffer->size)
/* buffer is full */
return false;
nbytes = decoder_read(buffer->decoder, *buffer->is,
buffer->data + buffer->length,
buffer->size - buffer->length);
if (nbytes == 0)
/* end of file, I/O error or decoder command
received */
return false;
buffer->length += nbytes;
assert(buffer->length <= buffer->size);
return true;
}
const void *
decoder_buffer_read(const DecoderBuffer *buffer, size_t *length_r)
{
if (buffer->consumed >= buffer->length)
/* buffer is empty */
return nullptr;
*length_r = buffer->length - buffer->consumed;
return buffer->data + buffer->consumed;
}
void
decoder_buffer_consume(DecoderBuffer *buffer, size_t nbytes)
{
/* just move the "consumed" pointer - decoder_buffer_shift()
will do the real work later (called by
decoder_buffer_fill()) */
buffer->consumed += nbytes;
assert(buffer->consumed <= buffer->length);
}
bool
decoder_buffer_skip(DecoderBuffer *buffer, size_t nbytes)
{
size_t length;
const void *data;
bool success;
/* this could probably be optimized by seeking */
while (true) {
data = decoder_buffer_read(buffer, &length);
if (data != nullptr) {
if (length > nbytes)
length = nbytes;
decoder_buffer_consume(buffer, length);
nbytes -= length;
if (nbytes == 0)
return true;
}
success = decoder_buffer_fill(buffer);
if (!success)
return false;
}
}

View File

@@ -1,105 +0,0 @@
/*
* Copyright (C) 2003-2013 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_DECODER_BUFFER_HXX
#define MPD_DECODER_BUFFER_HXX
#include <stddef.h>
/**
* This objects handles buffered reads in decoder plugins easily. You
* create a buffer object, and use its high-level methods to fill and
* read it. It will automatically handle shifting the buffer.
*/
struct DecoderBuffer;
struct Decoder;
struct InputStream;
/**
* Creates a new buffer.
*
* @param decoder the decoder object, used for decoder_read(), may be nullptr
* @param is the input stream object where we should read from
* @param size the maximum size of the buffer
* @return the new decoder_buffer object
*/
DecoderBuffer *
decoder_buffer_new(Decoder *decoder, InputStream &is,
size_t size);
/**
* Frees resources used by the decoder_buffer object.
*/
void
decoder_buffer_free(DecoderBuffer *buffer);
bool
decoder_buffer_is_empty(const DecoderBuffer *buffer);
bool
decoder_buffer_is_full(const DecoderBuffer *buffer);
/**
* Read data from the input_stream and append it to the buffer.
*
* @return true if data was appended; false if there is no data
* available (yet), end of file, I/O error or a decoder command was
* received
*/
bool
decoder_buffer_fill(DecoderBuffer *buffer);
/**
* Reads data from the buffer. This data is not yet consumed, you
* have to call decoder_buffer_consume() to do that. The returned
* buffer becomes invalid after a decoder_buffer_fill() or a
* decoder_buffer_consume() call.
*
* @param buffer the decoder_buffer object
* @param length_r pointer to a size_t where you will receive the
* number of bytes available
* @return a pointer to the read buffer, or nullptr if there is no data
* available
*/
const void *
decoder_buffer_read(const DecoderBuffer *buffer, size_t *length_r);
/**
* Consume (delete, invalidate) a part of the buffer. The "nbytes"
* parameter must not be larger than the length returned by
* decoder_buffer_read().
*
* @param buffer the decoder_buffer object
* @param nbytes the number of bytes to consume
*/
void
decoder_buffer_consume(DecoderBuffer *buffer, size_t nbytes);
/**
* Skips the specified number of bytes, discarding its data.
*
* @param buffer the decoder_buffer object
* @param nbytes the number of bytes to skip
* @return true on success, false on error
*/
bool
decoder_buffer_skip(DecoderBuffer *buffer, size_t nbytes);
#endif

View File

@@ -1,100 +0,0 @@
/*
* Copyright (C) 2003-2013 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 "DecoderInternal.hxx"
#include "DecoderControl.hxx"
#include "MusicPipe.hxx"
#include "MusicBuffer.hxx"
#include "MusicChunk.hxx"
#include "tag/Tag.hxx"
#include <assert.h>
Decoder::~Decoder()
{
/* caller must flush the chunk */
assert(chunk == nullptr);
delete song_tag;
delete stream_tag;
delete decoder_tag;
}
/**
* All chunks are full of decoded data; wait for the player to free
* one.
*/
static DecoderCommand
need_chunks(DecoderControl &dc)
{
if (dc.command == DecoderCommand::NONE)
dc.Wait();
return dc.command;
}
struct music_chunk *
decoder_get_chunk(Decoder &decoder)
{
DecoderControl &dc = decoder.dc;
DecoderCommand cmd;
if (decoder.chunk != nullptr)
return decoder.chunk;
do {
decoder.chunk = dc.buffer->Allocate();
if (decoder.chunk != nullptr) {
decoder.chunk->replay_gain_serial =
decoder.replay_gain_serial;
if (decoder.replay_gain_serial != 0)
decoder.chunk->replay_gain_info =
decoder.replay_gain_info;
return decoder.chunk;
}
dc.Lock();
cmd = need_chunks(dc);
dc.Unlock();
} while (cmd == DecoderCommand::NONE);
return nullptr;
}
void
decoder_flush_chunk(Decoder &decoder)
{
DecoderControl &dc = decoder.dc;
assert(decoder.chunk != nullptr);
if (decoder.chunk->IsEmpty())
dc.buffer->Return(decoder.chunk);
else
dc.pipe->Push(decoder.chunk);
decoder.chunk = nullptr;
dc.Lock();
if (dc.client_is_waiting)
dc.client_cond.signal();
dc.Unlock();
}

View File

@@ -1,117 +0,0 @@
/*
* Copyright (C) 2003-2013 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_DECODER_INTERNAL_HXX
#define MPD_DECODER_INTERNAL_HXX
#include "DecoderCommand.hxx"
#include "pcm/PcmConvert.hxx"
#include "ReplayGainInfo.hxx"
struct DecoderControl;
struct InputStream;
struct Tag;
struct Decoder {
DecoderControl &dc;
PcmConvert conv_state;
/**
* The time stamp of the next data chunk, in seconds.
*/
double timestamp;
/**
* Is the initial seek (to the start position of the sub-song)
* pending, or has it been performed already?
*/
bool initial_seek_pending;
/**
* Is the initial seek currently running? During this time,
* the decoder command is SEEK. This flag is set by
* decoder_get_virtual_command(), when the virtual SEEK
* command is generated for the first time.
*/
bool initial_seek_running;
/**
* This flag is set by decoder_seek_where(), and checked by
* decoder_command_finished(). It is used to clean up after
* seeking.
*/
bool seeking;
/**
* The tag from the song object. This is only used for local
* files, because we expect the stream server to send us a new
* tag each time we play it.
*/
Tag *song_tag;
/** the last tag received from the stream */
Tag *stream_tag;
/** the last tag received from the decoder plugin */
Tag *decoder_tag;
/** the chunk currently being written to */
struct music_chunk *chunk;
ReplayGainInfo replay_gain_info;
/**
* A positive serial number for checking if replay gain info
* has changed since the last check.
*/
unsigned replay_gain_serial;
Decoder(DecoderControl &_dc, bool _initial_seek_pending, Tag *_tag)
:dc(_dc),
timestamp(0),
initial_seek_pending(_initial_seek_pending),
initial_seek_running(false),
seeking(false),
song_tag(_tag), stream_tag(nullptr), decoder_tag(nullptr),
chunk(nullptr),
replay_gain_serial(0) {
}
~Decoder();
};
/**
* Returns the current chunk the decoder writes to, or allocates a new
* chunk if there is none.
*
* @return the chunk, or NULL if we have received a decoder command
*/
struct music_chunk *
decoder_get_chunk(Decoder &decoder);
/**
* Flushes the current chunk.
*
* Caller must not lock the #DecoderControl object.
*/
void
decoder_flush_chunk(Decoder &decoder);
#endif

View File

@@ -1,237 +0,0 @@
/*
* Copyright (C) 2003-2013 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 "DecoderList.hxx"
#include "DecoderPlugin.hxx"
#include "ConfigGlobal.hxx"
#include "ConfigData.hxx"
#include "decoder/AudiofileDecoderPlugin.hxx"
#include "decoder/PcmDecoderPlugin.hxx"
#include "decoder/DsdiffDecoderPlugin.hxx"
#include "decoder/DsfDecoderPlugin.hxx"
#include "decoder/FlacDecoderPlugin.h"
#include "decoder/OpusDecoderPlugin.h"
#include "decoder/VorbisDecoderPlugin.h"
#include "decoder/AdPlugDecoderPlugin.h"
#include "decoder/WavpackDecoderPlugin.hxx"
#include "decoder/FfmpegDecoderPlugin.hxx"
#include "decoder/GmeDecoderPlugin.hxx"
#include "decoder/FaadDecoderPlugin.hxx"
#include "decoder/MadDecoderPlugin.hxx"
#include "decoder/SndfileDecoderPlugin.hxx"
#include "decoder/Mpg123DecoderPlugin.hxx"
#include "decoder/WildmidiDecoderPlugin.hxx"
#include "decoder/MikmodDecoderPlugin.hxx"
#include "decoder/ModplugDecoderPlugin.hxx"
#include "decoder/MpcdecDecoderPlugin.hxx"
#include "decoder/FluidsynthDecoderPlugin.hxx"
#include "decoder/SidplayDecoderPlugin.hxx"
#include "system/FatalError.hxx"
#include "util/Macros.hxx"
#include <string.h>
const struct DecoderPlugin *const decoder_plugins[] = {
#ifdef HAVE_MAD
&mad_decoder_plugin,
#endif
#ifdef HAVE_MPG123
&mpg123_decoder_plugin,
#endif
#ifdef ENABLE_VORBIS_DECODER
&vorbis_decoder_plugin,
#endif
#if defined(HAVE_FLAC)
&oggflac_decoder_plugin,
#endif
#ifdef HAVE_FLAC
&flac_decoder_plugin,
#endif
#ifdef HAVE_OPUS
&opus_decoder_plugin,
#endif
#ifdef ENABLE_SNDFILE
&sndfile_decoder_plugin,
#endif
#ifdef HAVE_AUDIOFILE
&audiofile_decoder_plugin,
#endif
&dsdiff_decoder_plugin,
&dsf_decoder_plugin,
#ifdef HAVE_FAAD
&faad_decoder_plugin,
#endif
#ifdef HAVE_MPCDEC
&mpcdec_decoder_plugin,
#endif
#ifdef HAVE_WAVPACK
&wavpack_decoder_plugin,
#endif
#ifdef HAVE_MODPLUG
&modplug_decoder_plugin,
#endif
#ifdef ENABLE_MIKMOD_DECODER
&mikmod_decoder_plugin,
#endif
#ifdef ENABLE_SIDPLAY
&sidplay_decoder_plugin,
#endif
#ifdef ENABLE_WILDMIDI
&wildmidi_decoder_plugin,
#endif
#ifdef ENABLE_FLUIDSYNTH
&fluidsynth_decoder_plugin,
#endif
#ifdef HAVE_ADPLUG
&adplug_decoder_plugin,
#endif
#ifdef HAVE_FFMPEG
&ffmpeg_decoder_plugin,
#endif
#ifdef HAVE_GME
&gme_decoder_plugin,
#endif
&pcm_decoder_plugin,
nullptr
};
static constexpr unsigned num_decoder_plugins =
ARRAY_SIZE(decoder_plugins) - 1;
/** which plugins have been initialized successfully? */
bool decoder_plugins_enabled[num_decoder_plugins];
static unsigned
decoder_plugin_index(const struct DecoderPlugin *plugin)
{
unsigned i = 0;
while (decoder_plugins[i] != plugin)
++i;
return i;
}
static unsigned
decoder_plugin_next_index(const struct DecoderPlugin *plugin)
{
return plugin == 0
? 0 /* start with first plugin */
: decoder_plugin_index(plugin) + 1;
}
const struct DecoderPlugin *
decoder_plugin_from_suffix(const char *suffix,
const struct DecoderPlugin *plugin)
{
if (suffix == nullptr)
return nullptr;
for (unsigned i = decoder_plugin_next_index(plugin);
decoder_plugins[i] != nullptr; ++i) {
plugin = decoder_plugins[i];
if (decoder_plugins_enabled[i] &&
plugin->SupportsSuffix(suffix))
return plugin;
}
return nullptr;
}
const struct DecoderPlugin *
decoder_plugin_from_mime_type(const char *mimeType, unsigned int next)
{
static unsigned i = num_decoder_plugins;
if (mimeType == nullptr)
return nullptr;
if (!next)
i = 0;
for (; decoder_plugins[i] != nullptr; ++i) {
const struct DecoderPlugin *plugin = decoder_plugins[i];
if (decoder_plugins_enabled[i] &&
plugin->SupportsMimeType(mimeType)) {
++i;
return plugin;
}
}
return nullptr;
}
const struct DecoderPlugin *
decoder_plugin_from_name(const char *name)
{
return decoder_plugins_find([=](const DecoderPlugin &plugin){
return strcmp(plugin.name, name) == 0;
});
}
/**
* Find the "decoder" configuration block for the specified plugin.
*
* @param plugin_name the name of the decoder plugin
* @return the configuration block, or nullptr if none was configured
*/
static const struct config_param *
decoder_plugin_config(const char *plugin_name)
{
const struct config_param *param = nullptr;
while ((param = config_get_next_param(CONF_DECODER, param)) != nullptr) {
const char *name = param->GetBlockValue("plugin");
if (name == nullptr)
FormatFatalError("decoder configuration without 'plugin' name in line %d",
param->line);
if (strcmp(name, plugin_name) == 0)
return param;
}
return nullptr;
}
void decoder_plugin_init_all(void)
{
struct config_param empty;
for (unsigned i = 0; decoder_plugins[i] != nullptr; ++i) {
const DecoderPlugin &plugin = *decoder_plugins[i];
const struct config_param *param =
decoder_plugin_config(plugin.name);
if (param == nullptr)
param = &empty;
else if (!param->GetBlockValue("enabled", true))
/* the plugin is disabled in mpd.conf */
continue;
if (plugin.Init(*param))
decoder_plugins_enabled[i] = true;
}
}
void decoder_plugin_deinit_all(void)
{
decoder_plugins_for_each_enabled([=](const DecoderPlugin &plugin){
plugin.Finish();
});
}

View File

@@ -1,450 +0,0 @@
/*
* Copyright (C) 2003-2013 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 "DecoderThread.hxx"
#include "DecoderControl.hxx"
#include "DecoderInternal.hxx"
#include "DecoderError.hxx"
#include "DecoderPlugin.hxx"
#include "Song.hxx"
#include "system/FatalError.hxx"
#include "Mapper.hxx"
#include "fs/Traits.hxx"
#include "fs/AllocatedPath.hxx"
#include "DecoderAPI.hxx"
#include "tag/Tag.hxx"
#include "InputStream.hxx"
#include "DecoderList.hxx"
#include "util/UriUtil.hxx"
#include "util/Error.hxx"
#include "util/Domain.hxx"
#include "tag/ApeReplayGain.hxx"
#include "Log.hxx"
#include <functional>
static constexpr Domain decoder_thread_domain("decoder_thread");
/**
* Marks the current decoder command as "finished" and notifies the
* player thread.
*
* @param dc the #DecoderControl object; must be locked
*/
static void
decoder_command_finished_locked(DecoderControl &dc)
{
assert(dc.command != DecoderCommand::NONE);
dc.command = DecoderCommand::NONE;
dc.client_cond.signal();
}
/**
* Opens the input stream with input_stream::Open(), and waits until
* the stream gets ready. If a decoder STOP command is received
* during that, it cancels the operation (but does not close the
* stream).
*
* Unlock the decoder before calling this function.
*
* @return an input_stream on success or if #DecoderCommand::STOP is
* received, nullptr on error
*/
static InputStream *
decoder_input_stream_open(DecoderControl &dc, const char *uri)
{
Error error;
InputStream *is = InputStream::Open(uri, dc.mutex, dc.cond, error);
if (is == nullptr) {
if (error.IsDefined())
LogError(error);
return nullptr;
}
/* wait for the input stream to become ready; its metadata
will be available then */
dc.Lock();
is->Update();
while (!is->ready &&
dc.command != DecoderCommand::STOP) {
dc.Wait();
is->Update();
}
if (!is->Check(error)) {
dc.Unlock();
LogError(error);
return nullptr;
}
dc.Unlock();
return is;
}
static bool
decoder_stream_decode(const DecoderPlugin &plugin,
Decoder &decoder,
InputStream &input_stream)
{
assert(plugin.stream_decode != nullptr);
assert(decoder.stream_tag == nullptr);
assert(decoder.decoder_tag == nullptr);
assert(input_stream.ready);
assert(decoder.dc.state == DecoderState::START);
FormatDebug(decoder_thread_domain, "probing plugin %s", plugin.name);
if (decoder.dc.command == DecoderCommand::STOP)
return true;
/* rewind the stream, so each plugin gets a fresh start */
input_stream.Rewind(IgnoreError());
decoder.dc.Unlock();
plugin.StreamDecode(decoder, input_stream);
decoder.dc.Lock();
assert(decoder.dc.state == DecoderState::START ||
decoder.dc.state == DecoderState::DECODE);
return decoder.dc.state != DecoderState::START;
}
static bool
decoder_file_decode(const DecoderPlugin &plugin,
Decoder &decoder, const char *path)
{
assert(plugin.file_decode != nullptr);
assert(decoder.stream_tag == nullptr);
assert(decoder.decoder_tag == nullptr);
assert(path != nullptr);
assert(PathTraits::IsAbsoluteFS(path));
assert(decoder.dc.state == DecoderState::START);
FormatDebug(decoder_thread_domain, "probing plugin %s", plugin.name);
if (decoder.dc.command == DecoderCommand::STOP)
return true;
decoder.dc.Unlock();
plugin.FileDecode(decoder, path);
decoder.dc.Lock();
assert(decoder.dc.state == DecoderState::START ||
decoder.dc.state == DecoderState::DECODE);
return decoder.dc.state != DecoderState::START;
}
gcc_pure
static bool
decoder_check_plugin_mime(const DecoderPlugin &plugin, const InputStream &is)
{
assert(plugin.stream_decode != nullptr);
return !is.mime.empty() && plugin.SupportsMimeType(is.mime.c_str());
}
gcc_pure
static bool
decoder_check_plugin_suffix(const DecoderPlugin &plugin, const char *suffix)
{
assert(plugin.stream_decode != nullptr);
return suffix != nullptr && plugin.SupportsSuffix(suffix);
}
gcc_pure
static bool
decoder_check_plugin(const DecoderPlugin &plugin, const InputStream &is,
const char *suffix)
{
return plugin.stream_decode != nullptr &&
(decoder_check_plugin_mime(plugin, is) ||
decoder_check_plugin_suffix(plugin, suffix));
}
static bool
decoder_run_stream_plugin(Decoder &decoder, InputStream &is,
const char *suffix,
const DecoderPlugin &plugin,
bool &tried_r)
{
if (!decoder_check_plugin(plugin, is, suffix))
return false;
tried_r = true;
return decoder_stream_decode(plugin, decoder, is);
}
static bool
decoder_run_stream_locked(Decoder &decoder, InputStream &is,
const char *uri, bool &tried_r)
{
const char *const suffix = uri_get_suffix(uri);
using namespace std::placeholders;
const auto f = std::bind(decoder_run_stream_plugin,
std::ref(decoder), std::ref(is), suffix,
_1, std::ref(tried_r));
return decoder_plugins_try(f);
}
/**
* Try decoding a stream, using the fallback plugin.
*/
static bool
decoder_run_stream_fallback(Decoder &decoder, InputStream &is)
{
const struct DecoderPlugin *plugin;
plugin = decoder_plugin_from_name("mad");
return plugin != nullptr && plugin->stream_decode != nullptr &&
decoder_stream_decode(*plugin, decoder, is);
}
/**
* Try decoding a stream.
*/
static bool
decoder_run_stream(Decoder &decoder, const char *uri)
{
DecoderControl &dc = decoder.dc;
InputStream *input_stream;
bool success;
dc.Unlock();
input_stream = decoder_input_stream_open(dc, uri);
if (input_stream == nullptr) {
dc.Lock();
return false;
}
dc.Lock();
bool tried = false;
success = dc.command == DecoderCommand::STOP ||
decoder_run_stream_locked(decoder, *input_stream, uri,
tried) ||
/* fallback to mp3: this is needed for bastard streams
that don't have a suffix or set the mimeType */
(!tried &&
decoder_run_stream_fallback(decoder, *input_stream));
dc.Unlock();
input_stream->Close();
dc.Lock();
return success;
}
/**
* Attempt to load replay gain data, and pass it to
* decoder_replay_gain().
*/
static void
decoder_load_replay_gain(Decoder &decoder, const char *path_fs)
{
ReplayGainInfo info;
if (replay_gain_ape_read(Path::FromFS(path_fs), info))
decoder_replay_gain(decoder, &info);
}
/**
* Try decoding a file.
*/
static bool
decoder_run_file(Decoder &decoder, const char *path_fs)
{
DecoderControl &dc = decoder.dc;
const char *suffix = uri_get_suffix(path_fs);
const struct DecoderPlugin *plugin = nullptr;
if (suffix == nullptr)
return false;
dc.Unlock();
decoder_load_replay_gain(decoder, path_fs);
while ((plugin = decoder_plugin_from_suffix(suffix, plugin)) != nullptr) {
if (plugin->file_decode != nullptr) {
dc.Lock();
if (decoder_file_decode(*plugin, decoder, path_fs))
return true;
dc.Unlock();
} else if (plugin->stream_decode != nullptr) {
InputStream *input_stream;
bool success;
input_stream = decoder_input_stream_open(dc, path_fs);
if (input_stream == nullptr)
continue;
dc.Lock();
success = decoder_stream_decode(*plugin, decoder,
*input_stream);
dc.Unlock();
input_stream->Close();
if (success) {
dc.Lock();
return true;
}
}
}
dc.Lock();
return false;
}
static void
decoder_run_song(DecoderControl &dc,
const Song *song, const char *uri)
{
Decoder decoder(dc, dc.start_ms > 0,
song->tag != nullptr && song->IsFile()
? new Tag(*song->tag) : nullptr);
int ret;
dc.state = DecoderState::START;
decoder_command_finished_locked(dc);
ret = song->IsFile()
? decoder_run_file(decoder, uri)
: decoder_run_stream(decoder, uri);
dc.Unlock();
/* flush the last chunk */
if (decoder.chunk != nullptr)
decoder_flush_chunk(decoder);
dc.Lock();
if (ret)
dc.state = DecoderState::STOP;
else {
dc.state = DecoderState::ERROR;
const char *error_uri = song->uri;
const std::string allocated = uri_remove_auth(error_uri);
if (!allocated.empty())
error_uri = allocated.c_str();
dc.error.Format(decoder_domain,
"Failed to decode %s", error_uri);
}
dc.client_cond.signal();
}
static void
decoder_run(DecoderControl &dc)
{
dc.ClearError();
const Song *song = dc.song;
assert(song != nullptr);
const std::string uri = song->IsFile()
? std::string(map_song_fs(*song).c_str())
: song->GetURI();
if (uri.empty()) {
dc.state = DecoderState::ERROR;
dc.error.Set(decoder_domain, "Failed to map song");
decoder_command_finished_locked(dc);
return;
}
decoder_run_song(dc, song, uri.c_str());
}
static void
decoder_task(void *arg)
{
DecoderControl &dc = *(DecoderControl *)arg;
dc.Lock();
do {
assert(dc.state == DecoderState::STOP ||
dc.state == DecoderState::ERROR);
switch (dc.command) {
case DecoderCommand::START:
dc.CycleMixRamp();
dc.replay_gain_prev_db = dc.replay_gain_db;
dc.replay_gain_db = 0;
/* fall through */
case DecoderCommand::SEEK:
decoder_run(dc);
break;
case DecoderCommand::STOP:
decoder_command_finished_locked(dc);
break;
case DecoderCommand::NONE:
dc.Wait();
break;
}
} while (dc.command != DecoderCommand::NONE || !dc.quit);
dc.Unlock();
}
void
decoder_thread_start(DecoderControl &dc)
{
assert(!dc.thread.IsDefined());
dc.quit = false;
Error error;
if (!dc.thread.Start(decoder_task, &dc, error))
FatalError(error);
}

View File

@@ -1,154 +0,0 @@
/*
* Copyright (C) 2003-2013 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 "DespotifyUtils.hxx"
#include "tag/Tag.hxx"
#include "ConfigGlobal.hxx"
#include "ConfigOption.hxx"
#include "util/Domain.hxx"
#include "Log.hxx"
extern "C" {
#include <despotify.h>
}
#include <stdio.h>
const Domain despotify_domain("despotify");
static struct despotify_session *g_session;
static void (*registered_callbacks[8])(struct despotify_session *,
int, void *, void *);
static void *registered_callback_data[8];
static void
callback(struct despotify_session* ds, int sig,
void *data, gcc_unused void *callback_data)
{
size_t i;
for (i = 0; i < sizeof(registered_callbacks) / sizeof(registered_callbacks[0]); i++) {
void (*cb)(struct despotify_session *, int, void *, void *) = registered_callbacks[i];
void *cb_data = registered_callback_data[i];
if (cb)
cb(ds, sig, data, cb_data);
}
}
bool mpd_despotify_register_callback(void (*cb)(struct despotify_session *, int, void *, void *),
void *cb_data)
{
size_t i;
for (i = 0; i < sizeof(registered_callbacks) / sizeof(registered_callbacks[0]); i++) {
if (!registered_callbacks[i]) {
registered_callbacks[i] = cb;
registered_callback_data[i] = cb_data;
return true;
}
}
return false;
}
void mpd_despotify_unregister_callback(void (*cb)(struct despotify_session *, int, void *, void *))
{
size_t i;
for (i = 0; i < sizeof(registered_callbacks) / sizeof(registered_callbacks[0]); i++) {
if (registered_callbacks[i] == cb) {
registered_callbacks[i] = nullptr;
}
}
}
Tag *
mpd_despotify_tag_from_track(struct ds_track *track)
{
char tracknum[20];
char comment[80];
char date[20];
Tag *tag = new Tag();
if (!track->has_meta_data)
return tag;
snprintf(tracknum, sizeof(tracknum), "%d", track->tracknumber);
snprintf(date, sizeof(date), "%d", track->year);
snprintf(comment, sizeof(comment), "Bitrate %d Kbps, %sgeo restricted",
track->file_bitrate / 1000,
track->geo_restricted ? "" : "not ");
tag->AddItem(TAG_TITLE, track->title);
tag->AddItem(TAG_ARTIST, track->artist->name);
tag->AddItem(TAG_TRACK, tracknum);
tag->AddItem(TAG_ALBUM, track->album);
tag->AddItem(TAG_DATE, date);
tag->AddItem(TAG_COMMENT, comment);
tag->time = track->length / 1000;
return tag;
}
struct despotify_session *mpd_despotify_get_session(void)
{
const char *user;
const char *passwd;
bool high_bitrate;
if (g_session)
return g_session;
user = config_get_string(CONF_DESPOTIFY_USER, nullptr);
passwd = config_get_string(CONF_DESPOTIFY_PASSWORD, nullptr);
high_bitrate = config_get_bool(CONF_DESPOTIFY_HIGH_BITRATE, true);
if (user == nullptr || passwd == nullptr) {
LogDebug(despotify_domain,
"disabling despotify because account is not configured");
return nullptr;
}
if (!despotify_init()) {
LogWarning(despotify_domain, "Can't initialize despotify");
return nullptr;
}
g_session = despotify_init_client(callback, nullptr,
high_bitrate, true);
if (!g_session) {
LogWarning(despotify_domain,
"Can't initialize despotify client");
return nullptr;
}
if (!despotify_authenticate(g_session, user, passwd)) {
LogWarning(despotify_domain,
"Can't authenticate despotify session");
despotify_exit(g_session);
return nullptr;
}
return g_session;
}

View File

@@ -1,71 +0,0 @@
/*
* Copyright (C) 2003-2013 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_DESPOTIFY_H
#define MPD_DESPOTIFY_H
struct Tag;
struct despotify_session;
struct ds_track;
extern const class Domain despotify_domain;
/**
* Return the current despotify session.
*
* If the session isn't initialized, this function will initialize
* it and connect to Spotify.
*
* @return a pointer to the despotify session, or nullptr if it can't
* be initialized (e.g., if the configuration isn't supplied)
*/
struct despotify_session *mpd_despotify_get_session(void);
/**
* Create a MPD tags structure from a spotify track
*
* @param track the track to convert
*
* @return a pointer to the filled in tags structure
*/
Tag *
mpd_despotify_tag_from_track(struct ds_track *track);
/**
* Register a despotify callback.
*
* Despotify calls this e.g., when a track ends.
*
* @param cb the callback
* @param cb_data the data to pass to the callback
*
* @return true if the callback could be registered
*/
bool mpd_despotify_register_callback(void (*cb)(struct despotify_session *, int, void *, void *),
void *cb_data);
/**
* Unregister a despotify callback.
*
* @param cb the callback to unregister.
*/
void mpd_despotify_unregister_callback(void (*cb)(struct despotify_session *, int, void *, void *));
#endif

73
src/DetachedSong.cxx Normal file
View File

@@ -0,0 +1,73 @@
/*
* Copyright 2003-2017 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 "DetachedSong.hxx"
#include "db/LightSong.hxx"
#include "util/UriUtil.hxx"
#include "fs/Traits.hxx"
DetachedSong::DetachedSong(const LightSong &other)
:uri(other.GetURI().c_str()),
real_uri(other.real_uri != nullptr ? other.real_uri : ""),
tag(*other.tag),
mtime(other.mtime),
start_time(other.start_time),
end_time(other.end_time) {}
DetachedSong::~DetachedSong()
{
/* this destructor exists here just so it won't inlined */
}
bool
DetachedSong::IsRemote() const
{
return uri_has_scheme(GetRealURI());
}
bool
DetachedSong::IsAbsoluteFile() const
{
return PathTraitsUTF8::IsAbsolute(GetRealURI());
}
bool
DetachedSong::IsInDatabase() const
{
/* here, we use GetURI() and not GetRealURI() because
GetRealURI() is never relative */
const char *_uri = GetURI();
return !uri_has_scheme(_uri) && !PathTraitsUTF8::IsAbsolute(_uri);
}
SignedSongTime
DetachedSong::GetDuration() const
{
SongTime a = start_time, b = end_time;
if (!b.IsPositive()) {
if (tag.duration.IsNegative())
return tag.duration;
b = SongTime(tag.duration);
}
return SignedSongTime(b - a);
}

239
src/DetachedSong.hxx Normal file
View File

@@ -0,0 +1,239 @@
/*
* Copyright 2003-2017 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_DETACHED_SONG_HXX
#define MPD_DETACHED_SONG_HXX
#include "check.h"
#include "tag/Tag.hxx"
#include "Chrono.hxx"
#include "Compiler.h"
#include <string>
#include <utility>
#include <time.h>
struct LightSong;
class Storage;
class Path;
class DetachedSong {
friend DetachedSong DatabaseDetachSong(const Storage &db,
const LightSong &song);
/**
* An UTF-8-encoded URI referring to the song file. This can
* be one of:
*
* - an absolute URL with a scheme
* (e.g. "http://example.com/foo.mp3")
*
* - an absolute file name
*
* - a file name relative to the music directory
*/
std::string uri;
/**
* The "real" URI, the one to be used for opening the
* resource. If this attribute is empty, then #uri shall be
* used.
*
* This attribute is used for songs from the database which
* have a relative URI.
*/
std::string real_uri;
Tag tag;
time_t mtime;
/**
* Start of this sub-song within the file.
*/
SongTime start_time;
/**
* End of this sub-song within the file.
* Unused if zero.
*/
SongTime end_time;
explicit DetachedSong(const LightSong &other);
public:
explicit DetachedSong(const DetachedSong &) = default;
explicit DetachedSong(const char *_uri)
:uri(_uri),
mtime(0),
start_time(SongTime::zero()), end_time(SongTime::zero()) {}
explicit DetachedSong(const std::string &_uri)
:uri(_uri),
mtime(0),
start_time(SongTime::zero()), end_time(SongTime::zero()) {}
explicit DetachedSong(std::string &&_uri)
:uri(std::move(_uri)),
mtime(0),
start_time(SongTime::zero()), end_time(SongTime::zero()) {}
template<typename U>
DetachedSong(U &&_uri, Tag &&_tag)
:uri(std::forward<U>(_uri)),
tag(std::move(_tag)),
mtime(0),
start_time(SongTime::zero()), end_time(SongTime::zero()) {}
DetachedSong(DetachedSong &&) = default;
~DetachedSong();
gcc_pure
const char *GetURI() const {
return uri.c_str();
}
template<typename T>
void SetURI(T &&_uri) {
uri = std::forward<T>(_uri);
}
/**
* Does this object have a "real" URI different from the
* displayed URI?
*/
gcc_pure
bool HasRealURI() const {
return !real_uri.empty();
}
/**
* Returns "real" URI (#real_uri) and falls back to just
* GetURI().
*/
gcc_pure
const char *GetRealURI() const {
return (HasRealURI() ? real_uri : uri).c_str();
}
template<typename T>
void SetRealURI(T &&_uri) {
real_uri = std::forward<T>(_uri);
}
/**
* Returns true if both objects refer to the same physical
* song.
*/
gcc_pure
bool IsSame(const DetachedSong &other) const {
return uri == other.uri;
}
gcc_pure gcc_nonnull_all
bool IsURI(const char *other_uri) const {
return uri == other_uri;
}
gcc_pure
bool IsRemote() const;
gcc_pure
bool IsFile() const {
return !IsRemote();
}
gcc_pure
bool IsAbsoluteFile() const;
gcc_pure
bool IsInDatabase() const;
const Tag &GetTag() const {
return tag;
}
Tag &WritableTag() {
return tag;
}
void SetTag(const Tag &_tag) {
tag = Tag(_tag);
}
void SetTag(Tag &&_tag) {
tag = std::move(_tag);
}
void MoveTagFrom(DetachedSong &&other) {
tag = std::move(other.tag);
}
/**
* Similar to the MoveTagFrom(), but move only the #TagItem
* array.
*/
void MoveTagItemsFrom(DetachedSong &&other) {
tag.MoveItemsFrom(std::move(other.tag));
}
time_t GetLastModified() const {
return mtime;
}
void SetLastModified(time_t _value) {
mtime = _value;
}
SongTime GetStartTime() const {
return start_time;
}
void SetStartTime(SongTime _value) {
start_time = _value;
}
SongTime GetEndTime() const {
return end_time;
}
void SetEndTime(SongTime _value) {
end_time = _value;
}
gcc_pure
SignedSongTime GetDuration() const;
/**
* Update the #tag and #mtime.
*
* @return true on success
*/
bool Update();
/**
* Load #tag and #mtime from a local file.
*/
bool LoadFile(Path path);
};
#endif

View File

@@ -1,331 +0,0 @@
/*
* Copyright (C) 2003-2013 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 "Directory.hxx"
#include "SongFilter.hxx"
#include "PlaylistVector.hxx"
#include "DatabaseLock.hxx"
#include "SongSort.hxx"
#include "Song.hxx"
#include "fs/Traits.hxx"
#include "util/Error.hxx"
extern "C" {
#include "util/list_sort.h"
}
#include <glib.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
inline Directory *
Directory::Allocate(const char *path)
{
assert(path != nullptr);
const size_t path_size = strlen(path) + 1;
Directory *directory =
(Directory *)g_malloc0(sizeof(*directory)
- sizeof(directory->path)
+ path_size);
new(directory) Directory(path);
return directory;
}
Directory::Directory()
{
INIT_LIST_HEAD(&children);
INIT_LIST_HEAD(&songs);
path[0] = 0;
}
Directory::Directory(const char *_path)
{
INIT_LIST_HEAD(&children);
INIT_LIST_HEAD(&songs);
strcpy(path, _path);
}
Directory::~Directory()
{
Song *song, *ns;
directory_for_each_song_safe(song, ns, *this)
song->Free();
Directory *child, *n;
directory_for_each_child_safe(child, n, *this)
child->Free();
}
Directory *
Directory::NewGeneric(const char *path, Directory *parent)
{
assert(path != nullptr);
assert((*path == 0) == (parent == nullptr));
Directory *directory = Allocate(path);
directory->parent = parent;
return directory;
}
void
Directory::Free()
{
this->Directory::~Directory();
g_free(this);
}
void
Directory::Delete()
{
assert(holding_db_lock());
assert(parent != nullptr);
list_del(&siblings);
Free();
}
const char *
Directory::GetName() const
{
assert(!IsRoot());
return PathTraits::GetBaseUTF8(path);
}
Directory *
Directory::CreateChild(const char *name_utf8)
{
assert(holding_db_lock());
assert(name_utf8 != nullptr);
assert(*name_utf8 != 0);
char *allocated;
const char *path_utf8;
if (IsRoot()) {
allocated = nullptr;
path_utf8 = name_utf8;
} else {
allocated = g_strconcat(GetPath(),
"/", name_utf8, nullptr);
path_utf8 = allocated;
}
Directory *child = NewGeneric(path_utf8, this);
g_free(allocated);
list_add_tail(&child->siblings, &children);
return child;
}
const Directory *
Directory::FindChild(const char *name) const
{
assert(holding_db_lock());
const Directory *child;
directory_for_each_child(child, *this)
if (strcmp(child->GetName(), name) == 0)
return child;
return nullptr;
}
void
Directory::PruneEmpty()
{
assert(holding_db_lock());
Directory *child, *n;
directory_for_each_child_safe(child, n, *this) {
child->PruneEmpty();
if (child->IsEmpty())
child->Delete();
}
}
Directory *
Directory::LookupDirectory(const char *uri)
{
assert(holding_db_lock());
assert(uri != nullptr);
if (isRootDirectory(uri))
return this;
char *duplicated = g_strdup(uri), *name = duplicated;
Directory *d = this;
while (1) {
char *slash = strchr(name, '/');
if (slash == name) {
d = nullptr;
break;
}
if (slash != nullptr)
*slash = '\0';
d = d->FindChild(name);
if (d == nullptr || slash == nullptr)
break;
name = slash + 1;
}
g_free(duplicated);
return d;
}
void
Directory::AddSong(Song *song)
{
assert(holding_db_lock());
assert(song != nullptr);
assert(song->parent == this);
list_add_tail(&song->siblings, &songs);
}
void
Directory::RemoveSong(Song *song)
{
assert(holding_db_lock());
assert(song != nullptr);
assert(song->parent == this);
list_del(&song->siblings);
}
const Song *
Directory::FindSong(const char *name_utf8) const
{
assert(holding_db_lock());
assert(name_utf8 != nullptr);
Song *song;
directory_for_each_song(song, *this) {
assert(song->parent == this);
if (strcmp(song->uri, name_utf8) == 0)
return song;
}
return nullptr;
}
Song *
Directory::LookupSong(const char *uri)
{
char *duplicated, *base;
assert(holding_db_lock());
assert(uri != nullptr);
duplicated = g_strdup(uri);
base = strrchr(duplicated, '/');
Directory *d = this;
if (base != nullptr) {
*base++ = 0;
d = d->LookupDirectory(duplicated);
if (d == nullptr) {
g_free(duplicated);
return nullptr;
}
} else
base = duplicated;
Song *song = d->FindSong(base);
assert(song == nullptr || song->parent == d);
g_free(duplicated);
return song;
}
static int
directory_cmp(gcc_unused void *priv,
struct list_head *_a, struct list_head *_b)
{
const Directory *a = (const Directory *)_a;
const Directory *b = (const Directory *)_b;
return g_utf8_collate(a->path, b->path);
}
void
Directory::Sort()
{
assert(holding_db_lock());
list_sort(nullptr, &children, directory_cmp);
song_list_sort(&songs);
Directory *child;
directory_for_each_child(child, *this)
child->Sort();
}
bool
Directory::Walk(bool recursive, const SongFilter *filter,
VisitDirectory visit_directory, VisitSong visit_song,
VisitPlaylist visit_playlist,
Error &error) const
{
assert(!error.IsDefined());
if (visit_song) {
Song *song;
directory_for_each_song(song, *this)
if ((filter == nullptr || filter->Match(*song)) &&
!visit_song(*song, error))
return false;
}
if (visit_playlist) {
for (const PlaylistInfo &p : playlists)
if (!visit_playlist(p, *this, error))
return false;
}
Directory *child;
directory_for_each_child(child, *this) {
if (visit_directory &&
!visit_directory(*child, error))
return false;
if (recursive &&
!child->Walk(recursive, filter,
visit_directory, visit_song, visit_playlist,
error))
return false;
}
return true;
}

View File

@@ -1,171 +0,0 @@
/*
* Copyright (C) 2003-2013 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 "DirectorySave.hxx"
#include "Directory.hxx"
#include "Song.hxx"
#include "SongSave.hxx"
#include "PlaylistDatabase.hxx"
#include "TextFile.hxx"
#include "util/NumberParser.hxx"
#include "util/Error.hxx"
#include "util/Domain.hxx"
#include <glib.h>
#include <assert.h>
#include <string.h>
#define DIRECTORY_DIR "directory: "
#define DIRECTORY_MTIME "mtime: "
#define DIRECTORY_BEGIN "begin: "
#define DIRECTORY_END "end: "
static constexpr Domain directory_domain("directory");
void
directory_save(FILE *fp, const Directory &directory)
{
if (!directory.IsRoot()) {
fprintf(fp, DIRECTORY_MTIME "%lu\n",
(unsigned long)directory.mtime);
fprintf(fp, "%s%s\n", DIRECTORY_BEGIN, directory.GetPath());
}
Directory *cur;
directory_for_each_child(cur, directory) {
fprintf(fp, DIRECTORY_DIR "%s\n", cur->GetName());
directory_save(fp, *cur);
if (ferror(fp))
return;
}
Song *song;
directory_for_each_song(song, directory)
song_save(fp, *song);
playlist_vector_save(fp, directory.playlists);
if (!directory.IsRoot())
fprintf(fp, DIRECTORY_END "%s\n", directory.GetPath());
}
static Directory *
directory_load_subdir(TextFile &file, Directory &parent, const char *name,
Error &error)
{
bool success;
if (parent.FindChild(name) != nullptr) {
error.Format(directory_domain,
"Duplicate subdirectory '%s'", name);
return nullptr;
}
Directory *directory = parent.CreateChild(name);
const char *line = file.ReadLine();
if (line == nullptr) {
error.Set(directory_domain, "Unexpected end of file");
directory->Delete();
return nullptr;
}
if (g_str_has_prefix(line, DIRECTORY_MTIME)) {
directory->mtime =
ParseUint64(line + sizeof(DIRECTORY_MTIME) - 1);
line = file.ReadLine();
if (line == nullptr) {
error.Set(directory_domain, "Unexpected end of file");
directory->Delete();
return nullptr;
}
}
if (!g_str_has_prefix(line, DIRECTORY_BEGIN)) {
error.Format(directory_domain, "Malformed line: %s", line);
directory->Delete();
return nullptr;
}
success = directory_load(file, *directory, error);
if (!success) {
directory->Delete();
return nullptr;
}
return directory;
}
bool
directory_load(TextFile &file, Directory &directory, Error &error)
{
const char *line;
while ((line = file.ReadLine()) != nullptr &&
!g_str_has_prefix(line, DIRECTORY_END)) {
if (g_str_has_prefix(line, DIRECTORY_DIR)) {
Directory *subdir =
directory_load_subdir(file, directory,
line + sizeof(DIRECTORY_DIR) - 1,
error);
if (subdir == nullptr)
return false;
} else if (g_str_has_prefix(line, SONG_BEGIN)) {
const char *name = line + sizeof(SONG_BEGIN) - 1;
Song *song;
if (directory.FindSong(name) != nullptr) {
error.Format(directory_domain,
"Duplicate song '%s'", name);
return false;
}
song = song_load(file, &directory, name, error);
if (song == nullptr)
return false;
directory.AddSong(song);
} else if (g_str_has_prefix(line, PLAYLIST_META_BEGIN)) {
/* duplicate the name, because
playlist_metadata_load() will overwrite the
buffer */
char *name = g_strdup(line + sizeof(PLAYLIST_META_BEGIN) - 1);
if (!playlist_metadata_load(file, directory.playlists,
name, error)) {
g_free(name);
return false;
}
g_free(name);
} else {
error.Format(directory_domain,
"Malformed line: %s", line);
return false;
}
}
return true;
}

View File

@@ -1,321 +0,0 @@
/*
* Copyright (C) 2003-2013 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_ENCODER_PLUGIN_HXX
#define MPD_ENCODER_PLUGIN_HXX
#include <assert.h>
#include <stdbool.h>
#include <stddef.h>
struct EncoderPlugin;
struct AudioFormat;
struct config_param;
struct Tag;
class Error;
struct Encoder {
const EncoderPlugin &plugin;
#ifndef NDEBUG
bool open, pre_tag, tag, end;
#endif
explicit Encoder(const EncoderPlugin &_plugin)
:plugin(_plugin)
#ifndef NDEBUG
, open(false)
#endif
{}
};
struct EncoderPlugin {
const char *name;
Encoder *(*init)(const config_param &param,
Error &error);
void (*finish)(Encoder *encoder);
bool (*open)(Encoder *encoder,
AudioFormat &audio_format,
Error &error);
void (*close)(Encoder *encoder);
bool (*end)(Encoder *encoder, Error &error);
bool (*flush)(Encoder *encoder, Error &error);
bool (*pre_tag)(Encoder *encoder, Error &error);
bool (*tag)(Encoder *encoder, const Tag *tag,
Error &error);
bool (*write)(Encoder *encoder,
const void *data, size_t length,
Error &error);
size_t (*read)(Encoder *encoder, void *dest, size_t length);
const char *(*get_mime_type)(Encoder *encoder);
};
/**
* Creates a new encoder object.
*
* @param plugin the encoder plugin
* @param param optional configuration
* @param error location to store the error occurring, or nullptr to ignore errors.
* @return an encoder object on success, nullptr on failure
*/
static inline Encoder *
encoder_init(const EncoderPlugin &plugin, const config_param &param,
Error &error_r)
{
return plugin.init(param, error_r);
}
/**
* Frees an encoder object.
*
* @param encoder the encoder
*/
static inline void
encoder_finish(Encoder *encoder)
{
assert(!encoder->open);
encoder->plugin.finish(encoder);
}
/**
* Opens an encoder object. You must call this prior to using it.
* Before you free it, you must call encoder_close(). You may open
* and close (reuse) one encoder any number of times.
*
* After this function returns successfully and before the first
* encoder_write() call, you should invoke encoder_read() to obtain
* the file header.
*
* @param encoder the encoder
* @param audio_format the encoder's input audio format; the plugin
* may modify the struct to adapt it to its abilities
* @return true on success
*/
static inline bool
encoder_open(Encoder *encoder, AudioFormat &audio_format,
Error &error)
{
assert(!encoder->open);
bool success = encoder->plugin.open(encoder, audio_format, error);
#ifndef NDEBUG
encoder->open = success;
encoder->pre_tag = encoder->tag = encoder->end = false;
#endif
return success;
}
/**
* Closes an encoder object. This disables the encoder, and readies
* it for reusal by calling encoder_open() again.
*
* @param encoder the encoder
*/
static inline void
encoder_close(Encoder *encoder)
{
assert(encoder->open);
if (encoder->plugin.close != nullptr)
encoder->plugin.close(encoder);
#ifndef NDEBUG
encoder->open = false;
#endif
}
/**
* Ends the stream: flushes the encoder object, generate an
* end-of-stream marker (if applicable), make everything which might
* currently be buffered available by encoder_read().
*
* After this function has been called, the encoder may not be usable
* for more data, and only encoder_read() and encoder_close() can be
* called.
*
* @param encoder the encoder
* @return true on success
*/
static inline bool
encoder_end(Encoder *encoder, Error &error)
{
assert(encoder->open);
assert(!encoder->end);
#ifndef NDEBUG
encoder->end = true;
#endif
/* this method is optional */
return encoder->plugin.end != nullptr
? encoder->plugin.end(encoder, error)
: true;
}
/**
* Flushes an encoder object, make everything which might currently be
* buffered available by encoder_read().
*
* @param encoder the encoder
* @return true on success
*/
static inline bool
encoder_flush(Encoder *encoder, Error &error)
{
assert(encoder->open);
assert(!encoder->pre_tag);
assert(!encoder->tag);
assert(!encoder->end);
/* this method is optional */
return encoder->plugin.flush != nullptr
? encoder->plugin.flush(encoder, error)
: true;
}
/**
* Prepare for sending a tag to the encoder. This is used by some
* encoders to flush the previous sub-stream, in preparation to begin
* a new one.
*
* @param encoder the encoder
* @param tag the tag object
* @return true on success
*/
static inline bool
encoder_pre_tag(Encoder *encoder, Error &error)
{
assert(encoder->open);
assert(!encoder->pre_tag);
assert(!encoder->tag);
assert(!encoder->end);
/* this method is optional */
bool success = encoder->plugin.pre_tag != nullptr
? encoder->plugin.pre_tag(encoder, error)
: true;
#ifndef NDEBUG
encoder->pre_tag = success;
#endif
return success;
}
/**
* Sends a tag to the encoder.
*
* Instructions: call encoder_pre_tag(); then obtain flushed data with
* encoder_read(); finally call encoder_tag().
*
* @param encoder the encoder
* @param tag the tag object
* @return true on success
*/
static inline bool
encoder_tag(Encoder *encoder, const Tag *tag, Error &error)
{
assert(encoder->open);
assert(!encoder->pre_tag);
assert(encoder->tag);
assert(!encoder->end);
#ifndef NDEBUG
encoder->tag = false;
#endif
/* this method is optional */
return encoder->plugin.tag != nullptr
? encoder->plugin.tag(encoder, tag, error)
: true;
}
/**
* Writes raw PCM data to the encoder.
*
* @param encoder the encoder
* @param data the buffer containing PCM samples
* @param length the length of the buffer in bytes
* @return true on success
*/
static inline bool
encoder_write(Encoder *encoder, const void *data, size_t length,
Error &error)
{
assert(encoder->open);
assert(!encoder->pre_tag);
assert(!encoder->tag);
assert(!encoder->end);
return encoder->plugin.write(encoder, data, length, error);
}
/**
* Reads encoded data from the encoder.
*
* Call this repeatedly until no more data is returned.
*
* @param encoder the encoder
* @param dest the destination buffer to copy to
* @param length the maximum length of the destination buffer
* @return the number of bytes written to #dest
*/
static inline size_t
encoder_read(Encoder *encoder, void *dest, size_t length)
{
assert(encoder->open);
assert(!encoder->pre_tag || !encoder->tag);
#ifndef NDEBUG
if (encoder->pre_tag) {
encoder->pre_tag = false;
encoder->tag = true;
}
#endif
return encoder->plugin.read(encoder, dest, length);
}
/**
* Get mime type of encoded content.
*
* @param plugin the encoder plugin
* @return an constant string, nullptr on failure
*/
static inline const char *
encoder_get_mime_type(Encoder *encoder)
{
/* this method is optional */
return encoder->plugin.get_mime_type != nullptr
? encoder->plugin.get_mime_type(encoder)
: nullptr;
}
#endif

View File

@@ -1,110 +0,0 @@
/*
* Copyright (C) 2003-2013 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 "FilterConfig.hxx"
#include "filter/ChainFilterPlugin.hxx"
#include "FilterPlugin.hxx"
#include "FilterInternal.hxx"
#include "FilterRegistry.hxx"
#include "ConfigData.hxx"
#include "ConfigOption.hxx"
#include "ConfigGlobal.hxx"
#include "ConfigError.hxx"
#include "util/Error.hxx"
#include <algorithm>
#include <string.h>
/**
* Find the "filter" configuration block for the specified name.
*
* @param filter_template_name the name of the filter template
* @param error space to return an error description
* @return the configuration block, or nullptr if none was configured
*/
static const struct config_param *
filter_plugin_config(const char *filter_template_name, Error &error)
{
const struct config_param *param = nullptr;
while ((param = config_get_next_param(CONF_AUDIO_FILTER, param)) != nullptr) {
const char *name = param->GetBlockValue("name");
if (name == nullptr) {
error.Format(config_domain,
"filter configuration without 'name' name in line %d",
param->line);
return nullptr;
}
if (strcmp(name, filter_template_name) == 0)
return param;
}
error.Format(config_domain,
"filter template not found: %s",
filter_template_name);
return nullptr;
}
static bool
filter_chain_append_new(Filter &chain, const char *template_name, Error &error)
{
const struct config_param *cfg =
filter_plugin_config(template_name, error);
if (cfg == nullptr)
// The error has already been set, just stop.
return false;
// Instantiate one of those filter plugins with the template name as a hint
Filter *f = filter_configured_new(*cfg, error);
if (f == nullptr)
// The error has already been set, just stop.
return false;
const char *plugin_name = cfg->GetBlockValue("plugin",
"unknown");
filter_chain_append(chain, plugin_name, f);
return true;
}
bool
filter_chain_parse(Filter &chain, const char *spec, Error &error)
{
const char *const end = spec + strlen(spec);
while (true) {
const char *comma = std::find(spec, end, ',');
if (comma > spec) {
const std::string name(spec, comma);
if (!filter_chain_append_new(chain, name.c_str(),
error))
return false;
}
if (comma == end)
break;
spec = comma + 1;
}
return true;
}

View File

@@ -1,97 +0,0 @@
/*
* Copyright (C) 2003-2013 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 "GlobalEvents.hxx"
#include "util/Manual.hxx"
#include "event/DeferredMonitor.hxx"
#include "Compiler.h"
#include <atomic>
#include <assert.h>
namespace GlobalEvents {
class Monitor final : public DeferredMonitor {
public:
Monitor(EventLoop &_loop):DeferredMonitor(_loop) {}
protected:
virtual void RunDeferred() override;
};
static Manual<Monitor> monitor;
static std::atomic_uint flags;
static Handler handlers[MAX];
}
/**
* Invoke the callback for a certain event.
*/
static void
InvokeGlobalEvent(GlobalEvents::Event event)
{
assert((unsigned)event < GlobalEvents::MAX);
assert(GlobalEvents::handlers[event] != nullptr);
GlobalEvents::handlers[event]();
}
void
GlobalEvents::Monitor::RunDeferred()
{
const unsigned f = flags.exchange(0);
for (unsigned i = 0; i < MAX; ++i)
if (f & (1u << i))
/* invoke the event handler */
InvokeGlobalEvent(Event(i));
}
void
GlobalEvents::Initialize(EventLoop &loop)
{
monitor.Construct(loop);
}
void
GlobalEvents::Deinitialize()
{
monitor.Destruct();
}
void
GlobalEvents::Register(Event event, Handler callback)
{
assert((unsigned)event < MAX);
assert(handlers[event] == nullptr);
handlers[event] = callback;
}
void
GlobalEvents::Emit(Event event)
{
assert((unsigned)event < MAX);
const unsigned mask = 1u << unsigned(event);
if (GlobalEvents::flags.fetch_or(mask) == 0)
monitor->Schedule();
}

View File

@@ -1,73 +0,0 @@
/*
* Copyright (C) 2003-2013 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_GLOBAL_EVENTS_HXX
#define MPD_GLOBAL_EVENTS_HXX
#ifdef WIN32
#include <windows.h>
/* DELETE is a WIN32 macro that poisons our namespace; this is a
kludge to allow us to use it anyway */
#ifdef DELETE
#undef DELETE
#endif
#endif
class EventLoop;
namespace GlobalEvents {
enum Event {
/** database update was finished */
UPDATE,
/** during database update, a song was deleted */
DELETE,
/** an idle event was emitted */
IDLE,
/** must call playlist_sync() */
PLAYLIST,
/** the current song's tag has changed */
TAG,
/** a hardware mixer plugin has detected a change */
MIXER,
#ifdef WIN32
/** shutdown requested */
SHUTDOWN,
#endif
MAX
};
typedef void (*Handler)();
void Initialize(EventLoop &loop);
void Deinitialize();
void Register(Event event, Handler handler);
void Emit(Event event);
}
#endif /* MAIN_NOTIFY_H */

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2013 The Music Player Daemon Project
* Copyright 2003-2017 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -22,9 +22,8 @@
#include "thread/Mutex.hxx"
#include "thread/Cond.hxx"
#include "thread/Thread.hxx"
#include "thread/Name.hxx"
#include "event/Loop.hxx"
#include "system/FatalError.hxx"
#include "util/Error.hxx"
#include <assert.h>
@@ -48,6 +47,8 @@ io_thread_run(void)
static void
io_thread_func(gcc_unused void *arg)
{
SetThreadName("io");
/* lock+unlock to synchronize with io_thread_start(), to be
sure that io.thread is set */
io.mutex.lock();
@@ -71,11 +72,8 @@ io_thread_start()
assert(io.loop != nullptr);
assert(!io.thread.IsDefined());
const ScopeLock protect(io.mutex);
Error error;
if (!io.thread.Start(io_thread_func, nullptr, error))
FatalError(error);
const std::lock_guard<Mutex> protect(io.mutex);
io.thread.Start(io_thread_func, nullptr);
}
void

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2013 The Music Player Daemon Project
* Copyright 2003-2017 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -25,7 +25,7 @@
class EventLoop;
void
io_thread_init(void);
io_thread_init();
void
io_thread_start();
@@ -36,7 +36,7 @@ io_thread_start();
* only.
*/
void
io_thread_run(void);
io_thread_run();
/**
* Ask the I/O thread to quit, but does not wait for it. Usually, you
@@ -44,12 +44,12 @@ io_thread_run(void);
* includes this.
*/
void
io_thread_quit(void);
io_thread_quit();
void
io_thread_deinit(void);
io_thread_deinit();
gcc_pure
gcc_const
EventLoop &
io_thread_get();
@@ -58,6 +58,6 @@ io_thread_get();
*/
gcc_pure
bool
io_thread_inside(void);
io_thread_inside();
#endif

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2013 The Music Player Daemon Project
* Copyright 2003-2017 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -20,11 +20,11 @@
#include "config.h"
#include "IcyMetaDataParser.hxx"
#include "tag/Tag.hxx"
#include "tag/TagBuilder.hxx"
#include "util/Domain.hxx"
#include "util/StringView.hxx"
#include "Log.hxx"
#include <glib.h>
#include <assert.h>
#include <string.h>
@@ -37,7 +37,7 @@ IcyMetaDataParser::Reset()
return;
if (data_rest == 0 && meta_size > 0)
g_free(meta_data);
delete[] meta_data;
delete tag;
@@ -66,7 +66,7 @@ IcyMetaDataParser::Data(size_t length)
}
static void
icy_add_item(Tag &tag, TagType type, const char *value)
icy_add_item(TagBuilder &tag, TagType type, const char *value)
{
size_t length = strlen(value);
@@ -77,11 +77,11 @@ icy_add_item(Tag &tag, TagType type, const char *value)
}
if (length > 0)
tag.AddItem(type, value, length);
tag.AddItem(type, {value, length});
}
static void
icy_parse_tag_item(Tag &tag, const char *name, const char *value)
icy_parse_tag_item(TagBuilder &tag, const char *name, const char *value)
{
if (strcmp(name, "StreamTitle") == 0)
icy_add_item(tag, TAG_TITLE, value);
@@ -122,7 +122,7 @@ icy_parse_tag(char *p, char *const end)
assert(end != nullptr);
assert(p <= end);
Tag *tag = new Tag();
TagBuilder tag;
while (p != end) {
const char *const name = p;
@@ -153,7 +153,7 @@ icy_parse_tag(char *p, char *const end)
*quote = 0;
p = quote + 1;
icy_parse_tag_item(*tag, name, value);
icy_parse_tag_item(tag, name, value);
char *semicolon = std::find(p, end, ';');
if (semicolon == end)
@@ -161,7 +161,7 @@ icy_parse_tag(char *p, char *const end)
p = semicolon + 1;
}
return tag;
return tag.CommitNew();
}
size_t
@@ -190,7 +190,7 @@ IcyMetaDataParser::Meta(const void *data, size_t length)
/* initialize metadata reader, allocate enough
memory (+1 for the null terminator) */
meta_position = 0;
meta_data = (char *)g_malloc(meta_size + 1);
meta_data = new char[meta_size + 1];
}
assert(meta_position < meta_size);
@@ -211,7 +211,7 @@ IcyMetaDataParser::Meta(const void *data, size_t length)
delete tag;
tag = icy_parse_tag(meta_data, meta_data + meta_size);
g_free(meta_data);
delete[] meta_data;
/* change back to normal data mode */
@@ -221,3 +221,32 @@ IcyMetaDataParser::Meta(const void *data, size_t length)
return length;
}
size_t
IcyMetaDataParser::ParseInPlace(void *data, size_t length)
{
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;
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2013 The Music Player Daemon Project
* Copyright 2003-2017 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -75,6 +75,13 @@ public:
*/
size_t Meta(const void *data, size_t length);
/**
* Parse data and eliminate metadata.
*
* @return the number of data bytes remaining in the buffer
*/
size_t ParseInPlace(void *data, size_t length);
Tag *ReadTag() {
Tag *result = tag;
tag = nullptr;

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