Max Kellermann
3c1f7c77f0
queue/Queue: remove outdated API documentation
2019-06-06 12:38:21 +02:00
Max Kellermann
3e40b1d9d2
decoder/dsdiff: use a fixed-size buffer for the tag value
...
Variable-length arrays are a C-only feature.
2019-06-06 12:33:14 +02:00
Max Kellermann
adffbba2a5
release v0.21.10
...
-----BEGIN PGP SIGNATURE-----
iQJEBAABCgAuFiEEA5IzWngIOJSkMBxDI26KWMbbRRIFAlz4JuAQHG1heEBtdXNp
Y3BkLm9yZwAKCRAjbopYxttFEq9nD/40/ryDwvgsQnKhYcpPhlV8bf8iTOUSPsrW
2P5m48sfGb3LBHV+U/sHLWH8svODSxloyvyxYSUOEJyqOu42lj0BnxPBDvRwTjcq
PxJPHHKVuExys04k4SOKIEci742WEHTVRzO8EeOvIdgkjXCak7tpQk/wmhrGfHF1
+rLfSu6jq90/tELsOyTLGmk3KapY637Qf2Q99Z6VZnAXhIRLK4O1E8oKGOjl2h8I
xvjZckVZV1FYeNrC0OYdNQX0A+JhkFwLFAeWP3ksBmKfs+Csf8X0JTCofnYph46t
5SmhTd9I6NEVnNoZyOplV7QVawGPK1p69ORB052d/9QUhMqcPmwnHrhcrWtrYl5I
6QtUwf8nJz/TnUc7/a3BBIPHLB/PD0fGsmdDoElikkPz76sGYNor+UZIdQke1HQL
m3zmNDxjU++sRfrSjAPOK2mxD0Km8tYIcrQBMZcyxoc7GCHaw1pIa2cxxs1aB5QZ
gFxYICL7LJ+g5Q19JhTiWlwfdOS7jGH7mVUjhLDA/mcxGf6ln6FkDx58GqPJV+es
UcWVbOjb3T448TVNH0Jj+FrtWK5uBmOFNTk102BbTnfDT8muedbRmRCxn0NyKkFQ
dS8/FdU7ffw2II49ZI6BfmeLucfoTwuQ1Ky297K/62NrM67/1dKKkBLAE3/aGxwh
xzIDTT3Mkg==
=SELi
-----END PGP SIGNATURE-----
Merge tag 'v0.21.10'
release v0.21.10
2019-06-05 22:38:54 +02:00
Max Kellermann
3fae2150f5
decoder/OpusReader: return StringView
...
Since we now don't duplicate all items, we can easily remove the 64kB
limit from OpusReader::ReadString() and instead silently ignore and
skip all strings which are longer than 4 kB.
This fixes a tag duplication bug with Opus file containing a very long
`METADATA_BLOCK_PICTURE` tag, which occurred because the Opus plugin
returned false after parsing all tags, and then the MPD core fell back
to FFmpeg which scanned the tags again.
2019-06-05 22:19:35 +02:00
cathugger
f9ca2f52c1
output/httpd: reject some well-known request paths
...
Return `404 not found` for some common well-known paths, as clients requesting them usually do that automatically and don't expect endless audio stram.
Closes #572
2019-06-05 21:53:46 +02:00
cathugger
4b81cf0c2c
output/httpd: use strncmp instead of memcmp
...
memcmp use may result in out of bounds access
2019-06-05 21:53:46 +02:00
Max Kellermann
e7acbf112c
output/httpd: fix indent
2019-06-05 21:53:43 +02:00
Max Kellermann
120e570da7
archive/Domain: remove unused library
2019-06-04 17:54:59 +02:00
Max Kellermann
0019231a37
archive/Lookup, input/Archive: remove useless log messages
2019-06-04 17:54:35 +02:00
Max Kellermann
9ae1256ae7
input/archive: include cleanup
2019-05-31 19:59:09 +02:00
Max Kellermann
e1ac377812
archive/ArchiveLookup: replace output parameters with a struct
2019-05-31 19:56:25 +02:00
Max Kellermann
7866d1a005
archive/meson.build: move ArchiveLookup.cxx to archive_glue.a
...
Fixes the Windows build.
2019-05-31 19:56:13 +02:00
Max Kellermann
3e3ee581a8
fs/Path: add constexpr
2019-05-31 19:47:50 +02:00
Max Kellermann
0e8ca44968
archive/List: disallow passing suffix==nullptr to archive_plugin_from_suffix()
2019-05-31 19:05:26 +02:00
Max Kellermann
12e75a523a
archive/ArchiveLookup: remove "suffix" output parameter
...
Let the caller do this. Our GetSuffix() function was broken anyway.
2019-05-31 19:01:22 +02:00
Max Kellermann
508ba22789
archive/ArchiveLookup: use class FileInfo
2019-05-31 18:55:27 +02:00
Max Kellermann
fa13648f2c
archive/ArchiveLookup: throw on error
2019-05-31 18:52:11 +02:00
Max Kellermann
2f83ed90d0
archive/iso9660: implement seeking
2019-05-31 18:40:24 +02:00
Max Kellermann
5d74b5cee1
input/cache: first draft of the file cache
2019-05-31 17:49:52 +02:00
Max Kellermann
e8a0ce643a
tag/Generic: fail if InputStream is not seekable
2019-05-31 17:49:37 +02:00
Max Kellermann
9ed4fac341
input/InputStream: check offset in Rewind()
...
Don't call Seek() if the stream is already at the beginning. This
avoids unnecessary exceptions if seeking is not implemented by an
Inputstream implementation.
2019-05-31 17:47:16 +02:00
Max Kellermann
81b2b4a85c
Merge branch 'v0.21.x'
2019-05-31 17:27:20 +02:00
Max Kellermann
304d45b551
Revert "player/Thread: remove unnecessary "pipe" check"
...
This reverts commit ff3e2c0514
. The
check was necessary, after all, because this is what checked whether
the decoder had finished the current or the next song.
> The "queued" flag can only possibly be set if the decoder is still
> decoding the current song or if the decoder is stopped.
That was wrong because ProcessCommand() sets `queued=true` and also
starts the decoder (if it was idle).
> This is also what the following assert() checks.
That was also wrong, because the assert() has two conditions.
Closes https://github.com/MusicPlayerDaemon/MPD/issues/566
2019-05-31 17:23:12 +02:00
Max Kellermann
7739b3960c
mixer/Listener: add noexcept
2019-05-31 14:09:47 +02:00
Max Kellermann
11ec7117ab
Partition: add noexcept
2019-05-31 14:07:33 +02:00
Max Kellermann
c3ccbfd407
queue/Playlist: add noexcept
2019-05-31 13:58:57 +02:00
Max Kellermann
de3cd96c76
queue/Playlist: remove destructor
2019-05-31 13:58:57 +02:00
Max Kellermann
d8cf7d1ef0
queue/Playlist: use C++11 initializers
2019-05-31 13:58:57 +02:00
Max Kellermann
57de2470f1
queue/Listener: add noexcept
2019-05-31 13:57:46 +02:00
Max Kellermann
8fef4af7b2
decoder/Bridge: add method OpenLocal()
2019-05-30 17:08:09 +02:00
Max Kellermann
cfb678d618
config/Parser: work around conflicting macro MAX_INPUT
...
linux/limits.h defines MAX_INPUT which breaks the build.
2019-05-30 16:10:01 +02:00
Max Kellermann
4eb101f046
config/Parser: add ParseSize()
...
Supports suffixes such as "kB" and "MB".
2019-05-29 22:44:05 +02:00
Max Kellermann
af7970337b
config/Parser: get_bool() throws on error
2019-05-29 22:35:40 +02:00
Max Kellermann
96a37da03d
config/Block: add method With()
2019-05-29 22:35:36 +02:00
Max Kellermann
ece35552fe
config/Block: add ThrowWithNested()
2019-05-29 22:33:51 +02:00
Max Kellermann
7d599c1afc
Main: add Config constructor
2019-05-29 22:22:05 +02:00
Max Kellermann
7c565bce1d
Main: move two more functions down
2019-05-29 22:20:02 +02:00
Max Kellermann
d17ff18ec0
Main: move main() to the bottom
2019-05-29 22:18:06 +02:00
Max Kellermann
efc6b1b77a
Main: fold mpd_main_after_fork() into MainConfigured()
2019-05-29 22:16:32 +02:00
Max Kellermann
fdbec694c6
config/Param: add method With()
2019-05-29 21:50:04 +02:00
Max Kellermann
b86d8d0cd8
config/Param: add method ThrowWithNested()
2019-05-29 21:46:27 +02:00
Max Kellermann
0b4e7b3317
client/List: use using
instead of typedef
2019-05-29 21:36:27 +02:00
Max Kellermann
472e4bfd41
client/List: fold CloseAll() into destructor
2019-05-29 21:33:22 +02:00
Max Kellermann
d3d70a7eed
client/List: use auto
2019-05-29 21:31:43 +02:00
Max Kellermann
39046bed85
Instance: wrap ClientList in std::unique_ptr<>
2019-05-29 21:29:55 +02:00
Max Kellermann
71a5c8b819
Main: allocate Instance on the stack
2019-05-29 21:22:25 +02:00
Max Kellermann
620a39afb4
thread/Slack: use std::chrono::duration
2019-05-29 21:11:32 +02:00
Max Kellermann
14cee01ba1
Main: simplify Android startup
2019-05-29 15:08:39 +02:00
Max Kellermann
c782fdb698
Main: use AtScopeExit() to free Android objects
2019-05-29 15:08:38 +02:00
Max Kellermann
49ba76167e
Main: add overload with ConfigData parameter
2019-05-29 15:08:26 +02:00
Max Kellermann
93ab957800
Main: convert int
return types to void
2019-05-29 14:52:58 +02:00
Max Kellermann
155c915733
input/buffering: make "mutex" public
2019-05-29 13:44:05 +02:00
Max Kellermann
971450f0d4
input/InputStream: make IsEOF() and IsAvailable() const
2019-05-29 13:31:54 +02:00
Max Kellermann
40a48cfba0
PluginUnavailable: add subclass PluginUnconfigured
...
PluginUnconfigured exceptions are logged with level "info" instead of
"error". This suppresses some rather boring messages in the default
log level.
Closes https://github.com/MusicPlayerDaemon/MPD/issues/565
2019-05-23 14:25:14 +02:00
Max Kellermann
9d1906da8a
{event,output}/Thread: downgrade realtime scheduling errors to "info"
...
These messages can be confusing, but they are not critical.
2019-05-23 14:24:27 +02:00
Max Kellermann
3d2b180cf8
LogBackend: set default log level to "default"
...
This is the documented value, but for unknown reasons, "info" was
really the default.
This was never noticed because there are only very few "info" level
messages.
2019-05-23 14:14:58 +02:00
Max Kellermann
f987947730
Log: add Log() and LogFormat() overloads with std::exception_ptr
...
Make LogError()/FormatError() wrappers for those. Now we can log
exceptions with a lower level.
2019-05-23 12:23:28 +02:00
Max Kellermann
e0d5d88104
Log: make LogLevel the first parameter
...
Prepare for templated functions.
2019-05-23 12:17:59 +02:00
Max Kellermann
585a745484
Log: use GetFullMessage() to print exceptions
...
Print all nested exceptions on a single line to avoid confusion.
2019-05-22 18:24:45 +02:00
Max Kellermann
43fe513de8
input/buffering: add API documentation
2019-05-22 12:09:20 +02:00
Max Kellermann
c1b853ca7c
input/InputStream: define UNKNOWN_SIZE without undefined behavior
2019-05-22 12:01:46 +02:00
Max Kellermann
4b78038b41
input/InputStream: update API documentation
2019-05-22 12:00:16 +02:00
Max Kellermann
d651d1abfd
util/SparseBuffer: move #endif to the bottom
2019-05-22 10:43:07 +02:00
Max Kellermann
5a8b734cfd
tag/Id3Load: include cleanup
2019-05-22 10:23:39 +02:00
Max Kellermann
31b59a0db6
tag/Generic: allow ScanGenericTags() to throw
...
Propagate the error to the caller instead of logging it.
2019-05-22 10:19:28 +02:00
Max Kellermann
92f7421715
TagFile: allow ScanFileTags*() to throw
2019-05-22 10:19:27 +02:00
Max Kellermann
6f1d5105ee
TagStream: allow tag_stream_scan() to throw
2019-05-22 10:19:26 +02:00
Max Kellermann
9a78371b5c
DetachedSong: allow LoadFile(), Update() to throw
2019-05-22 10:19:25 +02:00
Max Kellermann
3fc4da382e
db/simple/Song: allow LoadFile(), UpdateFile() to throw
...
Preparing to move logger calls out of lower-level libaries, and
propagating error details to the caller instead.
2019-05-22 10:19:24 +02:00
Max Kellermann
6ee7d88af0
db/update/Archive: fix inverted nullptr check
...
Regression by commit bbdf2dcf1e
2019-05-22 10:18:18 +02:00
Max Kellermann
bbdf2dcf1e
db/simple/Song: wrap in std::unique_ptr<>
2019-05-21 22:46:34 +02:00
Max Kellermann
02bb47dd08
db/simple/Song: move struct Disposer to separate header
...
Allow forward-declaring it.
2019-05-21 22:42:32 +02:00
Max Kellermann
0c48b8d084
db/simple/Song: add noexcept
2019-05-21 22:41:21 +02:00
Max Kellermann
8462559b2f
db/simple/Song: include cleanup
2019-05-21 22:40:08 +02:00
Max Kellermann
319c9699fb
tag/Type: add TAG_GROUPING
...
Map ID3 "TIT1" to this new core tag type.
Closes https://github.com/MusicPlayerDaemon/MPD/issues/563
2019-05-21 22:23:06 +02:00
Max Kellermann
06a0a4a838
time/Convert: include sys/time.h for struct timeval
...
Closes https://github.com/MusicPlayerDaemon/MPD/issues/562
2019-05-21 10:13:16 +02:00
Max Kellermann
8942be858b
release v0.21.9
...
-----BEGIN PGP SIGNATURE-----
iQJEBAABCgAuFiEEA5IzWngIOJSkMBxDI26KWMbbRRIFAlziw4IQHG1heEBtdXNp
Y3BkLm9yZwAKCRAjbopYxttFEqrmD/4ipjXE5PkGD7unTIvnmv0X1FRnaOO1rwyY
SkqWl2D8DsgFh1d0IkNxzofNQ5mv3YpZY2ycD4kHbM+RWkV+fVuGnhePSCSd0w2s
Lj5r8yYq43UfIwn4fVwFeqjsEhtT47gHLATJ4/Zc4q+VfzVhPqp1esxrf+vHX6nH
SCMp9WP5L8FBcf28IqW3hBc/cOTtp36FsuzRkyFMrM/tq6a6VF8mqBKO9Qpnz6OU
egq3d+tqpg1Qq90QXZx7LfXArK0v89Wezv3M/EhzamBc2DClFQnaL3BTOD0hawdt
WRfm8WzdXS73QrmJvcOFtcath6jdrKIvBwMKIdmDikp2ofF0m1COh9UcHReA0MK9
UbRZWmeTzeu+UKNugD//Ma+oNwntv5W/xSSvEsgvLTiyd8XcdlKXcsrwbYVD7o3L
uTKq8V2h5iDC5cure5FvWnpaugaI38fJ+DDGArSe/BhScQhioXAPFa3hSGLux3e8
gaKWu6/6biCi8yMra8z4dL2zyUNLEw4J2e9RPweLeQL/gi0A1alSLtcQ6VWGGFFW
5GtQALTuISH5/9TWnr1LGiI6cgNHCQ2JOeL99pChu+PdoSiuA+KwQojZ4UEUVAGL
GTbupl3yUFJ9jv/rLZOjOIycJ9cYifM+Th98iTfK4aMQujzAkJj132Qqzci+rUXp
6R9hfalT2A==
=aixT
-----END PGP SIGNATURE-----
Merge tag 'v0.21.9'
release v0.21.9
2019-05-20 17:23:01 +02:00
Max Kellermann
923e66738c
player/Thread: fix "single" mode race condition
...
If the decoder finishes decoding the current song between the two
IsIdle() checks, MPD stops playback instead of starting the decoder
for the next song.
This is usually not visible problem, because the main thread restarts
it via playlist::ResumePlayback(), but that way it, ignores "single"
mode.
As a workaround, this commit adds another "queued" check which
re-enters the player loop and checks again whether to start the
decoder.
Closes https://github.com/MusicPlayerDaemon/MPD/issues/556
2019-05-20 16:22:01 +02:00
Max Kellermann
ff3e2c0514
player/Thread: remove unnecessary "pipe" check
...
The "queued" flag can only possibly be set if the decoder is still
decoding the current song or if the decoder is stopped. This is also
what the following assert() checks. This check was not necessary.
2019-05-20 16:20:59 +02:00
Max Kellermann
6922a2f55e
input/buffered: check error in IsAvailable()
2019-05-17 12:43:45 +02:00
Max Kellermann
219546cb81
input/buffering: check error in IsAvailable()
2019-05-17 12:43:06 +02:00
Max Kellermann
555a4d738c
input/buffering: pass offset to Read() and eliminate Seek()
...
Another step towards supporting multiple readers.
2019-05-17 12:02:55 +02:00
Max Kellermann
813567bf5c
input/buffering: use notify_one() to wake up thread
...
There is just one thread.
2019-05-17 11:57:23 +02:00
Max Kellermann
16a07bc201
input/buffering: remove obsolete thread wakeup
...
The thread will always attempt to read more data since commit
2cf6b77627
, so we don't need to tell it
to continue.
2019-05-17 11:56:30 +02:00
Max Kellermann
1153715608
input/buffering: rename "read_error" to "error"
...
The "seek_error" attribute will be eliminated soon.
2019-05-17 11:29:19 +02:00
Max Kellermann
b5c7c16fb4
input/buffering: merge multiple exception handlers into RunThread()
2019-05-17 11:23:54 +02:00
Max Kellermann
302c0515b7
input/buffering: move code to RunThreadLocked()
2019-05-17 11:21:56 +02:00
Max Kellermann
19e4672a54
input/buffering: use notify_all() instead of notify_one()
...
More preparations to support multiple readers.
2019-05-17 11:17:16 +02:00
Max Kellermann
c2dd6808e1
input/buffering: make read errors fatal, no recovery
...
If a read error occurs, it is very unlikely that the InputStream will
ever recover. Removing the code removes some code complexity which
just isn't worth it. And it allows supporting multiple readers for
one buffer.
2019-05-17 10:55:58 +02:00
Max Kellermann
2cf6b77627
input/buffering: eliminate "idle" flag, automatically seek to next hole
2019-05-16 22:42:29 +02:00
Max Kellermann
a5c09f4ddb
input/buffering: destruct our input while mutex is unlocked
2019-05-16 22:38:37 +02:00
Max Kellermann
1acb9bcedb
input/buffering: close input if buffered completely
2019-05-16 22:34:11 +02:00
Max Kellermann
0626e3d21e
input/buffering: at end of input, seek to first hole
2019-05-16 22:29:10 +02:00
Max Kellermann
869d215058
input/buffering: merge "read_error" and "idle" checks in thread
2019-05-16 22:25:21 +02:00
Max Kellermann
0cf922b2da
input/buffering: clear read_error after successful seek
...
After seeking, a new read should be done.
2019-05-16 22:24:57 +02:00
Max Kellermann
5e266cd8e4
Merge branch 'v0.21.x'
2019-05-16 22:12:48 +02:00
Max Kellermann
ca5a400dbe
input/buffered: rethrow read_error in Check()
2019-05-16 22:08:33 +02:00
Max Kellermann
63fe4d1d17
input/buffered: wake up client thread on seek error
2019-05-16 22:05:25 +02:00
Max Kellermann
a199f58db5
input/buffering: update thread name
2019-05-16 22:02:51 +02:00
Max Kellermann
5277297336
input/buffered: move basic buffering code to class BufferingInputStream
...
Prepare to reuse it in another class.
2019-05-16 21:41:28 +02:00
Max Kellermann
604d08b2c6
Merge branch 'v0.21.x'
2019-05-16 21:26:45 +02:00
Max Kellermann
ca06d9d3bf
input/buffered: fix deadlock bug
2019-05-16 21:11:03 +02:00
Max Kellermann
a48604d2e3
util/SparseBuffer: remove bogus noexcept
from constructor
...
The HugeArray constructor can throw std::bad_alloc, and so can
SparseBuffer's constructor.
2019-05-08 22:34:33 +02:00
Max Kellermann
98e6a861ca
util/HugeAllocator: import std::swap()
2019-05-08 22:33:41 +02:00
Max Kellermann
2c6dd04d19
util/HugeAllocator: add noexcept
2019-05-08 22:32:50 +02:00
Max Kellermann
82ca3aa281
time/ISO8601: forward-declare StringBuffer
2019-05-08 16:24:31 +02:00
Max Kellermann
b45f5c7bf6
time/Convert: update copyright
2019-05-08 16:23:58 +02:00
Max Kellermann
f54877d128
time/Convert: mention exceptions
2019-05-08 16:14:12 +02:00
Max Kellermann
af3ea97a42
zeroconf/AvahiPoll: move TimevalToChrono() to time/Convert.cxx
2019-05-08 16:11:14 +02:00
Max Kellermann
8beac03dc4
time/Convert: add noexcept
2019-05-08 16:09:27 +02:00
Max Kellermann
4a49a5587d
time/Convert: add pure
attributes
2019-05-08 16:08:54 +02:00
Max Kellermann
d0cfa44c8f
time/FileTime: use ToUint64() in DeltaFileTimeS()
2019-05-08 16:06:19 +02:00
Max Kellermann
5bae6946c6
time/FileTime: add ToUint64(FILETIME)
2019-05-08 16:05:37 +02:00
Max Kellermann
a8fc805594
time/FileTime: drop static
2019-05-08 16:05:21 +02:00
Max Kellermann
a265738528
time/FileTime: add noexcept
2019-05-08 16:04:07 +02:00
Max Kellermann
5641c4baa6
system/Clock, fs/FileInfo: move FILETIME specific code to time/FileTime.hxx
2019-05-08 16:02:13 +02:00
Max Kellermann
96f889276f
system/Clock: GetProcessUptimeS() returns std::chrono::duration
2019-05-08 15:58:01 +02:00
Max Kellermann
214ddee2f5
util/Time*: move to time/
2019-05-08 15:47:58 +02:00
Max Kellermann
973c87b351
event/Call, ...: use wait() with predicate
2019-05-07 20:01:45 +02:00
Max Kellermann
72fc117393
thread/WindowsCond: add wait() overload with predicate
2019-05-07 19:59:32 +02:00
Max Kellermann
230ca2e968
thread/{Mutex,Cond}: use std::mutex and std::condition_variable
...
On Windows, we keep using our own implementations, because GCC
implements std::mutex and std::condition_variable with pthread
emulation, which is not a good choice.
2019-05-07 19:57:53 +02:00
Max Kellermann
9095167039
thread/*Cond: add wait_for() overload with predicate
2019-05-07 19:54:54 +02:00
Max Kellermann
ad4ca0c449
thread/*Cond: remove wait() overloads without std::unique_lock<>
2019-05-07 19:31:00 +02:00
Max Kellermann
0a0cc66e8f
thread/Mutex: use using
instead of making it a derived class
...
Prepare the transition to std::mutex.
2019-05-07 19:23:01 +02:00
Max Kellermann
1b5c1f75a4
input/InputStreams: pass std::unique_lock<> to various methods
2019-05-07 19:09:39 +02:00
Max Kellermann
040573c636
command/fingerprint: fix mutex locking bug
...
GetChromaprintCommand::DecodeStream() is called without holding the mutex.
2019-05-07 19:09:13 +02:00
Max Kellermann
dedc4b4b10
player/Control: pass std::unique_lock<> to Cond::wait()
2019-04-26 18:47:22 +02:00
Max Kellermann
cf348f9fae
decoder/Control: pass std::unique_lock<> to Cond::wait()
2019-04-26 18:34:16 +02:00
Max Kellermann
23d56cb6a1
output/Control: pass std::unique_lock<> to Cond::wait()
2019-04-26 18:28:44 +02:00
Max Kellermann
4473816384
output/Control: add LockEnableDisableAsync()
2019-04-26 18:28:09 +02:00
Max Kellermann
2c8d004f78
output/Control: add LockWaitForCommand()
2019-04-26 18:25:36 +02:00
Max Kellermann
684bd9153e
output/MultipleOutputs: simplify locking in CheckPipe()
...
Instead of keeping all open outputs locked, let ClearTailChunk() stall
playback until MultipleOutputs::CheckPipe() has updated the MusicPipe.
2019-04-26 18:13:14 +02:00
Max Kellermann
ec456fc57c
output/MultipleOutputs: make variable more local
2019-04-26 18:13:02 +02:00
Max Kellermann
7c92eb4360
output/Control: add noexcept
2019-04-26 17:53:27 +02:00
Max Kellermann
2c6ebe28e9
playlist/EmbeddedCue:: wrap CueParser in std::unique_ptr<>
2019-04-26 14:58:09 +02:00
Max Kellermann
401f06f367
playlist/EmbeddedCue: add noexcept
2019-04-26 14:57:03 +02:00
Max Kellermann
2b4e9cc635
db/update/Service: wrap UpdateWalk in std::unique_ptr<>
2019-04-26 14:55:00 +02:00
Max Kellermann
afdaaba045
fs/io/BufferedOutputStream: add noexcept
2019-04-26 14:55:00 +02:00
Max Kellermann
1cfc0cb874
fs/io/AutoGunzipReader: use std::unique_ptr<>
2019-04-26 14:55:00 +02:00
Max Kellermann
3882c97545
fs/io/AutoGunzipReader: add noexcept
2019-04-26 14:55:00 +02:00
Max Kellermann
bf9f690c70
fs/io/GunzipReader: add noexcept
2019-04-26 14:55:00 +02:00
Max Kellermann
392b783c9e
fs/io/TextFile: add noexcept
2019-04-26 14:44:27 +02:00
Max Kellermann
6d86902a02
fs/io/TextFile: use std::unique_ptr<>
2019-04-26 14:42:54 +02:00
Max Kellermann
376f4a2b16
output/MultipleOutputs: wrap AudioOutputControl in std::unique_ptr<>
2019-04-26 14:28:59 +02:00
Max Kellermann
b42f19f514
output/Control: implicitly call BeginDestroy() in destructor
2019-04-26 14:28:30 +02:00
Max Kellermann
92022658f9
thread/Cond: add wait() overload which takes a unique_lock<>
...
Just like std::condition_variable, which however has no way to specify
the std::mutex directly.
2019-04-26 11:51:45 +02:00
Max Kellermann
b51bae5500
thread/*Cond: rename methods to match std::condition_variable
2019-04-25 19:46:43 +02:00
Max Kellermann
5bc8cd0ecb
event/Call: use std::lock_guard
2019-04-25 19:45:52 +02:00
Max Kellermann
d38a079ba1
neighbor/smbclient: use std::lock_guard
2019-04-25 19:44:59 +02:00
Max Kellermann
c75a0f7c75
neighbor/smbclient: call Run() with locked mutex
2019-04-25 19:43:45 +02:00
Max Kellermann
e740f8d969
decoder/Control: remove unused methods Lock(), Unlock()
2019-04-25 19:34:26 +02:00
Max Kellermann
9da7509944
input/curl: use class ScopeUnlock
2019-04-25 19:33:50 +02:00
Max Kellermann
36aa204575
input/smbclient: use std::lock_guard
2019-04-25 19:33:50 +02:00
Max Kellermann
2c0a968735
storage/smbclient: use std::lock_guard
2019-04-25 19:23:37 +02:00
Max Kellermann
84c406d5f5
storage/nfs: use class ScopeUnlock
2019-04-25 19:22:57 +02:00
Max Kellermann
0e48747607
event/Call: use std::lock_guard
2019-04-25 18:57:58 +02:00
Max Kellermann
f764925edc
Instance: use std::unique_ptr<> to manage the NeighborGlue pointer
2019-04-25 13:09:31 +02:00
Max Kellermann
692c8025a2
Main: use AtScopeExit() to call NeighborGlue::Close()
2019-04-25 13:03:51 +02:00
Max Kellermann
a6dc1ab0a9
lib/sqlite/Database: wrapper for sqlite3*
2019-04-25 12:10:12 +02:00
Max Kellermann
77c9081f78
sticker/Database: wrap in class StickerDatabase
2019-04-25 12:05:18 +02:00
Max Kellermann
c88d5616f7
sticker/Database: move sticker_prepare() to lib/sqlite/Util.hxx
2019-04-25 11:57:29 +02:00
Max Kellermann
34d483a34a
lib/sqlite/Util: move into namespace
2019-04-25 11:56:52 +02:00
Max Kellermann
5a3828ed4a
sticker/*: rename source files, drop "Sticker" prefix
2019-04-24 15:15:19 +02:00
Max Kellermann
3fe7f27345
sticker/Database: eliminate sticker_foreach()
2019-04-24 15:12:58 +02:00
Max Kellermann
0dccadff89
sticker/Database: remove unused function sticker_get_value()
2019-04-24 15:09:47 +02:00
Max Kellermann
5a915eb0e6
sticker/Database: return Sticker by value
2019-04-24 15:05:05 +02:00
Max Kellermann
7b48ae4f85
sticker/Database: move struct Sticker to Sticker.hxx
2019-04-24 15:03:52 +02:00
Max Kellermann
92dc4a0ca7
sticker/Database: add noexcept
2019-04-24 15:00:24 +02:00
Max Kellermann
c7c303eec3
db/DatabaseListener: add noexcept
2019-04-24 14:57:30 +02:00
Max Kellermann
1b62adc894
Instance: add noexcept
2019-04-24 14:56:08 +02:00
Max Kellermann
0641ce79fe
StateFile: add noexcept
2019-04-24 14:54:17 +02:00
Max Kellermann
b985835d8b
android/Environment: add noexcept
2019-04-24 14:50:02 +02:00
Max Kellermann
e413dcf8c6
android/LogListener: add noexcept
2019-04-24 14:49:42 +02:00
Max Kellermann
ea61e6dde1
android/Context: add noexcept
2019-04-24 14:49:42 +02:00
Max Kellermann
f7f858cb07
android/Context: use DiscardException()
2019-04-24 14:44:06 +02:00
Max Kellermann
4d1546cb38
java/File: use DiscardException()
2019-04-24 14:43:09 +02:00
Max Kellermann
a4bc972aad
java/File: use String::ToString() in ToAbsolutePath()
2019-04-24 14:40:31 +02:00
Max Kellermann
1415bac1d6
fs/AllocatedPath: add Android-only FromUTF8(std::string&&) overload
2019-04-24 14:39:47 +02:00
Max Kellermann
7a98a784b2
fs/Features: add macro FS_CHARSET_ALWAYS_UTF8
2019-04-24 14:28:55 +02:00
Max Kellermann
162845cc6d
fs/Charset: move HAVE_FS_CHARSET to Features.hxx
2019-04-24 14:24:54 +02:00
Max Kellermann
a8ee7269bc
fs/Config: add noexcept
2019-04-24 14:24:21 +02:00
Max Kellermann
7c1843ee2e
fs/AllocatedPath: add noexcept
2019-04-24 14:18:24 +02:00
Max Kellermann
bc8bb41aef
fs/Path: add noexcept
2019-04-24 14:17:37 +02:00
Max Kellermann
a8b94a4507
fs/Traits: add noexcept
2019-04-24 14:16:45 +02:00
Max Kellermann
f1b6deb768
java/Exception: add RethrowException()
2019-04-24 14:09:45 +02:00
Max Kellermann
72ebd5ebdd
java/Object: add Object.toString() wrapper
2019-04-24 14:08:51 +02:00
Max Kellermann
61b2ae0f7c
java/String: add method ToString()
2019-04-24 14:07:52 +02:00
Max Kellermann
0d2ec5ead2
java/Object: rename class Object to GlobalObject
2019-04-24 14:07:52 +02:00
Max Kellermann
5b74ed6b3b
release v0.21.8
...
-----BEGIN PGP SIGNATURE-----
iQJEBAABCgAuFiEEA5IzWngIOJSkMBxDI26KWMbbRRIFAly/BoIQHG1heEBtdXNp
Y3BkLm9yZwAKCRAjbopYxttFEnxpEACRVQulwjs3jo/+rxJYXTjDBmPuvNGywaAf
aAtEWTLWHYHSBRAGO2IVjtUOYJOrl2G1teA1rkSc2TqAMc12RYJPWm4q3Kamj7Tg
2COKt81v1XcaR1uR0LI1D6V2SqguhSTrEc21VyMPhfFQDjcdlPTITzyOw1n/EP7j
XwXyw6hDr2w+Ox4Ja6J7Cp61yWJAIYNtlRrDy7VRYtTvHtFJWdQu1955UTmn07LJ
y0Ba4azE5FveEsbq+mrKzPKAJ6pYqdbeAqUEl+FMTJEb4jXVwmuAU9HI7i9ZP4mM
k42hG1cco+2r5t7KsuakcgbdAyZflfdQBUcAywcyd5SdzUdFRbBt/c+/xKKLBms9
7u8dAug8eSl9/QWHDQzQPPxxkX37R6p/P+Xg1CsTBksTHDK5jwMWrDicGzZYEBFC
rA6eURfrjc4FN+qi0YWnLdXwJfUlVyINzz+fLgmzuN5L35qL/0WsyR/ztizPcoul
przhUZ1nhmeFiItfS/5VkLXaECAWmhOYw/IpaCmOtK/ieIo6FXxk11GBP/RQ/SyT
noPbqcnI2Nwgc2zTtCp2sLu1O3S2CeW7Ce4wKgiZOS4jJmKHDVRSli39t8eL146C
dHxw0RMBPeZsn4Qh9yrfuMfsCySX1lr5uaokJ68LuQVToryIuT1mNUQdmWAdkceu
eliH8Tfjeg==
=BjVR
-----END PGP SIGNATURE-----
Merge tag 'v0.21.8'
release v0.21.8
2019-04-23 14:41:08 +02:00
Max Kellermann
3a0d6d96c1
input/smbclient: wrap in MaybeBufferedInputStream
...
This enables the input buffer for remote files and caches file
contents in MPD.
Closes https://github.com/MusicPlayerDaemon/MPD/issues/376
2019-04-23 14:08:27 +02:00
Max Kellermann
ccc58f2a32
Merge branch 'v0.21.x'
2019-04-18 11:49:05 +02:00
Max Kellermann
ead3dc6a92
LocateUri: pass URI plugin kind, optionally disables plugin verify
...
Commit b3a458338a
added a LocateUri()
call to several playlist commands, which applied InputPlugin URI
scheme verification to playlist URIs. This broke the SoundCloud
playlist plugin which uses "soundcloud://" URIs for which no input
plugin exists.
This commit allows the caller to specify the kind of plugin which
shall be used to verify the URI. Right now, only "input" is
implemented; "storage" uses the "input" verification for now; and
"playlist" has no verification at all (for now).
Closes https://github.com/MusicPlayerDaemon/MPD/issues/528
2019-04-18 10:03:15 +02:00
Max Kellermann
7d814cc899
neighbor/smbclient: fix double smbc_closedir() call
...
There is already one call in ReadServers(), which is the correct place
to do it.
2019-04-18 09:40:56 +02:00
Max Kellermann
d6dbf64efb
CommandLine: fix another build failure with -Ddatabase=false
...
Split several printf() calls to make it easier to deal with all those
#ifdefs.
2019-04-18 09:20:12 +02:00
Eugene Gorodinsky
8d18b4c24b
Fix meson.build to work properly with '-Ddatabase=false'
2019-04-18 08:55:13 +02:00
Max Kellermann
d28307e082
neighbor/smbclient: fix double smbc_closedir() call
...
There is already one call in ReadServers(), which is the correct place
to do it.
2019-04-16 20:07:48 +02:00
Max Kellermann
aa5c5bf14f
neighbor/smbclient: add noexcept
2019-04-16 20:05:14 +02:00
Max Kellermann
2e80477218
neighbor/smbclient: make Server attributes "const"
2019-04-16 20:05:11 +02:00
Max Kellermann
8b9df85daa
neighbor/smbclient: remove unused attribute "alive"
2019-04-16 20:04:53 +02:00
Max Kellermann
edafe4cad6
tag/Id3Unique: add noexcept
2019-04-16 10:38:57 +02:00
Max Kellermann
3cbadf42a5
java/Ref: add move constructor
2019-04-11 11:34:52 +02:00
Max Kellermann
1d49f1108f
java/Ref: allow LocalRef to be nullable
...
Makes using the Java glue classes simpler to use, at the cost of very
little overhead.
2019-04-11 11:32:07 +02:00
Max Kellermann
8e5e97bfed
command: add command "getfingerprint"
...
A first use case for our libchromaprint integration added by commit
30e22b753b
2019-04-05 14:23:35 +02:00
Max Kellermann
17dd334b82
client/ThreadBackgroundCommand: fix inverted check
2019-04-05 14:23:35 +02:00
Max Kellermann
ab5eb4f9ce
tag/meson.build: move libchromaprint detection to lib/chromaprint/
2019-04-05 13:51:48 +02:00
Max Kellermann
a30af2ba42
lib/chromaprint/DecoderClient: replace method PrintResult()
2019-04-05 13:40:05 +02:00
Max Kellermann
9f1c23e217
client/BackgroundCommand: infrastructure for commands running in background
2019-04-05 11:18:15 +02:00
Max Kellermann
28fc1d555f
decoder/Thread: eliminate decoder_input_stream_open()
2019-04-05 10:32:07 +02:00
Max Kellermann
ac74f284aa
decoder/Bridge: check for STOP before InputStream::IsReady()
...
If the DecoderThread gets woken up by a STOP command, this should be
detected as early as possible.
2019-04-05 10:32:06 +02:00
Max Kellermann
77af999b46
decoder/Thread: use DecoderBridge::OpenUri(), eliminate duplicate code
2019-04-05 10:29:24 +02:00
Max Kellermann
4926763f00
decoder/Bridge: call InputStream::Check() before returning
2019-04-05 10:29:20 +02:00
Max Kellermann
a19eee78c6
decoder/Bridge: make many attributes private
2019-04-05 09:26:03 +02:00
Max Kellermann
6be3c99876
decoder/Bridge: add noexcept
2019-04-05 09:04:08 +02:00
Max Kellermann
8006911a1f
decoder/Client: add noexcept
2019-04-05 09:03:42 +02:00
Max Kellermann
61e5828790
input/InputStream: add noexcept
to ReadTag()
2019-04-05 08:57:42 +02:00
Max Kellermann
6addc9d6e0
pcm/PcmConvert: remove unused attribute "dest_format"
2019-04-04 21:06:28 +02:00
Max Kellermann
e78d825059
pcm/PcmConvert: eliminate Open() and Close()
...
Let the constructor and destructor do this. This means that all users
have to be converted to allocate PcmConvert dynamically.
2019-04-04 21:01:08 +02:00
Max Kellermann
00b04468dc
filter/Convert: make in_audio_format const
2019-04-04 21:00:23 +02:00
Max Kellermann
8a07724b23
test/RunChromaprint: move class ChromaprintDecoderClient to lib/chromaprint/
2019-04-04 20:29:27 +02:00
Max Kellermann
5256929b17
tag/Chromaprint: move to lib/chromaprint/Context.hxx
2019-04-04 20:21:10 +02:00
Max Kellermann
093bf5d859
event/*, ...: make GetEventLoop() const
2019-04-04 20:07:57 +02:00
Max Kellermann
4f6144dc71
lib/curl/Init: add const
overloads
2019-04-04 20:06:43 +02:00
Max Kellermann
2d1493ed7a
lib/curl/Init: add noexcept
2019-04-04 20:06:20 +02:00
Max Kellermann
43677d5740
event/MaskMonitor: add noexcept
2019-04-04 19:54:17 +02:00
Max Kellermann
693815bb32
input/AsyncInputStream: add noexcept
2019-04-04 19:54:17 +02:00
Max Kellermann
58d7804d66
Client: eliminate SetExpired(), call Close() directly
2019-04-04 10:37:38 +02:00
Max Kellermann
ea5e6d8f33
Merge branch 'v0.21.x'
2019-04-04 10:29:58 +02:00
Max Kellermann
f6941f9a44
event/SocketMonitor: don't cancel if OnSocketReady() returns false
...
Expect OnSocketReady() to cancel events. If it returns false, the
SocketMonitor may be destructed already. This fixes a use-after-free
bug in the "httpd" output plugin.
2019-04-04 10:24:58 +02:00
Max Kellermann
d2eb4df8fc
event/{Fully,}BufferedSocket: add more API documentation
2019-04-04 10:24:58 +02:00
Max Kellermann
df33a898d7
zeroconf/Bonjour: fix OnSocketReady() return value
...
Keep the SocketMonitor registered. This wrong return value was added
6 years ago in commit 72cf8dd8a0
, andd
apparently, nobody ever noticed.
2019-04-04 10:24:29 +02:00
Max Kellermann
325c7b8e8b
output/httpd: close client connection on error
...
This missing piece probably never really hurt, because
HttpdClient::OnSocketClosed() would be called right after a socket
error, but it's better to be explicit about closing on error.
2019-04-04 09:39:22 +02:00
Max Kellermann
380656d8c9
output/httpd: add missing mutex lock
2019-04-03 22:53:03 +02:00
Max Kellermann
9111bc2c21
output/httpd: add more API documentation about locking
2019-04-03 22:49:25 +02:00
Max Kellermann
c1272c72b0
client/Process: reset the CommandListBuilder before processing it
...
Allows removing a CommandResult::CLOSE check.
2019-04-03 22:38:26 +02:00
Max Kellermann
7d1db5c19f
client/Process: refactor IsExpired() checks
2019-04-03 22:31:49 +02:00
Max Kellermann
2142d070a3
client/Process: refactor return
statements
2019-04-03 22:30:38 +02:00
Max Kellermann
9711cee26d
client/Process: update code comment
2019-04-03 22:30:18 +02:00
Max Kellermann
39baa4e364
client/Process: more strict syntax check
2019-04-03 22:29:43 +02:00
Max Kellermann
f339a53e3c
client/Process: move basic syntax check to the beginning of method
...
This catches lines within command lists as well.
2019-04-03 22:27:41 +02:00
Max Kellermann
d9117a272b
client/Response: use C++11 initializer
2019-04-03 21:53:20 +02:00
Max Kellermann
b8a8bdeaec
Permission: use IterableSplitString
2019-04-03 21:47:20 +02:00
Max Kellermann
8f20edac9d
Permission: pass StringView to ParsePermission()
...
Eliminates a temporary copy.
2019-04-03 21:45:01 +02:00
Max Kellermann
8499a662ea
Permission: add noexcept
2019-04-03 21:42:31 +02:00
Max Kellermann
3f05b7d8b4
client/New: include cleanup
2019-04-03 21:41:52 +02:00
Max Kellermann
1d563700a4
client/File: include cleanup
2019-04-03 21:40:12 +02:00
Max Kellermann
def6b936c8
client/Response: add noexcept
2019-04-03 21:38:09 +02:00
Max Kellermann
3610f55479
client/Write: add noexcept
2019-04-03 21:37:38 +02:00
Max Kellermann
6db84852ae
client/Listener: add noexcept
2019-04-03 21:36:02 +02:00
Max Kellermann
41dc36ba92
client/List: add noexcept
2019-04-03 21:34:53 +02:00
Max Kellermann
fe32db17d7
client/Internal: rename to Config.hxx
2019-04-03 21:31:32 +02:00
Max Kellermann
772aa4f165
client/Internal: move CLIENT_MAX_* to class Client
2019-04-03 21:28:46 +02:00
Max Kellermann
38298e0cd8
client/Internal: move client_domain to Domain.hxx
2019-04-03 21:26:16 +02:00
Max Kellermann
1213d979f8
client/*: rename source files, remove "Client" prefix
2019-04-03 20:59:00 +02:00
Max Kellermann
a9cb12b745
Client: make almost all attributes private
2019-04-03 20:16:08 +02:00
Max Kellermann
380f73c112
client/Process: convert functions to Client methods
2019-04-03 20:04:59 +02:00
Max Kellermann
9f79d034b3
client/Process: add noexcept
2019-04-03 20:04:31 +02:00
Max Kellermann
37b54179d8
net/IPv[46]Address: add cast to void* to fix GCC9 build failure
...
Fixes:
src/net/IPv4Address.hxx: In member function 'constexpr IPv4Address::operator SocketAddress() const':
src/net/IPv4Address.hxx:171:24: error: a reinterpret_cast is not a constant expression
171 | return SocketAddress((const struct sockaddr *)&address,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/net/IPv6Address.hxx: In member function 'constexpr IPv6Address::operator SocketAddress() const':
src/net/IPv6Address.hxx:138:24: error: a reinterpret_cast is not a constant expression
138 | return SocketAddress((const struct sockaddr *)&address,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Closes https://github.com/MusicPlayerDaemon/MPD/issues/522
2019-04-03 16:59:53 +02:00
Max Kellermann
4a745a399f
client: un-inline the destructor
2019-04-03 14:44:01 +02:00
Max Kellermann
c340485dd5
client: make GetEventLoop() public
2019-04-03 14:32:28 +02:00
Max Kellermann
f8570dd79f
encoder/opus: use new[] instead of xalloc()
2019-04-03 14:22:32 +02:00
Max Kellermann
7a1b56fe96
release v0.21.7
...
-----BEGIN PGP SIGNATURE-----
iQJEBAABCgAuFiEEA5IzWngIOJSkMBxDI26KWMbbRRIFAlykiHUQHG1heEBtdXNp
Y3BkLm9yZwAKCRAjbopYxttFErFWEACP0T0em6pKOV9W2YHivtnJoBhb3wG46a2w
rnyNuj0FM8nhMsWunvqbOExogGxZziTKYhSdvzOBwNSleG1Eyjks8yNuPpp7nHH/
Y5gyRr1o6BR4hkukWDAIBWN/iXatUWHb/itInN0KhrqyU0YptNGbOF87vLfAZlqW
MNVTXO4YAx/tYHEt/4ze/ljtrNvXsB8Zw86cNI+jrivdujdKVfiN5dUpbc5Hj8DA
3i6Y5YFm4OvHbFENeMy/kVht8Ln0/3Ak+Z9L7ti9ZSWLbOaQc7+Nl0P/3pfftzWf
YK6DsRyvJ2dEPylAXqRIkZWdIU1VwjKc7cKYJFljNAMhaUWcrefXIGQOv0+1kbqz
CxLgk3hIK3R7lGbxLXDU7xD05hbOGgXe1BKO9alGhEsyB8+sT6qfVay/RlJPN+da
mSnslSzPyS+p9ZdyDnWXq68FS8BIriajDVXP7/WNMKz9OEe5BiXBBQVDM5/XbxQU
qPxLn/BVYzDXOw8msgyIZ/vqE1rpomJDILsK/EMJ/HLAOdR/Jo10wIAGAqiLPp2j
n2R9jS7nxZKmEvcZkg/HroNiGSpT89f38bbW/MCdzxAkg4vQDxQ0OE9GoeBi3oiP
g/SkM/sJ9UdlC3bq7TAhxK0huimAEg5Rh6Z1II00D89QmWFQT0hjmxo++9WwCQXw
CkIiKRf7Ug==
=KzqS
-----END PGP SIGNATURE-----
Merge tag 'v0.21.7'
release v0.21.7
2019-04-03 12:32:20 +02:00
Max Kellermann
5201147ab1
input/curl: use std::throw_with_nested() instead of logging the exception
...
Let the caller decide what to do with the original exception.
2019-03-29 17:34:51 +01:00
Max Kellermann
fb7daa0d05
input/smbclient: use std::throw_with_nested() to construct PluginUnavailable
...
Preserve the original exception.
2019-03-29 17:32:23 +01:00
Max Kellermann
508e522188
PluginUnavailable: perfect forwarding in the constructor
2019-03-29 17:17:45 +01:00
Max Kellermann
2e9f3d8b9f
decoder/HybridDSD: downgrade log message to "debug"
...
This plugin is interesting only for a tiny fraction of MPD users, so
let's not spam everybody else's log with it.
2019-03-29 17:15:48 +01:00
Max Kellermann
976731ab6c
command/playlist: invoke the RemoteTagScanner on all newly added songs
...
Closes https://github.com/MusicPlayerDaemon/MPD/issues/234
2019-03-29 17:01:31 +01:00
François Revol
0d8942e64a
Haiku: remove redundant calls to delete_sem()
...
Fixes #184 .
Semaphores are kernel-managed objects, calling delete_sem() twice is not more
dangerous than calling close() twice on an fd though, it would just return
an error.
2019-03-29 14:33:49 +01:00
François Revol
37a0f04712
Haiku: add version info to the resources like win32 does
2019-03-29 14:33:27 +01:00
François Revol
cde9348009
Haiku: fix adding resources
...
The custom_command was run in src/haiku/ and created a file with only resources inside.
Since xres edits the file in-place and meson doesn't like it, we have to run a shell script for now.
Maybe later I'll add proper support in meson.
2019-03-29 14:32:59 +01:00
François Revol
9d0bf5e95c
Haiku: fix build
2019-03-29 14:32:06 +01:00
Max Kellermann
b1b630a4cc
command/database: support "sort" and "window" in more commands
...
Closes https://github.com/MusicPlayerDaemon/MPD/issues/516
2019-03-25 19:05:49 +01:00
Max Kellermann
c60d374fc8
db/DatabasePlaylist: pass DatabaseSelection to search_add_to_playlist()
2019-03-25 19:04:34 +01:00
Max Kellermann
de4fd4c059
command/database: move code to ParseDatabaseSelection()
2019-03-25 19:02:11 +01:00
Max Kellermann
95d8b30864
protocol/Ack: add noexcept
2019-03-25 19:01:34 +01:00
Max Kellermann
eb94f409d5
protocol/Ack: perfect forwarding in the ProtocolError constructor
2019-03-25 19:01:27 +01:00
Max Kellermann
ca4e53859d
Merge branch 'v0.21.x'
2019-03-25 08:11:07 +01:00
Max Kellermann
8b327f1d9b
filter/AutoConvert: implement Flush()
2019-03-24 22:42:06 +01:00
Max Kellermann
aef0507abb
filter/Filter: fix typo in API doc
2019-03-24 22:34:11 +01:00
Max Kellermann
61120d2059
filter/ffmpeg: use only one AVFrame
...
The two were never used at the same time, and merging them saves one allocation.
2019-03-24 22:29:57 +01:00
Max Kellermann
cc1822810f
filter/ffmpeg: use av_buffersrc_add_frame() instead of av_buffersrc_write_frame()
...
This transfers ownership of the buffer instead of adding another reference.
2019-03-24 22:28:40 +01:00
Max Kellermann
a21c6884f2
filter/ffmpeg: call av_frame_unref() before av_buffersink_get_frame()
...
Fix another memory leak.
Closes https://github.com/MusicPlayerDaemon/MPD/issues/514
2019-03-24 22:27:48 +01:00
Max Kellermann
2700eed08d
filter/ffmpeg: remove unnecessary av_frame_make_writable() call
...
A newly allocated buffer doesn't need this call; it only adds overhead
for copying the data.
2019-03-24 22:26:09 +01:00
Max Kellermann
ec2badbedd
filter/ffmpeg: call av_frame_unref() before av_frame_get_buffer()
...
av_frame_get_buffer() leaks memory if buffers were already allocated.
Fixes one of the memory leaks of https://github.com/MusicPlayerDaemon/MPD/issues/514
2019-03-24 22:24:54 +01:00
Max Kellermann
054a7557fa
lib/ffmpeg/Frame: add av_frame_unref() wrapper
2019-03-24 22:21:35 +01:00
Max Kellermann
977a4570d9
Merge branch 'v0.21.x'
2019-03-21 11:49:41 +01:00
Max Kellermann
1d436b3c86
lib/ffmpeg/IOContext: keep using avio_read() with old libavformat versions
...
avio_read_partial() was added in libavformat 57.81.100, and we keep
compatibility with version 57.40 for now. Fixes regression from
commit bfb7b0117f
Closes https://github.com/MusicPlayerDaemon/MPD/issues/511
2019-03-20 13:15:05 +01:00
Max Kellermann
a854595886
event/ServerSocket: runtime error if abstract sockets are unavailable
2019-03-20 13:09:16 +01:00
Max Kellermann
8fc3c5c612
event/ServerSocket: add HAVE_UN check to AddAbstract()
...
Closes https://github.com/MusicPlayerDaemon/MPD/issues/510
2019-03-20 13:06:09 +01:00
Max Kellermann
4f408bd952
event/ServerSocket, doc, ...: refer to AF_LOCAL as "local socket"
...
.. and not "UNIX domain socket. Be consistent about the naming.
2019-03-20 12:57:26 +01:00
Max Kellermann
f86b14bfc5
tag/Chromaprint: relicense as BSD-2
2019-03-18 19:26:19 +01:00
Max Kellermann
ec5be91ff6
filter/ffmpeg: new filter plugin
2019-03-18 18:56:06 +01:00
Max Kellermann
a7a9490a0c
filter/hdcd: include cleanup
2019-03-18 18:55:25 +01:00
Max Kellermann
c0d6008781
filter/hdcd: move generic code to class FfmpegFilter
2019-03-18 18:35:23 +01:00
Max Kellermann
9f62824e98
filter/hdcd: fix typo
2019-03-18 18:32:20 +01:00
Max Kellermann
c673528cff
filter/hdcd: new filter plugin based on FFmpeg's "af_hdcd"
2019-03-18 13:48:24 +01:00
Max Kellermann
321f01b95c
filter/plugins/null: move code to src/filter/NullFilter.hxx
2019-03-18 13:48:24 +01:00
Max Kellermann
e88667e01c
lib/ffmpeg/Filter: add MakeAudioBuffer{Source,Sink}()
2019-03-18 11:05:13 +01:00
Max Kellermann
fb96907b52
lib/ffmpeg/Filter: add missing include
2019-03-18 11:05:13 +01:00
Max Kellermann
09ece26200
lib/ffmpeg/SampleFormat: add ToFfmpegSampleFormat()
2019-03-18 11:02:17 +01:00
Max Kellermann
0c6d22fe47
decoder/ffmpeg: move code to lib/ffmpeg/SampleFormat.hxx
2019-03-18 10:58:46 +01:00
Max Kellermann
c563eb81a3
lib/ffmpeg/Filter: C+++ wrapper for several libavfilter objects
2019-03-18 10:32:25 +01:00
Max Kellermann
e864a0dd05
lib/ffmpeg/meson.build: detect libavfilter
2019-03-18 10:30:02 +01:00
Max Kellermann
42a05bc904
lib/ffmpeg/Frame: add more wrapper methods
2019-03-18 10:29:26 +01:00
Max Kellermann
4722175049
Merge branch 'v0.21.x'
2019-03-18 10:01:00 +01:00
Jörg Krause
7f87de783f
src/lib/gcrypt/meson.build: use dependency() for quering linker flags
...
Since version 0.49.0 the Meson build system has native support for
finding and using the gcrypt library using the `dependency()` function.
`dependency()` has the advantage over `find_library()` as it queries the
required linker flags for proper linking with external libraries, e.g.
libgpg-error.
As the latest released version 1.8.4 of libgcrypt does not
provide a .pc file, using `libgcrypt-config` is the only way to query
the required linker flags.
Unfortunately, there is an issue when cross compiling mpd and the user does not
define `libgcrypt-config` in the cross file. If the user sets the qobuz feature
to `auto` and the target does not have libgcrypt installed, the Meson
build system will falsly assume libgcrypt is available for the target as
it uses the native `libgcrypt-config` on the host and pretend is has
found the library.
Therefore, we still rely on `find_library()` to workaround this buggy
behavior. This way, if qobuz feature detection is set to `auto`, the
feature is disabled in case there is no target libgcrypt available.
Fixes building mpd statically with the qobuz feature enabled. Otherwise
the build fails with undefined references because of the missing libgpg-error
dependency:
```
/sysroot/usr/lib/libgcrypt.a(libgcrypt_la-visibility.o): In function `gcry_strerror':
visibility.c:(.text+0x14): undefined reference to `gpg_strerror'
```
2019-03-18 09:12:19 +01:00
Max Kellermann
3a901098e9
release v0.21.6
...
-----BEGIN PGP SIGNATURE-----
iQJEBAABCgAuFiEEA5IzWngIOJSkMBxDI26KWMbbRRIFAlyOz50QHG1heEBtdXNp
Y3BkLm9yZwAKCRAjbopYxttFEub0D/oDIXjCyFredPqElU6wgHKmJIWHXiPMIzY2
L5dK3ilGcON3ZDK4myoYvA5dkqat11u72x5TG3crcm8rITXuNJr93ONomZnfRvkq
NwG5JHcexJOOm/ppaE7xd0VmfifRlJWpm+nqgPrObvMz+dIWQIOojYOGLeLYxUvC
0i8mmfs6dIir+vpH13U9r3EPa78AZcuKttkZaK1ByaoK32RKAYPFIQvZgfWLI4Kj
RUOrH9piEOGVx+vKw54rj69S+a8Do0LtMhnzOWmfrG8XQzS4W6dsp6gunYsFA9gR
DZsERbu70JGJ8mrIKrrbXNT4/M06hTyAwob9PoRybi2aCP5BvfgBaM6qCeTNKKgQ
YNLXBZVMbF/hbkoPG+DiS9S5Meyp8T3GYjaT4Bi8GufJu7HGERPp721PPPJLeyBg
SpQo9SeS6xHA0bquQ1BJ3FV0JVn31w+taybMK+5eZqxS3xDjlVNorU2Dua2tkJKW
IoIdoTfsU498V3RgPYrefUt0jLKbfGHTiyL1vZ2inZyK0AswebKFYyIFZnHLXkO2
Pi2NOuE5RYmqRmB4TEwvLubP0nW5OI5lHCyvY/2GVjankPW5ufPtJMcpjs3hvx4Y
5ORmEJBx5d5Y2NG1rZdnWv+b4x02MA8eAD2L3pq7WJ148AkZD3ddBBm7MpIJuW/n
fFH7/jl30A==
=EnrO
-----END PGP SIGNATURE-----
Merge tag 'v0.21.6'
release v0.21.6
2019-03-17 23:58:54 +01:00
Max Kellermann
62a129c18f
PlaylistFile: ignore empty playlist names
...
Closes https://github.com/MusicPlayerDaemon/MPD/issues/465 and
https://github.com/MusicPlayerDaemon/MPD/pull/466
2019-03-17 23:46:36 +01:00
Max Kellermann
c18cd941aa
lib/xiph: disable Tremor detection if libvorbis was found
...
And disable libvorbis detection if Tremor was explicitly enabled.
This fixes a crash bug caused by libvorbis/Tremor ABI conflict caused
by commit 4f7d52dbf2
2019-03-17 23:36:52 +01:00
Max Kellermann
6d12c22653
decoder/ogg: ignore the BOS packet after seek to the beginning of song
...
Previously, MPD would skip the current song after attempting to seek
to its beginnig, because that was a seek to offset 0. At offset 0,
MPD will see the BOS packet again, which results in throwing
StopDecoder in MPDOpusDecoder::OnOggEnd().
Closes https://github.com/MusicPlayerDaemon/MPD/issues/470
2019-03-17 23:14:59 +01:00
Max Kellermann
b76d78e6ae
output/sles: enable power saving mode
2019-03-17 18:04:40 +01:00
Jacob Vosmaer
0a6e484b1a
output/plugins/OSXOutputPlugin: add boost meson dependency
2019-03-17 16:59:24 +01:00
Max Kellermann
a66097129d
Merge branch 'v0.21.x'
2019-03-16 14:08:22 +01:00
Max Kellermann
0bb71f1f20
output/pulse: use pa_channel_map_init_extend() instead of _auto()
...
Unlike pa_channel_map_init_auto(), pa_channel_map_init_extend() does
not fail if there is no valid mapping for the given channel count, but
instead maps additional "AUX" channels.
Closes https://github.com/MusicPlayerDaemon/MPD/issues/493
2019-03-16 14:03:10 +01:00
Max Kellermann
1aa7cdd602
decoder/opus: fix replay gain when there are no other tags
...
The `tag_builder.empty()` check was wrong for the SubmitReplayGain()
call.
Closes https://github.com/MusicPlayerDaemon/MPD/issues/497
2019-03-16 13:55:19 +01:00
Max Kellermann
3bf521d5ca
song/TagSongFilter: apply negation properly to multiple tag values
...
The old implementation didn't make a lot of sense; the "!=" operator
was not actually the opposite of "==".
Closes https://github.com/MusicPlayerDaemon/MPD/issues/505
2019-03-16 13:23:02 +01:00
Max Kellermann
0acb55cde5
song/StringFilter: remove obsolete #if
2019-03-16 13:23:02 +01:00
Max Kellermann
6b89fd6100
song/StringFilter: make MatchWithoutNegation() public
2019-03-16 13:23:02 +01:00
Max Kellermann
9e9418294a
song/TagSongFilter: eliminate Match(TagItem)
2019-03-15 20:28:27 +01:00
Max Kellermann
b850eb74b7
song/TagSongFilter: add code comments
2019-03-15 19:54:29 +01:00
Max Kellermann
67d73a2aee
song/TagSongFilter: improve lambda indent
2019-03-15 19:54:16 +01:00
Max Kellermann
fde9a470dd
song/TagSongFilter: eliminate the std::fill_n() call
2019-03-15 19:35:58 +01:00
Max Kellermann
8d1f30e55b
tag/Fallback: add API documentation
2019-03-15 19:23:10 +01:00
Max Kellermann
1881b0e975
song/TagSongFilter: rename MatchNN() to Match()
...
The "NN" suffix used to mean "no negation", but that's not how it's
implemented today.
2019-03-15 19:06:56 +01:00
Max Kellermann
eed4e40ec6
Merge branch 'v0.21.x'
2019-03-14 20:32:04 +01:00
Max Kellermann
6de57b36c7
song/TagSongFilter: eliminate the std::fill_n() call
2019-03-14 20:31:22 +01:00
Max Kellermann
98b29f6d1c
meson.build: remove the libwinpthread-1.dll dependency on Windows
...
Closes https://github.com/MusicPlayerDaemon/MPD/issues/507
2019-03-14 20:07:06 +01:00
Max Kellermann
59fdfd25cb
command/database: fix "list" with filter expression
...
Disable the 0.11 compatibility mode if the only argument is a filter
expression.
Closes https://github.com/MusicPlayerDaemon/MPD/issues/506
2019-03-14 19:50:09 +01:00
Max Kellermann
0d98677212
playlist/flac: copy the URI to fix use-after-free bug
...
Closes https://github.com/MusicPlayerDaemon/MPD/issues/508
2019-03-14 19:30:33 +01:00
Max Kellermann
cb100f2e5c
input/ffmpeg: use avio_feof(), eliminate eof
attribute
2019-03-13 10:41:12 +01:00
Max Kellermann
bfb7b0117f
lib/ffmpeg/IOContext: allow partial reads
2019-03-13 10:39:43 +01:00
Max Kellermann
f6a705c769
input/ffmpeg: add AVIOContext wrapper class
2019-03-13 10:01:17 +01:00
Max Kellermann
0c01840a7e
input/ffmpeg: use C++11 initializer
2019-03-13 09:59:45 +01:00
Max Kellermann
b0b75c54de
input/ffmpeg: convert to class
2019-03-13 09:59:20 +01:00
Max Kellermann
3fc201d985
input/ffmpeg: add noexcept
2019-03-13 09:58:33 +01:00
Max Kellermann
5aa453ada3
input/ffmpeg: include cleanup
2019-03-13 09:57:50 +01:00
Max Kellermann
0009d53b3f
decoder/ffmpeg: add AVCodecContext wrapper class
2019-03-13 09:41:52 +01:00
Max Kellermann
05f7a6d1ff
decoder/ffmpeg: add AVFormatContext wrapper class
2019-03-13 00:27:21 +01:00
Max Kellermann
0256bbbbaf
decoder/ffmpeg: wider try/catch in ffmpeg_scan_stream()
2019-03-13 00:27:21 +01:00
Max Kellermann
bce608cdbc
decoder/ffmpeg: ffmpeg_decode() may throw
...
Don't catch and log exceptions. Let the caller handle the error.
2019-03-13 00:20:13 +01:00
Max Kellermann
38a0844cdf
decoder/ffmpeg: add AVFrame wrapper class
2019-03-12 23:51:46 +01:00
Max Kellermann
9acc6617d2
filter/registry: move extern
lines to plugin headers
2019-03-12 12:26:12 +01:00
Max Kellermann
4f72f49216
filter/normalize: clean up forward declarations
2019-03-12 12:24:31 +01:00
Max Kellermann
af9840daf7
util/Clamp: remove redundant inline
keywords from constexpr
functions
2019-03-12 11:54:51 +01:00
Max Kellermann
a67a9c9980
tag/Pool: remove redundant inline
keywords from constexpr
functions
2019-03-12 11:54:44 +01:00
Max Kellermann
732b2acf35
lib/upnp: remove redundant inline
keywords from constexpr
functions
2019-03-12 11:54:38 +01:00
Max Kellermann
16906cdcbe
fs/FileInfo: remove redundant inline
keywords from constexpr
functions
2019-03-12 11:54:31 +01:00
Max Kellermann
96e70659f0
lib/xiph/FlacAudioFormat: remove redundant inline
keywords from constexpr
functions
2019-03-12 11:53:13 +01:00
Max Kellermann
f2cacaf6b6
AudioFormat, pcm/Dsd*: remove redundant inline
keywords from constexpr
functions
2019-03-08 10:29:03 +01:00
Max Kellermann
24cde31328
lib/ffmpeg/Time: remove redundant inline
keywords from constexpr
functions
2019-03-08 10:28:02 +01:00
Max Kellermann
f6c0688684
util/ByteOrder: remove redundant inline
keywords from constexpr
functions
2019-03-08 10:23:14 +01:00
Max Kellermann
c176d94598
system/ByteOrder: move to util/
2019-03-08 10:21:10 +01:00
borine
c5df879cf9
decooder/plugins/PcmDecoderPlugin: add missing config for preproceesor macro definitions
2019-03-07 12:31:43 +00:00
borine
0762e5c289
decoder/plugins/PcmDecoderPlugin: guard alsa specific code with pre-processor macro test
2019-03-07 08:26:04 +00:00
borine
5d18559c1c
input/plugins/AlsaInputPlugin: change default device to default and default format to 48000:16:2
...
using the device "default" brings this plugin into line with the AlsaOutputPlugin; and a sample rate of 48kHz is more widely used as a native default for modern hardware than 44.1kHz
Also fixes an inconsistency between the docs and code.
2019-03-06 19:37:19 +00:00
borine
7db9c7f24e
input/plugins/AlsaInputPlugin: introduce mpd.conf config block to allow user to override the builtin defaults
2019-03-06 14:18:10 +00:00
borine
c834eb4590
input/plugins/AlsaInputPlugin: extend the alsa uri parsing to permit specification of the desired pcm audio format in the uri
2019-03-06 08:53:00 +00:00
borine
945ea51bd4
decoder/plugins/PcmDecoderPlugin: introduce new internal mime type "audio/x-mpd-alsa-pcm"
...
This mime type is to enable the AlsaInputPlugin to communicate the pcm stream audio format to the decoder
2019-03-06 08:39:47 +00:00
Max Kellermann
38f0c16904
system/UniqueFileDescriptor: add CreatePipeNonBlock()
2019-02-27 23:30:56 +01:00
Max Kellermann
4fbf6b6c95
net/StaticSocketAddress: remove GetAddress()
2019-02-27 23:26:59 +01:00
Max Kellermann
1f8ff48168
net/StaticSocketAddress: add GetLocalRaw()
2019-02-27 23:26:00 +01:00
Max Kellermann
20b6e0d684
net/SocketDescriptor: add SetTcpUserTimeout()
2019-02-27 23:22:12 +01:00
Max Kellermann
713c1f2ba9
Merge branch 'feature/playlist' of git://github.com/miccoli/MPD
2019-02-27 13:49:22 +01:00
Stefano Miccoli
b3a458338a
allow loading playlists specified as absolute filesystem paths
...
implement for the "load" command the same logic used for the "add"
command: local clients can load playlist specified as absolute paths.
For relative paths the old logic is preserved: first look for a stored
playlist, then look in the music directory.
2019-02-26 00:12:09 +01:00
Max Kellermann
44422b2b2f
event/ServerSocket, config/Net: abstract socket support
2019-02-25 13:08:33 +01:00
Thomas Zander
4c50a5e0b3
Ensure SEEK_SET is set on systems where stdio.h is not pulled in by accident.
2019-02-23 18:04:00 +01:00
Max Kellermann
83f7610dd1
storage/udisks2: move empty string check out of the fallback block in MapUTF8()
...
Even if the LocalStorage is available, return the "udisks://" URI when
the MapUTF8() parameter is an empty string. This fixes the mount URI
in the state file.
2019-02-22 15:07:40 +01:00
Max Kellermann
30e0644722
db/simple: call ReturnSong() on mounted database
...
Fixes a memory leak, or an assertion failure in the debug build.
2019-02-22 14:52:13 +01:00
Max Kellermann
3ada464020
db/simple: use C++11 initializer
2019-02-22 14:52:01 +01:00
Max Kellermann
d5983dd362
storage/udisks2: use the relative path
...
Closes #487
2019-02-22 14:41:56 +01:00
Max Kellermann
98258acc37
storage/udisks2: pass Path to SetMountPoint()
2019-02-22 14:41:56 +01:00
Max Kellermann
834ad7a58f
TagPrint: omit tags which were disabled by the client
...
Closes #471
2019-02-22 13:05:38 +01:00
Max Kellermann
e8f2f98048
tag/Mask: fix another typo, this time in operator^=
...
Similar to commit ff1ff1e54a
2019-02-22 12:44:36 +01:00
Max Kellermann
bbaeea1ab7
storage/udisks2: use existing mount point if already mounted
...
Fixes the "org.freedesktop.UDisks2.Error.AlreadyMounted" error.
Closes #485
2019-02-21 13:32:03 +01:00
Max Kellermann
0a3aee9d82
storage/udisks2: move code to SetMountPoint()
2019-02-21 13:31:59 +01:00
Max Kellermann
2434020971
storage/udisks2: adjust lambda indent
2019-02-21 13:31:57 +01:00
Max Kellermann
41e0eb7378
lib/dbus/udisks2: parse the MountPoints property
2019-02-21 13:28:26 +01:00
Max Kellermann
6adf964c81
lib/dbus/ReadIter: add dbus_message_iter_get_fixed_array() wrapper
2019-02-21 12:56:05 +01:00
Max Kellermann
b59f37bc0a
db/simple/Directory: close the Database in destructor
...
Fixes assertion failure.
2019-02-20 22:50:15 +01:00
Max Kellermann
cf2d171ccc
db/simple: reorder checks in assert() to fix assertion failure
...
`light_song.Get()` could cause an assertion failure because the
`Manual<>` object must not be used if uninitialized.
Regression by commit ebc006ab52
2019-02-20 21:24:01 +01:00
Max Kellermann
cc28a7b67f
Main: create Database on stack, move to Instance after Open() succeeded
...
This fixes use-after-free bug in SimpleDatabase::Close(), accessing
the `root` object which was already freed by the `catch` block in
Open().
By having the Database on the stack first, we can avoid calling
Close() on the failed-to-open Database from Instance's destructor.
Closes #482
2019-02-20 20:50:28 +01:00
Max Kellermann
8b5c33cecd
Instance: use std::unique_ptr<> to manage the Database pointer
2019-02-20 20:48:20 +01:00
Max Kellermann
6c28adbcd2
db/Plugin: use std::unique_ptr<> to manage Database pointers
2019-02-20 20:43:31 +01:00
Max Kellermann
2125e3ed57
db/simple/Directory: add noexcept
2019-02-20 20:39:49 +01:00
Max Kellermann
3da7ecfadf
mixer/pulse: add missing ParseFloat() check
2019-02-20 19:27:13 +01:00
Max Kellermann
5bb02bbd39
mixer/pulse: move volume_scale_factor
up to improve struct packing
2019-02-20 19:25:55 +01:00
Max Kellermann
f11aa09f7c
mixer/pulse: add const
to volume_scale_factor
2019-02-20 19:25:53 +01:00
Max Kellermann
02eb4752d3
mixer/pulse: use C++11 initializer
2019-02-20 19:25:45 +01:00
Max Kellermann
d9c3215584
mixer/pulse: rename scale
to scale_volume
...
Make it less generic, to avoid clashes.
2019-02-20 19:23:11 +01:00
Clément Pit-Claudel
110e6d026b
mixer/pulse: Add a new 'scale' parameter to allow volumes above 100
...
Closes GH-479.
2019-02-17 16:14:52 -05:00
Max Kellermann
c0f57b8a8b
net/IPv[46]Address: update copyright
2019-02-19 13:00:45 +01:00
Max Kellermann
57633fbcb3
net/AllocatedSocketAddress: add methods IsV6Any(), IsV4Mapped()
2019-02-19 12:51:24 +01:00
Max Kellermann
864c87e6c0
net/SocketAddress: add method GetLocalPath()
2019-02-19 12:50:40 +01:00
Max Kellermann
1a516cf3c0
net/AllocatedSocketAddress: add method GetLocalRaw()
2019-02-19 12:43:16 +01:00
Max Kellermann
5c25499c5e
lib/cdio/Paranoia: add method GetDiscSectorRange()
2019-02-19 12:40:36 +01:00
Max Kellermann
da4bb4c298
fs/io/OutputStream: update include guard
2019-02-19 12:39:29 +01:00
Max Kellermann
5b8ff61799
fs/io/BufferedOutputStream: add WithBufferedOutputStream()
2019-02-19 12:37:53 +01:00
Max Kellermann
56bded07b1
system/UniqueFileDescriptor: import std::swap
2019-02-19 12:36:54 +01:00
Max Kellermann
db144a43ad
system/Open: add OpenWriteOnly(), OpenDirectory()
2019-02-19 12:16:41 +01:00
Max Kellermann
5965f62b56
system/EpollFD: include cleanup
2019-02-19 11:51:52 +01:00
Max Kellermann
05aa9f72a9
util/StringView: add SkipPrefix(), RemoveSuffix()
2019-02-19 11:51:32 +01:00