Commit Graph

11621 Commits

Author SHA1 Message Date
Max Kellermann
d8b03d4927 decoder/ffmpeg: call TagHandler::OnAudioFormat() 2018-07-07 13:02:08 +02:00
Max Kellermann
72b6c09a73 db/simple: add an AudioFormat to each Song 2018-07-06 22:49:02 +02:00
Max Kellermann
c05bca6f2c tag/Handler: implement FullTagHandler::OnAudioFormat() 2018-07-06 22:46:03 +02:00
Max Kellermann
73c95d1fb2 TagFile: rename exported functions, use CamelCase
And specify whether generic tags are being scanned.
2018-07-06 22:33:35 +02:00
Max Kellermann
2c30e16371 db/simple/Song: remove obsolete comment 2018-07-06 21:50:53 +02:00
Max Kellermann
72437ca9e2 db/simple/Song: use C++11 initializers 2018-07-06 21:49:52 +02:00
Max Kellermann
a72d1200fb require GCC 6
Meanwhile, GCC 5 fails to compile MPD due to incomplete C++14
implementation.
2018-07-06 19:44:32 +02:00
Max Kellermann
9a29d02e7e Merge branch 'v0.20.x' 2018-07-06 19:43:01 +02:00
Max Kellermann
6f3c0d0a60 AudioFormat: include cleanup 2018-07-06 19:35:31 +02:00
Max Kellermann
466625f7ad input/curl: use new class HttpStatusError
This way, IsFileNotFound() can detect status 404.
2018-07-06 19:26:11 +02:00
Max Kellermann
b8259e604a db/update/{Walk,ExcludeList}: use InputStream to read .mpdignore
Supports .mpdignore on NFS/SMB and others (closes #290).
2018-07-06 19:19:04 +02:00
Max Kellermann
86e2075c63 lib/nfs/Connection: use new class NfsClientError
Allows callers to extract the NFS error code.
2018-07-06 19:17:34 +02:00
Max Kellermann
30900b2fe2 input/Error: new library providing IsFileNotFound() 2018-07-06 19:16:01 +02:00
Max Kellermann
fd7ae7ea4c input/Domain: remove obsolete variable 2018-07-06 19:13:53 +02:00
Max Kellermann
60d5bf0240 util/StringFormat: new utility library 2018-07-06 19:07:02 +02:00
Max Kellermann
41cdc4e14b input/Offset: add macro PRIoffset 2018-07-06 19:06:05 +02:00
Max Kellermann
87dfca0477 input/curl: remove obsolete Windows sprintf() fallback
See commit be137a191e
2018-07-06 19:05:09 +02:00
Max Kellermann
e1ee8e7812 util/FormatString: remove obsolete Windows fallback
Since 7d353bbe2a, _GNU_SOURCE is always
defined, which implies __USE_MINGW_ANSI_STDIO and thus switches to
the mingw implementations of the printf() family.  That's
standards-compliant, unlike Microsoft's CRT implementations.
2018-07-06 19:04:33 +02:00
Max Kellermann
63406efcd8 db/update/ExcludeList: allow comments only at start of line 2018-07-06 18:27:17 +02:00
Max Kellermann
d5c132fca0 db/update/ExcludeList: move code to ParseLine() 2018-07-06 18:25:27 +02:00
Max Kellermann
5f082a2739 output/httpd: remove broken DLNA support code
This code was added in 21851c0673 but
looks completely broken:

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

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

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

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

Closes #304
2018-07-06 17:28:01 +02:00
Max Kellermann
45139f94bb db/LightSong: pass URI to constructor 2018-07-06 16:56:12 +02:00
Max Kellermann
80cb680fca db/LightSong: implicit initialization 2018-07-06 16:50:37 +02:00
Max Kellermann
b9ff6383a4 db/LightSong: make Tag a reference
This enforces the "not nullptr" rule.
2018-07-06 16:47:47 +02:00
Max Kellermann
ebc006ab52 db/simple: wrap LightSong in Manual<>
Prepare to make LightSong non-assignable.
2018-07-06 16:46:01 +02:00
Max Kellermann
86a02871fc decoder/vorbis: call TagHandler::OnAudioFormat() 2018-07-06 12:44:58 +02:00
Max Kellermann
e152e843d8 tag/Handler: add method OnAudioFormat() 2018-07-06 12:44:58 +02:00
Max Kellermann
9ff1ff75cb tag/Handler: add FullTagHandler constructor with want_mask 2018-07-06 12:44:58 +02:00
Max Kellermann
abea4a24ba tag/Handler: move WANT_DURATION|WANT_TAG to protected AddTagHandler() 2018-07-06 12:44:11 +02:00
Max Kellermann
3d3a1232b1 tag/Handler: convert to class with virtual methods 2018-07-05 19:07:05 +02:00
Max Kellermann
09d4176210 output/multiple: use WaitAll() in EnableDisable() 2018-06-23 19:23:56 +02:00
Max Kellermann
30d41e45e2 output/multiple: remove unnecessary IsBusy() check from WaitAll()
AudioOutputControl::WaitForCommand() doesn't need this check.
2018-06-23 19:23:18 +02:00
Max Kellermann
bd9a5021da notify: remove unused library 2018-06-23 19:15:26 +02:00
Max Kellermann
1624a5eb8d output/Control: add another Cond attribute, replacing audio_output_client_notify 2018-06-23 19:11:48 +02:00
Max Kellermann
1bca29f9e2 output/Control: rename "cond" to "wake_cond"
Prepare for adding another Cond attribute.
2018-06-23 19:10:23 +02:00
Max Kellermann
efb8a9bd2c player, decoder, output: wrap MusicPipe in std::shared_ptr/std::unique_ptr 2018-06-23 18:45:57 +02:00
Max Kellermann
82954d1d6f player/Thread: eliminate ClearAndReplacePipe()
Since commit e81b089612, this is the
same code as in ReplacePipe().
2018-06-23 18:44:48 +02:00
Max Kellermann
5a02324c09 MusicBuffer: make constructor explicit 2018-06-23 18:40:36 +02:00
Max Kellermann
eb93bebbc1 MusicBuffer: fix potential deadlock while cross-fading in Return() 2018-06-23 18:39:50 +02:00
Max Kellermann
2be905b2e2 MusicPipe: eliminate the unused MusicBuffer reference
This requires re-adding the reference to struct DecoderControl, which
was removed recently by commit
9f14e7a98d
2018-06-23 18:36:24 +02:00
Max Kellermann
076be809c2 Music{Pipe,Chunk}: use MusicChunkPtr for the list links 2018-06-23 17:58:42 +02:00
Max Kellermann
88f1233d7b MusicPipe, output/multiple: include cleanup 2018-06-23 17:44:32 +02:00
Max Kellermann
54d295c247 MusicChunkPtr: managed MusicChunk pointer
Make all uses of MusicChunk safe.
2018-06-22 23:11:52 +02:00
Max Kellermann
e81b089612 MusicPipe: automatically clear in destructor
We can implement this now that we have a MusicBuffer reference.
2018-06-22 23:09:13 +02:00
Max Kellermann
9f14e7a98d MusicPipe: add MusicBuffer reference
This tiny amount of overhead allows omitting the MusicBuffer in
Clear().
2018-06-22 22:59:44 +02:00
Max Kellermann
cb412b221c output/multiple: update API documentation 2018-06-22 22:59:30 +02:00
Max Kellermann
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
Max Kellermann
a6e5873443 output/alsa: thread-safety documentation for attribute "active" 2018-04-26 15:54:15 +02:00
Max Kellermann
e2cf777538 output/alsa: simplify MultiSocketMonitor::GetEventLoop() calls 2018-04-26 15:54:01 +02:00
Max Kellermann
1e54297be8 lib/ffmpeg/Init: fix av_register_all() deprecation warning
av_register_all() was deprecated in
FFmpeg/FFmpeg@0694d87024
2018-04-25 21:35:33 +02:00
Max Kellermann
44b200240f player/Thread: never reuse decoder when switching radio streams
When switching to another song manually, the player checks if the
decoder is already decoding that song; if so, it will attempt to reuse
it by seeking it to the new position.  That however fails if the
decoder is not seekable (e.g. a radio stream) which leaves the user
unable to switch to that song with the bogus error message "Not
seekable".
2018-04-25 21:19:26 +02:00
Max Kellermann
9c61760713 output/alsa: remove obsolete comment, was moved to Alsa::PeriodBuffer::Allocate() 2018-04-10 15:42:29 +02:00
Max Kellermann
b7dc3fae7c Merge branch 'v0.20.x' 2018-03-15 20:08:13 +01:00
Max Kellermann
a2340c313f pcm/PcmDop: round down to the nearest multiple of 4 DSD bytes
There was a discrepancy between what was written to the buffer and the
size returned by pcm_dsd_to_dop(): the "for" loop uses num_frames/2,
rounding down, while the return value is num_samples which is
num_frames*channels, without rounding.  This could cause undefined
data at the end of the destination buffer if the source buffer size
was not aligned to multiples of 8 bytes (4 DSD bytes per channel).

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

Closes #233
2018-03-15 20:02:00 +01:00
Max Kellermann
37b07a5e7c pcm/PcmDop: use size_t 2018-03-15 20:00:14 +01:00
Max Kellermann
73013a3c04 input/thread: move code to Stop()
Fixes crash due to "pure virtual method called" in the "mms" input
plugin.  Closes #253
2018-03-15 19:29:55 +01:00
Max Kellermann
c2c2c29658 input/thread: set InputStream::ready after Open() failure
Without setting the "ready" flag, the caller will wait in WaitReady()
forever, locking up MPD.  Closes #252
2018-03-14 13:15:03 +01:00
Christian Kröner
d84cd500bb Fix build with DSD disabled 2018-03-07 22:40:19 +01:00
Christian Kröner
5b456cadc4 Reset sample rate to initial state on OSX output 2018-03-07 22:38:09 +01:00
Christian Kröner
4be80982a4 Fix sample rate sync on Mac output for low rates 2018-03-07 21:32:21 +01:00
Christian Kröner
4d7f1f0c35 Implement Pause() for OSXOutput plugin 2018-03-07 11:59:43 +01:00
Christian Kröner
d3f097c7f1 Honor 'device "system"' setting for OSX output 2018-03-07 11:59:43 +01:00
Max Kellermann
5b0e8c6de0 Merge branch 'v0.20.x' 2018-03-05 11:13:42 +01:00
Max Kellermann
dadd3ca671 protocol/ArgParser: disallow negative seek times
Instead of stopping playback (due to seek time overflow), reject the
seek command.  Closes #240

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

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

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

USAGE (try only on DACs that support DoP):
- Add dop "yes" option to mpdconf
- Be sure to set at least 24bits per channel before playing some DSD file (using Audio-MIDI-Setup)
- Based on the dop setting, MPD will change the sample rate as required and output DoP signal to the DAC
- Hog mode is recommended to ensure that no other program will try to mix some output with the DoP stream (resulting in bad noise)
- Alternatively set the default output device to another device (e.g. the built-in output) to avoid having other audio interfere with DSD playback
2018-02-26 14:55:03 +01:00
cathugger
47d1d3c855 encoder/opus: add optional stream chaining support
support for chaining ogg opus streams to enable changing stream' metadata on the fly.
currently support is opt-in (enabled by additional option) because lots of clients can't handle this properly yet.
2018-02-25 15:27:08 +00:00
Patryk Hachuła
1628d801f9 playlist/Queue: add one-shot to single mode 2018-02-25 09:50:03 +01:00
Max Kellermann
1fb358249b Merge branch 'v0.20.x' 2018-02-24 23:18:25 +01:00
Max Kellermann
418f71ec0f net/Init: work around -Werror=unused-variable 2018-02-24 23:17:36 +01:00
Max Kellermann
b30a510b45 release v0.20.18
-----BEGIN PGP SIGNATURE-----
 
 iQJEBAABCgAuFiEEA5IzWngIOJSkMBxDI26KWMbbRRIFAlqR3zoQHG1heEBtdXNp
 Y3BkLm9yZwAKCRAjbopYxttFEqNGEACGhsZJbhqls0EawfHhpOz/x7JcloMLWvoX
 GzuvVinhdFmmFId0akLsg3TCyGElNA+4YzfDjB1TyMpPFBUxM/nnthYPrSmjiT68
 t+0IV6OnqFVLE2PF6pHV2Gia0Km746GZBJ+TRLeZSIksADH7nU+soepIA6idwNRN
 x8Wo0ashsRIPG3FyL6f/2W/vUvD/enoxohCBB/tvnZ73Px0k2bYAwlBNW/i9/yrX
 ktJ2yJqbCkKOhBQnbUvsG72Nrd4/Iz2m7cA//KBVrDEGwNv5hxNKiK/hCq3YK2W9
 Ndnl0+EQxNLT1NUwF5e1LS3GtU2Mh3FQwrcq81Cj7o/wEH5e7piKBZhwDCBgOYYH
 vLbaLYWK+XW/EqitkRZx5ZBrfNoqOrLreX0d2+AZJOjKDjAWgMZXoOEjmQC9/Dcj
 pGcRow4jAusBRJKVN0Wmu6eeVQMjiYJNWehhyhhruShHL2ZAjJSuDhygAFW5YB3I
 N2kfhwZWMHVFpA0HvcVx5JwNx7U1OyJGs0lRGThV/6jhnklGzoujvomRNJ6VNx10
 ppYhmcLaHm19GR1eb8KCYnZYL2QWoQT5YLVlm0vybTX9i1k3wdf9ezU/n5hB52rP
 j20Ol1I9YQw4/L985SV1W+8ll1i71o9paoJx17C8AQpxWWamQLe+vgENt9fPKIPl
 aLBYU7hq9Q==
 =ndLr
 -----END PGP SIGNATURE-----

Merge tag 'v0.20.18'

release v0.20.18
2018-02-24 23:16:06 +01:00
Max Kellermann
cd48d981b5 storage/nfs: use PathTraitsFS::const_pointer_type 2018-02-24 22:44:42 +01:00
Max Kellermann
774d26b982 storage/nfs: assume UTF-8 when accessing NFS from Windows
Fixes two build failures with libnfs on Windows.
2018-02-24 22:44:42 +01:00
Max Kellermann
5b80711d75 Main: move WinSock initialization to class ScopeNetInit 2018-02-24 22:44:27 +01:00
Max Kellermann
31794ac376 lib/nfs/FileReader: move sys/stat.h to header because "struct stat" may be macro
It indeed is a macro on Windows.
2018-02-24 22:03:38 +01:00
Max Kellermann
2141fdf06e lib/nfs/Connection: use winsock2.h instead of poll.h on Windows 2018-02-24 22:02:42 +01:00
tpoeiras
3f3e0739c4 Fix curl storage plugin failure if the authentication method is different than basic. 2018-02-24 21:59:13 +01:00
Max Kellermann
ebed7e2147 playlist/cue/Parser: parse tags after "INDEX 01"
Instead of setting state=IGNORE_TRACK, ignore only the following
"INDEX" lines.

Correction for commit 8461d71b52.  Closes #227
2018-02-24 21:29:16 +01:00
FlashSystems
9f6af4f2cc Fix for bogus output of the albumart command on 32bit platforms.
read_stream_art uses PRIu64 unconditionally with the Format
method of a Respone instance to output a size_t typed value.
If size_t is 32bit the output is garbeled. This patch uses
offset_type and PRIoffset to make sure the format string
and the type of the output value always match.
2018-02-17 19:19:38 +01:00
Max Kellermann
60efdce5ff Merge branch 'v0.20.x' 2018-02-17 13:37:03 +01:00
Max Kellermann
026aef7465 decoder/flac: move the SubmitData() call out of the callback
This addresses two problems:

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

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

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

Closes #113
2018-02-17 13:10:00 +01:00
Max Kellermann
a68f2cb9fa input/InputPlugin: add API documentation 2018-02-17 10:32:17 +01:00
Max Kellermann
5f5be823f3 input/RemoteTagScanner: add API documentation 2018-02-17 08:49:35 +01:00
Max Kellermann
bfc886cd54 decoder/Client: update API documentation 2018-02-17 08:20:07 +01:00
cathugger
c43ea74b30 encoder/opus: initialize granulepos to 0
it was uninitialized before
2018-02-17 01:22:17 +01:00
Max Kellermann
d29d186d62 output/alsa: use a new I/O thread with real-time scheduling
The normal I/O event thread can have a large latency, e.g. when
libgnutls loads all TLS CA certificates for a https connect.  This
makes it unreliable for the ALSA I/O notifications, and causes ring
buffer xruns.  To avoid interfering with high latency events such as
CURL's, we move the ALSA I/O events to a separate I/O thread which
also obtains real-time scheduling (if possible).

Closes #221
2018-02-16 22:38:55 +01:00
Max Kellermann
61f2ce67dd decoder/HybridDSD: implement seeking 2018-02-13 09:53:05 +01:00
Max Kellermann
60dbf1bea0 decoder/HybridDSD: calculate bit rate 2018-02-13 09:41:07 +01:00
Max Kellermann
58bb866e2d decoder/HybridDSD: add code comments 2018-02-13 09:29:58 +01:00
Max Kellermann
b2ec5d0f01 decoder/HybridDSD: new decoder plugin for Hybrid DSD 2018-02-13 00:00:00 +01:00
Max Kellermann
65bbb0e0aa release v0.20.17
-----BEGIN PGP SIGNATURE-----
 
 iQJEBAABCgAuFiEEA5IzWngIOJSkMBxDI26KWMbbRRIFAlqAMO0QHG1heEBtdXNp
 Y3BkLm9yZwAKCRAjbopYxttFEg8eD/49NlFvlNdkamgYvh7MI1Sn67yKAwQt+N51
 W0hVnmXwPoSg76gfWw8J9kVyQy/jEkaCxsPF/UuEbH5jzqAC0y8hwYVRkJaRc9wN
 ZfwHvLHeaUxQweoguEwRSREy4ZC4ImQOK+eAxI1R43mqxxyhko1Akc1NmRVWzYfv
 /FGmAjTi1U6FR/yDpdSFn1NdlPmIgZ4WDuRsDT2NrshX/Bb32FiyZBytvek2P8n/
 QNgXv18E4yWXSb+zBYhPy/eaKhGasyjI3cbht1F0hNW9Yo/BsFxDuwXrX1vNBaOS
 E3Dux4s/nfcJ4RMRjmrkFwXImCvxt7+AGfh8RYBXuwqMExXz2kZjIs4ZVvO7Nu9A
 pFDJQwRIojXMfk73LU/MEpmNNEXhvfQLYkrM7poSqYaOr8SWMszqSgNnnfq6+flB
 sJbstgAStI6lL0jy0HrtMTvPVEiAGh6wCvMy/r2G9XUAyw76ccOg7MaIldn0MHJv
 A51+GfRTi4ILH0ReL1BGAg9nG97uFmRAWGkfkhtyD540xGRk7x5R8/ml4zFogHN6
 SbrV0NPdwk+uFd0y2znQT2gWyjc0id4WEKEoHX+Gl6c5qtPIfrq+PQPyk9kR+u+i
 AxwqMoKQer6Ji5qnsvCiKSkaGGiVNivrZ11jDWNCZaKjmvlKlvj/P5GxbPpORorq
 v4ru/4vNXQ==
 =v4t8
 -----END PGP SIGNATURE-----

Merge tag 'v0.20.17'

release v0.20.17
2018-02-11 13:22:43 +01:00
Max Kellermann
bede564618 mixer/alsa: work around rounding error at volume 0
Due to rounding errors, a slightly negative value can be passed to
set_normalized_volume(), which will make the log10() call fail.
Actually, volume 0 is already failing because log10(0) is illegal.  So
let's fix this by implementing two corner cases: <=0 and >=100.

Closes #212
2018-02-10 09:07:51 +01:00
Max Kellermann
9187a08106 lib/curl: remove .netrc support on Android
Not needed on Android, and the implementation uses getpwuid_r() which
is unavailable on old Android versions.
2018-02-09 23:14:29 +01:00
Max Kellermann
3859a50466 python/build/libs.py: convert CURL edit to quilt patch 2018-02-09 23:14:27 +01:00
Max Kellermann
6ba918b203 input/file: don't use posix_fadvise() on Android
Requires Android API 21, but we want to support older versions as
well.
2018-02-09 22:54:22 +01:00
Max Kellermann
e8b70dbca4 SongSave, queue/PlaylistState, tag/ReplayGain: use portable atof() wrappers
For Android pre-5.0 compatibility (#213).
2018-02-09 22:54:22 +01:00
Max Kellermann
0f8d223c7f protocol/ArgParser: move strtof()/strtod() switch to util/NumberParser.hxx 2018-02-09 22:54:22 +01:00
Max Kellermann
19a2885fd5 protocol/ArgParser: use strtod() instead of strtof() on Android
For Android pre-5.0 compatibility (#213).
2018-02-09 22:54:22 +01:00
Max Kellermann
e46fbd0780 filter/convert: set the PcmConvert instance only if it was initialized
Fixes valgrind warning.
2018-02-09 19:05:45 +01:00
Max Kellermann
56b74ad990 filter/convert: add method IsActive() 2018-02-09 19:04:45 +01:00
Max Kellermann
6de92bb42b pcm/Order: fix size calculation with 8 channels
This was a buffer overflow bug which could cause MPD crahes when
playing back 8 channels with the ALSA output plugin.

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

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

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

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

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

Regression caused by commit 386688b87a
2018-02-09 13:19:26 +01:00
Max Kellermann
250b6a3d52 release v0.20.16
-----BEGIN PGP SIGNATURE-----
 
 iQJEBAABCgAuFiEEA5IzWngIOJSkMBxDI26KWMbbRRIFAlp2BjEQHG1heEBtdXNp
 Y3BkLm9yZwAKCRAjbopYxttFEl0HEACEOGoX3a8slWwuPsqdOu+thc73SIMVzqF9
 xzxFbGLyp0MzXTAgU+SLzfbD4/gerglC7TRbGzsvVu7iwxXeKhEL/SJ5RhrCQM3E
 U8jaOeavMWeqX60pdbTz2zw4maKAD7U3fWcYxoh09EBaZa7Mm/j7URPLqrlWT7VD
 iWqdLcC4HZarOxBbq0CY7rQPVsAVZZ5l43MDV6hiInSn0wWo783G6BtYFgvgH8qk
 pZIL0yScQrjyj9D0fgfDC9DBVfHqMqpWW5G2rNhsXTUtpdb9V5tB2B8ZbIUWJfD7
 aVFztCwwmbiBle4UBHfyyDLfZkBZmU/qKc9+I3WUxT4DLbA8gDXZFjb7zU80NMge
 xzbXeO7XvxvSm7groqRh3Vy0nbkBMB9wTwzre3ULhYyhY2vVISb9lSyRtUE9xuR8
 SL2zpdgVcFdTUSKat63ikeU4sbYvssra3ZDRnAyoFF2iVpT2J2B95ZVNfaIYbRSQ
 lidlz8q3Px5GUDe3D0ao3hFk5t1Hg2jXx3nbz/Kk+SwZpsaiCewl6zjptye7R7zD
 e9OMxYrU+/opsynRE5NFuTvkRKUG1kC47/rWgGZWI9Cbv8+lse1NO0c7VzM7o1hH
 Bfk5AhEkv8tLNM+39evXdNQVB0cna5ndSDOkYBcPI78/PUNd+TnrPdfI/W3NCnRl
 I+CWQE3uSQ==
 =+tJ2
 -----END PGP SIGNATURE-----

Merge tag 'v0.20.16'

release v0.20.16
2018-02-03 19:59:29 +01:00
Max Kellermann
12fd1cad0c archive/iso9660: libcdio 2.0 compatibility
Closes #173
2018-02-03 19:32:31 +01:00
Max Kellermann
73ddbcc876 player/Thread: wake up the main thread after failed seek
Fixes deadlock bug.  Closes #210
2018-02-03 19:28:39 +01:00
Max Kellermann
e573cbf032 db/update/Queue: work around GCC7 -Wuninitialized 2018-02-01 19:53:42 +01:00
Max Kellermann
dead461542 lib/upnp/Init: enable IPv6 2018-01-31 18:15:46 +01:00
Max Kellermann
3d5da1ac73 lib/upnp/Init: use nullptr instead of 0 2018-01-31 18:14:26 +01:00
Max Kellermann
ec408ca6a6 output/pulse: fix crash during auto-detection
The PulseOutput needs to be "enabled" before WaitConnection() may be
called.

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

Closes #190
2018-01-19 23:52:57 +01:00
Max Kellermann
ed2354cd9d SongFilter: allow copying items 2018-01-19 23:52:03 +01:00
Max Kellermann
386688b87a SongFilter: use std::string instead of AllocatedString 2018-01-19 23:51:42 +01:00
Max Kellermann
38d56dddf1 lib/icu/Compare: allow copying 2018-01-19 23:49:50 +01:00
Max Kellermann
3ca80a7336 util/RefCount, db/simple/Mount: remove obsolete libc++ workarounds
No longer a problem with NDK r16.
2018-01-19 23:19:46 +01:00
Max Kellermann
2fed3b5e5b input/Tidal*Request: add Start() method
The caller should be able to safely store the instance pointer before
his callback is invoked.
2018-01-19 16:03:05 +01:00
Max Kellermann
1ecad094bd input/tidal: add API documentation 2018-01-19 16:03:03 +01:00
Stefan Roellin
187cc573a7 db/upnp/Directory: fix parsing of durations with fractions of seconds
The duration of a song can have fractions of seconds
(quote from http://www.upnp.org/schemas/av/didl-lite-v2.xsd):

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

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

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

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

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

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

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

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

For some reason AC_CHECK_MEMBER doesn't generate the proper define
in config.h.in, so I used AC_CHECK_MEMBERS.
2018-01-05 22:20:47 +01:00
Max Kellermann
c74e018359 Merge branch 'v0.20.x' 2018-01-05 18:11:04 +01:00
Max Kellermann
cab77e35e0 queue/PlaylistControl: fix crash after seek failure
This completes the bug fix commit
2065e3290452377b2931f3129b230c8cc536cbc8; if we clear "queued" then we
must clear "queued_song" as well, or another variant of the assertion
fails.
2018-01-05 13:00:24 +01:00
Max Kellermann
4a120f8090 Merge branch 'v0.20.x' 2018-01-05 10:10:17 +01:00
Max Kellermann
c2cbb7b8ce output/haiku: remove unimplemented Cancel() method 2018-01-05 10:05:14 +01:00
Max Kellermann
79b0f97a3f output/Interface: clarify Play() API documentation 2018-01-05 08:35:40 +01:00
Max Kellermann
329f9cd9fe thread/Util: no ioprio_set() on Android due to seccomp/SIGSYS 2018-01-04 19:33:14 +01:00
Max Kellermann
e3ef3e8d71 output/Control: unlock mutex during expensive operations 2018-01-04 10:36:18 +01:00
Max Kellermann
7574dfd339 output/Control: move code from FinishDestroy() to destructor 2018-01-04 10:34:27 +01:00
Max Kellermann
a5b93008f5 output/Filtered: remove redundant nullptr assignments from Setup() 2018-01-04 10:32:10 +01:00
Max Kellermann
0227af5bb7 output/Filtered: remove BeginDestroy()
All it does is "sometimes" close the mixer, but that is also done in
the destructor.
2018-01-04 10:29:27 +01:00
Max Kellermann
ef71df60f6 output/Multiple: use std::unique_ptr<FilteredAudioOutput> 2018-01-04 10:14:26 +01:00
Max Kellermann
f52b3b4e04 output/Multiple: dispose the AudioOutputControl instances
Fixes shutdown memory leak.
2018-01-04 10:11:23 +01:00
Max Kellermann
7e4e32cfe0 output/Filtered: eliminate FinishDestroy()
This is implicitly done by the destructor.
2018-01-04 10:05:31 +01:00
Max Kellermann
9f8649884b output/Control: dispose the FilteredAudioOutput
Fixes shutdown memory leak.
2018-01-04 10:01:34 +01:00
Max Kellermann
f1ee4caddd output/Init: fix configuration option name in error message 2018-01-04 09:57:28 +01:00
Max Kellermann
051b8fbb31 output/Thread: add "noexcept" 2018-01-04 09:54:35 +01:00
Max Kellermann
b0ea32f660 output/Control: remove unused method StopThread() 2018-01-04 09:20:22 +01:00
Max Kellermann
8322ae5a4c output/Control: use class ScopeUnlock() 2018-01-04 08:41:19 +01:00
Max Kellermann
98a7c62d7a player/Thread: don't send silence if decoder is slow
The output plugin shall decide whether to insert silence or do nothing
at all.  The ALSA output plugin has already implemented this.
Inserting silence is not necessary or helpful for some plugins, and
may even hurt them (e.g. "recorder").
2018-01-03 17:36:41 +01:00
Max Kellermann
859e59262e player/Thread: remove unnecessary "continue" keywords 2018-01-03 17:17:22 +01:00
Max Kellermann
ec113420f1 player/Thread: hold mutex while calling SongBorder()
Eliminates unnecessary mutex locks.
2018-01-03 17:12:21 +01:00
Max Kellermann
1954e94de2 Merge branch 'work_tag' of git://github.com/loujine/MPD
Closes #181
2018-01-03 11:47:02 +01:00
Max Kellermann
f6ec43b9ec pcm/Resampler: add virtual method Flush()
Wired to Filter::Flush().

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

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

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

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

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

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

No attributes are currently implemented.
2017-12-19 11:57:52 +01:00
Max Kellermann
d05c3f4e4d lib/alsa/AllowedFormat: throw std::invalid_argument on error 2017-12-19 11:57:52 +01:00
Max Kellermann
de178e90f4 AudioParser: throw std::invalid_argument on error 2017-12-19 11:57:47 +01:00
Max Kellermann
3d960b5e55 util/RuntimeError: add FormatInvalidArgument() 2017-12-19 11:56:29 +01:00
Max Kellermann
39dc83bd82 output/Print: print the plugin name 2017-12-19 11:52:10 +01:00
Max Kellermann
503063cddc output/Print: use %u for the index 2017-12-19 11:52:09 +01:00
Max Kellermann
914df18bf9 Main, ...: catch any exception, not just std::runtime_error 2017-12-19 10:56:23 +01:00
Max Kellermann
a539094c06 command/Error: translate std::{length_error,out_of_range} to ACK_ERROR_ARG 2017-12-19 10:54:49 +01:00
Max Kellermann
cd3ed720e0 lib/alsa/AllowedFormat: add API documentation 2017-12-19 08:41:53 +01:00
Max Kellermann
37c27fa606 output/Interface: convert need_fully_defined_audio_format to flag 2017-12-19 08:41:34 +01:00
Max Kellermann
093ca5d492 storage/Interface: add "noexcept" 2017-12-18 23:54:21 +01:00
Max Kellermann
1d24dd3067 storage/State: use std::set instead of sorting a std::list 2017-12-18 23:50:31 +01:00
Max Kellermann
b9659ba0c0 release v0.20.13
-----BEGIN PGP SIGNATURE-----
 
 iQJEBAABCAAuFiEEA5IzWngIOJSkMBxDI26KWMbbRRIFAlo4RDQQHG1heEBtdXNp
 Y3BkLm9yZwAKCRAjbopYxttFEpm6EACTPaPwGbxS770jJ74vLGSltnZTohaKbRvp
 rIaJGkHTTzPlvw8dpLHmave9fL5ODSchTBmIHqb0loM9011oJgvXUKq3fqEQJUUW
 eFZ54emSDXOjholsd8ykJgrPjMBO2UNEk5T/r6bZdNZlLAN7yNOXkJHezPY8qyzA
 s07o9jmFEKjyLOsMlmEaV2uiCZ9UhPUSUI+vy+Q7qwwil24AfOzXc4+gAB3bV87E
 FFWWP8KO83X2ZrhPZdSeILFcI0i93X/l0rskvf4bgHtoegaYPWk/KnhPnmJ2DC48
 GFzigB5ZbU+OGXz1We7O6DZg6KOB4Y6dDPThtxS0rBTZWCPM6biDVsDFexqACf8u
 sCYTzaTlvAV2gHVGp3csVwXS9gqxYOZbiyMgyMOVKygrvuhgrnQydZQW8yweoscP
 tRxVcKfHclbdsEJHboT1Tp4ibh4+iIT48muMpLDlX6h0KC4OOTSg8m3UGV6V4UAA
 bkDVueFYQcr1tyENJbFGRt6gCENY7rdJMX30TvC0DhDtHXUwY6O5G//w5iqpeztv
 svcOuQQURxmPcFuvIqpTpcX0bSEuYkCt9JF31xzFbvmUhB1bb4sZ+IMvBqS9fnUH
 HJmDLLl7mppX3hlPDc9wLc3Dmpfr5Cd1GLO0CkWhnE8KBONV1auYXh8Gtwdsa/Rv
 idA/53WlvQ==
 =+PRl
 -----END PGP SIGNATURE-----

Merge tag 'v0.20.13'

release v0.20.13
2017-12-18 23:48:14 +01:00
FlashSystems
64d141f71e Save and restore mountpoints within the state file.
Signed-off-by: FlashSystems <developer@flashsystems.de>
2017-12-18 23:39:01 +01:00
FlashSystems
c488d3123f Fix lsinfo and add for mounted databases.
If `SimpleDatabase::Visit` is called on a database that contains a mounted directry the URIs of the elements passed to the callbacks are not prefixed by the mountpoint path. This leads to lsinfo and add not working because they use the wrong URI. This pull request is using the `WalkMount` helper function to create prefixed versions of `VisitDirectory`, `VisitSong` and `VisitPlaylist` to add the correct prefix to the parameters of the callback functions.
2017-12-18 23:33:08 +01:00
Max Kellermann
b6af7abb1a thread/PosixMutex: add "noexcept" 2017-12-18 23:29:08 +01:00
Max Kellermann
edee8a3446 Compiler.h: add gcc_returns_nonnull, gcc_returns_twice 2017-12-18 23:00:13 +01:00
Max Kellermann
5582367d68 db/DatabasePrint: support sorting by "modified-since"
Closes #172
2017-12-18 21:52:36 +01:00
Max Kellermann
7a55ab6acc db/DatabasePrint: support descending sort 2017-12-18 21:50:14 +01:00
Stefano Miccoli
967af60327 rounds alsa HW mixer volume towards ±∞ depending on sgn(∆ vol)
This alleviates a problem in which 'volume +1' cannot be undo by
'volume -1' when using alsa hw mixer.

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

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

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

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

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

 8177a4195a/

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

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

D'oh!

Closes #162
2017-11-27 23:02:45 +01:00
FlashSystems
63fc98591d Fix for "Mount-Points are purged from database on update/rescan."
Signed-off-by: FlashSystems <developer@flashsystems.de>
2017-11-27 22:34:49 +01:00
Max Kellermann
520c520512 player/Listener: add "noexcept" 2017-11-26 12:39:09 +01:00
Max Kellermann
a6910313b4 Queue: add "noexcept" 2017-11-26 12:25:53 +01:00
Max Kellermann
2f32df1f09 queue/IdTable: make non-copyable 2017-11-26 12:24:35 +01:00
Max Kellermann
23adf50194 queue/IdTable: make "data" pointer const 2017-11-26 12:24:24 +01:00
Max Kellermann
0691ecc052 queue/IdTable: add "noexcept" 2017-11-26 12:23:46 +01:00
Max Kellermann
d917f44b5b Queue: make configuration attributes const 2017-11-26 12:22:50 +01:00
Max Kellermann
602bb7170a Queue: use C++11 initializer 2017-11-26 12:21:36 +01:00
Max Kellermann
75582d47b9 SongSave: wrap DetachedSong* in std::unique_ptr 2017-11-26 12:18:31 +01:00
Max Kellermann
28fdf1e9ed decoder/Control: wrap DetachedSong* in std::unique_ptr 2017-11-26 12:16:53 +01:00
Max Kellermann
9a8a3beae4 decoder/Control: add "noexcept" 2017-11-26 12:16:53 +01:00
Max Kellermann
2a774a1fea playlist/{flac,m3u}: use std::make_unique 2017-11-26 12:10:33 +01:00
Max Kellermann
b13b023c6b player/Control: wrap DetachedSong* in std::unique_ptr 2017-11-26 12:06:38 +01:00
Max Kellermann
b652ad9568 queue/Playlist: cast next_song to bool, because that is all we need in SyncWithPlayer() 2017-11-26 12:06:29 +01:00
Max Kellermann
624e679e35 player/Control: add "noexcept" 2017-11-26 12:02:08 +01:00
Max Kellermann
618704f504 thread/*: add "noexcept" 2017-11-26 11:58:53 +01:00
Max Kellermann
3b3ec402d6 command/CommandListBuilder: use C++11 initializer 2017-11-26 11:11:36 +01:00
Max Kellermann
2b3c1d640e release v0.20.12
-----BEGIN PGP SIGNATURE-----
 
 iQJEBAABCAAuFiEEA5IzWngIOJSkMBxDI26KWMbbRRIFAloZt0YQHG1heEBtdXNp
 Y3BkLm9yZwAKCRAjbopYxttFElF7D/9DIkK8ArcrqtGvLQFseOucf0FPmAD7csoq
 oDN4TL8UGUSYxcSt3wQqt6rp5JyWAFTuXPpneytqkZ0tW04y4kkvmIrRkYzuBLgt
 yupg1G5fRmidwcqdnb6LqgSdW66pY3U6keaED7LVnMrJbd5MM8R7FejiZFoWmD4C
 c9pUU79MbeRk0w2F9Ws0bkd+yU7lUiolcqOg2VK25MZnObI7qf+/fIKOVK0Q9Q2W
 AdHLHNliySYPBT/po5YN+VAWPcxSFHXkfN552x0N/U1D/klPLmP1q724frFT+DRQ
 vXC5ojDDmSc+uUGr8D5IESfzMOPFj5ag0SqPSNe7Cp5amcy/chNqmo/XKEGqtB+X
 BI/DfRHEPGz5wtz6x+AcxFdE6LBAjMpQ2H3ybxGDK1396dNsngAA/g8eyvnzie/2
 USQO10O9Ymhezt7lMqhMLxJC/5Q0JLsKRIgqCxABQfTh14JF+c5bkT3zetabA87r
 CSyHGr3+tN4KtSJwefGjaGTCy5lN1SB8bRgWVLVVpPYAvtsNS1LwwTyeI3AtYmxr
 fylkATAHawSXzdgxgzFA8GmscxaxO/gLud+9ekb33ZIq9bnXiOXpY5u98bxCPWkn
 JgzeC4E6xnI3Ft+Ss7Bu0zOgSl2jUiOV7zAy7z8Lo9Qv6QYuIvSi9m+Snxstkul0
 9QwG6bA+YA==
 =BUsZ
 -----END PGP SIGNATURE-----

Merge tag 'v0.20.12'

release v0.20.12
2017-11-25 19:47:56 +01:00
Max Kellermann
714011c81e lib/upnp: adapt to libupnp 1.8 API changes
Closes #155
2017-11-16 11:39:11 +01:00
Max Kellermann
952ff4207b lib/upnp/Callback: make "evp" parameter const 2017-11-16 11:37:58 +01:00
Max Kellermann
150b16ec2c lib/upnp/Discovery: make Upnp_Discovery pointers const 2017-11-16 11:37:04 +01:00
Max Kellermann
f70b4e02c4 Merge branch 'v0.20.x' 2017-11-14 21:21:14 +01:00
Max Kellermann
c98bc4a243 playlist/PlaylistRegistry: use LockRewind() instead of Rewind()
Fixes a deadlock caused by commit
31ab78ae8e.  That commit was not
actually bad - just these two calls have always been bad, which went
unnoticed for a long time.
2017-11-14 21:19:22 +01:00
Max Kellermann
7d579e7400 lib/alsa/NonBlock: throw exception on error
Avoid another potential deadlock: if no file descriptors are
registered, our non-blocking ALSA code cannot ever work.
2017-11-14 21:08:07 +01:00
Max Kellermann
e0f777d4eb output/alsa: move code to LockCaughtError() 2017-11-14 21:07:59 +01:00
Max Kellermann
febd1ad09c output/alsa: fix deadlock bug
After UnlockActivate() returns, we not only need to check for errors,
but also for more room in the ring buffer.  If we don't check the ring
buffer, it may be drained already, and the cond.wait() call will never
finish.

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

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

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

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

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

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

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

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

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

Closes #134
2017-10-24 20:09:11 +02:00