Compare commits

...

3282 Commits

Author SHA1 Message Date
Max Kellermann
daba1238b5 release v0.18.3 2013-11-08 12:55:12 +01:00
Max Kellermann
d125567f4a doc/developer: add text from the wiki 2013-11-08 12:54:16 +01:00
Max Kellermann
993eca9327 Makefile.am: disable dist-bzip2
bzip2-compressed tarballs are obsolete, xz is better and widely
understood.
2013-11-08 12:29:56 +01:00
Max Kellermann
e314844a4d doc: show .tar.xz in sample unpack command 2013-11-08 12:29:04 +01:00
Max Kellermann
017bc564af doc: replace the remaining wikia links 2013-11-08 12:26:07 +01:00
Max Kellermann
e076ff9085 DecoderAPI: log without holding mutex 2013-11-08 12:15:05 +01:00
Max Kellermann
2789493a5f PlayerThread: fix stuck MPD after song change (0.18.2 regression)
Commit 77c63511 caused MPD to become stuck right after a song change.
The problem was that at some point, the MusicBuffer became full, and
the DecoderThread working on the next song waits for the PlayerThread.
However, the PlayerThread was stuck in a loop of g_usleep() calls, and
never bothered to tell the DecoderThread that the MusicBuffer is not
full anymore.  This bug is very old, but its chance to occur went from
nearly 0% to nearly 100%.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- remove incorrect g_free() call

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Add the following to your config:

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

Then you can stream from soundcloud using calls like:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Its in the top commit in my repository in a branch called 'doc_fix':
git://github.com/mcfiredrill/mpd.git
2011-07-03 14:53:37 +02:00
Max Kellermann
08e2e2e791 fd_util: add function socketpair_cloexec_nonblock() 2011-07-01 10:50:15 +02:00
Avuton Olrich
3c4f4793b5 Modify version string to post-release version 0.16.4~git 2011-06-04 07:37:34 -07:00
Avuton Olrich
e2950a7e4d mpd version 0.16.3 2011-06-04 07:37:33 -07:00
Max Kellermann
531c0067ec Makefile.am: distribute client_idle.h 2011-06-03 17:27:43 +02:00
Max Kellermann
e228caaca6 Merge branch 'v0.16.x'
Conflicts:
	src/decoder/ffmpeg_decoder_plugin.c
2011-06-03 16:58:09 +02:00
Max Kellermann
4b4aa64261 directory: allow directories with just playlists
Keep those when scanning for empty directories.  The check in
playlist_vector_is_empty() was missing.
2011-05-09 21:37:43 +02:00
Qball Cow
9ac8f89b1d cue_tag: show CUE track numbers 2011-05-09 21:26:36 +02:00
Max Kellermann
c6a72a14ac decoder/ffpmeg: don't use av_metadata_conv() in ffmpeg 0.7
It's a no-op and deprecated.
2011-05-09 21:24:18 +02:00
Max Kellermann
c74edd0e33 decoder/ffmpeg: use AVIOContext instead of ByteIOContext 2011-05-09 21:23:58 +02:00
Max Kellermann
98acf3f281 input/ffmpeg: use the new AVIOContext API
URLContext is deprecated.
2011-05-09 21:23:24 +02:00
Max Kellermann
26735390ff playlist_song: fix playlist files in base music directory
g_path_get_dirname() returns "." when there is no directory name in
the given path.  This patch adds a workaround for that.
2011-05-09 18:05:11 +02:00
Max Kellermann
9402b23dd5 playlist_song: fix NULL pointer dereference 2011-05-09 18:03:54 +02:00
Max Kellermann
246db3d565 decoder/ffmpeg: use avcodec_decode_audio3() if available
avcodec_decode_audio3() has been added in libavformat 52.25.0, and the
predecessor avcodec_decode_audio2() has been deprecated.
2011-05-09 09:24:17 +02:00
Max Kellermann
eaf414cbc8 decoder/ffmpeg: make variables more local 2011-05-09 09:24:15 +02:00
Anton Khirnov
327d41c00f decoder/ffmpeg: don't use deprecated CODEC_TYPE_AUDIO with new lavc
fixes build with lavc 53.
2011-05-09 08:00:45 +02:00
Max Kellermann
05d8ce3bcd decoder/ffmpeg: define fallback macro AV_VERSION_INT()
For ffmpeg < 0.5.  Copied from libavutil 0.5.
2011-05-09 08:00:45 +02:00
Max Kellermann
fe30db935b decoder/ffmpeg: use avcodec_decode_audio3() if available
avcodec_decode_audio3() has been added in libavformat 52.25.0, and the
predecessor avcodec_decode_audio2() has been deprecated.
2011-04-12 08:20:35 +02:00
Max Kellermann
6303d54cbb decoder/ffmpeg: make variables more local 2011-04-12 08:17:30 +02:00
Anton Khirnov
9d91aa23e6 decoder/ffmpeg: drop support for pre-0.5 ffmpeg
All modern distros ship 0.5, so there's no need to support old and buggy
ffmpeg versions.
2011-04-12 08:14:14 +02:00
Max Kellermann
c2ada39fd3 Merge branch 'v0.16.x'
Conflicts:
	NEWS
	configure.ac
2011-04-12 08:11:33 +02:00
Max Kellermann
def2fe8805 Merge branch 'v0.15.x' into v0.16.x
Conflicts:
	NEWS
	configure.ac
	src/listen.c
2011-04-12 07:39:01 +02:00
Simon Kagstrom
77b6e27500 playlist: Despotify plugin: Correct init in daemon mode
There is a global despotify session, so it should not be initialized
until needed.
2011-04-12 07:28:00 +02:00
Simon Kagstrom
99640171e2 doc: Add despotify user documentation 2011-04-12 07:27:59 +02:00
Simon Kagstrom
38b3ab791f doc: INSTALL: Add despotify dependencies 2011-04-12 07:27:59 +02:00
Simon Kagstrom
a86fc52eea configure.ac: Correct error message for missing despotify package 2011-04-12 07:27:59 +02:00
Jonathan Neuschäfer
6d3ed3f16f fix common misspellings
These fixes were mostly generated with `codespell' [0] and manually
reviewed.

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

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

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

Uses the pcm_decoder_plugin for the output
2011-03-29 17:01:16 +02:00
Simon Kagstrom
eec77b3ae7 despotify: Add support utilities
Used to connect and authenticate to despotify. Provides a singleton
session and a desptoify-track-to-tags function.
2011-03-29 17:01:16 +02:00
Max Kellermann
f680b0a431 decoder/flac: fix enum mismatch in flac_tell_cb()
Fix clang warning.
2011-03-23 22:31:40 +01:00
Max Kellermann
d4b00ff11c listen: suppress "unused variable" warning 2011-03-23 22:27:31 +01:00
Max Kellermann
532f94a187 audio_parser: fix assertion failure in audio format mask parser
Use audio_format_mask_valid() to verify a mask.
2011-03-23 22:22:51 +01:00
Max Kellermann
87ad2f8542 command: fix return value of handle_currentsong()
Thanks to clang for complaining.
2011-03-23 22:16:46 +01:00
Simon Kagstrom
640bac1aa4 decoder: PCM decoder: Inherit seekable from the input stream
E.g., spotify isn't seekable.
2011-03-23 22:13:11 +01:00
Simon Kagstrom
0b12fae84d decoder: PCM decoder: Break loop if EOF is encountered
Otherwise the song playing might go on forever.
2011-03-23 22:13:08 +01:00
Simon Kagstrom
a8f891efcd configure.ac: Enable HAVE_OGG_COMMON when using libtremor
Otherwise OGGs can't be played.
2011-03-23 22:09:58 +01:00
Hans-Kristian Arntzen
d9353c4fd3 Remove unused headers in Roar plugin.
Should fix build errors for Win32.
2011-03-23 21:59:22 +01:00
Max Kellermann
0c9fc2f809 Merge commit 'release-0.16.2'
Conflicts:
	Makefile.am
	NEWS
	configure.ac
2011-03-19 09:58:07 +01:00
Avuton Olrich
b5fc2419e8 Modify version string to post-release version 0.16.3~git 2011-03-18 17:43:11 -07:00
Avuton Olrich
fe588a255b mpd version 0.16.2 2011-03-18 17:43:11 -07:00
Max Kellermann
1fc571088b command: print playlist load error
Call print_playlist_result() instead of casting the enum implicitly.
2011-03-18 19:45:59 +01:00
Max Kellermann
8d83914f05 output/httpd: include sys/socket.h only when building with libwrap
Fixes build failure on WIN32.
2011-03-18 19:44:12 +01:00
Max Kellermann
0fdcd381bc update_walk: ignore parameter "mode" on WIN32
Fix compiler warning.
2011-03-18 19:43:26 +01:00
Max Kellermann
4f293ecd6f audio_format, output_thread: add more audio_format_valid() assertions 2011-03-16 23:37:41 +01:00
Max Kellermann
b6303313f0 encoder/vorbis: reset the Ogg stream after flush
Without the ogg_stream_reset() call, the "e_o_s" flag never gets
reset, and libogg writes EOS packets over and over.
2011-03-16 19:16:06 +01:00
Max Kellermann
a28449a123 encoder/vorbis: reset the Ogg stream after flush
Without the ogg_stream_reset() call, the "e_o_s" flag never gets
reset, and libogg writes EOS packets over and over.
2011-03-16 19:13:46 +01:00
Max Kellermann
6dcec36621 Merge release 0.15.16 into v0.16.x
Conflicts:
	NEWS
	configure.ac
	src/output/jack_plugin.c
	src/update.c
2011-03-16 18:08:54 +01:00
Hans-Kristian Arntzen
1a954748a0 RoarAudio output plugin 2011-03-16 17:57:47 +01:00
Avuton Olrich
84d0fd39a3 Modify version string to post-release version 0.15.17~git 2011-03-13 20:27:33 -07:00
Avuton Olrich
4d4b7e3de0 mpd version 0.15.16 2011-03-13 20:27:33 -07:00
Ulrich Spörlein
e2aea6bce5 output/httpd: include sys/socket.h for AF_UNIX 2011-03-09 19:53:48 +01:00
Ulrich Spörlein
5779146a7f configure.ac: fix bashism in tremor test
This makes FreeBSD detect libogg correctly. The '==' operator is an
undocumented GNU extension to test(1) and cannot be relied upon to
exist and do the right thing. POSIX mandates string comparisons to be
done using "test foo = bar".
2011-03-09 19:50:54 +01:00
Max Kellermann
a1d1c2beaa output/oss: disable 24 bit playback on FreeBSD
See code comment.
2011-02-28 00:09:45 +01:00
Max Kellermann
ee9c60fad4 output/oss: AFMT_S24_PACKED is little-endian
According to the Solaris dsp manpage, AFMT_S24_PACKED is
little-endian:

 http://download.oracle.com/docs/cd/E19963-01/821-1475/6nmf5baot/index.html

The Minix soundcard.h header says the same.
2011-02-28 00:00:41 +01:00
Max Kellermann
2abad0f479 command: "update" and "rescan" need only "CONTROL" permission
From http://bugs.debian.org/513291

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

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

 "I'd suggest to remove the db update from the admin group and either
 add it to "control" or an own group."
2011-02-27 23:35:00 +01:00
Max Kellermann
1674a4ec82 output/jack: fix crash with mono playback
With mono sound, jack_sample_size is smaller than frame_size (4 vs 2
bytes), and "space/jack_sample_size==0".  That means mpd_jack_play()
will return 0, although no error has occurred.
2011-02-27 23:26:50 +01:00
Max Kellermann
ce370bee60 output/jack: rename variable sample_size to jack_sample_size 2011-02-25 10:46:44 +01:00
Max Kellermann
2fb40fe728 playlist_state: add option "restore_paused"
When set, MPD will not auto-start playback on startup; it will be in
"paused" state.
2011-02-23 09:10:23 +01:00
Max Kellermann
b57330cf75 playlist_state: declare local variable as enum 2011-02-23 09:10:23 +01:00
Max Kellermann
8cd91fabf9 configure.ac: disable -Wno-deprecated-declarations 2011-02-23 09:01:53 +01:00
Max Kellermann
e0580ee385 configure.ac: protocol version 0.17
The client-to-client protocol was added, and that justifies increasing
the protocol version.
2011-02-22 09:16:32 +01:00
Max Kellermann
e257484870 Makefile.am: distribute test/stdbin.h 2011-02-18 08:19:37 +01:00
Christopher Brannon
2a1f4539f6 Insure proper initialization of stack-allocated struct.
Version 1.0.0 of the libao library added a new field to the
ao_sample_format struct.  It is a char * named matrix.  When
an ao_sample_format is allocated on the stack, this field contains
garbage.  The proper course is to insure that is initialized to NULL.
NULL indicates that we do not want any mapping.
The struct is now initialized using a static initializer, and this
technique is compatible with all known versions of libao.
2011-02-15 12:16:25 +01:00
Max Kellermann
906efdd320 Makefile.am: compile test/run_encoder with ENCODER_CFLAGS 2011-02-13 23:22:57 +01:00
Thomas Jansen
144d092637 output/shout: add possibility to set url
Added a new optional parameter for the shout plugin called "url".
2011-02-09 22:42:51 +01:00
Thomas Jansen
948b8f35e6 general: whitespace cleanup
Remove trailing whitespace found by this command:
find -name '*.[ch]' | xargs grep "[[:space:]]$"
2011-02-09 22:42:31 +01:00
Thomas Jansen
e776c605ad output/httpd: initialize unflushed_input
This fixes the following valgrind warning occuring on the first call of
httpd_output_read_page:
==20124== Conditional jump or move depends on uninitialised value(s)
==20124==    at 0x425E65: httpd_output_read_page (httpd_output_plugin.c:240)
==20124==    by 0x426087: httpd_output_open (httpd_output_plugin.c:279)
==20124==    by 0x41D862: ao_open (output_plugin.h:206)
==20124==    by 0x41E133: audio_output_task (output_thread.c:590)
2011-02-09 22:41:36 +01:00
Tony Miller
8b2f4fc823 Set fadeout in gme_decoder_plugin. Due to the nature of the gme library,
this needs to be done for the end of songs to be detected.
2011-02-03 00:25:35 +01:00
Max Kellermann
03018611f8 update: log all file permission problems 2011-01-31 09:39:24 +01:00
Thomas Jansen
2bde9afdb9 configure.ac: fix copy&paste error 2011-01-29 13:49:32 +01:00
Max Kellermann
f8b09c194f protocol: support client-to-client communication 2011-01-29 10:43:54 +01:00
Max Kellermann
0e69ad32c1 client_idle: export client_idle_add() 2011-01-29 10:43:54 +01:00
Max Kellermann
9b4e14df71 client_idle: add header client_idle.h 2011-01-29 10:43:54 +01:00
Max Kellermann
03f7803f26 test/read_mixer: add workaround for missing RAOP symbols 2011-01-29 10:43:54 +01:00
Max Kellermann
c6cbcc2c25 copyright year 2011 2011-01-29 10:13:54 +01:00
Ian Zimmerman
27aa34d4ae input/curl: enable CURLOPT_NETRC
I wanted mpd to play a mp3 stream from a music website.  The stream is
only available to subscribers, which restriction is enforced through
normal http authentication.  However, the URL I get from the website
is not the final URL of the stream, but a generic URL which points to
the real one through a redirect (code 301).  Thus, I cannot predict
the final URL, and so I cannot use the username:password hack to force
the authentication, and mpd (libcurl on mpds behalf) fails to grab the
stream.

libcurl allows the option CURLOPT_NETRC to be set and then the
credentials can be stored in the good old .netrc file (in this case it
would be ~mpd/.netrc, of course).  But mpd doesn't set this option.  I
think it should.
2011-01-29 08:43:30 +01:00
Dustin Puckett
79e0db4ca0 output/raop: new output plugin
Remote Audio Output Protocol (RAOP), for Apple devices.
2011-01-28 21:17:09 +01:00
Max Kellermann
8f99c954ad NEWS: fix 0.16.1 release year 2011-01-28 21:12:17 +01:00
Max Kellermann
5735c9efc1 configure.ac: fix tremor configure test
When the configure options were moved around for 0.16, the order was
changed, and the Tremor check broke.
2011-01-28 12:21:03 +01:00
Yuriy Kaminskiy
9ae3acf2e7 mpg123 decoder: implement seeking 2011-01-21 15:37:08 +01:00
Yuriy Kaminskiy
731ea9b489 mpg123 decoder: report bitrate 2011-01-21 15:37:08 +01:00
Max Kellermann
18b30b5019 decoder_thread: fix assertion failure at song end
Don't finish the current command twice.

This bug was never noticed, but was revealed by a new assertion check.
2011-01-16 17:52:03 +01:00
Andreas Wiese
e6c3acaa6f Fix NDEBUG test
<stdbool.h> needs to be included unconditionally from definition of
NDEBUG, since »bool« doesn't get defined otherwise.

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

This prepares multi-player support.
2011-01-10 19:46:23 +01:00
Max Kellermann
715844fd08 dbUtils: don't use directoryAddSongToPlaylist() twice
In findAddInDirectory(), call playlist_append_song() directly, to have
some more type checking.
2011-01-10 19:46:14 +01:00
Max Kellermann
2b29ca796e Merge commit 'release-0.16.1'
Conflicts:
	NEWS
2011-01-10 11:47:14 +01:00
Avuton Olrich
44b4b50949 Modify version string to post-release version 0.16.2~git 2011-01-09 18:00:12 -08:00
Avuton Olrich
9ad862d3a6 mpd version 0.16.1 2011-01-09 18:00:12 -08:00
Yuriy Kaminskiy
77d71c4ee6 Makefile.am: resolve modplug vs. libsndfile cflags/headers conflict
A bit of automake magic (see info automake "Per-Object Flags").
Compile-tested.
2011-01-09 18:21:27 +01:00
Max Kellermann
5184008812 input_init: add assertions on completeness of plugins 2011-01-08 18:27:57 +01:00
Max Kellermann
cf696ce443 input/cdio_paranoia: add module name
Seems like we forgot to give this module a name...  this can crash MPD
on startup.
2011-01-08 18:27:57 +01:00
Max Kellermann
1a2ea4c06c Merge branch 'v0.16.x'
Conflicts:
	NEWS
	configure.ac
2011-01-07 23:52:23 +01:00
Max Kellermann
8c0afd8557 Merge branch 'v0.15.x' into v0.16.x
Conflicts:
	NEWS
	configure.ac
	src/directory.h
2011-01-07 23:50:23 +01:00
Max Kellermann
2a56300f7b player_thread: discard empty chunks while cross-fading
When a music_chunk to be crossfaded consists only of a tag,
cross-fading is not possible, and led to an assertion failure.  This
patch just discards those, as if cross-fading was not enabled.
2011-01-07 23:45:51 +01:00
Max Kellermann
5f06999686 output_thread: fix double lock
During the whole output thread, the audio_output object is locked, and
it is only unlocked while waiting for the GCond and while running a
plugin method.  The error handler in ao_play_chunk() attempted to lock
the object again, which was code from MPD 0.15.x which should have
been removed a long time ago.
2011-01-07 23:08:18 +01:00
Max Kellermann
4c09aeb5a1 player_thread: fix assertion failure due to early seek
Until the decoder plugin has called decoder_initialized(), the player
may not submit seek commands.  This however could occur with a slow
decoder and a CUE file with a virtual song offset.  This patch adds
another check.
2011-01-07 22:52:50 +01:00
Max Kellermann
af892e7e80 player_thread: make variables more local 2011-01-07 22:33:10 +01:00
Max Kellermann
0022fb100b encoder/lame: explicitly configure the output sample rate
When you don't explicitly set an output sample rate, liblame tries to
guess an output sample rate from the input sample rate.  You would
think that this "guessing" consists of just setting both equal, but
that is not the case.  For 44.1kHz at 96kbit/s, liblame chooses
32kHz.  This patch explicitly configures the output sample rate, to
stop the bad guessing.
2011-01-07 19:37:39 +01:00
Max Kellermann
4f2d67dfb0 output/httpd: define G_LOG_DOMAIN in httpd_client.c 2011-01-07 18:00:12 +01:00
Max Kellermann
b5645ab29f output/osx: fix up audio format first, then apply it to device
This is a MPD 0.16 regression: when playing a 24 bit file, the switch
to 16 bit was made only partially, after mBytesPerPacket and
mBytesPerFrame had already been applied.

That means mBytesPerFrame referred to 24 bit, and mBitsPerChannel
referred to 16 bits.  Of course, that cannot work.
2011-01-07 17:31:36 +01:00
Max Kellermann
3149d1abf9 configure.ac: eliminate bashism "echo -n"
Use "printf" instead.
2011-01-07 17:31:30 +01:00
Max Kellermann
59a417fc84 configure.ac: avoid GNU extension in "expr match" call 2011-01-07 17:29:19 +01:00
Max Kellermann
b75d53413d configure.ac: use AC_LANG_SOURCE
Fixes autotools warnings.
2011-01-07 17:25:52 +01:00
Max Kellermann
c44a744c0b fix version number in NEWS 2011-01-07 17:25:25 +01:00
Anton Khirnov
a800afcbf8 docs: mention 'sticker' idle event 2011-01-05 13:03:17 +01:00
Ben Kibbey
ff4534613a Build fix for Linux. Define _GNU_SOURCE in src/server_socket.c. 2010-12-27 04:36:23 +01:00
Max Kellermann
b8fe2c74bc Makefile.am: generate doxygen.conf
Don't create a modified copy for out-of-tree builds.
2010-12-24 00:25:31 +01:00
Max Kellermann
be3b5199b0 stored_playlist: remove database lookups from spl_load()
Don't look up songs in the database, no caller needs this.
2010-12-23 16:25:37 +01:00
Max Kellermann
d849a40af6 stored_playlist: ignore empty lines 2010-12-23 16:25:22 +01:00
Max Kellermann
4f48c10312 stored_playlist: use the text_file library to read lines 2010-12-23 16:25:05 +01:00
Max Kellermann
5274fee8a7 playlist_song: add flag "secure"
Optionally allow all local files.

"Insecure" mode is used for printing playlists.
2010-12-23 16:24:00 +01:00
Max Kellermann
5462f34ed0 string_util: add function strchug_fast()
Replace g_strchug() calls with a cheaper implementation.
2010-12-23 16:23:20 +01:00
Max Kellermann
0958ed5844 utils: move string_array_contains() to string_util.c 2010-12-23 16:23:04 +01:00
Max Kellermann
e3cba18532 decoder: new "pcm" decoder plugin
Just there to support the "cdio_paranoia" input plugin.
2010-12-22 09:48:48 +01:00
Max Kellermann
9bf7fde49f configure.ac: hook the cdio_paranoia input plugin 2010-12-22 09:44:02 +01:00
Max Kellermann
4783ebc918 input/cdda: rename plugin to "cdio_paranoia" 2010-12-22 09:43:57 +01:00
Max Kellermann
8bda52783b input/cdda: support reading the whole disc 2010-12-22 09:43:53 +01:00
Max Kellermann
07feec7ea6 input/cdda: remove unused function input_cdda_archive_extract_trackno() 2010-12-22 09:43:49 +01:00
Max Kellermann
e7471f589a input/cdda: import missing pcm16_to_wave() from the wave encoder 2010-12-22 09:43:47 +01:00
Max Kellermann
24208be5cf input/cdda: implement parse_cdda_uri()
Was missing.
2010-12-22 09:43:41 +01:00
Max Kellermann
8db5f66498 input/cdda: call input_cdda_close() with an input_stream pointer
Another build fix.
2010-12-22 09:43:27 +01:00
Max Kellermann
be670bfd1f input/cdda: move code to cdda_detect_drive() 2010-12-22 09:43:20 +01:00
Max Kellermann
19acf090ed input/cdda: remove newlines from error messages 2010-12-22 09:43:16 +01:00
Max Kellermann
2de7f6b457 input/cdda: remove debug code 2010-12-22 09:42:10 +01:00
Max Kellermann
a2e265e9a2 input/cdda: some general build failure fixes 2010-12-22 07:44:56 +01:00
Viliam Mateicka
28d7b29d72 input_cdda_plugin: new plugin to handle cdda:// protocol to access CD-DA audio CD's 2010-12-22 07:36:14 +01:00
Max Kellermann
76cddfab90 configure.ac: disable the FFADO plugin by default
It is known to crash instantly.
2010-12-22 07:31:17 +01:00
Max Kellermann
60b4f6b3eb directory: fix warning "comparison between signed and unsigned"
Cast the constant to dev_t, not to unsigned.
2010-12-21 20:21:22 +01:00
Max Kellermann
546232b1c0 zeroconf-bonjour: use g_htons() instead of htons()
Fixes the gcc warning "implicit declaration of function 'htons'".
2010-12-21 20:21:20 +01:00
Max Kellermann
42c5788de3 Modify version string to post-release version 0.15.16~git 2010-12-21 20:19:49 +01:00
Max Kellermann
fb00e7fddc add void casts to suppress "result unused" warnings (clang) 2010-12-21 08:06:02 +01:00
Alex Viskovatoff
41fdcf328c decoder/mad: work around build failure on Solaris
Rename the "version" struct, because it seems to be a reserved name on
Solaris:

 "src/decoder/mad_decoder_plugin.c", line 550: (enum) tag redeclared: version
 cc: acomp failed for src/decoder/mad_decoder_plugin.c
2010-12-21 07:57:07 +01:00
Greg Ward
9cb4aaf3c2 osx_output: always pass OS X result code to g_set_error().
Should be safe on OS X 10.4 (32-bit), since Apple's OSStatus boils
down to "signed long", and g_set_error() takes gint, which is really
just "int".  Assigning "signed long" to "int" on 32-bit Unix should be
just fine, since both are signed 32-bit ints.

No idea if this is safe on 64-bit OS X.
2010-12-21 07:37:54 +01:00
Greg Ward
80dc602193 osx_output: allow user to specify other audio devices.
Add new config parameter 'device' to audio_output type "osx":
- if not supplied or set to "default", open default device
- if set to "system", open system device
- otherwise 'device' should be an audio device name: mpd will find and
  open the specified audio device, falling back to the default
  device if it's not found
2010-12-21 07:36:28 +01:00
Alex Viskovatoff
144ad7992e output/solaris: add missing parameter to open_cloexec() call 2010-12-21 07:31:08 +01:00
Alex Viskovatoff
a0dd1a1b8b audio_check: fix parameter in prototype 2010-12-21 07:29:58 +01:00
Max Kellermann
c360e69162 Modify version string to post-release version 0.16.1~git 2010-12-21 07:29:31 +01:00
Avuton Olrich
c7f5a87258 Modify version string to post-release version 0.17~git 2010-12-11 04:19:49 -08:00
Avuton Olrich
da01c6ef5b mpd version 0.16 2010-12-11 04:19:49 -08:00
Max Kellermann
fcd2355f4f Merge branch 'master' of git://git.musicpd.org/avuton/mpd 2010-12-07 18:18:19 +01:00
Max Kellermann
748a8a6f42 tag_id3: support multiple values
Loop over all frames with a specific id, and import all of them - not
just the first one (index 0).
2010-12-07 18:05:44 +01:00
Anton Khirnov
cb9965bab5 command: don't error when sticker list is run on song with no stickers
this is inconsistent with other commands (e.g. find) and seems wrong --
a song with no stickers attached is a perfectly valid state and an empty
list of stickers is also perfectly valid.
2010-12-07 17:32:52 +01:00
Max Kellermann
429ed24c99 tag_ape: support multiple values
One APE tag may contain more than one value, separated by null bytes.
2010-11-24 08:59:04 +01:00
Max Kellermann
1ab46472ab decoder_thread: load APE replay gain from music files 2010-11-18 23:02:30 +01:00
Max Kellermann
f6bbe1332f replay_gain_ape: parse replay gain from APE tags
Based on the APE reader.
2010-11-18 22:26:06 +01:00
Max Kellermann
11613347be tag_ape: move code to ape.c
Generic library for scanning APE tags.  Eliminated one "goto"!
2010-11-18 21:44:24 +01:00
Max Kellermann
8f46f1520c timer: fix integer overflow in timer_delay()
Fixes a regression: for output_plugin.delay(), we added a method to
the timer class which returns the delay in milliseconds.  This fails
to detect negative values, because the unsigned integer is divided by
1000, and then casted to signed.
2010-11-18 21:29:03 +01:00
Avuton Olrich
f2893b0d0f Modify version string to post-release version 0.16~git 2010-11-08 18:57:09 -08:00
Avuton Olrich
c7265f9689 mpd version 0.16~alpha4 2010-11-08 18:57:09 -08:00
Max Kellermann
46ab8d18e2 playlist_song: calculate duration of last CUE track 2010-11-08 20:16:26 +01:00
Max Kellermann
f384f8da93 Merge release 0.15.15 from branch 'v0.15.x'
Conflicts:
	NEWS
	configure.ac
2010-11-08 18:50:22 +01:00
Max Kellermann
23cd8a74be mpd version 0.15.15 2010-11-08 18:48:28 +01:00
Max Kellermann
cc1debc948 output/shout: artist comes first in stream title
After popular demand, I've switched the order of "artist" and "title"
in the stream title.  There is no standard, and there is no reliable
way to parse those from the stream title.
2010-11-08 18:46:14 +01:00
Max Kellermann
5a3aa1262a update_walk: explicitly check for permission problems
Call access() and print an extra error message when EACCES is
returned.  Hopefully this will reduce the number of support requests
due to wrong file permissions.
2010-11-08 18:24:19 +01:00
Max Kellermann
ad52eb236d input/rewind: fix assertion failure
The assertion added in MPD 0.15.14 was too much, it failed when the
MIME type of a stream was NULL.
2010-11-08 10:37:09 +01:00
Avuton Olrich
d2c2cbd0ae Modify version string to post-release version 0.16~git 2010-11-07 06:39:31 -08:00
Avuton Olrich
af4a93dbcf mpd version 0.16~alpha3 2010-11-07 06:39:31 -08:00
Max Kellermann
4478b3ef74 Merge release 0.15.14 from branch 'v0.15.x'
Conflicts:
	NEWS
	configure.ac
	src/decoder_control.c
	src/decoder_control.h
	src/input/rewind_input_plugin.c
	src/output_control.c
	src/output_thread.c
	src/player_thread.c
2010-11-07 15:30:18 +01:00
Avuton Olrich
462bba8e2f Modify version string to post-release version 0.15.15~git 2010-11-06 14:42:03 -07:00
Avuton Olrich
dec7090198 mpd version 0.15.14 2010-11-06 14:42:02 -07:00
Max Kellermann
83ec0e5552 player_thread: fix assertion failure due to wrong music pipe on seek
When one song is played twice, and the decoder is working on the
second "instance", but the first should be seeked, the check in
player_seek_decoder() may assume that it can reuse the decoder without
exchanging pipes.  The last thing was the mistake: the pipe pointer
was different, which led to an assertion failure.  This patch adds
another check which exchanges the player pipe.
2010-11-05 19:24:42 +01:00
Max Kellermann
cc261872c2 decoder_control: pass music_pipe to dc_start()
More abstraction for decoder_control.pipe.
2010-11-05 19:18:44 +01:00
Max Kellermann
5223261f19 player_thread: add helper function player_dc_at_next_song()
Some abstraction for decoder_control.pipe access.
2010-11-05 19:08:59 +01:00
Max Kellermann
c594afeee7 pipe: add helper function music_pipe_empty() 2010-11-05 18:40:23 +01:00
Max Kellermann
32d10eedbd input/rewind: remove redundant NULL check before g_free() call 2010-11-05 18:40:14 +01:00
Max Kellermann
dfd98eede7 input/rewind: add two assertions 2010-11-05 18:40:07 +01:00
Max Kellermann
a728d7a026 input/rewind: fix double free bug
Duplicate the "mime" attribute of the inner input_stream object,
instead of copying the pointer.
2010-11-05 18:39:40 +01:00
Max Kellermann
5a26320680 output/alsa: dump buffer and period limits 2010-11-05 10:35:46 +01:00
Max Kellermann
90dc880e67 output/httpd: implement delay() 2010-11-05 09:49:22 +01:00
Max Kellermann
e11ff967d0 output/shout: implement delay()
This makes the plugin more responsive to control commands, because it
will listen to control events while waiting.
2010-11-05 09:49:20 +01:00
Max Kellermann
2dc6ed7b3a output_plugin: add method delay()
This method is used to reduce the delay of commands issued to the
shout plugin.
2010-11-05 09:47:43 +01:00
Max Kellermann
ad430c6617 timer: add function timer_delay() 2010-11-05 09:39:56 +01:00
Max Kellermann
e8d8bd4c0d decoder/{mp4ff,ffmpeg}: add extension ".m4b" (audio book)
Same as ".m4a".
2010-11-05 02:01:35 +01:00
Max Kellermann
8d5fa754e8 output_thread: fix assertion failure due to race condition in OPEN
Change the assertion on "fail_timer==NULL" in OPEN to a runtime check.
This assertion crashed when the output thread failed while the player
thread was calling audio_output_open().
2010-11-04 23:44:23 +01:00
Max Kellermann
2ee047a1dd output_internal: protect attribute "fail_timer" with mutex 2010-11-04 23:40:43 +01:00
Max Kellermann
9562f66741 output_control: lock object in audio_output_open()
Protect the attributes "open" and "fail_timer".
2010-11-04 23:28:18 +01:00
Max Kellermann
21223154aa output_control: lock object in audio_output_close()
Protect the attributes "open" and "fail_timer".
2010-11-04 21:51:02 +01:00
Mantas Mikulenas
ec48b5ea3a server_socket: remove AI_ADDRCONFIG
When you pass the flag AI_ADDRCONFIG to getaddrinfo(), it does not
consider address families on the loopback device.  When run on a
machine without an external network card, just with "lo", it was
unable to look up any address.
2010-11-04 20:17:45 +01:00
Max Kellermann
754015544f output/ffado: transfer_playback_buffers() returns a boolean
libffado documentation says this function returns -1 on error, but
that is a lie - it returns a boolean value, and "false" means error.
2010-11-04 20:08:04 +01:00
Max Kellermann
3f89f77429 decoder/ffmpeg: check AVCodecContext.sample_fmt value
.. instead of av_get_bits_per_sample_format().  The SampleFormat enum
value is authoritative.
2010-11-04 20:04:15 +01:00
Denis Krjuchkov
9dee419b7c winmm_output: handle empty string case when parsing device id 2010-11-04 11:09:50 +05:00
Denis Krjuchkov
7612bf1bfa winmm_output: added "device" configuration option
Device can be specified either by magic index (starting with 0)
or by device name.
2010-11-04 00:51:18 +05:00
Denis Krjuchkov
ad56e10e5b winmm_output: improved test_default_device
If no device is available test_default_device returns false.
2010-11-03 23:31:49 +05:00
Max Kellermann
75f4772ba2 output: new output plugin "ffado"
Using libffado, to play on firewire audio devices.

Warning: this plugin was not tested successfully.  I just couldn't
keep libffado2 from crashing.  Use at your own risk.

For details, see my Debian bug reports:

  http://bugs.debian.org/601657
  http://bugs.debian.org/601659
2010-10-27 21:25:41 +02:00
Alder Hornbridge
fe1b626f76 decoder/sidplay: play mus, str, prg, x00 files 2010-10-27 21:18:43 +02:00
Alder Hornbridge
4e94516912 decoder/sidplay: play monaural SID tunes in mono 2010-10-27 21:16:24 +02:00
Tony Miller
dadb6747ad Container support for gme decoder. 2010-10-14 17:11:59 +02:00
Max Kellermann
188e1b440e playlist/rss: new playlist plugin for RSS feeds 2010-10-11 20:33:41 +02:00
Max Kellermann
a57f9e712d Merge release 0.15.13 from branch 'v0.15.x'
Conflicts:
	NEWS
	configure.ac
	src/input/rewind_input_plugin.c
	src/output/httpd_output_plugin.c
2010-10-11 20:33:17 +02:00
Avuton Olrich
a549d871f3 Modify version string to post-release version 0.15.14~git 2010-10-10 09:57:57 -07:00
Avuton Olrich
b552e9a120 mpd version 0.15.13 2010-10-10 09:57:52 -07:00
Denis Krjuchkov
e6fc88a758 mixer: winmm_mixer implemented 2010-10-09 02:45:08 +06:00
Denis Krjuchkov
20004b7ee0 win32_output: renamed win32 output plugin to winmm
Win32 has many audio APIs. New name is slightly more correct.
2010-10-08 23:55:14 +06:00
Max Kellermann
84e037631d output/httpd: use the new server_socket library 2010-10-05 21:18:54 +02:00
Max Kellermann
18e3d0b504 listen: move generic code to server_socket.c 2010-10-05 21:18:54 +02:00
Max Kellermann
04c4398bfc output/httpd: don't close socket in open() failure
This cleanup call is obsolete, since we moved the binding code to
enable()/disable().
2010-10-05 21:18:54 +02:00
Max Kellermann
39e42394bd output_all: disable outputs on shutdown
Call output_plugin.disable() before output_plugin.finish().  This
ensures that all outputs are properly cleaned up, to make valgrind
happy.
2010-10-05 21:18:54 +02:00
Qball Cow
a39e6b43e8 add mpd_error.h to sources. 2010-10-03 19:46:36 +02:00
Max Kellermann
5923cfcde3 output/httpd: MIME type audio/ogg for Ogg Vorbis
RFC 5334 10.3 defines the MIME type "audio/ogg".  We could use
"application/ogg" as well, but we know for sure that we only emit
audio data.
2010-10-03 16:22:03 +02:00
Tony Miller
e69df36e4a configure.ac: Disable unix domain sockets by default if we're on cygwin. 2010-10-02 13:27:02 -07:00
Denis Krjuchkov
e10b872fc3 main_win: replaced g_error usages with MPD_ERROR 2010-09-28 22:38:57 +06:00
Denis Krjuchkov
2b78358af5 mpd_error: more correct MPD_ERROR implementation
Original implementation does not handle
	if (...)
		MPD_ERROR("die");
	else
		...
case well. This change fixes handling of such cases.
2010-09-28 18:12:14 +02:00
Thomas Jansen
e3f4c7b91c input/rewind: enable for MMS 2010-09-28 12:56:47 +02:00
Andrew Morgan
a59ab3e2ee playlist: make single mode 'sticky' 2010-09-28 12:52:52 +02:00
Thomas Jansen
28bcb8bdf5 eliminate g_error() usage
Replaced all occurrences of g_error() with MPD_ERROR() located in a new header
file 'mpd_error.h'. This macro uses g_critical() to print the error message
and then exits gracefully in contrast to g_error() which would internally call
abort() to produce a core dump.

The macro name is distinctive and allows to find all places with dubious error
handling. The long-term goal is to get rid of MPD_ERROR() altogether. To
facilitate the eventual removal of this macro it was added in a new header
file rather than to an existing header file.

This fixes #2995 and #3007.
2010-09-25 15:00:43 +02:00
Thomas Jansen
9af9fd1400 output/httpd: bind_to_address support (including IPv6)
Added support for a new optional configuration setting for the httpd output
named "bind_to_address". Setting it to a specific IP address (v4 or v6) will
cause the httpd output to bind to that address exclusively. Supporting
multiple addresses in parallel is future work.

This implements the feature requests #2998 and #2646.
2010-09-25 15:00:43 +02:00
Thomas Jansen
0c80bd5fc0 conf: Whitespace cosmetics 2010-09-25 15:00:43 +02:00
Denis Krjuchkov
7563ece236 .gitignore: added mpd.exe to ignore list 2010-09-25 15:01:53 +06:00
Max Kellermann
a14cd97f56 playlist: fix "queued" check in playlist_sync()
The check was meant to fix an assertion failure, but it was the wrong
way around.  This broke cross-fading most of the time.
2010-09-23 23:29:36 +02:00
Max Kellermann
0955f33a86 decoder/mp4ff: support more variations of "album artist"
According to the mantis bug report 2847, there are several possible
variations of the "album artist" tag:

- "album artist"
- "album_artist"
- "albumartist"

This patch adds support for the latter two.
2010-09-23 21:19:41 +02:00
Max Kellermann
a016fb4048 listen: fix "unused parameter" warning on WIN32 2010-09-23 20:51:23 +02:00
Denis Krjuchkov
e8ebb1af91 main: Add Windows Service support
I've added PIPE_EVENT_SHUTDOWN because calling g_main_loop_quit() do not work when called from another thread.
Main thread was sleeping in g_poll() so I needed some way to wake it up.

By some strange reason call close(event_pipe[0]) in event_pipe_deinit() hangs.
In current implementation that code never reached so that was not a problem :-)
I've added a conditional to leave event_pipe[0] open on Win32.
2010-09-23 20:42:33 +02:00
Thomas Jansen
9fa3d7c4fa playlist_state: Fix the "state" line in the output
An '\n' was erroneously inserted in the line containing the state, e.g.
"state: \nplay" instead of "state: play".

Fix for bug #2992.
2010-09-23 20:41:23 +02:00
Thomas Jansen
54294366d5 rewind_input_plugin: Update MIME not only once
The assumption that MIME type is set only once is not valid with CURL,
as URL redirections may update the MIME type.

This fixes bug #3044.
2010-09-23 20:39:13 +02:00
Max Kellermann
9423b456a1 zeroconf-bonjour: use g_htons() instead of htons()
htons() is not available if netinet/in.h is not included.
2010-09-23 09:01:37 +02:00
Max Kellermann
64209749fb directory: cast DEVICE_INARCHIVE, DEVICE_CONTAINER to dev_t
Fix gcc warning.
2010-09-23 09:01:25 +02:00
Max Kellermann
586b7601c6 playlist_database: initialize pm.mtime 2010-09-23 09:01:23 +02:00
Max Kellermann
4425989898 fd_util: work around aliasing warning in recvmsg_cloexec() 2010-09-23 09:01:20 +02:00
Max Kellermann
5b996ab880 output/httpd: access sockaddr_storage object directly
Work around aliasing warning.
2010-09-23 09:01:17 +02:00
Max Kellermann
635cfbae13 decoder_control: use g_free() to manage mixramp allocations
Be consistent with the rest of MPD, and don't use the non-portable
header "malloc.h".
2010-09-23 08:49:21 +02:00
Max Kellermann
922e51e8a9 autogen.sh: enable automake 1.11 2010-09-23 08:37:26 +02:00
Avuton Olrich
6d9f1ad61f configure.ac: Add enable_tremor to post decoder plugin tests. 2010-09-11 20:08:35 -07:00
Avuton Olrich
841b9b3d63 configure.ac: Move use_tremor to enable_tremor. 2010-09-11 20:07:55 -07:00
Avuton Olrich
a3745ae7f3 configure.ac: Correct and clean up tremor check in oggvorbis test. 2010-09-11 20:06:05 -07:00
Avuton Olrich
27d7013ff8 configure.ac: Only enable libogg if OggTremor path/opt has not been specified. 2010-09-11 19:57:44 -07:00
Avuton Olrich
27d3340af2 configure.ac: Fix OggFLAC/tremor test. 2010-09-11 19:28:30 -07:00
Qball Cow
4a7abc9d44 Correctly terminate stream_title.
This caused random data to be send via icy-server if the played
song had no tags.
2010-09-08 13:19:59 +02:00
Max Kellermann
589bb54111 input/curl: fix version check for curl_multi_timeout()
According to the CURL web site, curl_multi_timeout() was added in
version 7.15.4:

 http://curl.haxx.se/libcurl/c/curl_multi_timeout.html
2010-09-07 21:40:56 +02:00
Max Kellermann
d953225531 update_walk: update existing playlist entry
Fixes duplicate playlist entries.
2010-09-07 20:22:05 +02:00
Max Kellermann
663815ead8 playlist_vector: update_or_add() returns bool
False if the vector was not modified.
2010-09-07 20:21:19 +02:00
Anton Khirnov
bc87ec0059 doc/protocol: update descriptions of the searching commands 2010-08-31 06:56:54 +02:00
Max Kellermann
917434269c output/httpd: implement "pause"
Send silence to all connected clients while paused, to avoid
connection interruption.
2010-08-31 06:50:14 +02:00
Max Kellermann
a77506ae21 output/httpd: forced flush after 32 kB of input data
Avoid buffer underruns on the streaming client, if the encoder is "too
efficient" (e.g. when encoding silence while paused).
2010-08-31 06:49:06 +02:00
Johan Kiviniemi
ed5d297301 ReplayGain filter: allow gain > 100 %
The ReplayGain filter clamped the gain to max. 100 % even if the
algorithm determined the signal needed a boost. That would result in any
such tracks being played with too low volume, effectively defeating the
purpose of the filter.
2010-08-23 16:34:11 +03:00
Max Kellermann
64dacd175a output_thread: fix race condition after CANCEL command
Clear the notification before finishing the CANCEL command, so the
notify_wait() after that will always wait for the right notification,
sent by audio_output_all_cancel().
2010-08-19 11:05:24 +02:00
Max Kellermann
625e4755d1 notify: add function notify_clear() 2010-08-19 11:03:53 +02:00
Anton Khirnov
92b6ba9eff doc/protocol: mention that 'status' command also returns 'random' 2010-08-15 11:35:21 +02:00
Max Kellermann
68c02fc95a fd_util: add function dup_cloexec()
Unfortunately, there's no "optimized" implementation here.  We can't
use Linux's proprietary system call dup3(), because it would require
us to specify the new descriptor.
2010-08-03 18:03:55 +02:00
Max Kellermann
d18c1b1a0a fd_util: add function recvmsg_cloexec() 2010-08-03 17:51:35 +02:00
Max Kellermann
c980fc653d fd_util: add function socketpair_cloexec() 2010-08-03 17:51:35 +02:00
Avuton Olrich
36782a977a Modify version string to post-release version 0.16~git 2010-07-25 07:44:45 -07:00
Avuton Olrich
653c4792b5 mpd version 0.16~alpha2 2010-07-25 07:44:44 -07:00
Serge Ziryukin
5cb061ebdf Makefile.am: simplify (de)installation of doxygen-generated documentation
This also fixes installation when no *.gif files found in 'doc/api/html' folder.
2010-07-25 14:04:24 +02:00
Max Kellermann
12f4225d6b Makefile.am: fix out-of-tree doxygen call
This hack creates a copy of doc/doxygen.conf with the INPUT setting
replaced.
2010-07-25 14:02:10 +02:00
Max Kellermann
50862a1dd1 valgrind.suppressions: update g_get_language_names() 2010-07-25 13:38:08 +02:00
Max Kellermann
013ebb638a playlist_song: fix memory leak
Free the temporary path string in apply_song_metadata().
2010-07-25 13:35:59 +02:00
Max Kellermann
bedb82bf4d directory: free playlist vector in directory_free() 2010-07-25 13:31:39 +02:00
Max Kellermann
cbb1ab58cd queue_save: save tags and range of non-database songs
Use the functions song_save() and song_load() to use the same format
as in the database file for those songs which need the tags.
2010-07-25 13:28:54 +02:00
Max Kellermann
b01235e330 song_save: save start_ms and end_ms
While this is not useful for the database, it may become useful for
reusing this code for the state file.
2010-07-25 13:28:52 +02:00
Max Kellermann
8341a9f7b2 queue_save: simplify get_song()
Don't try db_get_song() if the URI has a scheme.
2010-07-25 13:28:48 +02:00
Max Kellermann
b233c145fa {queue,song}_print: print relative paths if possible
If a song with an absolute path points inside the music directory,
print only the relative part.  This happens when partial songs from a
playlist file were loaded.
2010-07-25 13:28:39 +02:00
Max Kellermann
9de5bb9e23 queue_print: hide HTTP password in the "playlist" command
I've already changed the "playlistinfo" command to hide HTTP
passwords, but forgot to do the same for the simpler "playlist"
command.  This patch changes queue_print_uris() to use the code from
song_print_uri().
2010-07-25 13:24:19 +02:00
Max Kellermann
0c5305c51f queue_save: move code to queue_save_song() 2010-07-25 12:43:54 +02:00
Max Kellermann
63c9a20f96 queue_save: queue_load_song() returns void
The only caller doesn't use its return value, and the value isn't
useful anyway.
2010-07-25 12:43:18 +02:00
Max Kellermann
b40c0811f4 song_save: song_load() returns NULL instead of false 2010-07-25 12:23:52 +02:00
Max Kellermann
838790fc2d state_file: use the text_file library
Don't use a large stack buffer.
2010-07-25 12:01:59 +02:00
Max Kellermann
1ff2d5b689 playlist_state: simplify printf() calls
Let the C compiler concatenate string constants.
2010-07-25 12:01:59 +02:00
Max Kellermann
e4b7a113fd database, ...: remove EINTR checks after stdio calls
MPD doesn't have child processes anymore, and thus we're not expecting
to receive SIGCHLD very often.  Since hard disk access isn't
interrupted by signals anyway, we don't need those excessive checks.
2010-07-25 12:01:59 +02:00
Max Kellermann
7820ebb82e directory_save: duplicate the playlist name
The function playlist_metadata_load() will overwrite the input buffer
before using the "name" parameter; since "name" points to the same
buffer, we'll get a corrupted string.
2010-07-25 12:01:59 +02:00
Rasi
31ab0b3df1 Added album tag support for libgme decoder 2010-07-23 23:13:03 +02:00
Max Kellermann
e598922133 update: store playlist files in database
Don't open the music directory for each "lsinfo" call.  Get the list
of playlist files from the memory database.
2010-07-21 09:26:50 +02:00
Max Kellermann
e21ad70f3f song_save: pass const songvec to songvec_save() 2010-07-21 09:26:50 +02:00
Max Kellermann
a81cb932c2 song_save: include cleanup 2010-07-21 09:26:46 +02:00
Max Kellermann
3d66a4fee8 database: remove outdated comment 2010-07-21 09:20:14 +02:00
Avuton Olrich
676739c426 Modify version string to post-release version 0.15.13~git 2010-07-21 06:40:33 +02:00
Max Kellermann
dea5601e79 tag_rva2: move code to rva2_apply_data() 2010-07-20 23:05:24 +02:00
Max Kellermann
43a840552f tag_rva2: add struct rva2_data
.. and several accessor inline functions, to simplify the calling
code.
2010-07-20 23:05:06 +02:00
Max Kellermann
2f16f8e9f7 tag_rva2: name the CHANNEL_* enum 2010-07-20 23:05:01 +02:00
Max Kellermann
4364b30c42 decoder/mad: move RVA2 code to tag_rva2.c 2010-07-20 23:03:54 +02:00
Max Kellermann
c0da938d4f Merge release 0.15.12 from branch 'v0.15.x'
Conflicts:
	NEWS
	configure.ac
2010-07-20 23:03:06 +02:00
Max Kellermann
fb19aa355e replay_gain_info: fix indentation 2010-07-20 22:59:04 +02:00
Max Kellermann
6135419ac3 test/run_decoder: dump replay gain 2010-07-20 22:58:42 +02:00
Max Kellermann
0fec8e0864 mpd version 0.15.12 2010-07-20 22:57:57 +02:00
Max Kellermann
1f976d6e54 input/curl: remove assertion after curl_multi_fdset()
Some users reported that MPD crashes when using a new CURL version
with the threaded DNS resolver enabled.  It seems that
curl_multi_fdset() returns no file descriptor when the DNS resolver
runs in another thread, so MPD does not have any event to wait for.

On the CURL mailing list, somebody suggested to sleep for a fixed
amount of time.  This is not an elegant solution, because daemons
should never have to sleep without waiting for an event.  I hope the
CURL developers will review the API and remove the threaded DNS
resolver.

Meanwhile, I'm removing the assertion in question, to allow those
unfortunate users running the latest CURL version to continue using
MPD.
2010-07-20 22:55:13 +02:00
Max Kellermann
a4908dca42 input/curl: query timeout from CURL
Use curl_multi_timeout() to determine the select() timeout, instead of
hard-coding one second.
2010-07-20 22:37:34 +02:00
Max Kellermann
8b055c3127 tag_rva2: set "gain", not "peak"
RVA2 tags only store the "gain" value, there is no "peak" attribute.
2010-07-20 22:32:55 +02:00
Max Kellermann
172182b18f decoder/mad: parse_rva2() returns bool 2010-07-20 18:27:11 +02:00
Max Kellermann
898a13f196 decoder/wildmidi: support version 0.2.3
In libwildmidi 0.2.3, the function WildMidi_SampledSeek() was removed,
without changing the SO name.  This patch adds an autoconf check for
that function.  Fall back to WildMidi_FastSeek() if
WildMidi_SampledSeek() is not available anymore.
2010-07-20 18:23:56 +02:00
Max Kellermann
2bc5161e95 Merge release 0.15.11 from branch 'v0.15.x
Conflicts:
	NEWS
	configure.ac
	src/decoder/ffmpeg_decoder_plugin.c
	src/decoder/mikmod_decoder_plugin.c
	src/decoder/mp4ff_decoder_plugin.c
	src/decoder/vorbis_decoder_plugin.c
	src/directory_print.c
	src/playlist_control.c
	src/tag_ape.c
2010-07-19 23:49:15 +02:00
Max Kellermann
e2e8d0d2f3 decoder/ffmpeg: fix libavformat 0.6 by using av_open_input_stream()
libavformat 0.6 does not pass the original URI pointer to the "open"
method, which leads to a crash because MPD was using a dirty hack to
pass a pointer to that method.

This patch switches to av_open_input_stream() with a custom
ByteIOContext class, instead of doing the URI string hack with
av_open_input_file().

Loosely based on a patch from Jasper St. Pierre.
2010-07-19 23:03:06 +02:00
Max Kellermann
b2e3c0757b decoder/ffmpeg: manual format probing
Use the libavformat function av_probe_input_format() to probe the
AVInputFormat, instead of letting av_open_input_file() do it
implicitly.  We will switch to av_open_input_stream() very soon, which
does not have the probing code.

Loosely based on a patch from Jasper St. Pierre.
2010-07-19 22:59:59 +02:00
Avuton Olrich
b97e92468f Modify version string to post-release version 0.15.12~git 2010-07-14 17:33:29 -07:00
Avuton Olrich
56bf4ede18 mpd version 0.15.11 2010-07-14 17:33:28 -07:00
Anton Khirnov
0fc0196dba ffmpeg: read the audio stream metadata in addition to global
in some formats, e.g. vorbis, the metadata is stored per-stream.
2010-07-12 11:36:55 +02:00
Anton Khirnov
1492324c76 ffmpeg: factor tag_type <-> ffmpeg tag name maps into a table. 2010-07-12 11:36:55 +02:00
Max Kellermann
49bc317fb8 decoder/ffmpeg: fix libavformat 0.6 by using av_open_input_stream()
libavformat 0.6 does not pass the original URI pointer to the "open"
method, which leads to a crash because MPD was using a dirty hack to
pass a pointer to that method.

This patch switches to av_open_input_stream() with a custom
ByteIOContext class, instead of doing the URI string hack with
av_open_input_file().

Loosely based on a patch from Jasper St. Pierre.
2010-06-30 23:41:32 +02:00
Max Kellermann
375a09d6f6 decoder/ffmpeg: manual format probing
Use the libavformat function av_probe_input_format() to probe the
AVInputFormat, instead of letting av_open_input_file() do it
implicitly.  We will switch to av_open_input_stream() very soon, which
does not have the probing code.

Loosely based on a patch from Jasper St. Pierre.
2010-06-30 23:40:31 +02:00
Max Kellermann
0265c34bed decoder/ffmpeg: free URI, fix memory leak
Free the string allocated by decoder_get_uri().
2010-06-30 23:40:04 +02:00
Max Kellermann
a1882f48be decoder/vorbis: handle uri==NULL
This fixes a theoretical crash, which has never occurred in practice.
2010-06-30 23:38:49 +02:00
Anton Khirnov
c3569814bd ffmpeg: read more metadata. 2010-06-30 23:18:45 +02:00
Max Kellermann
814daac5ba decoder/ffmpeg: free AVFormatContext on error
Fix a memory leak in some code paths.
2010-06-30 23:14:43 +02:00
Max Kellermann
0d03bdce6d configure.ac: check ffmpeg version number with pkg-config
Replace the check for avcodec_decode_audio2(), assume it's present in
libavcodec version 51.
2010-06-30 21:56:04 +02:00
Max Kellermann
768be22f7c pcm_buffer: make the buffer pointer "void" 2010-06-30 21:55:46 +02:00
Max Kellermann
ec89ce5a8a decoder/mp4ff: support tag "album artist"
We already supported "albumartist", but it seems some folks also use
"album artist" (with a space).
2010-06-30 21:55:03 +02:00
Andreas Vögele
34415bf0b6 Make get_remote_uid() work on BSD
I've attached a patch that will make file URIs work on operating systems
that provide the getpeereid() function call to check the user ID of the
peer connected to a UNIX domain socket.
2010-06-30 21:42:01 +02:00
Max Kellermann
0a0c78674f playlist: emit IDLE_OPTIONS when resetting single mode 2010-06-30 21:40:33 +02:00
Max Kellermann
1bffdabe41 directory_print: return void
There is no useful return value here.
2010-06-30 21:39:34 +02:00
Max Kellermann
77e6810c14 decoder/mikmod: fix memory leak
The return value of Player_LoadTitle() is allocated with malloc(), and
must be freed by the caller.
2010-06-30 19:37:36 +00:00
Max Kellermann
5ebe33653c decoder/mp4ff: remove duplicate entries in the tag name table
Reuse the function tag_name_parse_i().
2010-06-30 21:36:15 +02:00
Max Kellermann
8e3eace289 decoder/mp4ff: moved code to mp4ff_tag_name_parse() 2010-06-30 21:36:00 +02:00
Max Kellermann
284659034d tag_ape: remove duplicate entries in the tag name table
Reuse the function tag_name_parse_i().
2010-06-30 21:33:19 +02:00
Max Kellermann
9550c87327 tag: added function tag_name_parse()
Convert a string into a tag_type enum.
2010-06-30 21:31:45 +02:00
Max Kellermann
e223e8a5b5 tag_ape: move code to tag_ape_name_parse() 2010-06-30 21:30:21 +02:00
Max Kellermann
4d6d372a5b decoder/vorbis: use single global ov_callbacks constant
Initialize the ov_callbacks struct at compile time.
2010-06-30 19:24:41 +00:00
Max Kellermann
0aeec90590 decoder/mp4ff: support tags "albumartist", "band"
I'm not sure if mapping "band" to TAG_PERFORMER is correct, but it
might be better than nothing.
2010-06-30 21:22:13 +02:00
Max Kellermann
cfcd84655c decoder/mp4ff: use tag_table.h to parse tag names
Convert if/else/else/... to a loop.
2010-06-30 21:19:30 +02:00
Max Kellermann
5092eaf1cc tag_ape: move table lookup to tag_table.h
Allow code sharing.
2010-06-30 21:18:27 +02:00
Max Kellermann
9328558fc7 tag_ape: support album artist
I took this tag name from a MusePack sample file I got from a user.
It is not documented in the APE specification:

 http://wiki.hydrogenaudio.org/index.php?title=APE_key

People seem to be using undocumented extensions to the specification
anyway, and the best we can do is attempt to support them.
2010-06-30 21:16:28 +02:00
Max Kellermann
026bd15872 tag_ape: simplified the apeItems array
Make "enum tag_type" the array index, and convert apeItems to a sparse
array.
2010-06-30 21:15:52 +02:00
Max Kellermann
7cca55549b tag_ape: moved code to tag_ape_import_item()
Improve code readability.
2010-06-30 21:15:39 +02:00
Max Kellermann
c7e89ea3a3 tag_ape: converted apeItems and tagItems to global vars
Don't initialize those arrays each time tag_ape_load() is called.
2010-06-30 21:15:14 +02:00
Max Kellermann
002b283433 configure.ac: check ffmpeg version number with pkg-config
Replace the check for avcodec_decode_audio2(), assume it's present in
libavcodec version 51.
2010-06-30 10:51:07 +02:00
Max Kellermann
5a2820ca3d pcm_buffer: make the buffer pointer "void" 2010-06-30 08:21:48 +02:00
Max Kellermann
9eb292c1e5 decoder/mp4ff: support tag "album artist"
We already supported "albumartist", but it seems some folks also use
"album artist" (with a space).
2010-06-25 22:54:18 +02:00
Max Kellermann
5216cfb3c8 playlist_print: use playlist_open_any()
Allow printing remote playlists with the commands "listplaylist" and
"listplaylistinfo".
2010-06-25 22:43:52 +02:00
Max Kellermann
373d1843a8 playlist_queue: use playlist_open_any() 2010-06-25 22:43:52 +02:00
Max Kellermann
82ee278f53 playlist_any: new library to simplify opening playlist files
The new function playlist_open_any() combines playlist_mapper_open(),
playlist_list_open_uri() and playlist_list_open_stream(), providing an
easy API for all of them.
2010-06-25 22:43:52 +02:00
Max Kellermann
c27fc26ecd playlist_list: probe plugin without MIME attributes
If the MIME type of a stream contains a semicolon, remove it and the
text after it to probe for a playlist plugin.
2010-06-25 22:43:52 +02:00
Max Kellermann
fba13bd5d2 playlist_queue: simplify error handler
Return early on error, save one level of indent.
2010-06-25 22:37:34 +02:00
Max Kellermann
68f75955d8 playlist_list: moved input_stream.ready loop to calling function
Merged both loops into playlist_list_open_stream().  This is needed
because playlist_list_open_stream() needs to know the MIME type, which
is only known after the stream has become "ready".
2010-06-25 22:37:34 +02:00
Max Kellermann
cd21cfc115 uri: really count dots in verify_uri_segment()
This buggy implementation failed to allow "..." sequences, because the
dot count was always zero.  The usefulness of allowing "..." (or more
dots) is debatable, but since it's a valid file name, we allow it.
2010-06-25 21:56:12 +02:00
Max Kellermann
05703cf73b update .gitignore 2010-06-25 21:46:16 +02:00
Max Kellermann
1ea10db953 playlist/cue: last track ends at end of file
libcue's track_get_length() returns 0 for the last track, because that
information is not available in the CUE sheet.  This makes MPD quit
playing the last track immediately.  If we set "song.end_ms=0", MPD
will play the track until the end of the song file, which is what we
want.
2010-06-25 20:02:55 +02:00
Max Kellermann
eb6188f8c0 test/dump_playlist: print open-ended range 2010-06-25 20:02:55 +02:00
Max Kellermann
6bb7a7439d song_print: simplified start_ms/end_ms check 2010-06-25 20:02:55 +02:00
Aaron Griffith
ca6110d92f playlist_list: wait for input stream to become ready
Fixes an assertion failure in the input_stream_seek() call.
2010-06-25 19:20:20 +02:00
Avuton Olrich
a219d488d0 Modify version string to post-release version 0.16~git 2010-06-22 04:45:24 -07:00
Avuton Olrich
1746257492 mpd version 0.16~alpha1 2010-06-22 04:45:24 -07:00
Max Kellermann
07423c300e Makefile.am: append LIBWRAP_LDFLAGS to OUTPUT_LIBS
This fixes test/run_output.
2010-06-21 09:45:35 +02:00
Andreas Vögele
69fcdc6a07 autogen.sh: don't use "+" in sed expression
Replaces the expression [0-9]\+ by [0-9][0-9]* in autogen.sh. The
special character \+ is not POSIX compatible and thus not supported by
all sed implementations.
2010-06-19 13:49:20 +02:00
Andreas Vögele
dda5415def Make get_remote_uid() work on BSD
I've attached a patch that will make file URIs work on operating systems
that provide the getpeereid() function call to check the user ID of the
peer connected to a UNIX domain socket.
2010-06-19 13:47:10 +02:00
Andrzej Rybczak
4347114455 client: increase send_buf from 4kB to 16kB
this greatly improves performance of commands that return a lot
of data, e.g. search results or recursive content of a directory,
while being connected to local mpd via tcp/ip socket.
2010-06-19 13:45:54 +02:00
Max Kellermann
9fb26b5617 playlist: check "queued" before calling playlist_update_queued_song()
Workaround for an assertion failure.
2010-06-19 13:45:15 +02:00
Max Kellermann
442b327582 playlist: protect acess to player state in playlist_sync() 2010-06-19 13:33:39 +02:00
Max Kellermann
cff727644d playlist: move checks out of playlist_sync_with_queue()
Rename the function to playlist_song_started(), which gets only called
if the song has actually started.
2010-06-19 13:33:32 +02:00
Max Kellermann
7f80349494 player_control: hold mutex in pc_play(), pc_pause()
Race condition fix.
2010-06-19 13:19:30 +02:00
Avuton Olrich
a6ef696132 Makefile.am: distribute refcount.h 2010-06-13 19:49:38 -07:00
Max Kellermann
53f08a95eb Makefile.am: distribute open.h 2010-06-08 21:40:51 +02:00
Max Kellermann
d0d2d6ed1b filter/route: fixed unsigned/signed comparison
Fixes a clang warning.
2010-06-06 21:56:30 +02:00
Tim Phipps
4e83b79d2b output/httpd: add libwrap support
libwrap support is in MPD but only for the control port.  This patch
adds support for the http port.  The code is copied from
src/client_new.c
2010-06-06 21:53:24 +02:00
Max Kellermann
37e69a89b9 directory_print: print a list of playlist files in "lsinfo"
Print those files which can be handled by a playlist plugin.
2010-06-01 10:00:01 +02:00
Max Kellermann
6f28eb4c0a playlist_list: export playlist_suffix_supported() 2010-06-01 09:59:56 +02:00
Max Kellermann
caf93d9a2c playlist_list: playlist_list_open_path() returns input_stream
Memory leak fix.  The input_stream object passed to
playlist_list_open_stream_suffix() must be closed by the caller - this
however never happens in playlist_list_open_path(), because it does
not return it to the caller.
2010-06-01 09:59:54 +02:00
Max Kellermann
747e945d29 playlist_list: move fallback g_uri_parse_scheme() to glib_compat.h 2010-06-01 09:59:52 +02:00
Max Kellermann
067d7212bf playlist: emit IDLE_OPTIONS when resetting single mode 2010-06-01 09:59:46 +02:00
Romain Bignon
867b93a5b2 single mode: at the end of the song, pause on the next song instead of stop 2010-05-31 23:36:16 +02:00
Max Kellermann
53647c8ba1 directory_print: return void
There is no useful return value here.
2010-05-31 22:16:03 +02:00
Romain Bignon
b571ba27a4 fix crash when decoder is NULL 2010-05-31 22:11:59 +02:00
Max Kellermann
de8f2739c2 decoder/mikmod: fix memory leak
The return value of Player_LoadTitle() is allocated with malloc(), and
must be freed by the caller.
2010-05-31 10:24:08 +02:00
Max Kellermann
2c1c588868 decoder/mikmod: duplicate the path only once 2010-05-31 10:22:08 +02:00
Max Kellermann
e271f69a34 decoder/mikdmod: moved local variable declarations in tag_dup() 2010-05-31 10:16:09 +02:00
Max Kellermann
39105f2119 decoder/wildmidi: moved local variable declarations in tag_dup() 2010-05-31 10:14:48 +02:00
Max Kellermann
4e080a9b06 decoder/gme: replace macro GME_BUF_SIZE
Added macros with better names: GME_BUFFER_FRAMES, GME_BUFFER_SAMPLES
(the former only used to calculate the latter).
2010-05-31 10:03:43 +02:00
Max Kellermann
d55740808d decoder/gme: added constants for sample rate and channels
Move into enums.
2010-05-31 10:02:43 +02:00
Max Kellermann
6566038df9 decoder/gme: pass the whole buffer to decoder_data()
Pass sizeof(buf) to decoder_data(), not the number of samples (which
is half the size).  At the same time, pass GME_BUF_SIZE to gme_play()
- libgme really wants to get the number of samples, not the number of
stereo frames.  Previously, this plugin had been using only the first
half of the buffer.
2010-05-31 09:57:15 +02:00
Max Kellermann
f0faf00320 decoder/gme: allocate tag later, fixes memory leak
Allocate the "tag" object after the file has been opened successfully.
2010-05-31 09:43:25 +02:00
Max Kellermann
51c7577c8f decoder/mp4ff: rename and move local variable
Allocate the "tag" object after the file has been checked.  That
removes one tag_free() call in an error handler.
2010-05-31 09:35:49 +02:00
Max Kellermann
be308c6657 decoder/mp4ff: merge code into mp4ff_input_stream_open() 2010-05-31 09:29:45 +02:00
Max Kellermann
1729a0b437 decoder/mp4ff: move mp4ff_callback_t into mp4ff_input_stream
Allocate only one item on the stack.
2010-05-31 09:23:27 +02:00
Max Kellermann
1b2fc2ae19 decoder/mp4ff: rename mp4_context to mp4ff_input_stream 2010-05-31 09:22:42 +02:00
Max Kellermann
58a75f0b78 decoder/mp4ff: remove duplicate entries in the tag name table
Reuse the function tag_name_parse_i().
2010-05-31 08:48:41 +02:00
Max Kellermann
daf6e2b5da decoder/mp4ff: moved code to mp4ff_tag_name_parse() 2010-05-31 08:47:59 +02:00
Max Kellermann
71da5b026c tag_ape: remove duplicate entries in the tag name table
Reuse the function tag_name_parse_i().
2010-05-31 08:24:05 +02:00
Max Kellermann
2f68ea635b tag_ape: move code to tag_ape_name_parse() 2010-05-31 08:22:53 +02:00
Max Kellermann
ca08c4dbf4 decoder/vorbis: rename local variable "ret" 2010-05-31 00:06:37 +02:00
Max Kellermann
8af52fa205 decoder/vorbis: implement method stream_tag()
This allows tags in archive files.
2010-05-31 00:02:57 +02:00
Max Kellermann
3b0bf856c4 decoder/vorbis: move code to vorbis_open_stream() 2010-05-31 00:00:04 +02:00
Max Kellermann
28f5803d34 decoder/vorbis: use single global ov_callbacks constant
Initialize the ov_callbacks struct at compile time.
2010-05-30 23:59:36 +02:00
Max Kellermann
0b72299857 decoder/vorbis: rename struct vorbis_decoder_data to vorbis_is 2010-05-30 23:57:58 +02:00
Max Kellermann
4a2302c2ed inotify_update: follow symlinks
This is probably unsafe, and doesn't protect against symlink loops,
but we will eventually add this when we bring update*.c and inotify*.c
closer together.
2010-05-30 23:45:47 +02:00
Max Kellermann
980201a665 inotify_update: fix assertion failure when music dir is deleted
This shouldn't really happen, but insane users might delete/rename the
music directory while MPD runs.  What was even more insane was that
MPD crashed due to this.  This is a workaround - there is currently
nothing useful we can do in this case; except maybe poll for the music
directory to reappear, but that's too much trouble for a user error.
2010-05-30 23:45:46 +02:00
Max Kellermann
d60bcd2869 test: added debug program "run_inotify" 2010-05-30 23:30:43 +02:00
Max Kellermann
017d61a1aa decoder/mp4ff: support tags "albumartist", "band"
I'm not sure if mapping "band" to TAG_PERFORMER is correct, but it
might be better than nothing.
2010-05-30 22:55:02 +02:00
Max Kellermann
4028d03a6e decoder/mp4ff: use tag_table.h to parse tag names
Convert if/else/else/... to a loop.
2010-05-30 22:52:45 +02:00
Max Kellermann
44b771aca1 decoder/mp4ff: rename plugin "mp4" to "mp4ff"
The underlying library is named "libmp4ff".  To reduce confusion,
rename the plugin to a more specific name.
2010-05-30 22:52:44 +02:00
Max Kellermann
8c581eca4d tag_ape: move table lookup to tag_table.h
Allow code sharing.
2010-05-30 22:52:19 +02:00
Max Kellermann
8e815bec9f tag_ape: support album artist, MusicBrainz tags
I took these tag names from a MusePack sample file I got from a user.
These are not documented in the APE specification:

 http://wiki.hydrogenaudio.org/index.php?title=APE_key

People seem to be using undocumented extensions to the specification
anyway, and the best we can do is attempt to support them.
2010-05-30 22:29:48 +02:00
Max Kellermann
9dda53e1d2 Merge release 0.15.10 from branch 'v0.15.x'
Conflicts:
	NEWS
	configure.ac
	src/input/mms_input_plugin.c
2010-05-30 18:26:33 +02:00
Avuton Olrich
65ad298460 Modify version string to post-release version 0.15.11~git 2010-05-30 08:59:00 -07:00
Avuton Olrich
57e95ea6f4 mpd version 0.15.10 2010-05-30 08:59:00 -07:00
Max Kellermann
442d2e74e3 decoder/mad: fix buffer variable name on !HAVE_ID3TAG 2010-05-30 17:27:03 +02:00
Daniel Seuthe
e8310211e2 filter/replay_gain: added option "replaygain_limit" 2010-05-30 17:06:08 +02:00
Avuton Olrich
3709b9aa11 configure: Surround statements with brackets to prevent being treated as args. 2010-05-26 12:38:03 -07:00
Avuton Olrich
c5a291ad74 configure.ac: Add sqlite results to the pretty print. 2010-05-25 22:01:28 -07:00
Avuton Olrich
894573657d cmdline: Add default config paths for win32. 2010-05-20 06:56:43 -07:00
Max Kellermann
9cce1d749a output/win32: new output plugin for Windows Wave 2010-05-20 09:33:05 +02:00
Max Kellermann
ed0b48040c pcm_buffer: 8 kB alignment instead of 64 kB
Reduce the overhead.  Most buffers used by MPD are around 2 to 4 kB.
8 kB seems large enough to keep heap fragmentation low.

Additionally, this patch fixes an off-by-one error in the alignment
formula.
2010-05-20 09:31:51 +02:00
Max Kellermann
9aeed06964 test: enable binary mode on stdin/stdout
Declaring the global variable _CRT_fmode is a documented hack.  What
an ugly platform!
2010-05-20 09:20:30 +02:00
Max Kellermann
eda46bc07f tag_{id3,ape}: explicitly open files in binary mode
Add the flag "b" to fopen().  Windows compatibility.
2010-05-20 09:14:11 +02:00
Max Kellermann
c727e86980 input/file, output/{fifo,recorder}: add O_BINARY to open() flags
Windows compatibility.
2010-05-20 09:13:39 +02:00
Max Kellermann
57b4013306 client: use sprintf() on WIN32
On mingw32, snprintf() expects a 64 bit integer instead of a "long
int" for "%li" - this is not consistent with our expectation, so we're
using plain sprintf().
2010-05-19 13:12:37 +02:00
Max Kellermann
fc5a7a8774 Makefile.am: disable test/read_mixer unless HAVE_ALSA 2010-05-19 11:47:55 +02:00
Max Kellermann
8248f498b2 event_pipe: use g_io_channel_read_chars() to drain the pipe
For some unknown reason, read() blocks on WIN32, even though it was
invoked inside the G_IO_IN callback.  By switching to GIOChannel
functions, this problem is solved, and it works on both Linux and
Windows.
2010-05-19 11:37:39 +02:00
Max Kellermann
22f3ffb099 event_pipe: call g_io_channel_win32_new_fd()
On WIN32, use g_io_channel_win32_new_fd() instead of
g_io_channel_unix_new().  There doesn't seem to be a practical
difference, but it seems more correct.
2010-05-19 11:37:22 +02:00
Max Kellermann
81bd8ef73c update_walk: don't check recursive symlinks on WIN32
inode numbers don't work on WIN32, and very few WIN32 users actually
use symlinks - seems ok to disable that check.
2010-05-19 11:36:07 +02:00
Max Kellermann
bedc172eab crossfade: emulate strtok_r() on WIN32 with a function
Not a CPP macro.  This adds the "unused" attribute to "saveptr", which
eliminates one gcc warning.
2010-05-18 23:56:53 +02:00
Max Kellermann
0a9b0dd070 command: fallback strftime() formats on WIN32
On WIN32, "%F" and "%T" are not implemented.
2010-05-18 23:54:12 +02:00
Max Kellermann
6aa0f61e15 socket_util: fix setsockopt() argument type on WIN32
In the winsock headers, the setsockopt() argument is declared as
"const char *", not "const void *".
2010-05-18 23:13:05 +02:00
Max Kellermann
4461c3d5d1 daemon: include glib.h on WIN32 for g_error() 2010-05-18 23:13:05 +02:00
Max Kellermann
fef46bcf49 fd_util: fd_set_cloexec() returns a value on WIN32
This function is empty on WIN32, but we need to return a value.
2010-05-18 23:09:07 +02:00
Max Kellermann
fa2ff849c5 input/ffmpeg: new input plugin using libavformat's "avio" library 2010-05-18 21:20:31 +02:00
Max Kellermann
6b2b91ff01 input/mms: removed empty method buffer()
input_stream_buffer() has a check for "buffer==NULL", so we don't need
an explicit empty implementation.
2010-05-18 21:20:31 +02:00
Max Kellermann
28736414a8 input/mms: initialize the "eof" attribute 2010-05-18 21:11:00 +02:00
Max Kellermann
e98bd55cbf input/mms: fix memory leak in error handler 2010-05-18 20:57:57 +02:00
Daniel Seuthe
733962db2f decoder_api: return effective replay gain
Pay attention to the ReplayGain mode "auto" and the
replay_gain_missing_preamp parameter inside of decoder_replay_gain().
2010-05-18 20:39:32 +02:00
Daniel Seuthe
f824ecdfa1 replay_gain_config: added function replay_gain_get_real_mode() 2010-05-18 20:30:03 +02:00
Max Kellermann
6c831e04a2 output/oss: 24 bit support via OSS4
Added #ifdefs on the macros AFMT_S24_NE and other OSS4 extensions.
2010-05-14 09:48:02 +02:00
Max Kellermann
67c48f66a6 output/oss: rewrite of the audio format detection
Removed the "supported" / "unsupported" arrays, and auto-detect on
every open() call, just like the ALSA output plugin.
2010-05-13 14:42:09 +02:00
Max Kellermann
5fa1c703de output/oss: use the *_NE macros
Removed the macro AFMT_S16_MPD.
2010-05-13 14:34:22 +02:00
Avuton Olrich
bead892e21 AudioCompress: include stdint.h for int16_t definition.
In mingw32, int16_t is not defined by sys/types.h, but it is by stdint.h,
and it is in the int16_t man page as being defined in stdint.h. Thanks to
mithi for help debugging.
2010-05-11 18:48:22 -07:00
Avuton Olrich
8341daca4a client_new: Send greeting using send() rather than write().
This is portable for win32 and fixes client logins there.
2010-05-08 16:48:01 -07:00
Tim Phipps
136759a298 mixramp: Remove maths from pcm_mix when using MixRamp overlaps. 2010-05-08 09:28:06 +02:00
Tim Phipps
0ac5b6e613 mixramp: Adjust MixRamp threshold to account for ReplayGain. 2010-05-08 00:19:44 -07:00
Avuton Olrich
eb5208c4f9 log: /dev/null doesn't exist on win32. 2010-05-08 00:17:34 -07:00
Max Kellermann
d88c3c8462 output_thread: call replay gain filter manually
Don't add it to the filter chain, because we need to apply replay gain
before cross-fading with the next song.  Add a second replay_gain
filter which is used for the song being faded in (chunk->other).
2010-05-02 18:21:16 +02:00
Max Kellermann
5399a72ec1 player_thread: move cross-fading to output thread
Remove cross_fade_apply(), and call pcm_mix() in the output thread,
mixing the chunk and chunk->other together.
2010-05-02 17:46:07 +02:00
Max Kellermann
d093fb2441 chunk: added attribute "other"
Preparation for cross-fading support in the output thread.
2010-05-02 17:46:06 +02:00
Max Kellermann
0140804ef9 output_thread: moved code to ao_filter_open(), ao_filter_close() 2010-05-02 17:38:16 +02:00
Max Kellermann
ecb5f68ba8 output_thread: moved filter invocation to ao_filter_chunk() 2010-05-02 17:34:35 +02:00
Max Kellermann
55bf242635 filter/replay_gain: removed duplicate *dest_size_r assignment 2010-05-02 17:34:27 +02:00
Avuton Olrich
7dba410c26 configure.ac: Move the encoders before the audio outputs.
Move encoder before audio outputs. Makes sense to keep them after
decoders and some audio outputs need to know wheather encoders are
present.
2010-04-26 06:49:12 -07:00
Daniel Seuthe
92e66e5ab2 replay_gain: added mode "auto" 2010-04-25 13:51:58 +02:00
Max Kellermann
54dedef9cf configure.ac: removed stray comma 2010-04-25 13:51:54 +02:00
Avuton Olrich
b8b2ef3de1 configure.ac: Add libogg section
Add libogg section rather than checking for it every time it's necessary.
2010-04-23 06:53:26 -07:00
Avuton Olrich
681128def4 configure.ac: Fix an omission during moving oggvorbis to decoder plugins. 2010-04-22 20:00:25 -07:00
Avuton Olrich
f4f4a908bb configure.ac: When compiling FLAC with ogg API, linking with ogg is mandatory. 2010-04-22 19:56:23 -07:00
Avuton Olrich
7c37f2879b configure.ac: Move LAME encoder subheader to correct spot. 2010-04-22 19:09:06 -07:00
Avuton Olrich
615ccd1070 configure.ac: Add optional third variable to results.
Add optional third value to results() to allow for non "yes" answers which are
considered positive.
2010-04-21 12:23:38 -07:00
Avuton Olrich
6ed69e6395 libOggFLAC.m4: Remove libOggFLAC.m4 as it's buggy. 2010-04-21 12:23:38 -07:00
Avuton Olrich
f946a182a3 configure.ac: Rewrite the liboggflac tests.
Rewrite the liboggflac tests, the m4 macro is way too complicated for no
reason and it's buggy.
2010-04-21 12:23:38 -07:00
Avuton Olrich
d3fcb81da0 configure.ac: Fix a couple of syntax errors created by the moves. 2010-04-21 12:23:37 -07:00
Avuton Olrich
7e42637b74 configure.ac: Clean up the wording and lines at the end of the file. 2010-04-21 12:23:37 -07:00
Avuton Olrich
dbe93d4a6d configure.ac: Merge the streaming and nonstreaming sections. 2010-04-21 12:23:37 -07:00
Avuton Olrich
20bc25cdcc configure.ac: Move audio output tests to Post Audio Output Plugins section. 2010-04-21 12:23:37 -07:00
Avuton Olrich
13c0788334 configure.ac: Move protocol tests to the Post Protocol Tests section. 2010-04-21 12:23:37 -07:00
Avuton Olrich
672cf84a32 configure.ac: Remove errant header. 2010-04-21 12:23:37 -07:00
Avuton Olrich
2834f7802f configure.ac: Move decoder minimum test to Post Decoder Plugins tests. 2010-04-21 12:23:37 -07:00
Avuton Olrich
b135483abc configure.ac: New pretty print results menu.
This commit adds a new pretty print menu, we've (far) outgrown the old
menu which because hard to traverse.
2010-04-21 12:23:37 -07:00
Avuton Olrich
ba36cbde06 configure.ac: Add a comment in libsndfile about possible disabling. 2010-04-21 12:23:37 -07:00
Avuton Olrich
f153681522 configure.ac: Move AC_DEFINE for Ogg Tremor under other if conditional.
Ogg Tremor doesn't have the ability to be disabled under the first if
conditional, might as well AC_DEFINE there.
2010-04-21 07:35:33 -07:00
Avuton Olrich
d73291959b configure.ac: Organize all added CFLAGs. 2010-04-21 07:35:32 -07:00
Avuton Olrich
01a675eb5f configure.ac: Documentation whitespace fixes. 2010-04-21 07:35:32 -07:00
Avuton Olrich
be5143c0f3 configure.ac: Move SHOUTcast output to Streaming Audio Plugins. 2010-04-21 07:35:32 -07:00
Avuton Olrich
b7ee1f5c40 configure.ac: Move Recorder output to Streaming Audio Plugins. 2010-04-21 07:35:32 -07:00
Avuton Olrich
b619f5e73d configure.ac: Move HTTPD output to Streaming Audio Plugins. 2010-04-21 07:35:32 -07:00
Avuton Olrich
e44f639002 configure.ac: Move final encoder tests to the end of the encoder tests. 2010-04-21 07:35:32 -07:00
Avuton Olrich
1aa470e0bf configure.ac: Move WAVE Encoder to Encoder Plugins. 2010-04-21 07:35:32 -07:00
Avuton Olrich
b6a33691ff configure.ac: Move TwoLAME Encoder to Encoder Plugins. 2010-04-21 07:35:32 -07:00
Avuton Olrich
5e616b4ff3 configure.ac: Move LAME Encoder to Encoder Plugins. 2010-04-21 07:35:31 -07:00
Avuton Olrich
d847593a8e configure.ac: Move OggVorbis Encoder to Encoder Plugins. 2010-04-21 07:35:31 -07:00
Avuton Olrich
1cd5700c37 configure.ac: Move FLAC Encoder to Encoder Plugins. 2010-04-21 07:35:31 -07:00
Avuton Olrich
957cf3c7b0 configure.ac: Add encoder/encoder API header 2010-04-21 07:35:31 -07:00
Avuton Olrich
b6c8de6e01 configure.ac: Move tremor/oggflac test under oggflac. 2010-04-21 07:35:31 -07:00
Avuton Olrich
21f5ed4a25 configure.ac: Check for vorbis once, and AC_DEFINE it there. 2010-04-21 07:35:31 -07:00
Avuton Olrich
52fc168905 configure.ac: Add Post Decoder Plugins Tests header
Add Post Decoder Plugins Tests and move things that shouldn't be in individual
tests to it.
2010-04-21 07:35:31 -07:00
Avuton Olrich
3bb03db097 configure.ac: Move ffmpeg to Decoder Plugins, add header. 2010-04-21 07:35:30 -07:00
Avuton Olrich
ee88b8f8c4 configure.ac: Move WildMidi to Decoder Plugins, add header. 2010-04-21 07:35:30 -07:00
Avuton Olrich
7bfcb6151d configure.ac: Move wavpack to Decoder Plugins, add header. 2010-04-21 07:35:30 -07:00
Avuton Olrich
3c549c5147 configure.ac: Move sidplay to Decoder Plugins, add header. 2010-04-21 07:35:30 -07:00
Avuton Olrich
8b0fb1cc4d configure.ac: Move OggVorbis to Decoder Plugins, add header. 2010-04-21 07:34:55 -07:00
Avuton Olrich
e3d62305f1 configure.ac: Move OggFLAC to Decoder Plugins, add header. 2010-04-21 07:34:55 -07:00
Avuton Olrich
263a968c2b configure.ac: Move Ogg Tremor to Decoder Plugins, add header. 2010-04-21 07:34:54 -07:00
Avuton Olrich
39b37d547c configure.ac: Move musepack to Decoder Plugins, add header. 2010-04-21 07:11:49 -07:00
Avuton Olrich
4cfcdd5e0f configure.ac: Move libsndfile to Decoder Plugins, add header. 2010-04-21 07:11:49 -07:00
Avuton Olrich
9d72a34109 configure.ac: Move sndfile/modplug conflict test to Decoder Plugins, add header. 2010-04-21 07:10:59 -07:00
Avuton Olrich
18cdbfa70f configure.ac: Move libmodplug to Decoder Plugins, add header. 2010-04-21 07:10:16 -07:00
Avuton Olrich
7886fd711f configure.ac: Move libmikmod to Decoder Plugins, add header. 2010-04-21 07:10:16 -07:00
Avuton Olrich
3993ed6b81 configure.ac: Move libmpg123 to Decoder Plugins, add header. 2010-04-21 07:10:15 -07:00
Avuton Olrich
abf974c5c5 configure.ac: Move libmad to Decoder Plugins, add header. 2010-04-21 07:10:15 -07:00
Avuton Olrich
97f80e04b0 configure.ac: Move FluidSynth to Decoder Plugins, add header. 2010-04-21 07:10:15 -07:00
Avuton Olrich
944057c30b configure.ac: Move FLAC to Decoder Plugins, add header. 2010-04-21 07:10:15 -07:00
Avuton Olrich
9c4d4bd6b0 configure.ac: Move FAAD to Decoder Plugins, add header. 2010-04-21 07:10:15 -07:00
Avuton Olrich
a77fd83b15 configure.ac: Move audiofile to Decoder Plugins, add header. 2010-04-21 07:10:15 -07:00
Avuton Olrich
ed78955f8d configure.ac: Move Solaris to Audio Output Plugins (nonstreaming), add header. 2010-04-21 07:10:15 -07:00
Avuton Olrich
cab16f8e1e configure.ac: Move MVP to Audio Output Plugins (nonstreaming), add header. 2010-04-21 07:10:14 -07:00
Avuton Olrich
24db28072f configure.ac: Add header for Pipe Output and Pulseaudio. 2010-04-21 07:10:14 -07:00
Avuton Olrich
e20d3d49b3 configure.ac: Move OSX to Audio Output Plugins (nonstreaming), add header. 2010-04-21 07:10:14 -07:00
Avuton Olrich
33641df09c configure.ac: Move OSS to Audio Output Plugins (nonstreaming), add header. 2010-04-21 07:10:14 -07:00
Avuton Olrich
294cce2710 configure.ac: Move OpenAL to Audio Output Plugins (nonstreaming), add header. 2010-04-21 07:10:14 -07:00
Avuton Olrich
9fb31aafb3 configure.ac: Move libao to Audio Output Plugins (nonstreaming), add header. 2010-04-21 07:10:14 -07:00
Avuton Olrich
791ddc566a configure.ac: Move JACK to Audio Output Plugins (nonstreaming), add subheader. 2010-04-21 07:10:14 -07:00
Avuton Olrich
7d2b2e371c configure.ac: Move FIFO to Audio Output Plugins (nonstreaming), add subheader. 2010-04-21 07:10:13 -07:00
Avuton Olrich
c3ecb5aa5e configure.ac: Move ALSA to Audio Output Plugins (nonstreaming), add subheader. 2010-04-21 07:10:13 -07:00
Avuton Olrich
191e520999 configure.ac: Move converter plugins up with other aux plugins. 2010-04-21 07:10:13 -07:00
Avuton Olrich
dd5fdbc540 configure.ac: Move archive plugins around (alphabetize), add subheaders. 2010-04-21 07:10:13 -07:00
Avuton Olrich
b39855731c configure.ac: Add subheaders to Input/Sticker/Autodiscovery/Metadata and Misc. 2010-04-21 07:10:13 -07:00
Avuton Olrich
e27dd7280f configure.ac: Move libid3tag to "Metadata Plugins" 2010-04-21 07:10:13 -07:00
Avuton Olrich
a9ff134e9f configure.ac: Move inotify to "Miscellaneous Libraries". 2010-04-21 07:10:13 -07:00
Avuton Olrich
11fbb1c807 configure.ac: Move all AC_ARG* functions to a single place in the configure.ac. 2010-04-21 07:10:12 -07:00
Avuton Olrich
15998c0db9 configure.ac: Add better headers to improve readability.
This changes no code, makes no moves; this merely adds some headers
to improve readability.
2010-04-21 07:08:16 -07:00
Max Kellermann
cf3ada3d04 Merge branch 'master' of git://github.com/mcfiredrill/mpd 2010-04-20 21:16:39 +02:00
Avuton Olrich
7df94b1718 lame.m4: Remove unused macro file 2010-04-15 20:23:53 -07:00
Avuton Olrich
c2d788f6de configure.ac: Check for LAME libraries the same way others are checked for.
Check for LAME libraries the same way other libraries are checked for, in line
with the configure and outside the buggy macro. This will fix problems with
cross compilation.
2010-04-15 20:23:35 -07:00
Avuton Olrich
fa8992fc63 configure.ac: Don't allow UNIX IPC to be configured for a native Windows build. 2010-04-13 19:09:26 -07:00
Max Kellermann
8d631b346a inotify_update: start update when directory is created
This is useful at the maximum depth level, to update newly created
directories.  It is however questionable if the hard-coded 5 seconds
delay is enough to create new directory trees with all of their files,
but we might make that delay configurable in the future.
2010-04-13 23:37:44 +02:00
Max Kellermann
393bcd961a inotify: added setting "auto_update_depth"
Limits the depth of the watched directories.  This is useful to keep
resource usage down and speed up MPD startup.
2010-04-13 21:31:57 +02:00
Max Kellermann
4d1eedbaa2 conf: added function config_get_unsigned() 2010-04-13 21:19:07 +02:00
Max Kellermann
a1a03deed2 decoder/mad: properly calculate ID3 size without libid3tag
Without libid3tag, we were trying to skip the ID3 frame (since
0.15.2).  Its length however was not calculated at all, we were just
dropping everything from the current input buffer.  This lead to the
first few seconds of the file being skipped.  This patch attempts to
calculate the ID3v2 frame size with the formula from:

 http://www.id3.org/id3v2.4.0-structure 3.1 and 6.2
2010-04-13 08:51:29 +02:00
Charles Kerr
6a95898038 decoder/ffmpeg: fix crash on startup in mpd_ffmpeg_log_callback()
What's happening is the `ptr' argument to that function is NULL for me
every time. `ptr' is unconditionally dereferenced to generate a log
message, and this is where mpd crashes.

Attached is a simple patch that tests for NULL and omits the log. With
this patch the crash disappeared and mpd went back to working well.
2010-04-11 19:18:30 +02:00
Tony Miller
9d55b16998 Decoder for game music emulation library.
Supports a number of videogame music formats, more info here:
http://www.fly.net/~ant/libs/audio.html

I wrote this plugin for the latest svn, get it here:
http://code.google.com/p/game-music-emu/source/checkout
2010-04-10 01:05:16 -07:00
James Pike
c52f469c9c output/httpd: added name/genre/website configuration 2010-04-05 13:11:10 +02:00
Orivej Desh
50c0c4b701 cue: fix code style 2010-04-01 08:12:25 +02:00
Max Kellermann
8446b70ddc decoder/ffmpeg: print item name in log callback 2010-03-28 19:48:57 +02:00
Orivej Desh
635791d1cd cue: prepend pregap to the beginning of the track
.. rather then append to the end of the previous one

Cuebreakpoints from the cuetools package has three modes of operation,
and the default is to append pregap (INDEX 00) to the end of the
previous track. This is the behavior most compliant to the existing
cue files.

Here is the patch which fixes the issue. I borrowed bits of
implementation from cuebreakpoints. I assumed that the whole audio
file must be covered by head-to-head going tracks, which is how
hardware CD players probably work. In cue_tag I changed rounding from
rounding up to rounding down because the thing in mpd which calculates
actual track duration (and current position) rounds it down, and I
didn't want to see in my playlist values different from whose in a
now-playing progress bar.

I've compared the resultant mpd behaviour with "mplayer -ss MM:SS.MS"
where the time was supplied by cuebreakpoints and noticed that mplayer
started each track a bit earlier then mpd, though this was the same
before the patch.
2010-03-28 19:34:16 +02:00
Max Kellermann
e9beea072d Merge release 0.15.9 from branch 'v0.15.x'
Conflicts:
	NEWS
	configure.ac
	src/cue/cue_tag.c
	src/decoder/mpcdec_decoder_plugin.c
	src/player_thread.c
2010-03-28 19:31:47 +02:00
Max Kellermann
e69bb3b337 Makefile.am: distribute pcm_pack.h
Fix distcheck.
2010-03-28 19:31:02 +02:00
Avuton Olrich
06f86b4532 Add support for building httpd_output plugin for win32 2010-03-22 07:15:39 -07:00
Avuton Olrich
68ece2fef3 Define winnt or greater on mingw32 to take advantage of get*info(). 2010-03-21 18:45:32 -07:00
Avuton Olrich
4953ea90c2 strtok() is recursive by default on win32. 2010-03-21 18:24:24 -07:00
Avuton Olrich
0dcd865c2e Modify version string to post-release version 0.15.10~git 2010-03-21 17:25:18 -07:00
Avuton Olrich
d612e5e0ab mpd version 0.15.9 2010-03-21 17:25:18 -07:00
Tim Phipps
e7a515c8b1 Add support for MixRamp tags
Adds mixrampdb and mixrampdelay commands.  Reads MIXRAP_START and
MIXRAMP_END tags from FLAC files and overlaps instead of crossfading.
2010-03-21 18:21:47 +01:00
Aleksei Kaveshnikov
73ba4ea3da decoder/mpcdec: fix replay gain formula with v8
"When playing musepack files with mpd v0.15.8, rg seems to have no effect.

Using sample file below, mpd says 'computing ReplayGain album scale with gain 122.879997, peak 0.549150'.

One thing though, if I build mpd against old libmpcdec-1.2.6, rg works
as expected: 'computing ReplayGain album scale with gain 16.820000,
peak 0.099765'"
2010-03-19 10:26:08 +01:00
Max Kellermann
cbfaa4a266 player_thread: postpone song tags during cross-fade
Previously, tags of the new song being cross-faded in were sent
immediately.  That can cause wrong information being displayed,
because the "previous" song might send its tag at the end again,
overriding the "next" song's tag.  This patch saves & merges the tag
of the next song, and sends it when cross-fading is finished, and the
next song really starts.
2010-03-17 23:14:54 +01:00
Max Kellermann
2e72a9b262 tag: added function tag_merge_replace()
Like tag_merge(), but can deal with NULL parameters, and frees both
tag objects.
2010-03-17 23:12:21 +01:00
Max Kellermann
e9b75d462c AudioCompress: explicitly include stdint.h
For int16_t.
2010-03-17 18:29:56 +01:00
Max Kellermann
68017b1254 decoder_api: use the correct format to calculate elapsed time
When decoder->timestamp is calculated, the PCM data is already
converted to out_audio_format; using in_audio_format may cause funny
speedups/slowdowns.
2010-03-17 18:26:36 +01:00
Piotr Gozdur
96033e4b4e decoder/mpcdec: fix negative shift on fixed-point samples
"There is a bug in fixed-point musepack (musepack_src_r435) playback.
In floating-point audio is OK but in fixed audio is distorted.  I have
made a patch for this"
2010-03-17 17:54:21 +01:00
Max Kellermann
469c9b5def command: allow "update" with slash or empty path
When handle_update() was modified to use uri_safe_local(), suddently
"mpc update ''" and "mpc update '/'" stopped working, because both are
not a "safe" local URI.  This patch adds a special case for these, to
retain backwards compatibility.
2010-03-12 17:58:16 +01:00
Max Kellermann
e686d19154 output: added option "always_on" for radio stations
Did you ever accidently click "stop" while feeding a radio station?
This option sets the output device to "pause" to disable the "close"
method.  It falls back to "pause" then, which is specific to the
plugin.  Some plugins implement it by feeding silence.
2010-03-10 19:49:31 +01:00
Max Kellermann
762565e9d1 output/jack: drain the ring buffers during pause
If we're not doing this, and a new song is played after pause ends,
then you will hear the rest of the previous song.
2010-03-10 19:48:49 +01:00
Max Kellermann
41a4662c8c output/jack: synchronize all channels
Always use the same number of samples from each channel's ring
buffer.  This ensures that all channels are kept in sync.
2010-03-10 19:48:34 +01:00
Max Kellermann
5842015b90 decoder/ffmpeg: fix indentation 2010-03-07 19:20:34 +01:00
Max Kellermann
9134169e37 playlist: fix single+repeat in random mode
With single+repeat enabled, it is expected that MPD repeats the
current song over andd over.  With random mode also enabled, this
didn't work, because the song order was shuffled internally.  This
patch adds a special check for this case.
2010-03-07 18:58:44 +01:00
Max Kellermann
ae56901863 decoder/ffmpeg: implement the libavutil log callback
Pass everything to the GLib logging library.  No direct stderr access.
2010-02-27 19:32:59 +01:00
Max Kellermann
4e364854ab decoder/ffmpeg: don't close the AVFormatContext after open failure
The pointer is invalid if av_open_input_file() fails.
2010-02-27 19:25:56 +01:00
Max Kellermann
a3645984cd command: "update" checks if the path is malformed
This is a very basic check, which only ensures that the path does not
begin with a slash, doesn't have double slashes and the special names
"." and ".." are forbidden.
2010-02-27 19:01:17 +01:00
Max Kellermann
43cf4e97b9 uri: allow leading dots, but explicitly exclude "." and ".."
Dots at the beginning of an URI segment are ok, as long as the special
names "." and ".." are not used.
2010-02-27 18:56:47 +01:00
Max Kellermann
35c5a371ea decoder/mad: fix crash when seeking at end of song
Removed the decoder_command_finished() call at the end of
mp3_decode().  This is invalid, because decoder_command_finished() has
already been called in mp3_read().
2010-02-27 18:35:31 +01:00
Max Kellermann
795578ef95 update: log start/finish of the update thread 2010-02-27 16:41:54 +01:00
Max Kellermann
96493e0333 replay_gain: optionally use hardware mixer to apply replay gain
Add an option for each audio output which enables the use of the
hardware mixer, instead of the software volume code.

This is hardware specific, and assumes linear volume control.  This is
not the case for hardware mixers which were tested, making this patch
somewhat useless, but we will use it to experiment with the settings,
to find a good solution.
2010-02-17 08:14:07 +01:00
Max Kellermann
48b49e2303 replay_gain: fall back to track gain if album gain is unavailable 2010-02-17 08:13:34 +01:00
Max Kellermann
752dfb3d95 replay_gain: reimplement as a filter plugin
Apply the replay gain in the output thread.  This means a new setting
will be active instantly, without going through the whole music pipe.
And we might have different replay gain settings for each audio output
device.
2010-02-17 07:23:13 +01:00
Max Kellermann
5e0117b444 replay_gain_info: allocate the struct statically
Don't allocate each replay_gain_info object on the heap.  Those
objects who held a pointer now store a full replay_gain_info object.
This reduces the number of allocations and heap fragmentation.
2010-02-17 07:22:44 +01:00
Max Kellermann
c05e6a1275 replay_gain_info: use INFINITY to mark undefined values
The previous patch not only moved code, it also changed the check.
Negative gain values seem to be valid after all, there just was the
"magic" value 0.0 which means "not available".  This patch changes the
"magic" value to "INFINITY", and uses the C99 function isinf() to
check.  It might have been a better idea to use "NAN", but the "NAN"
macro is a GNU extension.
2010-02-17 07:07:00 +01:00
Max Kellermann
b21e4d9a58 replay_gain_state: moved code to replay_gain_tuple_scale()
Moved (and renamed) the function calc_replay_gain_scale() to
replay_gain_info.c.
2010-02-15 21:23:24 +01:00
Max Kellermann
eeef501ed8 replay_gain: added function defined()
This function determines whether replay gain data is available.
2010-02-15 19:09:24 +01:00
Max Kellermann
f4e9275f7c filter/volume: assign dest_size_r early, eliminate one 2010-02-15 19:09:09 +01:00
Max Kellermann
f672657388 Makefile.am: remove sticker.xml 2010-02-08 11:55:03 +01:00
Max Kellermann
32441175f4 doc: deleted sticker specification proposal
This document has been unmaintained for more than a year now (since
the day it was submitted).
2010-02-08 11:39:16 +01:00
Max Kellermann
059d1dc7f2 command: "listplaylist" dumps playlist files
Same for "listplaylistinfo".
2010-02-08 11:11:43 +01:00
Max Kellermann
7fbb856eee playlist_queue: moved code to playlist_mapper.c 2010-02-08 10:56:28 +01:00
Max Kellermann
bb2aa70ec6 playlist_queue: moved check_translate_song() to playlist_song.c 2010-02-08 10:28:12 +01:00
Max Kellermann
8e34c59c82 song_print: song_print() returns void
The only "return" statement always returns 0.
2010-02-08 10:21:15 +01:00
Anton Khirnov
766b9fd453 ffmpeg: read more metadata. 2010-02-02 17:55:58 +01:00
Tim Phipps
891dab7b91 decoder/flac: fix replay gain (short-circuiting "or") 2010-01-28 20:54:04 +01:00
Max Kellermann
7a24e496d5 configure.ac: new libwrap autoconf test
Use MPD_AUTO_RESULT().  Don't force libwrap by default.
2010-01-20 21:42:43 +01:00
Davide Camurri
7a62818ffd client: optionally use libwrap 2010-01-20 21:04:07 +01:00
Max Kellermann
acb0ff1ea8 decoder/wavpack: fixed WVC URI
Pass the current URI to wavpack_open_wvc().
2010-01-20 12:08:44 +01:00
Max Kellermann
2acad9fe1e decoder/ffmpeg: call decoder_timestamp() once per packet 2010-01-18 13:11:04 +01:00
Max Kellermann
8914ebc964 decoder/ffmpeg: merged ffmpeg_helper() into ffmpeg_decode() 2010-01-18 11:06:09 +01:00
Max Kellermann
5477c31160 decoder/ffmpeg: optimized the stream_tag() method
Don't use the function ffmpeg_helper(), don't initialize the codec.
2010-01-18 11:06:04 +01:00
Max Kellermann
acd3f8cd91 decoder/ffmpeg: free AVFormatContext on error
Fix a memory leak in some code paths.
2010-01-18 11:05:15 +01:00
Max Kellermann
ca1fc13116 decoder_api: removed function decoder_get_uri()
Use input_stream.uri.
2010-01-18 10:21:57 +01:00
Max Kellermann
9cb7760c5e input_stream: added attribute "uri" 2010-01-18 10:18:41 +01:00
Max Kellermann
fb9bd53328 input_stream: added function input_stream_deinit()
All close() implementations must call this method.
2010-01-18 09:57:53 +01:00
Max Kellermann
a0a26d3341 Merge release 0.15.8 from branch 'v0.15.x
Conflicts:
	Makefile.am
	NEWS
	configure.ac
	src/decoder/ffmpeg_decoder_plugin.c
	src/decoder_thread.c
2010-01-18 07:52:58 +01:00
Avuton Olrich
728c66e7e3 Modify version string to post-release version 0.15.9~git 2010-01-18 07:41:15 +01:00
Avuton Olrich
760569fc66 mpd version 0.15.8 2010-01-18 07:41:08 +01:00
Max Kellermann
9d4b7ab113 decoder_thread: don't fall back to "mad" unless no plugin matches
When all plugins have failed, MPD used to fall back to the "mad"
decoder plugin, to handle those radio streams without a Content-Type
response header.  This however leads to unexpected results (garbage
being played) when the stream isn't really mp3.  Since we care little
about "bad" streams, we shouldn't have hacks which have bad side
effects.

Let's get rid of this hack now!  Only try to "mad" plugin if there was
no match at all (Content-Type, path suffix) and no other plugin has
been tried.
2010-01-17 17:09:10 +01:00
Max Kellermann
8ac776c58b decoder_thread: don't try a plugin twice (MIME type & suffix)
Manage a linked list of plugins which were already tried.
2010-01-17 16:47:04 +01:00
Max Kellermann
2579a2f924 decoder/ffmpeg: added more MIME types
Taken from the ffmpeg sources.
2010-01-17 16:00:14 +01:00
Max Kellermann
006f4be71c fd_util: include ws2tcpip.h for socklen_t 2010-01-17 14:48:52 +01:00
Max Kellermann
163e05f5a0 fd_util: fixed WIN32 versions of pipe()
Use the correct parameter name.
2010-01-17 14:43:15 +01:00
Max Kellermann
02526eda86 text_file: don't strip trailing whitespace
Only delete the newline characters (\n and optionally \r).  This
allows the database file to store file names with trailing whitespace.
2010-01-17 12:52:11 +01:00
Max Kellermann
828a5f552f output/pulse: clear the "mainloop" attribute on error
When enabling the pulse device fails, clear po->mainloop after
pa_threaded_mainloop_free() has finished.  This is important for the
assertions.

Two wrong g_free() calls were also removed.
2010-01-17 12:03:22 +01:00
Max Kellermann
a7664b98ba Makefile.am: link test/run_decoder and test/read_tags with timer.c
Needed for the fluidsynth decoder plugin.
2010-01-17 11:21:35 +01:00
Max Kellermann
1b441837f1 decoder/ffmpeg: append file name suffix to virtual stream URL
To allow libavformat to detect the format of the input file, append
the suffix of the input file to the URL of the virtual stream.  This
specifically enables the "shorten" codec, which is supported by
libavformat/raw.c, detected only by the suffix.
2010-01-17 02:36:07 +01:00
Max Kellermann
e43bf52cbb configure.ac: disable -Wdeclaration-after-statement
Allow declaration after statement.
2010-01-17 02:36:03 +01:00
Max Kellermann
26841b6058 output/alsa: support packed 24 bit samples 2010-01-17 00:43:24 +01:00
Max Kellermann
1abfcc56af audio_format: support packed 24 bit samples 2010-01-16 23:44:54 +01:00
Max Kellermann
da47afe7d1 output/alsa: probe all sample formats in a loop
More code simplification.  Probe all formats, no matter which input
format.
2010-01-16 23:44:52 +01:00
Max Kellermann
96546c1a8a output/alsa: merged code into alsa_output_try_format()
Remove the debug log messages, because they are duplicate (see
ao_open() in output_thread.c).
2010-01-16 23:44:50 +01:00
Max Kellermann
579a8a96ea output/alsa: pass sample_format to get_bitformat() 2010-01-16 23:44:48 +01:00
Max Kellermann
79848e3414 output/alsa: moved code to alsa_output_setup_format() 2010-01-16 23:44:42 +01:00
Max Kellermann
87c861cae3 test/run_convert: implement a GLib log callback
Log to stderr instead of the default stdout.  We need a pristine
stdout for the conversion result.
2010-01-16 23:44:40 +01:00
Max Kellermann
8f326a33ee test/run_convert: use fifo_buffer to adapt to odd sample sizes
Ensure that the pcm_convert() length argument is aligned to the sample
size.
2010-01-16 23:25:58 +01:00
Max Kellermann
8ba08edd0e queue: don't repeat current song in consume mode
Check consume mode in queue_next_order(), because the current song
would be deleted as soon as it's finished; it cannot be played again.
2010-01-16 20:58:24 +01:00
Max Kellermann
90d16af66a decoder_thread: fix CUE track playback
The patch "input/file: don't fall back to parent directory" introduced
a regression: when trying to play a CUE track, decoder_run_song()
tries to open the file as a stream first, but this fails, because the
path is virtual.

This patch fixes decoder_run_song() (instead of reverting the previous
patch) to accept input_stream_open() failures if the song is a local
file.  It passes the responsibility to handle non-existing files to
the decoder's file_decode() method.
2010-01-16 19:20:11 +01:00
Max Kellermann
777bd7c1e1 NEWS: added missing entry 2010-01-16 18:41:34 +01:00
Max Kellermann
a942384fbf decoder/flac: support streams without STREAMINFO block 2010-01-06 10:17:16 +01:00
Max Kellermann
de0cdee4aa decoder/flac: pass bits_per_sample to flac_sample_format()
Easier to reuse the function.
2010-01-06 09:55:20 +01:00
Max Kellermann
550c9319e9 decoder/flac: moved decoder initialization to _flac_common.c
Invoke decoder_initialized() in the libFLAC metadata callback.  This
merges code from the FLAC and the OggFLAC decoder plugin into the
common library.
2010-01-06 09:50:34 +01:00
Max Kellermann
ae9c02b3a8 decoder/flac: remember audio_format, not stream_info 2010-01-06 09:00:32 +01:00
Max Kellermann
6f6d47dd20 decoder/flac: removed CUE sheet support
This feature has been moved to the "flac" playlist plugin.
2010-01-06 08:52:35 +01:00
Max Kellermann
030e61115c playlist: added a FLAC playlist plugin
This playlist plugin handles FLAC files with embedded CUE sheets.
2010-01-06 08:50:52 +01:00
Max Kellermann
d6d5caae23 decoder/flac: moved flac_tag_load() to flac_metadata.c
Make this code is reusable.
2010-01-06 08:50:35 +01:00
Max Kellermann
382691179f tag: fixed memmove() size argument in tag_delete_item()
This function has always been broken, but fortunately nobody used it.
2010-01-06 08:48:23 +01:00
Max Kellermann
01c5cb985c playlist_queue: convert absolute paths
Accept absolute paths if they point into the music directory.
2010-01-06 08:00:35 +01:00
Max Kellermann
8a5d2c3c83 playlist_queue: use the "uri" variable earlier
Preparation for the next patch.
2010-01-06 08:00:02 +01:00
Max Kellermann
2f8135ef8b input/rewind: enable the "rewind" wrapper for all non-seekable streams
Don't limit the "rewind" input plugin to CURL streams.
2010-01-04 21:45:32 +01:00
Max Kellermann
9b9abff972 renamed decoder plugin sources
Make it X_decoder_plugin.c.
2010-01-04 21:45:32 +01:00
Max Kellermann
c69cc31de0 decoder/mad: fix build error without libid3tag 2010-01-04 21:45:32 +01:00
Max Kellermann
241e94936f replay_gain: moved code to replay_gain_config.c 2010-01-04 21:02:47 +01:00
Max Kellermann
1330274ffc replay_gain: moved code to replay_gain_info.c 2010-01-04 21:02:36 +01:00
Max Kellermann
0e183d3fa1 replay_gain: refactor API, move code to replay_gain_state.c
The replay_gain_state struct holds the precalculated scale factor,
which is removed from struct replay_gain_info.
2010-01-04 20:54:01 +01:00
Max Kellermann
cd8f92c928 decoder_api: added function decoder_replay_gain()
This function replaces the replay_gain_info parameter for
decoder_data().  This allows the decoder to announce replay gain
changes, instead of having to pass the same object over and over.
2010-01-04 20:42:49 +01:00
Max Kellermann
e58b4f773f replay_gain: added function replay_gain_info_dup() 2010-01-04 20:42:49 +01:00
Max Kellermann
604ca50b65 valgrind.suppressions: added new suppressions 2010-01-04 20:42:49 +01:00
Max Kellermann
537e353546 replay_gain: removed overly verbose debug message
Don't log "ReplayGain is missing".
2010-01-02 23:46:44 +01:00
Max Kellermann
f95d7b13da configure.ac: disable -Wdeclaration-after-statement
Allow declaration after statement.
2010-01-02 23:46:42 +01:00
Max Kellermann
915182bcb8 output_all: reset elapsed_time at song border
Another quirk fixed: after the last chunk of a song has been played,
the "elapsed_time" variable is set to the chunk's time stamp.  When
the client receives the PLAYER idle event and asks MPD for the current
time stamp, MPD will return the last time stamp of the previous song
when it hasn't played the first chunk of the current song yet.
2010-01-02 21:16:51 +01:00
Max Kellermann
959f94b06c dbUtils: return empty tag value only if no value was found
This fixes a regression in the patch "return multiple tag values per
song": even when the song has values for the specified tag type, the
empty string gets added to the set, because the "return" was removed.
This patch adds a flag which remembers whether at least one value was
found.
2010-01-02 19:24:31 +01:00
Max Kellermann
d3b763a48c input_stream: return allocated input_stream objects
Major API redesign: don't let the caller allocate the input_stream
object.  Let each input plugin allocate its own (derived/extended)
input_stream pointer.  The "data" attribute can now be removed, and
all input plugins simply cast the input_stream pointer to their own
structure (with an "struct input_stream base" as the first attribute).
2010-01-01 17:25:07 +01:00
Max Kellermann
816b6ad4a7 updated valgrind.suppressions
Mostly OpenSSL and GLib one-time allocations.
2010-01-01 17:24:47 +01:00
Max Kellermann
3adfbfe36d configure.ac: expose variables OPENAL_CFLAGS and OPENAL_LIBS
Don't add these to the global MPD_CFLAGS and MPD_LIBS.  This allows
test programs to link without libopenal.
2010-01-01 17:10:10 +01:00
Avuton Olrich
9d3865cb95 Update copyright notices. 2009-12-31 20:58:43 -08:00
Max Kellermann
05cde5810a decoder: switch a bunch of plugins to stream_tag()
This patch changes the following decoder plugins to implement
stream_tag() instead of tag_dup():

 faad, ffmpeg, mad, modplug, mp4ff, mpcdec, oggflac

This simplifies their code, because they do not need to take care of
opening/closing the stream.
2009-12-31 18:32:09 +01:00
Max Kellermann
6b96f5d566 decoder_plugin: added method stream_tag()
This is like tag_dup(), but works with an input_stream object instead
of a file path.
2009-12-31 18:27:48 +01:00
Max Kellermann
7a2e07e124 song_update: use decoder_plugin_tag_dup()
Minor code simplification.
2009-12-31 18:27:40 +01:00
Max Kellermann
aad05fd138 archive: use reference counting for archive+input
Make the input_stream implementation hold a reference on the
archive_file object.  Allow the caller to "close" the archive_file
object immediately, no matter if the open_stream() method has
succeeded or not.
2009-12-31 18:27:35 +01:00
Max Kellermann
032c5376ad refcount: library for reference counting 2009-12-31 16:26:39 +01:00
Max Kellermann
0cc3b98bd9 input/archive: don't initialize input_stream.ready
The archive plugin should decide this.
2009-12-31 16:26:34 +01:00
Max Kellermann
c157711eaf archive/bz2: allocate buffer statically
Reduce the number of malloc()/free() calls.
2009-12-31 16:26:14 +01:00
Max Kellermann
2632794578 archive/bz2: added struct bz2_input_stream
Don't use the bz2_archive_file object for the input_stream.
2009-12-31 16:25:21 +01:00
Max Kellermann
3ddf7b620c archive/iso9660: added struct iso9660_input_stream
Don't use the iso9660_archive_file object for the input_stream.
2009-12-31 16:13:09 +01:00
Max Kellermann
131cb0598a archive/iso9660: set input_stream.{size,offset} 2009-12-31 16:13:09 +01:00
Max Kellermann
9862521aec archive/zzip: added struct zzip_input_stream
Don't use the zzip_archive object for the input_stream.
2009-12-31 16:00:12 +01:00
Max Kellermann
55fbb67cfb archive/zzip: set input_stream.{size,offset} 2009-12-31 15:59:43 +01:00
Max Kellermann
a0384aaead Makefile.am: added unit tests for the archive plugins 2009-12-31 15:50:59 +01:00
Max Kellermann
efc885a9dc Merge vorbis+icy fixes from branch 'v0.15.x'
Conflicts:
	Makefile.am
	NEWS
	configure.ac
	src/input/curl_input_plugin.c
	src/input_stream.c
2009-12-30 23:24:11 +01:00
Max Kellermann
4419e5b90d input/curl: removed the built-in rewinding code
This has been reimplemented in the "rewind" input plugin.
2009-12-30 22:52:24 +01:00
Max Kellermann
c88f95a2ea input/rewind: new input_stream wrapper to allow stream rewinding
This replaces the rewinding buffer code from the CURL input plugin.
It is more generic, and allows rewinding even when the server sends
Icy-Metadata (which would have been too difficult to implement within
the CURL plugin).

This is a rather complex patch for the stable branch (v0.15.x), but it
fixes a serious problem: the "vorbis" decoder plugin was unable to
play streams with Icy-Metadata, because it couldn't rewind the stream
after detecting the codec (Vorbis vs. FLAC).
2009-12-29 23:55:40 +01:00
Max Kellermann
c7d099c757 decoder/{ffmpeg,flac,vorbis}: added more flac/vorbis MIME types
Support deprecated MIME types such as "audio/x-ogg".  Support new
types such as "audio/flac".
2009-12-29 22:33:46 +01:00
Max Kellermann
333e11d0eb Merged release 0.15.7 from branch 'v0.15.x'
Conflicts:
	NEWS
	configure.ac
	src/decoder_api.c
2009-12-27 20:10:45 +01:00
Avuton Olrich
d38c09051c Modify version string to post-release version 0.15.8~git 2009-12-27 08:31:47 -08:00
Max Kellermann
58da24b1cb playlist_list: wait for the input stream to become ready
Without this, seeking may cause MPD to crash.
2009-12-27 16:53:47 +01:00
Max Kellermann
bb4cef6a93 playlist/cue: fill song.start_ms, .end_ms
This patch adds practical usefulness to the CUE playlist plugin.
2009-12-27 16:08:53 +01:00
Max Kellermann
5787f73704 decoder, player: support song ranges
Seek the decoder to the start of the range before beginning with
playback.  Stop the decoder when the end of the range has been
reached.  Add the start position to the seek position.  Expose the
duration of the range, not the full song file.
2009-12-27 16:08:53 +01:00
Max Kellermann
201316cd67 playlist_queue: resolve relative URIs, database lookup
Prepend the playlist's base URI to relative song URIs.  Look up songs
in the database (if the URI refers to a local song file).  Merge
existing database metadata with metadata from the playlist plugin.
2009-12-27 16:08:53 +01:00
Max Kellermann
a038bca745 song: added support for selecting a time range
Added attributes start_ms, end_ms.  This allows us to address a
portion of a song file (important for CUE support).  There is no
support yet for storing these attributes in the state file.
2009-12-27 14:46:04 +01:00
Max Kellermann
cf38505d8f playlist_queue: load playlists from music directory
Try the playlist directory first, and if that file does not exist, try
the same relative path within the music directory.
2009-12-27 14:17:26 +01:00
Max Kellermann
af964e8929 uri: added function uri_safe_local() 2009-12-27 14:17:25 +01:00
Max Kellermann
554b2b0ed9 playlist/cue: return the original song URI
The caller should be responsible for building the absolute URI.
2009-12-27 14:17:21 +01:00
Max Kellermann
627975e897 playlist_queue: pass const string to playlist_open_path_into_queue() 2009-12-27 14:17:13 +01:00
Max Kellermann
6622d69fda song: added function song_get_duration() 2009-12-26 13:56:35 +01:00
Max Kellermann
216dff98d2 playlist_queue: try open by URI first
If that fails, try opening the file as a stream.
2009-12-26 03:01:52 +01:00
Max Kellermann
032354e65c playlist_list: use uri_get_suffix() 2009-12-26 03:01:50 +01:00
Max Kellermann
115d26608b uri: check presence of slash in suffix
If there's a slash in the uri_get_suffix() return value, then it's
malformed.  Return NULL in this case.
2009-12-26 03:01:48 +01:00
Max Kellermann
bad350bc18 decoder_api: added function decoder_timestamp()
Remove the data_time parameter from decoder_data().  This patch
eliminates the timestamp counting in most decoder plugins, because the
MPD core will do it automatically by default.
2009-12-26 03:01:43 +01:00
Max Kellermann
870436a592 output_init: use the normalize filter plugin
Use the plugin instead of the glue code in normalize.c.  This is used
wrapped inside a "autoconv" filter, to enable normalization for all
input file formats.
2009-12-25 17:51:08 +01:00
Max Kellermann
6a17233f78 filter: added the "autoconvert" filter plugin 2009-12-25 17:51:05 +01:00
Max Kellermann
b54bde6f2b filter_plugin: allow open() to force an input format
Make the audio_format argument non-const.  Allow the open() method to
modify it, to indicate that it wants a different input audio format
than the one specified.  Check that condition in chain_filter_open(),
and fail.
2009-12-25 17:29:41 +01:00
Max Kellermann
d2051c7f50 filter/volume: support 32 bit samples
The pcm_volume library supports 32 bit samples, there's no reason to
disallow it in the filter plugin.
2009-12-25 17:29:27 +01:00
Max Kellermann
bd29f7e3c8 filter/route: check configured channel count in method init()
Detect misconfiguration during MPD startup, not when playback begins.
2009-12-25 16:39:47 +01:00
Max Kellermann
c3bb81abec filter/route: route_filter_parse() returns bool
Indicate success and error.
2009-12-25 16:39:45 +01:00
Max Kellermann
d469c8137f filter_registry: removed the "chain" plugin from filter_plugins
This plugin cannot be configured.
2009-12-25 16:39:41 +01:00
Max Kellermann
c374a7d3f4 filter/chain: return NULL if a filter() method has failed
Don't close child filters in the filter() method.
2009-12-25 16:28:17 +01:00
Max Kellermann
3679d5bd7a playlist: added CUE playlist plugin
This plugin is the groundwork for MPD's future generic CUE sheet
support.  That's not complete yet, e.g. there is no way for a playlist
plugin to address an arbitrary position within a music file.
2009-12-16 22:19:01 +01:00
Max Kellermann
c128f2dd7e playlist_list: support URI suffix match
When no plugin matches the URI scheme, try the file name suffix.
2009-12-16 22:17:16 +01:00
Max Kellermann
843717d25c playlist_list: check if open method is present
Use open_uri() / open_stream() only after checking that they are
implemented.
2009-12-16 22:16:47 +01:00
Max Kellermann
50ea6a4b5c cue_tag: added song duration support
Get duration from track_get_length().
2009-12-16 22:15:27 +01:00
Max Kellermann
5649f22322 cue_tag: check cd_get_track()!=NULL 2009-12-16 20:55:19 +01:00
Max Kellermann
b89281411f cue_tag: added function cue_tag()
Merge code from cue_tag_file() and cue_tag_string().
2009-12-16 20:49:03 +01:00
Max Kellermann
67c41033c1 cue_tag: merged code into cue_tag_merge() 2009-12-16 17:27:52 +01:00
Max Kellermann
59534b92d2 cue_tag: pass "const" string to cue_tag_string() 2009-12-16 17:26:20 +01:00
Max Kellermann
41a48b14e3 cue_tag: changed runtime checks to assertions
It's illegal to pass NULL here.  This should not be ignored silently.
2009-12-16 17:26:20 +01:00
Max Kellermann
5821bd1a21 cue_tag: fixed indent and code style 2009-12-16 17:18:56 +01:00
Max Kellermann
c5cdac9609 cue_tag: tag_new() cannot fail
Removed the NULL check.
2009-12-16 17:18:23 +01:00
Max Kellermann
b7f55ad392 cue_tag: include cleanup 2009-12-16 17:13:26 +01:00
Max Kellermann
71fee09744 archive_plugin: use GError in the open() method 2009-12-16 17:10:19 +01:00
Max Kellermann
f9af1a445e input/archive: check for archive_file_open() errors
This fixes a NULL pointer dereference in case of archive plugin
failure.
2009-12-16 17:10:15 +01:00
Max Kellermann
0bc8c0c1da archive_plugin: wrap method calls
Make archive_file a "real" struct, extended by all plugins.  Add the
plugin pointer to it.  Wrap all method calls in functions.
2009-12-16 17:09:58 +01:00
Max Kellermann
74156d5bed archive_plugin: pass const string to method open() 2009-12-16 17:09:29 +01:00
Max Kellermann
b04adde7ab archive: added a C header for each plugin
Moved the archive plugin "extern" declarations into each plugin
header.
2009-12-16 15:57:16 +01:00
Max Kellermann
3f64ac04b8 archive/bz2: removed the bz2_context typedef
Use the raw struct name instead.
2009-12-16 15:56:42 +01:00
Max Kellermann
b009970af7 archive/bz2: renamed archive sources and plugin variables 2009-12-16 15:55:48 +01:00
Max Kellermann
bd97586cc4 archive/iso: renamed plugin to "iso9660"
Based on libiso9660.
2009-12-16 15:55:37 +01:00
Max Kellermann
c3e0fbd9e4 archive/bz2: use g_path_get_basename()
Use g_path_get_basename() instead of manually filtering the path
name.  Big advantage: g_path_get_basename() cannot fail.
2009-12-16 15:53:57 +01:00
Alam Arias
b05ba0286e updated mp4ff decoder about input_stream_seek 2009-12-16 06:47:15 +01:00
Max Kellermann
228b03edf8 input_stream: return errors with GError 2009-12-15 23:12:11 +01:00
Max Kellermann
d000d31355 encoder/flac: fix write callback prototype for libFLAC 1.1.2 2009-12-15 23:12:06 +01:00
Max Kellermann
971c9671f6 Makefile.am: link test/run_decoder with timer.c
For the fluidsynth plugin.
2009-12-15 23:11:57 +01:00
Max Kellermann
3d95226f2b decoder_internal: decoder_input_buffer() returns bool
This fixes a regression: a boolean value was returned from
decoder_input_buffer(), but the caller chose to do a "<= 0"
comparison.
2009-12-15 22:24:00 +01:00
Max Kellermann
b12072e6d9 input/archive: use g_path_is_absolute()
.. instead of manually checking pathname[0]=='/'.
g_path_is_absolute() is portable.
2009-12-15 21:26:16 +01:00
Max Kellermann
03427d4eff archive/bz2: simplified error handling, short read
Don't attempt to fill the whole buffer in the read() method, return
whatever libbz2 provides with the first successful BZ2_bzDecompress().
2009-12-15 21:09:13 +01:00
Max Kellermann
a627a703ca archive/bz2: no CamelCase 2009-12-15 20:53:29 +01:00
Max Kellermann
440cfc8052 archive/zzip: removed the "zip_context" typedef
Use the raw struct name.
2009-12-15 20:49:38 +01:00
Max Kellermann
c959148ed1 archive/zip: renamed plugin to "zzip"
This plugin is based on libzzip.
2009-12-15 20:29:44 +01:00
Max Kellermann
530e480748 Merge branch 'v0.15.x'
Conflicts:
	src/archive/bz2_plugin.c
	src/archive_api.h
	src/input/file_input_plugin.c
	test/run_input.c
2009-12-15 20:26:38 +01:00
Max Kellermann
95c3f283ea input/file: don't fall back to parent directory
This code has never made any sense, and has broken some of the archive
plugin.
2009-12-15 19:03:11 +01:00
Max Kellermann
aef6609f4f archive_api.h: moved struct archive_plugin to archive_plugin.h 2009-12-15 19:02:24 +01:00
Max Kellermann
6b728e4756 archive_list: don't include archive_api.h
Use struct forward declarations.
2009-12-15 19:02:17 +01:00
Max Kellermann
f1ecd9eac8 archive_list: iterate with NULL check
Don't use num_archive_plugins.
2009-12-15 15:31:00 +01:00
Max Kellermann
243c96304b archive/bz2: bz2_fillbuffer() returns bool 2009-12-15 09:08:30 +01:00
Max Kellermann
e3597e648c archive/bz2: fixed indentation 2009-12-15 09:00:34 +01:00
Max Kellermann
357037f7ab archive/bz2: g_malloc() cannot fail 2009-12-15 09:00:18 +01:00
Max Kellermann
9715218d40 Makefile.am: distribute AudioCompress/config.h
This fixes "make distcheck".
2009-12-15 07:38:30 +01:00
Max Kellermann
c0b8c2c73b Makefile.am: install glib_compat.h 2009-12-14 23:26:23 +01:00
Max Kellermann
51d0687377 fixed several gcc warnings on unused debug variables 2009-12-14 23:22:51 +01:00
Max Kellermann
849d7895dc decoder/mikmod: fixed gcc uninitialized warning
Removed local variable "sample_rate".
2009-12-14 23:20:14 +01:00
Max Kellermann
850e213261 scripts/test.sh: added sndfile/modplug decoder test 2009-12-14 23:19:13 +01:00
Max Kellermann
786c1f035f input_plugin: method init() returns errors with GError
Not used by any plugin currently, but this eliminates the g_error()
call in input_plugin_config(), so it's worth it.
2009-12-14 23:16:18 +01:00
Max Kellermann
f70d2f58a1 input_stream: moved input_stream_global_init() to input_init.c 2009-12-14 22:53:13 +01:00
Max Kellermann
67b0ab717e input_stream: moved plugin list to input_registry.c 2009-12-14 22:49:46 +01:00
Max Kellermann
f7420dbfe1 input_stream: make input_plugins NULL terminated
This is easier to traverse.
2009-12-14 22:43:00 +01:00
Max Kellermann
400600ffff filter: added normalize filter plugin
Wrap the AudioCompress library in a filter plugin.
2009-12-14 22:24:00 +01:00
Albin Eldstål-Damlin
940e66bb89 Fix and use filter_configured_new() 2009-12-14 22:23:05 +01:00
Albin Eldstål-Damlin
69391dadda Proper error reporting from filter_config 2009-12-14 22:18:28 +01:00
Albin Eldstål-Damlin
ff3393ebf1 Fixed memory leak on incorrect route configuration 2009-12-14 22:18:28 +01:00
Albin Eldstål-Damlin
0ac0bd26e7 Split filter_config into its own module 2009-12-14 22:12:58 +01:00
Max Kellermann
bf6258f582 test/run_{decoder,filter}: implemented GLib log callback
Log to stderr, not to stdout (which broke PCM output).
2009-12-14 21:26:57 +01:00
Albin Eldstål-Damlin
8587fcbb93 Error reporting, pcm_buffer, performance tweaks 2009-12-14 20:41:09 +01:00
Albin Eldstål-Damlin
a4fbf772c1 Initial filter chain and filter configuration for outputs. 2009-12-14 17:56:31 +01:00
Albin Eldstål-Damlin
e28c5a0beb Initial (statically configured) route filter plugin 2009-12-14 17:41:28 +01:00
Albin Eldstål-Damlin
c38b9490a8 Minor documentation fix 2009-12-14 17:41:10 +01:00
Max Kellermann
c3085d7b61 Merge branch 'v0.15.x'
Conflicts:
	src/decoder/ffmpeg_plugin.c
2009-12-14 17:40:50 +01:00
Thomas Jansen
179502fe93 decoder_api: prefer stream_tag over decoder_tag
If both tags (stream and decoder) are present, we prefer the stream tag.
Fixes #2698, where ICY tag contained useful information, but was
overwritten with bogus decoder tag data.
2009-12-07 14:52:48 +01:00
Viliam Mateicka
b6b377edd1 pcm_volume: change old code to use format instead of bits 2009-12-03 20:56:57 +01:00
Viliam Mateicka
a76097210f encoders: remove unnessesary pointers to const strings 2009-12-03 20:43:13 +01:00
Viliam Mateicka
ac0bf1a445 httpd: use get_mime_type to determine encoder content 2009-12-03 20:27:08 +01:00
Viliam Mateicka
7b80e73810 encoders: implement new get_mime_types method 2009-12-03 20:11:32 +01:00
Viliam Mateicka
6d11711a01 encoder: add get_mime_type() method to determine content type by httpd output plugin 2009-12-03 19:39:34 +01:00
Viliam Mateicka
bae03e173e pcm_mix: change old code to use format instead of bits 2009-12-03 17:03:21 +01:00
Viliam Mateicka
07b388f8d4 null_encoder: use pcm_buffer 2009-12-03 17:03:20 +01:00
Viliam Mateicka
4809213676 flac_encoder: add support for libFLAC < 1.1.3 2009-12-03 14:53:30 +01:00
Jeffrey Middleton
c77fa296bc compress: add config.h
This includes some default values of #defined constants used in the
code; it won't compile without it.
2009-12-02 21:14:35 -06:00
Max Kellermann
c412d6251e audio_format: changed "bits" to "enum sample_format"
This patch prepares support for floating point samples (and probably
other formats).  It changes the meaning of the "bits" attribute from a
bit count to a symbolic value.
2009-12-02 22:29:50 +01:00
Max Kellermann
68c2cfbb40 test: added normalize test program 2009-12-02 21:56:02 +01:00
J. Shagam
4076523198 compress: upgraded to AudioCompress 2.0
Copied sources from
http://beesbuzz.biz/code/audiocompress/AudioCompress-2.0.tar.gz

[mk: created this patch under fluffy's name and fixed some gcc
signed/unsigned comparison warnings]
2009-12-02 18:11:53 +01:00
Max Kellermann
3857bb9990 decoder/mpcdec: set 24 bit sample format
This fixes a regression due to a typo caused by "decoder: use
audio_format_init_checked()".
2009-11-25 08:59:13 +01:00
Max Kellermann
300f936228 pcm_mix: implemented 32 bit support 2009-11-19 21:00:54 +01:00
Max Kellermann
1358428031 pcm_volume: implemented 32 bit support
Support 32 bit samples with software mixer.
2009-11-19 21:00:50 +01:00
Max Kellermann
5a480137d2 test: added program to test pcm_convert.c 2009-11-19 21:00:46 +01:00
Max Kellermann
943bafbbc8 test/software_volume: check for errors 2009-11-19 21:00:39 +01:00
Max Kellermann
b772f26213 test/software_volume: fixed audio_format parser
Assign default value only if none was given on the command line.
2009-11-19 20:36:04 +01:00
Max Kellermann
c33bbd947b Merged release 0.15.6 from branch 'v0.15.x'
Conflicts:

	NEWS
	configure.ac
2009-11-19 19:59:34 +01:00
Viliam Mateicka
d37b4bb199 cmdline: print out list of encoders in --version info 2009-11-17 20:39:26 +01:00
Viliam Mateicka
ea92dee1ae encoder: let wave encoder to use pcm_buffer, pcm conversion code cleanup 2009-11-17 20:39:21 +01:00
Viliam Mateicka
5420f9ae76 encoder: introducing flac encoder plugin 2009-11-17 19:41:35 +01:00
Max Kellermann
39404725f0 output/openal: use audio_format_to_string() 2009-11-15 16:20:20 +01:00
Max Kellermann
5d1e5f4ea0 crossfade: use audio_format_valid() in assertion 2009-11-15 15:39:29 +01:00
Max Kellermann
5184476682 valgrind.suppressions: added entry for g_main_context_default() 2009-11-14 23:51:49 +01:00
Max Kellermann
141cbc60b9 decoder/audio: eliminate the "bits" variable
Pass the audiofile_setup_sample_format() result to
audio_format_init_checked().
2009-11-14 23:35:37 +01:00
Max Kellermann
2c1fb48318 decoder/audiofile: moved code to audiofile_setup_sample_format() 2009-11-14 23:22:14 +01:00
Max Kellermann
1dfadf4815 decoder/modplug: count frame position
Don't maintain the current time stamp in a floating point variable,
because this is subject to rounding errors.
2009-11-14 22:30:57 +01:00
Max Kellermann
f5b9e3c064 decoder/modplug: floating point division for song duration
More exact total time.
2009-11-14 22:27:27 +01:00
Max Kellermann
ff70dbd316 decoder/modplug: check ModPlug_Read() < 0
Negative return values are not documented here, but since the function
prototype is signed, let's be sure.
2009-11-14 22:27:04 +01:00
Max Kellermann
dd4625ce13 decoder/mikmod: count frame position
Don't maintain the current time stamp in a floating point variable,
because this is subject to rounding errors.
2009-11-14 02:24:42 +01:00
Max Kellermann
1648c7aa5b decoder/mikmod: sample rate is configurable
The new option "sample_rate" sets the sample rate for libmikmod.
2009-11-14 02:24:42 +01:00
Max Kellermann
edaf017908 decoder/mikmod: set drv_name and drv_version from PACKAGE/VERSION 2009-11-14 02:24:42 +01:00
Max Kellermann
2c7bf61e68 decoder/mikmod: no CamelCase 2009-11-14 02:07:41 +01:00
Max Kellermann
7efb548921 decoder/mikmod: removed the struct mod_Data 2009-11-14 02:07:41 +01:00
Max Kellermann
0c5329aedc decoder/mikmod: merged open()/close() into decode()
These functions are trivial, we don't need them separate.
2009-11-14 02:07:41 +01:00
Max Kellermann
2d236e281f decoder/mikmod: static mod_Data object
Don't allocate this object, put it on the stack.
2009-11-14 02:07:41 +01:00
Max Kellermann
a6fd5819f9 doc: added decoder plugin reference 2009-11-14 02:06:23 +01:00
Max Kellermann
cef5dcc0a1 audio_format: added function audio_format_to_string()
Unified function for converting an audio_format object to a string,
for log messages and for the "status" command.
2009-11-14 01:15:26 +01:00
Max Kellermann
e5b119a324 autogen.sh: allow two minor digits in automake version 2009-11-14 01:15:26 +01:00
Max Kellermann
719990b1c5 decoder: use audio_format_init_checked()
Let the audio_check library verify the audio format in all (relevant,
i.e. non-hardcoded) plugins.
2009-11-14 00:47:22 +01:00
Max Kellermann
f47bb8c1db audio_check: checker functions for audio_format attributes
These functions are a wrapper for audio_valid_X().  On error, they
return a GError object.
2009-11-14 00:47:19 +01:00
Max Kellermann
873025a495 decoder/sidplay: correctly calculate floating point time
Internally, use only the integer time.  When needed, convert it to a
floating point seconds value.
2009-11-14 00:46:30 +01:00
Max Kellermann
409a3ed808 player_thread: corrected two assertions on "queued"
At this point, the function may be called from the SEEK handler.
2009-11-14 00:45:52 +01:00
Max Kellermann
76283c25a5 player_thread: initialize chunk->times in silence generator
When waiting for the decoder to provide more data, the player thread
generates silence chunks if needed.  However, it forgot to initialize
the chunk.times attribute, which had now an undefined value.  This
patch sets it to -1.0, meaning "value is undefined".  Add a ">= 0.0"
check to audio_output_all_check().  This fixes spurious relative
seeking errors, because sometimes, the "elapsed" value falls back to
0.0.
2009-11-12 18:41:25 +01:00
Max Kellermann
b9866e43d3 player_control: hold lock while reading status 2009-11-12 18:40:36 +01:00
Max Kellermann
9947b82cad added .#* to .gitignore
Temporary editor files.
2009-11-12 18:39:40 +01:00
Max Kellermann
5b82ffc291 include config.h in all sources
After we've been hit by Large File Support problems several times in
the past week (which only occur on 32 bit platforms, which I don't
have), this is yet another attempt to fix the issue.
2009-11-12 09:17:03 +01:00
Max Kellermann
8068fd5228 decoder/vorbis: fixed gcc "signed" warning 2009-11-12 09:16:34 +01:00
Max Kellermann
b9c610ac87 directory: include config.h
*sigh* another Large File breakage.  ino_t/dev_t this time.  We need
to include config.h in directory.h to get this straight.
2009-11-11 23:36:36 +01:00
Max Kellermann
59189160e3 decoder/wavpack: allow more than 2 channels
Remove the OPEN_2CH_MAX option.  MPD's support for surround sound is
still clunky, but we're working on it.
2009-11-11 23:03:20 +01:00
Max Kellermann
ee5d3337a7 decoder/wavpack: activate 32 bit support
MPD has been supporting 32 bit samples since version 0.15.  This patch
changes one check, and removes the 32->24 conversion code.

Note that WavPack floating point samples have 32 bits, and MPD doesn't
have a special check for floating point - therefore, this WavPack
plugin still returns 24 bit integer samples as before (until we have
float support in the MPD core).
2009-11-11 21:49:00 +01:00
Max Kellermann
4c6a8e3ca5 decoder/vorbis: initialize before entering the loop
Call decoder_initialize() before entering the loop.  We don't need to
call ov_read() before ov_info().  When the stream number changes,
check if the audio format is still the same.
2009-11-11 21:34:55 +01:00
Max Kellermann
4f38cc9cae decoder/vorbis: moved error strings to vorbis_strerror() 2009-11-11 21:12:10 +01:00
Max Kellermann
dfc09a37c9 decoder/vorbis: removed the OggCallbackData typedef
Use the struct name instead.
2009-11-11 21:09:08 +01:00
Max Kellermann
8588c21689 decoder/vorbis: fix typo in comment 2009-11-11 21:09:08 +01:00
Max Kellermann
2decc65b45 decoder/vorbis: removed redundant "bits" initialization
This is done by audio_format_init().
2009-11-11 21:03:04 +01:00
Max Kellermann
0fb877740b decoder/flac: check "seekable" in libFLAC callbacks
Return FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED if this input
stream does not support seeking.
2009-11-11 21:02:52 +01:00
Max Kellermann
37181c9181 decoder/flac: moved code to flac_data_get_audio_format()
Remove the audio_format attribute, add "frame_size" instead.  The
audio_format initialization and check is moved both to
flac_data_get_audio_format().
2009-11-11 20:44:21 +01:00
Max Kellermann
08b139f37c decoder/flac: use stream_info instead of audio_format
Use the sample rate stored in the stream_info struct instead of the
audio_format struct.
2009-11-11 20:36:53 +01:00
Max Kellermann
3973aeecd2 decoder/flac: use frame header instead of audio_format
When calculating the properties of the frame, use sample_rate and
other information from the frame header instead of the stored
audio_format object.
2009-11-11 20:36:46 +01:00
Max Kellermann
5b2d32b499 decoder/oggflac: moved stream_info check to oggflac_decode() 2009-11-11 20:36:21 +01:00
Max Kellermann
e0d5ee0045 decoder/flac: calculate time stamp from current frame
Don't update a float timestamp, this will make imprecisions add up
after a while.  We already have the number of the current frame, let's
just calculate the float timestamp from that for every decoder_data()
command.  For this, we need to add the attribute "first_frame", for
CUE sheet songs.
2009-11-11 20:18:39 +01:00
Max Kellermann
d35efddd65 decoder/flac: calculate bit rate in flac_common_write()
Removed the "bit_rate" attribute from the flac_data struct.  Pass the
number of bytes since the last call to flac_common_write(), and let
it calculate the bit rate.
2009-11-11 19:52:14 +01:00
Max Kellermann
7b13776f2d decoder/flac: store the whole stream info object, not duration
We don't want to work with floating point values if possible.  Get the
integer number of frames from the FLAC__StreamMetadata_StreamInfo
object, and convert it into a float duration on demand.  This patch
adds a check if the STREAMINFO packet has been received yet.
2009-11-11 19:25:15 +01:00
Max Kellermann
f937ec9a7c decoder/flac: merge code into flac_decoder_initialize()
Wrapper for FLAC__stream_decoder_process_until_end_of_metadata(),
decoder_initialized().
2009-11-11 19:08:10 +01:00
Max Kellermann
a3f5284dc6 decoder/flac: merged code into flac_decoder_new()
Convenience wrapper for FLAC__stream_decoder_new() and
FLAC__stream_decoder_set_metadata_respond().
2009-11-11 19:07:30 +01:00
Max Kellermann
4a8cc87b4d decoder/flac: free the "pathname" variable earlier
Free the pointer right after its last use, i.e. after the
FLAC__stream_decoder_init_file() call.
2009-11-11 19:05:24 +01:00
Max Kellermann
183725733a decoder/flac: emulate FLAC__stream_decoder_init_stream()
Remove the wrapper flac_init().
2009-11-11 18:08:22 +01:00
Max Kellermann
3c1bacbdbc decoder/flac: use the new API functions
Use the type and function names of the libFLAC 1.1.3 API.  Map the new
API to the old one with macros.
2009-11-11 17:59:46 +01:00
Max Kellermann
d5ed23438a decoder/flac: removed the fake flac_ogg_init() fallback
Don't even try to call it with an old libFLAC API.
2009-11-11 17:01:14 +01:00
Max Kellermann
5bbaf0c9f1 decoder/flac: moved code to flac_compat.h 2009-11-11 16:43:34 +01:00
Max Kellermann
f2f8290242 decoder/{flac,vorbis}: include config.h for LFS
Allow those plugins to open large files on 32 bit platforms.
2009-11-11 16:37:42 +01:00
Max Kellermann
c1186693b5 decoder/flac: merged code into flac_decoder_loop()
The decoder loop of flac_decode_internal(), flac_container_decode()
and flac_filedecode_internal() is merged into this one function.  This
unifies the code, and uses the frame number to identify the end of a
CUE sub song.
2009-11-11 16:28:44 +01:00
Max Kellermann
80b220a3a6 decoder/flac: keep track of current frame number
We need this for more exact end-of-subsong detection for CUE files.
2009-11-11 15:31:17 +01:00
Max Kellermann
5cc3c4f503 Merge remote branch 'origin/v0.15.x' 2009-11-11 15:14:20 +01:00
Max Kellermann
96204ea3dc fd_util: don't call fd_set_nonblock() if open() has failed
This fixes an assertion failure.
2009-11-11 14:30:38 +01:00
Max Kellermann
9d1a34e30b added missing config.h includes for extended LFS support
All sources which might work with large files must include config.h,
to get Large File Support on 32 bit platforms.
2009-11-11 14:15:34 +01:00
Max Kellermann
69d9716f8b update: added missing config.h includes
This broke sticker and archive support.
2009-11-11 14:13:24 +01:00
Max Kellermann
707b9fea17 decoder/flac: removed redundant NULL checks
After the decoder loop, "flac_dec" is always set.
2009-11-11 08:37:21 +01:00
Max Kellermann
d605329f83 decoder/flac: moved code to flac_pcm.c 2009-11-11 07:59:22 +01:00
Max Kellermann
f6e7dffada decoder/flac: moved code to flac_metadata.c 2009-11-11 07:50:40 +01:00
Max Kellermann
43549db718 decoder/flac: return replay_gain_info object from helper function
Make the function more generic by not passing "struct flac_data" to
it.
2009-11-11 07:35:16 +01:00
Max Kellermann
7c0c8ca8d7 Merge branch 'master' of git://git.musicpd.org/metyl/mpd 2009-11-11 06:45:23 +01:00
Max Kellermann
884be8e2b3 decoder/flac: merged some code into flac_tag_apply_metadata() 2009-11-11 00:05:14 +01:00
Max Kellermann
305de100a7 decoder/oggflac: initialize the "tag" variable 2009-11-10 23:56:59 +01:00
Viliam Mateicka
79035d7ed9 wave_encoder: new encoder for streaming PCM wave files.
When using wave encoder with httpd audio output mpd can input this stream via http and audiofile decoder.
This for example opens simple way to configure lossless audio streaming port(like jack or pulseaudio does but without overhead).
Another possibility can be using it for gathering raw data for visualization plugins (If sync issue will be resolved)
2009-11-10 22:29:54 +00:00
Max Kellermann
c1a999c492 decoder/flac: don't use float to calculate song duration
Simple (up-rounding) integer division is good enough.  We're casting
the result back to an integer anyway.
2009-11-10 22:03:58 +01:00
Max Kellermann
e51d9fc6a9 decoder/flac: pass VorbisComment to comments_to_tag() 2009-11-10 21:58:19 +01:00
Max Kellermann
2f69831fb8 decoder/flac: use pcm_buffer instead of fixed buffer
This is a great simplification for flac_common_write(), because we can
convert and submit all of the buffer in one turn.  No more partial
buffers with complicated formulas.
2009-11-10 21:46:10 +01:00
Max Kellermann
b6a2ffd3d7 decoder/flac: added function flac_data_deinit()
Clean up tag and replay_gain_info there.
2009-11-10 21:42:15 +01:00
Max Kellermann
6a5f4651a1 test: fixed the read_mixer program on !HAVE_PULSE 2009-11-10 21:38:20 +01:00
Max Kellermann
70106464d3 configure.ac: enable_audiofile defaults to "auto"
Since we're using MPD_AUTO_PKG, we can auto-detect this option.  Also
fix the --enable-audiofile help string.
2009-11-10 21:27:55 +01:00
Max Kellermann
b722d3d7f3 configure.ac: require GLib 2.12
Drop the required GLib version from 2.16 to 2.12, because many current
systems still don't have GLib 2.16.  This requires several new
compatibility functions in glib_compat.h.
2009-11-10 21:14:22 +01:00
Max Kellermann
de57c21a3b Merge branch 'v0.15.x'
Conflicts:
	src/input/lastfm_input_plugin.c
	src/song_save.c
2009-11-10 21:13:03 +01:00
Max Kellermann
84917721c7 moved GLib compatibility code to glib_compat.h 2009-11-10 21:07:54 +01:00
Max Kellermann
118495d372 decoder/flac: pass void pointer to flac_convert()
That function diverts into various bit formats; it doesn't need a
typed pointer.
2009-11-10 19:57:58 +01:00
Max Kellermann
a6bee71f1a decoder/flac: pass audio_format.bits to flac_convert()
Don't use audio_format_sample_size() for identifying the sample
format.
2009-11-10 19:57:28 +01:00
Max Kellermann
e0e6813a1d fd_util: removed creat_cloexec()
Add a "mode" argument to open_cloexec() instead.
2009-11-10 16:53:24 +01:00
Max Kellermann
3d2a9d3545 fd_util: added function pipe_cloexec()
Same as pipe_cloexec_nonblock(), but doesn't set non-blocking mode.
2009-11-10 16:53:20 +01:00
Max Kellermann
6975c087e0 decoder_list: fix decoder_plugin_from_mime_type()
Copy'n'paste error: call decoder_plugin_supports_mime_type() instead
of decoder_plugin_supports_suffix().
2009-11-09 22:49:05 +01:00
Max Kellermann
54033c74e4 output/alsa: fill period buffer with silence before draining
ALSA passes full period buffers to the hardware.  If an application
doesn't finish writing a period, libasound will nonetheless send the
partial buffer (with undefined trailing data).  This causes noise at
the end of playback.  This patch attempts to track the current
position within the period buffer, and generates silence at the end,
before calling snd_pcm_drain().
2009-11-09 22:22:31 +01:00
Max Kellermann
8420f1420f player_thread: drain audio outputs at the end of the playlist
When there's no queued song, and the current one has finished playing,
first make sure that the hardware outputs have really finished playing
the last chunk: call the drain() method in all audio outputs.  Without
this patch, MPD stopped playback shortly before the ALSA sound card
had finished playing.
2009-11-09 22:22:27 +01:00
Max Kellermann
3359f8785e output_thread: added command DRAIN
This command manually drains the hardware buffer.  This is useful when
the player thread want to make sure that everything has been played.
2009-11-09 22:16:26 +01:00
Max Kellermann
96b974bc45 player_control: removed the "volatile" attribute
Our use of the "volatile" keyword was wrong from the start, and now
that we have proper locking, we can safely remove all of them.
2009-11-09 20:33:45 +01:00
Max Kellermann
1a4025420c fd_util: added missing NONBLOCK fallback for socket() 2009-11-08 22:24:02 +01:00
Max Kellermann
223b0db5bd fd_util: relicense under BSD 2-clause
We'll copy this code to libmpdclient, and that's easier if its license
is BSD.
2009-11-08 22:15:22 +01:00
Max Kellermann
2f4144e1cd utils: removed function set_nonblocking()
It's not used anymore, its features have been moved to fd_util.c.
2009-11-08 22:11:37 +01:00
Max Kellermann
f66edccffd fd_util: added O_NONBLOCK functions
Changed the wrappers for pipe(), socket(), accept().  On WIN32, this
does not work for pipe().
2009-11-08 22:11:35 +01:00
Max Kellermann
b043ade456 fd_util: fixed typo in API documentation 2009-11-08 22:07:14 +01:00
Max Kellermann
217b494cc5 encoder/null: removed empty close() method
That's an optional method.
2009-11-08 21:44:01 +01:00
Max Kellermann
5ef62312af encoder/null: removed unused audio_format attribute 2009-11-08 21:43:19 +01:00
Max Kellermann
5479ed7cfb fd_util: added API documentation 2009-11-08 21:38:52 +01:00
Max Kellermann
cac63bfd21 fd_util: unexport fd_set_cloexec()
This function is used only internally.
2009-11-08 21:38:38 +01:00
Max Kellermann
1573ea1485 inotify: set close-on-exec flag
Added wrapper for inotify_init1() to fd_util.c.
2009-11-07 19:02:53 +01:00
Max Kellermann
e3af0032b2 set the close-on-exec flag on all file descriptors
Added the "fd_util" library, which attempts to use the new thread-safe
Linux system calls pipe2(), accept4() and the options O_CLOEXEC,
SOCK_CLOEXEC.  Without these, it falls back to FD_CLOEXEC, which is
not thread safe.

This is particularly important for the "pipe" output plugin (and
others, such as JACK/PulseAudio), because we were heavily leaking file
descriptors to child processes.
2009-11-07 18:55:16 +01:00
Max Kellermann
9b21152600 decoder_thread: close input file
An input_stream_close() call was missing after today's code
reorganization.
2009-11-07 17:58:52 +01:00
Max Kellermann
c440faa94d log: redirect stdout/stderr to /dev/null if syslog is used
Don't hold a file descriptor on root's tty when syslog is used for
logging.
2009-11-07 17:48:57 +01:00
Max Kellermann
375fd5ed4c output/jack: added option "server_name" 2009-11-07 17:26:21 +01:00
Max Kellermann
ec25cda68b output_all: automatically attempt to re-enable failed outputs
When an output's enable() method has failed, and playback starts,
retry to enable it.  Without this, the user may be confused, because
he sees the device is "enabled" but cannot use it, and currently there
is no error message in the log.
2009-11-07 17:22:34 +01:00
Max Kellermann
c9f726048c output/httpd: moved code to httpd_output_bind() 2009-11-07 16:52:44 +01:00
Max Kellermann
c2251dc5a2 exclude: use GPatternSpec instead of fnmatch()
GLib's version of fnmatch() is more portable.
2009-11-07 16:29:29 +01:00
Max Kellermann
a505cbc6c9 added missing source file decoder_print.c 2009-11-07 16:28:21 +01:00
Max Kellermann
c422344190 database: I/O error handling in db_save()
Check ferror() instead of the fprintf() return value.
2009-11-07 16:20:07 +01:00
Max Kellermann
1a4cfc3d90 update_walk: log new container files 2009-11-07 16:03:25 +01:00
Max Kellermann
2f1bd39be8 command: added command "decoders"
This command prints a list of decoder plugins and their suffixes /
MIME types.
2009-11-07 15:57:22 +01:00
Max Kellermann
4624dfcb30 decoder_list: moved print_all_decoders() to cmdline.c
Export the decoder_plugins array.  The function
decoder_plugin_print_all_decoders() it is UI specific and should not
live in this backend library.
2009-11-07 15:46:45 +01:00
Max Kellermann
3546d931a1 decoder_thread: check for STOP before calling the plugin
Before calling the plugin's decode method, we should ensure that we
didn't receive a STOP command during initialization.
2009-11-07 15:37:18 +01:00
Max Kellermann
4dadb965a7 decoder_thread: moved code to decoder_input_stream_open()
This function opens the stream and waits for it to become ready;
meanwhile it checks for STOP commands.  It is code moved from
decoder_run_stream().
2009-11-07 15:35:50 +01:00
Max Kellermann
f2184db1cd decoder_thread: added local variable "dc" in decoder_run_file()
Simplify the expressions.
2009-11-07 15:24:38 +01:00
Max Kellermann
41f3f12709 output/jack: free source port names on exit
Make valgrind happy.
2009-11-07 15:17:48 +01:00
Max Kellermann
5d55b45654 decoder_list: pass previous plugin pointer to lookup functions
Remove the static integer hack, that's not thread safe and sucks.
2009-11-07 15:14:16 +01:00
Max Kellermann
e3da174fca decoder_list: moved suffix/mime_type checks to decoder_plugin.c 2009-11-07 15:14:11 +01:00
Max Kellermann
bb862a8ceb decoder_list: back to NULL terminated list
A NULL terminated list is easier to iterate.
2009-11-07 15:14:09 +01:00
Max Kellermann
9ba900486e decoder_thread: open input stream on demand
Moved the global input stream opener to decoder_run_stream().
decoder_run_file() now opens the input stream each time a plugin
provides a stream decoder method.
2009-11-07 15:10:12 +01:00
Max Kellermann
587284bae6 decoder_thread: moved plugin loops to separate functions
Tame the large decoder_run_song() function.
2009-11-07 14:57:46 +01:00
Max Kellermann
4c7bfa514f uri: added function attributes
Let gcc optimize a little bit more.
2009-11-07 14:17:28 +01:00
Max Kellermann
f9218423b9 utils: renamed stringFoundInStringArray()
No CamelCase.  Use bool instead of int.  Make both arguments
mandatory.
2009-11-06 19:50:47 +01:00
Max Kellermann
ba34d48cf0 output/jack: dynamic source port list
Same as the previous patch: create up to 16 configured source ports.
The plugin tries to do its best at guessing the right combination for
the given input file, the number of source and destination ports.
2009-11-06 18:58:35 +01:00
Max Kellermann
2598dd5109 output/jack: dynamic destination port list
Support up to 16 configured destination ports, that should really be
enough for everybody.
2009-11-06 18:55:26 +01:00
Max Kellermann
fac6e9ecdb output/jack: renamed option "ports" to "destination_ports"
Be more clear which kind of port should be configured here.
2009-11-06 01:54:58 +01:00
Max Kellermann
dbbead6e72 output/jack: renamed "output ports" to "destination ports"
Use the same name as in the libjack API documentation.
2009-11-06 01:35:19 +01:00
Max Kellermann
8cb9f9b070 playlist_queue: use playlist plugins to load from playlist_directory
This patch allows the client to load a playlist file from the playlist
directory with a plugin.  This can be used with the "load" command,
but the client has to pass the file name including the suffix.  We
will probably use the music directory in the future, to support
playlist files inside the music directory.
2009-11-06 01:09:21 +01:00
Max Kellermann
61cb5df842 playlist_queue: moved code to playlist_open_remote_into_queue() 2009-11-06 01:07:42 +01:00
Max Kellermann
7e66f34154 playlist_list: added function playlist_list_open_path()
Added an interface for loading playlists from a local file.
2009-11-06 01:07:39 +01:00
Max Kellermann
f3203b5de5 playlist: added extm3u plugin
This new plugin parses extm3u files.  Files without the "#EXTM3U"
header are still parsed by the plain old "m3u" plugin.
2009-11-06 00:41:42 +01:00
Max Kellermann
65e56ff829 playlist/{m3u,pls}: removed URI checks
The caller is responsible for verifying the song URI.
2009-11-06 00:36:32 +01:00
Max Kellermann
a4970c66ef playlist_list: rewind the stream before opening the playlist
If one plugin has failed to open the playlist, it may have consumed a
part of the stream already.  This may lead to a failure in all
following plugins.  Fix: rewind the stream before each open() call.
2009-11-06 00:11:36 +01:00
Max Kellermann
945287358b output/httpd: bind port when output is enabled
Implement the methods enable() and disable().  Bind the HTTP port in
the enable() method, but reject all incoming connections until the
output is opened.
2009-11-05 23:47:29 +01:00
Max Kellermann
979cd5a768 output/jack: support mono input
When MPD plays a mono song (audio_format.channel==1), connect only one
source port to both destination ports.
2009-11-05 20:02:04 +01:00
Max Kellermann
a68da8a475 output/jack: clear ring buffers before activating
After playback has stopped, the ring buffers may still contain
samples.  These will be played when playback is started the next
time.  We should clear the buffers each time.
2009-11-05 20:01:50 +01:00
Max Kellermann
2a9685cb3a output/jack: use jack_client_open() instead of jack_client_new()
jack_client_new() is deprecated.  This requires libjack 0.100
(released nearly 5 years ago).  We havn't been testing older libjack
versions anyway.

As a side effect, there is the new option "autostart".
2009-11-05 20:01:18 +01:00
Max Kellermann
9449006ac3 doc/user: document JACK plugin options 2009-11-05 19:55:16 +01:00
Max Kellermann
88abfc0d0f output/jack: added option "client_name"
Instead of using MPD's audio output name (setting "name"), use a
separate configuration option.  Change the default to "Music Player
Daemon".
2009-11-05 19:55:00 +01:00
Max Kellermann
4ec25b5d64 update_walk: log unrecognized files
When a song's tags could not be loaded during database update, log
this as a debug message.  Same for a song being removed because its
updated tag could not be read.
2009-11-05 08:01:29 +01:00
Max Kellermann
e96dc9a14c database: rescan after metadata_to_use change
Store a list of supported tag items in the database.  When loading a
database which does not have a matching list, we must rescan in order
to get the missing information.
2009-11-04 18:48:22 +01:00
Max Kellermann
a434c35eb4 tag: added function tag_name_parse()
Convert a string into a tag_type enum.
2009-11-04 18:47:42 +01:00
Max Kellermann
7af8c88e37 song_save: explicitly parse the colon
Clear the colon.  This simplifies all attribute parsers, because they
can now use strcmp() instead of strncmp().
2009-11-04 18:43:16 +01:00
Max Kellermann
a027bdf118 decoder_thread: initialize decoder_control.quit
If left uninitialized, then the decoder thread quits spuriously.
2009-11-04 09:44:50 +01:00
Max Kellermann
c043bf0f63 Merge branch 'master' of git://git.musicpd.org/romain/mpd 2009-11-04 09:20:13 +01:00
Romain Bignon
5744634094 sticker comments in code and example configuration file
Signed-off-by: Romain Bignon <romain@peerfuse.org>
2009-11-04 00:21:58 +01:00
Max Kellermann
a22c93b659 player_thread: on return, reset next_song only if queued
If no song was queued, then player_control.next_song might contain the
value for the next QUEUE command.  We must not reset that.
2009-11-03 23:32:37 +01:00
Max Kellermann
507606bb78 player_thread: detect finished queued song
When the decoder finishes the "queued" song very quickly (before the
"current" song finishes playing), an assertion in do_play() fails
because it thinks that it should start decoding the queued song,
although that has in fact just finished.
2009-11-03 23:29:50 +01:00
Max Kellermann
f421c8a191 player_control: moved pc.next_song assertion into lock
The assertion shouldn't access player_control.next_song without
locking it.
2009-11-03 23:17:44 +01:00
Max Kellermann
d06f8baf69 player_thread: moved code to decoding_next_song()
Simplify several expressions.
2009-11-03 22:27:40 +01:00
Max Kellermann
56b8081af6 player_thread: lock player in player_check_decoder_startup()
Don't access attributes without the lock.
2009-11-03 21:23:48 +01:00
Max Kellermann
98d30ac9cf decoder_control: pass pipe and buffer to dc_start()
Don't access decoder_control attributes directly.
2009-11-03 21:18:22 +01:00
Max Kellermann
98150f503a player_thread: lock inside player_wait_for_decoder()
Lock the player_control object when modifying its attributes.
2009-11-03 21:02:54 +01:00
Max Kellermann
6c78c21fb8 player_thread: moved code to player_dc_start() 2009-11-03 21:01:56 +01:00
Max Kellermann
7fd2097a44 decoder_control: don't check command in decoder_is_starting()
Asynchronous decoder startup is gone, and we don't need to check
command==DECODE_COMMAND_START anymore.
2009-11-03 21:01:49 +01:00
Max Kellermann
89893faa19 decoder_control: merge next_song and current_song
These two variables are redundant, we need only one of them.
2009-11-03 20:02:19 +01:00
Max Kellermann
bfa7da943c player_thread: don't set errored_song on audio error
It's not used if pc.error==PLAYER_ERROR_AUDIO.
2009-11-03 20:01:19 +01:00
Max Kellermann
734676fcfb decoder_thread: unlock the decoder while checking the stream
This is only a slight change to the previous locking behaviour: keep
the decoder unlocked during the loop, and lock it only while checking
decoder_control.command.
2009-11-03 19:21:55 +01:00
Max Kellermann
acb265d082 player_thread: don't start the decoder asynchronously
The START command returns without blocking; we don't need the
asynchronous decoder start anymore.
2009-11-03 19:18:17 +01:00
Max Kellermann
77a647fc26 decoder_thread: open input stream after command finished
Return the result to the caller more quickly.  This unifies error
handling: no error can be reported before the command is finished.
2009-11-03 19:17:52 +01:00
Max Kellermann
59ffb5b7c1 decoder_control: make the song objects const
They are just informational.
2009-11-03 19:16:25 +01:00
Jeffrey Middleton
4dc25d3908 alsa_plugin.c: workaround snd_pcm_drain bug
Reintroduce a fix from commit 52a0653 (Warren Dukes): "don't call
snd_pcm_drain unless we're already in the RUNNING state". This prevents
ALSA with dmix from sometimes hanging when snd_pcm_drain is called, e.g.
when moving from one song to the next (as in mantis issue 2634).
2009-11-02 23:58:15 -06:00
Max Kellermann
0f9f82f227 output_thread: moved code to ao_next_chunk() 2009-11-02 20:20:14 +01:00
Max Kellermann
55e3aa8179 output_thread: return from ao_play() if chunk->next is NULL
When the "next" chunk to be played is NULL, return from ao_play()
immediately, without going over the "while" loop (no-op).
2009-11-02 20:20:14 +01:00
Max Kellermann
408d52fe39 player_thread: check command before waiting during pause
While paused, the player thread re-locks its mutex and waits for a
signal.  This is racy: when the command is set while the thread is
waiting for the lock, it may wait forever.  This patch adds another
command check before player_wait().
2009-11-02 20:20:13 +01:00
Max Kellermann
b9013944dc output: signal the output thread when CANCEL is finished
After CANCEL, the output thread waits for another signal before it
continues playback, to synchronize with the caller.  There were some
situations where this signal wasn't sent properly.  This patch adds an
explicit g_cond_signal() at two code positions.
2009-11-02 19:09:25 +01:00
Max Kellermann
e814f8d5bd update: removed unused variable "update_notify"
That variable has been superseded by "remove_notify" (defined in
update_remove.c).
2009-11-02 17:22:41 +01:00
Max Kellermann
64a481d873 {decoder,player}_control: removed duplicate wakeups
Don't wake up the target thread in every iteration of the wait() loop.
Waking it up once, right after the command has been set, must be
enough.
2009-11-02 17:12:00 +01:00
Max Kellermann
93d8f9f00e player_control: lock player before setting seek parameters
These parameters must be protected with a mutex, too.  Wrap everything
inside player_lock()/player_unlock(), and use player_command_locked()
instead of player_command().
2009-11-02 17:02:05 +01:00
Max Kellermann
d1742a2330 output_thread: check command before g_cond_wait()
After CANCEL, call g_cond_wait() only if the new command is still
NONE.  Problem is that ao_command_finished() has to unlock the
audio_output object, and in the meantime, the player thread might have
submitted a new command.
2009-11-02 17:01:17 +01:00
Max Kellermann
5555d30bbd song_save: free song object on error
Fix a minor memory leak.
2009-11-01 17:51:32 +01:00
Max Kellermann
4b17aca747 song_save: load one song at a time
Changed songvec_load() to song_load().  Added start and end markers
for each song.  Removed the "key" line, it's redundant.
2009-11-01 17:51:29 +01:00
Max Kellermann
63dda94a02 database: save database format version 2009-11-01 17:50:01 +01:00
Max Kellermann
7f9ee00980 directory_save: partially revert the g_str_has_prefix() patch 2009-11-01 17:49:49 +01:00
Max Kellermann
53a749780a database: use strcmp() instead of g_str_has_prefix() 2009-11-01 15:54:06 +01:00
Max Kellermann
c504004702 database: removed redundant music_root allocation
The "music_root" global variable is allocated by db_init().
2009-11-01 15:51:19 +01:00
Max Kellermann
8bfe3497b0 replay_gain: trigger OPTIONS idle event on mode change 2009-11-01 15:44:56 +01:00
Max Kellermann
9bcfd3a47d text_file: allocate line buffers dynamically
Use a single GString buffer object in all functions loading the
database.  Enlarge it automatically for long lines.  This eliminates
the maximum line length for tag values.  There is still an upper limit
of 512 kB to prevent denial of service, but that's reasonable I guess.
2009-11-01 15:37:16 +01:00
Max Kellermann
451f932d80 directory_save: allocate directory object earlier, assign mtime
Allocate the directory object after the "directory:" line.  Assign the
mtime from the input file to this new object, instead of to the parent
directory.
2009-11-01 15:34:14 +01:00
Max Kellermann
10b7608926 directory_save: free directory on error
Fix a minor memory leak in the error handler.
2009-11-01 15:34:13 +01:00
Max Kellermann
2cd8a9fecf directory_save: abort on duplicate subdirectory
The old code tried to recover, but what's the point of that?  If a
directory is duplicate, something is wrong with the database file.
2009-11-01 15:34:13 +01:00
Max Kellermann
22279127f9 directory_save: moved code to directory_load_subdir() 2009-11-01 15:34:12 +01:00
Max Kellermann
ad01e1249b decoder_api: check decoder==NULL in decoder_read()
It's legal to pass decoder=NULL to decoder_read().  Add a check.
2009-11-01 15:34:12 +01:00
Max Kellermann
6ef428af2e decoder_control: removed the global variable "dc"
Allocate a decoder_control object where needed, and pass it around.
This will allow more than one decoder thread one day.
2009-10-31 19:22:56 +01:00
Max Kellermann
806496dfc9 Merge branch 'v0.15.x'
Conflicts:
	NEWS
	configure.ac
	src/decoder/ffmpeg_plugin.c
	src/update.c
2009-10-31 18:23:56 +01:00
Max Kellermann
9eadb517da player_thread: simplified thread destruction
Simply use "return" instead of g_thread_exit().
2009-10-31 18:01:05 +01:00
Max Kellermann
1ae4e4dcd3 songvec: sort songs by album name first, then disc/track number
When the songs of two albums are in the same directory, all songs of
an album should be right next to each others.
2009-10-31 17:36:56 +01:00
Max Kellermann
d099a7e464 songvec: simplified compare_tag_item()
Moved some code to tag_get_value_checked(), to eliminate several NULL
checks.
2009-10-31 17:32:00 +01:00
Max Kellermann
25a806a347 player_control: protect command, state, error with a mutex
Use GMutex/GCond instead of the notify library.  Manually lock the
player_control object before accessing the protected attributes.  Use
the GCond object to notify the player thread and the main thread.
2009-10-31 17:02:12 +01:00
Max Kellermann
73cff374fd {player,output}_thread: fixed elapsed_time quirks
Right after seeking and song change, the elapsed_time shows old
information, because the output thread didn't finish a full chunk
yet.  This patch re-adds a second elapsed_time variable, and keeps
track of a fallback value, in case the output thread can't provide a
reliable value.
2009-10-30 16:28:15 +01:00
Max Kellermann
cec019efff output_thread: return bool from ao_play()
Return false when there was no chunk in the pipe.  If the function
returns true, then audio_output_task() will not wait for a notify from
the player thread.  This fixes a race condition.
2009-10-29 23:35:27 +01:00
Max Kellermann
4748decd8d player_thread: set error status in play_next_chunk()
Don't set the error in play_chunk(); do all the error handling in the
caller.  The errored_song attribute isn't set anymore; it doesn't make
sense for PLAYER_ERROR_AUDIO.
2009-10-29 22:39:48 +01:00
Max Kellermann
975143ab47 output_control: fixed deadlock in audio_output_update()
Call a version of audio_output_close() which doesn't lock recursively.
2009-10-29 22:39:42 +01:00
Viliam Mateicka
bb5acc939f httpd: add config option to limit number of clients 2009-10-29 22:38:18 +01:00
Max Kellermann
bde3d14339 output: consistently lock audio output objects
Always keep the audio_output object locked within the output thread,
unless a plugin method is called.  This fixes several race conditions.
2009-10-29 17:06:40 +01:00
Max Kellermann
1403172ef3 output_plugin: added method "drain"
drain() is the opposite of cancel(): it waits until all data in the
buffer has finished playing.  Instead of implicitly draining in the
close() method like the ALSA plugin has been doing it forever, let the
output thread decide whether to drain or to cancel.
2009-10-29 15:59:40 +01:00
Max Kellermann
f74ee1a352 output/alsa: don't recover on CANCEL
The recovery is for nothing if we get CLOSE afterwards.  Let's not
recover in the cancel() method, and let the next play() call sort it
out.
2009-10-29 15:59:35 +01:00
Max Kellermann
cf8d278b78 output_thread: removed redundant filter_close() call
Don't call filter_close() right after ao_close().
2009-10-29 15:58:21 +01:00
Max Kellermann
82af161210 output/pulse: initialize pulse_output.mixer
This variable was uninitialized and led to crashes.
2009-10-29 15:58:18 +01:00
Max Kellermann
9fed97b1f1 decoder/ffmpeg: removed the "author" vs "artist" workaround
libavformat gives us the song artist in the "author" field.  Since we
use av_metadata_conv(), we don't need to check for "artist".
2009-10-28 22:17:10 +01:00
Alam Arias
83a9cf74fb include pulse/version.h for PA_CHECK_VERSION 2009-10-27 07:46:53 +01:00
Viliam Mateicka
a13e9832e7 encoder: renaming none_encoder to null_encoder 2009-10-26 20:02:34 +01:00
Viliam Mateicka
f67426871b mpd.conf: new bool config value for enabling/disabling inotify update 2009-10-26 19:14:40 +01:00
Viliam Mateicka
2bfddd4310 encoder: new encoder plugin which just pass data through 2009-10-24 19:01:15 +02:00
Viliam Mateicka
7b343eaf50 add --disable-inotify for configure to disable inotify when autodetected 2009-10-24 18:24:29 +02:00
Max Kellermann
ac830468bf output/jack: implement methods enable()/disable()
Don't connect to JACK before MPD has daemonized.
2009-10-23 10:56:25 +02:00
Max Kellermann
7547b1170b output/pulse: implement methods enable()/disable()
Don't connect to PulseAudio before MPD has daemonized.
2009-10-23 10:56:16 +02:00
Max Kellermann
e53ca368a5 output_plugin: added methods enable() and disable()
With these methods, an output plugin can allocate some global
resources only if it is actually enabled.  The method enable() is
called after daemonization, which allows for more sophisticated
resource allocation during that method.
2009-10-23 10:55:52 +02:00
Max Kellermann
c426a0bc5c output/pulse: call mixer on state changes
Don't let the mixer plugin "override" the libpulse callbacks.
Instead, add a "mixer" attribute to the pulse_output struct, and call
the mixer on all interesting events.
2009-10-23 10:33:26 +02:00
Max Kellermann
acc99da73d mixer_control: don't close the mixer if set_volume() fails
A mixer is useful enough if it can be read.  Setting it may be
found unavailable at runtime.
2009-10-23 10:33:23 +02:00
Max Kellermann
c4f895daf4 mixer_plugin: get_volume() may return -1 if unavailable
If the method get_volume() returns -1 and no error object is set, then
the volume is currently unavailable, but the mixer should not be
closed immediately.
2009-10-23 10:32:25 +02:00
Max Kellermann
ede828c910 mixer_control: allow methods "open" and "close" to be NULL
It's possible to have a mixer implementation which does not explicitly
need the methods open() and close().
2009-10-23 09:15:51 +02:00
Max Kellermann
7dd172efec mixer/pulse: don't get volume if stream is not yet ready
Moved the check from pulse_mixer_open() to pulse_mixer_update().
2009-10-22 20:28:12 +02:00
Max Kellermann
80ac82c8fb output/fifo: renamed source to fifo_output_plugin.c 2009-10-22 19:23:30 +02:00
Max Kellermann
fd182f6d1e Makefile.am: enable the "subdir-objects" option
Don't clutter the top directory with *.o files.
2009-10-22 18:23:22 +02:00
Max Kellermann
a05d0d5d94 audio: removed function finishAudioConfig()
There's no point in clearing the audio format before exiting.
2009-10-22 17:12:32 +02:00
Max Kellermann
0107ef2aad main: put #ifdef inside winsock_init()
This way, the function call in the main() function does not need
another pair of #ifdef/#endif.
2009-10-22 17:12:28 +02:00
SF Markus Elfring
a153f21315 permission: improve const-correctness 2009-10-22 17:11:39 +02:00
Max Kellermann
294aaf7a90 playlist: new ASX playlist plugin
Based on the XSPF playlist plugin.
2009-10-21 23:39:47 +02:00
Max Kellermann
2024763d2a playlist/xspf: ignore text in root, playlist, tracklist
Added a missing "break".
2009-10-21 23:27:05 +02:00
Max Kellermann
9526fdbe73 audio_format: wildcards allowed in audio_format configuration
An asterisk means that this attribute should not be enforced, and
stays whatever it used to be.  This way, some configuration values
work like masks.
2009-10-21 23:01:04 +02:00
Max Kellermann
a5c4566fa1 audio_parser: moved code to separate functions 2009-10-21 23:01:03 +02:00
Max Kellermann
2c05430002 output: convert config_audio_format to an audio_format struct
This allows more sophisticated audio format selection.
2009-10-21 22:37:28 +02:00
Max Kellermann
643650dba7 audio_parser: renamed parameter "error" to "error_r"
It's a double pointer.
2009-10-21 22:22:23 +02:00
Max Kellermann
8cb6854da4 audio: removed config_param.value NULL check
The value is always non-NULL.
2009-10-21 22:22:20 +02:00
Max Kellermann
83844ec239 output/jack: make ringbuffer_size a size_t 2009-10-21 21:39:26 +02:00
Max Kellermann
1bfd25be35 output/jack: connect to server on MPD startup
.. and keep up the JACK connection while MPD runs.  Allocate the ring
buffers on the first open, and free them at MPD exit.
2009-10-21 21:37:11 +02:00
Max Kellermann
cee216f2dc output/jack: removed the empty "cancel" method
JACK doesn't need cancel() because it won't do much anyway.  Buffers
are small.
2009-10-21 21:01:00 +02:00
Max Kellermann
27c246e8d9 output/jack: renamed parameter "error" to "error_r"
It's a double pointer.
2009-10-21 20:13:39 +02:00
Max Kellermann
1ff39476eb output/jack: implement the "pause" method
Don't disconnect from JACK during pause.
2009-10-21 18:33:05 +02:00
Max Kellermann
acfd9a73bc output/jack: renamed source to jack_output_plugin.c 2009-10-21 18:33:01 +02:00
Max Kellermann
b479a264b6 pulse: code rewrite using the asynchronous libpulse API
This is a complete rewrite of the PulseAudio output plugin.  It uses
the asynchronous API, which gives us more control over everything.
Additionally, it connects to the PulseAudio server on startup, and
keeps this connection up while MPD runs.  During pause, instead of
closing the stream, it enables "cork".
2009-10-21 10:30:42 +02:00
Max Kellermann
ac32f36e4e mixer_plugin: pass audio_output pointer to mixer_plugin.init()
This allows the mixer object to access its associated audio output
object.
2009-10-21 09:48:41 +02:00
Max Kellermann
b8ccc885c8 volume: added PIPE_EVENT_MIXER
Flush the hardware volume cache, and send the MIXER idle event.  This
allows mixer plugins to detect volume changes.
2009-10-21 09:48:37 +02:00
Max Kellermann
4e2fb3fb89 mixer_plugin: use GError for error handling 2009-10-20 22:10:56 +02:00
Max Kellermann
9cd2129eeb output_init: renamed parameter "error" to "error_r"
It's a double pointer.
2009-10-20 21:26:28 +02:00
Max Kellermann
097e200a97 mixer/{oss,alsa}: renamed the mixer source files 2009-10-20 21:23:05 +02:00
Max Kellermann
bd28caed3c output/pulse: renamed context to "Music Player Daemon"
This looks nicer in the PulseAudio manager than just "mpd".
2009-10-20 21:07:38 +02:00
Max Kellermann
bc4266bef8 pulse: renamed source files 2009-10-20 21:05:11 +02:00
Max Kellermann
bc629c8a3e pulse: announce "media.role=music"
This allows PulseAudio to do some advanced tweaks.
2009-10-20 21:02:10 +02:00
Max Kellermann
2e9e34aa40 main: call g_set_application_name()
I'm not sure about the advantages of calling g_set_application_name(),
because I don't use a task manager (except for ps and kill), but it
sure doesn't hurt.
2009-10-20 21:02:00 +02:00
Max Kellermann
c953d6409d mapper, update, ...: use g_build_filename(), G_DIR_SEPARATOR, ...
Try to be as portable as possible, use GLib path name functions and
macros.
2009-10-20 21:01:55 +02:00
Max Kellermann
447e4d3583 Merged release 0.15.5 from branch 'v0.15.x'
Conflicts:
	NEWS
	configure.ac
	src/decoder/flac_plugin.c
	src/update.c
2009-10-18 19:02:43 +02:00
Serge Ziryukin
33bf6c0978 decoder/vorbis: avoid unused symbol warnings from vorbisfile.h
svn r13289 of libvorbis introduced static callbacks (like OV_CALLBACKS_DEFAULT)
defined in "vorbisfile.h" header. First released version with this change is libvorbis-1.2.2.
In libversion-1.2.3 OV_EXCLUDE_STATIC_CALLBACKS define was added to avoid
warnings about unused static callbacks. Information on the OV_EXCLUDE_STATIC_CALLBACKS
can be found in http://svn.xiph.org/trunk/vorbis/CHANGES.
2009-10-18 18:35:02 +02:00
Max Kellermann
d69e0ab53a command: omitting the range end is possible
When the range end is missing, then the maximum possible value is
assumed.
2009-10-18 01:24:49 +02:00
Max Kellermann
e7c267db4f command: use GLib limit macros in check_range()
These are portable and don't require limits.h.
2009-10-18 01:24:45 +02:00
Max Kellermann
6a5e7c118b doc/protocol.xml: documented range parameter in "delete" 2009-10-18 01:24:22 +02:00
Max Kellermann
bddb6b4273 command: allow changing replay gain mode on-the-fly
The new command "replay_gain_mode" allows the user to switch the
replay gain mode on-the-fly.  No more mpd.conf editing.
2009-10-17 22:58:19 +02:00
Max Kellermann
7ec32704f9 replay_gain: moved mode parser to replay_gain_set_mode_string() 2009-10-17 22:40:50 +02:00
Max Kellermann
8d217567c6 replay_gain: added setting "replaygain off"
There was no setting for disabling replay gain.  It was off when the
"replaygain" setting was not there.
2009-10-17 21:38:45 +02:00
Max Kellermann
a17d814381 replay_gain: read configuration even when replay gain is disabled
It will be possible to enable replay gain at runtime even when it is
disabled in the configuration file.  This patch enables the preamp
settings in this case.
2009-10-17 21:38:32 +02:00
Max Kellermann
5554633ab8 update: obey .mpdignore files 2009-10-16 18:11:43 +02:00
Max Kellermann
8cd845b79e doc/user.xml: added chapter "Using MPD" 2009-10-16 18:10:36 +02:00
Max Kellermann
06da91a73b doc/user.xml: added playlist plugin reference 2009-10-16 17:51:33 +02:00
A. Klitzing
792010ba32 notify_queue: use g_timeout_add_seconds() 2009-10-15 21:22:39 +02:00
Max Kellermann
b69246c646 player_thread: don't call audio_output_all_check() if paused
When the audio output fails to open, MPD pauses playback, but doesn't
reset player.play_audio_format.  This leads to an assertion failure in
audio_output_all_check() on the next REFRESH command, because no audio
output is open.
2009-10-15 20:47:00 +02:00
Qball Cow
f4ea9b7393 Add PLS Parser 2009-10-15 00:08:06 +02:00
Max Kellermann
1ff101c568 input/lastfm: removed obsolete last.fm input plugin
This has been replaced by the last.fm playlist plugin.  The input
plugin has never worked well, and was just a playground to experiment
with the last.fm radio protocol.
2009-10-13 19:43:56 +02:00
Max Kellermann
a93ffdd1be command: "load" supports remote playlists (m3u, xspf, lastfm://)
This patch integrates the playlist plugin API to the MPD core.  We'll
be able to do much more in the future with that API, that's just the
beginning.
2009-10-13 18:53:33 +02:00
Max Kellermann
319149254d main: initialize playlist plugins 2009-10-13 18:01:11 +02:00
Max Kellermann
f7ce4f6239 song: renamed attribute "url" to "uri" 2009-10-13 18:01:06 +02:00
Max Kellermann
28442cce9f queue: no CamelCase
Renamed idToPosition.
2009-10-13 16:43:06 +02:00
Max Kellermann
f122e6d456 playlist: added plugin for last.fm radio
This plugin will replace the last.fm input plugin, once the playlist
API is integrated into MPD.
2009-10-13 16:32:10 +02:00
Max Kellermann
8391ac4cc8 playlist: added XSPF plugin 2009-10-13 16:31:07 +02:00
Max Kellermann
898d885ae2 test/dump_playlist: try playlist_list_open_uri() first 2009-10-13 16:25:37 +02:00
Max Kellermann
a61d0c9567 Merge branch 'v0.15.x' 2009-10-13 16:25:17 +02:00
Max Kellermann
eea4edd92c test/dump_playlist: parse a configuration file 2009-10-13 16:20:21 +02:00
Max Kellermann
cb331ae436 playlist_list: pass configuration to playlist plugins
This patch completes the configuration support.
2009-10-13 16:19:21 +02:00
Max Kellermann
767e27c8f0 playlist/m3u: added plugin name 2009-10-13 16:13:36 +02:00
Max Kellermann
e78370e050 playlist_list: initialize the "playlist" variable
Prevent access on uninitialized variable if the plugin list is empty.
2009-10-13 16:13:33 +02:00
Max Kellermann
ea616b3ed4 tag: removed the "_ITEM_" suffix from the enum names 2009-10-13 16:12:45 +02:00
Max Kellermann
a9dc0e816c state_file: use g_timeout_add_seconds() 2009-10-13 16:12:44 +02:00
Max Kellermann
4390d72b14 configure.ac: require GLib 2.16
Accidently, MPD has been using several GLib 2.16 functions for a
while, and nobody noticed yet.  To simplify the code base, let's bump
the minimum GLib version for MPD to 2.16.  That version is old enough,
and it's reasonable to expect users to have it.
2009-10-13 16:12:43 +02:00
Max Kellermann
2bf740fc71 playlist_plugin: new plugin API for playlist parsers
Based on this API, we will add parsers for EXTM3U, PLS, ASX, last.fm
radio and others.

There is no integration into the MPD core yet.  Right now, we have a
command line test program.  This is work in progress.
2009-10-12 22:34:04 +02:00
Max Kellermann
dbb1e732b8 text_input_stream: input_stream wrapper for reading text files 2009-10-12 22:30:59 +02:00
Max Kellermann
7ec503c4ec song: moved code to song_update.c
Moved all the code which depends on the decoder plugins to a separate
source.  That allows leaner test programs.
2009-10-12 22:30:50 +02:00
Max Kellermann
a07ab27dae decoder_thread: removed redundant NULL assignments
The while() clause resets the "plugin" variable.  We don't need to
reset it at the end of the loop body.
2009-10-11 23:44:21 +02:00
Max Kellermann
727c301fbc input_stream: use "goffset" instead of "off_t"
The "off_t" type may change when you enable or disable large file
support on 32 bit platforms.  This caused severe ABI problems within
MPD when we enabled LFS for the first time: two sources included
config.h and sys/types.h in different order, and had different off_t
sizes - leading to memory corruption because of ABI incompatibility.
This patch attempts to get rid of all public "off_t" uses: it removes
"off_t" from the input_stream ABI/API, and switches to GLib's 64 bit
"goffset" type.  This may hurt 32 bit embedded platforms a tiny bit,
but that's not even measurable.
2009-10-11 23:32:22 +02:00
Max Kellermann
71f881d5cb Merge branch 'v0.15.x'
Conflicts:

	NEWS
	configure.ac
2009-10-11 23:25:27 +02:00
Avuton Olrich
d4e3fb4330 configure: Fix up the recorder plugin configure. 2009-10-10 11:36:22 -07:00
Max Kellermann
57f69a2915 doc/protocol.xml: "addid" with negative position is deprecated 2009-10-09 10:18:02 +02:00
Max Kellermann
448aefaace player_thread: get "elapsed" from audio outputs
Tracking the "elapsed" time from the chunks which we have sent to the
output pipe is very imprecise: since we have implemented the music
pipe, we're sending large number of chunks at once, giving the
"elapsed" time stamp a resolution of usually more than a second.

This patch changes the source of this information to the outputs.  If
a chunk has been played by all outputs, the "elapsed" time stamp is
updated.

The new command PLAYER_COMMAND_REFRESH makes the player thread update
its status information: it tells the outputs to update the chunk time
stamp.  After that, player_control.elapsed_time is current.
2009-10-08 22:09:25 +02:00
Max Kellermann
47b5e73a15 player_thread: always clear player_control.next_song on return
pc.next_song might be non-NULL even if player.queued==true: when the
decoder has started decoding the next song, but the result hasn't been
read yet.
2009-10-08 22:09:25 +02:00
Max Kellermann
d6a6f428b3 player_control: eliminate PLAYER_COMMAND_PLAY
Sending PLAYER_COMMAND_STOP followed by PLAYER_COMMAND_QUEUE does the
same.  PLAYER_COMMAND_PLAY is redundant.
2009-10-08 21:22:31 +02:00
Max Kellermann
fd3934b849 player_control: added several assertions on pc.next_song==NULL
After some of the commands, the player thread must have reset the
pc.next_song attribute.
2009-10-08 21:17:00 +02:00
Max Kellermann
e5857cb722 player_control: no CamelCase 2009-10-08 21:12:57 +02:00
Max Kellermann
2ec89c6304 player_control: clear errored_song in clearPlayerError()
Without the player error code, it errored_song variable is not used,
and should be cleared, to avoid invalid access in pc_song_deleted().
2009-10-08 21:00:16 +02:00
Max Kellermann
76953a9748 player_control: bundle "get" functions in pc_get_status()
The new player_status struct replaces a bunch of playerGetX()
functions.  When we add proper locking to the player_control struct,
we will only need to lock once for the "status" command.
2009-10-08 20:48:07 +02:00
Max Kellermann
128a5fa4a5 player_control: allocate getPlayerErrorStr() result
This lets us eliminate the static fixed-size buffer.
2009-10-08 20:45:38 +02:00
Max Kellermann
a5960c20cc playlist_control: "previous" really plays the previous song
No more CD player emulation.  The current behaviour of "previous" is
difficult for a client to predict, because it does not definitely know
the current position within the song.  If a client wants to restart
the current song, it can always send "playid".
2009-10-08 20:33:50 +02:00
Max Kellermann
aa71ce4cd5 input_stream: include config.h for AC_SYS_LARGEFILE macros
AC_SYS_LARGEFILE defines macros for config.h.  If we don't include
config.h, we don't get large file support.
2009-10-08 16:57:55 +02:00
Max Kellermann
16c981d425 decoder_api: document all function parameters 2009-10-08 15:39:45 +02:00
Alam Arias
81e56705ad configure.ac: build with large file support by default
This fixes mpg123 support.
2009-10-08 15:24:59 +02:00
Max Kellermann
ecb118f1ed state_file: save only if something has changed
If nothing has changed since the last save, don't save the state
file.  Saving will spin up the hard drive, which is undesirable on
hosts where MPD is idling in background.
2009-10-08 15:22:39 +02:00
Max Kellermann
1e663b1869 output_state: no CamelCase 2009-10-06 10:30:10 +02:00
Max Kellermann
7013f9fc31 Merged release 0.15.4 from branch 'v0.15.x'
Conflicts:
	NEWS
	configure.ac
2009-10-03 16:17:02 +02:00
Max Kellermann
31cabc751d command: range support for "delete" 2009-09-30 23:13:13 +02:00
Max Kellermann
0478a8e288 playlist_edit: moved code to playlist_delete_internal() 2009-09-30 23:10:15 +02:00
Tony
1039d57251 Add the sidplay filter param to doc/mpdconf.example. 2009-09-28 11:59:55 +02:00
Tony
934a38f976 Make the sidplay decoder filter configurable. 2009-09-28 11:59:55 +02:00
Max Kellermann
8f261af5c1 automatically update the database with Linux inotify
This patch implements a light-weight inotify library, and watches all
directories below the music directory.  It updates all directories
where files changed after a delay of 5 seconds.
2009-09-25 18:32:00 +02:00
Max Kellermann
3e8bdb9384 update: added missing stdbool.h include 2009-09-25 16:43:33 +02:00
Max Kellermann
7542ec4f20 command: relax requirements for unquoted words
Allow most printable characters in unquoted words.  The tokenizer
patch introduced very strict requirements for command parameters -
those were undocumented, and we're reverting the strictness now.
2009-09-25 00:53:15 +02:00
Max Kellermann
89ba540e6d command: added command "rescan"
"rescan" is the same as "update", but it discards existing songs in
the database.
2009-09-24 21:55:40 +02:00
Max Kellermann
47ab2ad6f3 configure.ac: rename HAVE_CURL to ENABLE_CURL 2009-09-24 21:40:07 +02:00
Max Kellermann
06d5d4b03e conf: handle fatal errors with GError
Don't call g_error(), which will abort the process and dump core.

This patch does not affect all the config_get_X() functions.  These
need some more refactoring.
2009-09-24 21:40:07 +02:00
Max Kellermann
f3739a73af conf: splitted function config_param_free() 2009-09-24 21:40:05 +02:00
Max Kellermann
1b227e0145 cmdline: handle fatal errors with GError
Don't call g_error(), which will abort the process and dump core.
2009-09-24 21:40:05 +02:00
Max Kellermann
308b3f2337 listen: handle fatal errors with GError
Don't call g_error(), which will abort the process and dump core.
2009-09-24 21:40:04 +02:00
Max Kellermann
1e56107967 update: splitted update.c into several sources 2009-09-24 21:39:46 +02:00
Max Kellermann
b0e1a3d34c update: pass const string to update_enqueue()
Duplicate the path string within update.c, do not expect an allocated
string as parameter.
2009-09-24 21:39:43 +02:00
Max Kellermann
1cc4914b24 update: renamed directory_update_init() to update_enqueue() 2009-09-24 17:57:39 +02:00
Max Kellermann
aec18c74ec decoder/sidplay: free songlength data blob in error handler
When parsing the songlength database fails, the code forgot to free
the memory allocated by the raw file data.
2009-09-24 10:17:58 +02:00
Max Kellermann
4729d10bb2 decoder/sidplay: moved code to sidplay_load_songlength_db() 2009-09-24 10:14:05 +02:00
Max Kellermann
a8af3ce0dd decoder/sidplay: free GError objects
The caller is responsible fro freeing GError objects.  That
g_error_free() call was missing in two places.
2009-09-24 10:05:21 +02:00
Max Kellermann
d657be33ba decoder/sidplay: pass GError** to g_file_get_contents()
The error handler dereferences GError*, but did not retrieve that
object from g_file_get_contents().
2009-09-24 10:04:24 +02:00
Max Kellermann
a86f9b8035 cmdline: removed options --create-db and --no-create-db
Both options are deprecated, and should not be used anymore.  Many
users get confused by their presence.
2009-09-20 23:31:35 +02:00
Patrik Weiskircher
32f212cb86 output/osx: fix the OS X 10.6 build
Include CoreServices/CoreServices.h.
2009-09-20 23:30:37 +02:00
Max Kellermann
fdc479676f Merge branch 'v0.15.x'
Conflicts:
	NEWS
	configure.ac
	doc/mpdconf.example
2009-09-10 23:18:43 +02:00
Max Kellermann
4cdf62000c INSTALL: mention libwavpack and OpenAL 2009-09-09 10:44:12 +02:00
Serge Ziryukin
761771ad24 output/openal: support OpenAL plugin on Mac OS X 2009-09-07 15:52:32 +02:00
Serge Ziryukin
f5f4a9da6b doc: documented the "openal" output plugin settings 2009-09-06 22:22:17 +02:00
Serge Ziryukin
eefef369ea output/openal: fix default device name 2009-09-06 22:22:17 +02:00
Patrik Weiskircher
4ebf53ffdf configure.ac: use /Developer/SDKs/MacOSX10.5.sdk
First, this is not a nice fix. I am also not sure why the error
happens in the first place. I assume Apple deprecated some stuff in
10.6 + x86_64.

My patch simply uses the 10.5 SDK if compiling on 10.6 Snow Leopard -
which is installed by default if you install XCode 3.2 that comes with
Snow Leopard. The reason this is not a nice fix is, of course, that
this doesn't fix the problem. It just "postpones" it to the next
release of MacOS X. But, some people may need it, and its better than
nothing.
2009-09-06 17:42:50 +02:00
Serge Ziryukin
8b6a5d19d0 openal output plugin 2009-09-06 17:34:56 +02:00
Max Kellermann
129920e8f4 Merge branch 'master' of git://git.musicpd.org/avuton/mpd 2009-09-02 12:51:44 +02:00
Avuton Olrich
dc3b96a003 doc: Unify position of footnotes and cleanup wording. 2009-08-30 18:57:12 -07:00
Avuton Olrich
5a0d77bea3 doc: Remove superfluous comment already described in footnotes. 2009-08-30 18:53:14 -07:00
Mike Dawson
430b5b0490 decoder/sidplay: support seeking 2009-08-30 19:49:16 +02:00
Mike Dawson
cde9408bd8 decoder/sidplay: implemented songlength database
[mk: added autoconf test; fixed songlen_data_size type]
2009-08-30 19:49:04 +02:00
Mike Dawson
85ce9aa7de decoder/sidplay: subtunes 2009-08-30 19:48:56 +02:00
Max Kellermann
f2ff2409ad Merged release 0.15.3 from branch 'v0.15.x'
Conflicts:

	NEWS
	configure.ac
2009-08-30 09:42:12 +02:00
Max Kellermann
bff4c54ece decoder/mpg123: new decoder plugin based on libmpg123
Still missing:
- seeking
- tags
- streaming
- encodings other than MPG123_ENC_SIGNED_16
2009-08-26 20:08:13 +02:00
Anton Khirnov
df0c26a394 command: add "findadd" command. 2009-08-25 13:43:22 +02:00
Gunnar Roth
1e56c7b862 decoder/vorbis: open file in "binary" mode
fopen change for win32 in tag dup of vorbis
win32 adaption for head changes
2009-08-25 00:49:48 +02:00
Max Kellermann
4a0d4a02a6 output/recorder: new output plugin for recording radio streams
The recorder plugin writes audio played by MPD to a file.  This may be
useful for recording radio streams.

This implementation is incomplete, because support for tags is
missing, and MPD should be able to record each track to a different
file.
2009-08-24 18:57:06 +02:00
Max Kellermann
4231ec51c3 conf: removed the deprecated "error_file" option
This option was deprecated by the 0.15 release.  This patch makes this
option invalid.
2009-08-24 17:12:15 +02:00
Max Kellermann
f401c1059c Merged release 0.15.2 from branch 'v0.15.x'
Conflicts:

	NEWS
	configure.ac
2009-08-15 21:18:38 +02:00
Max Kellermann
e28a0e97b5 decoder_control: protect command, state with a mutex
Replace decoder_control.notify with decoder_control.mutex and
decoder_control.cond.  Lock the mutex on all accesses to
decoder_control.command and decoder_control.state.
2009-08-13 23:33:46 +02:00
Mike Frysinger
499ed62dd7 use daemon() when the C library provides it
For systems that cannot support fork() (like no-mmu Linux), use daemon() if
it is available for the daemonizing code.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
2009-08-13 17:25:30 +02:00
Max Kellermann
c3e02bec3b test: initialize locale in read_tags.c 2009-08-04 00:41:06 +02:00
Max Kellermann
4363c49443 tag_id3: moved id3_genre_name() call to tag_id3_import_text()
The ID3_FRAME_GENRE field is queried only in tag_id3_import_text().
Don't pass the tag type to import_id3_string().
2009-08-04 00:15:46 +02:00
Max Kellermann
09571fcc55 tag_id3: splitted function tag_id3_import_frame()
Splitted tag_id3_import_frame() into two specialized functions:
tag_id3_import_text() and tag_id3_import_comment().  Use
id3_frame_field() instead of directly accessing id3_frame.fields.
2009-08-04 00:15:43 +02:00
Max Kellermann
c7563a5783 tag_id3: corrected parameter types
Changed "int type" to "enum tag_type".  Converted "int is_id3v1" to
"bool".
2009-08-04 00:14:24 +02:00
Max Kellermann
b06b4f937d tag_id3: converted tag_is_id3v1() to an inline function
Prefer C over CPP.
2009-08-04 00:13:22 +02:00
Max Kellermann
86c6bb618b tag_id3: no CamelCase
Renamed functions.
2009-08-04 00:13:22 +02:00
Anton Khirnov
bff72634ca ffmpeg_plugin: convert metadata to generic format 2009-08-03 17:40:22 +02:00
Max Kellermann
6f060081be command: moved command_process_list() to client.c 2009-07-29 08:00:01 +02:00
Courtney Cavin
7f865f722c playlist: CamelCaseIsBad
Renamed all playlist functions to non-CamelCase.
2009-07-28 18:07:01 -04:00
Courtney Cavin
614a011845 input/lastfm: Ensure multiple identical xml entities are decoded.
Previously, if two identical entities appeared in one string, only the
first would get decoded. This fixes that bug.
2009-07-28 16:40:52 -04:00
Max Kellermann
0c66832b3b doc: removed deprecated mixer options from manpage
Removed documentation about the global options mixer_type,
mixer_device and mixer_control.
2009-07-28 17:22:55 +02:00
Max Kellermann
f78366910e client: splitted client.c into several pieces
The soure file client.c has nearly 1000 lines, time for splitting it
into smaller pieces to improve readability.
2009-07-28 17:17:23 +02:00
Max Kellermann
c426bbcf95 client: moved struct client to client_internal.h
Prepare splitting client.c into several sources.
2009-07-28 16:42:40 +02:00
Courtney Cavin
6d71094ce5 input/lastfm: use metadata
Added a patch to flush out the last.fm input plugin slightly. It
basically turns it into a wrapper for the appropriate plugin. Most
notably metadata is now extracted.
2009-07-28 16:41:50 +02:00
Max Kellermann
9322f04529 cmdline: obey $(sysconfdir) for default mpd.conf location
Instead of hard-coding the path "/etc/mpd.conf", use the configured
$(sysconfdir) path.  This can be set with:

 ./configure --sysconfdir=/etc

Note that this changes the default path to "/usr/local/etc/mpd.conf",
given the default prefix "/usr/local".  This is actually more correct
than the old default.
2009-07-28 16:17:18 +02:00
Max Kellermann
884201b919 client: moved some code to client_list_X()
Make the client list management a separate sub-library.
2009-07-23 19:20:30 +02:00
Max Kellermann
a0afd0369f client: don't include socket headers
The client code uses portable GLib I/O functions and doesn't need the
OS specific socket headers.
2009-07-23 17:32:12 +02:00
Max Kellermann
caf48ee973 player_thread: don't use precalculated size_to_time
Calculate the total play time with the audio_format object each time,
using audio_format_time_to_size().  The function
audioFormatSizeToTime() is not needed anymore, and will be removed
with this patch.
2009-07-23 12:27:05 +02:00
Max Kellermann
0749dbfadf player_thread: moved code to update_song_tag() 2009-07-23 12:26:26 +02:00
Max Kellermann
54889c72e3 pcm_convert: use GError for error handling
Don't abort the whole MPD process when the conversion fails.  This has
been a denial-of-service attack vector for years.
2009-07-23 12:01:03 +02:00
Max Kellermann
cba126ceb8 pcm_resample_fallback: don't include glib.h
This library does not use GLib directly.
2009-07-22 19:54:57 +02:00
Max Kellermann
c95663312a pcm_resample_fallback: removed G_GNUC_UNUSED attribute 2009-07-22 19:52:25 +02:00
Max Kellermann
00ee3de7b2 pcm_channels: num_channels is unsigned
You cannot have a negative number of channels, let's pass it as
uint8_t instead of int8_t.
2009-07-22 19:12:04 +02:00
Max Kellermann
172a1dbdb9 pcm_byteswap: converted NULL checks to assertions
It is illegal to pass a NULL buffer to pcm_byteswap_X().  The result
of this is that pcm_byteswap_X() never returns NULL.
2009-07-22 19:04:38 +02:00
Max Kellermann
c5a662f405 pcm_convert: added pcm_convert_state.byteswap_buffer
Currently, byteswapping is performed on the format_buffer.  This can
go wrong when this buffer is used twice during one run.  Add a
separate buffer for swapping the byte order.
2009-07-22 15:56:56 +02:00
Max Kellermann
9277950441 filter/volume: check the flag audio_format.reverse_endian
The volume plugin does not work for reverse_endian samples.
2009-07-22 15:56:50 +02:00
Max Kellermann
44c97a8f6d audio_format: added API documentation 2009-07-22 15:56:48 +02:00
Max Kellermann
6a071efa27 audio_format: initialize reverse_endian in audio_format_init()
This line was missing in the reverse_endian patch, and led to
undefined values and crashes in that attribute.
2009-07-22 15:56:36 +02:00
Michal Nazarewicz
bfed1c04cc daemon: daemonize_close_stdin() optimised.
Changed function to first close standard input (this may
fail but we don't care) and then try to open /dev/null (this
may fail but it shouldn't on Unix platforms plus we don't
know what to do in such case anyways).  Since standard input
has the "zeroth" descriptor number next "open" will use it.

Since there is no "/dev/null" on Windows (It's not even
a valid path!) the second step is skipped if WIN32 is
defined.

As a final touch, since the function consists of merely two
function calls it has been moved to header file and declared
static inline.

[mk: un-inline daemonize_close_stdin()]
2009-07-22 13:43:21 +02:00
Eugeny N Dzhurinsky
bdb1965b50 cmdline: renamed options.stderr to options.log_stderr
On FreeBSD, "stderr" is a macro, and using this name for a struct
member breaks the build.

[mk: renamed _stderr to log_stderr]
2009-07-22 13:40:19 +02:00
Max Kellermann
c9d43b4d71 Merge branch 'master' of git://git.infradead.org/users/dwmw2/mpd
Conflicts:

	Makefile.am
2009-07-19 18:18:32 +02:00
David Woodhouse
49ede85827 Support wrong-endian ALSA output 2009-07-19 17:15:35 +01:00
David Woodhouse
05693e2d5d Add reverse_endian field to struct audio_format and handle conversion 2009-07-19 17:15:21 +01:00
Max Kellermann
c5ec035fb4 tag_ape: simplified the apeItems array
Make "enum tag_type" the array index, and convert apeItems to a sparse
array.
2009-07-19 18:04:42 +02:00
Max Kellermann
5e2f98fdad tag_ape: moved code to tag_ape_import_item()
Improve code readability.
2009-07-19 17:59:36 +02:00
Max Kellermann
7b92750622 tag_ape: converted apeItems and tagItems to global vars
Don't initialize those arrays each time tag_ape_load() is called.
2009-07-19 17:59:35 +02:00
David Woodhouse
37754559b8 Add audio_format_init() function
It makes no difference right now, but we're about to add an endianness
flag and will want to make sure it's correctly initialised every time.
2009-07-19 16:54:11 +01:00
Max Kellermann
09008cb0ec client: return "enum command_return" instead of "int"
Several functions work with the wrong return type, this patch fixes
them.
2009-07-19 15:53:48 +02:00
Max Kellermann
b58aa1f5ee removed buffer2array.c 2009-07-19 15:15:41 +02:00
Max Kellermann
38e9205d4e command: use the tokenizer library 2009-07-19 15:15:36 +02:00
Max Kellermann
16ff44ad30 conf: use the tokenizer library 2009-07-19 15:11:37 +02:00
Max Kellermann
1745e68795 tokenizer: new library replacing buffer2array()
The new code is more robust and more flexible.  It provides detailed
error information in GError objects.
2009-07-19 15:11:36 +02:00
Michal Nazarewicz
809c96b53f daemon: Moved empty Windows version functions to header file
On Windows only daemonize_close_stdin() function does
something.  Other functions are either empty or generate an
error.  Those have been moved to header file and declared
static inline so compiler can remove the call all together.
2009-07-19 08:18:23 +02:00
Michal Nazarewicz
03e43356ce conf: replaced gcc "const" attribute with "pure"
The functions were not "const" (they examined values pointed
by arguments passed to them, quoting gcc's doc: "Note that
a function that has pointer arguments and examines the data
pointed to must _not_ be declared 'const'.") but rather
"pure" and still not all of them.

Note also, that even some of the functions declared "pure"
are not pure, however, due to reasons stated in source code
the attribute has been kept.
2009-07-19 08:18:08 +02:00
Michal Nazarewicz
d718a8b59d daemon: added "group" configuration option
The "group" configuration option is similar to "user" as it
sets user set what group MPD shall run as.  With "user"
option, MPD changed GID to the GID of the user, however,
more control could be desired.

Moreover, the patch changes the way of checking whether no
setuid(2)/setgid(2) is required -- previously user names
were compered, now UID and GIDs are compered (ie. the one we
already have (getuid(2)/getgid(2)) with the one we want to
change to).
2009-07-19 08:17:55 +02:00
Max Kellermann
4100035b19 Merged release 0.15.1 from branch 'v0.15.x' 2009-07-16 07:37:13 +02:00
Max Kellermann
9bef46c0da mapper: use g_file_test() instead of stat()
The GLib functions are more portable.
2009-07-15 18:58:24 +02:00
Max Kellermann
c134adbcbf mapper: pass music and playlist directory to mapper_init()
Added another glue function in main().
2009-07-15 18:58:19 +02:00
Max Kellermann
7bc8c7518b main: moved complex initialization code to glue functions
The glue_*() functions act as a glue between MPD's main() function and
its libraries.  They handle disabled features, and pass validated
configuration options.
2009-07-15 18:58:12 +02:00
Max Kellermann
739984f920 main: renamed openDB() to glue_db_init_and_load()
No CamelCase.
2009-07-15 18:58:10 +02:00
Max Kellermann
7261739526 cmdline: renamed option "--stdout" to "--stderr"
Since version 0.14, MPD has been logging to standard error instead of
standard output.  The option name should reflect that.  The old option
continues to work, we will remove it in a future MPD release.
2009-07-15 18:27:32 +02:00
Max Kellermann
62f9df98b4 cmdline: no CamelCase
Renamed type, variables and functions.
2009-07-15 18:22:49 +02:00
Max Kellermann
c76f71e8d6 conf: added the gcc "const" attribute to some functions
Add the "const" attribute to functions when their return value only
depends on parameters.  This allows gcc to eliminate some function
calls.
2009-07-15 17:12:48 +02:00
Max Kellermann
f7cc5b2efd state_file: don't rewind the stream while reading the state file
Parse the state file line by line, let each subsystem probe a line.
Only the playlist_state code gets the FILE pointer to read the
following lines.
2009-07-15 16:57:37 +02:00
Max Kellermann
df7d7732c6 state_file: simplified state_file_finish()
Return early from the destructor function when there is no configured
state file.  Don't check the timer, don't call g_free(NULL).
2009-07-15 14:32:29 +02:00
Max Kellermann
889b1c1eae state_file: fixed debug messages
Print "Loading" instead of "Saving" in state_file_read().  Added debug
message to state_file_write().
2009-07-15 14:29:30 +02:00
Serge Ziryukin
297d749fc8 modplug: get track length 2009-07-15 11:22:45 +02:00
Max Kellermann
6233de0546 encoder/twolame: new encoder plugin based on libtwolame
This encoder plugin is a replacement for the LAME encoder plugin for
those who prefer a "free" (non-patent encumbered) encoder library.
Most of the plugin source code is copied from the LAME encoder plugin,
since the LAME and TwoLAME APIs are nearly the same.
2009-07-14 23:07:41 +02:00
Max Kellermann
b1afa40fc1 configure.ac: use more MPD_AUTO_PKG()
Fail when a feature is enabled, but the library is not found.
2009-07-14 21:38:49 +02:00
Max Kellermann
a620e936cc Makefile.am: use WAVPACK_CFLAGS and WAVPACK_LIBS
Don't append these to MPD_CFLAGS and MPD_LIBS.
2009-07-14 21:29:01 +02:00
Max Kellermann
d897170455 playlist: no CamelCase 2009-07-14 21:28:36 +02:00
Max Kellermann
5a886da93b playlist: removed {save,read}PlaylistState()
Those were only wrappers for playlist_state_{save,restore}().  Since
sf_callbacks has been removed, we can call the latter functions
directly.
2009-07-14 21:28:26 +02:00
Max Kellermann
9206f54979 state_file: eliminated the sf_callbacks array
There are very few callbacks, and they are not meant to be pluggable.
Let's eliminate the array and call the load/save functions manually.
2009-07-14 21:15:12 +02:00
Serge Ziryukin
75c0a33ec5 flac: load external cue sheet when no internal one
External cue sheet file for "file.flac" should be named as "file.flac.cue".
2009-07-09 19:01:24 +02:00
Bart Nagel
8ae9b45da0 Implement ArtistSort tag 2009-07-09 19:00:41 +02:00
Max Kellermann
1eebbc746f decoder/sndfile: new decoder plugin based on libsndfile 2009-07-07 08:58:51 +02:00
Max Kellermann
adb2f66ced tag_id3: revised "performer" tag support
According to the ID3 2.4 documentation, "TOPE" is "Original
artist/performer", not "performer".  Removed "TOPE" support.  Instead,
map TPE3 ("Conductor/performer refinement") and TPE4 ("Interpreted,
remixed, or otherwise modified by") to "performer".
2009-07-07 08:00:21 +02:00
Max Kellermann
7246d67263 tag: added tag "AlbumArtistSort"
The tag_id3.c library supports both the documented "TSO2" tag, and the
inofficial TXXX/ALBUMARTISTSORT.

The Vorbis/FLAC decoder automatically supports the new tag, without
further change.
2009-07-07 07:36:25 +02:00
Max Kellermann
971fbe5d8e Makefile.am: disable test/run_encoder without plugins
If the encoder plugin API is disabled at compile time, don't compile
test/run_encoder.c.
2009-07-06 22:50:07 +02:00
Max Kellermann
45df3e5e54 main: fix "unused local variable" warning
The variables "success" and "error" are only used if SQLite support is
enabled.
2009-07-06 22:48:34 +02:00
Sébastien Houzé
468b7d3aea player_thread: log played song in "default" log mode
Very few lines to log a song URI when it has been entirely played.
Then mpd logs can be parsed to do statistics.
2009-07-06 22:29:58 +02:00
Max Kellermann
0275690b5c output: use the software mixer plugin
Do all the software volume stuff inside each output thread, not in the
player thread.  This allows one software mixer per output device, and
also allows the user to configure the mixer type (hardware or
software) for each audio output.

This moves the global "mixer_type" setting into the "audio_output"
section, deprecating the "mixer_enabled" flag.
2009-07-06 22:00:50 +02:00
Max Kellermann
da8095db54 mixer_all: added mixer_all_set_software_volume()
The special-purpose function is used for saving/restore the software
volume control to the state file.
2009-07-06 21:52:29 +02:00
Max Kellermann
5d74b1efef mixer/software: new mixer which controls filter/volume
This mixer plugin may be used instead of the traditional global
software mixer.  It integrates with the "volume" filter plugin, and
can control the software volume of an audio output which has no
hardware mixer.
2009-07-06 21:52:15 +02:00
Max Kellermann
d3b5574d7a volume: moved range check to handle_setvol()
Converted the range checks in volume_level_change() to assertions.
Changed all volume types to "unsigned", expect for those which must be
able to indicate error (-1).
2009-07-06 21:52:10 +02:00
Max Kellermann
90472526e0 volume, mixer: removed the "relative" parameter
Since the "volume" command has been removed, nobody uses relative
volumes anymore.
2009-07-06 21:51:24 +02:00
Max Kellermann
206392ad1a command: removed the "volume" command
This command has been deprecated more than 5 years ago (0.10.0).  Its
implementation is a kludge, let's remove it now.
2009-07-06 21:51:00 +02:00
Max Kellermann
171a9ee291 output_init: moved the "convert" filter at the end
The "convert" filter must be the last filter in the chain.  Ensure
that by doing its initialization at the very end of
audio_output_init().
2009-07-06 21:50:25 +02:00
Max Kellermann
13e725ab09 output_init: merge two local string variables 2009-07-06 21:50:13 +02:00
Max Kellermann
f5c2acf1d4 output_init: parse audio format earlier 2009-07-06 21:40:43 +02:00
Max Kellermann
17e3054399 song_print: check gmtime_r()'s return value
When song->mtime was not initialized properly, it was revealed that
strftime() might crash when gmtime_r() returns NULL due to an invalid
time_t input value.
2009-07-06 11:48:21 +02:00
Max Kellermann
09aadffe9b song: initialize mtime in song_alloc() 2009-07-06 11:32:31 +02:00
Max Kellermann
e47bdfe8e6 output: attach a filter chain to each audio_output
This patch adds initial filter support for audio outputs.  Each audio
output gets a "filter" attribute, which is used by ao_play_chunk().

The PCM conversion is now performed by convert_filter_plugin.
audio_output.convert_state has been removed.
2009-07-06 10:01:47 +02:00
Max Kellermann
cd9c0a6b3e filter/convert: new filter which calls pcm_convert() on demand 2009-07-06 10:01:02 +02:00
Max Kellermann
c372c3756b filter/chain: new library for creating a chain of filters 2009-07-06 10:01:02 +02:00
Max Kellermann
78fa3f06f9 output: added command REOPEN
REOPEN is called when the input audio format changes.  The output
thread may be reconfigure the PCM converter.
2009-07-06 10:01:02 +02:00
Max Kellermann
1350cd0e42 output_thread: moved OPEN handler to ao_open() 2009-07-06 08:04:18 +02:00
Max Kellermann
89d4f438c0 mixer_type: moved volume_mixer_type from volume.c 2009-07-06 07:37:37 +02:00
Max Kellermann
8bd7b5b607 conf: use bp->value, not param->value
A recent change to the boolean parser introduced a bug: instead of
using the block_param's value with get_bool(), we passed param->value
(which is always NULL in this case).
2009-07-06 07:37:32 +02:00
Max Kellermann
d78be1ab49 output_init: moved mixer instantiation to separate function 2009-07-05 18:44:37 +02:00
Max Kellermann
86e279f886 filter/volume: don't use volume_level_get()
Added public methods to get and set the current volume.
2009-07-05 16:31:47 +02:00
Max Kellermann
d4914fc9ef idle: added "update" event
Some clients have visual feedback for "database update is running".
Using the "database" idle event is unreliable, because it is only
emitted when the database was actually modified.  This patch adds the
"update" event, which is emitted when the update is started, and again
when the update is finished, disregarding whether it has been
modified.
2009-07-05 08:46:53 +02:00
Max Kellermann
46c19b8249 song_print: send song modification time to client
Added the response line "Last-Modified", which sends the modification
time in ISO 8601.  The same was already implemented for playlists.
2009-07-05 08:40:29 +02:00
Max Kellermann
077b24d62d configure.ac: increased protocol version to 0.16.0
We're going to extend the protocol now.  Update the protocol version.
2009-07-05 08:40:26 +02:00
Max Kellermann
111c4dac63 song_save: use GError for error handling 2009-07-05 08:29:52 +02:00
Max Kellermann
69ff9d757f song_save: no CamelCase
Renamed functions.
2009-07-05 08:29:50 +02:00
Max Kellermann
0c2ab17e91 sticker: use GError for error handling 2009-07-05 08:29:47 +02:00
Max Kellermann
12e82b9e33 test: added program "run_filter"
This program runs filter plugins in an isolated environment.
2009-07-05 06:54:48 +02:00
Max Kellermann
644fc48776 conf: registered option "filter"
Add this option to the user's manual.
2009-07-05 06:54:45 +02:00
Max Kellermann
666b1fae79 volume: removed unused macros
Removed VOLUME_MIXER_OSS and VOLUME_MIXER_ALSA.
2009-07-03 18:51:01 +02:00
Max Kellermann
e3c436f411 filter: added "volume" plugin
The "volume" filter plugin will replace the current software volume
code.  One "volume" filter may be attached to each output device.
This will allow the user to use hardware mixers for some devices, and
software mixers for other devices at the same time.

Currently, neither the filter API nor the "volume" plugin is
integrated into MPD.
2009-07-03 01:06:17 +02:00
Max Kellermann
48f3e13bec filter: added new plugin API for filters
The filter API allows us to implement software volume as a pluggable
filter, and we will be able to integrate libraries like SoX.
2009-07-03 01:02:53 +02:00
Max Kellermann
a923080d9b conf: added config_quark()
This GQuark will be used for GErrors related to malformed
configuration.
2009-07-03 01:01:50 +02:00
Max Kellermann
706614b0d7 playlist_state: don't save "current" song when none is set
This patch fixes an assertion failure:

 Assertion `order < queue->length' failed.

This happens when the state file is saved, when there is no "current"
song: current==-1, and queue_order_to_position(-1) is called.
2009-06-29 22:27:57 +02:00
Christopher Zimmerman
a641f562f3 playlist_state: save state when stopped
At the moment mpd doesn't store or restore the current track to/from
its state file when the daemon is stopped/started while in 'stopped'
state.  I believe the preferred behaviour would be to store and
restore the current track even when the daemon is in stopped state
when shutting down.

I made a small patch to adapt this behaviour. If you believe this is
not the preferred behaviour, maybe this should be realized as a
configuration option. I'm not sure how to do this, but made a small
comment, where one would have to put the option.
2009-06-26 09:26:12 +02:00
Max Kellermann
fe96bdf7e6 autogen.sh: don't check for autoconf <2.60
configure.ac refuses to run with autoconf older than 2.60, don't
bother to test for those versions in autogen.sh.
2009-06-25 11:53:34 +02:00
Max Kellermann
5b78b46a30 Makefile.am: require automake 1.10
Refuse to build with automake 1.9.  1.9 is quite old already, and I'm
too lazy to test with ancient versions.
2009-06-25 11:52:55 +02:00
Max Kellermann
eacd604518 ffmpeg: support multiple tags
Call av_metadata_get() in a loop.
2009-06-25 08:43:59 +02:00
Max Kellermann
637c6a1850 conf: log unused/unknown block parameters 2009-06-25 08:42:25 +02:00
Max Kellermann
0cbc4012e8 conf: added "used" flag to struct block_param 2009-06-25 08:41:23 +02:00
Max Kellermann
8074b82653 conf: detect duplicate parameters in config_add_block_param()
Moved the check from config_get_block_param().  Detect the duplicate
parameter when it's added, not when it's queried.
2009-06-25 08:41:09 +02:00
Max Kellermann
5d583c9b2d conf: make get_bool() return a bool
Instead of returning an artificial three-state integer, return a
"success" value and put the boolean value into a "bool" pointer.
That's a little bit more overhead, but an API which looks more
natural.
2009-06-25 08:40:02 +02:00
Max Kellermann
093e900d44 conf: moved code from get_bool() to string_array_contains() 2009-06-25 08:39:53 +02:00
Max Kellermann
8965b66ce4 conf: register configuration options statically
Initialize the config_entries array at compile time.  This is not only
faster, but also smaller.
2009-06-25 08:39:44 +02:00
Max Kellermann
146add67c2 conf: removed config_add_param()
This function is unused.
2009-06-25 08:39:01 +02:00
Max Kellermann
34e9a0a960 conf: replace "mask" bit field with two "bool" variables
Due to padding, this takes the same amount of memory.
2009-06-25 08:38:51 +02:00
Max Kellermann
b1e95b1fa8 volume: removed support for legacy mixer configuration
The top-level "mixer_device" and "mixer_control" options have been
deprecated by MPD 0.15, and it's safe to remove them in MPD 0.16.
2009-06-25 08:37:51 +02:00
Max Kellermann
ce072b89d2 command: added new "status" line with more precise "elapsed time" 2009-06-25 08:37:34 +02:00
Daniel Seuthe
4ffd9bce5a Preamp for missing replay-gain 2009-06-25 08:36:35 +02:00
Avuton Olrich
f16d05c633 Modify version string to post-release version 0.16~git 2009-06-24 17:34:27 -07:00
991 changed files with 96536 additions and 45704 deletions

32
.gitignore vendored
View File

@@ -1,12 +1,11 @@
*.Plo
*.Po
*.a
*.bz2
*.d
*.gz
*.la
*.lo
*.o
*.exe
.deps
.dirstamp
Makefile
@@ -24,6 +23,7 @@ config.sub
config_detected.h
config_detected.mk
configure
configure.lineno
depcomp
depmode
install-sh
@@ -32,10 +32,15 @@ ltmain.sh
missing
mkinstalldirs
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
@@ -43,10 +48,33 @@ 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
/*.tar.gz
/*.tar.bz2
/*.tar.xz
/mpd-*/

97
AUTHORS
View File

@@ -1,70 +1,31 @@
Current Developers
------------------
Music Player Daemon - http://www.musicpd.org
Copyright (C) 2003-2013 The Music Player Daemon Project
Avuton Olrich <avuton@gmail.com>
release manager
The following people have contributed code to MPD:
Max Kellermann <max@duempel.org>
lead developer
Laszlo Ashin <kodest@gmail.com>
WavPack support
Viliam Mateicka <viliam.mateicka@gmail.com>
FFmpeg support, mixer and archive API
Eric Wollesen <encoded@xmtp.net>
encoder API, shout output
Thomas Jansen <mithi@mithi.net>
multithreading tweaks, miscellaneous
Rasmus Steinke <rasi1979@googlemail.com>
documentation
Romain Bignon <romain@peerfuse.org>
playlist manipulation
David Guibert <david.guibert@gmail.com>
PulseAudio mixer
Jochen Keil <jochen.keil@gmail.com>
CUE sheet support
Jeffrey Middleton <jefromi@gmail.com>
playlist manipulation
Sean McNamara <smcnam@gmail.com>
WIN32 compatibility
Former Developers
-----------------
Warren Dukes <warren.dukes@gmail.com>
former lead developer and project founder
Niklas Hofer
'next' and 'previous' patch
Jim Ramsay <i.am@jimramsay.com>
Zerconf/avahi support
Guus Sliepen <guus@sliepen.eu.org>
libsamplerate code
J. Alexander Treuman <jat@spatialrift.net>
general, MP3, ID3, PulseAudio, format conversion, stored playlists
AudioCompress, much much more...
Eric Wong
former lead developer
José Anarch <anarchsss@gmail.com>
JACK plugin
Patrik Weiskircher <pat@icore.at>
Stored playlist commands
Nick Welch <mack@incise.org>
Sighandlers
Warren Dukes <warren.dukes@gmail.com>
Avuton Olrich <avuton@gmail.com>
Max Kellermann <max@duempel.org>
Laszlo Ashin <kodest@gmail.com>
Viliam Mateicka <viliam.mateicka@gmail.com>
Eric Wollesen <encoded@xmtp.net>
Thomas Jansen <mithi@mithi.net>
Romain Bignon <romain@peerfuse.org>
David Guibert <david.guibert@gmail.com>
Jochen Keil <jochen.keil@gmail.com>
Jeffrey Middleton <jefromi@gmail.com>
Sean McNamara <smcnam@gmail.com>
Niklas Hofer
Jim Ramsay <i.am@jimramsay.com>
Guus Sliepen <guus@sliepen.eu.org>
J. Alexander Treuman <jat@spatialrift.net>
Eric Wong
José Anarch <anarchsss@gmail.com>
Patrik Weiskircher <pat@icore.at>
Nick Welch <mack@incise.org>
Jonathan Neuschäfer <j.neuschaefer@gmx.net>
Anton Khirnov <anton@khirnov.net>
Simon Kagstrom <simon.kagstrom@gmail.com>
Denis Krjuchkov <denis@crazydev.net>
Jurgen Kramer <gtmkramer@xs4all.nl>
Jean-Francois Dockes <jf@dockes.org>

81
INSTALL
View File

@@ -3,17 +3,20 @@
Introduction
------------
This document is a very small amount of documentation about what is needed to
install MPD. If more information is desired see the community wiki at
http://mpd.wikia.com.
install MPD. If more information is desired, read the user manual:
http://www.musicpd.org/doc/user/
Dependencies
------------
gcc - http://gcc.gnu.org/
Any other C99 compliant compiler should also work.
gcc 4.6 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 - http://www.gtk.org/
GLib 2.28 - http://www.gtk.org/
General-purpose utility library.
@@ -37,15 +40,9 @@ Linux. You will need libasound.
FIFO
This is a mostly undocumented, developer plugin to transmit raw data.
MVP - http://en.wikipedia.org/wiki/Hauppauge_MediaMVP
A network media player.
OSS - http://www.opensound.com
Open Sound System.
OSX - http://www.apple.com
Necessary if you are on Mac OSX.
PulseAudio - http://www.pulseaudio.org/
An advanced sound daemon. You will need libpulse.
@@ -56,6 +53,9 @@ libshout - http://www.icecast.org/
For streaming to an Icecast or Shoutcast server.
You also need an encoder: either libvorbisenc (ogg), or liblame (mp3).
OpenAL - http://kcat.strangesoft.net/openal.html
Open Audio Library
Optional Input Dependencies
---------------------------
@@ -69,22 +69,23 @@ MAD - http://www.underbit.com/products/mad/
For MP3 support. You will need libmad, and optionally libid3tag if you want
ID3 tag support.
libmpg123 - http://www.mpg123.de/
Alternative for MP3 support.
Ogg Vorbis - http://www.xiph.org/ogg/vorbis/
For Ogg Vorbis support. You will need libogg and libvorbis.
FLAC - http://flac.sourceforge.net/
For FLAC support. You will need version 1.1.0 or higher of libflac.
libopus - http://www.opus-codec.org/
Opus codec support
OggFLAC - http://www.xiph.org/ogg/vorbis/ and http://flac.sourceforge.net/
For OggFLAC support. You will need liboggflac, which can be built from the
FLAC sources if libogg is already installed. Versions of flac 1.1.3 and
greater will automatically detect and use OggFLAC if it's available.
FLAC - http://flac.sourceforge.net/
For FLAC support. You will need version 1.2 or higher of libFLAC.
Audio File - http://www.68k.org/~michael/audiofile/
For WAVE, AIFF, and AU support. You will need libaudiofile.
FAAD2 - http://www.audiocoding.com/
For MP4/AAC support. You will need libmp4ff.
For MP4/AAC support.
libmpcdec - http://www.musepack.net/
For Musepack support.
@@ -92,18 +93,30 @@ For Musepack support.
MikMod - http://mikmod.raphnet.net/
For MOD support. You will need libmikmod.
libavcodec, libavformat (ffmpeg) - http://ffmpeg.mplayerhq.hu/
libavcodec, libavformat (ffmpeg or libav) - http://ffmpeg.mplayerhq.hu/ http://libav.org/
Multi-codec library.
libsidplay2 - http://sidplay2.sourceforge.net/
For C64 SID support.
libfluidsynth - http://fluidsynth.resonance.org/
For MIDI support (DO NOT USE - use libwildmidi instead)
libwildmidi - http://wildmidi.sourceforge.net/
For MIDI support.
libwildmidi 0.2.3 - http://wildmidi.sourceforge.net/
For MIDI support.
libsndfile - http://www.mega-nerd.com/libsndfile/
WAVE, AIFF, and many others.
libwavpack - http://www.wavpack.com/
For WavPack playback.
libadplug - http://adplug.sourceforge.net/
For AdLib playback.
despotify - https://github.com/SimonKagstrom/despotify
For Spotify playback.
Optional Miscellaneous Dependencies
-----------------------------------
@@ -123,8 +136,11 @@ For playing MMS streams.
SQLite - http://www.sqlite.org/
For the sticker database.
libcue - http://libcue.sourceforge.net/
For CUE sheet support.
libcdio - http://www.gnu.org/software/libcdio/
For playing audio CDs.
libsystemd-daemon - http://freedesktop.org/wiki/Software/systemd/
For systemd activation.
pkg-config
@@ -147,13 +163,9 @@ Get the latest release from of MPD from <http://www.musicpd.org/>.
Compile
-------
1) unzip and untar the archive
1) unpack the archive
$ tar zxvf mpd-x.x.x.tar.gz
or
$ tar jxvf mpd-x.x.x.tar.bz2
$ tar xf mpd-x.x.x.tar.xz
2) change to directory created
@@ -180,9 +192,9 @@ Run
$ mpd <config file>
First default is ~/.mpdconf then ~/.mpd/mpd.conf then /etc/mpd.conf. If
neither of these exist a mpd configuration file must be specified at
runtime.
First default is $XDG_CONFIG_HOME/mpd/mpd.conf then ~/.mpdconf then
~/.mpd/mpd.conf then /etc/mpd.conf. If neither of these exist a mpd
configuration file must be specified at runtime.
A sample config file is included with the source of MPD, mpdconf.example.
@@ -194,6 +206,5 @@ Using MPD
---------
You can download many different interfaces for MPD at
<http://mpd.wikia.com/wiki/Clients>
MPD can be interfaced directly using telnet (see COMMANDS, if you are brave).
http://www.musicpd.org/clients/

File diff suppressed because it is too large Load Diff

539
NEWS
View File

@@ -1,3 +1,542 @@
ver 0.18.3 (2013/11/08)
* fix stuck MPD after song change (0.18.2 regression)
ver 0.18.2 (2013/11/07)
* protocol:
- "close" flushes the output buffer
* input:
- cdio_paranoia: add setting "default_byte_order"
- curl: fix bug with redirected streams
* playlist:
- pls: fix reversed song order
* decoder:
- audiofile: require libaudiofile 0.3 due to API breakage
- dsf: enable DSD128
* enable buffering when starting playback (regression fix)
* fix build failures due to missing includes
* fix big-endian support
ver 0.18.1 (2013/11/04)
* protocol:
- always ignore whitespace at the end of the line
* networking:
- log UNIX domain path names instead of "localhost"
- open listener sockets in the order they were configured
- don't abort if IPv6 is not available
* output:
- alsa: avoid endless loop in Raspberry Pi workaround
* filter:
- autoconvert: fix "volume_normalization" with mp3 files
* add missing files to source tarball
ver 0.18 (2013/10/31)
* configuration:
- allow tilde paths for socket
- default filesystem charset is UTF-8 instead of ISO-8859-1
- increase default buffer size to 4 MB
* protocol:
- new command "readcomments" lists arbitrary file tags
- new command "toggleoutput"
- "find"/"search" with "any" does not match file name
- "search" and "find" with base URI (keyword "base")
- search for album artist falls back to the artist tag
- re-add the "volume" command
* input:
- curl: enable https
- soup: plugin removed
* playlist:
- lastfm: remove defunct Last.fm support
* decoder:
- adplug: new decoder plugin using libadplug
- dsf: don't play junk at the end of the "data" chunk
- ffmpeg: drop support for pre-0.8 ffmpeg
- flac: require libFLAC 1.2 or newer
- flac: support FLAC files inside archives
- opus: new decoder plugin for the Opus codec
- vorbis: skip 16 bit quantisation, provide float samples
- mikmod: add "loop" configuration parameter
- modplug: add "loop_count" configuration parameter
- mp4ff: obsolete plugin removed
* encoder:
- opus: new encoder plugin for the Opus codec
- vorbis: accept floating point input samples
* output:
- new option "tags" may be used to disable sending tags to output
- alsa: workaround for noise after manual song change
- ffado: remove broken plugin
- httpd: support HEAD requests
- mvp: remove obsolete plugin
- osx: disabled by default because it's unmaintained and unsupported
* improved decoder/output error reporting
* eliminate timer wakeup on idle MPD
* fix unresponsive MPD while waiting for stream
* port of the source code to C++11
ver 0.17.6 (2013/10/14)
* mixer:
- alsa: fix busy loop when USB sound device gets unplugged
* decoder:
- modplug: fix build with Debian package 1:0.8.8.4-4
* stored playlists:
- fix loading playlists with references to local files
- obey filesystem_charset for URLs
ver 0.17.5 (2013/08/04)
* protocol:
- fix "playlistadd" with URI
- fix "move" relative to current when there is no current song
* decoder:
- ffmpeg: support "application/flv"
- mikmod: adapt to libmikmod 3.2
* configure.ac:
- detect system "ar"
ver 0.17.4 (2013/04/08)
* protocol:
- allow to omit END in ranges (START:END)
- don't emit IDLE_PLAYER before audio format is known
* decoder:
- ffmpeg: support float planar audio (ffmpeg 1.1)
- ffmpeg: fix AVFrame allocation
* player:
- implement missing "idle" events on output errors
* clock: fix build failure
ver 0.17.3 (2013/01/06)
* output:
- osx: fix pops during playback
- recorder: fix I/O error check
- shout: fix memory leak in error handler
- recorder, shout: support Ogg packets that span more than one page
* decoder:
- ffmpeg: ignore negative time stamps
- ffmpeg: support planar audio
* playlist:
- cue: fix memory leak
- cue: fix CUE files with only one track
ver 0.17.2 (2012/09/30)
* protocol:
- fix crash in local file check
* decoder:
- fluidsynth: remove throttle (requires libfluidsynth 1.1)
- fluidsynth: stop playback at end of file
- fluidsynth: check MIDI file format while scanning
- fluidsynth: add sample rate setting
- wavpack: support all APEv2 tags
* output:
- httpd: use monotonic clock, avoid hiccups after system clock adjustment
- httpd: fix throttling bug after resuming playback
* playlist:
- cue: map "PERFORMER" to "artist" or "album artist"
* mapper: fix non-UTF8 music directory name
* mapper: fix potential crash in file permission check
* playlist: fix use-after-free bug
* playlist: fix memory leak
* state_file: save song priorities
* player: disable cross-fading in "single" mode
* update: fix unsafe readlink() usage
* configure.ac:
- don't auto-detect the vorbis encoder when Tremor is enabled
ver 0.17.1 (2012/07/31)
* protocol:
- require appropriate permissions for searchadd{,pl}
* tags:
- aiff: support the AIFC format
- ape: check for ID3 if no usable APE tag was found
* playlist:
- cue: support file types "MP3", "AIFF"
* output:
- fix noisy playback with conversion and software volume
ver 0.17 (2012/06/27)
* protocol:
- support client-to-client communication
- "update" and "rescan" need only "CONTROL" permission
- new command "seekcur" for simpler seeking within current song
- new command "config" dumps location of music directory
- add range parameter to command "load"
- print extra "playlist" object for embedded CUE sheets
- new commands "searchadd", "searchaddpl"
* input:
- cdio_paranoia: new input plugin to play audio CDs
- curl: enable CURLOPT_NETRC
- curl: non-blocking I/O
- soup: new input plugin based on libsoup
* tags:
- RVA2: support separate album/track replay gain
* decoder:
- mpg123: implement seeking
- ffmpeg: drop support for pre-0.5 ffmpeg
- ffmpeg: support WebM
- oggflac: delete this obsolete plugin
- dsdiff: new decoder plugin
* output:
- alsa: support DSD-over-USB (dCS suggested standard)
- httpd: support for streaming to a DLNA client
- openal: improve buffer cancellation
- osx: allow user to specify other audio devices
- osx: implement 32 bit playback
- shout: add possibility to set url
- roar: new output plugin for RoarAudio
- winmm: fail if wrong device specified instead of using default device
* mixer:
- alsa: listen for external volume changes
* playlist:
- allow references to songs outside the music directory
- new CUE parser, without libcue
- soundcloud: new plugin for accessing soundcloud.com
* state_file: add option "restore_paused"
* cue: show CUE track numbers
* allow port specification in "bind_to_address" settings
* support floating point samples
* systemd socket activation
* improve --version output
* WIN32: fix renaming of stored playlists with non-ASCII names
ver 0.16.8 (2012/04/04)
* fix for libsamplerate assertion failure
* decoder:
- vorbis (and others): fix seeking at startup
- ffmpeg: read the "year" tag
* encoder:
- vorbis: generate end-of-stream packet before tag
- vorbis: generate end-of-stream packet when playback ends
* output:
- jack: check for connection failure before starting playback
- jack: workaround for libjack1 crash bug
- osx: fix stuttering due to buffering bug
* fix endless loop in text file reader
* update: skip symlinks in path that is to be updated
ver 0.16.7 (2012/02/04)
* input:
- ffmpeg: support libavformat 0.7
* decoder:
- ffmpeg: support libavformat 0.8, libavcodec 0.9
- ffmpeg: support all MPD tags
* output:
- httpd: fix excessive buffering
- openal: force 16 bit playback, as 8 bit doesn't work
- osx: remove sleep call from render callback
- osx: clear render buffer when there's not enough data
* fix moving after current song
ver 0.16.6 (2011/12/01)
* decoder:
- fix assertion failure when resuming streams
- ffmpeg: work around bogus channel count
* encoder:
- flac, null, wave: fix buffer corruption bug
- wave: support packed 24 bit samples
* mapper: fix the bogus "not a directory" error message
* mapper: check "x" and "r" permissions on music directory
* log: print reason for failure
* event_pipe: fix WIN32 regression
* define WINVER in ./configure
* WIN32: autodetect filesystem encoding
ver 0.16.5 (2011/10/09)
* configure.ac
- disable assertions in the non-debugging build
- show solaris plugin result correctly
- add option --enable-solaris-output
* pcm_format: fix 32-to-24 bit conversion (the "silence" bug)
* input:
- rewind: reduce heap usage
* decoder:
- ffmpeg: higher precision timestamps
- ffmpeg: don't require key frame for seeking
- fix CUE track seeking
* output:
- openal: auto-fallback to mono if channel count is unsupported
* player:
- make seeking to CUE track more reliable
- the "seek" command works when MPD is stopped
- restore song position from state file (bug fix)
- fix crash that sometimes occurred when audio device fails on startup
- fix absolute path support in playlists
* WIN32: close sockets properly
* install systemd service file if systemd is available
ver 0.16.4 (2011/09/01)
* don't abort configure when avahi is not found
* auto-detect libmad without pkg-config
* fix memory leaks
* don't resume playback when seeking to another song while paused
* apply follow_inside_symlinks to absolute symlinks
* fix playback discontinuation after seeking
* input:
- curl: limit the receive buffer size
- curl: implement a hard-coded timeout of 10 seconds
* decoder:
- ffmpeg: workaround for semantic API change in recent ffmpeg versions
- flac: validate the sample rate when scanning the tag
- wavpack: obey all decoder commands, stop at CUE track border
* encoder:
- vorbis: don't send end-of-stream on flush
* output:
- alsa: fix SIGFPE when alsa announces a period size of 0
- httpd: don't warn on client disconnect
- osx: don't drain the buffer when closing
- pulse: fix deadlock when resuming the stream
- pulse: fix deadlock when the stream was suspended
ver 0.16.3 (2011/06/04)
* fix assertion failure in audio format mask parser
* fix NULL pointer dereference in playlist parser
* fix playlist files in base music directory
* database: allow directories with just playlists
* decoder:
- ffmpeg: support libavcodec 0.7
ver 0.16.2 (2011/03/18)
* configure.ac:
- fix bashism in tremor test
* decoder:
- tremor: fix configure test
- gme: detect end of song
* encoder:
- vorbis: reset the Ogg stream after flush
* output:
- httpd: fix uninitialized variable
- httpd: include sys/socket.h
- oss: AFMT_S24_PACKED is little-endian
- oss: disable 24 bit playback on FreeBSD
ver 0.16.1 (2011/01/09)
* audio_check: fix parameter in prototype
* add void casts to suppress "result unused" warnings (clang)
* input:
- ffado: disable by default
* decoder:
- mad: work around build failure on Solaris
- resolve modplug vs. libsndfile cflags/headers conflict
* output:
- solaris: add missing parameter to open_cloexec() cal
- osx: fix up audio format first, then apply it to device
* player_thread: discard empty chunks while cross-fading
* player_thread: fix assertion failure due to early seek
* output_thread: fix double lock
ver 0.16 (2010/12/11)
* protocol:
- send song modification time to client
- added "update" idle event
- removed the deprecated "volume" command
- added the "findadd" command
- range support for "delete"
- "previous" really plays the previous song
- "addid" with negative position is deprecated
- "load" supports remote playlists (extm3u, pls, asx, xspf, lastfm://)
- allow changing replay gain mode on-the-fly
- omitting the range end is possible
- "update" checks if the path is malformed
* archive:
- iso: renamed plugin to "iso9660"
- zip: renamed plugin to "zzip"
* input:
- lastfm: obsolete plugin removed
- ffmpeg: new input plugin using libavformat's "avio" library
* tags:
- added tags "ArtistSort", "AlbumArtistSort"
- id3: revised "performer" tag support
- id3: support multiple values
- ape: MusicBrainz tags
- ape: support multiple values
* decoders:
- don't try a plugin twice (MIME type & suffix)
- don't fall back to "mad" unless no plugin matches
- ffmpeg: support multiple tags
- ffmpeg: convert metadata to generic format
- ffmpeg: implement the libavutil log callback
- sndfile: new decoder plugin based on libsndfile
- flac: moved CUE sheet support to a playlist plugin
- flac: support streams without STREAMINFO block
- mikmod: sample rate is configurable
- mpg123: new decoder plugin based on libmpg123
- sidplay: support sub-tunes
- sidplay: implemented songlength database
- sidplay: support seeking
- sidplay: play monaural SID tunes in mono
- sidplay: play mus, str, prg, x00 files
- wavpack: activate 32 bit support
- wavpack: allow more than 2 channels
- mp4ff: rename plugin "mp4" to "mp4ff"
* encoders:
- twolame: new encoder plugin based on libtwolame
- flac: new encoder plugin based on libFLAC
- wave: new encoder plugin for PCM WAV format
* output:
- recorder: new output plugin for recording radio streams
- alsa: don't recover on CANCEL
- alsa: fill period buffer with silence before draining
- openal: new output plugin
- pulse: announce "media.role=music"
- pulse: renamed context to "Music Player Daemon"
- pulse: connect to server on MPD startup, implement pause
- jack: require libjack 0.100
- jack: don't disconnect during pause
- jack: connect to server on MPD startup
- jack: added options "client_name", "server_name"
- jack: clear ring buffers before activating
- jack: renamed option "ports" to "destination_ports"
- jack: support more than two audio channels
- httpd: bind port when output is enabled
- httpd: added name/genre/website configuration
- httpd: implement "pause"
- httpd: bind_to_address support (including IPv6)
- oss: 24 bit support via OSS4
- win32: new output plugin for Windows Wave
- shout, httpd: more responsive to control commands
- wildcards allowed in audio_format configuration
- consistently lock audio output objects
* player:
- drain audio outputs at the end of the playlist
* mixers:
- removed support for legacy mixer configuration
- reimplemented software volume as mixer+filter plugin
- per-device software/hardware mixer setting
* commands:
- added new "status" line with more precise "elapsed time"
* update:
- automatically update the database with Linux inotify
- support .mpdignore files in the music directory
- sort songs by album name first, then disc/track number
- rescan after metadata_to_use change
* normalize: upgraded to AudioCompress 2.0
- automatically convert to 16 bit samples
* replay gain:
- reimplemented as a filter plugin
- fall back to track gain if album gain is unavailable
- optionally use hardware mixer to apply replay gain
- added mode "auto"
- parse replay gain from APE tags
* log unused/unknown block parameters
* removed the deprecated "error_file" option
* save state when stopped
* renamed option "--stdout" to "--stderr"
* removed options --create-db and --no-create-db
* state_file: save only if something has changed
* database: eliminated maximum line length
* log: redirect stdout/stderr to /dev/null if syslog is used
* set the close-on-exec flag on all file descriptors
* pcm_volume, pcm_mix: implemented 32 bit support
* support packed 24 bit samples
* CUE sheet support
* support for MixRamp tags
* obey $(sysconfdir) for default mpd.conf location
* build with large file support by default
* added test suite ("make check")
* require GLib 2.12
* added libwrap support
* make single mode 'sticky'
ver 0.15.17 (2011/??/??)
* encoder:
- vorbis: reset the Ogg stream after flush
* decoders:
- vorbis: fix tremor support
ver 0.15.16 (2011/03/13)
* output:
- ao: initialize the ao_sample_format struct
- jack: fix crash with mono playback
* encoders:
- lame: explicitly configure the output sample rate
* update: log all file permission problems
ver 0.15.15 (2010/11/08)
* input:
- rewind: fix assertion failure
* output:
- shout: artist comes first in stream title
ver 0.15.14 (2010/11/06)
* player_thread: fix assertion failure due to wrong music pipe on seek
* output_thread: fix assertion failure due to race condition in OPEN
* input:
- rewind: fix double free bug
* decoders:
- mp4ff, ffmpeg: add extension ".m4b" (audio book)
ver 0.15.13 (2010/10/10)
* output_thread: fix race condition after CANCEL command
* output:
- httpd: fix random data in stream title
- httpd: MIME type audio/ogg for Ogg Vorbis
* input:
- rewind: update MIME not only once
- rewind: enable for MMS
ver 0.15.12 (2010/07/20)
* input:
- curl: remove assertion after curl_multi_fdset()
* tags:
- rva2: set "gain", not "peak"
* decoders:
- wildmidi: support version 0.2.3
ver 0.15.11 (2010/06/14)
* tags:
- ape: support album artist
* decoders:
- mp4ff: support tags "album artist", "albumartist", "band"
- mikmod: fix memory leak
- vorbis: handle uri==NULL
- ffmpeg: fix memory leak
- ffmpeg: free AVFormatContext on error
- ffmpeg: read more metadata
- ffmpeg: fix libavformat 0.6 by using av_open_input_stream()
* playlist: emit IDLE_OPTIONS when resetting single mode
* listen: make get_remote_uid() work on BSD
ver 0.15.10 (2010/05/30)
* input:
- mms: fix memory leak in error handler
- mms: initialize the "eof" attribute
* decoders:
- mad: properly calculate ID3 size without libid3tag
ver 0.15.9 (2010/03/21)
* decoders:
- mad: fix crash when seeking at end of song
- mpcdec: fix negative shift on fixed-point samples
- mpcdec: fix replay gain formula with v8
* playlist: fix single+repeat in random mode
* player: postpone song tags during cross-fade
ver 0.15.8 (2010/01/17)
* input:
- curl: allow rewinding with Icy-Metadata
* decoders:
- ffmpeg, flac, vorbis: added more flac/vorbis MIME types
- ffmpeg: enabled libavformat's file name extension detection
* dbUtils: return empty tag value only if no value was found
* decoder_thread: fix CUE track playback
* queue: don't repeat current song in consume mode
ver 0.15.7 (2009/12/27)
* archive:
- close archive when stream is closed

View File

@@ -9,20 +9,20 @@ srcdir="`dirname $0`"
test -z "$srcdir" && srcdir=.
cd "$srcdir"
DIE=
AM_VERSIONGREP="sed -e s/.*[^0-9\.]\([0-9]\.[0-9]\).*/\1/"
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.9 1.10'
AM_VERSIONS='1.11'
fi
if test -n "$AC_FORCE_VERSION"
then
AC_VERSIONS="$AC_FORCE_VERSION"
else
AC_VERSIONS='2.58 2.59 2.60 2.61'
AC_VERSIONS='2.60 2.61'
fi
versioned_bins ()

File diff suppressed because it is too large Load Diff

View File

@@ -32,23 +32,16 @@
<listitem>
<para>
don't write CPP when you can write C: use inline functions
and enums instead of macros
don't write CPP when you can write C++: use inline
functions and constexpr instead of macros
</para>
</listitem>
<listitem>
<para>
the code should be C99 compliant, and must compile with
<application>GCC</application>;
<application>clang</application> support is highly desirable
</para>
</listitem>
<listitem>
<para>
C++ is ok (for integrating C++ only libraries), but it
should be avoided
the code should be C++11 compliant, and must compile with
<application>GCC</application> 4.6 and
<application>clang</application> 3.2
</para>
</listitem>
@@ -57,11 +50,11 @@
Some example code:
</para>
<programlisting lang="C">static inline bool
<programlisting lang="C">static inline int
foo(const char *abc, int xyz)
{
if (abc == NULL) {
g_warning("Foo happened!\n");
LogWarning("Foo happened!");
return -1;
}
@@ -75,12 +68,28 @@ foo(const char *abc, int xyz)
<chapter>
<title>Hacking The Source</title>
<para>
MPD sources are managed in a git repository on <ulink
url="http://git.musicpd.org/">git.musicpd.org</ulink>.
</para>
<para>
Always write your code against the latest git:
</para>
<programlisting>git clone git://git.musicpd.org/master/mpd.git</programlisting>
<para>
If you already have a clone, update it:
</para>
<programlisting>git pull --rebase git://git.musicpd.org/master/mpd.git master</programlisting>
<para>
You can do without "--rebase", but we recommend that you rebase
your repository on the "master" repository all the time.
</para>
<para>
Configure with the options <option>--enable-debug
--enable-werror</option>. Enable as many plugins as possible,
@@ -90,8 +99,55 @@ foo(const char *abc, int xyz)
<para>
Don't mix several changes in one single patch. Create a
separate patch for every change. Tools like
<application>stgit</application> help you with that.
<application>stgit</application> help you with that. This way,
we can review your patches more easily, and we can pick the
patches we like most first.
</para>
<section>
<title> Basic stgit usage</title>
<para>
stgit allows you to create a set of patches and refine all of
them: you can go back to any patch at any time, and re-edit it
(both the code and the commit message). You can reorder
patches and insert new patches at any position. It encourages
creating separate patches for tiny changes.
</para>
<para>
stgit needs to be initialized on a git repository: stg init
</para>
<para>
Before you edit the code, create a patch: stg new
my-patch-name (stgit now asks you for the commit message).
</para>
<para>
Now edit the code. Once you're finished, you have to "refresh"
the patch, i.e. your edits are incorporated into the patch you
have created: stg refresh
</para>
<para>
You may now continue editing the same patch, and refresh it as
often as you like. Create more patches, edit and refresh them.
</para>
<para>
To view the list of patches, type stg series. To go back to a
specific patch, type stg goto my-patch-name; now you can
re-edit it (don't forget stg refresh when you're finished with
that patch).
</para>
<para>
When the whole patch series is finished, convert stgit patches
to git commits: stg commit
</para>
</section>
</chapter>
<chapter>

View File

@@ -31,7 +31,7 @@ PROJECT_NAME = MPD
# This could be handy for archiving the generated documentation or
# if some version control system is used.
PROJECT_NUMBER =
PROJECT_NUMBER = @VERSION@
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
# base path where the generated documentation will be put.
@@ -481,7 +481,7 @@ FILE_VERSION_FILTER =
# The QUIET tag can be used to turn on/off the messages that are generated
# by doxygen. Possible values are YES and NO. If left blank NO is used.
QUIET = NO
QUIET = YES
# The WARNINGS tag can be used to turn on/off the warning messages that are
# generated by doxygen. Possible values are YES and NO. If left blank
@@ -534,7 +534,7 @@ WARN_LOGFILE =
# directories like "/usr/src/myproject". Separate the files or directories
# with spaces.
INPUT = src
INPUT = @abs_top_srcdir@/src/
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
@@ -1158,7 +1158,7 @@ INCLUDE_FILE_PATTERNS =
# undefined via #undef or recursively expanded use the := operator
# instead of the = operator.
PREDEFINED = G_GNUC_UNUSED=
PREDEFINED =
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
# this tag can be used to specify a list of macro names that should be expanded.

View File

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

View File

@@ -3,8 +3,9 @@
mpd.conf \- Music Player Daemon configuration file
.SH DESCRIPTION
\fBmpd.conf\fP is the configuration file for mpd(1). If not specified on the
command line, MPD first searches for it at \fB~/.mpdconf\fP then at
\fB~/.mpd/mpd.conf\fP and then in \fB/etc/mpd.conf\fP.
command line, MPD first searches for it at \fB$XDG_CONFIG_HOME/mpd/mpd.conf\fP
then at \fB~/.mpdconf\fP then at \fB~/.mpd/mpd.conf\fP and then in
\fB/etc/mpd.conf\fP.
Lines beginning with a "#" character are comments. All other non-empty lines
specify parameters and their values. These lines contain the parameter name
@@ -27,31 +28,24 @@ paths.
See \fBdocs/mpdconf.example\fP in the source tarball for an example
configuration file.
This manual is not complete, it lists only the most important options.
Please read the MPD user manual for a complete configuration guide:
<\fBhttp://www.musicpd.org/doc/user/\fP>
.SH REQUIRED PARAMETERS
.TP
.B follow_outside_symlinks <yes or no>
Control if MPD will follow symbolic links pointing outside the music dir.
You must recreate the database after changing this option.
The default is "yes".
.TP
.B follow_inside_symlinks <yes or no>
Control if MPD will follow symbolic links pointing inside the music dir,
potentially adding duplicates to the database.
You must recreate the database after changing this option.
The default is "yes".
.TP
.B db_file <file>
This specifies where the db file will be stored.
.TP
.B sticker_file <file>
The location of the sticker database. This is a database which
manages dynamic information attached to songs.
.TP
.B log_file <file>
This specifies where the log file should be located.
The special value "syslog" makes MPD use the local syslog daemon.
.SH OPTIONAL PARAMETERS
.TP
.B sticker_file <file>
The location of the sticker database. This is a database which
manages dynamic information attached to songs.
.TP
.B pid_file <file>
This specifies the file to save mpd's process ID in.
.TP
@@ -69,6 +63,9 @@ mpd will be saved to this file when mpd is terminated by a TERM signal or by
the "kill" command. When mpd is restarted, it will read the state file and
restore the state of mpd (including the playlist).
.TP
.B restore_paused <yes or no>
Put MPD into pause mode instead of starting playback after startup.
.TP
.B user <username>
This specifies the user that MPD will run as, if set. MPD should
never run as root, and you may use this option to make MPD change its
@@ -80,8 +77,13 @@ This specifies which address mpd binds to and listens on. Multiple
bind_to_address parameters may be specified. The default is "any", which binds
to all available addresses.
To bind to a Unix domain socket, specify an absolute path. For a
system-wide MPD, we suggest the path "\fB/var/run/mpd/socket\fP".
You can set a port that is different from the global port setting,
e.g. "localhost:6602". IPv6 addresses must be enclosed in square
brackets if you want to configure a port, e.g. "[::1]:6602".
To bind to a Unix domain socket, specify an absolute path or a path starting
with a tilde (~). For a system-wide MPD, we suggest the path
"\fB/var/run/mpd/socket\fP".
.TP
.B port <port>
This specifies the port that mpd listens on. The default is 6600.
@@ -92,6 +94,17 @@ reports from what address a connection is opened, and when it is closed, and
"verbose" records excessive amounts of information for debugging purposes. The
default is "default".
.TP
.B follow_outside_symlinks <yes or no>
Control if MPD will follow symbolic links pointing outside the music dir.
You must recreate the database after changing this option.
The default is "yes".
.TP
.B follow_inside_symlinks <yes or no>
Control if MPD will follow symbolic links pointing inside the music dir,
potentially adding duplicates to the database.
You must recreate the database after changing this option.
The default is "yes".
.TP
.B zeroconf_enabled <yes or no>
If yes, and MPD has been compiled with support for Avahi or Bonjour, service
information will be published with Zeroconf. The default is yes.
@@ -129,6 +142,8 @@ 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
@@ -166,42 +181,25 @@ 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>).
documentation (available online at <\fBhttp://www.mega\-nerd.com/SRC/\fP>).
.TP
.B mixer_type <alsa, oss, software, hardware or disabled>
This specifies which mixer to use. The default is hardware and depends on
what audio output support mpd was built with. Options alsa and oss are
legacy and should not be used in new configs, but when set mixer_device
and mixer_control will apply.
.TP
.B mixer_device <mixer dev>
This specifies which mixer to use. The default for oss is
"/dev/mixer"; the default for alsa is "default". This global option is
deprecated and should not be used. Look at the mixer_device option of
corresponding output device instead.
.TP
.B mixer_control <mixer ctrl>
This specifies which mixer control to use (sometimes referred to as
the "device"). Examples of mixer controls are PCM, Line1, Master,
etc. An example for OSS is "Pcm", and an example for alsa is
"PCM". This global option is deprecated and should not be used. Look
at the mixer_control option of corresponding output device instead.
.TP
.B replaygain <album or track>
.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
volume using the album's ReplayGain tags, while setting it to "track" will
adjust it using the track ReplayGain tags. Currently only FLAC, Ogg Vorbis,
Musepack, and MP3 (through ID3v2 ReplayGain tags, not APEv2) are supported.
adjust it using the track ReplayGain tags. "auto" uses the track ReplayGain
tags if random play is activated otherwise the album ReplayGain tags. Currently
only FLAC, Ogg Vorbis, Musepack, and MP3 (through ID3v2 ReplayGain tags, not
APEv2) are supported.
.TP
.B replaygain_preamp <-15 to 15>
.B replaygain_preamp <\-15 to 15>
This is the gain (in dB) applied to songs with ReplayGain tags.
.TP
.B volume_normalization <yes or no>
If yes, mpd will normalize the volume of songs as they play. The default is no.
.TP
.B audio_buffer_size <size in KiB>
This specifies the size of the audio buffer in kibibytes. The default is 2048,
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%>
@@ -224,7 +222,7 @@ default is 5.
.TP
.B max_playlist_length <number>
This specifies the maximum number of songs that can be in the playlist. The
default is 4096.
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.
@@ -235,12 +233,12 @@ is 8192.
.TP
.B filesystem_charset <charset>
This specifies the character set used for the filesystem. A list of supported
character sets can be obtained by running "iconv -l". The default is
character sets can be obtained by running "iconv \-l". The default is
determined from the locale when the db was originally created.
.TP
.B id3v1_encoding <charset>
This specifies the character set which ID3v1 tags are encoded in. A list of
supported character sets can be obtained by running "iconv -l". The default is
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
@@ -260,16 +258,37 @@ when saving playlists. The default is "no".
This specifies the tag types that will be scanned for and made available to
clients. Note that you must recreate (not update) your database for changes to
this parameter to take effect. Possible values are artist, album, title,
track, name, genre, date, composer, performer, comment, and disc. Multiple
tags may be specified as a comma separated list. An example value is
"artist,album,title,track". The special value "none" may be used alone to
disable all metadata. The default is to use all known tag types except for
comments.
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
of database.
.TP
.B auto_update_depth <N>
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>
This specifies the audio output type. See the list of supported outputs in mpd
--version for possible values.
\-\-version for possible values.
.TP
.B name <name>
This specifies a unique name for the audio output.
@@ -280,11 +299,25 @@ This specifies the sample rate, bits per sample, and number of channels of
audio that is sent to the audio output device. See documentation for the
\fBaudio_output_format\fP parameter for more details. The default is to use
whatever audio format is passed to the audio output.
Any of the three attributes may be an asterisk to specify that this
attribute should not be enforced
.TP
.B replay_gain_handler <software, mixer or none>
Specifies how replay gain is applied. The default is "software",
which uses an internal software volume control. "mixer" uses the
configured (hardware) mixer control. "none" disables replay gain on
this audio output.
.SH OPTIONAL ALSA OUTPUT PARAMETERS
.TP
.B device <dev>
This specifies the device to use for audio output. The default is "default".
.TP
.B mixer_type <hardware, software or none>
Specifies which mixer should be used for this audio output: the
hardware mixer (available for ALSA, OSS and PulseAudio), the software
mixer or no mixer ("none"). By default, the hardware mixer is used
for devices which support it, and none for the others.
.TP
.B mixer_device <mixer dev>
This specifies which mixer to use. The default is "default". To use
the second sound card in a system, use "hw:1".
@@ -352,13 +385,12 @@ after another until it successfully establishes a connection.
.TP
.B sink <sink>
The sink to output to. The default is to let PulseAudio choose a sink.
.SH REQUIRED JACK OUTPUT PARAMETERS
.SH OPTIONAL JACK OUTPUT PARAMETERS
.TP
.B name <name>
.B client_name <name>
The client name to use when connecting to JACK. The output ports <name>:left
and <name>:right will also be created for the left and right channels,
respectively.
.SH OPTIONAL JACK OUTPUT PARAMETERS
.TP
.B ports <left_port,right_port>
This specifies the left and right ports to connect to for the left and right
@@ -457,6 +489,9 @@ connect to the icecast server. The default is 2 seconds.
.B description <description>
This specifies a description of the stream.
.TP
.B url <url>
This specifies a URL associated with the stream.
.TP
.B genre <genre>
This specifies the genre(s) of the stream.
.SH FILES

View File

@@ -1,5 +1,5 @@
# An example configuration file for MPD
# See the mpd.conf man page for a more detailed description of each parameter.
# An example configuration file for MPD.
# Read the user manual for documentation: http://www.musicpd.org/doc/user/
# Files and directories #######################################################
@@ -49,6 +49,11 @@
#
#state_file "~/.mpd/state"
#
# The location of the sticker database. This is a database which
# manages dynamic information attached to songs.
#
#sticker_file "~/.mpd/sticker.sql"
#
###############################################################################
@@ -61,6 +66,13 @@
#
#user "nobody"
#
# This setting specifies the group that MPD will run as. If not specified
# primary group of user specified with "user" setting will be used (if set).
# This is useful if MPD needs to be a member of group such as "audio" to
# have permission to use sound card.
#
#group "nogroup"
#
# 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.
@@ -91,17 +103,31 @@
#
#gapless_mp3_playback "yes"
#
# Setting "restore_paused" to "yes" puts MPD into pause mode instead
# of starting playback after startup.
#
#restore_paused "no"
#
# This setting enables MPD to create playlists in a format usable by other
# music players.
#
#save_absolute_paths_in_playlists "no"
#
# This setting defines a list of tag types that will be extracted during the
# audio file discovery process. Optionally, 'comment' can be added to this
# list.
#
# This setting defines a list of tag types that will be extracted during the
# audio file discovery process. The complete list of possible values can be
# found in the mpd.conf man page.
#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
# music_directory are changed.
#
#auto_update "yes"
#
# Limit the depth of the directories being watched, 0 means only watch
# the music directory itself. There is no limit by default.
#
#auto_update_depth "3"
#
###############################################################################
@@ -149,6 +175,15 @@
###############################################################################
# Database #######################################################################
#
#database {
# plugin "proxy"
# host "other.mpd.host"
# port "6600"
#}
# Input #######################################################################
#
@@ -169,9 +204,6 @@ input {
# blocks. Setting this block is optional, though the server will only attempt
# autodetection for one sound card.
#
# See <http://mpd.wikia.com/wiki/Configuration#Audio_Outputs> for examples of
# other audio outputs.
#
# An example of an ALSA output:
#
#audio_output {
@@ -179,6 +211,7 @@ input {
# name "My ALSA Device"
## device "hw:0,0" # optional
## format "44100:16:2" # optional
## mixer_type "hardware" # optional
## mixer_device "default" # optional
## mixer_control "PCM" # optional
## mixer_index "0" # optional
@@ -191,6 +224,7 @@ input {
# name "My OSS Device"
## device "/dev/dsp" # optional
## format "44100:16:2" # optional
## mixer_type "hardware" # optional
## mixer_device "/dev/mixer" # optional
## mixer_control "PCM" # optional
#}
@@ -211,9 +245,23 @@ input {
## protocol "icecast2" # optional
## user "source" # optional
## description "My Stream Description" # optional
## url "http://example.com" # optional
## genre "jazz" # optional
## public "no" # optional
## timeout "2" # optional
## mixer_type "software" # optional
#}
#
# An example of a recorder output:
#
#audio_output {
# type "recorder"
# name "My recorder"
# encoder "vorbis" # optional, vorbis or lame
# path "/var/lib/mpd/recorder/mpd.ogg"
## quality "5.0" # do not define if bitrate is defined
# bitrate "128" # do not define if quality is defined
# format "44100:16:1"
#}
#
# An example of a httpd output (built-in HTTP streaming server):
@@ -223,9 +271,11 @@ input {
# name "My HTTP Stream"
# encoder "vorbis" # optional, vorbis or lame
# port "8000"
# bind_to_address "0.0.0.0" # optional, IPv4 or IPv6
## quality "5.0" # do not define if bitrate is defined
# bitrate "128" # do not define if quality is defined
# format "44100:16:1"
# max_clients "0" # optional 0=no limit
#}
#
# An example of a pulseaudio output (streaming to a remote pulseaudio server)
@@ -237,6 +287,25 @@ input {
## sink "remote_server_sink" # optional
#}
#
# An example of a winmm output (Windows multimedia API).
#
#audio_output {
# type "winmm"
# name "My WinMM output"
## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
# or
## device "0" # optional
## mixer_type "hardware" # optional
#}
#
# An example of an openal output.
#
#audio_output {
# type "openal"
# name "My OpenAL output"
## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
#}
#
## Example "pipe" output:
#
#audio_output {
@@ -255,6 +324,7 @@ input {
#audio_output {
# type "null"
# name "My Null Output"
# mixer_type "none" # optional
#}
#
# This setting will change all decoded audio to be converted to the specified
@@ -273,38 +343,14 @@ input {
###############################################################################
# Volume control mixer ########################################################
#
# These are the global volume control settings. By default, this setting will
# be detected to the available audio output device, with preference going to
# hardware mixing. Hardware and software mixers for individual audio_output
# sections cannot yet be mixed.
#
# An example for controlling an ALSA, OSS or Pulseaudio mixer; If this
# setting is used other sound applications will be affected by the volume
# being controlled by MPD.
#
#mixer_type "hardware"
#
# An example for controlling all mixers through software. This will control
# all controls, even if the mixer is not supported by the device and will not
# affect any other sound producing applications.
#
#mixer_type "software"
#
# This example will not allow MPD to touch the mixer at all and will disable
# all volume controls.
#
#mixer_type "disabled"
#
###############################################################################
# Normalization automatic volume adjustments ##################################
#
# This setting specifies the type of ReplayGain to use. This setting can have
# the argument "album" or "track". See <http://www.replaygain.org> for more
# details. This setting is disabled by default.
# the argument "off", "album", "track" or "auto". "auto" is a special mode that
# chooses between "track" and "album" depending on the current state of
# random playback. If random playback is enabled then "track" mode is used.
# See <http://www.replaygain.org> for more details about ReplayGain.
# This setting is off by default.
#
#replaygain "album"
#
@@ -313,6 +359,20 @@ input {
#
#replaygain_preamp "0"
#
# This setting sets the pre-amp used for files that do NOT have ReplayGain tags.
# By default this setting is disabled.
#
#replaygain_missing_preamp "0"
#
# This setting enables or disables ReplayGain limiting.
# MPD calculates actual amplification based on the ReplayGain tags
# and replaygain_preamp / replaygain_missing_preamp setting.
# If replaygain_limit is enabled MPD will never amplify audio signal
# above its original level. If replaygain_limit is disabled such amplification
# might occur. By default this setting is enabled.
#
#replaygain_limit "yes"
#
# This setting enables on-the-fly normalization volume adjustment. This will
# result in the volume of all playing audio to be adjusted so the output has
# equal "loudness". This setting is disabled by default.
@@ -328,7 +388,7 @@ input {
# this may have undesired effects. Don't change this if you don't know what you
# are doing.
#
#audio_buffer_size "2048"
#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,
@@ -353,12 +413,10 @@ input {
#
###############################################################################
# Character Encoding ##########################################################
#
# If file or directory names do not display correctly for your locale then you
# may need to modify this setting. After modification of this setting mpd
# --create-db must be run to change the database.
# may need to modify this setting.
#
#filesystem_charset "UTF-8"
#
@@ -367,3 +425,29 @@ input {
#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

@@ -8,22 +8,58 @@
<title>General protocol syntax</title>
<section>
<title>Requests</title>
<title>Protocol overview</title>
<para>
If arguments contain spaces, they should be surrounded by double quotation
marks.
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.
</para>
<para>
The client transmits a command sequence, terminated by the
newline character <constant>\n</constant>. The server will
respond with one or more lines, the last of which will be a
completion code.
</para>
<para>
When the client connects to the server, the server will answer
with the following line:
<synopsis>OK MPD version</synopsis>
where <varname>version</varname> is a version identifier such as
0.12.2. This version identifier is the version of the protocol
spoken, not the real version of the daemon. (There is no way to
retrieve this real version identifier from the connection.)
</para>
</section>
<section>
<title>Requests</title>
<cmdsynopsis>
<command>COMMAND</command>
<arg rep="repeat"><replaceable>ARG</replaceable></arg>
</cmdsynopsis>
<para>
If arguments contain spaces, they should be surrounded by double
quotation marks.
</para>
<para>
Argument strings are separated from the command and any other
arguments by linear white-space (' ' or '\t').
</para>
<para>
All data between the client and the server is encoded in
UTF-8. (Note: In UTF-8 all standard ansi characters, 0-127 are
the same as a standard ansi encoding. Also, no ansi character
the same as in standard ansi encoding. Also, no ansi character
appears in any multi-byte characters. So, you can use
standard C functions like <function>strlen</function>, and
<function>strcpy</function> just fine with UTF-8 encoded
@@ -38,13 +74,97 @@
<title>Responses</title>
<para>
A command returns <returnvalue>OK</returnvalue> on completion
or <returnvalue>ACK some error</returnvalue> on failure.
These denote the end of command execution.
A command returns <returnvalue>OK</returnvalue> on completion or
<returnvalue>ACK some error</returnvalue> on failure. These
denote the end of command execution.
</para>
<section>
<title>Failure responses</title>
<para>
The nature of the error can be gleaned from the information
that follows the <returnvalue>ACK</returnvalue>.
<returnvalue>ACK</returnvalue> lines are of the form:
<synopsis>ACK [error@command_listNum] {current_command} message_text\n</synopsis>
These responses are generated by a call to
<function>commandError</function>. They contain four separate
terms. Let's look at each of them:
<itemizedlist>
<listitem>
<para>
<returnvalue>error</returnvalue>: numeric value of one
of the <constant>ACK_ERROR</constant> constants defined
in <filename>ack.h</filename>.
</para>
</listitem>
<listitem>
<para>
<returnvalue>command_listNum</returnvalue>:
offset of the command that caused the error in a <link
linkend="command_lists">Command List</link>.
An error will always cause a command list to terminate
at the command that causes the error.
</para>
</listitem>
<listitem>
<para>
<returnvalue>current_command</returnvalue>:
name of the command, in a <link
linkend="command_lists">Command List</link>,
that was executing when the error occurred.
</para>
</listitem>
<listitem>
<para>
<returnvalue>message_text</returnvalue>:
some (hopefully) informative text that describes the
nature of the error.
</para>
</listitem>
</itemizedlist>
</para>
<example>
<title>foo</title>
<para>
An example might help. Consider the following sequence
sent from the client to the server.
<synopsis>
command_list_begin
volume 86
play 10240
status
command_list_end
</synopsis>
</para>
<para>
The server responds with:
<returnvalue>
ACK [50@1] {play} song doesn't exist: "10240"
</returnvalue>
</para>
<para>
This tells us that the play command, which was the
second in the list (the first or only command is
numbered 0), failed with error 50. The number 50
translates to <constant>ACK_ERROR_NO_EXIST</constant>--the
song doesn't exist. This is reiterated by the message text
which also tells us which song doesn't exist.
</para>
</example>
</section>
</section>
<section>
<section id="command_lists">
<title>Command lists</title>
<para>
@@ -67,6 +187,61 @@
successful command executed in the command list.
</para>
</section>
<section>
<title>Ranges</title>
<para>
Some commands (e.g. <link
linkend="command_delete"><command>delete</command></link>)
allow specifying a range in the form
<parameter>START:END</parameter> (the <varname>END</varname>
item is not included in the range, similar to ranges in the
Python programming language). If <varname>END</varname> is
omitted, then the maximum possible value is assumed.
</para>
</section>
</chapter>
<chapter>
<title>Recipes</title>
<section>
<title>Queuing</title>
<para>
Often, users run MPD 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
"priority" for each song in the playlist (commands <link
linkend="command_prio"><command>prio</command></link> and
<link
linkend="command_prioid"><command>prioid</command></link>). A
higher priority means that the song is going to be played
before the other songs.
</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.
</para>
</section>
</chapter>
<chapter>
@@ -123,7 +298,7 @@
</term>
<listitem>
<para>
<footnote id="since_0_14"><simpara>Since MPD 0.14</simpara></footnote>
<footnote id="since_0_14"><simpara>Introduced with MPD 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
@@ -137,6 +312,15 @@
has been modified after <command>update</command>.
</para>
</listitem>
<listitem>
<para>
<returnvalue>update</returnvalue>: a database update
has started or finished. If the database was
modified during the update, the
<returnvalue>database</returnvalue> event is also
emitted.
</para>
</listitem>
<listitem>
<para>
<returnvalue>stored_playlist</returnvalue>: a stored
@@ -172,7 +356,26 @@
<para>
<returnvalue>options</returnvalue>: options like
<option>repeat</option>, <option>random</option>,
<option>crossfade</option>
<option>crossfade</option>, replay gain
</para>
</listitem>
<listitem>
<para>
<returnvalue>sticker</returnvalue>: the sticker database
has been modified.
</para>
</listitem>
<listitem>
<para>
<returnvalue>subscription</returnvalue>: a client
has subscribed or unsubscribed to a channel
</para>
</listitem>
<listitem>
<para>
<returnvalue>message</returnvalue>: a message was
received on a channel this client is subscribed to;
this event is only emitted when the queue is empty
</para>
</listitem>
</itemizedlist>
@@ -191,9 +394,6 @@
MPD will only send notifications when something changed in
one of the specified subsytems.
</para>
<simpara>
Since <application>MPD</application> 0.14
</simpara>
</listitem>
</varlistentry>
<varlistentry id="command_status">
@@ -220,18 +420,24 @@
<returnvalue>0 or 1</returnvalue>
</para>
</listitem>
<listitem>
<para>
<varname>random</varname>:
<returnvalue>0 or 1</returnvalue>
</para>
</listitem>
<listitem>
<para>
<varname>single</varname>:
<footnote id="since_0_15"><simpara>Introduced with MPD 0.15</simpara></footnote>
<returnvalue>0 or 1</returnvalue>
<footnote id="since_0_15"><simpara>Since MPD 0.15</simpara></footnote>
</para>
</listitem>
<listitem>
<para>
<varname>consume</varname>:
<returnvalue>0 or 1</returnvalue>
<footnoteref linkend="since_0_15"/>
<returnvalue>0 or 1</returnvalue>
</para>
</listitem>
<listitem>
@@ -295,6 +501,16 @@
playing/paused song)</returnvalue>
</para>
</listitem>
<listitem>
<para>
<varname>elapsed</varname>:
<footnote id="since_0_16"><simpara>Introduced with MPD 0.16</simpara></footnote>
<returnvalue>
Total time elapsed within the current song, but
with higher resolution.
</returnvalue>
</para>
</listitem>
<listitem>
<para>
<varname>bitrate</varname>:
@@ -308,6 +524,18 @@
<returnvalue>crossfade in seconds</returnvalue>
</para>
</listitem>
<listitem>
<para>
<varname>mixrampdb</varname>:
<returnvalue>mixramp threshold in dB</returnvalue>
</para>
</listitem>
<listitem>
<para>
<varname>mixrampdelay</varname>:
<returnvalue>mixrampdelay in seconds</returnvalue>
</para>
</listitem>
<listitem>
<para>
<varname>audio</varname>:
@@ -316,7 +544,7 @@
</listitem>
<listitem>
<para>
<varname>updatings_db</varname>:
<varname>updating_db</varname>:
<returnvalue>job id</returnvalue>
</para>
</listitem>
@@ -412,6 +640,32 @@
</para>
</listitem>
</varlistentry>
<varlistentry id="command_mixrampdb">
<term>
<cmdsynopsis>
<command>mixrampdb</command>
<arg choice="req"><replaceable>deciBels</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Sets the threshold at which songs will be overlapped. Like crossfading but doesn't fade the track volume, just overlaps. The songs need to have MixRamp tags added by an external tool. 0dB is the normalized maximum volume so use negative values, I prefer -17dB. In the absence of mixramp tags crossfading will be used. See http://sourceforge.net/projects/mixramp
</para>
</listitem>
</varlistentry>
<varlistentry id="command_mixrampdelay">
<term>
<cmdsynopsis>
<command>mixrampdelay</command>
<arg choice="req"><replaceable>SECONDS</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Additional time subtracted from the overlap calculated by mixrampdb. A value of "nan" disables MixRamp overlapping and falls back to crossfading.
</para>
</listitem>
</varlistentry>
<varlistentry id="command_random">
<term>
<cmdsynopsis>
@@ -471,6 +725,49 @@
</para>
</listitem>
</varlistentry>
<varlistentry id="command_replay_gain_mode">
<term>
<cmdsynopsis>
<command>replay_gain_mode</command>
<arg choice="req"><replaceable>MODE</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Sets the replay gain mode. One of
<parameter>off</parameter>,
<parameter>track</parameter>,
<parameter>album</parameter>,
<parameter>auto</parameter><footnote
id="replay_gain_auto_since_0_16">
<simpara>added in MPD 0.16</simpara>
</footnote>.
</para>
<para>
Changing the mode during playback may take several
seconds, because the new settings does not affect the
buffered data.
</para>
<para>
This command triggers the
<returnvalue>options</returnvalue> idle event.
</para>
</listitem>
</varlistentry>
<varlistentry id="command_replay_gain_status">
<term>
<cmdsynopsis>
<command>replay_gain_status</command>
</cmdsynopsis>
</term>
<listitem>
<para>
Prints replay gain options. Currently, only the
variable <varname>replay_gain_mode</varname> is
returned.
</para>
</listitem>
</varlistentry>
<varlistentry id="command_volume">
<term>
<cmdsynopsis>
@@ -600,6 +897,23 @@
</para>
</listitem>
</varlistentry>
<varlistentry id="command_seekcur">
<term>
<cmdsynopsis>
<command>seekcur</command>
<arg choice="req"><replaceable>TIME</replaceable></arg>
</cmdsynopsis>
</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.
</para>
</listitem>
</varlistentry>
<varlistentry id="command_stop">
<term>
<cmdsynopsis>
@@ -648,10 +962,7 @@
</para>
<para>
<varname>URI</varname> is always a single file or
URL. <varname>POSITION</varname> is optional, a
negative number means it is relative to the currently
playing song in the playlist (if there is one).
For example:
URL. For example:
</para>
<screen>
addid "foo.mp3"
@@ -676,7 +987,10 @@ OK
<term>
<cmdsynopsis>
<command>delete</command>
<arg choice="req"><replaceable>SONGPOS</replaceable></arg>
<group>
<arg choice="req"><replaceable>POS</replaceable></arg>
<arg choice="req"><replaceable>START:END</replaceable></arg>
</group>
</cmdsynopsis>
</term>
<listitem>
@@ -859,6 +1173,46 @@ OK
</para>
</listitem>
</varlistentry>
<varlistentry id="command_prio">
<term>
<cmdsynopsis>
<command>prio</command>
<arg choice="req"><replaceable>PRIORITY</replaceable></arg>
<arg choice="req" rep="repeat"><replaceable>START:END</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Set the priority of the specified songs. A higher
priority means that it will be played first when
"random" mode is enabled.
</para>
<para>
A priority is an integer between 0 and 255. The default
priority of new songs is 0.
</para>
</listitem>
</varlistentry>
<varlistentry id="command_prioid">
<term>
<cmdsynopsis>
<command>prioid</command>
<arg choice="req"><replaceable>PRIORITY</replaceable></arg>
<arg choice="req" rep="repeat"><replaceable>ID</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Same as <link
linkend="command_prio"><command>prio</command></link>,
but address the songs with their id.
</para>
</listitem>
</varlistentry>
<varlistentry id="command_shuffle">
<term>
<cmdsynopsis>
@@ -910,6 +1264,20 @@ OK
<section>
<title>Stored playlists</title>
<para>
Playlists are stored inside the configured playlist directory.
They are addressed with their file name (without the directory
and without the <filename>.m3u</filename> suffix).
</para>
<para>
Some of the commands described in this section can be used to
run playlist plugins instead of the hard-coded simple
<filename>m3u</filename> parser. They can access playlists in
the music directory (relative path including the suffix) or
remote playlists (absolute URI with a supported scheme).
</para>
<variablelist>
<varlistentry id="command_listplaylist">
<term>
@@ -920,8 +1288,8 @@ OK
</term>
<listitem>
<para>
Lists the files in the playlist
<filename>NAME.m3u</filename>.
Lists the songs in the playlist. Playlist plugins are
supported.
</para>
</listitem>
</varlistentry>
@@ -934,7 +1302,8 @@ OK
</term>
<listitem>
<para>
Lists songs in the playlist <filename>NAME.m3u</filename>.
Lists the songs with metadata in the playlist. Playlist
plugins are supported.
</para>
</listitem>
</varlistentry>
@@ -962,12 +1331,14 @@ OK
<cmdsynopsis>
<command>load</command>
<arg choice="req"><replaceable>NAME</replaceable></arg>
<arg choice="opt"><replaceable>START:END</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Loads the playlist <filename>NAME.m3u</filename> from
the playlist directory.
Loads the playlist into the current queue. Playlist
plugins are supported. A range may be specified to load
only a part of the playlist.
</para>
</listitem>
</varlistentry>
@@ -1105,16 +1476,39 @@ OK
<command>find</command>
<arg choice="req"><replaceable>TYPE</replaceable></arg>
<arg choice="req"><replaceable>WHAT</replaceable></arg>
<arg choice="opt"><replaceable>...</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Finds songs in the db that are exactly
<varname>WHAT</varname>. <varname>TYPE</varname> should
be <parameter>album</parameter>,
<parameter>artist</parameter>, or
<parameter>title</parameter>. <varname>WHAT</varname>
is what to find.
<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
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.
</para>
</listitem>
</varlistentry>
<varlistentry id="command_findadd">
<term>
<cmdsynopsis>
<command>findadd</command>
<arg choice="req"><replaceable>TYPE</replaceable></arg>
<arg choice="req"><replaceable>WHAT</replaceable></arg>
<arg choice="opt"><replaceable>...</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Finds songs in the db that are exactly
<varname>WHAT</varname> and adds them to current playlist.
Parameters have the same meaning as for <command>find</command>.
</para>
</listitem>
</varlistentry>
@@ -1129,7 +1523,8 @@ OK
<listitem>
<para>
Lists all tags of the specified type.
<varname>TYPE</varname> should be album or artist.
<varname>TYPE</varname> can be any tag supported by MPD or
<parameter>file</parameter>.
</para>
<para>
<varname>ARTIST</varname> is an optional parameter when
@@ -1184,6 +1579,37 @@ OK
the list of stored playlists. This behavior is
deprecated; use "listplaylists" instead.
</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:///").
</para>
</listitem>
</varlistentry>
<varlistentry id="command_readcomments">
<term>
<cmdsynopsis>
<command>readcomments</command>
<arg><replaceable>URI</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<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".
</para>
<para>
The response consists of lines in the form "KEY: VALUE".
Comments with suspicious characters (e.g. newlines) are
ignored silently.
</para>
<para>
The meaning of these depends on the codec, and not all
decoder plugins support it. For example, on Ogg files,
this lists the Vorbis comments.
</para>
</listitem>
</varlistentry>
<varlistentry id="command_search">
@@ -1192,17 +1618,60 @@ OK
<command>search</command>
<arg choice="req"><replaceable>TYPE</replaceable></arg>
<arg choice="req"><replaceable>WHAT</replaceable></arg>
<arg choice="opt"><replaceable>...</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Searches for any song that contains
<varname>WHAT</varname>. <varname>TYPE</varname> can be
<parameter>title</parameter>,
<parameter>artist</parameter>,
<parameter>album</parameter> or
<parameter>filename</parameter>. Search is not case
sensitive.
<varname>WHAT</varname>. Parameters have the same meaning
as for <command>find</command>, except that search is not
case sensitive.
</para>
</listitem>
</varlistentry>
<varlistentry id="command_searchadd">
<term>
<cmdsynopsis>
<command>searchadd</command>
<arg choice="req"><replaceable>TYPE</replaceable></arg>
<arg choice="req"><replaceable>WHAT</replaceable></arg>
<arg choice="opt"><replaceable>...</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Searches for any song that contains <varname>WHAT</varname>
in tag <varname>TYPE</varname> and adds them to current playlist.
</para>
<para>
Parameters have the same meaning as for <command>find</command>,
except that search is not case sensitive.
</para>
</listitem>
</varlistentry>
<varlistentry id="command_searchaddpl">
<term>
<cmdsynopsis>
<command>searchaddpl</command>
<arg choice="req"><replaceable>NAME</replaceable></arg>
<arg choice="req"><replaceable>TYPE</replaceable></arg>
<arg choice="req"><replaceable>WHAT</replaceable></arg>
<arg choice="opt"><replaceable>...</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Searches for any song that contains <varname>WHAT</varname>
in tag <varname>TYPE</varname> and adds them to the playlist
named <varname>NAME</varname>.
</para>
<para>
If a playlist by that name doesn't exist it is created.
</para>
<para>
Parameters have the same meaning as for <command>find</command>,
except that search is not case sensitive.
</para>
</listitem>
</varlistentry>
@@ -1231,6 +1700,20 @@ OK
</para>
</listitem>
</varlistentry>
<varlistentry id="command_rescan">
<term>
<cmdsynopsis>
<command>rescan</command>
<arg choice="opt"><replaceable>URI</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Same as <command>update</command>, but also rescans
unmodified files.
</para>
</listitem>
</varlistentry>
</variablelist>
</section>
@@ -1366,7 +1849,10 @@ OK
</term>
<listitem>
<para>
Closes the connection to MPD.
Closes the connection to MPD. MPD 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.
</para>
</listitem>
</varlistentry>
@@ -1420,6 +1906,7 @@ OK
<term>
<cmdsynopsis>
<command>disableoutput</command>
<arg choice="req"><replaceable>ID</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
@@ -1432,6 +1919,7 @@ OK
<term>
<cmdsynopsis>
<command>enableoutput</command>
<arg choice="req"><replaceable>ID</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
@@ -1440,6 +1928,20 @@ OK
</para>
</listitem>
</varlistentry>
<varlistentry id="command_toggleoutput">
<term>
<cmdsynopsis>
<command>toggleoutput</command>
<arg choice="req"><replaceable>ID</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Turns an output on or off, depending on the current
state.
</para>
</listitem>
</varlistentry>
<varlistentry id="command_outputs">
<term>
<cmdsynopsis>
@@ -1459,6 +1961,47 @@ OK
<title>Reflection</title>
<variablelist>
<varlistentry id="command_config">
<term>
<cmdsynopsis>
<command>config</command>
</cmdsynopsis>
</term>
<listitem>
<para>
Dumps configuration values that may be interesting for
the client. This command is only permitted to "local"
clients (connected via UNIX domain socket).
</para>
<para>
The following response attributes are available:
</para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>
Name
</entry>
<entry>
Description
</entry>
</row>
</thead>
<tbody>
<row>
<entry>
<varname>music_directory</varname>
</entry>
<entry>
The absolute path of the music directory.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</listitem>
</varlistentry>
<varlistentry id="command_commands">
<term>
<cmdsynopsis>
@@ -1508,6 +2051,125 @@ OK
</para>
</listitem>
</varlistentry>
<varlistentry id="command_decoders">
<term>
<cmdsynopsis>
<command>decoders</command>
</cmdsynopsis>
</term>
<listitem>
<para>
Print a list of decoder plugins, followed by their
supported suffixes and MIME types. Example response:
</para>
<programlisting>plugin: mad
suffix: mp3
suffix: mp2
mime_type: audio/mpeg
plugin: mpcdec
suffix: mpc</programlisting>
</listitem>
</varlistentry>
</variablelist>
</section>
<section>
<title>Client to client</title>
<para>
Clients can communicate with each others over "channels". A
channel is created by a client subscribing to it. More than
one client can be subscribed to a channel at a time; all of
them will receive the messages which get sent to it.
</para>
<para>
Each time a client subscribes or unsubscribes, the global idle
event <varname>subscription</varname> is generated. In
conjunction with the <command>channels</command> command, this
may be used to auto-detect clients providing additional
services.
</para>
<para>
New messages are indicated by the <varname>message</varname>
idle event.
</para>
<variablelist>
<varlistentry id="command_subscribe">
<term>
<cmdsynopsis>
<command>subscribe</command>
<arg choice="req"><replaceable>NAME</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Subscribe to a channel. The channel is created if it
does not exist already. The name may consist of
alphanumeric ASCII characters plus underscore, dash, dot
and colon.
</para>
</listitem>
</varlistentry>
<varlistentry id="command_unsubscribe">
<term>
<cmdsynopsis>
<command>unsubscribe</command>
<arg choice="req"><replaceable>NAME</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Unsubscribe from a channel.
</para>
</listitem>
</varlistentry>
<varlistentry id="command_channels">
<term>
<cmdsynopsis>
<command>channels</command>
</cmdsynopsis>
</term>
<listitem>
<para>
Obtain a list of all channels. The response is a list
of "channel:" lines.
</para>
</listitem>
</varlistentry>
<varlistentry id="command_readmessages">
<term>
<cmdsynopsis>
<command>readmessages</command>
</cmdsynopsis>
</term>
<listitem>
<para>
Reads messages for this client. The response is a list
of "channel:" and "message:" lines.
</para>
</listitem>
</varlistentry>
<varlistentry id="command_sendmessage">
<term>
<cmdsynopsis>
<command>sendmessage</command>
<arg choice="req"><replaceable>CHANNEL</replaceable></arg>
<arg choice="req"><replaceable>TEXT</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Send a message to the specified channel.
</para>
</listitem>
</varlistentry>
</variablelist>
</section>
</chapter>

View File

@@ -1,91 +0,0 @@
<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"docbook/dtd/xml/4.2/docbookx.dtd">
<book>
<title>The Music Player Daemon Sticker Database</title>
<chapter>
<title>Introduction to MPD's Sticker Database</title>
<para>
This document shell give a short guideline for recommended tags
for use in MPD's Sticker Database.
MPD's Sticker Database is a subsystem that enables users to add
custom tags. MPD does not alter the media files.
</para>
</chapter>
<chapter>
<title>Guideline for recommended tags</title>
<para>
Since there is no standard for tags in media files, this
document is trying to give you some help deciding what tags to
use. The selection of these tags tries to cover the most
widely used tags. This way the tags might still work in other
players, if you sync the database with your original media
files.
Keep in mind that we stick with lower case tags with underscores
instead of spaces. If there will be a Sync tool in future
its easy to change this on the fly, if needed.
</para>
<variablelist>
<varlistentry>
<term><varname>rating</varname></term>
<listitem>
<para>
Will store a rating value from 1 (worst) to 5 (best) for a
given song.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>album_rating</varname></term>
<listitem>
<para>
Will store a rating value from 1 (worst) to 5 (best) for a
given album.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>style</varname></term>
<listitem>
<para>
This tag is used to keep the Genre tag clean, by now
having 1000's of genres. Instead you define a Main Genre
for each file and can make a more specific
description. This should be one Keyword like "Post Punk"
or "Progressive Death Metal" An Alternative name for this
tag is "Subgenre", time will tell which one gets more
support.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>lyrics</varname></term>
<listitem>
<para>
This one is self explaining. This gives the option to
store lyrics of a song where they belong to: mapped to the
song
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>similar_artists</varname> (Comma seperated list of artists)</term>
<listitem>
<para>
This tag enables a last.fm alike aproach which will still
work when being offline Keep in mind, that this tag is
absolutely non-standard! I am not aware of any other
player that uses a comparable tag.
</para>
</listitem>
</varlistentry>
</variablelist>
</chapter>
</book>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,63 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_append_compile_flags.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS])
#
# DESCRIPTION
#
# For every FLAG1, FLAG2 it is checked whether the compiler works with the
# flag. If it does, the flag is added FLAGS-VARIABLE
#
# If FLAGS-VARIABLE is not specified, the current language's flags (e.g.
# CFLAGS) is used. During the check the flag is always added to the
# current language's flags.
#
# If EXTRA-FLAGS is defined, it is added to the current language's default
# flags (e.g. CFLAGS) when the check is done. The check is thus made with
# 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.
#
# 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.
#
# LICENSE
#
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.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 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 2
AC_DEFUN([AX_APPEND_COMPILE_FLAGS],
[for flag in $1; do
AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3])
done
])dnl AX_APPEND_COMPILE_FLAGS

69
m4/ax_append_flag.m4 Normal file
View File

@@ -0,0 +1,69 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_append_flag.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE])
#
# DESCRIPTION
#
# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space
# added in between.
#
# If FLAGS-VARIABLE is not specified, the current language's flags (e.g.
# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains
# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly
# FLAG.
#
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION.
#
# LICENSE
#
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.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 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 2
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"])])
AS_VAR_POPDEF([FLAGS])dnl
])dnl AX_APPEND_FLAG

View File

@@ -0,0 +1,61 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_append_link_flags.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_APPEND_LINK_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS])
#
# DESCRIPTION
#
# For every FLAG1, FLAG2 it is checked whether the linker works with the
# flag. If it does, the flag is added FLAGS-VARIABLE
#
# If FLAGS-VARIABLE is not specified, the linker's flags (LDFLAGS) is
# used. During the check the flag is always added to the linker's flags.
#
# If EXTRA-FLAGS is defined, it is added to the linker's default flags
# when the check is done. The check is thus made with the flags: "LDFLAGS
# EXTRA-FLAGS FLAG". This can for example be used to force the linker to
# issue an error when a bad flag is given.
#
# 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.
#
# LICENSE
#
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.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 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 2
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])
done
])dnl AX_APPEND_LINK_FLAGS

View File

@@ -0,0 +1,72 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS])
#
# DESCRIPTION
#
# Check whether the given FLAG works with the current language's compiler
# or gives an error. (Warnings, however, are ignored)
#
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
# success/failure.
#
# If EXTRA-FLAGS is defined, it is added to the current language's default
# flags (e.g. CFLAGS) when the check is done. The check is thus made with
# 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.
#
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
#
# LICENSE
#
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.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 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 2
AC_DEFUN([AX_CHECK_COMPILE_FLAG],
[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX
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()],
[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],
[m4_default([$2], :)],
[m4_default([$3], :)])
AS_VAR_POPDEF([CACHEVAR])dnl
])dnl AX_CHECK_COMPILE_FLAGS

71
m4/ax_check_link_flag.m4 Normal file
View File

@@ -0,0 +1,71 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS])
#
# DESCRIPTION
#
# Check whether the given FLAG works with the linker or gives an error.
# (Warnings, however, are ignored)
#
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
# success/failure.
#
# If EXTRA-FLAGS is defined, it is added to the linker's default flags
# when the check is done. The check is thus made with the flags: "LDFLAGS
# EXTRA-FLAGS FLAG". This can for example be used to force the linker to
# issue an error when a bad flag is given.
#
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
# macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG.
#
# LICENSE
#
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.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 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 2
AC_DEFUN([AX_CHECK_LINK_FLAG],
[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()],
[AS_VAR_SET(CACHEVAR,[yes])],
[AS_VAR_SET(CACHEVAR,[no])])
LDFLAGS=$ax_check_save_flags])
AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes],
[m4_default([$2], :)],
[m4_default([$3], :)])
AS_VAR_POPDEF([CACHEVAR])dnl
])dnl AX_CHECK_LINK_FLAGS

View File

@@ -0,0 +1,107 @@
# ============================================================================
# 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

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

View File

@@ -1,111 +0,0 @@
dnl borrowed from oddsock.org
dnl AM_PATH_LAME([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
dnl Test for liblame, and define LAME_CFLAGS and LAME_LIBS
dnl
AC_DEFUN([AM_PATH_LAME],
[dnl
dnl Get the cflags and libraries
dnl
AC_ARG_WITH(lame,
AS_HELP_STRING([--with-lame=PFX],
[prefix where liblame is installed (optional)]),,
lame_prefix="")
AC_ARG_WITH(lame-libraries,
AS_HELP_STRING([--with-lame-libraries=DIR],
[directory where liblame library is installed (optional)]),,
lame_libraries="")
AC_ARG_WITH(lame-includes,
AS_HELP_STRING([--with-lame-includes=DIR],
[directory where liblame header files are installed (optional)]),,
lame_includes="")
if test "x$lame_prefix" != "xno" ; then
if test "x$lame_libraries" != "x" ; then
LAME_LIBS="-L$lame_libraries"
elif test "x$lame_prefix" != "x" ; then
LAME_LIBS="-L$lame_prefix/lib"
elif test "x$prefix" != "xNONE" ; then
LAME_LIBS="-L$prefix/lib"
fi
LAME_LIBS="$LAME_LIBS -lmp3lame -lm"
if test "x$lame_includes" != "x" ; then
LAME_CFLAGS="-I$lame_includes"
elif test "x$lame_prefix" != "x" ; then
LAME_CFLAGS="-I$lame_prefix/include"
elif test "x$prefix" != "xNONE"; then
LAME_CFLAGS="-I$prefix/include"
fi
AC_MSG_CHECKING(for liblame)
no_lame=""
ac_save_CFLAGS="$CFLAGS"
ac_save_LIBS="$LIBS"
CFLAGS="$CFLAGS $LAME_CFLAGS"
LIBS="$LIBS $LAME_LIBS"
dnl
dnl Now check if the installed liblame is sufficiently new.
dnl
rm -f conf.lametest
AC_TRY_RUN([
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <lame/lame.h>
int main ()
{
system("touch conf.lametest");
return 0;
}
],, no_lame=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
CFLAGS="$ac_save_CFLAGS"
LIBS="$ac_save_LIBS"
fi
if test "x$no_lame" = "x" ; then
AC_MSG_RESULT(yes)
ifelse([$1], , :, [$1])
else
AC_MSG_RESULT(no)
if test -f conf.lametest ; then
:
else
echo "*** Could not run liblame test program, checking why..."
CFLAGS="$CFLAGS $LAME_CFLAGS"
LIBS="$LIBS $LAME_LIBS"
AC_TRY_LINK([
#include <stdio.h>
#include <lame/lame.h>
], [ return 0; ],
[ echo "*** The test program compiled, but did not run. This usually means"
echo "*** that the run-time linker is not finding liblame or finding the wrong"
echo "*** version of liblame. If it is not finding liblame, you'll need to set your"
echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
echo "*** to the installed location Also, make sure you have run ldconfig if that"
echo "*** is required on your system"
echo "***"
echo "*** If you have an old version installed, it is best to remove it, although"
echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"],
[ echo "*** The test program failed to compile or link. See the file config.log for the"
echo "*** exact error that occured. This usually means liblame was incorrectly installed"
echo "*** or that you have moved liblame since it was installed." ])
CFLAGS="$ac_save_CFLAGS"
LIBS="$ac_save_LIBS"
fi
LAME_CFLAGS=""
LAME_LIBS=""
ifelse([$2], , :, [$2])
fi
AC_DEFINE(HAVE_LAME, 1, [Define if you have liblame.])
use_lame="1"
AC_SUBST(LAME_CFLAGS)
AC_SUBST(LAME_LIBS)
rm -f conf.lametest
])

View File

@@ -1,116 +0,0 @@
# Configure paths for libOggFLAC
# "Inspired" by ogg.m4
dnl AM_PATH_LIBOGGFLAC([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
dnl Test for libOggFLAC, and define LIBOGGFLAC_CFLAGS and LIBOGGFLAC_LIBS
dnl
AC_DEFUN([AM_PATH_LIBOGGFLAC],
[dnl
dnl Get the cflags and libraries
dnl
AC_ARG_WITH(libOggFLAC,
AS_HELP_STRING([--with-libOggFLAC=PFX],
[prefix where libOggFLAC is installed (optional)]),,
libOggFLAC_prefix="")
AC_ARG_WITH(libOggFLAC-libraries,
AS_HELP_STRING([--with-libOggFLAC-libraries=DIR],
[directory where libOggFLAC library is installed (optional)]),,
libOggFLAC_libraries="")
AC_ARG_WITH(libOggFLAC-includes,
AS_HELP_STRING([--with-libOggFLAC-includes=DIR],
[directory where libOggFLAC header files are installed (optional)]),,
libOggFLAC_includes="")
AC_ARG_ENABLE(libOggFLACtest,
AS_HELP_STRING([--disable-libOggFLACtest],
[do not try to compile and run a test libOggFLAC program]),,
enable_libOggFLACtest=yes)
if test "x$libOggFLAC_libraries" != "x" ; then
LIBOGGFLAC_LIBS="-L$libOggFLAC_libraries"
elif test "x$libOggFLAC_prefix" != "x" ; then
LIBOGGFLAC_LIBS="-L$libOggFLAC_prefix/lib"
elif test "x$prefix" != "xNONE" ; then
LIBOGGFLAC_LIBS="-L$libdir"
fi
LIBOGGFLAC_LIBS="$LIBOGGFLAC_LIBS -lOggFLAC -lFLAC -lm"
if test "x$libOggFLAC_includes" != "x" ; then
LIBOGGFLAC_CFLAGS="-I$libOggFLAC_includes"
elif test "x$libOggFLAC_prefix" != "x" ; then
LIBOGGFLAC_CFLAGS="-I$libOggFLAC_prefix/include"
elif test "x$prefix" != "xNONE"; then
LIBOGGFLAC_CFLAGS="-I$prefix/include"
fi
AC_MSG_CHECKING(for libOggFLAC)
no_libOggFLAC=""
if test "x$enable_libOggFLACtest" = "xyes" ; then
ac_save_CFLAGS="$CFLAGS"
ac_save_CXXFLAGS="$CXXFLAGS"
ac_save_LIBS="$LIBS"
CFLAGS="$CFLAGS $LIBOGGFLAC_CFLAGS"
CXXFLAGS="$CXXFLAGS $LIBOGGFLAC_CFLAGS"
LIBS="$LIBS $LIBOGGFLAC_LIBS"
dnl
dnl Now check if the installed libOggFLAC is sufficiently new.
dnl
rm -f conf.libOggFLACtest
AC_TRY_RUN([
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <OggFLAC/stream_decoder.h>
int main ()
{
system("touch conf.libOggFLACtest");
return 0;
}
],, no_libOggFLAC=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
CFLAGS="$ac_save_CFLAGS"
LIBS="$ac_save_LIBS"
fi
if test "x$no_libOggFLAC" = "x" ; then
AC_MSG_RESULT(yes)
ifelse([$1], , :, [$1])
else
AC_MSG_RESULT(no)
if test -f conf.libOggFLACtest ; then
:
else
echo "*** Could not run libOggFLAC test program, checking why..."
CFLAGS="$CFLAGS $LIBOGGFLAC_CFLAGS"
LIBS="$LIBS $LIBOGGFLAC_LIBS"
AC_TRY_LINK([
#include <stdio.h>
#include <OggFLAC/stream_decoder.h>
], [ return 0; ],
[ echo "*** The test program compiled, but did not run. This usually means"
echo "*** that the run-time linker is not finding libOggFLAC or finding the wrong"
echo "*** version of libOggFLAC. If it is not finding libOggFLAC, you'll need to set your"
echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
echo "*** to the installed location Also, make sure you have run ldconfig if that"
echo "*** is required on your system"
echo "***"
echo "*** If you have an old version installed, it is best to remove it, although"
echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"],
[ echo "*** The test program failed to compile or link. See the file config.log for the"
echo "*** exact error that occured. This usually means libOggFLAC was incorrectly installed"
echo "*** or that you have moved libOggFLAC since it was installed. In the latter case, you"
echo "*** may want to edit the libOggFLAC-config script: $LIBOGGFLAC_CONFIG" ])
CFLAGS="$ac_save_CFLAGS"
LIBS="$ac_save_LIBS"
fi
LIBOGGFLAC_CFLAGS=""
LIBOGGFLAC_LIBS=""
ifelse([$2], , :, [$2])
fi
AC_SUBST(LIBOGGFLAC_CFLAGS)
AC_SUBST(LIBOGGFLAC_LIBS)
rm -f conf.libOggFLACtest
])

14
m4/libwrap.m4 Normal file
View File

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

View File

@@ -63,3 +63,36 @@ AC_DEFUN([MPD_AUTO_PKG], [
MPD_AUTO_RESULT([$1], [$4], [$5])
])
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"],
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])
])
dnl Wrapper for AC_CHECK_LIB.
dnl
dnl Parameters: varname1, varname2, libname, symname, libs, cflags, description, errmsg
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])
])

View File

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

12
m4/mpd_func.m4 Normal file
View File

@@ -0,0 +1,12 @@
dnl MPD_OPTIONAL_FUNC(name, func, macro)
dnl
dnl Allow the user to enable or disable the use of a function. If the
dnl option is not specified, the function is auto-detected.
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])],
[AC_CHECK_FUNC([$2],
[AC_DEFINE([$3], 1, [Define to use $1])],)])
])

19
m4/pretty_print.m4 Normal file
View File

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

View File

@@ -20,7 +20,7 @@ AC_DEFUN([STRUCT_UCRED],[
mpd_cv_have_struct_ucred=no)
if test x$mpd_cv_have_struct_ucred = xyes; then
# :(
MPD_CFLAGS="$MPD_CFLAGS -D_GNU_SOURCE"
CFLAGS="$CFLAGS -D_GNU_SOURCE"
fi
fi
])

9
mpd.service.in Normal file
View File

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

47
scripts/check_config_h.rb Executable file
View File

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

View File

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

View File

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

View File

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

23
src/ArchiveDomain.cxx Normal file
View File

@@ -0,0 +1,23 @@
/*
* 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 "ArchiveDomain.hxx"
#include "util/Domain.hxx"
const Domain archive_domain("archive");

25
src/ArchiveDomain.hxx Normal file
View File

@@ -0,0 +1,25 @@
/*
* 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_ARCHIVE_DOMAIN_HXX
#define MPD_ARCHIVE_DOMAIN_HXX
extern const class Domain archive_domain;
#endif

58
src/ArchiveFile.hxx Normal file
View File

@@ -0,0 +1,58 @@
/*
* 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_ARCHIVE_FILE_HXX
#define MPD_ARCHIVE_FILE_HXX
class Mutex;
class Cond;
class Error;
class ArchiveFile {
public:
const struct archive_plugin &plugin;
ArchiveFile(const struct archive_plugin &_plugin)
:plugin(_plugin) {}
protected:
/**
* Use Close() instead of delete.
*/
~ArchiveFile() {}
public:
virtual void Close() = 0;
/**
* Visit all entries inside this archive.
*/
virtual void Visit(ArchiveVisitor &visitor) = 0;
/**
* Opens an InputStream of a file within the archive.
*
* @param path the path within the archive
*/
virtual InputStream *OpenStream(const char *path,
Mutex &mutex, Cond &cond,
Error &error) = 0;
};
#endif

90
src/ArchiveList.cxx Normal file
View File

@@ -0,0 +1,90 @@
/*
* 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 "ArchiveList.hxx"
#include "ArchivePlugin.hxx"
#include "util/StringUtil.hxx"
#include "archive/Bzip2ArchivePlugin.hxx"
#include "archive/Iso9660ArchivePlugin.hxx"
#include "archive/ZzipArchivePlugin.hxx"
#include "util/Macros.hxx"
#include <string.h>
const struct archive_plugin *const archive_plugins[] = {
#ifdef HAVE_BZ2
&bz2_archive_plugin,
#endif
#ifdef HAVE_ZZIP
&zzip_archive_plugin,
#endif
#ifdef HAVE_ISO9660
&iso9660_archive_plugin,
#endif
nullptr
};
/** which plugins have been initialized successfully? */
static bool archive_plugins_enabled[ARRAY_SIZE(archive_plugins) - 1];
#define archive_plugins_for_each_enabled(plugin) \
archive_plugins_for_each(plugin) \
if (archive_plugins_enabled[archive_plugin_iterator - archive_plugins])
const struct archive_plugin *
archive_plugin_from_suffix(const char *suffix)
{
if (suffix == nullptr)
return nullptr;
archive_plugins_for_each_enabled(plugin)
if (plugin->suffixes != nullptr &&
string_array_contains(plugin->suffixes, suffix))
return plugin;
return nullptr;
}
const struct archive_plugin *
archive_plugin_from_name(const char *name)
{
archive_plugins_for_each_enabled(plugin)
if (strcmp(plugin->name, name) == 0)
return plugin;
return nullptr;
}
void archive_plugin_init_all(void)
{
for (unsigned i = 0; archive_plugins[i] != nullptr; ++i) {
const struct archive_plugin *plugin = archive_plugins[i];
if (plugin->init == nullptr || archive_plugins[i]->init())
archive_plugins_enabled[i] = true;
}
}
void archive_plugin_deinit_all(void)
{
archive_plugins_for_each_enabled(plugin)
if (plugin->finish != nullptr)
plugin->finish();
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2009 The Music Player Daemon Project
* 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
@@ -17,15 +17,19 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef MPD_ARCHIVE_LIST_H
#define MPD_ARCHIVE_LIST_H
#include "archive_api.h"
#include <stdio.h>
#ifndef MPD_ARCHIVE_LIST_HXX
#define MPD_ARCHIVE_LIST_HXX
struct archive_plugin;
extern const struct archive_plugin *const archive_plugins[];
#define archive_plugins_for_each(plugin) \
for (const struct archive_plugin *plugin, \
*const*archive_plugin_iterator = &archive_plugins[0]; \
(plugin = *archive_plugin_iterator) != nullptr; \
++archive_plugin_iterator)
/* interface for using plugins */
const struct archive_plugin *
@@ -34,8 +38,6 @@ archive_plugin_from_suffix(const char *suffix);
const struct archive_plugin *
archive_plugin_from_name(const char *name);
void archive_plugin_print_all_suffixes(FILE * fp);
/* this is where we "load" all the "plugins" ;-) */
void archive_plugin_init_all(void);

104
src/ArchiveLookup.cxx Normal file
View File

@@ -0,0 +1,104 @@
/*
* 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" /* must be first for large file support */
#include "ArchiveLookup.hxx"
#include "ArchiveDomain.hxx"
#include "Log.hxx"
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
gcc_pure
static char *
FindSlash(char *p, size_t i)
{
for (; i > 0; --i)
if (p[i] == '/')
return p + i;
return nullptr;
}
gcc_pure
static const char *
FindSuffix(const char *p, const char *i)
{
for (; i > p; --i) {
if (*i == '.')
return i + 1;
}
return nullptr;
}
bool
archive_lookup(char *pathname, const char **archive,
const char **inpath, const char **suffix)
{
size_t idx = strlen(pathname);
char *slash = nullptr;
while (true) {
//try to stat if its real directory
struct stat st_info;
if (stat(pathname, &st_info) == -1) {
if (errno != ENOTDIR) {
FormatErrno(archive_domain,
"Failed to stat %s", pathname);
return false;
}
} else {
//is something found ins original path (is not an archive)
if (slash == nullptr)
return false;
//its a file ?
if (S_ISREG(st_info.st_mode)) {
//so the upper should be file
*archive = pathname;
*inpath = slash + 1;
//try to get suffix
*suffix = FindSuffix(pathname, slash - 1);
return true;
} else {
FormatError(archive_domain,
"Not a regular file: %s",
pathname);
return false;
}
}
//find one dir up
if (slash != nullptr)
*slash = '/';
slash = FindSlash(pathname, idx - 1);
if (slash == nullptr)
return false;
*slash = 0;
idx = slash - pathname;
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2009 The Music Player Daemon Project
* 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
@@ -17,16 +17,8 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <glib.h>
#include "archive_api.h"
#ifndef MPD_ARCHIVE_LOOKUP_HXX
#define MPD_ARCHIVE_LOOKUP_HXX
/**
*
@@ -45,66 +37,9 @@
* inarchive pathname: Talco - Combat Circus/12 - A la pachenka.mp3
* and suffix: zip
*/
bool
archive_lookup(char *pathname, const char **archive,
const char **inpath, const char **suffix);
bool archive_lookup(char *pathname, char **archive, char **inpath, char **suffix)
{
char *pathdupe;
int len, idx;
struct stat st_info;
bool ret = false;
*archive = NULL;
*inpath = NULL;
*suffix = NULL;
pathdupe = g_strdup(pathname);
len = idx = strlen(pathname);
while (idx > 0) {
//try to stat if its real directory
if (stat(pathdupe, &st_info) == -1) {
if (errno != ENOTDIR) {
g_warning("stat %s failed (errno=%d)\n", pathdupe, errno);
break;
}
} else {
//is something found ins original path (is not an archive)
if (idx == len) {
break;
}
//its a file ?
if (S_ISREG(st_info.st_mode)) {
//so the upper should be file
pathname[idx] = 0;
ret = true;
*archive = pathname;
*inpath = pathname + idx+1;
//try to get suffix
*suffix = NULL;
while (idx > 0) {
if (pathname[idx] == '.') {
*suffix = pathname + idx + 1;
break;
}
idx--;
}
break;
} else {
g_warning("not a regular file %s\n", pathdupe);
break;
}
}
//find one dir up
while (idx > 0) {
if (pathdupe[idx] == '/') {
pathdupe[idx] = 0;
break;
}
idx--;
}
}
g_free(pathdupe);
return ret;
}
#endif

39
src/ArchivePlugin.cxx Normal file
View File

@@ -0,0 +1,39 @@
/*
* 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 "ArchivePlugin.hxx"
#include "ArchiveFile.hxx"
#include "util/Error.hxx"
#include <assert.h>
ArchiveFile *
archive_file_open(const struct archive_plugin *plugin, const char *path,
Error &error)
{
assert(plugin != nullptr);
assert(plugin->open != nullptr);
assert(path != nullptr);
ArchiveFile *file = plugin->open(path, error);
assert((file == nullptr) == error.IsDefined());
return file;
}

62
src/ArchivePlugin.hxx Normal file
View File

@@ -0,0 +1,62 @@
/*
* 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_ARCHIVE_PLUGIN_HXX
#define MPD_ARCHIVE_PLUGIN_HXX
struct InputStream;
class ArchiveFile;
class ArchiveVisitor;
class Error;
struct archive_plugin {
const char *name;
/**
* optional, set this to nullptr if the archive plugin doesn't
* have/need one this must false if there is an error and
* true otherwise
*/
bool (*init)(void);
/**
* optional, set this to nullptr if the archive plugin doesn't
* have/need one
*/
void (*finish)(void);
/**
* tryes to open archive file and associates handle with archive
* returns pointer to handle used is all operations with this archive
* or nullptr when opening fails
*/
ArchiveFile *(*open)(const char *path_fs, Error &error);
/**
* suffixes handled by this plugin.
* last element in these arrays must always be a nullptr
*/
const char *const*suffixes;
};
ArchiveFile *
archive_file_open(const struct archive_plugin *plugin, const char *path,
Error &error);
#endif

28
src/ArchiveVisitor.hxx Normal file
View File

@@ -0,0 +1,28 @@
/*
* 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_ARCHIVE_VISITOR_HXX
#define MPD_ARCHIVE_VISITOR_HXX
class ArchiveVisitor {
public:
virtual void VisitArchiveEntry(const char *path_utf8) = 0;
};
#endif

View File

@@ -0,0 +1,192 @@
/* compress.c
* Compressor logic
*
* (c)2007 busybee (http://beesbuzz.biz/
* Licensed under the terms of the LGPL. See the file COPYING for details.
*/
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "config.h"
#include "compress.h"
struct Compressor {
//! The compressor's preferences
struct CompressorConfig prefs;
//! History of the peak values
int *peaks;
//! History of the gain values
int *gain;
//! History of clip amounts
int *clipped;
unsigned int pos;
unsigned int bufsz;
};
struct Compressor *Compressor_new(unsigned int history)
{
struct Compressor *obj = malloc(sizeof(struct Compressor));
if (obj == NULL)
/* out of memory, not much we can do */
abort();
obj->prefs.target = TARGET;
obj->prefs.maxgain = GAINMAX;
obj->prefs.smooth = GAINSMOOTH;
obj->peaks = obj->gain = obj->clipped = NULL;
obj->bufsz = 0;
obj->pos = 0;
Compressor_setHistory(obj, history);
return obj;
}
void Compressor_delete(struct Compressor *obj)
{
if (obj->peaks)
free(obj->peaks);
if (obj->gain)
free(obj->gain);
if (obj->clipped)
free(obj->clipped);
free(obj);
}
static int *resizeArray(int *data, int newsz, int oldsz)
{
data = realloc(data, newsz*sizeof(int));
if (data == NULL)
/* out of memory, not much we can do */
abort();
if (newsz > oldsz)
memset(data + oldsz, 0, sizeof(int)*(newsz - oldsz));
return data;
}
void Compressor_setHistory(struct Compressor *obj, unsigned int history)
{
if (!history)
history = BUCKETS;
obj->peaks = resizeArray(obj->peaks, history, obj->bufsz);
obj->gain = resizeArray(obj->gain, history, obj->bufsz);
obj->clipped = resizeArray(obj->clipped, history, obj->bufsz);
obj->bufsz = history;
}
struct CompressorConfig *Compressor_getConfig(struct Compressor *obj)
{
return &obj->prefs;
}
void Compressor_Process_int16(struct Compressor *obj, int16_t *audio,
unsigned int count)
{
struct CompressorConfig *prefs = Compressor_getConfig(obj);
int16_t *ap;
unsigned int i;
int *peaks = obj->peaks;
int curGain = obj->gain[obj->pos];
int newGain;
int peakVal = 1;
int peakPos = 0;
int slot = (obj->pos + 1) % obj->bufsz;
int *clipped = obj->clipped + slot;
unsigned int ramp = count;
int delta;
ap = audio;
for (i = 0; i < count; i++)
{
int val = *ap++;
if (val < 0)
val = -val;
if (val > peakVal)
{
peakVal = val;
peakPos = i;
}
}
peaks[slot] = peakVal;
for (i = 0; i < obj->bufsz; i++)
{
if (peaks[i] > peakVal)
{
peakVal = peaks[i];
peakPos = 0;
}
}
//! Determine target gain
newGain = (1 << 10)*prefs->target/peakVal;
//! Adjust the gain with inertia from the previous gain value
newGain = (curGain*((1 << prefs->smooth) - 1) + newGain)
>> prefs->smooth;
//! Make sure it's no more than the maximum gain value
if (newGain > (prefs->maxgain << 10))
newGain = prefs->maxgain << 10;
//! Make sure it's no less than 1:1
if (newGain < (1 << 10))
newGain = 1 << 10;
//! Make sure the adjusted gain won't cause clipping
if ((peakVal*newGain >> 10) > 32767)
{
newGain = (32767 << 10)/peakVal;
//! Truncate the ramp time
ramp = peakPos;
}
//! Record the new gain
obj->gain[slot] = newGain;
if (!ramp)
ramp = 1;
if (!curGain)
curGain = 1 << 10;
delta = (newGain - curGain) / (int)ramp;
ap = audio;
*clipped = 0;
for (i = 0; i < count; i++)
{
int sample;
//! Amplify the sample
sample = *ap*curGain >> 10;
if (sample < -32768)
{
*clipped += -32768 - sample;
sample = -32768;
} else if (sample > 32767)
{
*clipped += sample - 32767;
sample = 32767;
}
*ap++ = sample;
//! Adjust the gain
if (i < ramp)
curGain += delta;
else
curGain = newGain;
}
obj->pos = slot;
}

View File

@@ -0,0 +1,49 @@
/*! compress.h
* interface to audio compression
*
* (c)2007 busybee (http://beesbuzz.biz/)
* Licensed under the terms of the LGPL. See the file COPYING for details.
*/
#ifndef COMPRESS_H
#define COMPRESS_H
#include <stdint.h>
//! Configuration values for the compressor object
struct CompressorConfig {
int target;
int maxgain;
int smooth;
};
struct Compressor;
#ifdef __cplusplus
extern "C" {
#endif
//! Create a new compressor (use history value of 0 for default)
struct Compressor *Compressor_new(unsigned int history);
//! Delete a compressor
void Compressor_delete(struct Compressor *);
//! Set the history length
void Compressor_setHistory(struct Compressor *, unsigned int history);
//! Get the configuration for a compressor
struct CompressorConfig *Compressor_getConfig(struct Compressor *);
//! Process 16-bit signed data
void Compressor_Process_int16(struct Compressor *, int16_t *data, unsigned int count);
#ifdef __cplusplus
}
#endif
//! TODO: Compressor_Process_int32, Compressor_Process_float, others as needed
//! TODO: functions for getting at the peak/gain/clip history buffers (for monitoring)
#endif

View File

@@ -0,0 +1,19 @@
/* config.h
** Default values for the configuration, and also a few random debug things
*/
#ifndef AC_CONFIG_H
#define AC_CONFIG_H
/*** Version information ***/
#define ACVERSION "2.0"
/*** Default configuration stuff ***/
#define TARGET 16384 /*!< Target level (on a scale of 0-32767) */
#define GAINMAX 32 /*!< The maximum amount to amplify by */
#define GAINSMOOTH 8 /*!< How much inertia ramping has*/
#define BUCKETS 400 /*!< How long of a history to use by default */
#endif

52
src/AudioConfig.cxx Normal file
View File

@@ -0,0 +1,52 @@
/*
* 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-2009 The Music Player Daemon Project
* 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
@@ -17,19 +17,15 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef MPD_AUDIO_H
#define MPD_AUDIO_H
#ifndef MPD_AUDIO_CONFIG_HXX
#define MPD_AUDIO_CONFIG_HXX
#include <stdbool.h>
struct AudioFormat;
struct audio_format;
void getOutputAudioFormat(const struct audio_format *inFormat,
struct audio_format *outFormat);
AudioFormat
getOutputAudioFormat(AudioFormat inFormat);
/* make sure initPlayerData is called before this function!! */
void initAudioConfig(void);
void finishAudioConfig(void);
#endif

85
src/AudioFormat.cxx Normal file
View File

@@ -0,0 +1,85 @@
/*
* 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 "AudioFormat.hxx"
#include <assert.h>
#include <stdio.h>
void
AudioFormat::ApplyMask(AudioFormat mask)
{
assert(IsValid());
assert(mask.IsMaskValid());
if (mask.sample_rate != 0)
sample_rate = mask.sample_rate;
if (mask.format != SampleFormat::UNDEFINED)
format = mask.format;
if (mask.channels != 0)
channels = mask.channels;
assert(IsValid());
}
const char *
sample_format_to_string(SampleFormat format)
{
switch (format) {
case SampleFormat::UNDEFINED:
return "?";
case SampleFormat::S8:
return "8";
case SampleFormat::S16:
return "16";
case SampleFormat::S24_P32:
return "24";
case SampleFormat::S32:
return "32";
case SampleFormat::FLOAT:
return "f";
case SampleFormat::DSD:
return "dsd";
}
/* unreachable */
assert(false);
gcc_unreachable();
}
const char *
audio_format_to_string(const AudioFormat af,
struct audio_format_string *s)
{
assert(s != nullptr);
snprintf(s->buffer, sizeof(s->buffer), "%u:%s:%u",
af.sample_rate, sample_format_to_string(af.format),
af.channels);
return s->buffer;
}

315
src/AudioFormat.hxx Normal file
View File

@@ -0,0 +1,315 @@
/*
* 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_AUDIO_FORMAT_HXX
#define MPD_AUDIO_FORMAT_HXX
#include "Compiler.h"
#include <stdint.h>
#include <assert.h>
#if defined(WIN32) && GCC_CHECK_VERSION(4,6)
/* on WIN32, "FLOAT" is already defined, and this triggers -Wshadow */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wshadow"
#endif
enum class SampleFormat : uint8_t {
UNDEFINED = 0,
S8,
S16,
/**
* Signed 24 bit integer samples, packed in 32 bit integers
* (the most significant byte is filled with the sign bit).
*/
S24_P32,
S32,
/**
* 32 bit floating point samples in the host's format. The
* range is -1.0f to +1.0f.
*/
FLOAT,
/**
* Direct Stream Digital. 1-bit samples; each frame has one
* byte (8 samples) per channel.
*/
DSD,
};
#if defined(WIN32) && GCC_CHECK_VERSION(4,6)
#pragma GCC diagnostic pop
#endif
static constexpr unsigned MAX_CHANNELS = 8;
/**
* This structure describes the format of a raw PCM stream.
*/
struct AudioFormat {
/**
* The sample rate in Hz. A better name for this attribute is
* "frame rate", because technically, you have two samples per
* frame in stereo sound.
*/
uint32_t sample_rate;
/**
* The format samples are stored in. See the #sample_format
* enum for valid values.
*/
SampleFormat format;
/**
* The number of channels. Only mono (1) and stereo (2) are
* fully supported currently.
*/
uint8_t channels;
AudioFormat() = default;
constexpr AudioFormat(uint32_t _sample_rate,
SampleFormat _format, uint8_t _channels)
:sample_rate(_sample_rate),
format(_format), channels(_channels) {}
static constexpr AudioFormat Undefined() {
return AudioFormat(0, SampleFormat::UNDEFINED,0);
}
/**
* Clears the #audio_format object, i.e. sets all attributes to an
* undefined (invalid) value.
*/
void Clear() {
sample_rate = 0;
format = SampleFormat::UNDEFINED;
channels = 0;
}
/**
* Checks whether the object has a defined value.
*/
constexpr bool IsDefined() const {
return sample_rate != 0;
}
/**
* Checks whether the object is full, i.e. all attributes are
* defined. This is more complete than IsDefined(), but
* slower.
*/
constexpr bool IsFullyDefined() const {
return sample_rate != 0 && format != SampleFormat::UNDEFINED &&
channels != 0;
}
/**
* Checks whether the object has at least one defined value.
*/
constexpr bool IsMaskDefined() const {
return sample_rate != 0 || format != SampleFormat::UNDEFINED ||
channels != 0;
}
bool IsValid() const;
bool IsMaskValid() const;
constexpr bool operator==(const AudioFormat other) const {
return sample_rate == other.sample_rate &&
format == other.format &&
channels == other.channels;
}
constexpr bool operator!=(const AudioFormat other) const {
return !(*this == other);
}
void ApplyMask(AudioFormat mask);
/**
* Returns the size of each (mono) sample in bytes.
*/
unsigned GetSampleSize() const;
/**
* Returns the size of each full frame in bytes.
*/
unsigned GetFrameSize() const;
/**
* Returns the floating point factor which converts a time
* span to a storage size in bytes.
*/
double GetTimeToSize() const;
};
/**
* Buffer for audio_format_string().
*/
struct audio_format_string {
char buffer[24];
};
/**
* Checks whether the sample rate is valid.
*
* @param sample_rate the sample rate in Hz
*/
static constexpr inline bool
audio_valid_sample_rate(unsigned sample_rate)
{
return sample_rate > 0 && sample_rate < (1 << 30);
}
/**
* Checks whether the sample format is valid.
*
* @param bits the number of significant bits per sample
*/
static inline bool
audio_valid_sample_format(SampleFormat format)
{
switch (format) {
case SampleFormat::S8:
case SampleFormat::S16:
case SampleFormat::S24_P32:
case SampleFormat::S32:
case SampleFormat::FLOAT:
case SampleFormat::DSD:
return true;
case SampleFormat::UNDEFINED:
break;
}
return false;
}
/**
* Checks whether the number of channels is valid.
*/
static constexpr inline bool
audio_valid_channel_count(unsigned channels)
{
return channels >= 1 && channels <= MAX_CHANNELS;
}
/**
* Returns false if the format is not valid for playback with MPD.
* This function performs some basic validity checks.
*/
inline bool
AudioFormat::IsValid() const
{
return audio_valid_sample_rate(sample_rate) &&
audio_valid_sample_format(format) &&
audio_valid_channel_count(channels);
}
/**
* Returns false if the format mask is not valid for playback with
* MPD. This function performs some basic validity checks.
*/
inline bool
AudioFormat::IsMaskValid() const
{
return (sample_rate == 0 ||
audio_valid_sample_rate(sample_rate)) &&
(format == SampleFormat::UNDEFINED ||
audio_valid_sample_format(format)) &&
(channels == 0 || audio_valid_channel_count(channels));
}
gcc_const
static inline unsigned
sample_format_size(SampleFormat format)
{
switch (format) {
case SampleFormat::S8:
return 1;
case SampleFormat::S16:
return 2;
case SampleFormat::S24_P32:
case SampleFormat::S32:
case SampleFormat::FLOAT:
return 4;
case SampleFormat::DSD:
/* each frame has 8 samples per channel */
return 1;
case SampleFormat::UNDEFINED:
return 0;
}
assert(false);
gcc_unreachable();
}
inline unsigned
AudioFormat::GetSampleSize() const
{
return sample_format_size(format);
}
inline unsigned
AudioFormat::GetFrameSize() const
{
return GetSampleSize() * channels;
}
inline double
AudioFormat::GetTimeToSize() const
{
return sample_rate * GetFrameSize();
}
/**
* Renders a #sample_format enum into a string, e.g. for printing it
* in a log file.
*
* @param format a #sample_format enum value
* @return the string
*/
gcc_pure gcc_malloc
const char *
sample_format_to_string(SampleFormat format);
/**
* Renders the #audio_format object into a string, e.g. for printing
* it in a log file.
*
* @param af the #audio_format object
* @param s a buffer to print into
* @return the string, or nullptr if the #audio_format object is invalid
*/
gcc_pure gcc_malloc
const char *
audio_format_to_string(AudioFormat af,
struct audio_format_string *s);
#endif

213
src/AudioParser.cxx Normal file
View File

@@ -0,0 +1,213 @@
/*
* 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.
*/
/*
* Parser functions for audio related objects.
*
*/
#include "config.h"
#include "AudioParser.hxx"
#include "AudioFormat.hxx"
#include "CheckAudioFormat.hxx"
#include "util/Error.hxx"
#include "Compiler.h"
#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)
{
unsigned long value;
char *endptr;
if (mask && *src == '*') {
*sample_rate_r = 0;
*endptr_r = src + 1;
return true;
}
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;
*sample_rate_r = value;
*endptr_r = endptr;
return true;
}
static bool
parse_sample_format(const char *src, bool mask,
SampleFormat *sample_format_r,
const char **endptr_r, Error &error)
{
unsigned long value;
char *endptr;
SampleFormat sample_format;
if (mask && *src == '*') {
*sample_format_r = SampleFormat::UNDEFINED;
*endptr_r = src + 1;
return true;
}
if (*src == 'f') {
*sample_format_r = SampleFormat::FLOAT;
*endptr_r = src + 1;
return true;
}
if (memcmp(src, "dsd", 3) == 0) {
*sample_format_r = SampleFormat::DSD;
*endptr_r = src + 3;
return true;
}
value = strtoul(src, &endptr, 10);
if (endptr == src) {
error.Set(audio_format_domain,
"Failed to parse the sample format");
return false;
}
switch (value) {
case 8:
sample_format = SampleFormat::S8;
break;
case 16:
sample_format = SampleFormat::S16;
break;
case 24:
if (memcmp(endptr, "_3", 2) == 0)
/* for backwards compatibility */
endptr += 2;
sample_format = SampleFormat::S24_P32;
break;
case 32:
sample_format = SampleFormat::S32;
break;
default:
error.Format(audio_format_domain,
"Invalid sample format: %lu", value);
return false;
}
assert(audio_valid_sample_format(sample_format));
*sample_format_r = sample_format;
*endptr_r = endptr;
return true;
}
static bool
parse_channel_count(const char *src, bool mask, uint8_t *channels_r,
const char **endptr_r, Error &error)
{
unsigned long value;
char *endptr;
if (mask && *src == '*') {
*channels_r = 0;
*endptr_r = src + 1;
return true;
}
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;
*channels_r = value;
*endptr_r = endptr;
return true;
}
bool
audio_format_parse(AudioFormat &dest, const char *src,
bool mask, Error &error)
{
uint32_t rate;
SampleFormat sample_format;
uint8_t channels;
dest.Clear();
/* parse sample rate */
#if GCC_CHECK_VERSION(4,7)
/* workaround -Wmaybe-uninitialized false positive */
rate = 0;
#endif
if (!parse_sample_rate(src, mask, &rate, &src, error))
return false;
if (*src++ != ':') {
error.Set(audio_format_domain, "Sample format missing");
return false;
}
/* parse sample format */
#if GCC_CHECK_VERSION(4,7)
/* workaround -Wmaybe-uninitialized false positive */
sample_format = SampleFormat::UNDEFINED;
#endif
if (!parse_sample_format(src, mask, &sample_format, &src, error))
return false;
if (*src++ != ':') {
error.Set(audio_format_domain, "Channel count missing");
return false;
}
/* parse channel count */
if (!parse_channel_count(src, mask, &channels, &src, error))
return false;
if (*src != 0) {
error.Format(audio_format_domain,
"Extra data after channel count: %s", src);
return false;
}
dest = AudioFormat(rate, sample_format, channels);
assert(mask
? dest.IsMaskValid()
: dest.IsValid());
return true;
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2009 The Music Player Daemon Project
* 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
@@ -22,14 +22,11 @@
* Parser functions for audio related objects.
*/
#ifndef AUDIO_PARSER_H
#define AUDIO_PARSER_H
#ifndef MPD_AUDIO_PARSER_HXX
#define MPD_AUDIO_PARSER_HXX
#include <glib.h>
#include <stdbool.h>
struct audio_format;
struct AudioFormat;
class Error;
/**
* Parses a string in the form "SAMPLE_RATE:BITS:CHANNELS" into an
@@ -37,11 +34,13 @@ struct audio_format;
*
* @param dest the destination #audio_format struct
* @param src the input string
* @param error location to store the error occuring, or NULL to
* @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(struct audio_format *dest, const char *src, GError **error);
audio_format_parse(AudioFormat &dest, const char *src,
bool mask, Error &error);
#endif

151
src/AvahiPoll.cxx Normal file
View File

@@ -0,0 +1,151 @@
/*
* 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 "AvahiPoll.hxx"
#include "event/Loop.hxx"
#include "event/SocketMonitor.hxx"
#include "event/TimeoutMonitor.hxx"
static unsigned
FromAvahiWatchEvent(AvahiWatchEvent e)
{
return (e & AVAHI_WATCH_IN ? SocketMonitor::READ : 0) |
(e & AVAHI_WATCH_OUT ? SocketMonitor::WRITE : 0) |
(e & AVAHI_WATCH_ERR ? SocketMonitor::ERROR : 0) |
(e & AVAHI_WATCH_HUP ? SocketMonitor::HANGUP : 0);
}
static AvahiWatchEvent
ToAvahiWatchEvent(unsigned e)
{
return AvahiWatchEvent((e & SocketMonitor::READ ? AVAHI_WATCH_IN : 0) |
(e & SocketMonitor::WRITE ? AVAHI_WATCH_OUT : 0) |
(e & SocketMonitor::ERROR ? AVAHI_WATCH_ERR : 0) |
(e & SocketMonitor::HANGUP ? AVAHI_WATCH_HUP : 0));
}
struct AvahiWatch final : private SocketMonitor {
private:
const AvahiWatchCallback callback;
void *const userdata;
AvahiWatchEvent received;
public:
AvahiWatch(int _fd, AvahiWatchEvent _event,
AvahiWatchCallback _callback, void *_userdata,
EventLoop &_loop)
:SocketMonitor(_fd, _loop),
callback(_callback), userdata(_userdata),
received(AvahiWatchEvent(0)) {
Schedule(FromAvahiWatchEvent(_event));
}
~AvahiWatch() {
Steal();
}
static void WatchUpdate(AvahiWatch *w, AvahiWatchEvent event) {
w->Schedule(FromAvahiWatchEvent(event));
}
static AvahiWatchEvent WatchGetEvents(AvahiWatch *w) {
return w->received;
}
static void WatchFree(AvahiWatch *w) {
delete w;
}
protected:
virtual bool OnSocketReady(unsigned flags) {
received = ToAvahiWatchEvent(flags);
callback(this, Get(), received, userdata);
received = AvahiWatchEvent(0);
return true;
}
};
static constexpr unsigned
TimevalToMS(const timeval &tv)
{
return tv.tv_sec * 1000 + (tv.tv_usec + 500) / 1000;
}
struct AvahiTimeout final : private TimeoutMonitor {
private:
const AvahiTimeoutCallback callback;
void *const userdata;
public:
AvahiTimeout(const struct timeval *tv,
AvahiTimeoutCallback _callback, void *_userdata,
EventLoop &_loop)
:TimeoutMonitor(_loop),
callback(_callback), userdata(_userdata) {
if (tv != nullptr)
Schedule(TimevalToMS(*tv));
}
static void TimeoutUpdate(AvahiTimeout *t, const struct timeval *tv) {
if (tv != nullptr)
t->Schedule(TimevalToMS(*tv));
else
t->Cancel();
}
static void TimeoutFree(AvahiTimeout *t) {
delete t;
}
protected:
virtual void OnTimeout() {
callback(this, userdata);
}
};
MyAvahiPoll::MyAvahiPoll(EventLoop &_loop):event_loop(_loop)
{
watch_new = WatchNew;
watch_update = AvahiWatch::WatchUpdate;
watch_get_events = AvahiWatch::WatchGetEvents;
watch_free = AvahiWatch::WatchFree;
timeout_new = TimeoutNew;
timeout_update = AvahiTimeout::TimeoutUpdate;
timeout_free = AvahiTimeout::TimeoutFree;
}
AvahiWatch *
MyAvahiPoll::WatchNew(const AvahiPoll *api, int fd, AvahiWatchEvent event,
AvahiWatchCallback callback, void *userdata) {
const MyAvahiPoll &poll = *(const MyAvahiPoll *)api;
return new AvahiWatch(fd, event, callback, userdata,
poll.event_loop);
}
AvahiTimeout *
MyAvahiPoll::TimeoutNew(const AvahiPoll *api, const struct timeval *tv,
AvahiTimeoutCallback callback, void *userdata) {
const MyAvahiPoll &poll = *(const MyAvahiPoll *)api;
return new AvahiTimeout(tv, callback, userdata,
poll.event_loop);
}

48
src/AvahiPoll.hxx Normal file
View File

@@ -0,0 +1,48 @@
/*
* 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_AVAHI_POLL_HXX
#define MPD_AVAHI_POLL_HXX
#include "check.h"
#include "Compiler.h"
#include <avahi-common/watch.h>
class EventLoop;
class MyAvahiPoll final : public AvahiPoll {
EventLoop &event_loop;
public:
MyAvahiPoll(EventLoop &_loop);
private:
static AvahiWatch *WatchNew(const AvahiPoll *api, int fd,
AvahiWatchEvent event,
AvahiWatchCallback callback,
void *userdata);
static AvahiTimeout *TimeoutNew(const AvahiPoll *api,
const struct timeval *tv,
AvahiTimeoutCallback callback,
void *userdata);
};
#endif

80
src/CheckAudioFormat.cxx Normal file
View File

@@ -0,0 +1,80 @@
/*
* 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 "CheckAudioFormat.hxx"
#include "AudioFormat.hxx"
#include "util/Error.hxx"
#include "util/Domain.hxx"
#include <assert.h>
const Domain audio_format_domain("audio_format");
bool
audio_check_sample_rate(unsigned long sample_rate, Error &error)
{
if (!audio_valid_sample_rate(sample_rate)) {
error.Format(audio_format_domain,
"Invalid sample rate: %lu", sample_rate);
return false;
}
return true;
}
bool
audio_check_sample_format(SampleFormat sample_format, Error &error)
{
if (!audio_valid_sample_format(sample_format)) {
error.Format(audio_format_domain,
"Invalid sample format: %u",
unsigned(sample_format));
return false;
}
return true;
}
bool
audio_check_channel_count(unsigned channels, Error &error)
{
if (!audio_valid_channel_count(channels)) {
error.Format(audio_format_domain,
"Invalid channel count: %u", channels);
return false;
}
return true;
}
bool
audio_format_init_checked(AudioFormat &af, unsigned long sample_rate,
SampleFormat sample_format, unsigned channels,
Error &error)
{
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;
}

46
src/CheckAudioFormat.hxx Normal file
View File

@@ -0,0 +1,46 @@
/*
* 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_CHECK_AUDIO_FORMAT_HXX
#define MPD_CHECK_AUDIO_FORMAT_HXX
#include "AudioFormat.hxx"
class Error;
extern const class Domain audio_format_domain;
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);
/**
* Wrapper for audio_format_init(), which checks all attributes.
*/
bool
audio_format_init_checked(AudioFormat &af, unsigned long sample_rate,
SampleFormat sample_format, unsigned channels,
Error &error);
#endif

24
src/Client.cxx Normal file
View File

@@ -0,0 +1,24 @@
/*
* 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 "ClientInternal.hxx"
#include "util/Domain.hxx"
const Domain client_domain("client");

187
src/Client.hxx Normal file
View File

@@ -0,0 +1,187 @@
/*
* 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_CLIENT_H
#define MPD_CLIENT_H
#include "check.h"
#include "ClientMessage.hxx"
#include "command/CommandListBuilder.hxx"
#include "event/FullyBufferedSocket.hxx"
#include "event/TimeoutMonitor.hxx"
#include "Compiler.h"
#include <set>
#include <string>
#include <list>
#include <stddef.h>
#include <stdarg.h>
struct sockaddr;
class EventLoop;
struct Partition;
class Client final : private FullyBufferedSocket, TimeoutMonitor {
public:
Partition &partition;
struct playlist &playlist;
struct PlayerControl &player_control;
unsigned permission;
/** the uid of the client process, or -1 if unknown */
int uid;
CommandListBuilder cmd_list;
unsigned int num; /* client number */
/** is this client waiting for an "idle" response? */
bool idle_waiting;
/** idle flags pending on this client, to be sent as soon as
the client enters "idle" */
unsigned idle_flags;
/** idle flags that the client wants to receive */
unsigned idle_subscriptions;
/**
* A list of channel names this client is subscribed to.
*/
std::set<std::string> subscriptions;
/**
* The number of subscriptions in #subscriptions. Used to
* limit the number of subscriptions.
*/
unsigned num_subscriptions;
/**
* A list of messages this client has received.
*/
std::list<ClientMessage> messages;
Client(EventLoop &loop, Partition &partition,
int fd, int uid, int num);
bool IsConnected() const {
return FullyBufferedSocket::IsDefined();
}
gcc_pure
bool IsExpired() const {
return !FullyBufferedSocket::IsDefined();
}
void Close();
void SetExpired();
using FullyBufferedSocket::Write;
/**
* returns the uid of the client process, or a negative value
* if the uid is unknown
*/
int GetUID() const {
return uid;
}
/**
* Is this client running on the same machine, connected with
* a local (UNIX domain) socket?
*/
bool IsLocal() const {
return uid > 0;
}
unsigned GetPermission() const {
return permission;
}
void SetPermission(unsigned _permission) {
permission = _permission;
}
/**
* Send "idle" response to this client.
*/
void IdleNotify();
void IdleAdd(unsigned flags);
bool IdleWait(unsigned flags);
enum class SubscribeResult {
/** success */
OK,
/** invalid channel name */
INVALID,
/** already subscribed to this channel */
ALREADY,
/** too many subscriptions */
FULL,
};
gcc_pure
bool IsSubscribed(const char *channel_name) const {
return subscriptions.find(channel_name) != subscriptions.end();
}
SubscribeResult Subscribe(const char *channel);
bool Unsubscribe(const char *channel);
void UnsubscribeAll();
bool PushMessage(const ClientMessage &msg);
private:
/* virtual methods from class BufferedSocket */
virtual InputResult OnSocketInput(void *data, size_t length) override;
virtual void OnSocketError(Error &&error) override;
virtual void OnSocketClosed() override;
/* virtual methods from class TimeoutMonitor */
virtual void OnTimeout() override;
};
void client_manager_init(void);
void
client_new(EventLoop &loop, Partition &partition,
int fd, const struct sockaddr *sa, size_t sa_length, int uid);
/**
* Write a C string to the client.
*/
void client_puts(Client &client, const char *s);
/**
* Write a printf-like formatted string to the client.
*/
void client_vprintf(Client &client, const char *fmt, va_list args);
/**
* Write a printf-like formatted string to the client.
*/
gcc_printf(2,3)
void
client_printf(Client &client, const char *fmt, ...);
#endif

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2009 The Music Player Daemon Project
* 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
@@ -17,16 +17,21 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/** \file
*
* This header provides "extern" declarations for all mixer plugins.
*/
#include "config.h"
#include "ClientInternal.hxx"
#include "util/Error.hxx"
#include "Log.hxx"
#ifndef MPD_MIXER_LIST_H
#define MPD_MIXER_LIST_H
void
Client::OnSocketError(Error &&error)
{
FormatError(error, "error on client %d", num);
extern const struct mixer_plugin alsa_mixer;
extern const struct mixer_plugin oss_mixer;
extern const struct mixer_plugin pulse_mixer;
SetExpired();
}
#endif
void
Client::OnSocketClosed()
{
SetExpired();
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2009 The Music Player Daemon Project
* 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
@@ -17,29 +17,27 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef MPD_TAG_ID3_H
#define MPD_TAG_ID3_H
#include "config.h"
#include "ClientInternal.hxx"
#include "Log.hxx"
struct tag;
#ifdef HAVE_ID3TAG
struct id3_tag;
struct tag *tag_id3_import(struct id3_tag *);
struct tag *tag_id3_load(const char *file);
#else
#include <glib.h>
static inline struct tag *
tag_id3_load(G_GNUC_UNUSED const char *file)
void
Client::SetExpired()
{
return NULL;
if (IsExpired())
return;
FullyBufferedSocket::Close();
TimeoutMonitor::Schedule(0);
}
#endif
void
Client::OnTimeout()
{
if (!IsExpired()) {
assert(!idle_waiting);
FormatDebug(client_domain, "[%u] timeout", num);
}
#endif
Close();
}

70
src/ClientFile.cxx Normal file
View File

@@ -0,0 +1,70 @@
/*
* 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 "ClientFile.hxx"
#include "Client.hxx"
#include "protocol/Ack.hxx"
#include "fs/Path.hxx"
#include "fs/FileSystem.hxx"
#include "util/Error.hxx"
#include "util/Domain.hxx"
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#include <unistd.h>
bool
client_allow_file(const Client &client, Path path_fs, Error &error)
{
#ifdef WIN32
(void)client;
(void)path_fs;
error.Set(ack_domain, ACK_ERROR_PERMISSION, "Access denied");
return false;
#else
const int uid = client.GetUID();
if (uid >= 0 && (uid_t)uid == geteuid())
/* always allow access if user runs his own MPD
instance */
return true;
if (uid <= 0) {
/* unauthenticated client */
error.Set(ack_domain, ACK_ERROR_PERMISSION, "Access denied");
return false;
}
struct stat st;
if (!StatFile(path_fs, st)) {
error.SetErrno();
return false;
}
if (st.st_uid != (uid_t)uid && (st.st_mode & 0444) != 0444) {
/* client is not owner */
error.Set(ack_domain, ACK_ERROR_PERMISSION, "Access denied");
return false;
}
return true;
#endif
}

40
src/ClientFile.hxx Normal file
View File

@@ -0,0 +1,40 @@
/*
* 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_CLIENT_FILE_HXX
#define MPD_CLIENT_FILE_HXX
class Client;
class Path;
class Error;
/**
* Is this client allowed to use the specified local file?
*
* Note that this function is vulnerable to timing/symlink attacks.
* We cannot fix this as long as there are plugins that open a file by
* its name, and not by file descriptor / callbacks.
*
* @param path_fs the absolute path name in filesystem encoding
* @return true if access is allowed
*/
bool
client_allow_file(const Client &client, Path path_fs, Error &error);
#endif

46
src/ClientGlobal.cxx Normal file
View File

@@ -0,0 +1,46 @@
/*
* 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 "ClientInternal.hxx"
#include "ClientList.hxx"
#include "ConfigGlobal.hxx"
#define CLIENT_TIMEOUT_DEFAULT (60)
#define CLIENT_MAX_COMMAND_LIST_DEFAULT (2048*1024)
#define CLIENT_MAX_OUTPUT_BUFFER_SIZE_DEFAULT (8192*1024)
int client_timeout;
size_t client_max_command_list_size;
size_t client_max_output_buffer_size;
void client_manager_init(void)
{
client_timeout = config_get_positive(CONF_CONN_TIMEOUT,
CLIENT_TIMEOUT_DEFAULT);
client_max_command_list_size =
config_get_positive(CONF_MAX_COMMAND_LIST_SIZE,
CLIENT_MAX_COMMAND_LIST_DEFAULT / 1024)
* 1024;
client_max_output_buffer_size =
config_get_positive(CONF_MAX_OUTPUT_BUFFER_SIZE,
CLIENT_MAX_OUTPUT_BUFFER_SIZE_DEFAULT / 1024)
* 1024;
}

75
src/ClientIdle.cxx Normal file
View File

@@ -0,0 +1,75 @@
/*
* 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 "ClientInternal.hxx"
#include "Idle.hxx"
#include <assert.h>
void
Client::IdleNotify()
{
assert(idle_waiting);
assert(idle_flags != 0);
unsigned flags = idle_flags;
idle_flags = 0;
idle_waiting = false;
const char *const*idle_names = idle_get_names();
for (unsigned i = 0; idle_names[i]; ++i) {
if (flags & (1 << i) & idle_subscriptions)
client_printf(*this, "changed: %s\n",
idle_names[i]);
}
client_puts(*this, "OK\n");
TimeoutMonitor::ScheduleSeconds(client_timeout);
}
void
Client::IdleAdd(unsigned flags)
{
if (IsExpired())
return;
idle_flags |= flags;
if (idle_waiting && (idle_flags & idle_subscriptions))
IdleNotify();
}
bool
Client::IdleWait(unsigned flags)
{
assert(!idle_waiting);
idle_waiting = true;
idle_subscriptions = flags;
if (idle_flags & idle_subscriptions) {
IdleNotify();
return true;
} else {
/* disable timeouts while in "idle" */
TimeoutMonitor::Cancel();
return false;
}
}

39
src/ClientInternal.hxx Normal file
View File

@@ -0,0 +1,39 @@
/*
* 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_CLIENT_INTERNAL_HXX
#define MPD_CLIENT_INTERNAL_HXX
#include "check.h"
#include "Client.hxx"
#include "command/CommandResult.hxx"
static constexpr unsigned CLIENT_MAX_SUBSCRIPTIONS = 16;
static constexpr unsigned CLIENT_MAX_MESSAGES = 64;
extern const class Domain client_domain;
extern int client_timeout;
extern size_t client_max_command_list_size;
extern size_t client_max_output_buffer_size;
CommandResult
client_process_line(Client &client, char *line);
#endif

56
src/ClientList.cxx Normal file
View File

@@ -0,0 +1,56 @@
/*
* 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 "ClientList.hxx"
#include "ClientInternal.hxx"
#include <algorithm>
#include <assert.h>
void
ClientList::Remove(Client &client)
{
assert(size > 0);
assert(!list.empty());
auto i = std::find(list.begin(), list.end(), &client);
assert(i != list.end());
list.erase(i);
--size;
}
void
ClientList::CloseAll()
{
while (!list.empty())
list.front()->Close();
assert(size == 0);
}
void
ClientList::IdleAdd(unsigned flags)
{
assert(flags != 0);
for (const auto &client : list)
client->IdleAdd(flags);
}

64
src/ClientList.hxx Normal file
View File

@@ -0,0 +1,64 @@
/*
* 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_CLIENT_LIST_HXX
#define MPD_CLIENT_LIST_HXX
#include <list>
class Client;
class ClientList {
const unsigned max_size;
unsigned size;
std::list<Client *> list;
public:
ClientList(unsigned _max_size)
:max_size(_max_size), size(0) {}
~ClientList() {
CloseAll();
}
std::list<Client *>::iterator begin() {
return list.begin();
}
std::list<Client *>::iterator end() {
return list.end();
}
bool IsFull() const {
return size >= max_size;
}
void Add(Client &client) {
list.push_front(&client);
++size;
}
void Remove(Client &client);
void CloseAll();
void IdleAdd(unsigned flags);
};
#endif

41
src/ClientMessage.cxx Normal file
View File

@@ -0,0 +1,41 @@
/*
* 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 "ClientMessage.hxx"
#include "util/CharUtil.hxx"
#include "Compiler.h"
gcc_const
static bool
valid_channel_char(const char ch)
{
return IsAlphaNumericASCII(ch) ||
ch == '_' || ch == '-' || ch == '.' || ch == ':';
}
bool
client_message_valid_channel_name(const char *name)
{
do {
if (!valid_channel_char(*name))
return false;
} while (*++name != 0);
return true;
}

52
src/ClientMessage.hxx Normal file
View File

@@ -0,0 +1,52 @@
/*
* 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_CLIENT_MESSAGE_H
#define MPD_CLIENT_MESSAGE_H
#include "Compiler.h"
#include <string>
/**
* A client-to-client message.
*/
class ClientMessage {
std::string channel, message;
public:
template<typename T, typename U>
ClientMessage(T &&_channel, U &&_message)
:channel(std::forward<T>(_channel)),
message(std::forward<U>(_message)) {}
const char *GetChannel() const {
return channel.c_str();
}
const char *GetMessage() const {
return message.c_str();
}
};
gcc_pure
bool
client_message_valid_channel_name(const char *name);
#endif

126
src/ClientNew.cxx Normal file
View File

@@ -0,0 +1,126 @@
/*
* 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 "ClientInternal.hxx"
#include "ClientList.hxx"
#include "Partition.hxx"
#include "Instance.hxx"
#include "system/fd_util.h"
#include "system/Resolver.hxx"
#include "Permission.hxx"
#include "util/Error.hxx"
#include "Log.hxx"
#include <glib.h>
#include <assert.h>
#include <sys/types.h>
#ifdef WIN32
#include <winsock2.h>
#else
#include <sys/socket.h>
#endif
#include <unistd.h>
#ifdef HAVE_LIBWRAP
#include <tcpd.h>
#endif
static const char GREETING[] = "OK MPD " PROTOCOL_VERSION "\n";
Client::Client(EventLoop &_loop, Partition &_partition,
int _fd, int _uid, int _num)
:FullyBufferedSocket(_fd, _loop, 16384, client_max_output_buffer_size),
TimeoutMonitor(_loop),
partition(_partition),
playlist(partition.playlist), player_control(partition.pc),
permission(getDefaultPermissions()),
uid(_uid),
num(_num),
idle_waiting(false), idle_flags(0),
num_subscriptions(0)
{
TimeoutMonitor::ScheduleSeconds(client_timeout);
}
void
client_new(EventLoop &loop, Partition &partition,
int fd, const struct sockaddr *sa, size_t sa_length, int uid)
{
static unsigned int next_client_num;
char *remote;
assert(fd >= 0);
#ifdef HAVE_LIBWRAP
if (sa->sa_family != AF_UNIX) {
char *hostaddr = sockaddr_to_string(sa, sa_length,
IgnoreError());
const char *progname = g_get_prgname();
struct request_info req;
request_init(&req, RQ_FILE, fd, RQ_DAEMON, progname, 0);
fromhost(&req);
if (!hosts_access(&req)) {
/* tcp wrappers says no */
FormatWarning(client_domain,
"libwrap refused connection (libwrap=%s) from %s",
progname, hostaddr);
g_free(hostaddr);
close_socket(fd);
return;
}
g_free(hostaddr);
}
#endif /* HAVE_WRAP */
ClientList &client_list = *partition.instance.client_list;
if (client_list.IsFull()) {
LogWarning(client_domain, "Max connections reached");
close_socket(fd);
return;
}
Client *client = new Client(loop, partition, fd, uid,
next_client_num++);
(void)send(fd, GREETING, sizeof(GREETING) - 1, 0);
client_list.Add(*client);
remote = sockaddr_to_string(sa, sa_length, IgnoreError());
FormatInfo(client_domain, "[%u] opened from %s", client->num, remote);
g_free(remote);
}
void
Client::Close()
{
partition.instance.client_list->Remove(*this);
SetExpired();
FormatInfo(client_domain, "[%u] closed", num);
delete this;
}

141
src/ClientProcess.cxx Normal file
View File

@@ -0,0 +1,141 @@
/*
* 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 "ClientInternal.hxx"
#include "protocol/Result.hxx"
#include "command/AllCommands.hxx"
#include "Log.hxx"
#include <string.h>
#define CLIENT_LIST_MODE_BEGIN "command_list_begin"
#define CLIENT_LIST_OK_MODE_BEGIN "command_list_ok_begin"
#define CLIENT_LIST_MODE_END "command_list_end"
static CommandResult
client_process_command_list(Client &client, bool list_ok,
std::list<std::string> &&list)
{
CommandResult ret = CommandResult::OK;
unsigned num = 0;
for (auto &&i : list) {
char *cmd = &*i.begin();
FormatDebug(client_domain, "process command \"%s\"", cmd);
ret = command_process(client, num++, cmd);
FormatDebug(client_domain, "command returned %i", ret);
if (ret != CommandResult::OK || client.IsExpired())
break;
else if (list_ok)
client_puts(client, "list_OK\n");
}
return ret;
}
CommandResult
client_process_line(Client &client, char *line)
{
CommandResult ret;
if (strcmp(line, "noidle") == 0) {
if (client.idle_waiting) {
/* send empty idle response and leave idle mode */
client.idle_waiting = false;
command_success(client);
}
/* do nothing if the client wasn't idling: the client
has already received the full idle response from
client_idle_notify(), which he can now evaluate */
return CommandResult::OK;
} else if (client.idle_waiting) {
/* during idle mode, clients must not send anything
except "noidle" */
FormatWarning(client_domain,
"[%u] command \"%s\" during idle",
client.num, line);
return CommandResult::CLOSE;
}
if (client.cmd_list.IsActive()) {
if (strcmp(line, CLIENT_LIST_MODE_END) == 0) {
FormatDebug(client_domain,
"[%u] process command list",
client.num);
auto &&cmd_list = client.cmd_list.Commit();
ret = client_process_command_list(client,
client.cmd_list.IsOKMode(),
std::move(cmd_list));
FormatDebug(client_domain,
"[%u] process command "
"list returned %i", client.num, ret);
if (ret == CommandResult::CLOSE ||
client.IsExpired())
return CommandResult::CLOSE;
if (ret == CommandResult::OK)
command_success(client);
client.cmd_list.Reset();
} else {
if (!client.cmd_list.Add(line)) {
FormatWarning(client_domain,
"[%u] command list size "
"is larger than the max (%lu)",
client.num,
(unsigned long)client_max_command_list_size);
return CommandResult::CLOSE;
}
ret = CommandResult::OK;
}
} else {
if (strcmp(line, CLIENT_LIST_MODE_BEGIN) == 0) {
client.cmd_list.Begin(false);
ret = CommandResult::OK;
} else if (strcmp(line, CLIENT_LIST_OK_MODE_BEGIN) == 0) {
client.cmd_list.Begin(true);
ret = CommandResult::OK;
} else {
FormatDebug(client_domain,
"[%u] process command \"%s\"",
client.num, line);
ret = command_process(client, 0, line);
FormatDebug(client_domain,
"[%u] command returned %i",
client.num, ret);
if (ret == CommandResult::CLOSE ||
client.IsExpired())
return CommandResult::CLOSE;
if (ret == CommandResult::OK)
command_success(client);
}
}
return ret;
}

76
src/ClientRead.cxx Normal file
View File

@@ -0,0 +1,76 @@
/*
* 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 "ClientInternal.hxx"
#include "Main.hxx"
#include "event/Loop.hxx"
#include "util/CharUtil.hxx"
#include <assert.h>
#include <string.h>
BufferedSocket::InputResult
Client::OnSocketInput(void *data, size_t length)
{
char *p = (char *)data;
char *newline = (char *)memchr(p, '\n', length);
if (newline == nullptr)
return InputResult::MORE;
TimeoutMonitor::ScheduleSeconds(client_timeout);
BufferedSocket::ConsumeInput(newline + 1 - p);
/* skip whitespace at the end of the line */
while (newline > p && IsWhitespaceOrNull(newline[-1]))
--newline;
/* terminate the string at the end of the line */
*newline = 0;
CommandResult result = client_process_line(*this, p);
switch (result) {
case CommandResult::OK:
case CommandResult::IDLE:
case CommandResult::ERROR:
break;
case CommandResult::KILL:
Close();
main_loop->Break();
return InputResult::CLOSED;
case CommandResult::FINISH:
if (Flush())
Close();
return InputResult::CLOSED;
case CommandResult::CLOSE:
Close();
return InputResult::CLOSED;
}
if (IsExpired()) {
Close();
return InputResult::CLOSED;
}
return InputResult::AGAIN;
}

92
src/ClientSubscribe.cxx Normal file
View File

@@ -0,0 +1,92 @@
/*
* 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 "ClientInternal.hxx"
#include "Idle.hxx"
#include <assert.h>
#include <string.h>
bool Unsubscribe(const char *channel);
void UnsubscribeAll();
bool PushMessage(const ClientMessage &msg);
Client::SubscribeResult
Client::Subscribe(const char *channel)
{
assert(channel != nullptr);
if (!client_message_valid_channel_name(channel))
return Client::SubscribeResult::INVALID;
if (num_subscriptions >= CLIENT_MAX_SUBSCRIPTIONS)
return Client::SubscribeResult::FULL;
auto r = subscriptions.insert(channel);
if (!r.second)
return Client::SubscribeResult::ALREADY;
++num_subscriptions;
idle_add(IDLE_SUBSCRIPTION);
return Client::SubscribeResult::OK;
}
bool
Client::Unsubscribe(const char *channel)
{
const auto i = subscriptions.find(channel);
if (i == subscriptions.end())
return false;
assert(num_subscriptions > 0);
subscriptions.erase(i);
--num_subscriptions;
idle_add(IDLE_SUBSCRIPTION);
assert((num_subscriptions == 0) ==
subscriptions.empty());
return true;
}
void
Client::UnsubscribeAll()
{
subscriptions.clear();
num_subscriptions = 0;
}
bool
Client::PushMessage(const ClientMessage &msg)
{
if (messages.size() >= CLIENT_MAX_MESSAGES ||
!IsSubscribed(msg.GetChannel()))
return false;
if (messages.empty())
IdleAdd(IDLE_MESSAGE);
messages.push_back(msg);
return true;
}

61
src/ClientWrite.cxx Normal file
View File

@@ -0,0 +1,61 @@
/*
* 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 "ClientInternal.hxx"
#include "util/FormatString.hxx"
#include <string.h>
/**
* Write a block of data to the client.
*/
static void
client_write(Client &client, const char *data, size_t length)
{
/* if the client is going to be closed, do nothing */
if (client.IsExpired() || length == 0)
return;
client.Write(data, length);
}
void
client_puts(Client &client, const char *s)
{
client_write(client, s, strlen(s));
}
void
client_vprintf(Client &client, const char *fmt, va_list args)
{
char *p = FormatNewV(fmt, args);
client_write(client, p, strlen(p));
delete[] p;
}
void
client_printf(Client &client, const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
client_vprintf(client, fmt, args);
va_end(args);
}

253
src/CommandLine.cxx Normal file
View File

@@ -0,0 +1,253 @@
/*
* 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 "CommandLine.hxx"
#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 "fs/AllocatedPath.hxx"
#include "fs/Traits.hxx"
#include "fs/FileSystem.hxx"
#include "util/Error.hxx"
#include "util/Domain.hxx"
#include "system/FatalError.hxx"
#ifdef ENABLE_ENCODER
#include "EncoderList.hxx"
#include "EncoderPlugin.hxx"
#endif
#ifdef ENABLE_ARCHIVE
#include "ArchiveList.hxx"
#include "ArchivePlugin.hxx"
#endif
#include <glib.h>
#include <stdio.h>
#include <stdlib.h>
#ifdef WIN32
#define CONFIG_FILE_LOCATION "\\mpd\\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"
#endif
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:");
decoder_plugins_for_each([](const DecoderPlugin &plugin){
printf(" [%s]", plugin.name);
const char *const*suffixes = plugin.suffixes;
if (suffixes != nullptr)
for (; *suffixes != nullptr; ++suffixes)
printf(" %s", *suffixes);
puts("");
});
puts("\n"
"Output plugins:");
audio_output_plugins_for_each(plugin)
printf(" %s", plugin->name);
puts("");
#ifdef ENABLE_ENCODER
puts("\n"
"Encoder plugins:");
encoder_plugins_for_each(plugin)
printf(" %s", plugin->name);
puts("");
#endif
#ifdef ENABLE_ARCHIVE
puts("\n"
"Archive plugins:");
archive_plugins_for_each(plugin) {
printf(" [%s]", plugin->name);
const char *const*suffixes = plugin->suffixes;
if (suffixes != nullptr)
for (; *suffixes != nullptr; ++suffixes)
printf(" %s", *suffixes);
puts("");
}
#endif
puts("\n"
"Input plugins:");
input_plugins_for_each(plugin)
printf(" %s", plugin->name);
puts("\n\n"
"Playlist plugins:");
playlist_plugins_for_each(plugin)
printf(" %s", plugin->name);
puts("\n\n"
"Protocols:");
print_supported_uri_schemes_to_fp(stdout);
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)
{
if (a.IsNull())
return AllocatedPath::Null();
return AllocatedPath::Build(a, b);
}
bool
parse_cmdline(int argc, char **argv, struct options *options,
Error &error)
{
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 }
};
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);
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();
/* 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) {
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;
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2009 The Music Player Daemon Project
* 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
@@ -17,19 +17,22 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef CMDLINE_H
#define CMDLINE_H
#ifndef MPD_COMMAND_LINE_HXX
#define MPD_COMMAND_LINE_HXX
#include <glib.h>
typedef struct _Options {
class Error;
struct options {
gboolean kill;
gboolean daemon;
gboolean stdOutput;
gboolean log_stderr;
gboolean verbose;
int createDB;
} Options;
};
void parseOptions(int argc, char **argv, Options *options);
bool
parse_cmdline(int argc, char **argv, struct options *options,
Error &error);
#endif

174
src/Compiler.h Normal file
View File

@@ -0,0 +1,174 @@
/*
* 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 COMPILER_H
#define COMPILER_H
#define GCC_CHECK_VERSION(major, minor) \
(defined(__GNUC__) && \
(__GNUC__ > (major) || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor))))
#ifdef __GNUC__
#define GCC_VERSION (__GNUC__ * 10000 \
+ __GNUC_MINOR__ * 100 \
+ __GNUC_PATCHLEVEL__)
#else
#define GCC_VERSION 0
#endif
#ifdef __clang__
# define CLANG_VERSION (__clang_major__ * 10000 \
+ __clang_minor__ * 100 \
+ __clang_patchlevel__)
# 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.
# endif
#else
# warning Untested compiler. Use at your own risk!
#endif
#if GCC_CHECK_VERSION(4,0)
/* GCC 4.x */
#define gcc_const __attribute__((const))
#define gcc_deprecated __attribute__((deprecated))
#define gcc_may_alias __attribute__((may_alias))
#define gcc_malloc __attribute__((malloc))
#define gcc_noreturn __attribute__((noreturn))
#define gcc_packed __attribute__((packed))
#define gcc_printf(a,b) __attribute__((format(printf, a, b)))
#define gcc_pure __attribute__((pure))
#define gcc_sentinel __attribute__((sentinel))
#define gcc_unused __attribute__((unused))
#define gcc_warn_unused_result __attribute__((warn_unused_result))
#define gcc_nonnull(...) __attribute__((nonnull(__VA_ARGS__)))
#define gcc_nonnull_all __attribute__((nonnull))
#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")))
#define gcc_always_inline __attribute__((always_inline))
#else
/* generic C compiler */
#define gcc_const
#define gcc_deprecated
#define gcc_may_alias
#define gcc_malloc
#define gcc_noreturn
#define gcc_packed
#define gcc_printf(a,b)
#define gcc_pure
#define gcc_sentinel
#define gcc_unused
#define gcc_warn_unused_result
#define gcc_nonnull(...)
#define gcc_nonnull_all
#define gcc_likely(x) (x)
#define gcc_unlikely(x) (x)
#define gcc_aligned(n)
#define gcc_visibility_hidden
#define gcc_visibility_default
#define gcc_always_inline inline
#endif
#if GCC_CHECK_VERSION(4,3)
#define gcc_hot __attribute__((hot))
#define gcc_cold __attribute__((cold))
#else /* ! GCC_UNUSED >= 40300 */
#define gcc_hot
#define gcc_cold
#endif /* ! GCC_UNUSED >= 40300 */
#if GCC_CHECK_VERSION(4,6) && !defined(__clang__)
#define gcc_flatten __attribute__((flatten))
#else
#define gcc_flatten
#endif
#ifndef __cplusplus
/* plain C99 has "restrict" */
#define gcc_restrict restrict
#elif GCC_CHECK_VERSION(4,0)
/* "__restrict__" is a GCC extension for C++ */
#define gcc_restrict __restrict__
#else
/* disable it on other compilers */
#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
#endif
#if __has_feature(attribute_unused_on_fields)
#define gcc_unused_field gcc_unused
#else
#define gcc_unused_field
#endif
#if defined(__GNUC__) || defined(__clang__)
#define gcc_unreachable() __builtin_unreachable()
#else
#define gcc_unreachable()
#endif
#endif

160
src/ConfigData.cxx Normal file
View File

@@ -0,0 +1,160 @@
/*
* 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 "ConfigData.hxx"
#include "ConfigParser.hxx"
#include "ConfigPath.hxx"
#include "util/Error.hxx"
#include "fs/AllocatedPath.hxx"
#include "system/FatalError.hxx"
#include <assert.h>
#include <string.h>
#include <stdlib.h>
int
block_param::GetIntValue() const
{
char *endptr;
long value2 = strtol(value.c_str(), &endptr, 0);
if (*endptr != 0)
FormatFatalError("Not a valid number in line %i", line);
return value2;
}
unsigned
block_param::GetUnsignedValue() const
{
char *endptr;
unsigned long value2 = strtoul(value.c_str(), &endptr, 0);
if (*endptr != 0)
FormatFatalError("Not a valid number in line %i", line);
return (unsigned)value2;
}
bool
block_param::GetBoolValue() const
{
bool value2;
if (!get_bool(value.c_str(), &value2))
FormatFatalError("%s is not a boolean value (yes, true, 1) or "
"(no, false, 0) on line %i\n",
name.c_str(), line);
return value2;
}
config_param::config_param(const char *_value, int _line)
:next(nullptr), value(_value), line(_line) {}
config_param::~config_param()
{
delete next;
}
const block_param *
config_param::GetBlockParam(const char *name) const
{
for (const auto &i : block_params) {
if (i.name == name) {
i.used = true;
return &i;
}
}
return NULL;
}
const char *
config_param::GetBlockValue(const char *name, const char *default_value) const
{
const block_param *bp = GetBlockParam(name);
if (bp == nullptr)
return default_value;
return bp->value.c_str();
}
AllocatedPath
config_param::GetBlockPath(const char *name, const char *default_value,
Error &error) const
{
assert(!error.IsDefined());
int line2 = line;
const char *s;
const block_param *bp = GetBlockParam(name);
if (bp != nullptr) {
line2 = bp->line;
s = bp->value.c_str();
} else {
if (default_value == nullptr)
return AllocatedPath::Null();
s = default_value;
}
AllocatedPath path = ParsePath(s, error);
if (gcc_unlikely(path.IsNull()))
error.FormatPrefix("Invalid path in \"%s\" at line %i: ",
name, line2);
return path;
}
AllocatedPath
config_param::GetBlockPath(const char *name, Error &error) const
{
return GetBlockPath(name, nullptr, error);
}
int
config_param::GetBlockValue(const char *name, int default_value) const
{
const block_param *bp = GetBlockParam(name);
if (bp == nullptr)
return default_value;
return bp->GetIntValue();
}
unsigned
config_param::GetBlockValue(const char *name, unsigned default_value) const
{
const block_param *bp = GetBlockParam(name);
if (bp == nullptr)
return default_value;
return bp->GetUnsignedValue();
}
gcc_pure
bool
config_param::GetBlockValue(const char *name, bool default_value) const
{
const block_param *bp = GetBlockParam(name);
if (bp == NULL)
return default_value;
return bp->GetBoolValue();
}

134
src/ConfigData.hxx Normal file
View File

@@ -0,0 +1,134 @@
/*
* 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_DATA_HXX
#define MPD_CONFIG_DATA_HXX
#include "ConfigOption.hxx"
#include "Compiler.h"
#include <string>
#include <array>
#include <vector>
class AllocatedPath;
class Error;
struct block_param {
std::string name;
std::string value;
int line;
/**
* This flag is false when nobody has queried the value of
* this option yet.
*/
mutable bool used;
gcc_nonnull_all
block_param(const char *_name, const char *_value, int _line=-1)
:name(_name), value(_value), line(_line), used(false) {}
gcc_pure
int GetIntValue() const;
gcc_pure
unsigned GetUnsignedValue() const;
gcc_pure
bool GetBoolValue() const;
};
struct config_param {
/**
* The next config_param with the same name. The destructor
* deletes the whole chain.
*/
struct config_param *next;
std::string value;
unsigned int line;
std::vector<block_param> block_params;
/**
* This flag is false when nobody has queried the value of
* this option yet.
*/
bool used;
config_param(int _line=-1)
:next(nullptr), line(_line), used(false) {}
gcc_nonnull_all
config_param(const char *_value, int _line=-1);
config_param(const config_param &) = delete;
~config_param();
config_param &operator=(const config_param &) = delete;
/**
* Determine if this is a "null" instance, i.e. an empty
* object that was synthesized and not loaded from a
* configuration file.
*/
bool IsNull() const {
return line == unsigned(-1);
}
gcc_nonnull_all
void AddBlockParam(const char *_name, const char *_value,
int _line=-1) {
block_params.emplace_back(_name, _value, _line);
}
gcc_nonnull_all gcc_pure
const block_param *GetBlockParam(const char *_name) const;
gcc_pure
const char *GetBlockValue(const char *name,
const char *default_value=nullptr) const;
/**
* Same as config_dup_path(), but looks up the setting in the
* specified block.
*/
AllocatedPath GetBlockPath(const char *name, const char *default_value,
Error &error) const;
AllocatedPath GetBlockPath(const char *name, Error &error) const;
gcc_pure
int GetBlockValue(const char *name, int default_value) const;
gcc_pure
unsigned GetBlockValue(const char *name, unsigned default_value) const;
gcc_pure
bool GetBlockValue(const char *name, bool default_value) const;
};
struct ConfigData {
std::array<config_param *, std::size_t(CONF_MAX)> params;
};
#endif

26
src/ConfigDefaults.hxx Normal file
View File

@@ -0,0 +1,26 @@
/*
* 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_DEFAULTS_HXX
#define MPD_CONFIG_DEFAULTS_HXX
static constexpr unsigned DEFAULT_PLAYLIST_MAX_LENGTH = 16 * 1024;
static constexpr bool DEFAULT_PLAYLIST_SAVE_ABSOLUTE_PATHS = false;
#endif

23
src/ConfigError.cxx Normal file
View File

@@ -0,0 +1,23 @@
/*
* 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 "ConfigError.hxx"
#include "util/Domain.hxx"
const Domain config_domain("config");

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2009 The Music Player Daemon Project
* 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
@@ -17,9 +17,9 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef MPD_INPUT_FILE_H
#define MPD_INPUT_FILE_H
#ifndef MPD_CONFIG_ERROR_HXX
#define MPD_CONFIG_ERROR_HXX
extern const struct input_plugin input_plugin_file;
extern const class Domain config_domain;
#endif

272
src/ConfigFile.cxx Normal file
View File

@@ -0,0 +1,272 @@
/*
* 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;
}

30
src/ConfigFile.hxx Normal file
View File

@@ -0,0 +1,30 @@
/*
* 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_FILE_HXX
#define MPD_CONFIG_FILE_HXX
class Error;
class Path;
struct ConfigData;
bool
ReadConfigFile(ConfigData &data, Path path, Error &error);
#endif

177
src/ConfigGlobal.cxx Normal file
View File

@@ -0,0 +1,177 @@
/*
* 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 "ConfigGlobal.hxx"
#include "ConfigParser.hxx"
#include "ConfigData.hxx"
#include "ConfigFile.hxx"
#include "ConfigPath.hxx"
#include "ConfigError.hxx"
#include "fs/Path.hxx"
#include "fs/AllocatedPath.hxx"
#include "util/Error.hxx"
#include "system/FatalError.hxx"
#include "Log.hxx"
#include <assert.h>
#include <string.h>
#include <stdlib.h>
static ConfigData config_data;
void config_global_finish(void)
{
for (auto i : config_data.params)
delete i;
}
void config_global_init(void)
{
}
bool
ReadConfigFile(Path path, Error &error)
{
return ReadConfigFile(config_data, path, error);
}
static void
Check(const config_param *param)
{
if (!param->used)
/* this whole config_param was not queried at all -
the feature might be disabled at compile time?
Silently ignore it here. */
return;
for (const auto &i : param->block_params) {
if (!i.used)
FormatWarning(config_domain,
"option '%s' on line %i was not recognized",
i.name.c_str(), i.line);
}
}
void config_global_check(void)
{
for (auto i : config_data.params)
for (const config_param *p = i; p != nullptr; p = p->next)
Check(p);
}
const struct config_param *
config_get_next_param(ConfigOption option, const struct config_param * last)
{
config_param *param = last != nullptr
? last->next
: config_data.params[unsigned(option)];
if (param != nullptr)
param->used = true;
return param;
}
const char *
config_get_string(ConfigOption option, const char *default_value)
{
const struct config_param *param = config_get_param(option);
if (param == nullptr)
return default_value;
return param->value.c_str();
}
AllocatedPath
config_get_path(ConfigOption option, Error &error)
{
const struct config_param *param = config_get_param(option);
if (param == nullptr)
return AllocatedPath::Null();
return config_parse_path(param, error);
}
AllocatedPath
config_parse_path(const struct config_param *param, Error & error)
{
AllocatedPath path = ParsePath(param->value.c_str(), error);
if (gcc_unlikely(path.IsNull()))
error.FormatPrefix("Invalid path at line %i: ",
param->line);
return path;
}
unsigned
config_get_unsigned(ConfigOption option, unsigned default_value)
{
const struct config_param *param = config_get_param(option);
long value;
char *endptr;
if (param == nullptr)
return default_value;
value = strtol(param->value.c_str(), &endptr, 0);
if (*endptr != 0 || value < 0)
FormatFatalError("Not a valid non-negative number in line %i",
param->line);
return (unsigned)value;
}
unsigned
config_get_positive(ConfigOption option, unsigned default_value)
{
const struct config_param *param = config_get_param(option);
long value;
char *endptr;
if (param == nullptr)
return default_value;
value = strtol(param->value.c_str(), &endptr, 0);
if (*endptr != 0)
FormatFatalError("Not a valid number in line %i", param->line);
if (value <= 0)
FormatFatalError("Not a positive number in line %i",
param->line);
return (unsigned)value;
}
bool
config_get_bool(ConfigOption option, bool default_value)
{
const struct config_param *param = config_get_param(option);
bool success, value;
if (param == nullptr)
return default_value;
success = get_bool(param->value.c_str(), &value);
if (!success)
FormatFatalError("Expected boolean value (yes, true, 1) or "
"(no, false, 0) on line %i\n",
param->line);
return value;
}

95
src/ConfigGlobal.hxx Normal file
View File

@@ -0,0 +1,95 @@
/*
* 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_GLOBAL_HXX
#define MPD_CONFIG_GLOBAL_HXX
#include "ConfigOption.hxx"
#include "Compiler.h"
class Error;
class Path;
class AllocatedPath;
void config_global_init(void);
void config_global_finish(void);
/**
* Call this function after all configuration has been evaluated. It
* checks for unused parameters, and logs warnings.
*/
void config_global_check(void);
bool
ReadConfigFile(Path path, Error &error);
/* don't free the returned value
set _last_ to nullptr to get first entry */
gcc_pure
const struct config_param *
config_get_next_param(enum ConfigOption option,
const struct config_param *last);
gcc_pure
static inline const struct config_param *
config_get_param(enum ConfigOption option)
{
return config_get_next_param(option, nullptr);
}
/* Note on gcc_pure: Some of the functions declared pure are not
really pure in strict sense. They have side effect such that they
validate parameter's value and signal an error if it's invalid.
However, if the argument was already validated or we don't care
about the argument at all, this may be ignored so in the end, we
should be fine with calling those functions pure. */
gcc_pure
const char *
config_get_string(enum ConfigOption option, const char *default_value);
/**
* Returns an optional configuration variable which contains an
* absolute path. If there is a tilde prefix, it is expanded.
* Returns AllocatedPath::Null() if the value is not present. If the path
* could not be parsed, returns AllocatedPath::Null() and sets the error.
*/
AllocatedPath
config_get_path(enum ConfigOption option, Error &error);
/**
* Parse a configuration parameter as a path.
* If there is a tilde prefix, it is expanded. If the path could
* not be parsed, returns AllocatedPath::Null() and sets the error.
*/
AllocatedPath
config_parse_path(const struct config_param *param, Error & error_r);
gcc_pure
unsigned
config_get_unsigned(enum ConfigOption option, unsigned default_value);
gcc_pure
unsigned
config_get_positive(enum ConfigOption option, unsigned default_value);
gcc_pure
bool config_get_bool(enum ConfigOption option, bool default_value);
#endif

90
src/ConfigOption.hxx Normal file
View File

@@ -0,0 +1,90 @@
/*
* 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

40
src/ConfigParser.cxx Normal file
View File

@@ -0,0 +1,40 @@
/*
* 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 "ConfigParser.hxx"
#include "util/StringUtil.hxx"
bool
get_bool(const char *value, bool *value_r)
{
static const char *t[] = { "yes", "true", "1", nullptr };
static const char *f[] = { "no", "false", "0", nullptr };
if (string_array_contains(t, value)) {
*value_r = true;
return true;
}
if (string_array_contains(f, value)) {
*value_r = false;
return true;
}
return false;
}

26
src/ConfigParser.hxx Normal file
View File

@@ -0,0 +1,26 @@
/*
* 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_PARSER_HXX
#define MPD_CONFIG_PARSER_HXX
bool
get_bool(const char *value, bool *value_r);
#endif

132
src/ConfigPath.cxx Normal file
View File

@@ -0,0 +1,132 @@
/*
* 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 "ConfigPath.hxx"
#include "fs/AllocatedPath.hxx"
#include "fs/Traits.hxx"
#include "fs/Domain.hxx"
#include "util/Error.hxx"
#include "ConfigGlobal.hxx"
#include <glib.h>
#include <assert.h>
#include <string.h>
#ifndef WIN32
#include <pwd.h>
/**
* Determine a given user's home directory.
*/
static AllocatedPath
GetHome(const char *user, Error &error)
{
passwd *pw = getpwnam(user);
if (pw == nullptr) {
error.Format(path_domain,
"no such user: %s", user);
return AllocatedPath::Null();
}
return AllocatedPath::FromFS(pw->pw_dir);
}
/**
* Determine the current user's home directory.
*/
static AllocatedPath
GetHome(Error &error)
{
const char *home = g_get_home_dir();
if (home == nullptr) {
error.Set(path_domain,
"problems getting home for current user");
return AllocatedPath::Null();
}
return AllocatedPath::FromUTF8(home, error);
}
/**
* Determine the configured user's home directory.
*/
static AllocatedPath
GetConfiguredHome(Error &error)
{
const char *user = config_get_string(CONF_USER, nullptr);
return user != nullptr
? GetHome(user, error)
: GetHome(error);
}
#endif
AllocatedPath
ParsePath(const char *path, Error &error)
{
assert(path != nullptr);
#ifndef WIN32
if (path[0] == '~') {
++path;
if (*path == '\0')
return GetConfiguredHome(error);
AllocatedPath home = AllocatedPath::Null();
if (*path == '/') {
home = GetConfiguredHome(error);
++path;
} else {
const char *slash = strchr(path, '/');
const char *end = slash == nullptr
? path + strlen(path)
: slash;
const std::string user(path, end);
home = GetHome(user.c_str(), error);
if (slash == nullptr)
return home;
path = slash + 1;
}
if (home.IsNull())
return AllocatedPath::Null();
AllocatedPath path2 = AllocatedPath::FromUTF8(path, error);
if (path2.IsNull())
return AllocatedPath::Null();
return AllocatedPath::Build(home, path2);
} else if (!PathTraits::IsAbsoluteUTF8(path)) {
error.Format(path_domain,
"not an absolute path: %s", path);
return AllocatedPath::Null();
} else {
#endif
return AllocatedPath::FromUTF8(path, error);
#ifndef WIN32
}
#endif
}

29
src/ConfigPath.hxx Normal file
View File

@@ -0,0 +1,29 @@
/*
* 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_PATH_HXX
#define MPD_CONFIG_PATH_HXX
class AllocatedPath;
class Error;
AllocatedPath
ParsePath(const char *path, Error &error);
#endif

96
src/ConfigTemplates.cxx Normal file
View File

@@ -0,0 +1,96 @@
/*
* 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;
}

33
src/ConfigTemplates.hxx Normal file
View File

@@ -0,0 +1,33 @@
/*
* 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_TEMPLATES_HXX
#define MPD_CONFIG_TEMPLATES_HXX
#include "ConfigOption.hxx"
struct ConfigTemplate {
const char *const name;
const bool repeatable;
const bool block;
};
extern const ConfigTemplate config_templates[];
#endif

140
src/CrossFade.cxx Normal file
View File

@@ -0,0 +1,140 @@
/*
* 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 "CrossFade.hxx"
#include "MusicChunk.hxx"
#include "AudioFormat.hxx"
#include "util/NumberParser.hxx"
#include "util/Domain.hxx"
#include "Log.hxx"
#include <assert.h>
#include <string.h>
#include <stdlib.h>
static constexpr Domain cross_fade_domain("cross_fade");
gcc_pure
static float
mixramp_interpolate(const char *ramp_list, float required_db)
{
float last_db = 0, last_secs = 0;
bool have_last = false;
/* ramp_list is a string of pairs of dBs and seconds that describe the
* volume profile. Delimiters are semi-colons between pairs and spaces
* between the dB and seconds of a pair.
* The dB values must be monotonically increasing for this to work. */
while (1) {
/* Parse the dB value. */
char *endptr;
const float db = ParseFloat(ramp_list, &endptr);
if (endptr == ramp_list || *endptr != ' ')
break;
ramp_list = endptr + 1;
/* Parse the time. */
float secs = ParseFloat(ramp_list, &endptr);
if (endptr == ramp_list || (*endptr != ';' && *endptr != 0))
break;
ramp_list = endptr;
if (*ramp_list == ';')
++ramp_list;
/* Check for exact match. */
if (db == required_db) {
return secs;
}
/* Save if too quiet. */
if (db < required_db) {
last_db = db;
last_secs = secs;
have_last = true;
continue;
}
/* If required db < any stored value, use the least. */
if (!have_last)
return secs;
/* Finally, interpolate linearly. */
secs = last_secs + (required_db - last_db) * (secs - last_secs) / (db - last_db);
return secs;
}
return -1;
}
unsigned
CrossFadeSettings::Calculate(float total_time,
float replay_gain_db, float replay_gain_prev_db,
const char *mixramp_start, const char *mixramp_prev_end,
const AudioFormat af,
const AudioFormat old_format,
unsigned max_chunks) const
{
unsigned int chunks = 0;
float chunks_f;
if (duration < 0 || duration >= total_time ||
/* we can't crossfade when the audio formats are different */
af != old_format)
return 0;
assert(duration >= 0);
assert(af.IsValid());
chunks_f = (float)af.GetTimeToSize() / (float)CHUNK_SIZE;
if (mixramp_delay <= 0 || !mixramp_start || !mixramp_prev_end) {
chunks = (chunks_f * duration + 0.5);
} else {
/* Calculate mixramp overlap. */
const float mixramp_overlap_current =
mixramp_interpolate(mixramp_start,
mixramp_db - replay_gain_db);
const float mixramp_overlap_prev =
mixramp_interpolate(mixramp_prev_end,
mixramp_db - replay_gain_prev_db);
const float mixramp_overlap =
mixramp_overlap_current + mixramp_overlap_prev;
if (mixramp_overlap_current >= 0 &&
mixramp_overlap_prev >= 0 &&
mixramp_delay <= mixramp_overlap) {
chunks = (chunks_f * (mixramp_overlap - mixramp_delay));
FormatDebug(cross_fade_domain,
"will overlap %d chunks, %fs", chunks,
mixramp_overlap - mixramp_delay);
}
}
if (chunks > max_chunks) {
chunks = max_chunks;
LogWarning(cross_fade_domain,
"audio_buffer_size too small for computed MixRamp overlap");
}
return chunks;
}

71
src/CrossFade.hxx Normal file
View File

@@ -0,0 +1,71 @@
/*
* 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_CROSSFADE_HXX
#define MPD_CROSSFADE_HXX
#include "Compiler.h"
struct AudioFormat;
struct CrossFadeSettings {
/**
* The configured cross fade duration [s].
*/
float duration;
float mixramp_db;
/**
* The configured MixRapm delay [s]. A non-positive value
* disables MixRamp.
*/
float mixramp_delay;
CrossFadeSettings()
:duration(0),
mixramp_db(0),
mixramp_delay(-1)
{}
/**
* Calculate how many music pipe chunks should be used for crossfading.
*
* @param total_time total_time the duration of the new song
* @param replay_gain_db the ReplayGain adjustment used for this song
* @param replay_gain_prev_db the ReplayGain adjustment used on the last song
* @param mixramp_start the next songs mixramp_start tag
* @param mixramp_prev_end the last songs mixramp_end setting
* @param af the audio format of the new song
* @param old_format the audio format of the current song
* @param max_chunks the maximum number of chunks
* @return the number of chunks for crossfading, or 0 if cross fading
* should be disabled for this song change
*/
gcc_pure
unsigned Calculate(float total_time,
float replay_gain_db, float replay_gain_prev_db,
const char *mixramp_start,
const char *mixramp_prev_end,
AudioFormat af, AudioFormat old_format,
unsigned max_chunks) const;
};
#endif

244
src/Daemon.cxx Normal file
View File

@@ -0,0 +1,244 @@
/*
* 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 "Daemon.hxx"
#include "system/FatalError.hxx"
#include "fs/AllocatedPath.hxx"
#include "fs/FileSystem.hxx"
#include "util/Domain.hxx"
#include "Log.hxx"
#include <glib.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#ifndef WIN32
#include <signal.h>
#include <pwd.h>
#include <grp.h>
#endif
static constexpr Domain daemon_domain("daemon");
#ifndef WIN32
/** the Unix user name which MPD runs as */
static char *user_name;
/** the Unix user id which MPD runs as */
static uid_t user_uid = (uid_t)-1;
/** the Unix group id which MPD runs as */
static gid_t user_gid = (pid_t)-1;
/** the absolute path of the pidfile */
static AllocatedPath pidfile = AllocatedPath::Null();
/* whether "group" conf. option was given */
static bool had_group = false;
void
daemonize_kill(void)
{
FILE *fp;
int pid, ret;
if (pidfile.IsNull())
FatalError("no pid_file specified in the config file");
fp = FOpen(pidfile, "r");
if (fp == nullptr) {
const std::string utf8 = pidfile.ToUTF8();
FormatFatalSystemError("Unable to open pid file \"%s\"",
utf8.c_str());
}
if (fscanf(fp, "%i", &pid) != 1) {
const std::string utf8 = pidfile.ToUTF8();
FormatFatalError("unable to read the pid from file \"%s\"",
utf8.c_str());
}
fclose(fp);
ret = kill(pid, SIGTERM);
if (ret < 0)
FormatFatalSystemError("unable to kill process %i",
int(pid));
exit(EXIT_SUCCESS);
}
void
daemonize_close_stdin(void)
{
close(STDIN_FILENO);
open("/dev/null", O_RDONLY);
}
void
daemonize_set_user(void)
{
if (user_name == nullptr)
return;
/* set gid */
if (user_gid != (gid_t)-1 && user_gid != getgid()) {
if (setgid(user_gid) == -1) {
FormatFatalSystemError("Failed to set group %d",
(int)user_gid);
}
}
#ifdef _BSD_SOURCE
/* init suplementary groups
* (must be done before we change our uid)
*/
if (!had_group && initgroups(user_name, user_gid) == -1) {
FormatFatalSystemError("Failed to set supplementary groups "
"of user \"%s\"",
user_name);
}
#endif
/* set uid */
if (user_uid != (uid_t)-1 && user_uid != getuid() &&
setuid(user_uid) == -1) {
FormatFatalSystemError("Failed to set user \"%s\"",
user_name);
}
}
static void
daemonize_detach(void)
{
/* flush all file handles before duplicating the buffers */
fflush(nullptr);
#ifdef HAVE_DAEMON
if (daemon(0, 1))
FatalSystemError("daemon() failed");
#elif defined(HAVE_FORK)
/* detach from parent process */
switch (fork()) {
case -1:
FatalSystemError("fork() failed");
case 0:
break;
default:
/* exit the parent process */
_exit(EXIT_SUCCESS);
}
/* release the current working directory */
if (chdir("/") < 0)
FatalError("problems changing to root directory");
/* detach from the current session */
setsid();
#else
FatalError("no support for daemonizing");
#endif
LogDebug(daemon_domain, "daemonized");
}
void
daemonize(bool detach)
{
FILE *fp = nullptr;
if (!pidfile.IsNull()) {
/* do this before daemon'izing so we can fail gracefully if we can't
* write to the pid file */
LogDebug(daemon_domain, "opening pid file");
fp = FOpen(pidfile, "w+");
if (!fp) {
const std::string utf8 = pidfile.ToUTF8();
FormatFatalSystemError("Failed to create pid file \"%s\"",
pidfile.c_str());
}
}
if (detach)
daemonize_detach();
if (!pidfile.IsNull()) {
LogDebug(daemon_domain, "writing pid file");
fprintf(fp, "%lu\n", (unsigned long)getpid());
fclose(fp);
}
}
void
daemonize_init(const char *user, const char *group, AllocatedPath &&_pidfile)
{
if (user) {
struct passwd *pwd = getpwnam(user);
if (pwd == nullptr)
FormatFatalError("no such user \"%s\"", user);
user_uid = pwd->pw_uid;
user_gid = pwd->pw_gid;
user_name = g_strdup(user);
/* this is needed by libs such as arts */
g_setenv("HOME", pwd->pw_dir, true);
}
if (group) {
struct group *grp = getgrnam(group);
if (grp == nullptr)
FormatFatalError("no such group \"%s\"", group);
user_gid = grp->gr_gid;
had_group = true;
}
pidfile = std::move(_pidfile);
}
void
daemonize_finish(void)
{
if (!pidfile.IsNull()) {
RemoveFile(pidfile);
pidfile = AllocatedPath::Null();
}
g_free(user_name);
}
#endif

91
src/Daemon.hxx Normal file
View File

@@ -0,0 +1,91 @@
/*
* 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_DAEMON_HXX
#define MPD_DAEMON_HXX
class AllocatedPath;
#ifndef WIN32
void
daemonize_init(const char *user, const char *group, AllocatedPath &&pidfile);
#else
static inline void
daemonize_init(const char *user, const char *group, AllocatedPath &&pidfile)
{ (void)user; (void)group; (void)pidfile; }
#endif
#ifndef WIN32
void
daemonize_finish(void);
#else
static inline void
daemonize_finish(void)
{ /* nop */ }
#endif
/**
* Kill the MPD which is currently running, pid determined from the
* pid file.
*/
#ifndef WIN32
void
daemonize_kill(void);
#else
#include "system/FatalError.hxx"
static inline void
daemonize_kill(void)
{
FatalError("--kill is not available on WIN32");
}
#endif
/**
* Close stdin (fd 0) and re-open it as /dev/null.
*/
#ifndef WIN32
void
daemonize_close_stdin(void);
#else
static inline void
daemonize_close_stdin(void) {}
#endif
/**
* Change to the configured Unix user.
*/
#ifndef WIN32
void
daemonize_set_user(void);
#else
static inline void
daemonize_set_user(void)
{ /* nop */ }
#endif
#ifndef WIN32
void
daemonize(bool detach);
#else
static inline void
daemonize(bool detach)
{ (void)detach; }
#endif
#endif

24
src/DatabaseError.cxx Normal file
View File

@@ -0,0 +1,24 @@
/*
* 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 "DatabaseError.hxx"
#include "util/Domain.hxx"
const Domain db_domain("db");

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