Compare commits
204 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
808dd7cc54 | ||
![]() |
62a129c18f | ||
![]() |
c18cd941aa | ||
![]() |
6d12c22653 | ||
![]() |
b76d78e6ae | ||
![]() |
0a6e484b1a | ||
![]() |
0bb71f1f20 | ||
![]() |
1aa7cdd602 | ||
![]() |
a4b8a0d801 | ||
![]() |
3bf521d5ca | ||
![]() |
0acb55cde5 | ||
![]() |
6b89fd6100 | ||
![]() |
52ce39dc3e | ||
![]() |
7a3e15d8e5 | ||
![]() |
cf66a60c60 | ||
![]() |
9b26d451e4 | ||
![]() |
137ffba1b4 | ||
![]() |
5c5dc1b7c0 | ||
![]() |
9e9418294a | ||
![]() |
b850eb74b7 | ||
![]() |
67d73a2aee | ||
![]() |
fde9a470dd | ||
![]() |
8d1f30e55b | ||
![]() |
ddd2b60489 | ||
![]() |
8777737861 | ||
![]() |
cb71f6dd04 | ||
![]() |
1881b0e975 | ||
![]() |
98b29f6d1c | ||
![]() |
59fdfd25cb | ||
![]() |
0d98677212 | ||
![]() |
38f0c16904 | ||
![]() |
4fbf6b6c95 | ||
![]() |
1f8ff48168 | ||
![]() |
20b6e0d684 | ||
![]() |
713c1f2ba9 | ||
![]() |
a149bc4c5d | ||
![]() |
b3a458338a | ||
![]() |
44422b2b2f | ||
![]() |
f10afd38b5 | ||
![]() |
4c50a5e0b3 | ||
![]() |
f255a485b7 | ||
![]() |
1930d5774d | ||
![]() |
7220a76be0 | ||
![]() |
83f7610dd1 | ||
![]() |
30e0644722 | ||
![]() |
3ada464020 | ||
![]() |
d5983dd362 | ||
![]() |
98258acc37 | ||
![]() |
8002bc752f | ||
![]() |
834ad7a58f | ||
![]() |
e8f2f98048 | ||
![]() |
c672b60d07 | ||
![]() |
ea269c9c92 | ||
![]() |
1fe3a77640 | ||
![]() |
bbaeea1ab7 | ||
![]() |
0a3aee9d82 | ||
![]() |
2434020971 | ||
![]() |
41e0eb7378 | ||
![]() |
6adf964c81 | ||
![]() |
b59f37bc0a | ||
![]() |
cf2d171ccc | ||
![]() |
cc28a7b67f | ||
![]() |
8b5c33cecd | ||
![]() |
6c28adbcd2 | ||
![]() |
2125e3ed57 | ||
![]() |
3da7ecfadf | ||
![]() |
5bb02bbd39 | ||
![]() |
f11aa09f7c | ||
![]() |
02eb4752d3 | ||
![]() |
d9c3215584 | ||
![]() |
110e6d026b | ||
![]() |
c0f57b8a8b | ||
![]() |
57633fbcb3 | ||
![]() |
864c87e6c0 | ||
![]() |
1a516cf3c0 | ||
![]() |
5c25499c5e | ||
![]() |
da4bb4c298 | ||
![]() |
5b8ff61799 | ||
![]() |
56bded07b1 | ||
![]() |
db144a43ad | ||
![]() |
5965f62b56 | ||
![]() |
05aa9f72a9 | ||
![]() |
281461f0f0 | ||
![]() |
f70eb63879 | ||
![]() |
99c23cf139 | ||
![]() |
9aa75e738c | ||
![]() |
e9c45a9140 | ||
![]() |
a065c6e6b9 | ||
![]() |
feb5ff9bd2 | ||
![]() |
92ec3f0881 | ||
![]() |
98c47d9d36 | ||
![]() |
6c67408944 | ||
![]() |
261a816b21 | ||
![]() |
7a23c123c8 | ||
![]() |
e85b24bee0 | ||
![]() |
9e73ea77b4 | ||
![]() |
b0739eca87 | ||
![]() |
848f6aa5ab | ||
![]() |
c9ba4f3f9c | ||
![]() |
c0e9246a66 | ||
![]() |
096c23f27d | ||
![]() |
40bde1eac9 | ||
![]() |
4b55ed17a9 | ||
![]() |
4f757a5add | ||
![]() |
674c137e5f | ||
![]() |
ff1ff1e54a | ||
![]() |
42b22187c8 | ||
![]() |
cfe22502ab | ||
![]() |
d77b0c7dcd | ||
![]() |
5cf889b676 | ||
![]() |
ffc36d5255 | ||
![]() |
0126276e2f | ||
![]() |
58d6ddab9e | ||
![]() |
05db6934eb | ||
![]() |
02c68c5cdb | ||
![]() |
b02fee7309 | ||
![]() |
424f75c9e1 | ||
![]() |
f6e1176f97 | ||
![]() |
e4700c0a27 | ||
![]() |
cf23fd8774 | ||
![]() |
dee8872395 | ||
![]() |
4ba9357a9c | ||
![]() |
48ec09ab1e | ||
![]() |
754f4048a8 | ||
![]() |
037bb07d08 | ||
![]() |
87635c5268 | ||
![]() |
528b4338f4 | ||
![]() |
c780b8bba9 | ||
![]() |
ca34f3250b | ||
![]() |
6a68e1c3f3 | ||
![]() |
85f77ec81d | ||
![]() |
37debed0b8 | ||
![]() |
008383f24a | ||
![]() |
4f7d52dbf2 | ||
![]() |
c7848da8f2 | ||
![]() |
10a6c5c57d | ||
![]() |
2cc2bab309 | ||
![]() |
701fd1d939 | ||
![]() |
d1bdea8edb | ||
![]() |
0cea67ee70 | ||
![]() |
3a0480a482 | ||
![]() |
1fa99da3c2 | ||
![]() |
22d669da18 | ||
![]() |
772681f23d | ||
![]() |
1862a98a44 | ||
![]() |
4634b94c83 | ||
![]() |
6e04a327b4 | ||
![]() |
7ec887eea2 | ||
![]() |
1477b64d4f | ||
![]() |
a2c108f5ef | ||
![]() |
f546e76490 | ||
![]() |
2568bc3957 | ||
![]() |
7104ac963b | ||
![]() |
2cb36590b2 | ||
![]() |
af7b928d7c | ||
![]() |
c0d8a9b07a | ||
![]() |
5b0d23d553 | ||
![]() |
ab30695bd1 | ||
![]() |
53a4de35c4 | ||
![]() |
22e6d95c4b | ||
![]() |
1c7bd7d5c4 | ||
![]() |
3c4ed9cbe3 | ||
![]() |
2677b90244 | ||
![]() |
1b20fa441d | ||
![]() |
18c042d4cf | ||
![]() |
98f92d828a | ||
![]() |
76268773b5 | ||
![]() |
87542e3080 | ||
![]() |
66f5b0fed7 | ||
![]() |
5cb603983e | ||
![]() |
9c5790ab1d | ||
![]() |
4b7078297d | ||
![]() |
841694ccf2 | ||
![]() |
12f4a8255a | ||
![]() |
bda77ffc5b | ||
![]() |
ed9ece5ea3 | ||
![]() |
ce49d99c2f | ||
![]() |
2e450bbf95 | ||
![]() |
303b3071e4 | ||
![]() |
eb6d5f34fc | ||
![]() |
f80126959d | ||
![]() |
4fb4f6d1b7 | ||
![]() |
43df4a7500 | ||
![]() |
4cdcaa8630 | ||
![]() |
04f632296f | ||
![]() |
7c8dbcfaac | ||
![]() |
436ba3c96c | ||
![]() |
5d12f52873 | ||
![]() |
a8bf8ede01 | ||
![]() |
8682183bc3 | ||
![]() |
94c31d0da9 | ||
![]() |
464a4cbeec | ||
![]() |
9f0cbf418a | ||
![]() |
b477f86c92 | ||
![]() |
020371f145 | ||
![]() |
ccafe3f3cf | ||
![]() |
3830748de5 | ||
![]() |
1a43f5145d | ||
![]() |
7f143a83c1 | ||
![]() |
6ccc254179 | ||
![]() |
7db2450447 | ||
![]() |
6c2a6a65e0 | ||
![]() |
4247a757b3 | ||
![]() |
57e34823d8 |
NEWS
android
build
doc
meson.buildmeson_options.txtpython/build
scripts
src
AudioParser.cxxCheckAudioFormat.cxxIcyMetaDataParser.cxxIdle.cxxIdleFlags.cxxInstance.cxxInstance.hxxLocateUri.hxxLog.cxxLogBackend.cxxLogBackend.hxxLogInit.cxxLogInit.hxxMain.cxxMapper.cxxMapper.hxxMixRampInfo.hxxMusicBuffer.cxxMusicChunk.cxxMusicChunkPtr.cxxMusicChunkPtr.hxxMusicPipe.cxxPartition.hxxPermission.hxxPlaylistDatabase.cxxPlaylistDatabase.hxxPlaylistError.cxxPlaylistFile.cxxPlaylistPrint.cxxRemoteTagCache.cxxRemoteTagCache.hxxReplayGainConfig.hxxReplayGainGlobal.cxxReplayGainGlobal.hxxReplayGainInfo.cxxReplayGainInfo.hxxSongLoader.cxxSongLoader.hxxSongPrint.cxxSongSave.cxxStateFile.cxxStateFile.hxxStateFileConfig.cxxStateFileConfig.hxxStats.cxxTagArchive.cxxTagArchive.hxxTagFile.cxxTagFile.hxxTagPrint.cxxTagSave.cxxTagStream.cxxTagStream.hxxTimePrint.cxx
android
archive
client
Client.cxxClient.hxxClientEvent.cxxClientExpire.cxxClientFile.cxxClientGlobal.cxxClientIdle.cxxClientInternal.hxxClientList.cxxClientNew.cxxClientProcess.cxxClientRead.cxxClientSubscribe.cxxClientWrite.cxxListener.cxxListener.hxxResponse.cxxResponse.hxx
command
AllCommands.cxxClientCommands.cxxCommandListBuilder.cxxDatabaseCommands.cxxFileCommands.cxxMessageCommands.cxxNeighborCommands.cxxOtherCommands.cxxOutputCommands.cxxPartitionCommands.cxxPlaylistCommands.cxxRequest.hxxStickerCommands.cxxStorageCommands.cxxTagCommands.cxx
config
db
Configured.cxxConfigured.hxxCount.cxxDatabaseGlue.cxxDatabaseGlue.hxxDatabaseLock.cxxDatabaseLock.hxxDatabasePlaylist.cxxDatabasePlugin.hxxDatabasePrint.cxxDatabaseQueue.cxxDatabaseSong.cxxInterface.hxxPlaylistInfo.hxxPlaylistVector.cxxPtr.hxxSelection.cxxUniqueTags.cxxUniqueTags.hxxVHelper.cxxVHelper.hxxmeson.build
plugins
ProxyDatabasePlugin.cxx
simple
DatabaseSave.cxxDirectory.cxxDirectory.hxxDirectorySave.cxxMount.cxxPrefixedLightSong.hxxSimpleDatabasePlugin.cxxSimpleDatabasePlugin.hxxSong.cxxSong.hxxSongSort.cxx
upnp
update
decoder
Bridge.cxxClient.hxxControl.cxxDecoderAPI.cxxDecoderAPI.hxxDecoderBuffer.cxxDecoderList.cxxDecoderList.hxxDecoderPlugin.cxxDecoderPrint.cxxReader.cxxReader.hxx
plugins
AdPlugDecoderPlugin.cxxAudiofileDecoderPlugin.cxxFaadDecoderPlugin.cxxFfmpegDecoderPlugin.cxxFfmpegIo.cxxFfmpegIo.hxxFfmpegMetaData.cxxFlacCommon.cxxFlacDecoderPlugin.cxxFlacDomain.cxxFlacDomain.hxxFlacInput.cxxFlacPcm.cxxFlacPcm.hxxFlacStreamDecoder.hxxFluidsynthDecoderPlugin.cxxGmeDecoderPlugin.cxxHybridDsdDecoderPlugin.cxxModplugDecoderPlugin.cxxMpcdecDecoderPlugin.cxxMpg123DecoderPlugin.cxxOggCodec.cxxOggDecoder.cxxOggDecoder.hxxOpusDecoderPlugin.cxxOpusDomain.cxxOpusDomain.hxxOpusHead.cxxOpusHead.hxxOpusReader.hxxOpusTags.cxxOpusTags.hxxPcmDecoderPlugin.cxxSndfileDecoderPlugin.cxxVorbisDomain.cxxVorbisDomain.hxxWildmidiDecoderPlugin.cxxmeson.build
encoder
event
BufferedSocket.cxxBufferedSocket.hxxCall.cxxCall.hxxDeferEvent.cxxDeferEvent.hxxFullyBufferedSocket.cxxFullyBufferedSocket.hxxIdleMonitor.cxxIdleMonitor.hxxLoop.cxxLoop.hxxMaskMonitor.cxxMaskMonitor.hxxMultiSocketMonitor.cxxMultiSocketMonitor.hxxPollGroup.hxxPollGroupEpoll.hxxPollGroupPoll.hxxPollGroupWinSelect.hxxPollResultGeneric.hxxServerSocket.cxxServerSocket.hxxSignalMonitor.cxxSignalMonitor.hxxSocketMonitor.cxxSocketMonitor.hxxThread.cxxThread.hxxTimerEvent.cxxTimerEvent.hxxWakeFD.hxxmeson.build
filter
fs
AllocatedPath.cxxAllocatedPath.hxxCharset.cxxCharset.hxxCheckFile.cxxCheckFile.hxxConfig.cxxConfig.hxxDirectoryReader.cxxDirectoryReader.hxxDomain.cxxFileInfo.hxxFileSystem.cxxFileSystem.hxxGlob.hxxLimits.hxxList.cxxList.hxxNarrowPath.hxxPath.cxxPath.hxxPath2.cxxStandardDirectory.cxxStandardDirectory.hxxTraits.cxxTraits.hxx
io
AutoGunzipReader.cxxAutoGunzipReader.hxxBufferedOutputStream.cxxBufferedOutputStream.hxxBufferedReader.cxxBufferedReader.hxxFileOutputStream.cxxFileOutputStream.hxxFileReader.cxxFileReader.hxxGunzipReader.cxxGunzipReader.hxxGzipOutputStream.cxxGzipOutputStream.hxxOutputStream.hxxPeekReader.cxxPeekReader.hxxReader.hxxStdioOutputStream.hxxTextFile.cxxTextFile.hxx
input
AsyncInputStream.cxxBufferedInputStream.cxxBufferedInputStream.hxxCondHandler.hxxError.cxxError.hxxHandler.hxxIcyInputStream.cxxInit.cxxInit.hxxInputStream.cxxInputStream.hxxLocalOpen.cxxLocalOpen.hxxMaybeBufferedInputStream.cxxMaybeBufferedInputStream.hxxOffset.hxxOpen.cxxProxyInputStream.cxxReader.cxxReader.hxxRegistry.cxxRegistry.hxxRewindInputStream.cxxRewindInputStream.hxxScanTags.cxxScanTags.hxxTextInputStream.cxxThreadInputStream.cxxThreadInputStream.hxxmeson.build
plugins
AlsaInputPlugin.cxxArchiveInputPlugin.cxxCdioParanoiaInputPlugin.cxxCurlInputPlugin.cxxFfmpegInputPlugin.cxxFileInputPlugin.cxxMmsInputPlugin.cxxNfsInputPlugin.cxxQobuzClient.cxxQobuzClient.hxxQobuzErrorParser.cxxQobuzErrorParser.hxxQobuzInputPlugin.cxxQobuzLoginRequest.cxxQobuzLoginRequest.hxxQobuzTagScanner.cxxQobuzTagScanner.hxxQobuzTrackRequest.cxxQobuzTrackRequest.hxxSmbclientInputPlugin.cxxTidalError.hxxTidalErrorParser.cxxTidalErrorParser.hxxTidalInputPlugin.cxxTidalLoginRequest.cxxTidalLoginRequest.hxxTidalSessionManager.cxxTidalSessionManager.hxxTidalTagScanner.cxxTidalTagScanner.hxxTidalTrackRequest.cxxTidalTrackRequest.hxxmeson.build
java
lib
alsa
AllowedFormat.cxxAllowedFormat.hxxFormat.hxxHwSetup.cxxHwSetup.hxxNonBlock.cxxNonBlock.hxxPeriodBuffer.hxx
cdio
curl
dbus
expat
ffmpeg
icu
CaseFold.cxxCaseFold.hxxCollate.cxxCollate.hxxCompare.cxxCompare.hxxConverter.cxxConverter.hxxInit.cxxInit.hxxUtil.cxxUtil.hxxWin32.cxxWin32.hxx
nfs
Base.cxxBase.hxxBlocking.cxxBlocking.hxxCallback.hxxConnection.cxxFileReader.cxxFileReader.hxxGlue.cxxGlue.hxxLease.hxxManager.cxxManager.hxx
pulse
smbclient
systemd
upnp
wrap
xiph
FlacIOHandle.cxxFlacMetadataChain.cxxFlacStreamMetadata.cxxOggFind.cxxOggFind.hxxOggPacket.cxxOggPacket.hxxOggPage.hxxOggStreamState.hxxOggSyncState.cxxOggSyncState.hxxOggVisitor.cxxOggVisitor.hxxVorbisComment.hxxVorbisComments.cxxVorbisComments.hxxXiphTags.cxxXiphTags.hxxmeson.build
yajl
zlib
mixer
neighbor
net
AllocatedSocketAddress.cxxAllocatedSocketAddress.hxxFeatures.hxxHostParser.cxxHostParser.hxxIPv4Address.cxxIPv4Address.hxxIPv6Address.cxxIPv6Address.hxxInit.hxxResolver.cxxSocketAddress.cxxSocketAddress.hxxSocketDescriptor.cxxSocketDescriptor.hxxSocketError.cxxStaticSocketAddress.cxxStaticSocketAddress.hxxToString.hxx
output
Client.hxxControl.cxxDefaults.cxxDefaults.hxxFiltered.cxxFinish.cxxInit.cxxMultipleOutputs.cxxOutputCommand.cxxOutputPlugin.cxxPrint.cxxSharedPipeConsumer.cxxSharedPipeConsumer.hxxSource.cxxSource.hxxState.cxxThread.cxxTimer.cxx
plugins
AlsaOutputPlugin.cxxAoOutputPlugin.cxxFifoOutputPlugin.cxxHaikuOutputPlugin.cxxNullOutputPlugin.cxxOSXOutputPlugin.cxxOpenALOutputPlugin.cxxOssOutputPlugin.cxxPipeOutputPlugin.cxxPulseOutputPlugin.cxxRecorderOutputPlugin.cxxShoutOutputPlugin.cxxSndioOutputPlugin.cxxSolarisOutputPlugin.cxxWinmmOutputPlugin.cxxWinmmOutputPlugin.hxx
httpd
HttpdClient.cxxHttpdClient.hxxHttpdInternal.hxxHttpdOutputPlugin.cxxIcyMetaDataServer.cxxIcyMetaDataServer.hxxPage.cxxPage.hxx
meson.buildsles
pcm
ChannelsConverter.cxxChannelsConverter.hxxConfiguredResampler.cxxConfiguredResampler.hxxDsd16.cxxDsd16.hxxDsd32.cxxDsd32.hxxFallbackResampler.cxxFormatConverter.cxxFormatConverter.hxxGlueResampler.cxxGlueResampler.hxxInterleave.cxxInterleave.hxxLibsamplerateResampler.cxxOrder.cxxOrder.hxxPcmBuffer.cxxPcmChannels.cxxPcmConvert.cxxPcmConvert.hxxPcmDither.cxxPcmDop.cxxPcmDop.hxxPcmDsd.cxxPcmDsd.hxxPcmExport.cxxPcmExport.hxxPcmFormat.cxxPcmMix.cxxSilence.cxxSilence.hxxSoxrResampler.cxxTraits.hxxVolume.cxx
player
playlist
MemorySongEnumerator.cxxPlaylistAny.cxxPlaylistAny.hxxPlaylistMapper.cxxPlaylistMapper.hxxPlaylistQueue.cxxPlaylistQueue.hxxPlaylistRegistry.hxxPlaylistSong.cxxPlaylistStream.cxxPrint.cxxPrint.hxx
cue
plugins
protocol
queue
Playlist.cxxPlaylist.hxxPlaylistControl.cxxPlaylistEdit.cxxPlaylistState.cxxPlaylistTag.cxxPlaylistUpdate.cxxQueue.cxxQueuePrint.cxxQueueSave.cxx
song
AndSongFilter.cxxBaseSongFilter.cxxDetachedSong.cxxDetachedSong.hxxModifiedSinceSongFilter.cxxOptimizeFilter.cxxStringFilter.cxxStringFilter.hxxTagSongFilter.cxxTagSongFilter.hxxUriSongFilter.cxxmeson.build
sticker
storage
CompositeStorage.cxxCompositeStorage.hxxConfigured.cxxConfigured.hxxFileInfo.hxxMemoryDirectoryReader.cxxMemoryDirectoryReader.hxxRegistry.cxxRegistry.hxxStorageInterface.cxxStorageInterface.hxxStoragePlugin.hxxStorageState.cxxmeson.build
plugins
system
EpollFD.cxxEpollFD.hxxEventFD.cxxEventFD.hxxEventPipe.cxxEventPipe.hxxFatalError.cxxFatalError.hxxFileDescriptor.cxxFileDescriptor.hxxOpen.cxxOpen.hxxSignalFD.cxxSignalFD.hxxUniqueFileDescriptor.hxx
tag
Aiff.cxxApeLoader.cxxApeLoader.hxxApeReplayGain.cxxApeReplayGain.hxxApeTag.cxxBuilder.cxxConfig.cxxFallback.hxxFixString.cxxFixString.hxxFormat.cxxFormat.hxxGeneric.cxxGeneric.hxxHandler.cxxHandler.hxxId3Load.cxxId3Load.hxxId3ReplayGain.cxxId3ReplayGain.hxxId3Scan.cxxId3Scan.hxxId3Unique.hxxMask.hxxMixRamp.cxxMixRamp.hxxNames.cParseName.cxxPool.cxxReplayGain.cxxReplayGain.hxxRiff.cxxRva2.cxxRva2.hxxTag.cxxVorbisComment.cxxVorbisComment.hxx
thread
unix
util
AllocatedArray.hxxCast.hxxCharUtil.hxxDynamicFifoBuffer.hxxLazyRandomEngine.cxxLazyRandomEngine.hxxOffsetPointer.hxxPrintException.cxxStringView.hxxTokenizer.cxxWStringView.hxx
win32
zeroconf
test
ConfigGlue.hxxContainerScan.cxxDumpDatabase.cxxDumpDecoderClient.cxxDumpDecoderClient.hxxMakeTag.hxxParseSongFilter.cxxRunChromaprint.cxxShutdownHandler.cxxTestAudioFormat.cxxTestCircularBuffer.cxxTestDivideString.cxxTestMimeType.cxxTestRewindInputStream.cxxTestSplitString.cxxTestTagSongFilter.cxxTestUriUtil.cxxWriteFile.cxxdump_playlist.cxxdump_text_file.cxxmeson.build
valgrind.suppressionsnet
read_conf.cxxread_mixer.cxxread_tags.cxxrun_avahi.cxxrun_convert.cxxrun_decoder.cxxrun_encoder.cxxrun_filter.cxxrun_gunzip.cxxrun_gzip.cxxrun_inotify.cxxrun_input.cxxrun_neighbor_explorer.cxxrun_normalize.cxxrun_output.cxxrun_resolver.cxxrun_storage.cxxsoftware_volume.cxxtest_archive.cxxtest_icy_parser.cxxtest_mixramp.cxxtest_pcm_channels.cxxtest_pcm_dither.cxxtest_pcm_format.cxxtest_pcm_interleave.cxxtest_pcm_mix.cxxtest_pcm_pack.cxxtest_pcm_volume.cxxtest_protocol.cxxtest_queue_priority.cxxtest_translate_song.cxxtest_vorbis_encoder.cxxvisit_archive.cxx
62
NEWS
62
NEWS
@@ -1,3 +1,65 @@
|
||||
ver 0.21.6 (2019/03/17)
|
||||
* protocol
|
||||
- allow loading playlists specified as absolute filesystem paths
|
||||
- fix negated filter expressions with multiple tag values
|
||||
- fix "list" with filter expression
|
||||
- omit empty playlist names in "listplaylists"
|
||||
* input
|
||||
- cdio_paranoia: fix build failure due to missing #include
|
||||
* decoder
|
||||
- opus: fix replay gain when there are no other tags
|
||||
- opus: fix seeking to beginning of song
|
||||
- vorbis: fix Tremor conflict resulting in crash
|
||||
* output
|
||||
- pulse: work around error with unusual channel count
|
||||
- osx: fix build failure
|
||||
* playlist
|
||||
- flac: fix use-after-free bug
|
||||
* support abstract sockets on Linux
|
||||
* Windows
|
||||
- remove the unused libwinpthread-1.dll dependency
|
||||
* Android
|
||||
- enable SLES power saving mode
|
||||
|
||||
ver 0.21.5 (2019/02/22)
|
||||
* protocol
|
||||
- fix deadlock in "albumart" command
|
||||
- fix "tagtypes disable" command
|
||||
* database
|
||||
- simple: fix assertion failure
|
||||
- fix assertion failures with mount points
|
||||
* storage
|
||||
- udisks: fix "AlreadyMounted" error
|
||||
- udisks: use relative path from mount URI
|
||||
- fix memory leak
|
||||
* input
|
||||
- buffer: fix crash bug when playing remote WAV file
|
||||
* tags
|
||||
- ape: map "Album Artist"
|
||||
* output
|
||||
- shout: add support for TLS
|
||||
* mixer
|
||||
- pulse: add "scale_volume" setting
|
||||
|
||||
ver 0.21.4 (2019/01/04)
|
||||
* database
|
||||
- inotify: fix crash bug "terminate called after throwing ..."
|
||||
- upnp: implement "list ... group"
|
||||
* output
|
||||
- httpd: declare protocol "HTTP/1.1" instead of "ICY"
|
||||
* remove libwrap support
|
||||
* Windows
|
||||
- fix "Failed to accept connection: unknown error"
|
||||
* fix Haiku build
|
||||
|
||||
ver 0.21.3 (2018/11/16)
|
||||
* output
|
||||
- alsa: fix crash bug
|
||||
- alsa: fix stuttering at start of playback
|
||||
- alsa: fix discarded samples at end of song
|
||||
- alsa: clear error after reopening device
|
||||
* log: default to journal if MPD was started as systemd service
|
||||
|
||||
ver 0.21.2 (2018/11/12)
|
||||
* protocol
|
||||
- operator "=~" matches a regular expression
|
||||
|
@@ -2,8 +2,8 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.musicpd"
|
||||
android:installLocation="auto"
|
||||
android:versionCode="24"
|
||||
android:versionName="0.21.2">
|
||||
android:versionCode="28"
|
||||
android:versionName="0.21.6">
|
||||
|
||||
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="26"/>
|
||||
|
||||
|
@@ -1,5 +1,9 @@
|
||||
#!/bin/sh -e
|
||||
|
||||
# This is a wrapper for pkg-config which helps with cross-compiling;
|
||||
# it sets up environment variables to pkg-config searches for
|
||||
# libraries in the sysroot where a copy of this script is located.
|
||||
|
||||
BIN=`dirname $0`
|
||||
ROOT=`dirname "$BIN"`
|
||||
|
||||
|
@@ -38,7 +38,7 @@ author = 'Max Kellermann'
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = '0.21.2'
|
||||
version = '0.21.6'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = version
|
||||
|
||||
|
@@ -32,7 +32,7 @@
|
||||
# settings.
|
||||
#
|
||||
# The special value "syslog" makes MPD use the local syslog daemon. This
|
||||
# setting defaults to logging to syslog, otherwise logging is disabled.
|
||||
# setting defaults to logging to syslog.
|
||||
#
|
||||
#log_file "~/.mpd/log"
|
||||
#
|
||||
|
@@ -87,6 +87,22 @@ Mount file systems (e.g. USB sticks or other removable media) using
|
||||
the udisks2 daemon via D-Bus. To obtain a valid udisks2 URI, consult
|
||||
:ref:`the according neighbor plugin <neighbor_plugin>`.
|
||||
|
||||
It might be necessary to grant :program:`MPD` privileges to control
|
||||
:program:`udisks2` through :program:`policykit`. To do this, create a
|
||||
file called :file:`/usr/share/polkit-1/rules.d/mpd-udisks.rules` with
|
||||
the following text::
|
||||
|
||||
polkit.addRule(function(action, subject) {
|
||||
if ((action.id == "org.freedesktop.udisks2.filesystem-mount" ||
|
||||
action.id == "org.freedesktop.udisks2.filesystem-mount-other-seat") &&
|
||||
subject.user == "mpd") {
|
||||
return polkit.Result.YES;
|
||||
}
|
||||
});
|
||||
|
||||
If you run MPD as a different user, change ``mpd`` to the name of your
|
||||
MPD user.
|
||||
|
||||
.. _neighbor_plugin:
|
||||
|
||||
Neighbor plugins
|
||||
@@ -935,6 +951,8 @@ The pulse plugin connects to a `PulseAudio <http://www.freedesktop.org/wiki/Soft
|
||||
- Sets the host name of the PulseAudio server. By default, :program:`MPD` connects to the local PulseAudio server.
|
||||
* - **sink NAME**
|
||||
- Specifies the name of the PulseAudio sink :program:`MPD` should play on.
|
||||
* - **scale_volume FACTOR**
|
||||
- Specifies a linear scaling coefficient (ranging from 0.5 to 5.0) to apply when adjusting volume through :program:`MPD`. For example, chosing a factor equal to ``"0.7"`` means that setting the volume to 100 in :program:`MPD` will set the PulseAudio volume to 70%, and a factor equal to ``"3.5"`` means that volume 100 in :program:`MPD` corresponds to a 350% PulseAudio volume.
|
||||
|
||||
recorder
|
||||
~~~~~~~~
|
||||
@@ -974,6 +992,8 @@ You must set a format.
|
||||
- Set the timeout for the shout connection in seconds. Defaults to 2 seconds.
|
||||
* - **protocol icecast2|icecast1|shoutcast**
|
||||
- Specifies the protocol that wil be used to connect to the server. The default is "icecast2".
|
||||
* - **tls disabled|auto|auto_no_plain|rfc2818|rfc2817**
|
||||
- Specifies what kind of TLS to use. The default is "disabled" (no TLS).
|
||||
* - **mount URI**
|
||||
- Mounts the :program:`MPD` stream in the specified URI.
|
||||
* - **user USERNAME**
|
||||
|
@@ -144,15 +144,20 @@ syntax::
|
||||
``EXPRESSION`` is a string enclosed in parantheses which can be one
|
||||
of:
|
||||
|
||||
- ``(TAG == 'VALUE')``: match a tag value.
|
||||
``(TAG != 'VALUE')``: mismatch a tag value.
|
||||
The special tag "*any*" checks all
|
||||
tag values.
|
||||
*albumartist* looks for
|
||||
- ``(TAG == 'VALUE')``: match a tag value; if there are multiple
|
||||
values of the given type, at least one must match.
|
||||
``(TAG != 'VALUE')``: mismatch a tag value; if there are multiple
|
||||
values of the given type, none of them must match.
|
||||
The special tag ``any`` checks all
|
||||
tag types.
|
||||
``AlbumArtist`` looks for
|
||||
``VALUE`` in ``AlbumArtist``
|
||||
and falls back to ``Artist`` tags if
|
||||
``AlbumArtist`` does not exist.
|
||||
``VALUE`` is what to find.
|
||||
An empty value string means: match only if the given tag type does
|
||||
not exist at all; this implies that negation with an empty value
|
||||
checks for the existence of the given tag type.
|
||||
|
||||
- ``(TAG contains 'VALUE')`` checks if the given value is a substring
|
||||
of the tag value.
|
||||
@@ -178,7 +183,7 @@ of:
|
||||
|
||||
- ``(AudioFormat =~ 'SAMPLERATE:BITS:CHANNELS')``:
|
||||
matches the audio format with the given mask (i.e. one
|
||||
or more attributes may be "*").
|
||||
or more attributes may be ``*``).
|
||||
|
||||
- ``(!EXPRESSION)``: negate an expression. Note that each expression
|
||||
must be enclosed in parantheses, e.g. :code:`(!(artist == 'VALUE'))`
|
||||
@@ -207,11 +212,11 @@ backslash.
|
||||
|
||||
Example expression which matches an artist named ``foo'bar"``::
|
||||
|
||||
(artist "foo\'bar\"")
|
||||
(Artist == "foo\'bar\"")
|
||||
|
||||
At the protocol level, the command must look like this::
|
||||
|
||||
find "(artist \"foo\\'bar\\\"\")"
|
||||
find "(Artist == \"foo\\'bar\\\"\")"
|
||||
|
||||
The double quotes enclosing the artist name must be escaped because
|
||||
they are inside a double-quoted ``find`` parameter. The single quote
|
||||
@@ -556,7 +561,7 @@ The Queue
|
||||
There are two ways to address songs within the queue: by their
|
||||
position and by their id.
|
||||
|
||||
The position is a 1-based index. It is unstable by design: if you
|
||||
The position is a 0-based index. It is unstable by design: if you
|
||||
move, delete or insert songs, all following indices will change, and a
|
||||
client can never be sure what song is behind a given index/position.
|
||||
|
||||
@@ -714,7 +719,9 @@ and without the `.m3u` suffix).
|
||||
Some of the commands described in this section can be used to
|
||||
run playlist plugins instead of the hard-coded simple
|
||||
`m3u` parser. They can access playlists in
|
||||
the music directory (relative path including the suffix) or
|
||||
the music directory (relative path including the suffix),
|
||||
playlists in arbitrary location (absolute path including the suffix;
|
||||
allowed only for clients that are connected via UNIX domain socket), or
|
||||
remote playlists (absolute URI with a supported scheme).
|
||||
|
||||
:command:`listplaylist {NAME}`
|
||||
@@ -909,7 +916,7 @@ The music database
|
||||
|
||||
.. _command_lsinfo:
|
||||
|
||||
:command:`lsinfo {URI}`
|
||||
:command:`lsinfo [URI]`
|
||||
Lists the contents of the directory
|
||||
``URI``. The response contains records
|
||||
starting with ``file``,
|
||||
@@ -1131,7 +1138,7 @@ Connection settings
|
||||
``tagtypes`` sub commands configure this
|
||||
list.
|
||||
|
||||
:command:`tagtypes disable {NAME...]`
|
||||
:command:`tagtypes disable {NAME...}`
|
||||
Remove one or more tags from the list of tag types the
|
||||
client is interested in. These will be omitted from
|
||||
responses to this client.
|
||||
|
65
doc/user.rst
65
doc/user.rst
@@ -88,7 +88,7 @@ For example, the following installs a fairly complete list of build dependencies
|
||||
libupnp-dev \
|
||||
libavahi-client-dev \
|
||||
libsqlite3-dev \
|
||||
libsystemd-dev libwrap0-dev \
|
||||
libsystemd-dev \
|
||||
libgtest-dev \
|
||||
libboost-dev \
|
||||
libicu-dev
|
||||
@@ -276,7 +276,9 @@ You can also use multiple storage plugins to assemble a virtual music directory
|
||||
Configuring database plugins
|
||||
----------------------------
|
||||
|
||||
If a music directory is configured, one database plugin is used. To configure this plugin, add a database block to :file:`mpd.conf`:
|
||||
If a music directory is configured, one database plugin is used. To
|
||||
configure this plugin, add a :code:`database` block to
|
||||
:file:`mpd.conf`:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
@@ -291,7 +293,9 @@ reference.
|
||||
Configuring neighbor plugins
|
||||
----------------------------
|
||||
|
||||
All neighbor plugins are disabled by default to avoid unwanted overhead. To enable (and configure) a plugin, add a neighbor block to :file:`mpd.conf`:
|
||||
All neighbor plugins are disabled by default to avoid unwanted
|
||||
overhead. To enable (and configure) a plugin, add a :code:`neighbor`
|
||||
block to :file:`mpd.conf`:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
@@ -304,7 +308,8 @@ More information can be found in the :ref:`neighbor_plugin` reference.
|
||||
Configuring input plugins
|
||||
-------------------------
|
||||
|
||||
To configure an input plugin, add a input block to :file:`mpd.conf`:
|
||||
To configure an input plugin, add an :code:`input` block to
|
||||
:file:`mpd.conf`:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
@@ -332,7 +337,8 @@ More information can be found in the :ref:`input_plugins` reference.
|
||||
Configuring decoder plugins
|
||||
---------------------------
|
||||
|
||||
Most decoder plugins do not need any special configuration. To configure a decoder, add a decoder block to :file:`mpd.conf`:
|
||||
Most decoder plugins do not need any special configuration. To
|
||||
configure a decoder, add a :code:`decoder` block to :file:`mpd.conf`:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
@@ -368,7 +374,8 @@ Configuring audio outputs
|
||||
|
||||
Audio outputs are devices which actually play the audio chunks produced by :program:`MPD`. You can configure any number of audio output devices, but there must be at least one. If none is configured, :program:`MPD` attempts to auto-detect. Usually, this works quite well with ALSA, OSS and on Mac OS X.
|
||||
|
||||
To configure an audio output manually, add one or more audio_output blocks to :file:`mpd.conf`:
|
||||
To configure an audio output manually, add one or more
|
||||
:code:`audio_output` blocks to :file:`mpd.conf`:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
@@ -406,14 +413,21 @@ The following table lists the audio_output options valid for all plugins:
|
||||
* - **always_on yes|no**
|
||||
- If set to yes, then :program:`MPD` attempts to keep this audio output always open. This may be useful for streaming servers, when you don't want to disconnect all listeners even when playback is accidentally stopped.
|
||||
* - **mixer_type hardware|software|null|none**
|
||||
- Specifies which mixer should be used for this audio output: the hardware mixer (available for ALSA :ref:`alsa_plugin`, OSS :ref:`oss_plugin` and PulseAudio :ref:`pulse_plugin`), the software mixer, the "null" mixer (null; allows setting the volume, but with no effect; this can be used as a trick to implement an external mixer :ref:`external_mixer`) or no mixer (none). By default, the hardware mixer is used for devices which support it, and none for the others.
|
||||
- Specifies which mixer should be used for this audio output: the
|
||||
hardware mixer (available for ALSA :ref:`alsa_plugin`, OSS
|
||||
:ref:`oss_plugin` and PulseAudio :ref:`pulse_plugin`), the
|
||||
software mixer, the ":samp:`null`" mixer (allows setting the
|
||||
volume, but with no effect; this can be used as a trick to
|
||||
implement an external mixer :ref:`external_mixer`) or no mixer
|
||||
(:samp:`none`). By default, the hardware mixer is used for
|
||||
devices which support it, and none for the others.
|
||||
|
||||
Configuring filters
|
||||
-------------------
|
||||
|
||||
Filters are plugins which modify an audio stream.
|
||||
|
||||
To configure a filter, add a filter block to :file:`mpd.conf`:
|
||||
To configure a filter, add a :code:`filter` block to :file:`mpd.conf`:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
@@ -438,9 +452,12 @@ The following table lists the filter options valid for all plugins:
|
||||
Configuring playlist plugins
|
||||
----------------------------
|
||||
|
||||
Playlist plugins are used to load remote playlists (protocol commands load, listplaylist and listplaylistinfo). This is not related to :program:`MPD`'s playlist directory.
|
||||
Playlist plugins are used to load remote playlists (protocol commands
|
||||
load, listplaylist and listplaylistinfo). This is not related to
|
||||
:program:`MPD`'s :ref:`playlist directory <stored_playlists>`.
|
||||
|
||||
To configure a playlist plugin, add a playlist_plugin block to :file:`mpd.conf`:
|
||||
To configure a playlist plugin, add a :code:`playlist_plugin` block to
|
||||
:file:`mpd.conf`:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
@@ -514,6 +531,12 @@ choice::
|
||||
|
||||
bind_to_address "/var/run/mpd/socket"
|
||||
|
||||
On Linux, local sockets can be bound to a name without a socket inode
|
||||
on the filesystem; MPD implements this by prepending ``@`` to the
|
||||
address::
|
||||
|
||||
bind_to_address "@mpd"
|
||||
|
||||
If no port is specified, the default port is 6600. This default can
|
||||
be changed with the port setting::
|
||||
|
||||
@@ -817,10 +840,16 @@ The queue
|
||||
|
||||
The queue (sometimes called "current playlist") is a list of songs to be played by :program:`MPD`. To play a song, add it to the queue and start playback. Most clients offer an interface to edit the queue.
|
||||
|
||||
.. _stored_playlists:
|
||||
|
||||
Stored Playlists
|
||||
----------------
|
||||
|
||||
Stored playlists are some kind of secondary playlists which can be created, saved, edited and deleted by the client. They are addressed by their names. Its contents can be loaded into the queue, to be played back. The playlist_directory setting specifies where those playlists are stored.
|
||||
Stored playlists are some kind of secondary playlists which can be
|
||||
created, saved, edited and deleted by the client. They are addressed
|
||||
by their names. Its contents can be loaded into the queue, to be
|
||||
played back. The :code:`playlist_directory` setting specifies where
|
||||
those playlists are stored.
|
||||
|
||||
Advanced usage
|
||||
**************
|
||||
@@ -860,9 +889,11 @@ Obey the "format" row, which indicates that the current playback format is 16 bi
|
||||
Check list for bit-perfect playback:
|
||||
|
||||
* Use the ALSA output plugin.
|
||||
* Disable sound processing inside ALSA by configuring a "hardware" device (hw:0,0 or similar).
|
||||
* Don't use software volume (setting mixer_type).
|
||||
* Don't force :program:`MPD` to use a specific audio format (settings format, audio_output_format).
|
||||
* Disable sound processing inside ALSA by configuring a "hardware"
|
||||
device (:samp:`hw:0,0` or similar).
|
||||
* Don't use software volume (setting :code:`mixer_type`).
|
||||
* Don't force :program:`MPD` to use a specific audio format (settings
|
||||
:code:`format`, :code:`audio_output_format`).
|
||||
* Verify that you are really doing bit-perfect playback using :program:`MPD`'s verbose log and :file:`/proc/asound/card*/pcm*p/sub*/hw_params`. Some DACs can also indicate the audio format.
|
||||
|
||||
Direct Stream Digital (DSD)
|
||||
@@ -877,7 +908,11 @@ DSD (`Direct Stream Digital <https://en.wikipedia.org/wiki/Direct_Stream_Digital
|
||||
* DoP (DSD over PCM) playback. This wraps DSD inside fake 24 bit PCM according to the DoP standard. Requires a DAC that supports DSD. No support from ALSA and the sound chip required (except for bit-perfect 24 bit PCM support).
|
||||
* Convert DSD to PCM on-the-fly.
|
||||
|
||||
Native DSD playback is used automatically if available. DoP is only used if enabled explicitly using the dop option, because there is no way for :program:`MPD` to find out whether the DAC supports it. DSD to PCM conversion is the fallback if DSD cannot be used directly.
|
||||
Native DSD playback is used automatically if available. DoP is only
|
||||
used if enabled explicitly using the :code:`dop` option, because there
|
||||
is no way for :program:`MPD` to find out whether the DAC supports
|
||||
it. DSD to PCM conversion is the fallback if DSD cannot be used
|
||||
directly.
|
||||
|
||||
Client Hacks
|
||||
************
|
||||
|
@@ -1,7 +1,7 @@
|
||||
project(
|
||||
'mpd',
|
||||
['c', 'cpp'],
|
||||
version: '0.21.2',
|
||||
version: '0.21.6',
|
||||
meson_version: '>= 0.47.2',
|
||||
default_options: [
|
||||
'c_std=c99',
|
||||
@@ -20,7 +20,7 @@ conf.set_quoted('PACKAGE', meson.project_name())
|
||||
conf.set_quoted('PACKAGE_NAME', meson.project_name())
|
||||
conf.set_quoted('PACKAGE_VERSION', meson.project_version())
|
||||
conf.set_quoted('VERSION', meson.project_version())
|
||||
conf.set_quoted('PROTOCOL_VERSION', '0.21.0')
|
||||
conf.set_quoted('PROTOCOL_VERSION', '0.21.6')
|
||||
conf.set_quoted('SYSTEM_CONFIG_FILE_LOCATION', join_paths(get_option('prefix'), get_option('sysconfdir'), 'mpd.conf'))
|
||||
|
||||
common_cppflags = [
|
||||
@@ -99,7 +99,7 @@ is_linux = host_machine.system() == 'linux'
|
||||
is_android = get_option('android_ndk') != ''
|
||||
is_darwin = host_machine.system() == 'darwin'
|
||||
is_windows = host_machine.system() == 'windows'
|
||||
is_haiku = host_machine.system() == 'haiku' # TODO is this correct?
|
||||
is_haiku = host_machine.system() == 'haiku'
|
||||
|
||||
if is_android
|
||||
common_cppflags += '-DANDROID'
|
||||
@@ -312,7 +312,6 @@ subdir('src/lib/curl')
|
||||
subdir('src/lib/expat')
|
||||
subdir('src/lib/ffmpeg')
|
||||
subdir('src/lib/gcrypt')
|
||||
subdir('src/lib/wrap')
|
||||
subdir('src/lib/nfs')
|
||||
subdir('src/lib/oss')
|
||||
subdir('src/lib/pcre')
|
||||
@@ -432,7 +431,6 @@ mpd = build_target(
|
||||
systemd_dep,
|
||||
sqlite_dep,
|
||||
zeroconf_dep,
|
||||
libwrap_dep,
|
||||
more_deps,
|
||||
],
|
||||
link_args: link_args,
|
||||
|
@@ -128,6 +128,7 @@ option('mpg123', type: 'feature', description: 'MP3 decoder using libmpg123')
|
||||
option('opus', type: 'feature', description: 'Opus decoder plugin')
|
||||
option('sidplay', type: 'feature', description: 'C64 SID support via libsidplayfp or libsidplay2')
|
||||
option('sndfile', type: 'feature', description: 'libsndfile decoder plugin')
|
||||
option('tremor', type: 'feature', description: 'Fixed-point vorbis decoder plugin')
|
||||
option('vorbis', type: 'feature', description: 'Vorbis decoder plugin')
|
||||
option('wavpack', type: 'feature', description: 'WavPack decoder plugin')
|
||||
option('wildmidi', type: 'feature', description: 'WildMidi decoder plugin')
|
||||
@@ -175,7 +176,6 @@ option('dbus', type: 'feature', description: 'D-Bus support')
|
||||
option('expat', type: 'feature', description: 'Expat XML support')
|
||||
option('icu', type: 'feature', description: 'Use libicu for Unicode')
|
||||
option('iconv', type: 'feature', description: 'Use iconv() for character set conversion')
|
||||
option('libwrap', type: 'feature', description: 'libwrap support')
|
||||
option('pcre', type: 'feature', description: 'Enable regular expression support (using libpcre)')
|
||||
option('sqlite', type: 'feature', description: 'SQLite database support (for stickers)')
|
||||
option('yajl', type: 'feature', description: 'libyajl for YAML support')
|
||||
|
@@ -112,8 +112,8 @@ liblame = AutotoolsProject(
|
||||
)
|
||||
|
||||
ffmpeg = FfmpegProject(
|
||||
'http://ffmpeg.org/releases/ffmpeg-4.0.2.tar.xz',
|
||||
'a95c0cc9eb990e94031d2183f2e6e444cc61c99f6f182d1575c433d62afb2f97',
|
||||
'http://ffmpeg.org/releases/ffmpeg-4.1.1.tar.xz',
|
||||
'373749824dfd334d84e55dff406729edfd1606575ee44dd485d97d45ea4d2d86',
|
||||
'lib/libavcodec.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
@@ -341,8 +341,8 @@ ffmpeg = FfmpegProject(
|
||||
)
|
||||
|
||||
curl = AutotoolsProject(
|
||||
'http://curl.haxx.se/download/curl-7.61.1.tar.xz',
|
||||
'3d5913d6a39bd22e68e34dff697fd6e4c3c81563f580c76fca2009315cd81891',
|
||||
'http://curl.haxx.se/download/curl-7.64.0.tar.xz',
|
||||
'2f2f13fa34d44aa29cb444077ad7dc4dc6d189584ad552e0aaeb06e608af6001',
|
||||
'lib/libcurl.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
@@ -392,7 +392,7 @@ libnfs = AutotoolsProject(
|
||||
)
|
||||
|
||||
boost = BoostProject(
|
||||
'http://downloads.sourceforge.net/project/boost/boost/1.68.0/boost_1_68_0.tar.bz2',
|
||||
'7f6130bc3cf65f56a618888ce9d5ea704fa10b462be126ad053e80e553d6d8b7',
|
||||
'http://downloads.sourceforge.net/project/boost/boost/1.69.0/boost_1_69_0.tar.bz2',
|
||||
'8f32d4617390d1c2d16f26a27ab60d97807b35440d45891fa340fc2648b04406',
|
||||
'include/boost/version.hpp',
|
||||
)
|
||||
|
@@ -1,47 +0,0 @@
|
||||
#!/usr/bin/env ruby
|
||||
#
|
||||
# This script verifies that every source includes config.h first.
|
||||
# This is very important for consistent Large File Support.
|
||||
#
|
||||
|
||||
def check_file(file)
|
||||
first = true
|
||||
file.each_line do |line|
|
||||
if line =~ /^\#include\s+(\S+)/ then
|
||||
if $1 == '"config.h"'
|
||||
unless first
|
||||
puts "#{file.path}: config.h included too late"
|
||||
end
|
||||
else
|
||||
if first
|
||||
puts "#{file.path}: config.h missing"
|
||||
end
|
||||
end
|
||||
first = false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def check_path(path)
|
||||
File.open(path) do |file|
|
||||
check_file(file)
|
||||
end
|
||||
end
|
||||
|
||||
if ARGV.empty?
|
||||
Dir["src/*.c"].each do |path|
|
||||
check_path(path)
|
||||
end
|
||||
|
||||
Dir["src/*/*.c"].each do |path|
|
||||
check_path(path)
|
||||
end
|
||||
|
||||
Dir["test/*.c"].each do |path|
|
||||
check_path(path)
|
||||
end
|
||||
else
|
||||
ARGV.each do |path|
|
||||
check_path(path)
|
||||
end
|
||||
end
|
@@ -22,7 +22,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "AudioParser.hxx"
|
||||
#include "AudioFormat.hxx"
|
||||
#include "util/RuntimeError.hxx"
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "CheckAudioFormat.hxx"
|
||||
#include "AudioFormat.hxx"
|
||||
#include "util/RuntimeError.hxx"
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "IcyMetaDataParser.hxx"
|
||||
#include "tag/Tag.hxx"
|
||||
#include "tag/Builder.hxx"
|
||||
|
@@ -22,7 +22,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "Idle.hxx"
|
||||
#include "Main.hxx"
|
||||
#include "Instance.hxx"
|
||||
|
@@ -22,7 +22,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "IdleFlags.hxx"
|
||||
#include "util/ASCII.hxx"
|
||||
|
||||
|
@@ -30,6 +30,9 @@
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
#include "db/DatabaseError.hxx"
|
||||
#include "db/Interface.hxx"
|
||||
#include "db/update/Service.hxx"
|
||||
#include "storage/StorageInterface.hxx"
|
||||
|
||||
#ifdef ENABLE_SQLITE
|
||||
#include "sticker/StickerDatabase.hxx"
|
||||
@@ -48,7 +51,19 @@ Instance::Instance()
|
||||
{
|
||||
}
|
||||
|
||||
Instance::~Instance() noexcept = default;
|
||||
Instance::~Instance() noexcept
|
||||
{
|
||||
#ifdef ENABLE_DATABASE
|
||||
delete update;
|
||||
|
||||
if (database != nullptr) {
|
||||
database->Close();
|
||||
database.reset();
|
||||
}
|
||||
|
||||
delete storage;
|
||||
#endif
|
||||
}
|
||||
|
||||
Partition *
|
||||
Instance::FindPartition(const char *name) noexcept
|
||||
|
@@ -20,7 +20,7 @@
|
||||
#ifndef MPD_INSTANCE_HXX
|
||||
#define MPD_INSTANCE_HXX
|
||||
|
||||
#include "check.h"
|
||||
#include "config.h"
|
||||
#include "event/Loop.hxx"
|
||||
#include "event/Thread.hxx"
|
||||
#include "event/MaskMonitor.hxx"
|
||||
@@ -41,7 +41,7 @@ class NeighborGlue;
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
#include "db/DatabaseListener.hxx"
|
||||
class Database;
|
||||
#include "db/Ptr.hxx"
|
||||
class Storage;
|
||||
class UpdateService;
|
||||
#endif
|
||||
@@ -104,7 +104,7 @@ struct Instance final
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
Database *database;
|
||||
DatabasePtr database;
|
||||
|
||||
/**
|
||||
* This is really a #CompositeStorage. To avoid heavy include
|
||||
@@ -147,7 +147,6 @@ struct Instance final
|
||||
Partition *FindPartition(const char *name) noexcept;
|
||||
|
||||
void BeginShutdownPartitions() noexcept;
|
||||
void FinishShutdownPartitions() noexcept;
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
/**
|
||||
@@ -156,7 +155,7 @@ struct Instance final
|
||||
* music_directory was configured).
|
||||
*/
|
||||
Database *GetDatabase() {
|
||||
return database;
|
||||
return database.get();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -168,8 +167,6 @@ struct Instance final
|
||||
#endif
|
||||
|
||||
void BeginShutdownUpdate() noexcept;
|
||||
void FinishShutdownUpdate() noexcept;
|
||||
void ShutdownDatabase() noexcept;
|
||||
|
||||
#ifdef ENABLE_CURL
|
||||
void LookupRemoteTag(const char *uri) noexcept;
|
||||
|
@@ -20,7 +20,7 @@
|
||||
#ifndef MPD_LOCATE_URI_HXX
|
||||
#define MPD_LOCATE_URI_HXX
|
||||
|
||||
#include "check.h"
|
||||
#include "config.h"
|
||||
#include "util/Compiler.h"
|
||||
#include "fs/AllocatedPath.hxx"
|
||||
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "LogV.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
|
||||
|
@@ -17,11 +17,11 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "LogBackend.hxx"
|
||||
#include "Log.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
#include "util/StringStrip.hxx"
|
||||
#include "config.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
|
@@ -20,7 +20,6 @@
|
||||
#ifndef MPD_LOG_BACKEND_HXX
|
||||
#define MPD_LOG_BACKEND_HXX
|
||||
|
||||
#include "check.h"
|
||||
#include "LogLevel.hxx"
|
||||
|
||||
void
|
||||
|
@@ -30,6 +30,10 @@
|
||||
#include "util/RuntimeError.hxx"
|
||||
#include "system/Error.hxx"
|
||||
|
||||
#ifdef ENABLE_SYSTEMD_DAEMON
|
||||
#include <systemd/sd-daemon.h>
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
@@ -105,7 +109,7 @@ parse_log_level(const char *value, int line)
|
||||
#endif
|
||||
|
||||
void
|
||||
log_early_init(bool verbose)
|
||||
log_early_init(bool verbose) noexcept
|
||||
{
|
||||
#ifdef ANDROID
|
||||
(void)verbose;
|
||||
@@ -139,6 +143,16 @@ log_init(const ConfigData &config, bool verbose, bool use_stdout)
|
||||
if (param == nullptr) {
|
||||
/* no configuration: default to syslog (if
|
||||
available) */
|
||||
#ifdef ENABLE_SYSTEMD_DAEMON
|
||||
if (sd_booted() &&
|
||||
getenv("NOTIFY_SOCKET") != nullptr) {
|
||||
/* if MPD was started as a systemd
|
||||
service, default to journal (which
|
||||
is connected to fd=2) */
|
||||
out_fd = STDOUT_FILENO;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
#ifndef HAVE_SYSLOG
|
||||
throw std::runtime_error("config parameter 'log_file' not found");
|
||||
#endif
|
||||
@@ -157,7 +171,7 @@ log_init(const ConfigData &config, bool verbose, bool use_stdout)
|
||||
#ifndef ANDROID
|
||||
|
||||
static void
|
||||
close_log_files(void)
|
||||
close_log_files() noexcept
|
||||
{
|
||||
#ifdef HAVE_SYSLOG
|
||||
LogFinishSysLog();
|
||||
@@ -167,7 +181,7 @@ close_log_files(void)
|
||||
#endif
|
||||
|
||||
void
|
||||
log_deinit(void)
|
||||
log_deinit() noexcept
|
||||
{
|
||||
#ifndef ANDROID
|
||||
close_log_files();
|
||||
@@ -199,7 +213,8 @@ void setup_log_output()
|
||||
#endif
|
||||
}
|
||||
|
||||
int cycle_log_files(void)
|
||||
int
|
||||
cycle_log_files() noexcept
|
||||
{
|
||||
#ifdef ANDROID
|
||||
return 0;
|
||||
|
@@ -31,7 +31,7 @@ struct ConfigData;
|
||||
* @param verbose true when the program is started with --verbose
|
||||
*/
|
||||
void
|
||||
log_early_init(bool verbose);
|
||||
log_early_init(bool verbose) noexcept;
|
||||
|
||||
/**
|
||||
* Throws #std::runtime_error on error.
|
||||
@@ -40,12 +40,12 @@ void
|
||||
log_init(const ConfigData &config, bool verbose, bool use_stdout);
|
||||
|
||||
void
|
||||
log_deinit();
|
||||
log_deinit() noexcept;
|
||||
|
||||
void
|
||||
setup_log_output();
|
||||
|
||||
int
|
||||
cycle_log_files();
|
||||
cycle_log_files() noexcept;
|
||||
|
||||
#endif /* LOG_H */
|
||||
|
89
src/Main.cxx
89
src/Main.cxx
@@ -185,19 +185,16 @@ InitStorage(const ConfigData &config, EventLoop &event_loop)
|
||||
static bool
|
||||
glue_db_init_and_load(const ConfigData &config)
|
||||
{
|
||||
instance->database =
|
||||
CreateConfiguredDatabase(config, instance->event_loop,
|
||||
instance->io_thread.GetEventLoop(),
|
||||
*instance);
|
||||
if (instance->database == nullptr)
|
||||
auto db = CreateConfiguredDatabase(config, instance->event_loop,
|
||||
instance->io_thread.GetEventLoop(),
|
||||
*instance);
|
||||
if (!db)
|
||||
return true;
|
||||
|
||||
if (instance->database->GetPlugin().flags & DatabasePlugin::FLAG_REQUIRE_STORAGE) {
|
||||
if (db->GetPlugin().RequireStorage()) {
|
||||
InitStorage(config, instance->io_thread.GetEventLoop());
|
||||
|
||||
if (instance->storage == nullptr) {
|
||||
delete instance->database;
|
||||
instance->database = nullptr;
|
||||
LogDefault(config_domain,
|
||||
"Found database setting without "
|
||||
"music_directory - disabling database");
|
||||
@@ -211,22 +208,24 @@ glue_db_init_and_load(const ConfigData &config)
|
||||
}
|
||||
|
||||
try {
|
||||
instance->database->Open();
|
||||
db->Open();
|
||||
} catch (...) {
|
||||
std::throw_with_nested(std::runtime_error("Failed to open database plugin"));
|
||||
}
|
||||
|
||||
if (!instance->database->IsPlugin(simple_db_plugin))
|
||||
instance->database = std::move(db);
|
||||
|
||||
auto *sdb = dynamic_cast<SimpleDatabase *>(instance->database.get());
|
||||
if (sdb == nullptr)
|
||||
return true;
|
||||
|
||||
SimpleDatabase &db = *(SimpleDatabase *)instance->database;
|
||||
instance->update = new UpdateService(config,
|
||||
instance->event_loop, db,
|
||||
instance->event_loop, *sdb,
|
||||
static_cast<CompositeStorage &>(*instance->storage),
|
||||
*instance);
|
||||
|
||||
/* run database update after daemonization? */
|
||||
return db.FileExists();
|
||||
return sdb->FileExists();
|
||||
}
|
||||
|
||||
static bool
|
||||
@@ -351,27 +350,6 @@ Instance::BeginShutdownUpdate() noexcept
|
||||
#endif
|
||||
}
|
||||
|
||||
inline void
|
||||
Instance::FinishShutdownUpdate() noexcept
|
||||
{
|
||||
#ifdef ENABLE_DATABASE
|
||||
delete update;
|
||||
#endif
|
||||
}
|
||||
|
||||
inline void
|
||||
Instance::ShutdownDatabase() noexcept
|
||||
{
|
||||
#ifdef ENABLE_DATABASE
|
||||
if (instance->database != nullptr) {
|
||||
instance->database->Close();
|
||||
delete instance->database;
|
||||
}
|
||||
|
||||
delete instance->storage;
|
||||
#endif
|
||||
}
|
||||
|
||||
inline void
|
||||
Instance::BeginShutdownPartitions() noexcept
|
||||
{
|
||||
@@ -381,12 +359,6 @@ Instance::BeginShutdownPartitions() noexcept
|
||||
}
|
||||
}
|
||||
|
||||
inline void
|
||||
Instance::FinishShutdownPartitions() noexcept
|
||||
{
|
||||
partitions.clear();
|
||||
}
|
||||
|
||||
void
|
||||
Instance::OnIdle(unsigned flags)
|
||||
{
|
||||
@@ -523,18 +495,19 @@ static int
|
||||
mpd_main_after_fork(const ConfigData &raw_config, const Config &config)
|
||||
{
|
||||
ConfigureFS(raw_config);
|
||||
AtScopeExit() { DeinitFS(); };
|
||||
|
||||
glue_mapper_init(raw_config);
|
||||
|
||||
initPermissions(raw_config);
|
||||
spl_global_init(raw_config);
|
||||
#ifdef ENABLE_ARCHIVE
|
||||
archive_plugin_init_all();
|
||||
const ScopeArchivePluginsInit archive_plugins_init;
|
||||
#endif
|
||||
|
||||
pcm_convert_global_init(raw_config);
|
||||
|
||||
decoder_plugin_init_all(raw_config);
|
||||
const ScopeDecoderPluginsInit decoder_plugins_init(raw_config);
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
const bool create_db = InitDatabaseAndStorage(raw_config);
|
||||
@@ -553,9 +526,9 @@ mpd_main_after_fork(const ConfigData &raw_config, const Config &config)
|
||||
}
|
||||
|
||||
client_manager_init(raw_config);
|
||||
input_stream_global_init(raw_config,
|
||||
instance->io_thread.GetEventLoop());
|
||||
playlist_list_global_init(raw_config);
|
||||
const ScopeInputPluginsInit input_plugins_init(raw_config,
|
||||
instance->io_thread.GetEventLoop());
|
||||
const ScopePlaylistPluginsInit playlist_plugins_init(raw_config);
|
||||
|
||||
#ifdef ENABLE_DAEMON
|
||||
daemonize_commit();
|
||||
@@ -564,7 +537,7 @@ mpd_main_after_fork(const ConfigData &raw_config, const Config &config)
|
||||
#ifndef ANDROID
|
||||
setup_log_output();
|
||||
|
||||
SignalHandlersInit(instance->event_loop);
|
||||
const ScopeSignalHandlersInit signal_handlers_init(instance->event_loop);
|
||||
#endif
|
||||
|
||||
instance->io_thread.Start();
|
||||
@@ -652,34 +625,10 @@ mpd_main_after_fork(const ConfigData &raw_config, const Config &config)
|
||||
}
|
||||
#endif
|
||||
|
||||
instance->FinishShutdownUpdate();
|
||||
instance->ShutdownDatabase();
|
||||
|
||||
#ifdef ENABLE_SQLITE
|
||||
sticker_global_finish();
|
||||
#endif
|
||||
|
||||
playlist_list_global_finish();
|
||||
input_stream_global_finish();
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
mapper_finish();
|
||||
#endif
|
||||
|
||||
DeinitFS();
|
||||
|
||||
instance->FinishShutdownPartitions();
|
||||
command_finish();
|
||||
decoder_plugin_deinit_all();
|
||||
#ifdef ENABLE_ARCHIVE
|
||||
archive_plugin_deinit_all();
|
||||
#endif
|
||||
instance->rtio_thread.Stop();
|
||||
instance->io_thread.Stop();
|
||||
#ifndef ANDROID
|
||||
SignalHandlersFinish();
|
||||
#endif
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
@@ -58,11 +58,6 @@ mapper_init(AllocatedPath &&_playlist_dir)
|
||||
mapper_set_playlist_dir(std::move(_playlist_dir));
|
||||
}
|
||||
|
||||
void
|
||||
mapper_finish() noexcept
|
||||
{
|
||||
}
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
|
||||
AllocatedPath
|
||||
|
@@ -24,9 +24,10 @@
|
||||
#ifndef MPD_MAPPER_HXX
|
||||
#define MPD_MAPPER_HXX
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "util/Compiler.h"
|
||||
#include "config.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
#define PLAYLIST_FILE_SUFFIX ".m3u"
|
||||
|
||||
@@ -36,9 +37,6 @@ class AllocatedPath;
|
||||
void
|
||||
mapper_init(AllocatedPath &&playlist_dir);
|
||||
|
||||
void
|
||||
mapper_finish() noexcept;
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
|
||||
/**
|
||||
|
@@ -20,7 +20,6 @@
|
||||
#ifndef MPD_MIX_RAMP_INFO_HXX
|
||||
#define MPD_MIX_RAMP_INFO_HXX
|
||||
|
||||
#include "check.h"
|
||||
#include "util/Compiler.h"
|
||||
|
||||
#include <string>
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "MusicBuffer.hxx"
|
||||
#include "MusicChunk.hxx"
|
||||
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "MusicChunk.hxx"
|
||||
#include "AudioFormat.hxx"
|
||||
#include "tag/Tag.hxx"
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "MusicChunkPtr.hxx"
|
||||
#include "MusicBuffer.hxx"
|
||||
|
||||
|
@@ -20,8 +20,6 @@
|
||||
#ifndef MPD_MUSIC_CHUNK_PTR_HXX
|
||||
#define MPD_MUSIC_CHUNK_PTR_HXX
|
||||
|
||||
#include "check.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
struct MusicChunk;
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "MusicPipe.hxx"
|
||||
#include "MusicChunk.hxx"
|
||||
|
||||
|
@@ -31,6 +31,7 @@
|
||||
#include "SingleMode.hxx"
|
||||
#include "Chrono.hxx"
|
||||
#include "util/Compiler.h"
|
||||
#include "config.h"
|
||||
|
||||
#include <string>
|
||||
#include <memory>
|
||||
|
@@ -20,7 +20,7 @@
|
||||
#ifndef MPD_PERMISSION_HXX
|
||||
#define MPD_PERMISSION_HXX
|
||||
|
||||
#include "check.h"
|
||||
#include "config.h"
|
||||
|
||||
struct ConfigData;
|
||||
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "PlaylistDatabase.hxx"
|
||||
#include "db/PlaylistVector.hxx"
|
||||
#include "fs/io/TextFile.hxx"
|
||||
|
@@ -20,8 +20,6 @@
|
||||
#ifndef MPD_PLAYLIST_DATABASE_HXX
|
||||
#define MPD_PLAYLIST_DATABASE_HXX
|
||||
|
||||
#include "check.h"
|
||||
|
||||
#define PLAYLIST_META_BEGIN "playlist_begin: "
|
||||
|
||||
class PlaylistVector;
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "PlaylistError.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
|
||||
|
@@ -134,7 +134,9 @@ LoadPlaylistFileInfo(PlaylistInfo &info,
|
||||
const auto *const name_fs_end =
|
||||
FindStringSuffix(name_fs_str,
|
||||
PATH_LITERAL(PLAYLIST_FILE_SUFFIX));
|
||||
if (name_fs_end == nullptr)
|
||||
if (name_fs_end == nullptr ||
|
||||
/* no empty playlist names (raw file name = ".m3u") */
|
||||
name_fs_end == name_fs_str)
|
||||
return false;
|
||||
|
||||
FileInfo fi;
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "PlaylistPrint.hxx"
|
||||
#include "PlaylistFile.hxx"
|
||||
#include "PlaylistError.hxx"
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "RemoteTagCache.hxx"
|
||||
#include "RemoteTagCacheHandler.hxx"
|
||||
#include "input/ScanTags.hxx"
|
||||
|
@@ -20,7 +20,6 @@
|
||||
#ifndef MPD_REMOTE_TAG_CACHE_HXX
|
||||
#define MPD_REMOTE_TAG_CACHE_HXX
|
||||
|
||||
#include "check.h"
|
||||
#include "input/RemoteTagScanner.hxx"
|
||||
#include "tag/Tag.hxx"
|
||||
#include "event/DeferEvent.hxx"
|
||||
|
@@ -20,8 +20,6 @@
|
||||
#ifndef MPD_REPLAY_GAIN_CONFIG_HXX
|
||||
#define MPD_REPLAY_GAIN_CONFIG_HXX
|
||||
|
||||
#include "check.h"
|
||||
|
||||
struct ReplayGainConfig {
|
||||
static constexpr bool DEFAULT_LIMIT = true;
|
||||
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "ReplayGainGlobal.hxx"
|
||||
#include "ReplayGainConfig.hxx"
|
||||
#include "config/Param.hxx"
|
||||
|
@@ -20,8 +20,6 @@
|
||||
#ifndef MPD_REPLAY_GAIN_GLOBAL_HXX
|
||||
#define MPD_REPLAY_GAIN_GLOBAL_HXX
|
||||
|
||||
#include "check.h"
|
||||
|
||||
struct ConfigData;
|
||||
struct ReplayGainConfig;
|
||||
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "ReplayGainInfo.hxx"
|
||||
#include "ReplayGainConfig.hxx"
|
||||
|
||||
|
@@ -20,7 +20,6 @@
|
||||
#ifndef MPD_REPLAY_GAIN_INFO_HXX
|
||||
#define MPD_REPLAY_GAIN_INFO_HXX
|
||||
|
||||
#include "check.h"
|
||||
#include "util/Compiler.h"
|
||||
#include "ReplayGainMode.hxx"
|
||||
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "SongLoader.hxx"
|
||||
#include "LocateUri.hxx"
|
||||
#include "client/Client.hxx"
|
||||
@@ -25,6 +24,7 @@
|
||||
#include "storage/StorageInterface.hxx"
|
||||
#include "song/DetachedSong.hxx"
|
||||
#include "PlaylistError.hxx"
|
||||
#include "config.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
|
@@ -20,8 +20,8 @@
|
||||
#ifndef MPD_SONG_LOADER_HXX
|
||||
#define MPD_SONG_LOADER_HXX
|
||||
|
||||
#include "check.h"
|
||||
#include "util/Compiler.h"
|
||||
#include "config.h"
|
||||
|
||||
#include <cstddef>
|
||||
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "SongPrint.hxx"
|
||||
#include "song/LightSong.hxx"
|
||||
#include "Partition.hxx"
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "SongSave.hxx"
|
||||
#include "AudioParser.hxx"
|
||||
#include "db/plugins/simple/Song.hxx"
|
||||
|
@@ -119,7 +119,7 @@ try {
|
||||
TextFile file(config.path);
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
const SongLoader song_loader(partition.instance.database,
|
||||
const SongLoader song_loader(partition.instance.GetDatabase(),
|
||||
partition.instance.storage);
|
||||
#else
|
||||
const SongLoader song_loader(nullptr, nullptr);
|
||||
|
@@ -24,6 +24,7 @@
|
||||
#include "event/TimerEvent.hxx"
|
||||
#include "fs/AllocatedPath.hxx"
|
||||
#include "util/Compiler.h"
|
||||
#include "config.h"
|
||||
|
||||
#include <string>
|
||||
#include <chrono>
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "StateFileConfig.hxx"
|
||||
#include "config/Data.hxx"
|
||||
|
||||
|
@@ -20,7 +20,6 @@
|
||||
#ifndef MPD_STATE_FILE_CONFIG_HXX
|
||||
#define MPD_STATE_FILE_CONFIG_HXX
|
||||
|
||||
#include "check.h"
|
||||
#include "fs/AllocatedPath.hxx"
|
||||
|
||||
#include <chrono>
|
||||
|
@@ -124,7 +124,7 @@ stats_print(Response &r, const Partition &partition)
|
||||
std::lround(partition.pc.GetTotalPlayTime().count()));
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
const Database *db = partition.instance.database;
|
||||
const Database *db = partition.instance.GetDatabase();
|
||||
if (db != nullptr)
|
||||
db_stats_print(r, *db);
|
||||
#endif
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "TagArchive.hxx"
|
||||
#include "TagStream.hxx"
|
||||
#include "archive/ArchiveFile.hxx"
|
||||
|
@@ -20,8 +20,6 @@
|
||||
#ifndef MPD_TAG_ARCHIVE_HXX
|
||||
#define MPD_TAG_ARCHIVE_HXX
|
||||
|
||||
#include "check.h"
|
||||
|
||||
class ArchiveFile;
|
||||
class TagHandler;
|
||||
class TagBuilder;
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "TagFile.hxx"
|
||||
#include "tag/Generic.hxx"
|
||||
#include "tag/Handler.hxx"
|
||||
|
@@ -20,8 +20,6 @@
|
||||
#ifndef MPD_TAG_FILE_HXX
|
||||
#define MPD_TAG_FILE_HXX
|
||||
|
||||
#include "check.h"
|
||||
|
||||
struct AudioFormat;
|
||||
class Path;
|
||||
class TagHandler;
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "TagPrint.hxx"
|
||||
#include "tag/Tag.hxx"
|
||||
#include "tag/Settings.hxx"
|
||||
@@ -26,8 +25,9 @@
|
||||
void
|
||||
tag_print_types(Response &r) noexcept
|
||||
{
|
||||
const auto tag_mask = global_tag_mask & r.GetTagMask();
|
||||
for (unsigned i = 0; i < TAG_NUM_OF_ITEM_TYPES; i++)
|
||||
if (IsTagEnabled(i))
|
||||
if (tag_mask.Test(TagType(i)))
|
||||
r.Format("tagtype: %s\n", tag_item_names[i]);
|
||||
}
|
||||
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "TagSave.hxx"
|
||||
#include "tag/Tag.hxx"
|
||||
#include "fs/io/BufferedOutputStream.hxx"
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "TagStream.hxx"
|
||||
#include "tag/Generic.hxx"
|
||||
#include "tag/Handler.hxx"
|
||||
|
@@ -20,8 +20,6 @@
|
||||
#ifndef MPD_TAG_STREAM_HXX
|
||||
#define MPD_TAG_STREAM_HXX
|
||||
|
||||
#include "check.h"
|
||||
|
||||
struct AudioFormat;
|
||||
class InputStream;
|
||||
class TagHandler;
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "TimePrint.hxx"
|
||||
#include "client/Response.hxx"
|
||||
#include "util/TimeISO8601.hxx"
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "Context.hxx"
|
||||
#include "java/Class.hxx"
|
||||
#include "java/File.hxx"
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "Environment.hxx"
|
||||
#include "java/Class.hxx"
|
||||
#include "java/String.hxx"
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "LogListener.hxx"
|
||||
#include "java/Class.hxx"
|
||||
#include "java/String.hxx"
|
||||
|
@@ -49,7 +49,7 @@ static bool archive_plugins_enabled[ARRAY_SIZE(archive_plugins) - 1];
|
||||
if (archive_plugins_enabled[archive_plugin_iterator - archive_plugins])
|
||||
|
||||
const ArchivePlugin *
|
||||
archive_plugin_from_suffix(const char *suffix)
|
||||
archive_plugin_from_suffix(const char *suffix) noexcept
|
||||
{
|
||||
if (suffix == nullptr)
|
||||
return nullptr;
|
||||
@@ -63,7 +63,7 @@ archive_plugin_from_suffix(const char *suffix)
|
||||
}
|
||||
|
||||
const ArchivePlugin *
|
||||
archive_plugin_from_name(const char *name)
|
||||
archive_plugin_from_name(const char *name) noexcept
|
||||
{
|
||||
archive_plugins_for_each_enabled(plugin)
|
||||
if (strcmp(plugin->name, name) == 0)
|
||||
@@ -81,7 +81,8 @@ void archive_plugin_init_all(void)
|
||||
}
|
||||
}
|
||||
|
||||
void archive_plugin_deinit_all(void)
|
||||
void
|
||||
archive_plugin_deinit_all() noexcept
|
||||
{
|
||||
archive_plugins_for_each_enabled(plugin)
|
||||
if (plugin->finish != nullptr)
|
||||
|
@@ -33,10 +33,10 @@ extern const ArchivePlugin *const archive_plugins[];
|
||||
/* interface for using plugins */
|
||||
|
||||
const ArchivePlugin *
|
||||
archive_plugin_from_suffix(const char *suffix);
|
||||
archive_plugin_from_suffix(const char *suffix) noexcept;
|
||||
|
||||
const ArchivePlugin *
|
||||
archive_plugin_from_name(const char *name);
|
||||
archive_plugin_from_name(const char *name) noexcept;
|
||||
|
||||
/* this is where we "load" all the "plugins" ;-) */
|
||||
void
|
||||
@@ -44,6 +44,17 @@ archive_plugin_init_all();
|
||||
|
||||
/* this is where we "unload" all the "plugins" */
|
||||
void
|
||||
archive_plugin_deinit_all();
|
||||
archive_plugin_deinit_all() noexcept;
|
||||
|
||||
class ScopeArchivePluginsInit {
|
||||
public:
|
||||
ScopeArchivePluginsInit() {
|
||||
archive_plugin_init_all();
|
||||
}
|
||||
|
||||
~ScopeArchivePluginsInit() noexcept {
|
||||
archive_plugin_deinit_all();
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h" /* must be first for large file support */
|
||||
#include "ArchiveLookup.hxx"
|
||||
#include "ArchiveDomain.hxx"
|
||||
#include "Log.hxx"
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "ArchivePlugin.hxx"
|
||||
#include "ArchiveFile.hxx"
|
||||
#include "fs/Path.hxx"
|
||||
|
@@ -21,7 +21,6 @@
|
||||
* single bz2 archive handling (requires libbz2)
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "Bzip2ArchivePlugin.hxx"
|
||||
#include "../ArchivePlugin.hxx"
|
||||
#include "../ArchiveFile.hxx"
|
||||
|
@@ -21,7 +21,6 @@
|
||||
* iso archive handling (requires cdio, and iso9660)
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "Iso9660ArchivePlugin.hxx"
|
||||
#include "../ArchivePlugin.hxx"
|
||||
#include "../ArchiveFile.hxx"
|
||||
|
@@ -21,7 +21,6 @@
|
||||
* zip archive handling (requires zziplib)
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "ZzipArchivePlugin.hxx"
|
||||
#include "../ArchivePlugin.hxx"
|
||||
#include "../ArchiveFile.hxx"
|
||||
|
@@ -17,11 +17,11 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "ClientInternal.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
#include "Partition.hxx"
|
||||
#include "Instance.hxx"
|
||||
#include "util/Domain.hxx"
|
||||
#include "config.h"
|
||||
|
||||
const Domain client_domain("client");
|
||||
|
||||
|
@@ -20,7 +20,6 @@
|
||||
#ifndef MPD_CLIENT_H
|
||||
#define MPD_CLIENT_H
|
||||
|
||||
#include "check.h"
|
||||
#include "ClientMessage.hxx"
|
||||
#include "command/CommandListBuilder.hxx"
|
||||
#include "tag/Mask.hxx"
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "Client.hxx"
|
||||
#include "Log.hxx"
|
||||
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "ClientInternal.hxx"
|
||||
#include "Log.hxx"
|
||||
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "Client.hxx"
|
||||
#include "protocol/Ack.hxx"
|
||||
#include "fs/Path.hxx"
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "ClientInternal.hxx"
|
||||
#include "config/Data.hxx"
|
||||
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "ClientInternal.hxx"
|
||||
#include "Response.hxx"
|
||||
#include "Idle.hxx"
|
||||
|
@@ -20,7 +20,6 @@
|
||||
#ifndef MPD_CLIENT_INTERNAL_HXX
|
||||
#define MPD_CLIENT_INTERNAL_HXX
|
||||
|
||||
#include "check.h"
|
||||
#include "Client.hxx"
|
||||
#include "command/CommandResult.hxx"
|
||||
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "ClientList.hxx"
|
||||
#include "ClientInternal.hxx"
|
||||
#include "util/DeleteDisposer.hxx"
|
||||
|
@@ -35,10 +35,6 @@
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LIBWRAP
|
||||
#include <tcpd.h>
|
||||
#endif
|
||||
|
||||
static constexpr char GREETING[] = "OK MPD " PROTOCOL_VERSION "\n";
|
||||
|
||||
Client::Client(EventLoop &_loop, Partition &_partition,
|
||||
@@ -66,27 +62,6 @@ client_new(EventLoop &loop, Partition &partition,
|
||||
|
||||
assert(fd.IsDefined());
|
||||
|
||||
#ifdef HAVE_LIBWRAP
|
||||
if (address.GetFamily() != AF_LOCAL) {
|
||||
// TODO: shall we obtain the program name from argv[0]?
|
||||
const char *progname = "mpd";
|
||||
|
||||
struct request_info req;
|
||||
request_init(&req, RQ_FILE, fd.Get(), RQ_DAEMON, progname, 0);
|
||||
|
||||
fromhost(&req);
|
||||
|
||||
if (!hosts_access(&req)) {
|
||||
/* tcp wrappers says no */
|
||||
FormatWarning(client_domain,
|
||||
"libwrap refused connection (libwrap=%s) from %s",
|
||||
progname, remote.c_str());
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
#endif /* HAVE_WRAP */
|
||||
|
||||
ClientList &client_list = *partition.instance.client_list;
|
||||
if (client_list.IsFull()) {
|
||||
LogWarning(client_domain, "Max connections reached");
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "ClientInternal.hxx"
|
||||
#include "protocol/Result.hxx"
|
||||
#include "command/AllCommands.hxx"
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "ClientInternal.hxx"
|
||||
#include "Partition.hxx"
|
||||
#include "Instance.hxx"
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "ClientInternal.hxx"
|
||||
#include "Partition.hxx"
|
||||
#include "Idle.hxx"
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "Client.hxx"
|
||||
|
||||
#include <string.h>
|
||||
|
@@ -17,12 +17,12 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "Listener.hxx"
|
||||
#include "Client.hxx"
|
||||
#include "Permission.hxx"
|
||||
#include "net/UniqueSocketDescriptor.hxx"
|
||||
#include "net/SocketAddress.hxx"
|
||||
#include "config.h"
|
||||
|
||||
static unsigned
|
||||
GetPermissions(SocketAddress address, int uid) noexcept
|
||||
|
@@ -20,7 +20,6 @@
|
||||
#ifndef MPD_CLIENT_LISTENER_HXX
|
||||
#define MPD_CLIENT_LISTENER_HXX
|
||||
|
||||
#include "check.h"
|
||||
#include "event/ServerSocket.hxx"
|
||||
|
||||
struct Partition;
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "Response.hxx"
|
||||
#include "Client.hxx"
|
||||
#include "util/FormatString.hxx"
|
||||
|
@@ -20,7 +20,6 @@
|
||||
#ifndef MPD_RESPONSE_HXX
|
||||
#define MPD_RESPONSE_HXX
|
||||
|
||||
#include "check.h"
|
||||
#include "protocol/Ack.hxx"
|
||||
#include "util/Compiler.h"
|
||||
|
||||
|
@@ -285,11 +285,6 @@ command_init()
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
command_finish()
|
||||
{
|
||||
}
|
||||
|
||||
static const struct command *
|
||||
command_lookup(const char *name)
|
||||
{
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "ClientCommands.hxx"
|
||||
#include "Request.hxx"
|
||||
#include "Permission.hxx"
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "CommandListBuilder.hxx"
|
||||
#include "client/ClientInternal.hxx"
|
||||
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "DatabaseCommands.hxx"
|
||||
#include "Request.hxx"
|
||||
#include "db/DatabaseQueue.hxx"
|
||||
@@ -269,7 +268,10 @@ handle_list(Client &client, Request args, Response &r)
|
||||
std::unique_ptr<SongFilter> filter;
|
||||
TagType group = TAG_NUM_OF_ITEM_TYPES;
|
||||
|
||||
if (args.size == 1) {
|
||||
if (args.size == 1 &&
|
||||
/* parantheses are the syntax for filter expressions: no
|
||||
compatibility mode */
|
||||
args.front()[0] != '(') {
|
||||
/* for compatibility with < 0.12.0 */
|
||||
if (tagType != TAG_ALBUM) {
|
||||
r.FormatError(ACK_ERROR_ARG,
|
||||
|
@@ -37,9 +37,11 @@
|
||||
#include "fs/FileInfo.hxx"
|
||||
#include "fs/DirectoryReader.hxx"
|
||||
#include "input/InputStream.hxx"
|
||||
#include "input/Error.hxx"
|
||||
#include "LocateUri.hxx"
|
||||
#include "TimePrint.hxx"
|
||||
#include "thread/Mutex.hxx"
|
||||
#include "Log.hxx"
|
||||
|
||||
#include <assert.h>
|
||||
#include <inttypes.h> /* for PRIu64 */
|
||||
@@ -256,7 +258,11 @@ find_stream_art(const char *directory, Mutex &mutex)
|
||||
|
||||
try {
|
||||
return InputStream::OpenReady(art_file.c_str(), mutex);
|
||||
} catch (const std::exception &e) {}
|
||||
} catch (...) {
|
||||
auto e = std::current_exception();
|
||||
if (!IsFileNotFound(e))
|
||||
LogError(e);
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
@@ -285,8 +291,11 @@ read_stream_art(Response &r, const char *uri, size_t offset)
|
||||
uint8_t buffer[CHUNK_SIZE];
|
||||
size_t read_size;
|
||||
|
||||
is->Seek(offset);
|
||||
read_size = is->Read(&buffer, CHUNK_SIZE);
|
||||
{
|
||||
const std::lock_guard<Mutex> protect(mutex);
|
||||
is->Seek(offset);
|
||||
read_size = is->Read(&buffer, CHUNK_SIZE);
|
||||
}
|
||||
|
||||
r.Format("size: %" PRIoffset "\n"
|
||||
"binary: %u\n",
|
||||
|
@@ -17,7 +17,6 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "MessageCommands.hxx"
|
||||
#include "Request.hxx"
|
||||
#include "client/Client.hxx"
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user