Max Kellermann
9a29d02e7e
Merge branch 'v0.20.x'
2018-07-06 19:43:01 +02:00
Max Kellermann
6f3c0d0a60
AudioFormat: include cleanup
2018-07-06 19:35:31 +02:00
Max Kellermann
466625f7ad
input/curl: use new class HttpStatusError
...
This way, IsFileNotFound() can detect status 404.
2018-07-06 19:26:11 +02:00
Max Kellermann
b8259e604a
db/update/{Walk,ExcludeList}: use InputStream to read .mpdignore
...
Supports .mpdignore on NFS/SMB and others (closes #290 ).
2018-07-06 19:19:04 +02:00
Max Kellermann
86e2075c63
lib/nfs/Connection: use new class NfsClientError
...
Allows callers to extract the NFS error code.
2018-07-06 19:17:34 +02:00
Max Kellermann
30900b2fe2
input/Error: new library providing IsFileNotFound()
2018-07-06 19:16:01 +02:00
Max Kellermann
fd7ae7ea4c
input/Domain: remove obsolete variable
2018-07-06 19:13:53 +02:00
Max Kellermann
60d5bf0240
util/StringFormat: new utility library
2018-07-06 19:07:02 +02:00
Max Kellermann
41cdc4e14b
input/Offset: add macro PRIoffset
2018-07-06 19:06:05 +02:00
Max Kellermann
87dfca0477
input/curl: remove obsolete Windows sprintf() fallback
...
See commit be137a191e
2018-07-06 19:05:09 +02:00
Max Kellermann
e1ee8e7812
util/FormatString: remove obsolete Windows fallback
...
Since 7d353bbe2a
, _GNU_SOURCE is always
defined, which implies __USE_MINGW_ANSI_STDIO and thus switches to
the mingw implementations of the printf() family. That's
standards-compliant, unlike Microsoft's CRT implementations.
2018-07-06 19:04:33 +02:00
Max Kellermann
63406efcd8
db/update/ExcludeList: allow comments only at start of line
2018-07-06 18:27:17 +02:00
Max Kellermann
d5c132fca0
db/update/ExcludeList: move code to ParseLine()
2018-07-06 18:25:27 +02:00
Max Kellermann
5f082a2739
output/httpd: remove broken DLNA support code
...
This code was added in 21851c0673
but
looks completely broken:
- the status code is "206 OK" but "206" would be "Partial Content"
- the "Content-Length" header has a bogus value
- the "Content-RangeX" parameter has different bogus values (why
"Content-RangeX" anyway and not "Content-Range"?)
Apart from that, there are strange undocumented non-standard headers
which are probably there to work around bugs/expectations in one
broken proprietary client product. But these days, MPD doesn't bend
over to support broken clients. So let's kill this code.
Closes #304
2018-07-06 17:28:01 +02:00
Max Kellermann
45139f94bb
db/LightSong: pass URI to constructor
2018-07-06 16:56:12 +02:00
Max Kellermann
80cb680fca
db/LightSong: implicit initialization
2018-07-06 16:50:37 +02:00
Max Kellermann
b9ff6383a4
db/LightSong: make Tag a reference
...
This enforces the "not nullptr" rule.
2018-07-06 16:47:47 +02:00
Max Kellermann
ebc006ab52
db/simple: wrap LightSong in Manual<>
...
Prepare to make LightSong non-assignable.
2018-07-06 16:46:01 +02:00
Max Kellermann
86a02871fc
decoder/vorbis: call TagHandler::OnAudioFormat()
2018-07-06 12:44:58 +02:00
Max Kellermann
e152e843d8
tag/Handler: add method OnAudioFormat()
2018-07-06 12:44:58 +02:00
Max Kellermann
9ff1ff75cb
tag/Handler: add FullTagHandler constructor with want_mask
2018-07-06 12:44:58 +02:00
Max Kellermann
abea4a24ba
tag/Handler: move WANT_DURATION|WANT_TAG to protected AddTagHandler()
2018-07-06 12:44:11 +02:00
Max Kellermann
3d3a1232b1
tag/Handler: convert to class with virtual methods
2018-07-05 19:07:05 +02:00
Max Kellermann
09d4176210
output/multiple: use WaitAll() in EnableDisable()
2018-06-23 19:23:56 +02:00
Max Kellermann
30d41e45e2
output/multiple: remove unnecessary IsBusy() check from WaitAll()
...
AudioOutputControl::WaitForCommand() doesn't need this check.
2018-06-23 19:23:18 +02:00
Max Kellermann
bd9a5021da
notify: remove unused library
2018-06-23 19:15:26 +02:00
Max Kellermann
1624a5eb8d
output/Control: add another Cond attribute, replacing audio_output_client_notify
2018-06-23 19:11:48 +02:00
Max Kellermann
1bca29f9e2
output/Control: rename "cond" to "wake_cond"
...
Prepare for adding another Cond attribute.
2018-06-23 19:10:23 +02:00
Max Kellermann
efb8a9bd2c
player, decoder, output: wrap MusicPipe in std::shared_ptr/std::unique_ptr
2018-06-23 18:45:57 +02:00
Max Kellermann
82954d1d6f
player/Thread: eliminate ClearAndReplacePipe()
...
Since commit e81b089612
, this is the
same code as in ReplacePipe().
2018-06-23 18:44:48 +02:00
Max Kellermann
5a02324c09
MusicBuffer: make constructor explicit
2018-06-23 18:40:36 +02:00
Max Kellermann
eb93bebbc1
MusicBuffer: fix potential deadlock while cross-fading in Return()
2018-06-23 18:39:50 +02:00
Max Kellermann
2be905b2e2
MusicPipe: eliminate the unused MusicBuffer reference
...
This requires re-adding the reference to struct DecoderControl, which
was removed recently by commit
9f14e7a98d
2018-06-23 18:36:24 +02:00
Max Kellermann
076be809c2
Music{Pipe,Chunk}: use MusicChunkPtr for the list links
2018-06-23 17:58:42 +02:00
Max Kellermann
88f1233d7b
MusicPipe, output/multiple: include cleanup
2018-06-23 17:44:32 +02:00
Max Kellermann
54d295c247
MusicChunkPtr: managed MusicChunk pointer
...
Make all uses of MusicChunk safe.
2018-06-22 23:11:52 +02:00
Max Kellermann
e81b089612
MusicPipe: automatically clear in destructor
...
We can implement this now that we have a MusicBuffer reference.
2018-06-22 23:09:13 +02:00
Max Kellermann
9f14e7a98d
MusicPipe: add MusicBuffer reference
...
This tiny amount of overhead allows omitting the MusicBuffer in
Clear().
2018-06-22 22:59:44 +02:00
Max Kellermann
cb412b221c
output/multiple: update API documentation
2018-06-22 22:59:30 +02:00
Max Kellermann
1ca1269a59
input/curl: use class MaybeBufferedInputStream
...
For remote files (not streams), this downloads as quickly as possible
to a large buffer instead of throttling the stream during playback.
Throttling can make the server impatient and it may then disconnect.
This is what Qobuz and Tidal do, and this commit attempts to solve
this by not letting the Qobuz/Tidal server wait (closes #241 ).
2018-06-22 22:33:16 +02:00
Max Kellermann
6681b14b71
input/MaybeBuffered: proxy InputStream implementation which auto-uses BufferedInputStream
2018-06-22 22:33:16 +02:00
Max Kellermann
12f2418445
input/buffered: proxy InputStream implementation which caches in a huge buffer
2018-06-22 22:33:16 +02:00
Max Kellermann
ae8a2ab652
util/SparseBuffer: new utility class
2018-06-22 22:18:26 +02:00
Max Kellermann
d0fbf6db59
input/Stream: remove attribute "cond", replace with handler interface
...
This adds a bit of overhead, but also adds flexibility to the API,
because arbitrary triggers may be invoked from that virtual method
implementation, not just Cond::signal().
The motivation for this is to make the handlers more dynamic, for the
upcoming buffering class utilizing ProxyInputStream.
2018-06-22 19:37:18 +02:00
Max Kellermann
01d8eb6290
input/rewind: move sources out of the "plugins" directory
...
This is not a plugin.
2018-06-22 19:31:06 +02:00
Max Kellermann
197968d65e
input/Stream: mark qobuz:// and tidal:// as "seeking is expensive"
...
Those are loaded with the "curl" input plugin, and this one is
"expensive", because it needs to send a new HTTP request with Range
header for each seek.
2018-06-21 22:35:36 +02:00
Max Kellermann
2cb83a1f84
input/Stream: make "uri" const
2018-06-14 17:31:54 +02:00
Max Kellermann
d7c94e30c5
input/Stream: remove obsolete comment
2018-06-14 17:31:33 +02:00
Max Kellermann
5217a74b7f
storage/udisks: return file path in MapUTF8()
...
The absolute udisks:// URI is not usable with InputStream::Open(), and
thus we need to return the LocalStorage::MapUTF8() return value
instead.
2018-06-05 22:01:28 +02:00
Max Kellermann
cccf35d140
storage/udisks: add missing MountWait() call to MapFS()
2018-06-05 21:56:28 +02:00
Max Kellermann
249316c8fc
storage/udisks: implement MapFS()
2018-06-05 21:54:50 +02:00
Max Kellermann
ba8040d068
storage/udisks: new plugin
...
Documentation will follow soon.
2018-06-04 22:00:52 +02:00
Max Kellermann
5fa94d2a85
lib/dbus/AsyncRequest: add missing include
2018-06-04 22:00:52 +02:00
Max Kellermann
7eee79c145
neighbor/udisks: move code to class UDisks2::ParseObjects(ODBus::Message)
2018-06-04 21:50:34 +02:00
Max Kellermann
9626523420
neighbor/udisks: move code to class UDisks2::ParseObjects(ReadMessageIter)
2018-06-04 21:41:51 +02:00
Max Kellermann
03c89c9cec
neighbor/udisks: move ParseObject() to UDisks2.cxx
2018-06-04 17:23:55 +02:00
Max Kellermann
640de5518b
neighbor/udisks: move struct UdisksObject to UDisks2.hxx
2018-06-04 17:23:55 +02:00
Max Kellermann
a92c694f1b
neighbor/Iter: add missing include
2018-06-04 17:23:55 +02:00
Max Kellermann
a159299a4b
lib/dbus/AsyncRequest: new helper class
2018-06-04 12:21:17 +02:00
Max Kellermann
d048545f1a
lib/dbus/Connection: add DBusConnection& cast operator
2018-06-04 12:20:41 +02:00
Max Kellermann
aea6d354b7
lib/dbus/ObjectManager: use TypeTraits instead of CPP macro
2018-06-03 20:30:08 +02:00
Max Kellermann
d3793dfe5b
lib/dbus/Types: add ObjectPathTypeTraits
2018-06-03 20:30:08 +02:00
Max Kellermann
234f8d287a
lib/dbus/Types: rename _MakeStructTypeAsString to ConcatTypeAsString
2018-06-03 20:29:01 +02:00
Max Kellermann
8d49c2d028
neighbor/udisks: show only filesystems, hide raw drives
2018-06-03 20:20:37 +02:00
Max Kellermann
e560f6bc63
lib/dbus/ReadIter: add ForEachProperty()
2018-06-03 20:18:46 +02:00
Max Kellermann
fbfbc5682a
lib/dbus/ReadIter: add ForEachRecurse()
2018-06-03 20:18:08 +02:00
Max Kellermann
d4141bf7f1
lib/dbus/ReadIter: add API documentation
2018-06-03 20:05:37 +02:00
Max Kellermann
6c81fa1ec5
neighbor/udisks: move code to ForEachInterface()
2018-06-03 14:47:12 +02:00
Max Kellermann
24874b8286
Merge branch 'v0.20.x'
2018-06-03 14:22:29 +02:00
Max Kellermann
b63664988f
lib/dbus/Types: support DBUS_TYPE_DICT_ENTRY
2018-06-03 12:19:17 +02:00
Max Kellermann
eeb00ac45b
util/TemplateString: new utility library
2018-06-03 12:13:47 +02:00
Max Kellermann
37e25f93d6
lib/dbus/Glue: move Connect()/Disconnect() calls to I/O thread
2018-06-03 12:08:37 +02:00
Max Kellermann
d58d65ebf0
lib/dbus/Glue: use private connection
...
Avoid interfering with libraries also using the shared connection.
2018-06-03 11:00:58 +02:00
Max Kellermann
adf2d3aff2
zeroconf/Avahi: move dbus_shutdown() call to the end of Main()
...
Calling dbus_shutdown() too early will break the "udisks2" neighbor
plugin.
2018-06-03 10:37:54 +02:00
Max Kellermann
32064a23c1
neighbor/udisks2: move Open()/Close() calls into the I/O thread
...
Fixes assertion failure.
2018-06-03 10:08:11 +02:00
Max Kellermann
c60b50b1ae
neighbor/udisks2: use SafeSingleton for managing the ODBus::Glue instance
...
Allows other objects to use the same single instance as well.
2018-06-03 09:58:34 +02:00
Max Kellermann
f3ffdaf21f
lib/dbus/Glue: singleton for global initialization
2018-06-03 09:28:04 +02:00
Max Kellermann
3aade67046
basic udisks2 support
...
To get udisks2 support started, this commit contains the configure.ac
option and a "neighbor" plugin which shows block devices. Later, this
will allow mounting removable media with a new storage plugin.
2018-06-02 19:44:46 +02:00
Max Kellermann
dc111bbec2
odbus: import dbus-1 OO wrapper library
...
From a7cef404c1
To be used by upcoming code.
2018-06-02 19:15:56 +02:00
Christian Kröner
58590b71d1
Fix pause for OSX output plugin (delay one second)
2018-06-02 19:02:37 +02:00
Max Kellermann
8dcb1f805d
db/proxy: support tags "ArtistSort", "AlbumArtistSort", "AlbumSort"
...
Closes #284
2018-05-28 20:14:07 +02:00
Max Kellermann
a8b9e5b9b9
db/proxy: add "password" setting
...
Closes #283
2018-05-28 20:01:08 +02:00
Max Kellermann
66a1e8b737
release v0.20.20
...
-----BEGIN PGP SIGNATURE-----
iQJEBAABCgAuFiEEA5IzWngIOJSkMBxDI26KWMbbRRIFAlsD85IQHG1heEBtdXNp
Y3BkLm9yZwAKCRAjbopYxttFEm5xD/oCagsybi2L60r0trtjE7DJ+SnmgbjVmn3z
aieaIA78KFK2QWUettevYkVwtwqEqyw5DwSDmxRRpm9sMKsdDBL+gLCf5hjIFNQY
dZjyBIABgE+aAT+iYeXVmWgJI24s8znEGhZjUG5P/gf+CoLKvN5OQiZoBKOaurjX
YwJUyLV1SXiMLV/4HtOFw4xORuRPflhZ5MnA+cO7BmpV0XQoq82XgBi3XqAB8dv4
cIpDs0MU7DFHNUYHeHEWXVh1PgAcr2madWwQTiscuy8KRAR0GzkCsG5UrSyJs0xH
c0yQ1vVt7X0nyxV35Yemmlfe4DwMwNK9avsTr3Mmr4tNDbxxhiddDYZzy6UJHKis
vaVLhePLjXCOfPRivCY8zVZHwGTO5ArxQqftkGDnM1Gq8PwpTWLimZkvUW35d/xf
SJ+ixpkA1O2DzmkyUam41phhXli+lt0hF1P/7dKsuV/fzmAkJlmRpgxJJhLH8mwq
NNfHk8y8kdGoVy65e/u2asJe8PPB2y9NK2JmbBR9g6Dn+6puP4gkhok3a9cvUZ6q
5GHJF9yRYswVkr/Y6q8UtESeEUczqrQTasVvq0fkxV0f17BKDbOxClb+ItrnPTWV
WMfsyF3TYrHi4piB810q/nBY6pY7R2vQNCPMZwfjGlqn5amR2fm8QWecJVIPpkv3
rEPv+4r8nQ==
=DEYg
-----END PGP SIGNATURE-----
Merge tag 'v0.20.20'
release v0.20.20
2018-05-22 12:47:11 +02:00
Max Kellermann
c76f4ac89b
player/Thread: pause all outputs in single mode
...
This mostly affects the Pulse output plugin which needs to "cork" the
stream (closes #278 ).
2018-05-12 14:44:07 +02:00
Michal Koutenský
d495ec71a8
decoder/opus: add support for R128_ALBUM_GAIN tag
2018-05-07 10:57:03 +02:00
Max Kellermann
b763852f57
decoder/dsd: allow 4 MB ID3 tags
...
Closes #277
2018-05-07 10:53:48 +02:00
Max Kellermann
a8568d7246
Merge branch 'v0.20.x'
2018-05-03 20:15:11 +02:00
Max Kellermann
6522d2f722
decoder/{dsdiff,dsf}: support more MIME types
...
These are used by DSD-streaming servers. For example, MiniDLNA uses
"audio/x-dsd".
2018-05-03 12:02:11 +02:00
Max Kellermann
ac61fd1d78
{input,output}/alsa: work around -Wswitch due to SND_PCM_STATE_PRIVATE1
2018-05-03 11:59:18 +02:00
Max Kellermann
c44d1566fa
SongFilter: fix "modified-since" filter
...
Error message sent to client was "basic_string::_M_construct null not
valid" due to passing nullptr to the std::string constructor.
Regression caused by commit 386688b87a
2018-04-30 20:34:25 +02:00
Max Kellermann
43a43c1e2b
release v0.20.19
...
-----BEGIN PGP SIGNATURE-----
iQJEBAABCgAuFiEEA5IzWngIOJSkMBxDI26KWMbbRRIFAlriEvAQHG1heEBtdXNp
Y3BkLm9yZwAKCRAjbopYxttFEnEpD/4+yH4ydc9l1/j5AD08jFyUUe6YSnC8gLsG
DRrSOU1BQltYAPhlRGxA/HlKxboaT7v5qcXBdIV+HwKs6149j8qxip8g8PYoUBmB
mn6YckjEPCLpLe4WSvfGdm5a1aI7nMC76wHBvTPCAMTZk9FAmUED4DqgNYmWycOd
MpXZbzZdvb2Ti4dQARrK8AbMjTD44LXDOhBgWYnZLpo1ovYhnGvTPAElCQN23tbT
VMcJPYe86lzgs1vWwgURzkn7Y3CaSMF3G+aKw/oLEK3giZmE0y7Kov9Ycy4IC6+3
aXuEP9drMIltAyZ2hmeH6JFigbgQbDhwuAu1biYLLukwa0oEOEFTP1+yxAVbi/vx
58rD6uWJeFbqPna6146TAYVi8QeymJWfhFWxkcol2u7etrIxXpX//qo8Mv+AiLor
wOrTerKgRFYmtSH14wIoSfKsn2wmsXOhDE38h621PAzqvQXDzrBLMo4HMJ4y+G+q
Y6LZWatweL6I2qMsOKWvECOJNxQJrkDFOLq8Mj+O4v6iiLQWhiul1hi2g8EOcRMI
SkdWTakla3LbmuUN1dKQJwoojNevnP5yPXI15rM6JMZkXJcWxi4mvnzoAFnBTmov
57GxpShueo2yy9yrFgS7hBuRsBXzYxze/xY0LSYSO4SjCjNCnWXse6O9pI7JqFbI
m5JJW96Nqg==
=1wwq
-----END PGP SIGNATURE-----
Merge tag 'v0.20.19'
release v0.20.19
2018-04-26 20:06:41 +02:00
Max Kellermann
ac395429c3
db/proxy: implement the group_mask parameter in VisitUniqueTags()
...
Closes #258
2018-04-26 19:43:33 +02:00
Max Kellermann
388768b3a6
db/proxy: call mpd_search_cancel() after search error
...
Fixes "search already in progress" errors.
2018-04-26 19:41:19 +02:00
Max Kellermann
e08598e7e2
output/alsa: don't submit silence if PCM is not yet running
...
See code comment. Closes #260
2018-04-26 17:14:42 +02:00
Max Kellermann
d301a79dcf
output/alsa: CopyRingToPeriodBuffer() returns bool
2018-04-26 16:44:23 +02:00
Max Kellermann
98d76627a5
output/alsa: disable events in Cancel()
...
Don't reactivate the PCM device immediately after Cancel() is
finished; if Cancel() gets called this may mean that new data may take
a while to produce, or no data at all will be produced because the
current song is being stopped.
Once new data is available, Play() will automatically reactivate the
PCM.
This fixes underruns when switching songs manually (closes #264 ).
2018-04-26 16:41:49 +02:00
Max Kellermann
8a809013f3
output/alsa: reset "active" on error
...
Use the "active" flag in PrepareSockets() instead of LockHasError().
2018-04-26 16:18:59 +02:00
Max Kellermann
485ed0b156
output/alsa: make the "active" attribute thread-safe
2018-04-26 16:18:52 +02:00
Max Kellermann
7d546f80f9
output/alsa: merge Activate() and UnlockActivate()
...
Prepare to make the "active" attribute thread-safe.
2018-04-26 16:18:18 +02:00
Max Kellermann
5dfdc15f93
output/alsa: rethrow errors in Drain()
2018-04-26 16:17:14 +02:00