Compare commits
375 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
18628bf89e | ||
![]() |
2052b461af | ||
![]() |
5019bdcd52 | ||
![]() |
8be0bcbdb9 | ||
![]() |
af72a22ed8 | ||
![]() |
6ed9668fea | ||
![]() |
175d2c6d29 | ||
![]() |
ab487b9a99 | ||
![]() |
ac59ec34f9 | ||
![]() |
82da57b7ce | ||
![]() |
aa6dac9bd2 | ||
![]() |
a26bf261a9 | ||
![]() |
c692286c67 | ||
![]() |
3775766605 | ||
![]() |
38e24208f6 | ||
![]() |
fbaedf2262 | ||
![]() |
8f3341cefb | ||
![]() |
4ec4bab3a9 | ||
![]() |
6d567bcd35 | ||
![]() |
363d9f0180 | ||
![]() |
db0682a469 | ||
![]() |
7a6823dcdf | ||
![]() |
bce144a232 | ||
![]() |
0cef84cac6 | ||
![]() |
56c0733b42 | ||
![]() |
0b0acb3981 | ||
![]() |
1375dcc4ec | ||
![]() |
6aeb0e335b | ||
![]() |
c1e2537851 | ||
![]() |
8c690fb737 | ||
![]() |
dad1c21b59 | ||
![]() |
dd10b2bd61 | ||
![]() |
48c7c540df | ||
![]() |
281270cd2a | ||
![]() |
02502514f6 | ||
![]() |
1bc02123f9 | ||
![]() |
3488a47c41 | ||
![]() |
fd82d67678 | ||
![]() |
e66c12105b | ||
![]() |
dbe12a6b90 | ||
![]() |
d3a680cc87 | ||
![]() |
62fc4d5cf4 | ||
![]() |
14465be847 | ||
![]() |
0e49de867d | ||
![]() |
f2e4529707 | ||
![]() |
3547fc7e61 | ||
![]() |
466a05bc52 | ||
![]() |
6de4064cca | ||
![]() |
bcf0fdd3a8 | ||
![]() |
a8f05a7efc | ||
![]() |
c64a3b5dbb | ||
![]() |
16c38c438f | ||
![]() |
48cc4a6ced | ||
![]() |
a169a05e41 | ||
![]() |
a6cb3139db | ||
![]() |
239a83324e | ||
![]() |
8efa5c7641 | ||
![]() |
28e7be248f | ||
![]() |
c3f9b38c97 | ||
![]() |
dbb18a401b | ||
![]() |
e1e41708af | ||
![]() |
638dfc3981 | ||
![]() |
7c09e44ad4 | ||
![]() |
365b798f33 | ||
![]() |
6f51d910ee | ||
![]() |
1215818572 | ||
![]() |
514ed33a02 | ||
![]() |
bfed47b82d | ||
![]() |
8c51440057 | ||
![]() |
018858ec97 | ||
![]() |
3c1988b68f | ||
![]() |
5452428d69 | ||
![]() |
d6bf6e161a | ||
![]() |
a71b76bb3c | ||
![]() |
c1429500b2 | ||
![]() |
0f02bbc2fe | ||
![]() |
b885f358a5 | ||
![]() |
650a30d794 | ||
![]() |
1dc71f383a | ||
![]() |
6dfebf7df9 | ||
![]() |
4bcdcca7f5 | ||
![]() |
c08a8581ee | ||
![]() |
25b0194036 | ||
![]() |
77fe727e69 | ||
![]() |
73f9824ddf | ||
![]() |
1fe0c673bc | ||
![]() |
8a045207a7 | ||
![]() |
fe7c5a4208 | ||
![]() |
8024f7e84d | ||
![]() |
14f0134097 | ||
![]() |
1da27be84d | ||
![]() |
08135f2cb7 | ||
![]() |
5907656bbb | ||
![]() |
2ac2bd26f8 | ||
![]() |
a2be91aea5 | ||
![]() |
579428172e | ||
![]() |
3e484637f9 | ||
![]() |
3e93c392d7 | ||
![]() |
0a97e68aa9 | ||
![]() |
69783a44c8 | ||
![]() |
d72263d28d | ||
![]() |
24a205a1aa | ||
![]() |
3a948515ce | ||
![]() |
9ade93983c | ||
![]() |
6931ce9558 | ||
![]() |
d6fb07a3e4 | ||
![]() |
01d3c2705e | ||
![]() |
29346dc9c5 | ||
![]() |
d19b3df3b0 | ||
![]() |
798e68ef62 | ||
![]() |
79397db5b4 | ||
![]() |
9256190a9b | ||
![]() |
3a0dbb0a67 | ||
![]() |
3d6c9d1b88 | ||
![]() |
5823e79fe7 | ||
![]() |
5f656dffda | ||
![]() |
34d4d9157a | ||
![]() |
22c329cdb4 | ||
![]() |
980ef82216 | ||
![]() |
84a06a72df | ||
![]() |
4833d0891d | ||
![]() |
cd53ca22c6 | ||
![]() |
4d9af9a81b | ||
![]() |
d61341c0e3 | ||
![]() |
eff50b263a | ||
![]() |
2bebc79363 | ||
![]() |
e777fb4edb | ||
![]() |
3fb25d4062 | ||
![]() |
e227596c20 | ||
![]() |
ec76583c33 | ||
![]() |
927f1e03a3 | ||
![]() |
f2c679cfec | ||
![]() |
6a75c48dba | ||
![]() |
48bdd09f64 | ||
![]() |
cf108c389f | ||
![]() |
90d97053a8 | ||
![]() |
e1fe9ebcd6 | ||
![]() |
93016ac6ab | ||
![]() |
fc20a1f10a | ||
![]() |
a4257e51d5 | ||
![]() |
2f2b3f1cdc | ||
![]() |
2ff6a9ad2b | ||
![]() |
17d4873b60 | ||
![]() |
8b41c4f384 | ||
![]() |
17f7098e27 | ||
![]() |
9ff790b7bb | ||
![]() |
ebc1fe2821 | ||
![]() |
bc2988144e | ||
![]() |
b1a9958c66 | ||
![]() |
e6a81bb95c | ||
![]() |
9521c1ad58 | ||
![]() |
6d65cc48d7 | ||
![]() |
681956a963 | ||
![]() |
052f64d648 | ||
![]() |
afe621c25c | ||
![]() |
637cf8a039 | ||
![]() |
2011a6e2ee | ||
![]() |
d54830de12 | ||
![]() |
a7e7312cca | ||
![]() |
6b83fc6b57 | ||
![]() |
74f9e07151 | ||
![]() |
82a61ab3be | ||
![]() |
54c1794cee | ||
![]() |
c962a6be76 | ||
![]() |
922c4bf3f0 | ||
![]() |
932756efce | ||
![]() |
7838265482 | ||
![]() |
b14b0e5634 | ||
![]() |
4d2d0e7bb8 | ||
![]() |
44378b7dbe | ||
![]() |
da642b2890 | ||
![]() |
6f77af20d0 | ||
![]() |
010f65a1d6 | ||
![]() |
c46f97454a | ||
![]() |
844dbd2ec5 | ||
![]() |
db7caa2dac | ||
![]() |
2974737746 | ||
![]() |
b1d7567226 | ||
![]() |
5103eb3039 | ||
![]() |
0cccdcf9b2 | ||
![]() |
22b840c2f1 | ||
![]() |
ed1a995bff | ||
![]() |
0f39dc1edb | ||
![]() |
dc9103befe | ||
![]() |
67760f5283 | ||
![]() |
99405a4c93 | ||
![]() |
b833c5d2c7 | ||
![]() |
bca5d79f88 | ||
![]() |
6e1c8edf09 | ||
![]() |
32b7b2e2fa | ||
![]() |
cfb7f8ab84 | ||
![]() |
8d80280ab9 | ||
![]() |
c95e3dc065 | ||
![]() |
00a520a4c3 | ||
![]() |
6eba621045 | ||
![]() |
a9ad8fa505 | ||
![]() |
85427826aa | ||
![]() |
25e0a90402 | ||
![]() |
938728820b | ||
![]() |
80531ef8d8 | ||
![]() |
a91fba6a3d | ||
![]() |
f8be403c34 | ||
![]() |
28a5cdf319 | ||
![]() |
6b1d264b35 | ||
![]() |
a6c10e9a1c | ||
![]() |
19a46064e9 | ||
![]() |
b57eeaa720 | ||
![]() |
ad059d5804 | ||
![]() |
6e1940e930 | ||
![]() |
103194e32d | ||
![]() |
481c330c17 | ||
![]() |
7ef489e057 | ||
![]() |
d9e5d5ff5b | ||
![]() |
ca02fb7782 | ||
![]() |
d4d06da2f8 | ||
![]() |
efde78db77 | ||
![]() |
f1b8bcd6b2 | ||
![]() |
c2bc3704e1 | ||
![]() |
def120aca4 | ||
![]() |
6d2b09ac2b | ||
![]() |
78b43a9930 | ||
![]() |
da5ff779c6 | ||
![]() |
e7da5b104d | ||
![]() |
4be76f3c8f | ||
![]() |
c58c53293c | ||
![]() |
8695a2806a | ||
![]() |
a59f1b21a6 | ||
![]() |
9e2d09dabc | ||
![]() |
2719f62feb | ||
![]() |
234cedd6c6 | ||
![]() |
5b946e9d95 | ||
![]() |
b46ca50dcc | ||
![]() |
a0d76c3be9 | ||
![]() |
995aafe9cc | ||
![]() |
6e33566cee | ||
![]() |
3b3c1d466d | ||
![]() |
056ab199ab | ||
![]() |
eea0e084af | ||
![]() |
fa82f558be | ||
![]() |
6b555b7017 | ||
![]() |
dafba203e7 | ||
![]() |
a5d382348e | ||
![]() |
74396448df | ||
![]() |
168d6257b4 | ||
![]() |
1afa33c3c7 | ||
![]() |
3a7c9c7c84 | ||
![]() |
6d08e761c8 | ||
![]() |
fee282f49c | ||
![]() |
07d2bc6898 | ||
![]() |
9551166f27 | ||
![]() |
2a8c420cff | ||
![]() |
ec1e04a65d | ||
![]() |
97a2122f41 | ||
![]() |
3825175bfc | ||
![]() |
68f4be323c | ||
![]() |
4949cd98f3 | ||
![]() |
a14ce4c7cb | ||
![]() |
85a5b7dec4 | ||
![]() |
153d464ce8 | ||
![]() |
83391e2bd9 | ||
![]() |
ec0d3ac95d | ||
![]() |
e99f6b5b38 | ||
![]() |
74b2fc7fdc | ||
![]() |
216f62ea14 | ||
![]() |
b7d0001390 | ||
![]() |
687788e4d3 | ||
![]() |
5348f8c9c8 | ||
![]() |
5a4ebf8291 | ||
![]() |
7ae3664c91 | ||
![]() |
1caed3e390 | ||
![]() |
7adb907a55 | ||
![]() |
af2896547a | ||
![]() |
d9583faf06 | ||
![]() |
2788cf9330 | ||
![]() |
92bfdffa42 | ||
![]() |
38b41fc3fd | ||
![]() |
394f69bee1 | ||
![]() |
ba5531f9dd | ||
![]() |
60d19b2380 | ||
![]() |
004d6a3b66 | ||
![]() |
3e79e62c17 | ||
![]() |
27b69330f4 | ||
![]() |
6b50b67339 | ||
![]() |
51ca775a1c | ||
![]() |
1092882f38 | ||
![]() |
8a7986c3bf | ||
![]() |
c7bd8c663d | ||
![]() |
f6c65cba58 | ||
![]() |
f849b07766 | ||
![]() |
2da3cff1e8 | ||
![]() |
0c965d0573 | ||
![]() |
77c14692c9 | ||
![]() |
226eb26300 | ||
![]() |
2d606fa989 | ||
![]() |
7a0342c8bb | ||
![]() |
42c9d765cf | ||
![]() |
a8a80ee689 | ||
![]() |
f9bdb4b0b8 | ||
![]() |
9332527872 | ||
![]() |
84f772357e | ||
![]() |
f2b9785a67 | ||
![]() |
eeaec99c59 | ||
![]() |
b0002e3b73 | ||
![]() |
27c589da97 | ||
![]() |
6484af472b | ||
![]() |
92a218b7a9 | ||
![]() |
d69a1f98af | ||
![]() |
23a6f62ea3 | ||
![]() |
e0d3ca71b3 | ||
![]() |
4f40b9f7cf | ||
![]() |
bb009daf66 | ||
![]() |
dc432f3ffa | ||
![]() |
37710195ca | ||
![]() |
7b9295ff99 | ||
![]() |
5f61d440eb | ||
![]() |
6bc73a9ebe | ||
![]() |
1195eb266e | ||
![]() |
3562a3e51e | ||
![]() |
bbfa6fe632 | ||
![]() |
bf97d13d0b | ||
![]() |
b5673b6333 | ||
![]() |
ee802867df | ||
![]() |
ecaa51e322 | ||
![]() |
0779333064 | ||
![]() |
6f1a4a73b7 | ||
![]() |
945ed2610a | ||
![]() |
d7fcaf33b9 | ||
![]() |
6a65b4c305 | ||
![]() |
a163beee69 | ||
![]() |
31268ad7cd | ||
![]() |
a0d43dd87f | ||
![]() |
1db533c8cf | ||
![]() |
78ee663660 | ||
![]() |
c32a809d38 | ||
![]() |
1406144210 | ||
![]() |
bb6ab67175 | ||
![]() |
ed3d8222d6 | ||
![]() |
41c0bbab13 | ||
![]() |
eeb96eb367 | ||
![]() |
ce93e58944 | ||
![]() |
263b0ffdbb | ||
![]() |
22bea5c97e | ||
![]() |
75802ebcc6 | ||
![]() |
27cc7b352d | ||
![]() |
d64729065e | ||
![]() |
ab318200db | ||
![]() |
947856ca8e | ||
![]() |
cd9ff9d9b0 | ||
![]() |
4cd0f661d6 | ||
![]() |
bf270a5663 | ||
![]() |
6e893f40e3 | ||
![]() |
7690905503 | ||
![]() |
6f822a6f19 | ||
![]() |
ca0179b2a9 | ||
![]() |
6682cf749f | ||
![]() |
492607ecbe | ||
![]() |
e0c75da266 | ||
![]() |
34bb53a29f | ||
![]() |
cb4fdac469 | ||
![]() |
ac46a84391 | ||
![]() |
dffd5831f8 | ||
![]() |
8358b34efa | ||
![]() |
4484d7a5c2 | ||
![]() |
b80a135cf3 | ||
![]() |
4ad525d939 | ||
![]() |
4cb5e69811 | ||
![]() |
b0596291a8 | ||
![]() |
8f0a1a5d82 | ||
![]() |
c0775d328c | ||
![]() |
4ca2c33181 | ||
![]() |
362f391b76 | ||
![]() |
980e32f69c | ||
![]() |
dd639e18b8 | ||
![]() |
c883f178b8 | ||
![]() |
65d257675f |
.travis.ymlAUTHORSNEWSREADME.md
android
doc
conf.pydeveloper.rstmeson.buildmpd.1.rstmpd.conf.5.rstmpdconf.exampleplugins.rstprotocol.rstuser.rst
meson.buildmeson_options.txtpython/build
src
BulkEdit.hxxChrono.hxxCommandLine.cxxCommandLine.hxxGitVersion.cxxGitVersion.hxxIcyMetaDataParser.cxxIcyMetaDataParser.hxxIdle.cxxIdle.hxxIdleFlags.cxxIdleFlags.hxxInstance.cxxInstance.hxxListen.cxxListen.hxxLocateUri.cxxLocateUri.hxxLog.cxxLog.hxxLogBackend.cxxLogBackend.hxxLogInit.cxxLogInit.hxxLogLevel.hxxLogV.hxxMain.cxxMain.hxxMapper.cxxMapper.hxxMixRampInfo.hxxMusicBuffer.cxxMusicBuffer.hxxMusicChunk.cxxMusicChunk.hxxMusicChunkPtr.cxxMusicChunkPtr.hxxMusicPipe.cxxMusicPipe.hxxPartition.cxxPartition.hxxPermission.cxxPermission.hxxPlaylistDatabase.cxxPlaylistDatabase.hxxPlaylistError.cxxPlaylistError.hxxPlaylistFile.cxxPlaylistFile.hxxPlaylistPrint.cxxPlaylistPrint.hxxPlaylistSave.cxxPlaylistSave.hxxPluginUnavailable.hxxRemoteTagCache.cxxRemoteTagCache.hxxRemoteTagCacheHandler.hxxReplayGainConfig.hxxReplayGainGlobal.cxxReplayGainGlobal.hxxReplayGainInfo.cxxReplayGainInfo.hxxReplayGainMode.cxxReplayGainMode.hxxSingleMode.cxxSingleMode.hxxSongLoader.cxxSongLoader.hxxSongPrint.cxxSongPrint.hxxSongSave.cxxSongSave.hxxSongUpdate.cxxStateFile.cxxStateFile.hxxStateFileConfig.cxxStateFileConfig.hxxStats.cxxStats.hxxTagAny.cxxTagAny.hxxTagArchive.cxxTagArchive.hxxTagFile.cxxTagFile.hxxTagPrint.cxxTagPrint.hxxTagSave.cxxTagSave.hxxTagStream.cxxTagStream.hxxTimePrint.cxxTimePrint.hxxls.cxxls.hxx
android
AudioManager.cxxAudioManager.hxxContext.cxxContext.hxxEnvironment.cxxEnvironment.hxxLogListener.cxxLogListener.hxx
archive
ArchiveFile.hxxArchiveList.cxxArchiveList.hxxArchivePlugin.cxxArchivePlugin.hxxArchiveVisitor.hxx
plugins
client
BackgroundCommand.hxxClient.cxxClient.hxxConfig.cxxConfig.hxxDomain.cxxDomain.hxxEvent.cxxExpire.cxxFile.cxxIdle.cxxList.cxxList.hxxListener.cxxListener.hxxMessage.cxxMessage.hxxNew.cxxProcess.cxxRead.cxxResponse.cxxResponse.hxxSubscribe.cxxThreadBackgroundCommand.cxxThreadBackgroundCommand.hxxWrite.cxx
command
AllCommands.cxxAllCommands.hxxClientCommands.cxxClientCommands.hxxCommandError.cxxCommandError.hxxCommandListBuilder.cxxCommandListBuilder.hxxCommandResult.hxxDatabaseCommands.cxxDatabaseCommands.hxxFileCommands.cxxFileCommands.hxxFingerprintCommands.cxxFingerprintCommands.hxxMessageCommands.cxxMessageCommands.hxxNeighborCommands.cxxNeighborCommands.hxxOtherCommands.cxxOtherCommands.hxxOutputCommands.cxxOutputCommands.hxxPartitionCommands.cxxPartitionCommands.hxxPlayerCommands.cxxPlayerCommands.hxxPlaylistCommands.cxxPlaylistCommands.hxxQueueCommands.cxxQueueCommands.hxxRequest.hxxStickerCommands.cxxStickerCommands.hxxStorageCommands.cxxStorageCommands.hxxTagCommands.cxxTagCommands.hxx
config
Block.cxxBlock.hxxCheck.cxxCheck.hxxData.cxxData.hxxDefaults.hxxDomain.cxxDomain.hxxFile.cxxFile.hxxMigrate.cxxMigrate.hxxNet.cxxNet.hxxOption.hxxParam.cxxParam.hxxParser.cxxParser.hxxPath.cxxPath.hxxTemplates.cxxTemplates.hxx
db
Configured.cxxConfigured.hxxCount.cxxCount.hxxDatabaseError.hxxDatabaseGlue.cxxDatabaseGlue.hxxDatabaseListener.hxxDatabaseLock.cxxDatabaseLock.hxxDatabasePlaylist.cxxDatabasePlaylist.hxxDatabasePlugin.hxxDatabasePrint.cxxDatabasePrint.hxxDatabaseQueue.cxxDatabaseQueue.hxxDatabaseSong.cxxDatabaseSong.hxxHelpers.cxxHelpers.hxxInterface.hxxLightDirectory.hxxPlaylistInfo.hxxPlaylistVector.cxxPlaylistVector.hxxPtr.hxxRegistry.cxxRegistry.hxxSelection.cxxSelection.hxxStats.hxxUniqueTags.cxxUniqueTags.hxxUri.hxxVHelper.cxxVHelper.hxxVisitor.hxxmeson.build
plugins
ProxyDatabasePlugin.cxxProxyDatabasePlugin.hxx
simple
DatabaseSave.cxxDatabaseSave.hxxDirectory.cxxDirectory.hxxDirectorySave.cxxDirectorySave.hxxExportedSong.hxxMount.cxxMount.hxxPrefixedLightSong.hxxPtr.hxxSimpleDatabasePlugin.cxxSimpleDatabasePlugin.hxxSong.cxxSong.hxxSongSort.cxxSongSort.hxx
upnp
update
Archive.cxxConfig.cxxConfig.hxxContainer.cxxEditor.cxxEditor.hxxExcludeList.cxxExcludeList.hxxInotifyDomain.cxxInotifyDomain.hxxInotifyQueue.cxxInotifyQueue.hxxInotifySource.cxxInotifySource.hxxInotifyUpdate.cxxInotifyUpdate.hxxPlaylist.cxxQueue.cxxQueue.hxxRemove.cxxRemove.hxxService.cxxService.hxxSpecialDirectory.cxxUpdateDomain.cxxUpdateDomain.hxxUpdateIO.cxxUpdateIO.hxxUpdateSong.cxxVirtualDirectory.cxxWalk.cxxWalk.hxx
decoder
Bridge.cxxBridge.hxxClient.hxxCommand.hxxControl.cxxControl.hxxDecoderAPI.cxxDecoderAPI.hxxDecoderBuffer.cxxDecoderBuffer.hxxDecoderList.cxxDecoderList.hxxDecoderPlugin.cxxDecoderPlugin.hxxDecoderPrint.cxxDecoderPrint.hxxDomain.cxxDomain.hxxReader.cxxReader.hxxThread.cxx
plugins
AdPlugDecoderPlugin.cxxAdPlugDecoderPlugin.hAudiofileDecoderPlugin.cxxAudiofileDecoderPlugin.hxxDsdLib.cxxDsdLib.hxxDsdiffDecoderPlugin.cxxDsdiffDecoderPlugin.hxxDsfDecoderPlugin.cxxDsfDecoderPlugin.hxxFaadDecoderPlugin.cxxFaadDecoderPlugin.hxxFfmpegDecoderPlugin.cxxFfmpegDecoderPlugin.hxxFfmpegIo.cxxFfmpegIo.hxxFfmpegMetaData.cxxFfmpegMetaData.hxxFlacCommon.cxxFlacCommon.hxxFlacDecoderPlugin.cxxFlacDecoderPlugin.hFlacDomain.cxxFlacDomain.hxxFlacInput.cxxFlacInput.hxxFlacPcm.cxxFlacPcm.hxxFlacStreamDecoder.hxxFluidsynthDecoderPlugin.cxxFluidsynthDecoderPlugin.hxxGmeDecoderPlugin.cxxGmeDecoderPlugin.hxxHybridDsdDecoderPlugin.cxxHybridDsdDecoderPlugin.hxxMadDecoderPlugin.cxxMadDecoderPlugin.hxxMikmodDecoderPlugin.cxxMikmodDecoderPlugin.hxxModplugDecoderPlugin.cxxModplugDecoderPlugin.hxxMpcdecDecoderPlugin.cxxMpcdecDecoderPlugin.hxxMpg123DecoderPlugin.cxxMpg123DecoderPlugin.hxxOggCodec.cxxOggCodec.hxxOggDecoder.cxxOggDecoder.hxxOpusDecoderPlugin.cxxOpusDecoderPlugin.hOpusDomain.cxxOpusDomain.hxxOpusHead.cxxOpusHead.hxxOpusReader.hxxOpusTags.cxxOpusTags.hxxPcmDecoderPlugin.cxxPcmDecoderPlugin.hxxSidplayDecoderPlugin.cxxSidplayDecoderPlugin.hxxSndfileDecoderPlugin.cxxSndfileDecoderPlugin.hxxVorbisDecoderPlugin.cxxVorbisDecoderPlugin.hVorbisDomain.cxxVorbisDomain.hxxWavpackDecoderPlugin.cxxWavpackDecoderPlugin.hxxWildmidiDecoderPlugin.cxxWildmidiDecoderPlugin.hxx
encoder
Configured.cxxConfigured.hxxEncoderAPI.hxxEncoderInterface.hxxEncoderList.cxxEncoderList.hxxEncoderPlugin.hxxToOutputStream.cxxToOutputStream.hxx
plugins
FlacEncoderPlugin.cxxFlacEncoderPlugin.hxxLameEncoderPlugin.cxxLameEncoderPlugin.hxxNullEncoderPlugin.cxxNullEncoderPlugin.hxxOggEncoder.hxxOpusEncoderPlugin.cxxOpusEncoderPlugin.hxxShineEncoderPlugin.cxxShineEncoderPlugin.hxxTwolameEncoderPlugin.cxxTwolameEncoderPlugin.hxxVorbisEncoderPlugin.cxxVorbisEncoderPlugin.hxxWaveEncoderPlugin.cxxWaveEncoderPlugin.hxx
event
BufferedSocket.cxxBufferedSocket.hxxCall.cxxCall.hxxChrono.hxxDeferEvent.cxxDeferEvent.hxxFullyBufferedSocket.cxxFullyBufferedSocket.hxxIdleMonitor.cxxIdleMonitor.hxxLoop.cxxLoop.hxxMaskMonitor.cxxMaskMonitor.hxxMultiSocketMonitor.cxxMultiSocketMonitor.hxxPollGroup.hxxPollGroupEpoll.hxxPollGroupPoll.cxxPollGroupPoll.hxxPollGroupWinSelect.cxxPollGroupWinSelect.hxxPollResultGeneric.hxxServerSocket.cxxServerSocket.hxxSignalMonitor.cxxSignalMonitor.hxxSocketMonitor.cxxSocketMonitor.hxxThread.cxxThread.hxxTimerEvent.cxxTimerEvent.hxxUringManager.cxxUringManager.hxxWakeFD.hxx
filter
Factory.cxxFactory.hxxFilter.cxxFilter.hxxFilterPlugin.hxxLoadChain.cxxLoadChain.hxxLoadOne.cxxLoadOne.hxxNullFilter.hxxObserver.cxxObserver.hxxPrepared.hxxRegistry.cxxRegistry.hxx
plugins
AutoConvertFilterPlugin.cxxAutoConvertFilterPlugin.hxxChainFilterPlugin.cxxChainFilterPlugin.hxxConvertFilterPlugin.cxxConvertFilterPlugin.hxxFfmpegFilter.cxxFfmpegFilter.hxxFfmpegFilterPlugin.cxxFfmpegFilterPlugin.hxxHdcdFilterPlugin.cxxHdcdFilterPlugin.hxxNormalizeFilterPlugin.cxxNormalizeFilterPlugin.hxxNullFilterPlugin.cxxNullFilterPlugin.hxxReplayGainFilterPlugin.cxxReplayGainFilterPlugin.hxxRouteFilterPlugin.cxxRouteFilterPlugin.hxxTwoFilters.cxxTwoFilters.hxxVolumeFilterPlugin.cxxVolumeFilterPlugin.hxxmeson.build
fs
AllocatedPath.cxxAllocatedPath.hxxCharset.cxxCharset.hxxCheckFile.cxxCheckFile.hxxConfig.cxxConfig.hxxDirectoryReader.cxxDirectoryReader.hxxDomain.cxxDomain.hxxFeatures.hxxFileInfo.hxxFileSystem.cxxFileSystem.hxxGlob.cxxGlob.hxxLimits.hxxList.cxxList.hxxLookupFile.cxxLookupFile.hxxNarrowPath.cxxNarrowPath.hxxPath.cxxPath.hxxPath2.cxxStandardDirectory.cxxStandardDirectory.hxxTraits.cxxTraits.hxxXDG.hxx
io
AutoGunzipReader.cxxAutoGunzipReader.hxxFileOutputStream.hxxFileReader.hxxPeekReader.cxxPeekReader.hxxTextFile.cxxTextFile.hxx
meson.buildinput
AsyncInputStream.cxxAsyncInputStream.hxxBufferedInputStream.cxxBufferedInputStream.hxxBufferingInputStream.cxxBufferingInputStream.hxxCondHandler.hxxError.cxxError.hxxFailingInputStream.hxxHandler.hxxIcyInputStream.cxxIcyInputStream.hxxInit.cxxInit.hxxInputPlugin.cxxInputPlugin.hxxInputStream.cxxInputStream.hxxLastInputStream.cxxLastInputStream.hxxLocalOpen.cxxLocalOpen.hxxMaybeBufferedInputStream.cxxMaybeBufferedInputStream.hxxOffset.hxxOpen.cxxProxyInputStream.cxxProxyInputStream.hxxPtr.hxxReader.cxxReader.hxxRegistry.cxxRegistry.hxxRemoteTagScanner.hxxRewindInputStream.cxxRewindInputStream.hxxScanTags.cxxScanTags.hxxTextInputStream.cxxTextInputStream.hxxThreadInputStream.cxxThreadInputStream.hxx
cache
meson.buildplugins
AlsaInputPlugin.cxxAlsaInputPlugin.hxxArchiveInputPlugin.cxxArchiveInputPlugin.hxxCdioParanoiaInputPlugin.cxxCdioParanoiaInputPlugin.hxxCurlInputPlugin.cxxCurlInputPlugin.hxxFfmpegInputPlugin.cxxFfmpegInputPlugin.hxxFileInputPlugin.cxxFileInputPlugin.hxxMmsInputPlugin.cxxMmsInputPlugin.hxxNfsInputPlugin.cxxNfsInputPlugin.hxxQobuzClient.cxxQobuzClient.hxxQobuzErrorParser.cxxQobuzErrorParser.hxxQobuzInputPlugin.cxxQobuzInputPlugin.hxxQobuzLoginRequest.cxxQobuzLoginRequest.hxxQobuzSession.hxxQobuzTagScanner.cxxQobuzTagScanner.hxxQobuzTrackRequest.cxxQobuzTrackRequest.hxxSmbclientInputPlugin.cxxSmbclientInputPlugin.hxxTidalError.hxxTidalErrorParser.cxxTidalErrorParser.hxxTidalInputPlugin.cxxTidalInputPlugin.hxxTidalLoginRequest.cxxTidalLoginRequest.hxxTidalSessionManager.cxxTidalSessionManager.hxxTidalTagScanner.cxxTidalTagScanner.hxxTidalTrackRequest.cxxTidalTrackRequest.hxxUringInputPlugin.cxxUringInputPlugin.hxx
io
lib
alsa
AllowedFormat.cxxAllowedFormat.hxxFormat.hxxHwSetup.cxxHwSetup.hxxNonBlock.cxxNonBlock.hxxPeriodBuffer.hxxVersion.cxxVersion.hxx
chromaprint
curl
dbus
expat
ffmpeg
Buffer.hxxCodec.hxxDetectFilterFormat.cxxDetectFilterFormat.hxxDomain.cxxDomain.hxxError.cxxError.hxxFilter.cxxFilter.hxxFormat.hxxFrame.hxxIOContext.hxxInit.cxxInit.hxxInterleave.cxxInterleave.hxxLogCallback.cxxLogCallback.hxxLogError.cxxLogError.hxxSampleFormat.hxxTime.hxxmeson.build
icu
CaseFold.cxxCaseFold.hxxCollate.cxxCollate.hxxCompare.cxxCompare.hxxConverter.cxxConverter.hxxInit.cxxInit.hxxUtil.cxxUtil.hxxWin32.cxxWin32.hxx
jack
nfs
Base.cxxBase.hxxBlocking.cxxBlocking.hxxCallback.hxxCancellable.hxxConnection.cxxConnection.hxxFileReader.cxxFileReader.hxxGlue.cxxGlue.hxxLease.hxxManager.cxxManager.hxx
patches
pcre
pulse
smbclient
sqlite
systemd
upnp
Action.hxxCallback.hxxClientInit.cxxClientInit.hxxCompat.hxxContentDirectoryService.cxxContentDirectoryService.hxxDevice.cxxDevice.hxxDiscovery.cxxDiscovery.hxxInit.cxxInit.hxxUniqueIxml.hxxUtil.cxxUtil.hxx
xiph
FlacAudioFormat.hxxFlacIOHandle.cxxFlacIOHandle.hxxFlacMetadataChain.cxxFlacMetadataChain.hxxFlacMetadataIterator.hxxFlacStreamMetadata.cxxFlacStreamMetadata.hxxOggFind.cxxOggFind.hxxOggPacket.cxxOggPacket.hxxOggPage.hxxOggSerial.cxxOggSerial.hxxOggStreamState.hxxOggSyncState.cxxOggSyncState.hxxOggVisitor.cxxOggVisitor.hxxScanVorbisComment.cxxScanVorbisComment.hxxVorbisComment.hxxVorbisComments.cxxVorbisComments.hxxVorbisPicture.cxxVorbisPicture.hxxXiphTags.cxxXiphTags.hxx
yajl
mixer
Listener.hxxMixerAll.cxxMixerControl.cxxMixerControl.hxxMixerInternal.hxxMixerList.hxxMixerPlugin.hxxMixerType.cxxMixerType.hxxVolume.cxxVolume.hxx
plugins
neighbor
net
open.houtput
Client.hxxControl.cxxControl.hxxDefaults.cxxDefaults.hxxDomain.cxxDomain.hxxError.hxxFiltered.cxxFiltered.hxxFinish.cxxInit.cxxInterface.cxxInterface.hxxMultipleOutputs.cxxMultipleOutputs.hxxOutputAPI.hxxOutputCommand.cxxOutputCommand.hxxOutputPlugin.cxxOutputPlugin.hxxPrint.cxxPrint.hxxRegistry.cxxRegistry.hxxSharedPipeConsumer.cxxSharedPipeConsumer.hxxSource.cxxSource.hxxState.cxxState.hxxThread.cxxTimer.cxxTimer.hxx
plugins
AlsaOutputPlugin.cxxAlsaOutputPlugin.hxxAoOutputPlugin.cxxAoOutputPlugin.hxxFifoOutputPlugin.cxxFifoOutputPlugin.hxxHaikuOutputPlugin.cxxHaikuOutputPlugin.hxxJackOutputPlugin.cxxJackOutputPlugin.hxxNullOutputPlugin.cxxNullOutputPlugin.hxxOSXOutputPlugin.cxxOSXOutputPlugin.hxxOpenALOutputPlugin.cxxOpenALOutputPlugin.hxxOssOutputPlugin.cxxOssOutputPlugin.hxxPipeOutputPlugin.cxxPipeOutputPlugin.hxxPulseOutputPlugin.cxxPulseOutputPlugin.hxxRecorderOutputPlugin.cxxRecorderOutputPlugin.hxxShoutOutputPlugin.cxxShoutOutputPlugin.hxxSndioOutputPlugin.cxxSndioOutputPlugin.hxxSolarisOutputPlugin.cxxSolarisOutputPlugin.hxxWasapiOutputPlugin.cxxWinmmOutputPlugin.cxxWinmmOutputPlugin.hxx
httpd
HttpdClient.cxxHttpdClient.hxxHttpdInternal.hxxHttpdOutputPlugin.cxxHttpdOutputPlugin.hxxIcyMetaDataServer.cxxIcyMetaDataServer.hxxPage.cxxPage.hxx
meson.buildsles
wasapi
pcm
AudioFormat.cxxAudioFormat.hxxAudioParser.cxxAudioParser.hxxBuffer.cxxBuffer.hxxChannelDefs.hxxChannelsConverter.cxxChannelsConverter.hxxCheckAudioFormat.cxxCheckAudioFormat.hxxClamp.hxxConfiguredResampler.cxxConfiguredResampler.hxxConvert.cxxConvert.hxxDither.cxxDither.hxxDop.cxxDop.hxxDsd16.cxxDsd16.hxxDsd32.cxxDsd32.hxxExport.cxxExport.hxxFallbackResampler.cxxFallbackResampler.hxxFloatConvert.hxxFormatConverter.cxxFormatConverter.hxxGlueResampler.cxxGlueResampler.hxxInterleave.cxxInterleave.hxxLibsamplerateResampler.cxxLibsamplerateResampler.hxxMix.cxxMix.hxxNeon.hxxOrder.cxxOrder.hxxPack.cxxPack.hxxPcmChannels.cxxPcmChannels.hxxPcmDsd.cxxPcmDsd.hxxPcmFormat.cxxPcmFormat.hxxPrng.hxxResampler.hxxRestBuffer.hxxSampleFormat.cxxSampleFormat.hxxShiftConvert.hxxSilence.cxxSilence.hxxSoxrResampler.cxxSoxrResampler.hxxTraits.hxxVolume.cxxVolume.hxx
player
playlist
MemorySongEnumerator.cxxMemorySongEnumerator.hxxPlaylistAny.cxxPlaylistAny.hxxPlaylistMapper.cxxPlaylistMapper.hxxPlaylistPlugin.cxxPlaylistPlugin.hxxPlaylistQueue.cxxPlaylistQueue.hxxPlaylistRegistry.cxxPlaylistRegistry.hxxPlaylistSong.cxxPlaylistSong.hxxPlaylistStream.cxxPlaylistStream.hxxPrint.cxxPrint.hxxSongEnumerator.hxx
cue
plugins
AsxPlaylistPlugin.cxxAsxPlaylistPlugin.hxxCuePlaylistPlugin.cxxCuePlaylistPlugin.hxxEmbeddedCuePlaylistPlugin.cxxEmbeddedCuePlaylistPlugin.hxxExtM3uPlaylistPlugin.cxxExtM3uPlaylistPlugin.hxxFlacPlaylistPlugin.cxxFlacPlaylistPlugin.hxxM3uPlaylistPlugin.cxxM3uPlaylistPlugin.hxxPlsPlaylistPlugin.cxxPlsPlaylistPlugin.hxxRssPlaylistPlugin.cxxRssPlaylistPlugin.hxxSoundCloudPlaylistPlugin.cxxSoundCloudPlaylistPlugin.hxxXspfPlaylistPlugin.cxxXspfPlaylistPlugin.hxx
protocol
queue
IdTable.hxxListener.hxxPlaylist.cxxPlaylist.hxxPlaylistControl.cxxPlaylistEdit.cxxPlaylistState.cxxPlaylistState.hxxPlaylistTag.cxxPlaylistUpdate.cxxQueue.cxxQueue.hxxQueuePrint.cxxQueuePrint.hxxQueueSave.cxxQueueSave.hxx
song
AndSongFilter.cxxAndSongFilter.hxxAudioFormatSongFilter.cxxAudioFormatSongFilter.hxxBaseSongFilter.cxxBaseSongFilter.hxxDetachedSong.cxxDetachedSong.hxxEscape.cxxEscape.hxxFilter.cxxFilter.hxxISongFilter.hxxLightSong.cxxLightSong.hxxModifiedSinceSongFilter.cxxModifiedSinceSongFilter.hxxNotSongFilter.hxxOptimizeFilter.cxxOptimizeFilter.hxxStringFilter.cxxStringFilter.hxxTagSongFilter.cxxTagSongFilter.hxxUriSongFilter.cxxUriSongFilter.hxx
sticker
storage
CompositeStorage.cxxCompositeStorage.hxxConfigured.cxxConfigured.hxxFileInfo.hxxMemoryDirectoryReader.cxxMemoryDirectoryReader.hxxRegistry.cxxRegistry.hxxStorageInterface.cxxStorageInterface.hxxStoragePlugin.hxxStorageState.cxxStorageState.hxx
plugins
system
tag
Aiff.cxxAiff.hxxApeLoader.cxxApeLoader.hxxApeReplayGain.cxxApeReplayGain.hxxApeTag.cxxApeTag.hxxBuilder.cxxBuilder.hxxConfig.cxxConfig.hxxFallback.hxxFixString.cxxFixString.hxxFormat.cxxFormat.hxxGenParseName.cxxGeneric.cxxGeneric.hxxHandler.cxxHandler.hxxId3Load.cxxId3Load.hxxId3MusicBrainz.cxxId3MusicBrainz.hxxId3Picture.cxxId3Picture.hxxId3ReplayGain.cxxId3ReplayGain.hxxId3Scan.cxxId3Scan.hxxId3Unique.hxxItem.hxxMask.hxxMixRamp.cxxMixRamp.hxxNames.cParseName.cxxParseName.hxxPool.cxxPool.hxxReplayGain.cxxReplayGain.hxxRiff.cxxRiff.hxxRva2.cxxRva2.hxxSettings.cxxSettings.hxxTable.cxxTable.hxxTag.cxxTag.hxxType.hVisitFallback.hxxVorbisComment.cxxVorbisComment.hxx
thread
CriticalSection.hxxFuture.hxxId.hxxName.hxxSafeSingleton.hxxSlack.hxxThread.cxxThread.hxxWindowsCond.hxxWindowsFuture.hxx
time
unix
util
Alloc.cxxAlloc.hxxAllocatedString.hxxBitReverse.cxxBitReverse.hxxByteReverse.cxxByteReverse.hxxCompiler.hDivideString.cxxDivideString.hxxForeignFifoBuffer.hxxFormatString.cxxFormatString.hxxHugeAllocator.hxxLazyRandomEngine.cxxLazyRandomEngine.hxxMimeType.cxxMimeType.hxxOptionDef.hxxOptionParser.cxxOptionParser.hxxPeakBuffer.cxxPeakBuffer.hxxRuntimeError.hxxSliceBuffer.hxxStringUtil.cxxStringUtil.hxxStringView.hxxUriExtract.cxxUriExtract.hxxformat.cformat.h
win32
Com.hxxComHeapPtr.hxxComPtr.hxxComWorker.cxxComWorker.hxxHResult.cxxHResult.hxxPropVariant.cxxPropVariant.hxxWin32Main.cxxWinEvent.cxxWinEvent.hxxmeson.build
zeroconf
subprojects
test
ConfigGlue.hxxContainerScan.cxxDumpDatabase.cxxDumpDecoderClient.cxxDumpDecoderClient.hxxMakeTag.hxxNullMixerListener.hxxParseSongFilter.cxxReadApeTags.cxxRunChromaprint.cxxRunCurl.cxxShutdownHandler.cxxShutdownHandler.hxxTestAudioFormat.cxxTestLookupFile.cxxTestTagSongFilter.cxxWriteFile.cxxdump_playlist.cxxdump_rva2.cxxdump_text_file.cxx
fuzzer
meson.buildread_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_byte_reverse.cxxtest_mixramp.cxxtest_pcm_channels.cxxtest_pcm_dither.cxxtest_pcm_export.cxxtest_pcm_format.cxxtest_pcm_interleave.cxxtest_pcm_mix.cxxtest_pcm_pack.cxxtest_pcm_util.hxxtest_pcm_volume.cxxtest_vorbis_encoder.cxxvisit_archive.cxxwin32
64
.travis.yml
64
.travis.yml
@@ -2,70 +2,37 @@ language: cpp
|
||||
|
||||
jobs:
|
||||
include:
|
||||
# Ubuntu Bionic (18.04) with GCC 7
|
||||
# Ubuntu Focal (20.04) with GCC 9.3
|
||||
- os: linux
|
||||
dist: bionic
|
||||
dist: focal
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- sourceline: 'ppa:deadsnakes/ppa' # for Python 3.7 (required by Meson)
|
||||
packages:
|
||||
- meson
|
||||
- libgtest-dev
|
||||
- libboost-dev
|
||||
- python3.6
|
||||
- python3-urllib3
|
||||
- ninja-build
|
||||
before_install:
|
||||
- wget https://bootstrap.pypa.io/get-pip.py
|
||||
- /usr/bin/python3.6 get-pip.py --user --no-cache-dir
|
||||
install:
|
||||
- /usr/bin/python3.6 $HOME/.local/bin/pip install --user meson --no-cache-dir
|
||||
env:
|
||||
- MATRIX_EVAL="export PATH=\$HOME/.local/bin:\$PATH"
|
||||
|
||||
# Ubuntu Bionic (18.04) with GCC 7 on big-endian
|
||||
# Ubuntu Focal (20.04) with GCC 9.3 on big-endian
|
||||
- os: linux
|
||||
arch: s390x
|
||||
dist: bionic
|
||||
dist: focal
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- sourceline: 'ppa:deadsnakes/ppa' # for Python 3.7 (required by Meson)
|
||||
packages:
|
||||
- meson
|
||||
- libgtest-dev
|
||||
- libboost-dev
|
||||
- python3.6
|
||||
- python3-urllib3
|
||||
- ninja-build
|
||||
before_install:
|
||||
- wget https://bootstrap.pypa.io/get-pip.py
|
||||
- /usr/bin/python3.6 get-pip.py --user --no-cache-dir
|
||||
install:
|
||||
- /usr/bin/python3.6 $HOME/.local/bin/pip install --user meson --no-cache-dir
|
||||
env:
|
||||
- MATRIX_EVAL="export PATH=\$HOME/.local/bin:\$PATH"
|
||||
|
||||
# Ubuntu Bionic (18.04) with GCC 7 on ARM64
|
||||
# Ubuntu Focal (20.04) with GCC 9.3 on ARM64
|
||||
- os: linux
|
||||
arch: arm64
|
||||
dist: bionic
|
||||
dist: focal
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- sourceline: 'ppa:deadsnakes/ppa' # for Python 3.7 (required by Meson)
|
||||
packages:
|
||||
- meson
|
||||
- libgtest-dev
|
||||
- libboost-dev
|
||||
- python3.6
|
||||
- python3-urllib3
|
||||
- ninja-build
|
||||
before_install:
|
||||
- wget https://bootstrap.pypa.io/get-pip.py
|
||||
- /usr/bin/python3.6 get-pip.py --user --no-cache-dir
|
||||
install:
|
||||
- /usr/bin/python3.6 $HOME/.local/bin/pip install --user meson --no-cache-dir
|
||||
env:
|
||||
- MATRIX_EVAL="export PATH=\$HOME/.local/bin:\$PATH"
|
||||
|
||||
# Ubuntu Trusty (16.04) with GCC 8
|
||||
- os: linux
|
||||
@@ -75,7 +42,7 @@ jobs:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- sourceline: 'ppa:mhier/libboost-latest'
|
||||
- sourceline: 'ppa:mstipicevic/ninja-build-1-7-2'
|
||||
- sourceline: 'ppa:ricotz/toolchain'
|
||||
- sourceline: 'ppa:deadsnakes/ppa' # for Python 3.7 (required by Meson)
|
||||
packages:
|
||||
- g++-8
|
||||
@@ -94,12 +61,13 @@ jobs:
|
||||
- MATRIX_EVAL="export CC='ccache gcc-8' CXX='ccache g++-8' LDFLAGS=-fuse-ld=gold PATH=\$HOME/.local/bin:\$PATH"
|
||||
|
||||
- os: osx
|
||||
osx_image: xcode10.3
|
||||
osx_image: xcode11.6
|
||||
addons:
|
||||
homebrew:
|
||||
packages:
|
||||
- ccache
|
||||
- meson
|
||||
- googletest
|
||||
- icu4c
|
||||
- ffmpeg
|
||||
- libnfs
|
||||
@@ -117,7 +85,6 @@ jobs:
|
||||
- faad2
|
||||
- wavpack
|
||||
- libmpdclient
|
||||
update: true
|
||||
env:
|
||||
- MATRIX_EVAL="export PATH=/usr/local/opt/ccache/libexec:$PATH HOMEBREW_NO_ANALYTICS=1"
|
||||
|
||||
@@ -134,13 +101,6 @@ before_install:
|
||||
- eval "${MATRIX_EVAL}"
|
||||
|
||||
install:
|
||||
# C++14
|
||||
|
||||
# Work around "Target /usr/local/lib/libgtest.a is a symlink
|
||||
# belonging to nss. You can unlink it" during gtest install
|
||||
- test "$TRAVIS_OS_NAME" != "osx" || brew unlink nss
|
||||
|
||||
- test "$TRAVIS_OS_NAME" != "osx" || brew install https://gist.githubusercontent.com/Kronuz/96ac10fbd8472eb1e7566d740c4034f8/raw/gtest.rb
|
||||
|
||||
before_script:
|
||||
- ccache -s
|
||||
|
2
AUTHORS
2
AUTHORS
@@ -1,5 +1,5 @@
|
||||
Music Player Daemon - http://www.musicpd.org
|
||||
Copyright 2003-2020 The Music Player Daemon Project
|
||||
Copyright 2003-2021 The Music Player Daemon Project
|
||||
|
||||
The following people have contributed code to MPD:
|
||||
|
||||
|
106
NEWS
106
NEWS
@@ -1,3 +1,109 @@
|
||||
ver 0.22.9 (2021/06/23)
|
||||
* database
|
||||
- simple: load all .mpdignore files of all parent directories
|
||||
* tags
|
||||
- fix "readcomments" and "readpicture" on remote files with ID3 tags
|
||||
* decoder
|
||||
- ffmpeg: support the tags "sort_album", "album-sort", "artist-sort"
|
||||
- ffmpeg: fix build failure with FFmpeg 3.4
|
||||
* Android
|
||||
- fix auto-start on boot in Android 8 or later
|
||||
* Windows
|
||||
- fix build failure with SQLite
|
||||
|
||||
ver 0.22.8 (2021/05/22)
|
||||
* fix crash bug in "albumart" command (0.22.7 regression)
|
||||
|
||||
ver 0.22.7 (2021/05/19)
|
||||
* protocol
|
||||
- don't use glibc extension to parse time stamps
|
||||
- optimize the "albumart" command
|
||||
* input
|
||||
- curl: send user/password in the first request, save one roundtrip
|
||||
* decoder
|
||||
- ffmpeg: fix build problem with FFmpeg 3.4
|
||||
- gme: support RSN files
|
||||
* storage
|
||||
- curl: don't use glibc extension
|
||||
* database
|
||||
- simple: fix database corruption bug
|
||||
* output
|
||||
- fix crash when pausing with multiple partitions
|
||||
- jack: enable on Windows
|
||||
- httpd: send header "Access-Control-Allow-Origin: *"
|
||||
- wasapi: add algorithm for finding usable audio format
|
||||
- wasapi: use default device only if none was configured
|
||||
- wasapi: add DoP support
|
||||
|
||||
ver 0.22.6 (2021/02/16)
|
||||
* fix missing tags on songs in queue
|
||||
|
||||
ver 0.22.5 (2021/02/15)
|
||||
* protocol
|
||||
- error for malformed ranges instead of ignoring silently
|
||||
- better error message for open-ended range with "move"
|
||||
* database
|
||||
- simple: fix missing CUE sheet metadata in "addid" command
|
||||
* tags
|
||||
- id: translate TPE3 to Conductor, not Performer
|
||||
* archive
|
||||
- iso9660: another fix for unaligned reads
|
||||
* output
|
||||
- httpd: error handling on Windows improved
|
||||
- pulse: fix deadlock with "always_on"
|
||||
* Windows:
|
||||
- enable https:// support (via Schannel)
|
||||
* Android
|
||||
- work around "Permission denied" on mpd.conf
|
||||
|
||||
ver 0.22.4 (2021/01/21)
|
||||
* protocol
|
||||
- add command "binarylimit" to allow larger chunk sizes
|
||||
- fix "readpicture" on 32 bit machines
|
||||
- show duration and tags of songs in virtual playlist (CUE) folders
|
||||
* storage
|
||||
- curl: fix several WebDAV protocol bugs
|
||||
* decoder
|
||||
- dsdiff: apply padding to odd-sized chunks
|
||||
* filter
|
||||
- ffmpeg: detect the output sample format
|
||||
* output
|
||||
- moveoutput: fix always_on and tag lost on move
|
||||
* Android
|
||||
- enable https:// support (via OpenSSL)
|
||||
|
||||
ver 0.22.3 (2020/11/06)
|
||||
* playlist
|
||||
- add option "as_directory", making CUE file expansion optional
|
||||
* storage
|
||||
- curl: fix crash bug
|
||||
* filter
|
||||
- fix garbage after "Audio format not supported by filter" message
|
||||
- ffmpeg: support planar output
|
||||
- ffmpeg: support sample formats other than 16 bit
|
||||
|
||||
ver 0.22.2 (2020/10/28)
|
||||
* database
|
||||
- simple: purge songs and virtual directories for unavailable plugins
|
||||
on update
|
||||
* input
|
||||
- qobuz/tidal: fix protocol errors due to newlines in error messages
|
||||
- smbclient: disable by default due to libsmbclient crash bug
|
||||
* playlist
|
||||
- soundcloud: fix protocol errors due to newlines in error messages
|
||||
* state_file: save on shutdown
|
||||
|
||||
ver 0.22.1 (2020/10/17)
|
||||
* decoder
|
||||
- opus: apply the OpusHead output gain even if there is no EBU R128 tag
|
||||
- opus: fix track/album ReplayGain fallback
|
||||
* output
|
||||
- alsa: don't deadlock when the ALSA driver is buggy
|
||||
- jack, pulse: reduce the delay when stopping or pausing playback
|
||||
* playlist
|
||||
- cue: fix two crash bugs
|
||||
* state_file: fix the state_file_interval setting
|
||||
|
||||
ver 0.22 (2020/09/23)
|
||||
* protocol
|
||||
- "findadd"/"searchadd"/"searchaddpl" support the "sort" and
|
||||
|
@@ -14,7 +14,7 @@ For basic installation instructions
|
||||
|
||||
- [Manual](http://www.musicpd.org/doc/user/)
|
||||
- [Forum](http://forum.musicpd.org/)
|
||||
- [IRC](irc://chat.freenode.net/#mpd)
|
||||
- [IRC](ircs://irc.libera.chat:6697/#mpd)
|
||||
- [Bug tracker](https://github.com/MusicPlayerDaemon/MPD/issues/)
|
||||
|
||||
# Developers
|
||||
|
@@ -2,10 +2,10 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.musicpd"
|
||||
android:installLocation="auto"
|
||||
android:versionCode="50"
|
||||
android:versionName="0.22">
|
||||
android:versionCode="57"
|
||||
android:versionName="0.22.9">
|
||||
|
||||
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28"/>
|
||||
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="29"/>
|
||||
|
||||
<uses-feature android:name="android.software.leanback"
|
||||
android:required="false" />
|
||||
@@ -19,6 +19,7 @@
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
|
||||
<application android:allowBackup="true"
|
||||
android:requestLegacyExternalStorage="true"
|
||||
android:icon="@drawable/icon"
|
||||
android:banner="@drawable/icon"
|
||||
android:label="@string/app_name">
|
||||
|
@@ -103,7 +103,7 @@ class AndroidNdkToolchain:
|
||||
llvm_bin = os.path.join(llvm_path, 'bin')
|
||||
self.cc = os.path.join(llvm_bin, 'clang')
|
||||
self.cxx = os.path.join(llvm_bin, 'clang++')
|
||||
common_flags += ' -target ' + llvm_triple + ' -integrated-as -gcc-toolchain ' + toolchain_path
|
||||
common_flags += ' -target ' + llvm_triple + ' -gcc-toolchain ' + toolchain_path
|
||||
|
||||
common_flags += ' -fvisibility=hidden -fdata-sections -ffunction-sections'
|
||||
|
||||
@@ -172,6 +172,7 @@ thirdparty_libs = [
|
||||
wildmidi,
|
||||
gme,
|
||||
ffmpeg,
|
||||
openssl,
|
||||
curl,
|
||||
libexpat,
|
||||
libnfs,
|
||||
|
@@ -5,8 +5,8 @@ android_ndk = get_option('android_ndk')
|
||||
android_sdk = get_option('android_sdk')
|
||||
android_abi = get_option('android_abi')
|
||||
|
||||
android_sdk_build_tools_version = '27.0.0'
|
||||
android_sdk_platform = 'android-23'
|
||||
android_sdk_build_tools_version = '29.0.3'
|
||||
android_sdk_platform = 'android-29'
|
||||
|
||||
android_build_tools_dir = join_paths(android_sdk, 'build-tools', android_sdk_build_tools_version)
|
||||
android_sdk_platform_dir = join_paths(android_sdk, 'platforms', android_sdk_platform)
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -414,6 +414,15 @@ public class Main extends Service implements Runnable {
|
||||
* start Main service without any callback
|
||||
*/
|
||||
public static void start(Context context, boolean wakelock) {
|
||||
context.startService(new Intent(context, Main.class).putExtra("wakelock", wakelock));
|
||||
Intent intent = new Intent(context, Main.class)
|
||||
.putExtra("wakelock", wakelock);
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
|
||||
/* in Android 8+, we need to use this method
|
||||
or else we'll get "IllegalStateException:
|
||||
app is in background" */
|
||||
context.startForegroundService(intent);
|
||||
else
|
||||
context.startService(intent);
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,5 @@
|
||||
|
||||
/*
|
||||
* Copyright (C) 2003-2014 The Music Player Daemon Project
|
||||
* Copyright (C) 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -38,7 +38,7 @@ author = 'Max Kellermann'
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = '0.22'
|
||||
version = '0.22.9'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = version
|
||||
|
||||
|
@@ -68,11 +68,11 @@ There are two active branches in the git repository:
|
||||
|
||||
- the "unstable" branch called ``master`` where new features are
|
||||
merged. This will become the next major release eventually.
|
||||
- the "stable" branch (currently called ``v0.21.x``) where only bug
|
||||
- the "stable" branch (currently called ``v0.22.x``) where only bug
|
||||
fixes are merged.
|
||||
|
||||
Once :program:`MPD` 0.22 is released, a new branch called ``v0.22.x``
|
||||
will be created for 0.22 bug-fix releases; after that, ``v0.21.x``
|
||||
Once :program:`MPD` 0.23 is released, a new branch called ``v0.23.x``
|
||||
will be created for 0.23 bug-fix releases; after that, ``v0.22.x``
|
||||
will eventually cease to be maintained.
|
||||
|
||||
After bug fixes have been added to the "stable" branch, it will be
|
||||
|
@@ -1,4 +1,4 @@
|
||||
if not get_option('html_manual')
|
||||
if not get_option('html_manual') and not get_option('manpages')
|
||||
subdir_done()
|
||||
endif
|
||||
|
||||
@@ -22,20 +22,6 @@ if get_option('html_manual')
|
||||
install: true,
|
||||
install_dir: join_paths(get_option('datadir'), 'doc', meson.project_name()),
|
||||
)
|
||||
|
||||
custom_target(
|
||||
'upload',
|
||||
input: sphinx_output,
|
||||
output: 'upload',
|
||||
build_always_stale: true,
|
||||
command: [
|
||||
'rsync', '-vpruz', '--delete', meson.current_build_dir() + '/',
|
||||
'www.musicpd.org:/var/www/mpd/doc/',
|
||||
'--chmod=Dug+rwx,Do+rx,Fug+rw,Fo+r',
|
||||
'--include=html', '--include=html/**',
|
||||
'--exclude=*',
|
||||
],
|
||||
)
|
||||
endif
|
||||
|
||||
if get_option('manpages')
|
||||
|
@@ -13,7 +13,7 @@ DESCRIPTION
|
||||
MPD is a daemon for playing music. Music is played through the configured audio output(s) (which are generally local, but can be remote). The daemon stores info about all available music, and this info can be easily searched and retrieved. Player control, info retrieval, and playlist management can all be managed remotely.
|
||||
|
||||
MPD searches for a config file in ``$XDG_CONFIG_HOME/mpd/mpd.conf``
|
||||
then ``~/.mpdconf`` then ``/etc/mpd.conf`` or uses ``CONF_FILE``.
|
||||
then ``~/.mpdconf`` then ``~/.mpd/mpd.conf`` then ``/etc/mpd.conf`` or uses ``CONF_FILE``.
|
||||
|
||||
Read more about MPD at http://www.musicpd.org/
|
||||
|
||||
@@ -53,8 +53,8 @@ OPTIONS
|
||||
FILES
|
||||
-----
|
||||
|
||||
:file:`~/.mpdconf`
|
||||
User configuration file.
|
||||
:file:`$XDG_CONFIG_HOME/mpd/mpd.conf`
|
||||
User configuration file (usually :file:`~/.config/mpd/mpd.conf`).
|
||||
|
||||
:file:`/etc/mpd.conf`
|
||||
Global configuration file.
|
||||
|
@@ -11,24 +11,34 @@ not specified on the command line, MPD first searches for it at
|
||||
:file:`$XDG_CONFIG_HOME/mpd/mpd.conf` then at :file:`~/.mpdconf` then
|
||||
at :file:`~/.mpd/mpd.conf` and then in :file:`/etc/mpd.conf`.
|
||||
|
||||
Lines beginning with a :samp:`#` character are comments. All other
|
||||
non-empty lines specify parameters and their values. These lines
|
||||
contain the parameter name and parameter value (surrounded by double
|
||||
quotes) separated by whitespace (either tabs or spaces). For
|
||||
example::
|
||||
Each line in the configuration file contains a setting name and its value, e.g.:
|
||||
|
||||
parameter "value"
|
||||
:code:`connection_timeout "5"`
|
||||
|
||||
The exception to this rule is the audio_output parameter, which is of
|
||||
the form::
|
||||
For settings which specify a filesystem path, the tilde is expanded:
|
||||
|
||||
:code:`music_directory "~/Music"`
|
||||
|
||||
Some of the settings are grouped in blocks with curly braces, e.g. per-plugin settings:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
audio_output {
|
||||
parameter1 "value"
|
||||
parameter2 "value"
|
||||
type "alsa"
|
||||
name "My ALSA output"
|
||||
device "iec958:CARD=Intel,DEV=0"
|
||||
mixer_control "PCM"
|
||||
}
|
||||
|
||||
The :code:`include` directive can be used to include settings from
|
||||
another file; the given file name is relative to the current file:
|
||||
|
||||
Parameters that take a file or directory as an argument should use absolute paths.
|
||||
:code:`include "other.conf"`
|
||||
|
||||
You can use include_optional instead if you want the included file to be
|
||||
optional; the directive will be ignored if the file does not exist:
|
||||
|
||||
:code:`include_optional "may_not_exist.conf"`
|
||||
|
||||
See :file:`docs/mpdconf.example` in the source tarball for an example
|
||||
configuration file.
|
||||
@@ -38,7 +48,7 @@ Please read the MPD user manual for a complete configuration guide:
|
||||
http://www.musicpd.org/doc/user/
|
||||
|
||||
|
||||
REQUIRED PARAMETERS
|
||||
OPTIONAL PARAMETERS
|
||||
-------------------
|
||||
|
||||
db_file <file>
|
||||
@@ -47,9 +57,6 @@ db_file <file>
|
||||
log_file <file>
|
||||
This specifies where the log file should be located. The special value "syslog" makes MPD use the local syslog daemon.
|
||||
|
||||
OPTIONAL PARAMETERS
|
||||
-------------------
|
||||
|
||||
sticker_file <file>
|
||||
The location of the sticker database. This is a database which manages
|
||||
dynamic information attached to songs.
|
||||
@@ -83,7 +90,7 @@ user <username>
|
||||
port <port>
|
||||
This specifies the port that mpd listens on. The default is 6600.
|
||||
|
||||
log_level <default, secure, or verbose>
|
||||
log_level <level>
|
||||
Suppress all messages below the given threshold. The following
|
||||
log levels are available:
|
||||
|
||||
@@ -123,7 +130,8 @@ audio_output
|
||||
|
||||
replaygain <off or album or track or auto>
|
||||
If specified, mpd will adjust the volume of songs played using ReplayGain
|
||||
tags (see http://www.replaygain.org/). Setting this to "album" will
|
||||
tags (see https://wiki.hydrogenaud.io/index.php?title=Replaygain).
|
||||
Setting this to "album" will
|
||||
adjust volume using the album's ReplayGain tags, while setting it to "track"
|
||||
will adjust it using the track ReplayGain tags. "auto" uses the track
|
||||
ReplayGain tags if random play is activated otherwise the album ReplayGain
|
||||
@@ -190,8 +198,8 @@ mixer_type <hardware, software or none>
|
||||
FILES
|
||||
-----
|
||||
|
||||
:file:`~/.mpdconf`
|
||||
User configuration file.
|
||||
:file:`$XDG_CONFIG_HOME/mpd/mpd.conf`
|
||||
User configuration file (usually :file:`~/.config/mpd/mpd.conf`).
|
||||
|
||||
:file:`/etc/mpd.conf`
|
||||
Global configuration file.
|
||||
|
@@ -5,7 +5,7 @@
|
||||
# Files and directories #######################################################
|
||||
#
|
||||
# This setting controls the top directory which MPD will search to discover the
|
||||
# available audio files and add them to the daemon's online database. This
|
||||
# available audio files and add them to the daemon's online database. This
|
||||
# setting defaults to the XDG directory, otherwise the music directory will be
|
||||
# be disabled and audio files will only be accepted over ipc socket (using
|
||||
# file:// protocol) or streaming files over an accepted protocol.
|
||||
@@ -13,20 +13,20 @@
|
||||
#music_directory "~/music"
|
||||
#
|
||||
# This setting sets the MPD internal playlist directory. The purpose of this
|
||||
# directory is storage for playlists created by MPD. The server will use
|
||||
# directory is storage for playlists created by MPD. The server will use
|
||||
# playlist files not created by the server but only if they are in the MPD
|
||||
# format. This setting defaults to playlist saving being disabled.
|
||||
#
|
||||
#playlist_directory "~/.mpd/playlists"
|
||||
#
|
||||
# This setting sets the location of the MPD database. This file is used to
|
||||
# load the database at server start up and store the database while the
|
||||
# load the database at server start up and store the database while the
|
||||
# server is not up. This setting defaults to disabled which will allow
|
||||
# MPD to accept files over ipc socket (using file:// protocol) or streaming
|
||||
# files over an accepted protocol.
|
||||
#
|
||||
#db_file "~/.mpd/database"
|
||||
#
|
||||
#
|
||||
# These settings are the locations for the daemon log files for the daemon.
|
||||
# These logs are great for troubleshooting, depending on your log_level
|
||||
# settings.
|
||||
@@ -44,7 +44,7 @@
|
||||
#
|
||||
# This setting sets the location of the file which contains information about
|
||||
# most variables to get MPD back into the same general shape it was in before
|
||||
# it was brought down. This setting is disabled by default and the server
|
||||
# it was brought down. This setting is disabled by default and the server
|
||||
# state will be reset on server start up.
|
||||
#
|
||||
#state_file "~/.mpd/state"
|
||||
@@ -74,7 +74,7 @@
|
||||
#group "nogroup"
|
||||
#
|
||||
# This setting sets the address for the daemon to listen on. Careful attention
|
||||
# should be paid if this is assigned to anything other then the default, any.
|
||||
# should be paid if this is assigned to anything other than the default, any.
|
||||
# This setting can deny access to control of the daemon. Not effective if
|
||||
# systemd socket activiation is in use.
|
||||
#
|
||||
@@ -90,7 +90,8 @@
|
||||
#port "6600"
|
||||
#
|
||||
# Suppress all messages below the given threshold. Use "verbose" for
|
||||
# troubleshooting.
|
||||
# troubleshooting. Available setting arguments are "notice", "info", "verbose",
|
||||
# "warning" and "error".
|
||||
#
|
||||
#log_level "notice"
|
||||
#
|
||||
@@ -113,7 +114,7 @@
|
||||
# the other supported tags:
|
||||
#metadata_to_use "+comment"
|
||||
#
|
||||
# This setting enables automatic update of MPD's database when files in
|
||||
# This setting enables automatic update of MPD's database when files in
|
||||
# music_directory are changed.
|
||||
#
|
||||
#auto_update "yes"
|
||||
@@ -128,7 +129,7 @@
|
||||
|
||||
# Symbolic link behavior ######################################################
|
||||
#
|
||||
# If this setting is set to "yes", MPD will discover audio files by following
|
||||
# If this setting is set to "yes", MPD will discover audio files by following
|
||||
# symbolic links outside of the configured music_directory.
|
||||
#
|
||||
#follow_outside_symlinks "yes"
|
||||
@@ -163,7 +164,7 @@
|
||||
#
|
||||
#password "password@read,add,control,admin"
|
||||
#
|
||||
# This setting specifies the permissions a user has who has not yet logged in.
|
||||
# This setting specifies the permissions a user has who has not yet logged in.
|
||||
#
|
||||
#default_permissions "read,add,control,admin"
|
||||
#
|
||||
@@ -172,7 +173,18 @@
|
||||
|
||||
# Database #######################################################################
|
||||
#
|
||||
|
||||
# An example of a database section instead of the old 'db_file' setting.
|
||||
# It enables mounting other storages into the music directory.
|
||||
#
|
||||
#database {
|
||||
# plugin "simple"
|
||||
# path "~/.local/share/mpd/db
|
||||
# cache_directory "~/.local/share/mpd/cache"
|
||||
#}
|
||||
#
|
||||
# An example of database config for a sattelite setup
|
||||
#
|
||||
#music_directory "nfs://fileserver.local/srv/mp3"
|
||||
#database {
|
||||
# plugin "proxy"
|
||||
# host "other.mpd.host"
|
||||
@@ -181,7 +193,6 @@
|
||||
|
||||
# Input #######################################################################
|
||||
#
|
||||
|
||||
input {
|
||||
plugin "curl"
|
||||
# proxy "proxy.isp.com:8080"
|
||||
@@ -194,8 +205,8 @@ input {
|
||||
|
||||
# Audio Output ################################################################
|
||||
#
|
||||
# MPD supports various audio output types, as well as playing through multiple
|
||||
# audio outputs at the same time, through multiple audio_output settings
|
||||
# MPD supports various audio output types, as well as playing through multiple
|
||||
# audio outputs at the same time, through multiple audio_output settings
|
||||
# blocks. Setting this block is optional, though the server will only attempt
|
||||
# autodetection for one sound card.
|
||||
#
|
||||
@@ -361,7 +372,8 @@ input {
|
||||
# the argument "off", "album", "track" or "auto". "auto" is a special mode that
|
||||
# chooses between "track" and "album" depending on the current state of
|
||||
# random playback. If random playback is enabled then "track" mode is used.
|
||||
# See <http://www.replaygain.org> for more details about ReplayGain.
|
||||
# See <https://wiki.hydrogenaud.io/index.php?title=Replaygain> for
|
||||
# more details about ReplayGain.
|
||||
# This setting is off by default.
|
||||
#
|
||||
#replaygain "album"
|
||||
@@ -386,7 +398,7 @@ input {
|
||||
#replaygain_limit "yes"
|
||||
#
|
||||
# This setting enables on-the-fly normalization volume adjustment. This will
|
||||
# result in the volume of all playing audio to be adjusted so the output has
|
||||
# result in the volume of all playing audio to be adjusted so the output has
|
||||
# equal "loudness". This setting is disabled by default.
|
||||
#
|
||||
#volume_normalization "no"
|
||||
@@ -395,7 +407,7 @@ input {
|
||||
|
||||
# Character Encoding ##########################################################
|
||||
#
|
||||
# If file or directory names do not display correctly for your locale then you
|
||||
# If file or directory names do not display correctly for your locale then you
|
||||
# may need to modify this setting.
|
||||
#
|
||||
#filesystem_charset "UTF-8"
|
||||
|
@@ -71,6 +71,11 @@ Load music files from a SMB/CIFS server. It is used when
|
||||
:code:`music_directory` contains a ``smb://`` URI, for example
|
||||
:samp:`smb://myfileserver/Music`.
|
||||
|
||||
Note that :file:`libsmbclient` has a serious bug which causes MPD to
|
||||
crash, and therefore this plugin is disabled by default and should not
|
||||
be used until the bug is fixed:
|
||||
https://bugzilla.samba.org/show_bug.cgi?id=11413
|
||||
|
||||
nfs
|
||||
---
|
||||
|
||||
@@ -373,10 +378,14 @@ flac
|
||||
|
||||
Decodes FLAC files using libFLAC.
|
||||
|
||||
.. _decoder_dsdiff:
|
||||
|
||||
dsdiff
|
||||
------
|
||||
|
||||
Decodes DFF files containing DSDIFF data (e.g. SACD rips).
|
||||
Decodes DSDIFF (`Direct Stream Digital Interchange File Format
|
||||
<http://www.sonicstudio.com/pdf/dsd/DSDIFF_1.5_Spec.pdf>`_) files
|
||||
(:file:`*.dff`). These contain :ref:`DSD <dsd>` instead of PCM.
|
||||
|
||||
.. list-table::
|
||||
:widths: 20 80
|
||||
@@ -387,10 +396,14 @@ Decodes DFF files containing DSDIFF data (e.g. SACD rips).
|
||||
* - **lsbitfirst yes|no**
|
||||
- Decode the least significant bit first. Default is no.
|
||||
|
||||
.. _decoder_dsf:
|
||||
|
||||
dsf
|
||||
---
|
||||
|
||||
Decodes DSF files containing DSDIFF data (e.g. SACD rips).
|
||||
Decodes DSF
|
||||
(<https://dsd-guide.com/sites/default/files/white-papers/DSFFileFormatSpec_E.pdf>)
|
||||
files (:file:`*.dsf`). These contain :ref:`DSD <dsd>` instead of PCM.
|
||||
|
||||
fluidsynth
|
||||
----------
|
||||
@@ -702,7 +715,7 @@ A resampler using `libsamplerate <http://www.mega-nerd.com/SRC/>`_ a.k.a. Secret
|
||||
* - Name
|
||||
- Description
|
||||
* - **type**
|
||||
- The interpolator type. See below for a list of known types.
|
||||
- The interpolator type. Defaults to :samp:`2`. See below for a list of known types.
|
||||
|
||||
The following converter types are provided by libsamplerate:
|
||||
|
||||
@@ -750,6 +763,10 @@ Valid quality values for libsoxr:
|
||||
|
||||
If the quality is set to custom also the following settings are available:
|
||||
|
||||
.. list-table::
|
||||
:widths: 20 80
|
||||
:header-rows: 1
|
||||
|
||||
* - Name
|
||||
- Description
|
||||
* - **precision**
|
||||
@@ -893,6 +910,10 @@ jack
|
||||
|
||||
The jack plugin connects to a `JACK server <http://jackaudio.org/>`_.
|
||||
|
||||
On Windows, this plugin loads :file:`libjack64.dll` at runtime. This
|
||||
means you need to `download and install the JACK windows build
|
||||
<https://jackaudio.org/downloads/>`_.
|
||||
|
||||
.. list-table::
|
||||
:widths: 20 80
|
||||
:header-rows: 1
|
||||
@@ -1154,6 +1175,8 @@ The `Windows Audio Session API <https://docs.microsoft.com/en-us/windows/win32/c
|
||||
- Enumerate all devices in log while playing started. Useful for device configuration. The default value is "no".
|
||||
* - **exclusive yes|no**
|
||||
- Exclusive mode blocks all other audio source, and get best audio quality without resampling. Stopping playing release the exclusive control of the output device. The default value is "no".
|
||||
* - **dop yes|no**
|
||||
- Enable DSD over PCM. Require exclusive mode. The default value is "no".
|
||||
|
||||
|
||||
.. _filter_plugins:
|
||||
@@ -1224,23 +1247,25 @@ Playlist plugins
|
||||
asx
|
||||
---
|
||||
|
||||
Reads .asx playlist files.
|
||||
Reads :file:`.asx` playlist files.
|
||||
|
||||
.. _cue_playlist:
|
||||
|
||||
cue
|
||||
---
|
||||
Reads .cue files.
|
||||
Reads :file:`.cue` files.
|
||||
|
||||
embcue
|
||||
------
|
||||
Reads CUE sheets from the "CUESHEET" tag of song files.
|
||||
Reads CUE sheets from the ``CUESHEET`` tag of song files.
|
||||
|
||||
m3u
|
||||
---
|
||||
Reads .m3u playlist files.
|
||||
Reads :file:`.m3u` playlist files.
|
||||
|
||||
extm3u
|
||||
------
|
||||
Reads extended .m3u playlist files.
|
||||
Reads extended :file:`.m3u` playlist files.
|
||||
|
||||
flac
|
||||
----
|
||||
@@ -1248,11 +1273,11 @@ Reads the cuesheet metablock from a FLAC file.
|
||||
|
||||
pls
|
||||
---
|
||||
Reads .pls playlist files.
|
||||
Reads :file:`.pls` playlist files.
|
||||
|
||||
rss
|
||||
---
|
||||
Reads music links from .rss files.
|
||||
Reads music links from :file:`.rss` files.
|
||||
|
||||
soundcloud
|
||||
----------
|
||||
|
229
doc/protocol.rst
229
doc/protocol.rst
@@ -69,11 +69,14 @@ that, the specified number of bytes of binary data follows, then a
|
||||
newline, and finally the ``OK`` line.
|
||||
|
||||
If the object to be transmitted is large, the server may choose a
|
||||
reasonable chunk size and transmit only a portion. Usually, the
|
||||
response also contains a ``size`` line which specifies the total
|
||||
(uncropped) size, and the command usually has a way to specify an
|
||||
offset into the object; this way, the client can copy the whole file
|
||||
without blocking the connection for too long.
|
||||
reasonable chunk size and transmit only a portion. The maximum chunk
|
||||
size can be changed by clients with the :ref:`binarylimit
|
||||
<command_binarylimit>` command.
|
||||
|
||||
Usually, the response also contains a ``size`` line which specifies
|
||||
the total (uncropped) size, and the command usually has a way to
|
||||
specify an offset into the object; this way, the client can copy the
|
||||
whole file without blocking the connection for too long.
|
||||
|
||||
Example::
|
||||
|
||||
@@ -281,6 +284,7 @@ The following tags are supported by :program:`MPD`:
|
||||
* **name**: a name for this song. This is not the song title. The exact meaning of this tag is not well-defined. It is often used by badly configured internet radio stations with broken tags to squeeze both the artist name and the song title in one tag.
|
||||
* **genre**: the music genre.
|
||||
* **date**: the song's release date. This is usually a 4-digit year.
|
||||
* **originaldate**: the song's original release date.
|
||||
* **composer**: the artist who composed the song.
|
||||
* **performer**: the artist who performed the song.
|
||||
* **conductor**: the conductor who conducted the song.
|
||||
@@ -383,10 +387,14 @@ Command reference
|
||||
Querying :program:`MPD`'s status
|
||||
================================
|
||||
|
||||
.. _command_clearerror:
|
||||
|
||||
:command:`clearerror`
|
||||
Clears the current error message in status (this is also
|
||||
accomplished by any command that starts playback).
|
||||
|
||||
.. _command_currentsong:
|
||||
|
||||
:command:`currentsong`
|
||||
Displays the song info of the current song (same song that
|
||||
is identified in status). Information about the current song
|
||||
@@ -407,7 +415,9 @@ Querying :program:`MPD`'s status
|
||||
- ``update``: a database update has started or finished. If the database was modified during the update, the ``database`` event is also emitted.
|
||||
- ``stored_playlist``: a stored playlist has been modified, renamed, created or deleted
|
||||
- ``playlist``: the queue (i.e. the current playlist) has been modified
|
||||
- ``player``: the player has been started, stopped or seeked
|
||||
- ``player``: the player has been started, stopped or seeked or
|
||||
tags of the currently playing song have changed (e.g. received
|
||||
from stream)
|
||||
- ``mixer``: the volume has been changed
|
||||
- ``output``: an audio output has been added, removed or modified (e.g. renamed, enabled or disabled)
|
||||
- ``options``: options like repeat, random, crossfade, replay gain
|
||||
@@ -477,6 +487,8 @@ Querying :program:`MPD`'s status
|
||||
:program:`MPD` versions used to have a "magic" value for
|
||||
"unknown", e.g. ":samp:`volume: -1`".
|
||||
|
||||
.. _command_stats:
|
||||
|
||||
:command:`stats`
|
||||
Displays statistics.
|
||||
|
||||
@@ -492,17 +504,25 @@ Querying :program:`MPD`'s status
|
||||
Playback options
|
||||
================
|
||||
|
||||
.. _command_consume:
|
||||
|
||||
:command:`consume {STATE}` [#since_0_15]_
|
||||
Sets consume state to ``STATE``,
|
||||
``STATE`` should be 0 or 1.
|
||||
When consume is activated, each song played is removed from playlist.
|
||||
|
||||
.. _command_crossfade:
|
||||
|
||||
:command:`crossfade {SECONDS}`
|
||||
Sets crossfading between songs.
|
||||
|
||||
.. _command_mixrampdb:
|
||||
|
||||
:command:`mixrampdb {deciBels}`
|
||||
Sets the threshold at which songs will be overlapped. Like crossfading but doesn't fade the track volume, just overlaps. The songs need to have MixRamp tags added by an external tool. 0dB is the normalized maximum volume so use negative values, I prefer -17dB. In the absence of mixramp tags crossfading will be used. See http://sourceforge.net/projects/mixramp
|
||||
|
||||
.. _command_mixrampdelay:
|
||||
|
||||
:command:`mixrampdelay {SECONDS}`
|
||||
Additional time subtracted from the overlap calculated by mixrampdb. A value of "nan" disables MixRamp overlapping and falls back to crossfading.
|
||||
|
||||
@@ -512,6 +532,8 @@ Playback options
|
||||
Sets random state to ``STATE``,
|
||||
``STATE`` should be 0 or 1.
|
||||
|
||||
.. _command_repeat:
|
||||
|
||||
:command:`repeat {STATE}`
|
||||
Sets repeat state to ``STATE``,
|
||||
``STATE`` should be 0 or 1.
|
||||
@@ -522,12 +544,16 @@ Playback options
|
||||
Sets volume to ``VOL``, the range of
|
||||
volume is 0-100.
|
||||
|
||||
.. _command_single:
|
||||
|
||||
:command:`single {STATE}` [#since_0_15]_
|
||||
Sets single state to ``STATE``,
|
||||
``STATE`` should be ``0``, ``1`` or ``oneshot`` [#since_0_20]_.
|
||||
``STATE`` should be ``0``, ``1`` or ``oneshot`` [#since_0_21]_.
|
||||
When single is activated, playback is stopped after current song, or
|
||||
song is repeated if the 'repeat' mode is enabled.
|
||||
|
||||
.. _command_replay_gain_mode:
|
||||
|
||||
:command:`replay_gain_mode {MODE}` [#since_0_16]_
|
||||
Sets the replay gain mode. One of
|
||||
``off``,
|
||||
@@ -541,11 +567,15 @@ Playback options
|
||||
This command triggers the
|
||||
``options`` idle event.
|
||||
|
||||
.. _command_replay_gain_status:
|
||||
|
||||
:command:`replay_gain_status`
|
||||
Prints replay gain options. Currently, only the
|
||||
variable ``replay_gain_mode`` is
|
||||
returned.
|
||||
|
||||
.. _command_volume:
|
||||
|
||||
:command:`volume {CHANGE}`
|
||||
Changes volume by amount ``CHANGE``.
|
||||
Deprecated, use :ref:`setvol <command_setvol>` instead.
|
||||
@@ -553,41 +583,59 @@ Playback options
|
||||
Controlling playback
|
||||
====================
|
||||
|
||||
.. _command_next:
|
||||
|
||||
:command:`next`
|
||||
Plays next song in the playlist.
|
||||
|
||||
.. _command_pause:
|
||||
|
||||
:command:`pause {STATE}`
|
||||
Pause or resume playback. Pass :samp:`1` to pause playback or
|
||||
:samp:`0` to resume playback. Without the parameter, the pause
|
||||
state is toggled.
|
||||
|
||||
.. _command_play:
|
||||
|
||||
:command:`play [SONGPOS]`
|
||||
Begins playing the playlist at song number
|
||||
``SONGPOS``.
|
||||
|
||||
.. _command_playid:
|
||||
|
||||
:command:`playid [SONGID]`
|
||||
Begins playing the playlist at song
|
||||
``SONGID``.
|
||||
|
||||
.. _command_previous:
|
||||
|
||||
:command:`previous`
|
||||
Plays previous song in the playlist.
|
||||
|
||||
.. _command_seek:
|
||||
|
||||
:command:`seek {SONGPOS} {TIME}`
|
||||
Seeks to the position ``TIME`` (in
|
||||
seconds; fractions allowed) of entry
|
||||
``SONGPOS`` in the playlist.
|
||||
|
||||
.. _command_seekid:
|
||||
|
||||
:command:`seekid {SONGID} {TIME}`
|
||||
Seeks to the position ``TIME`` (in
|
||||
seconds; fractions allowed) of song
|
||||
``SONGID``.
|
||||
|
||||
.. _command_seekcur:
|
||||
|
||||
:command:`seekcur {TIME}`
|
||||
Seeks to the position ``TIME`` (in
|
||||
seconds; fractions allowed) within the current song. If
|
||||
prefixed by ``+`` or ``-``, then the time is relative to the
|
||||
current playing position.
|
||||
|
||||
.. _command_stop:
|
||||
|
||||
:command:`stop`
|
||||
Stops playing.
|
||||
|
||||
@@ -622,11 +670,20 @@ client can always be sure the correct song is being used.
|
||||
Many commands come in two flavors, one for each address type.
|
||||
Whenever possible, ids should be used.
|
||||
|
||||
.. _command_add:
|
||||
|
||||
:command:`add {URI}`
|
||||
Adds the file ``URI`` to the playlist
|
||||
(directories add recursively). ``URI``
|
||||
can also be a single file.
|
||||
|
||||
Clients that are connected via local socket may add arbitrary
|
||||
local files (URI is an absolute path). Example::
|
||||
|
||||
add "/home/foo/Music/bar.ogg"
|
||||
|
||||
.. _command_addid:
|
||||
|
||||
:command:`addid {URI} [POSITION]`
|
||||
Adds a song to the playlist (non-recursive) and returns the
|
||||
song id. ``URI`` is always a single file or URL. For example::
|
||||
@@ -635,6 +692,8 @@ Whenever possible, ids should be used.
|
||||
Id: 999
|
||||
OK
|
||||
|
||||
.. _command_clear:
|
||||
|
||||
:command:`clear`
|
||||
Clears the queue.
|
||||
|
||||
@@ -643,15 +702,21 @@ Whenever possible, ids should be used.
|
||||
:command:`delete [{POS} | {START:END}]`
|
||||
Deletes a song from the playlist.
|
||||
|
||||
.. _command_deleteid:
|
||||
|
||||
:command:`deleteid {SONGID}`
|
||||
Deletes the song ``SONGID`` from the
|
||||
playlist
|
||||
|
||||
.. _command_move:
|
||||
|
||||
:command:`move [{FROM} | {START:END}] {TO}`
|
||||
Moves the song at ``FROM`` or range of songs
|
||||
at ``START:END`` [#since_0_15]_ to ``TO``
|
||||
in the playlist.
|
||||
|
||||
.. _command_moveid:
|
||||
|
||||
:command:`moveid {FROM} {TO}`
|
||||
Moves the song with ``FROM`` (songid) to
|
||||
``TO`` (playlist index) in the
|
||||
@@ -659,6 +724,8 @@ Whenever possible, ids should be used.
|
||||
is relative to the current song in the playlist (if
|
||||
there is one).
|
||||
|
||||
.. _command_playlist:
|
||||
|
||||
:command:`playlist`
|
||||
|
||||
Displays the queue.
|
||||
@@ -666,10 +733,14 @@ Whenever possible, ids should be used.
|
||||
Do not use this, instead use :ref:`playlistinfo
|
||||
<command_playlistinfo>`.
|
||||
|
||||
:command:`playlistfind {TAG} {NEEDLE}`
|
||||
.. _command_playlistfind:
|
||||
|
||||
:command:`playlistfind {FILTER}`
|
||||
Finds songs in the queue with strict
|
||||
matching.
|
||||
|
||||
.. _command_playlistid:
|
||||
|
||||
:command:`playlistid {SONGID}`
|
||||
Displays a list of songs in the playlist.
|
||||
``SONGID`` is optional and specifies a
|
||||
@@ -683,10 +754,14 @@ Whenever possible, ids should be used.
|
||||
``SONGPOS`` or the range of songs
|
||||
``START:END`` [#since_0_15]_
|
||||
|
||||
:command:`playlistsearch {TAG} {NEEDLE}`
|
||||
.. _command_playlistsearch:
|
||||
|
||||
:command:`playlistsearch {FILTER}`
|
||||
Searches case-insensitively for partial matches in the
|
||||
queue.
|
||||
|
||||
.. _command_plchanges:
|
||||
|
||||
:command:`plchanges {VERSION} [START:END]`
|
||||
Displays changed songs currently in the playlist since
|
||||
``VERSION``. Start and end positions may
|
||||
@@ -696,6 +771,8 @@ Whenever possible, ids should be used.
|
||||
To detect songs that were deleted at the end of the
|
||||
playlist, use playlistlength returned by status command.
|
||||
|
||||
.. _command_plchangesposid:
|
||||
|
||||
:command:`plchangesposid {VERSION} [START:END]`
|
||||
Displays changed songs currently in the playlist since
|
||||
``VERSION``. This function only
|
||||
@@ -721,6 +798,8 @@ Whenever possible, ids should be used.
|
||||
Same as :ref:`priod <command_prio>`,
|
||||
but address the songs with their id.
|
||||
|
||||
.. _command_rangeid:
|
||||
|
||||
:command:`rangeid {ID} {START:END}` [#since_0_19]_
|
||||
Since :program:`MPD`
|
||||
0.19 Specifies the portion of the
|
||||
@@ -731,19 +810,27 @@ Whenever possible, ids should be used.
|
||||
range, play everything". A song that is currently
|
||||
playing cannot be manipulated this way.
|
||||
|
||||
.. _command_shuffle:
|
||||
|
||||
:command:`shuffle [START:END]`
|
||||
Shuffles the queue.
|
||||
``START:END`` is optional and specifies
|
||||
a range of songs.
|
||||
|
||||
.. _command_swap:
|
||||
|
||||
:command:`swap {SONG1} {SONG2}`
|
||||
Swaps the positions of ``SONG1`` and
|
||||
``SONG2``.
|
||||
|
||||
.. _command_swapid:
|
||||
|
||||
:command:`swapid {SONG1} {SONG2}`
|
||||
Swaps the positions of ``SONG1`` and
|
||||
``SONG2`` (both song ids).
|
||||
|
||||
.. _command_addtagid:
|
||||
|
||||
:command:`addtagid {SONGID} {TAG} {VALUE}`
|
||||
Adds a tag to the specified song. Editing song tags is
|
||||
only possible for remote songs. This change is
|
||||
@@ -751,6 +838,8 @@ Whenever possible, ids should be used.
|
||||
the server, and the data is gone when the song gets
|
||||
removed from the queue.
|
||||
|
||||
.. _command_cleartagid:
|
||||
|
||||
:command:`cleartagid {SONGID} [TAG]`
|
||||
Removes tags from the specified song. If
|
||||
``TAG`` is not specified, then all tag
|
||||
@@ -772,14 +861,20 @@ playlists in arbitrary location (absolute path including the suffix;
|
||||
allowed only for clients that are connected via local socket), or
|
||||
remote playlists (absolute URI with a supported scheme).
|
||||
|
||||
.. _command_listplaylist:
|
||||
|
||||
:command:`listplaylist {NAME}`
|
||||
Lists the songs in the playlist. Playlist plugins are
|
||||
supported.
|
||||
|
||||
.. _command_listplaylistinfo:
|
||||
|
||||
:command:`listplaylistinfo {NAME}`
|
||||
Lists the songs with metadata in the playlist. Playlist
|
||||
plugins are supported.
|
||||
|
||||
.. _command_listplaylists:
|
||||
|
||||
:command:`listplaylists`
|
||||
Prints a list of the playlist directory.
|
||||
After each playlist name the server sends its last
|
||||
@@ -795,27 +890,39 @@ remote playlists (absolute URI with a supported scheme).
|
||||
plugins are supported. A range may be specified to load
|
||||
only a part of the playlist.
|
||||
|
||||
.. _command_playlistadd:
|
||||
|
||||
:command:`playlistadd {NAME} {URI}`
|
||||
Adds ``URI`` to the playlist
|
||||
`NAME.m3u`.
|
||||
`NAME.m3u` will be created if it does
|
||||
not exist.
|
||||
|
||||
.. _command_playlistclear:
|
||||
|
||||
:command:`playlistclear {NAME}`
|
||||
Clears the playlist `NAME.m3u`.
|
||||
|
||||
.. _command_playlistdelete:
|
||||
|
||||
:command:`playlistdelete {NAME} {SONGPOS}`
|
||||
Deletes ``SONGPOS`` from the
|
||||
playlist `NAME.m3u`.
|
||||
|
||||
.. _command_playlistmove:
|
||||
|
||||
:command:`playlistmove {NAME} {FROM} {TO}`
|
||||
Moves the song at position ``FROM`` in
|
||||
the playlist `NAME.m3u` to the
|
||||
position ``TO``.
|
||||
|
||||
.. _command_rename:
|
||||
|
||||
:command:`rename {NAME} {NEW_NAME}`
|
||||
Renames the playlist `NAME.m3u` to `NEW_NAME.m3u`.
|
||||
|
||||
.. _command_rm:
|
||||
|
||||
:command:`rm {NAME}`
|
||||
Removes the playlist `NAME.m3u` from
|
||||
the playlist directory.
|
||||
@@ -829,6 +936,8 @@ remote playlists (absolute URI with a supported scheme).
|
||||
The music database
|
||||
==================
|
||||
|
||||
.. _command_albumart:
|
||||
|
||||
:command:`albumart {URI} {OFFSET}`
|
||||
Locate album art for the given song and return a chunk of an album
|
||||
art image file at offset ``OFFSET``.
|
||||
@@ -850,6 +959,8 @@ The music database
|
||||
<8192 bytes>
|
||||
OK
|
||||
|
||||
.. _command_count:
|
||||
|
||||
:command:`count {FILTER} [group {GROUPTYPE}]`
|
||||
Count the number of songs and their total playtime in
|
||||
the database matching ``FILTER`` (see
|
||||
@@ -872,6 +983,8 @@ The music database
|
||||
don't have this group tag. It exists only if at least one such song is
|
||||
found.
|
||||
|
||||
.. _command_getfingerprint:
|
||||
|
||||
:command:`getfingerprint {URI}`
|
||||
|
||||
Calculate the song's audio fingerprint. Example (abbreviated fingerprint)::
|
||||
@@ -962,6 +1075,8 @@ The music database
|
||||
:program:`MPD` whenever you need
|
||||
something.
|
||||
|
||||
.. _command_listfiles:
|
||||
|
||||
:command:`listfiles {URI}`
|
||||
Lists the contents of the directory
|
||||
``URI``, including files are not
|
||||
@@ -998,6 +1113,8 @@ The music database
|
||||
use this command to read the tags of an arbitrary local
|
||||
file (URI is an absolute path).
|
||||
|
||||
.. _command_readcomments:
|
||||
|
||||
:command:`readcomments {URI}`
|
||||
Read "comments" (i.e. key-value pairs) from the file
|
||||
specified by "URI". This "URI" can be a path relative
|
||||
@@ -1014,6 +1131,8 @@ The music database
|
||||
decoder plugins support it. For example, on Ogg files,
|
||||
this lists the Vorbis comments.
|
||||
|
||||
.. _command_readpicture:
|
||||
|
||||
:command:`readpicture {URI} {OFFSET}`
|
||||
Locate a picture for the given song and return a chunk of the
|
||||
image file at offset ``OFFSET``. This is usually implemented by
|
||||
@@ -1055,6 +1174,8 @@ The music database
|
||||
|
||||
Parameters have the same meaning as for :ref:`search <command_search>`.
|
||||
|
||||
.. _command_searchaddpl:
|
||||
|
||||
:command:`searchaddpl {NAME} {FILTER} [sort {TYPE}] [window {START:END}]`
|
||||
Search the database for songs matching
|
||||
``FILTER`` (see :ref:`Filters <filter_syntax>`) and add them to
|
||||
@@ -1080,6 +1201,8 @@ The music database
|
||||
job id in the :ref:`status <command_status>`
|
||||
response.
|
||||
|
||||
.. _command_rescan:
|
||||
|
||||
:command:`rescan [URI]`
|
||||
Same as :ref:`update <command_update>`,
|
||||
but also rescans unmodified files.
|
||||
@@ -1106,11 +1229,15 @@ only inside the :program:`MPD` process.
|
||||
|
||||
mount foo nfs://192.168.1.4/export/mp3
|
||||
|
||||
.. _command_unmount:
|
||||
|
||||
:command:`unmount {PATH}`
|
||||
Unmounts the specified path. Example::
|
||||
|
||||
unmount foo
|
||||
|
||||
.. _command_listmounts:
|
||||
|
||||
:command:`listmounts`
|
||||
Queries a list of all mounts. By default, this contains
|
||||
just the configured ``music_directory``.
|
||||
@@ -1123,6 +1250,8 @@ only inside the :program:`MPD` process.
|
||||
storage: nfs://192.168.1.4/export/mp3
|
||||
OK
|
||||
|
||||
.. _command_listneighbors:
|
||||
|
||||
:command:`listneighbors`
|
||||
Queries a list of "neighbors" (e.g. accessible file
|
||||
servers on the local net). Items on that list may be
|
||||
@@ -1158,28 +1287,40 @@ Objects which may have stickers are addressed by their object
|
||||
type ("song" for song objects) and their URI (the path within
|
||||
the database for songs).
|
||||
|
||||
.. _command_sticker_get:
|
||||
|
||||
:command:`sticker get {TYPE} {URI} {NAME}`
|
||||
Reads a sticker value for the specified object.
|
||||
|
||||
.. _command_sticker_set:
|
||||
|
||||
:command:`sticker set {TYPE} {URI} {NAME} {VALUE}`
|
||||
Adds a sticker value to the specified object. If a
|
||||
sticker item with that name already exists, it is
|
||||
replaced.
|
||||
|
||||
.. _command_sticker_delete:
|
||||
|
||||
:command:`sticker delete {TYPE} {URI} [NAME]`
|
||||
Deletes a sticker value from the specified object. If
|
||||
you do not specify a sticker name, all sticker values
|
||||
are deleted.
|
||||
|
||||
.. _command_sticker_list:
|
||||
|
||||
:command:`sticker list {TYPE} {URI}`
|
||||
Lists the stickers for the specified object.
|
||||
|
||||
.. _command_sticker_find:
|
||||
|
||||
:command:`sticker find {TYPE} {URI} {NAME}`
|
||||
Searches the sticker database for stickers with the
|
||||
specified name, below the specified directory (URI).
|
||||
For each matching song, it prints the URI and that one
|
||||
sticker's value.
|
||||
|
||||
.. _command_sticker_find_value:
|
||||
|
||||
:command:`sticker find {TYPE} {URI} {NAME} = {VALUE}`
|
||||
Searches for stickers with the given value.
|
||||
|
||||
@@ -1189,6 +1330,8 @@ the database for songs).
|
||||
Connection settings
|
||||
===================
|
||||
|
||||
.. _command_close:
|
||||
|
||||
:command:`close`
|
||||
Closes the connection to :program:`MPD`.
|
||||
:program:`MPD` will try to send the
|
||||
@@ -1199,6 +1342,8 @@ Connection settings
|
||||
Clients should not use this command; instead, they should just
|
||||
close the socket.
|
||||
|
||||
.. _command_kill:
|
||||
|
||||
:command:`kill`
|
||||
Kills :program:`MPD`.
|
||||
|
||||
@@ -1206,14 +1351,31 @@ Connection settings
|
||||
instead, or better: let your service manager handle :program:`MPD`
|
||||
shutdown (e.g. :command:`systemctl stop mpd`).
|
||||
|
||||
.. _command_password:
|
||||
|
||||
:command:`password {PASSWORD}`
|
||||
This is used for authentication with the server.
|
||||
``PASSWORD`` is simply the plaintext
|
||||
password.
|
||||
|
||||
.. _command_ping:
|
||||
|
||||
:command:`ping`
|
||||
Does nothing but return "OK".
|
||||
|
||||
.. _command_binarylimit:
|
||||
|
||||
:command:`binarylimit SIZE` [#since_0_22_4]_
|
||||
|
||||
Set the maximum :ref:`binary response <binary>` size for the
|
||||
current connection to the specified number of bytes.
|
||||
|
||||
A bigger value means less overhead for transmitting large
|
||||
entities, but it also means that the connection is blocked for a
|
||||
longer time.
|
||||
|
||||
.. _command_tagtypes:
|
||||
|
||||
:command:`tagtypes`
|
||||
Shows a list of available tag types. It is an
|
||||
intersection of the ``metadata_to_use``
|
||||
@@ -1226,21 +1388,29 @@ Connection settings
|
||||
``tagtypes`` sub commands configure this
|
||||
list.
|
||||
|
||||
.. _command_tagtypes_disable:
|
||||
|
||||
: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.
|
||||
|
||||
.. _command_tagtypes_enable:
|
||||
|
||||
:command:`tagtypes enable {NAME...}`
|
||||
Re-enable one or more tags from the list of tag types
|
||||
for this client. These will no longer be hidden from
|
||||
responses to this client.
|
||||
|
||||
.. _command_tagtypes_clear:
|
||||
|
||||
:command:`tagtypes clear`
|
||||
Clear the list of tag types this client is interested
|
||||
in. This means that :program:`MPD` will
|
||||
not send any tags to this client.
|
||||
|
||||
.. _command_tagtypes_all:
|
||||
|
||||
:command:`tagtypes all`
|
||||
Announce that this client is interested in all tag
|
||||
types. This is the default setting for new clients.
|
||||
@@ -1255,34 +1425,50 @@ These commands allow a client to inspect and manage
|
||||
MPD process: it has separate queue, player and outputs. A
|
||||
client is assigned to one partition at a time.
|
||||
|
||||
.. _command_partition:
|
||||
|
||||
:command:`partition {NAME}`
|
||||
Switch the client to a different partition.
|
||||
|
||||
.. _command_listpartitions:
|
||||
|
||||
:command:`listpartitions`
|
||||
Print a list of partitions. Each partition starts with
|
||||
a ``partition`` keyword and the
|
||||
partition's name, followed by information about the
|
||||
partition.
|
||||
|
||||
.. _command_newpartition:
|
||||
|
||||
:command:`newpartition {NAME}`
|
||||
Create a new partition.
|
||||
|
||||
.. _command_delpartition:
|
||||
|
||||
:command:`delpartition {NAME}`
|
||||
Delete a partition. The partition must be empty (no connected
|
||||
clients and no outputs).
|
||||
|
||||
.. _command_moveoutput:
|
||||
|
||||
:command:`moveoutput {OUTPUTNAME}`
|
||||
Move an output to the current partition.
|
||||
|
||||
Audio output devices
|
||||
====================
|
||||
|
||||
.. _command_disableoutput:
|
||||
|
||||
:command:`disableoutput {ID}`
|
||||
Turns an output off.
|
||||
|
||||
.. _command_enableoutput:
|
||||
|
||||
:command:`enableoutput {ID}`
|
||||
Turns an output on.
|
||||
|
||||
.. _command_toggleoutput:
|
||||
|
||||
:command:`toggleoutput {ID}`
|
||||
Turns an output on or off, depending on the current
|
||||
state.
|
||||
@@ -1291,7 +1477,7 @@ Audio output devices
|
||||
|
||||
:command:`outputs`
|
||||
Shows information about all outputs.
|
||||
|
||||
|
||||
::
|
||||
|
||||
outputid: 0
|
||||
@@ -1307,6 +1493,8 @@ Audio output devices
|
||||
- ``outputname``: Name of the output. It can be any.
|
||||
- ``outputenabled``: Status of the output. 0 if disabled, 1 if enabled.
|
||||
|
||||
.. _command_outputset:
|
||||
|
||||
:command:`outputset {ID} {NAME} {VALUE}`
|
||||
Set a runtime attribute. These are specific to the
|
||||
output plugin, and supported values are usually printed
|
||||
@@ -1316,6 +1504,8 @@ Audio output devices
|
||||
Reflection
|
||||
==========
|
||||
|
||||
.. _command_config:
|
||||
|
||||
:command:`config`
|
||||
Dumps configuration values that may be interesting for
|
||||
the client. This command is only permitted to "local"
|
||||
@@ -1325,16 +1515,24 @@ Reflection
|
||||
|
||||
- ``music_directory``: The absolute path of the music directory.
|
||||
|
||||
.. _command_commands:
|
||||
|
||||
:command:`commands`
|
||||
Shows which commands the current user has access to.
|
||||
|
||||
.. _command_notcommands:
|
||||
|
||||
:command:`notcommands`
|
||||
Shows which commands the current user does not have
|
||||
access to.
|
||||
|
||||
.. _command_urlhandlers:
|
||||
|
||||
:command:`urlhandlers`
|
||||
Gets a list of available URL handlers.
|
||||
|
||||
.. _command_decoders:
|
||||
|
||||
:command:`decoders`
|
||||
Print a list of decoder plugins, followed by their
|
||||
supported suffixes and MIME types. Example response::
|
||||
@@ -1366,12 +1564,16 @@ idle event.
|
||||
If your MPD instance has multiple partitions, note that
|
||||
client-to-client messages are local to the current partition.
|
||||
|
||||
.. _command_subscribe:
|
||||
|
||||
:command:`subscribe {NAME}`
|
||||
Subscribe to a channel. The channel is created if it
|
||||
does not exist already. The name may consist of
|
||||
alphanumeric ASCII characters plus underscore, dash, dot
|
||||
and colon.
|
||||
|
||||
.. _command_unsubscribe:
|
||||
|
||||
:command:`unsubscribe {NAME}`
|
||||
Unsubscribe from a channel.
|
||||
|
||||
@@ -1381,10 +1583,14 @@ client-to-client messages are local to the current partition.
|
||||
Obtain a list of all channels. The response is a list
|
||||
of "channel:" lines.
|
||||
|
||||
.. _command_readmessages:
|
||||
|
||||
:command:`readmessages`
|
||||
Reads messages for this client. The response is a list
|
||||
of "channel:" and "message:" lines.
|
||||
|
||||
.. _command_sendmessage:
|
||||
|
||||
:command:`sendmessage {CHANNEL} {TEXT}`
|
||||
Send a message to the specified channel.
|
||||
|
||||
@@ -1393,6 +1599,7 @@ client-to-client messages are local to the current partition.
|
||||
.. [#since_0_14] Since :program:`MPD` 0.14
|
||||
.. [#since_0_15] Since :program:`MPD` 0.15
|
||||
.. [#since_0_16] Since :program:`MPD` 0.16
|
||||
.. [#since_0_19] Since :program:`MPD` 0.20
|
||||
.. [#since_0_19] Since :program:`MPD` 0.19
|
||||
.. [#since_0_20] Since :program:`MPD` 0.20
|
||||
.. [#since_0_21] Since :program:`MPD` 0.21
|
||||
.. [#since_0_22_4] Since :program:`MPD` 0.22.4
|
||||
|
101
doc/user.rst
101
doc/user.rst
@@ -55,7 +55,7 @@ and unpack it (or `clone the git repository
|
||||
|
||||
In any case, you need:
|
||||
|
||||
* a C++17 compiler (e.g. GCC 8 or clang 5)
|
||||
* a C++17 compiler (e.g. GCC 8 or clang 7)
|
||||
* `Meson 0.49.0 <http://mesonbuild.com/>`__ and `Ninja
|
||||
<https://ninja-build.org/>`__
|
||||
* Boost 1.58
|
||||
@@ -86,7 +86,7 @@ For example, the following installs a fairly complete list of build dependencies
|
||||
libpulse-dev libshout3-dev \
|
||||
libsndio-dev \
|
||||
libmpdclient-dev \
|
||||
libnfs-dev libsmbclient-dev \
|
||||
libnfs-dev \
|
||||
libupnp-dev \
|
||||
libavahi-client-dev \
|
||||
libsqlite3-dev \
|
||||
@@ -141,6 +141,15 @@ Basically, there are two ways to compile :program:`MPD` for Windows:
|
||||
|
||||
This section is about the latter.
|
||||
|
||||
You need:
|
||||
|
||||
* `mingw-w64 <http://mingw-w64.org/doku.php>`__
|
||||
* `Meson 0.49.0 <http://mesonbuild.com/>`__ and `Ninja
|
||||
<https://ninja-build.org/>`__
|
||||
* cmake
|
||||
* pkg-config
|
||||
* quilt
|
||||
|
||||
Just like with the native build, unpack the :program:`MPD` source
|
||||
tarball and change into the directory. Then, instead of
|
||||
:program:`meson`, type:
|
||||
@@ -167,7 +176,12 @@ Compiling for Android
|
||||
You need:
|
||||
|
||||
* Android SDK
|
||||
* Android NDK
|
||||
* `Android NDK r22 <https://developer.android.com/ndk/downloads>`_
|
||||
* `Meson 0.49.0 <http://mesonbuild.com/>`__ and `Ninja
|
||||
<https://ninja-build.org/>`__
|
||||
* cmake
|
||||
* pkg-config
|
||||
* quilt
|
||||
|
||||
Just like with the native build, unpack the :program:`MPD` source
|
||||
tarball and change into the directory. Then, instead of
|
||||
@@ -413,7 +427,7 @@ The following table lists the audio_output options valid for all plugins:
|
||||
* - **format samplerate:bits:channels**
|
||||
- Always open the audio output with the specified audio format, regardless of the format of the input file. This is optional for most plugins.
|
||||
See :ref:`audio_output_format` for a detailed description of the value.
|
||||
* - **enabed yes|no**
|
||||
* - **enabled yes|no**
|
||||
- Specifies whether this audio output is enabled when :program:`MPD` is started. By default, all audio outputs are enabled. This is just the default setting when there is no state file; with a state file, the previous state is restored.
|
||||
* - **tags yes|no**
|
||||
- If set to no, then :program:`MPD` will not send tags to this output. This is only useful for output plugins that can receive tags, for example the httpd output plugin.
|
||||
@@ -500,6 +514,11 @@ The following table lists the playlist_plugin options valid for all plugins:
|
||||
- The name of the plugin
|
||||
* - **enabled yes|no**
|
||||
- Allows you to disable a playlist plugin without recompiling. By default, all plugins are enabled.
|
||||
* - **as_directory yes|no**
|
||||
- With this option, a playlist file of this type is parsed during
|
||||
database update and converted to a virtual directory, allowing
|
||||
MPD clients to access individual entries. By default, this is
|
||||
only enabled for the :ref:`cue plugin <cue_playlist>`.
|
||||
|
||||
More information can be found in the :ref:`playlist_plugins`
|
||||
reference.
|
||||
@@ -669,6 +688,8 @@ The State File
|
||||
- Specify the state file location. The parent directory must be writable by the :program:`MPD` user (+wx).
|
||||
* - **state_file_interval SECONDS**
|
||||
- Auto-save the state file this number of seconds after each state change. Defaults to 120 (2 minutes).
|
||||
* - **restore_paused yes|no**
|
||||
- If set to :samp:`yes`, then :program:`MPD` is put into pause mode instead of starting playback after startup. Default is :samp:`no`.
|
||||
|
||||
The Sticker Database
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
@@ -770,6 +791,8 @@ The :code:`music_directory` setting tells :program:`MPD` to read files from the
|
||||
|
||||
The database setting tells :program:`MPD` to pass all database queries on to the :program:`MPD` instance running on the file server (using the proxy plugin).
|
||||
|
||||
.. _realtime:
|
||||
|
||||
Real-Time Scheduling
|
||||
--------------------
|
||||
|
||||
@@ -1025,12 +1048,20 @@ Check list for bit-perfect playback:
|
||||
:code:`format`, :ref:`audio_output_format <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.
|
||||
|
||||
.. _dsd:
|
||||
|
||||
Direct Stream Digital (DSD)
|
||||
---------------------------
|
||||
|
||||
DSD (`Direct Stream Digital <https://en.wikipedia.org/wiki/Direct_Stream_Digital>`_) is a digital format that stores audio as a sequence of single-bit values at a very high sampling rate.
|
||||
DSD (`Direct Stream Digital
|
||||
<https://en.wikipedia.org/wiki/Direct_Stream_Digital>`_) is a digital
|
||||
format that stores audio as a sequence of single-bit values at a very
|
||||
high sampling rate. It is the sample format used on `Super Audio CDs
|
||||
<https://en.wikipedia.org/wiki/Super_Audio_CD>`_.
|
||||
|
||||
:program:`MPD` understands the file formats dff and dsf. There are three ways to play back DSD:
|
||||
:program:`MPD` understands the file formats :ref:`DSDIFF
|
||||
<decoder_dsdiff>` and :ref:`DSF <decoder_dsf>`. There are three ways
|
||||
to play back DSD:
|
||||
|
||||
* Native DSD playback. Requires ALSA 1.0.27.1 or later, a sound driver/chip that supports DSD and of course a DAC that supports DSD.
|
||||
|
||||
@@ -1091,39 +1122,71 @@ Support
|
||||
Getting Help
|
||||
^^^^^^^^^^^^
|
||||
|
||||
The :program:`MPD` project runs a `forum <https://forum.musicpd.org/>`_ and an IRC channel (#mpd on Freenode) for requesting help. Visit the MPD help page for details on how to get help.
|
||||
The :program:`MPD` project runs a `forum <https://forum.musicpd.org/>`_ and an IRC channel (#mpd on Libera.Chat) for requesting help. Visit the MPD help page for details on how to get help.
|
||||
|
||||
Common Problems
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
1. Database
|
||||
"""""""""""
|
||||
Startup
|
||||
"""""""
|
||||
|
||||
Question: I can't see my music in the MPD database!
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Error "could not get realtime scheduling"
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
See :ref:`realtime`. You can safely ignore this, but you won't
|
||||
benefit from real-time scheduling. This only makes a difference if
|
||||
your computer runs programs other than MPD.
|
||||
|
||||
Error "Failed to initialize io_uring"
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Linux specific: the io_uring subsystem could not be initialized. This
|
||||
is not a critical error - MPD will fall back to "classic" blocking
|
||||
disk I/O. You can safely ignore this error, but you won't benefit
|
||||
from io_uring's advantages.
|
||||
|
||||
* "Cannot allocate memory" usually means that your memlock limit
|
||||
(``ulimit -l`` in bash or ``LimitMEMLOCK`` in systemd) is too low.
|
||||
64 MB is a reasonable value for this limit.
|
||||
* Your Linux kernel might be too old and does not support io_uring.
|
||||
|
||||
Error "bind to '0.0.0.0:6600' failed (continuing anyway, because binding to '[::]:6600' succeeded)"
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This happens on Linux when :file:`/proc/sys/net/ipv6/bindv6only` is
|
||||
disabled. MPD first binds to IPv6, and this automatically binds to
|
||||
IPv4 as well; after that, MPD binds to IPv4, but that fails. You can
|
||||
safely ignore this, because MPD works on both IPv4 and IPv6.
|
||||
|
||||
|
||||
Database
|
||||
""""""""
|
||||
|
||||
I can't see my music in the MPD database
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* Check your :code:`music_directory` setting.
|
||||
* Does the MPD user have read permission on all music files, and read+execute permission on all music directories (and all of their parent directories)?
|
||||
* Did you update the database? (mpc update)
|
||||
* Did you enable all relevant decoder plugins at compile time? :command:`mpd --version` will tell you.
|
||||
|
||||
Question: MPD doesn't read ID3 tags!
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
MPD doesn't read ID3 tags!
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* You probably compiled :program:`MPD` without libid3tag. :command:`mpd --version` will tell you.
|
||||
|
||||
2. Playback
|
||||
"""""""""""
|
||||
Playback
|
||||
""""""""
|
||||
|
||||
Question: I can't hear music on my client!
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
I can't hear music on my client
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* That problem usually follows a misunderstanding of the nature of :program:`MPD`. :program:`MPD` is a remote-controlled music player, not a music distribution system. Usually, the speakers are connected to the box where :program:`MPD` runs, and the :program:`MPD` client only sends control commands, but the client does not actually play your music.
|
||||
|
||||
:program:`MPD` has output plugins which allow hearing music on a remote host (such as httpd), but that is not :program:`MPD`'s primary design goal.
|
||||
|
||||
Question: "Device or resource busy"
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Error "Device or resource busy"
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* This ALSA error means that another program uses your sound hardware exclusively. You can stop that program to allow :program:`MPD` to use it.
|
||||
|
||||
|
131
meson.build
131
meson.build
@@ -1,11 +1,11 @@
|
||||
project(
|
||||
'mpd',
|
||||
['c', 'cpp'],
|
||||
version: '0.22',
|
||||
version: '0.22.9',
|
||||
meson_version: '>= 0.49.0',
|
||||
default_options: [
|
||||
'c_std=c99',
|
||||
'build.c_std=c99',
|
||||
'c_std=c11',
|
||||
'build.c_std=c11',
|
||||
'cpp_std=c++17',
|
||||
'build.cpp_std=c++17',
|
||||
'warning_level=3',
|
||||
@@ -24,15 +24,15 @@ c_compiler = meson.get_compiler('c')
|
||||
|
||||
if compiler.get_id() == 'gcc' and compiler.version().version_compare('<8')
|
||||
warning('Your GCC version is too old. You need at least version 8.')
|
||||
elif compiler.get_id() == 'clang' and compiler.version().version_compare('<5')
|
||||
warning('Your clang version is too old. You need at least version 5.')
|
||||
elif compiler.get_id() == 'clang' and compiler.version().version_compare('<7')
|
||||
warning('Your clang version is too old. You need at least version 7.')
|
||||
endif
|
||||
|
||||
version_conf = configuration_data()
|
||||
version_conf.set_quoted('PACKAGE', meson.project_name())
|
||||
version_conf.set_quoted('PACKAGE_NAME', meson.project_name())
|
||||
version_conf.set_quoted('VERSION', meson.project_version())
|
||||
version_conf.set_quoted('PROTOCOL_VERSION', '0.22.0')
|
||||
version_conf.set_quoted('PROTOCOL_VERSION', '0.22.4')
|
||||
configure_file(output: 'Version.h', configuration: version_conf)
|
||||
|
||||
conf = configuration_data()
|
||||
@@ -42,68 +42,80 @@ common_cppflags = [
|
||||
'-D_GNU_SOURCE',
|
||||
]
|
||||
|
||||
common_cflags = [
|
||||
]
|
||||
|
||||
common_cxxflags = [
|
||||
test_global_common_flags = [
|
||||
'-fvisibility=hidden',
|
||||
]
|
||||
|
||||
test_common_flags = [
|
||||
'-Wvla',
|
||||
'-Wdouble-promotion',
|
||||
|
||||
'-fvisibility=hidden',
|
||||
|
||||
'-ffast-math',
|
||||
'-ftree-vectorize',
|
||||
]
|
||||
|
||||
test_global_cxxflags = test_global_common_flags + [
|
||||
]
|
||||
|
||||
test_global_cflags = test_global_common_flags + [
|
||||
]
|
||||
|
||||
test_cxxflags = test_common_flags + [
|
||||
'-fno-threadsafe-statics',
|
||||
'-fmerge-all-constants',
|
||||
|
||||
'-Wmissing-declarations',
|
||||
'-Wshadow',
|
||||
'-Wpointer-arith',
|
||||
'-Wcast-qual',
|
||||
'-Wwrite-strings',
|
||||
'-Wsign-compare',
|
||||
'-Wcomma',
|
||||
'-Wcomma-subscript',
|
||||
'-Wextra-semi',
|
||||
'-Wmismatched-tags',
|
||||
'-Wmissing-declarations',
|
||||
'-Woverloaded-virtual',
|
||||
'-Wshadow',
|
||||
'-Wsign-promo',
|
||||
'-Wunused',
|
||||
'-Wvolatile',
|
||||
'-Wvirtual-inheritance',
|
||||
'-Wwrite-strings',
|
||||
|
||||
# a vtable without a dtor is just fine
|
||||
'-Wno-non-virtual-dtor',
|
||||
|
||||
# clang specific warning options:
|
||||
'-Wcomma',
|
||||
'-Wheader-hygiene',
|
||||
'-Winconsistent-missing-destructor-override',
|
||||
'-Wunreachable-code-break',
|
||||
'-Wunused',
|
||||
'-Wunreachable-code-aggressive',
|
||||
'-Wused-but-marked-unused',
|
||||
|
||||
'-Wno-non-virtual-dtor',
|
||||
]
|
||||
|
||||
if compiler.get_id() == 'clang'
|
||||
# Workaround for clang bug
|
||||
# https://bugs.llvm.org/show_bug.cgi?id=32611
|
||||
test_cxxflags += '-funwind-tables'
|
||||
if compiler.get_id() != 'gcc' or compiler.version().version_compare('>=9')
|
||||
# The GCC 8 implementation of this flag is buggy: it complains even
|
||||
# if "final" is present, which implies "override".
|
||||
test_cxxflags += '-Wsuggest-override'
|
||||
endif
|
||||
|
||||
test_cflags = test_common_flags + [
|
||||
'-Wcast-qual',
|
||||
'-Wmissing-prototypes',
|
||||
'-Wshadow',
|
||||
'-Wpointer-arith',
|
||||
'-Wstrict-prototypes',
|
||||
'-Wcast-qual',
|
||||
'-Wwrite-strings',
|
||||
'-pedantic',
|
||||
]
|
||||
|
||||
test_ldflags = [
|
||||
# make relocations read-only (hardening)
|
||||
'-Wl,-z,relro',
|
||||
|
||||
# no lazy binding, please - not worth it for a daemon
|
||||
'-Wl,-z,now',
|
||||
]
|
||||
|
||||
if get_option('buildtype') != 'debug'
|
||||
test_cxxflags += [
|
||||
test_global_cxxflags += [
|
||||
'-ffunction-sections',
|
||||
'-fdata-sections',
|
||||
]
|
||||
test_cflags += [
|
||||
test_global_cflags += [
|
||||
'-ffunction-sections',
|
||||
'-fdata-sections',
|
||||
]
|
||||
@@ -112,9 +124,21 @@ if get_option('buildtype') != 'debug'
|
||||
]
|
||||
endif
|
||||
|
||||
add_global_arguments(common_cxxflags + compiler.get_supported_arguments(test_cxxflags), language: 'cpp')
|
||||
add_global_arguments(common_cflags + c_compiler.get_supported_arguments(test_cflags), language: 'c')
|
||||
add_global_link_arguments(compiler.get_supported_link_arguments(test_ldflags), language: 'cpp')
|
||||
if get_option('fuzzer')
|
||||
fuzzer_flags = ['-fsanitize=fuzzer']
|
||||
if get_option('b_sanitize') == 'none'
|
||||
fuzzer_flags += ['-fsanitize=address,undefined']
|
||||
endif
|
||||
add_global_arguments(fuzzer_flags, language: 'cpp')
|
||||
add_global_arguments(fuzzer_flags, language: 'c')
|
||||
add_global_link_arguments(fuzzer_flags, language: 'cpp')
|
||||
endif
|
||||
|
||||
add_global_arguments(compiler.get_supported_arguments(test_global_cxxflags), language: 'cpp')
|
||||
add_global_arguments(c_compiler.get_supported_arguments(test_global_cflags), language: 'c')
|
||||
add_project_arguments(compiler.get_supported_arguments(test_cxxflags), language: 'cpp')
|
||||
add_project_arguments(c_compiler.get_supported_arguments(test_cflags), language: 'c')
|
||||
add_project_link_arguments(compiler.get_supported_link_arguments(test_ldflags), language: 'cpp')
|
||||
|
||||
is_linux = host_machine.system() == 'linux'
|
||||
is_android = get_option('android_ndk') != ''
|
||||
@@ -128,10 +152,29 @@ endif
|
||||
|
||||
if is_windows
|
||||
common_cppflags += [
|
||||
'-DWIN32_LEAN_AND_MEAN',
|
||||
# enable Windows Vista APIs
|
||||
'-DWINVER=0x0600', '-D_WIN32_WINNT=0x0600',
|
||||
'-DSTRICT',
|
||||
|
||||
# enable Unicode support (TCHAR=wchar_t) in the Windows API (macro
|
||||
# "UNICODE) and the C library (macro "_UNICODE")
|
||||
'-DUNICODE', '-D_UNICODE',
|
||||
|
||||
# enable strict type checking in the Windows API headers
|
||||
'-DSTRICT',
|
||||
|
||||
# reduce header bloat by disabling obscure and obsolete Windows
|
||||
# APIs
|
||||
'-DWIN32_LEAN_AND_MEAN',
|
||||
|
||||
# disable more Windows APIs which are not used by MPD
|
||||
'-DNOGDI', '-DNOBITMAP', '-DNOCOMM',
|
||||
'-DNOUSER',
|
||||
|
||||
# reduce COM header bloat
|
||||
'-DCOM_NO_WINDOWS_H',
|
||||
|
||||
# disable Internet Explorer specific APIs
|
||||
'-D_WIN32_IE=0',
|
||||
]
|
||||
|
||||
subdir('win32')
|
||||
@@ -147,8 +190,6 @@ add_global_arguments(common_cppflags, language: 'cpp')
|
||||
enable_daemon = not is_windows and not is_android and get_option('daemon')
|
||||
conf.set('ENABLE_DAEMON', enable_daemon)
|
||||
|
||||
conf.set('HAVE_CLOCALE', compiler.has_header('clocale'))
|
||||
|
||||
conf.set('HAVE_GETPWNAM_R', compiler.has_function('getpwnam_r'))
|
||||
conf.set('HAVE_GETPWUID_R', compiler.has_function('getpwuid_r'))
|
||||
conf.set('HAVE_INITGROUPS', compiler.has_function('initgroups'))
|
||||
@@ -219,7 +260,6 @@ log_dep = declare_dependency(
|
||||
sources = [
|
||||
version_cxx,
|
||||
'src/Main.cxx',
|
||||
'src/protocol/Ack.cxx',
|
||||
'src/protocol/ArgParser.cxx',
|
||||
'src/protocol/Result.cxx',
|
||||
'src/command/CommandError.cxx',
|
||||
@@ -263,7 +303,6 @@ sources = [
|
||||
'src/LogInit.cxx',
|
||||
'src/ls.cxx',
|
||||
'src/Instance.cxx',
|
||||
'src/win32/Win32Main.cxx',
|
||||
'src/MusicBuffer.cxx',
|
||||
'src/MusicPipe.cxx',
|
||||
'src/MusicChunk.cxx',
|
||||
@@ -311,6 +350,12 @@ sources = [
|
||||
'src/PlaylistFile.cxx',
|
||||
]
|
||||
|
||||
if is_windows
|
||||
sources += [
|
||||
'src/win32/Win32Main.cxx',
|
||||
]
|
||||
endif
|
||||
|
||||
if not is_android
|
||||
sources += [
|
||||
'src/CommandLine.cxx',
|
||||
@@ -345,6 +390,7 @@ subdir('src/system')
|
||||
subdir('src/thread')
|
||||
subdir('src/net')
|
||||
subdir('src/event')
|
||||
subdir('src/win32')
|
||||
|
||||
subdir('src/apple')
|
||||
|
||||
@@ -504,6 +550,7 @@ mpd = build_target(
|
||||
chromaprint_dep,
|
||||
],
|
||||
link_args: link_args,
|
||||
build_by_default: not get_option('fuzzer'),
|
||||
install: not is_android and not is_haiku,
|
||||
)
|
||||
|
||||
@@ -544,3 +591,7 @@ subdir('doc')
|
||||
if get_option('test')
|
||||
subdir('test')
|
||||
endif
|
||||
|
||||
if get_option('fuzzer')
|
||||
subdir('test/fuzzer')
|
||||
endif
|
||||
|
@@ -2,8 +2,6 @@ option('documentation', type: 'feature', description: 'Build documentation')
|
||||
option('html_manual', type: 'boolean', value: true, description: 'Build the HTML manual')
|
||||
option('manpages', type: 'boolean', value: true, description: 'Build manual pages')
|
||||
|
||||
option('test', type: 'boolean', value: false, description: 'Build the unit tests and debug programs')
|
||||
|
||||
option('syslog', type: 'feature', description: 'syslog support')
|
||||
option('inotify', type: 'boolean', value: true, description: 'inotify support (for automatic database update)')
|
||||
option('io_uring', type: 'feature', description: 'Linux io_uring support using liburing')
|
||||
@@ -14,6 +12,13 @@ option('systemd', type: 'feature', description: 'systemd support')
|
||||
option('systemd_system_unit_dir', type: 'string', description: 'systemd system service directory')
|
||||
option('systemd_user_unit_dir', type: 'string', description: 'systemd user service directory')
|
||||
|
||||
#
|
||||
# Options for developers
|
||||
#
|
||||
|
||||
option('test', type: 'boolean', value: false, description: 'Build the unit tests and debug programs')
|
||||
option('fuzzer', type: 'boolean', value: false, description: 'Build fuzzers (requires libFuzzer)')
|
||||
|
||||
#
|
||||
# Android
|
||||
#
|
||||
@@ -87,7 +92,11 @@ option('cdio_paranoia', type: 'feature', description: 'libcdio_paranoia input pl
|
||||
option('curl', type: 'feature', description: 'HTTP client using CURL')
|
||||
option('mms', type: 'feature', description: 'MMS protocol support using libmms')
|
||||
option('nfs', type: 'feature', description: 'NFS protocol support using libnfs')
|
||||
option('smbclient', type: 'feature', description: 'SMB support using libsmbclient')
|
||||
|
||||
# The "smbclient" plugin is disabled by default because libsmbclient
|
||||
# has a serious bug which crashes MPD very quickly:
|
||||
# https://bugzilla.samba.org/show_bug.cgi?id=11413
|
||||
option('smbclient', type: 'feature', value: 'disabled', description: 'SMB support using libsmbclient')
|
||||
|
||||
#
|
||||
# Commercial services
|
||||
|
@@ -21,3 +21,8 @@ class BoostProject(Project):
|
||||
dest = os.path.join(includedir, 'boost')
|
||||
shutil.rmtree(dest, ignore_errors=True)
|
||||
shutil.copytree(os.path.join(src, 'boost'), dest)
|
||||
|
||||
# touch the boost/version.hpp file to ensure it's newer than
|
||||
# the downloaded Boost tarball, to avoid reinstalling Boost on
|
||||
# every run
|
||||
os.utime(os.path.join(toolchain.install_prefix, self.installed))
|
||||
|
@@ -10,11 +10,6 @@ class FfmpegProject(Project):
|
||||
self.configure_args = configure_args
|
||||
self.cppflags = cppflags
|
||||
|
||||
def _filter_cflags(self, flags):
|
||||
# FFmpeg expects the GNU as syntax
|
||||
flags = flags.replace(' -integrated-as ', ' -no-integrated-as ')
|
||||
return flags
|
||||
|
||||
def build(self, toolchain):
|
||||
src = self.unpack(toolchain)
|
||||
build = self.make_build_path(toolchain)
|
||||
@@ -36,8 +31,8 @@ class FfmpegProject(Project):
|
||||
'--cc=' + toolchain.cc,
|
||||
'--cxx=' + toolchain.cxx,
|
||||
'--nm=' + toolchain.nm,
|
||||
'--extra-cflags=' + self._filter_cflags(toolchain.cflags) + ' ' + toolchain.cppflags + ' ' + self.cppflags,
|
||||
'--extra-cxxflags=' + self._filter_cflags(toolchain.cxxflags) + ' ' + toolchain.cppflags + ' ' + self.cppflags,
|
||||
'--extra-cflags=' + toolchain.cflags + ' ' + toolchain.cppflags + ' ' + self.cppflags,
|
||||
'--extra-cxxflags=' + toolchain.cxxflags + ' ' + toolchain.cppflags + ' ' + self.cppflags,
|
||||
'--extra-ldflags=' + toolchain.ldflags,
|
||||
'--extra-libs=' + toolchain.libs,
|
||||
'--ar=' + toolchain.ar,
|
||||
|
47
python/build/jack.py
Normal file
47
python/build/jack.py
Normal file
@@ -0,0 +1,47 @@
|
||||
import os, shutil
|
||||
import re
|
||||
|
||||
from .project import Project
|
||||
|
||||
# This class installs just the public headers and a fake pkg-config
|
||||
# file which defines the macro "DYNAMIC_JACK". This tells MPD's JACK
|
||||
# output plugin to load the libjack64.dll dynamically using
|
||||
# LoadLibrary(). This kludge avoids the runtime DLL dependency for
|
||||
# users who don't use JACK, but still allows using the system JACK
|
||||
# client library.
|
||||
#
|
||||
# The problem with JACK is that it uses an extremely fragile shared
|
||||
# memory protocol to communicate with the daemon. One needs to use
|
||||
# daemon and client library from the same build. That's why we don't
|
||||
# build libjack statically here; it would probably not be compatible
|
||||
# with the user's JACK daemon.
|
||||
|
||||
class JackProject(Project):
|
||||
def __init__(self, url, md5, installed,
|
||||
**kwargs):
|
||||
m = re.match(r'.*/v([\d.]+)\.tar\.gz$', url)
|
||||
self.version = m.group(1)
|
||||
Project.__init__(self, url, md5, installed,
|
||||
name='jack2', version=self.version,
|
||||
base='jack2-' + self.version,
|
||||
**kwargs)
|
||||
|
||||
def build(self, toolchain):
|
||||
src = self.unpack(toolchain)
|
||||
|
||||
includes = ['jack.h', 'ringbuffer.h', 'systemdeps.h', 'transport.h', 'types.h', 'weakmacros.h']
|
||||
includedir = os.path.join(toolchain.install_prefix, 'include', 'jack')
|
||||
os.makedirs(includedir, exist_ok=True)
|
||||
|
||||
for i in includes:
|
||||
shutil.copyfile(os.path.join(src, 'common', 'jack', i),
|
||||
os.path.join(includedir, i))
|
||||
|
||||
with open(os.path.join(toolchain.install_prefix, 'lib', 'pkgconfig', 'jack.pc'), 'w') as f:
|
||||
print("prefix=" + toolchain.install_prefix, file=f)
|
||||
print("", file=f)
|
||||
print("Name: jack", file=f)
|
||||
print("Description: dummy", file=f)
|
||||
print("Version: " + self.version, file=f)
|
||||
print("Libs: ", file=f)
|
||||
print("Cflags: -DDYNAMIC_JACK", file=f)
|
@@ -7,7 +7,9 @@ from build.meson import MesonProject
|
||||
from build.cmake import CmakeProject
|
||||
from build.autotools import AutotoolsProject
|
||||
from build.ffmpeg import FfmpegProject
|
||||
from build.openssl import OpenSSLProject
|
||||
from build.boost import BoostProject
|
||||
from build.jack import JackProject
|
||||
|
||||
libmpdclient = MesonProject(
|
||||
'https://www.musicpd.org/download/libmpdclient/2/libmpdclient-2.19.tar.xz',
|
||||
@@ -148,8 +150,8 @@ gme = CmakeProject(
|
||||
)
|
||||
|
||||
ffmpeg = FfmpegProject(
|
||||
'http://ffmpeg.org/releases/ffmpeg-4.3.1.tar.xz',
|
||||
'ad009240d46e307b4e03a213a0f49c11b650e445b1f8be0dda2a9212b34d2ffb',
|
||||
'http://ffmpeg.org/releases/ffmpeg-4.4.tar.xz',
|
||||
'06b10a183ce5371f915c6bb15b7b1fffbe046e8275099c96affc29e17645d909',
|
||||
'lib/libavcodec.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
@@ -376,9 +378,15 @@ ffmpeg = FfmpegProject(
|
||||
],
|
||||
)
|
||||
|
||||
openssl = OpenSSLProject(
|
||||
'https://www.openssl.org/source/openssl-3.0.0-alpha16.tar.gz',
|
||||
'08ce8244b59d75f40f91170dfcb012bf25309cdcb1fef9502e39d694f883d1d1',
|
||||
'include/openssl/ossl_typ.h',
|
||||
)
|
||||
|
||||
curl = AutotoolsProject(
|
||||
'http://curl.haxx.se/download/curl-7.72.0.tar.xz',
|
||||
'0ded0808c4d85f2ee0db86980ae610cc9d165e9ca9da466196cc73c346513713',
|
||||
'https://curl.se/download/curl-7.76.1.tar.xz',
|
||||
'64bb5288c39f0840c07d077e30d9052e1cbb9fa6c2dc52523824cc859e679145',
|
||||
'lib/libcurl.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
@@ -399,7 +407,10 @@ curl = AutotoolsProject(
|
||||
'--disable-netrc',
|
||||
'--disable-progress-meter',
|
||||
'--disable-alt-svc',
|
||||
'--without-ssl', '--without-gnutls', '--without-nss', '--without-libssh2',
|
||||
'--without-gnutls', '--without-nss', '--without-libssh2',
|
||||
|
||||
# native Windows SSL/TLS support, option ignored on non-Windows builds
|
||||
'--with-schannel',
|
||||
],
|
||||
|
||||
patches='src/lib/curl/patches',
|
||||
@@ -429,11 +440,18 @@ libnfs = AutotoolsProject(
|
||||
'--disable-utils', '--disable-examples',
|
||||
],
|
||||
base='libnfs-libnfs-4.0.0',
|
||||
patches='src/lib/nfs/patches',
|
||||
autoreconf=True,
|
||||
)
|
||||
|
||||
jack = JackProject(
|
||||
'https://github.com/jackaudio/jack2/archive/v1.9.17.tar.gz',
|
||||
'38f674bbc57852a8eb3d9faa1f96a0912d26f7d5df14c11005ad499c8ae352f2',
|
||||
'lib/pkgconfig/jack.pc',
|
||||
)
|
||||
|
||||
boost = BoostProject(
|
||||
'https://dl.bintray.com/boostorg/release/1.74.0/source/boost_1_74_0.tar.bz2',
|
||||
'83bfc1507731a0906e387fc28b7ef5417d591429e51e788417fe9ff025e116b1',
|
||||
'https://boostorg.jfrog.io/artifactory/main/release/1.76.0/source/boost_1_76_0.tar.bz2',
|
||||
'f0397ba6e982c4450f27bf32a2a83292aba035b827a5623a14636ea583318c41',
|
||||
'include/boost/version.hpp',
|
||||
)
|
||||
|
55
python/build/openssl.py
Normal file
55
python/build/openssl.py
Normal file
@@ -0,0 +1,55 @@
|
||||
import subprocess
|
||||
|
||||
from build.makeproject import MakeProject
|
||||
|
||||
class OpenSSLProject(MakeProject):
|
||||
def __init__(self, url, md5, installed,
|
||||
**kwargs):
|
||||
MakeProject.__init__(self, url, md5, installed, install_target='install_dev', **kwargs)
|
||||
|
||||
def get_make_args(self, toolchain):
|
||||
return MakeProject.get_make_args(self, toolchain) + [
|
||||
'CC=' + toolchain.cc,
|
||||
'CFLAGS=' + toolchain.cflags,
|
||||
'CPPFLAGS=' + toolchain.cppflags,
|
||||
'AR=' + toolchain.ar,
|
||||
'RANLIB=' + toolchain.ranlib,
|
||||
'build_libs',
|
||||
]
|
||||
|
||||
def build(self, toolchain):
|
||||
src = self.unpack(toolchain, out_of_tree=False)
|
||||
|
||||
# OpenSSL has a weird target architecture scheme with lots of
|
||||
# hard-coded architectures; this table translates between our
|
||||
# "toolchain_arch" (HOST_TRIPLET) and the OpenSSL target
|
||||
openssl_archs = {
|
||||
# not using "android-*" because those OpenSSL targets want
|
||||
# to know where the SDK is, but our own build scripts
|
||||
# prepared everything already to look like a regular Linux
|
||||
# build
|
||||
'arm-linux-androideabi': 'linux-generic32',
|
||||
'aarch64-linux-android': 'linux-aarch64',
|
||||
'i686-linux-android': 'linux-x86-clang',
|
||||
'x86_64-linux-android': 'linux-x86_64-clang',
|
||||
|
||||
# Kobo
|
||||
'arm-linux-gnueabihf': 'linux-generic32',
|
||||
|
||||
# Windows
|
||||
'i686-w64-mingw32': 'mingw',
|
||||
'x86_64-w64-mingw32': 'mingw64',
|
||||
}
|
||||
|
||||
openssl_arch = openssl_archs[toolchain.arch]
|
||||
|
||||
subprocess.check_call(['./Configure',
|
||||
'no-shared',
|
||||
'no-module', 'no-engine', 'no-static-engine',
|
||||
'no-async',
|
||||
'no-tests',
|
||||
'no-asm', # "asm" causes build failures on Windows
|
||||
openssl_arch,
|
||||
'--prefix=' + toolchain.install_prefix],
|
||||
cwd=src, env=toolchain.env)
|
||||
MakeProject.build(self, toolchain, src)
|
@@ -20,7 +20,7 @@ class Project:
|
||||
self.base = base
|
||||
|
||||
if name is None or version is None:
|
||||
m = re.match(r'^([-\w]+)-(\d[\d.]*[a-z]?[\d.]*)$', self.base)
|
||||
m = re.match(r'^([-\w]+)-(\d[\d.]*[a-z]?[\d.]*(?:-alpha\d+)?)(\+.*)?$', self.base)
|
||||
if name is None: name = m.group(1)
|
||||
if version is None: version = m.group(2)
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -113,7 +113,7 @@ static void version()
|
||||
printf("Music Player Daemon " VERSION " (%s)"
|
||||
"\n"
|
||||
"Copyright 2003-2007 Warren Dukes <warren.dukes@gmail.com>\n"
|
||||
"Copyright 2008-2018 Max Kellermann <max.kellermann@gmail.com>\n"
|
||||
"Copyright 2008-2021 Max Kellermann <max.kellermann@gmail.com>\n"
|
||||
"This is free software; see the source for copying conditions. There is NO\n"
|
||||
"warranty; not even MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n",
|
||||
GIT_VERSION);
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
13
src/Main.cxx
13
src/Main.cxx
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -111,7 +111,7 @@
|
||||
|
||||
#include <climits>
|
||||
|
||||
#ifdef HAVE_CLOCALE
|
||||
#ifndef ANDROID
|
||||
#include <clocale>
|
||||
#endif
|
||||
|
||||
@@ -358,11 +358,9 @@ MainConfigured(const struct options &options, const ConfigData &raw_config)
|
||||
#endif
|
||||
|
||||
#ifndef ANDROID
|
||||
#ifdef HAVE_CLOCALE
|
||||
/* initialize locale */
|
||||
std::setlocale(LC_CTYPE,"");
|
||||
std::setlocale(LC_COLLATE, "");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
const ScopeIcuInit icu_init;
|
||||
@@ -479,6 +477,7 @@ MainConfigured(const struct options &options, const ConfigData &raw_config)
|
||||
#endif
|
||||
|
||||
ZeroconfInit(raw_config, instance.event_loop);
|
||||
AtScopeExit() { ZeroconfDeinit(); };
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
if (create_db) {
|
||||
@@ -535,10 +534,10 @@ MainConfigured(const struct options &options, const ConfigData &raw_config)
|
||||
|
||||
/* cleanup */
|
||||
|
||||
if (instance.state_file)
|
||||
instance.state_file->Write();
|
||||
|
||||
instance.BeginShutdownUpdate();
|
||||
|
||||
ZeroconfDeinit();
|
||||
|
||||
instance.BeginShutdownPartitions();
|
||||
}
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -42,9 +42,9 @@ RemoteTagCache::Lookup(const std::string &uri) noexcept
|
||||
std::unique_lock<Mutex> lock(mutex);
|
||||
|
||||
KeyMap::insert_commit_data hint;
|
||||
auto result = map.insert_check(uri, Item::Hash(), Item::Equal(), hint);
|
||||
if (result.second) {
|
||||
auto *item = new Item(*this, uri);
|
||||
auto [tag, value] = map.insert_check(uri, Item::Hash(), Item::Equal(), hint);
|
||||
if (value) {
|
||||
auto item = new Item(*this, uri);
|
||||
map.insert_commit(*item, hint);
|
||||
waiting_list.push_back(*item);
|
||||
lock.unlock();
|
||||
@@ -70,15 +70,13 @@ RemoteTagCache::Lookup(const std::string &uri) noexcept
|
||||
ItemResolved(*item);
|
||||
return;
|
||||
}
|
||||
} else if (result.first->scanner) {
|
||||
} else if (tag->scanner) {
|
||||
/* already scanning this one - no-op */
|
||||
} else {
|
||||
/* already finished: re-invoke the handler */
|
||||
|
||||
auto &item = *result.first;
|
||||
|
||||
idle_list.erase(waiting_list.iterator_to(item));
|
||||
invoke_list.push_back(item);
|
||||
idle_list.erase(waiting_list.iterator_to(*tag));
|
||||
invoke_list.push_back(*tag);
|
||||
|
||||
ScheduleInvokeHandlers();
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -91,7 +91,14 @@ song_print_info(Response &r, const LightSong &song, bool base) noexcept
|
||||
if (song.audio_format.IsDefined())
|
||||
r.Format("Format: %s\n", ToString(song.audio_format).c_str());
|
||||
|
||||
tag_print(r, song.tag);
|
||||
tag_print_values(r, song.tag);
|
||||
|
||||
const auto duration = song.GetDuration();
|
||||
if (!duration.IsNegative())
|
||||
r.Format("Time: %i\n"
|
||||
"duration: %1.3f\n",
|
||||
duration.RoundS(),
|
||||
duration.ToDoubleS());
|
||||
}
|
||||
|
||||
void
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2020 The Music Player Daemon Project
|
||||
* Copyright 2003-2021 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user