Rosen Penev
30e3ef4c8e
constexpr/std::array conversions
...
Signed-off-by: Rosen Penev <rosenp@gmail.com>
2021-08-16 21:05:56 -07:00
Rosen Penev
4c5fea96e4
constexpr global variable conversion
...
Found with cppcoreguidelines-avoid-non-const-global-variables
Signed-off-by: Rosen Penev <rosenp@gmail.com>
2021-08-16 20:58:21 -07:00
Rosen Penev
46600931e4
clang-tidy: use default
...
Found with modernize-use-default
Signed-off-by: Rosen Penev <rosenp@gmail.com>
2021-08-16 20:48:28 -07:00
Max Kellermann
a2387210bf
time/FileTime: move code to SystemClock.hxx
2021-08-10 19:53:53 +02:00
Max Kellermann
d7e7adb496
time/FileTime: add ChronoToFileTime()
2021-08-10 16:16:15 +02:00
Max Kellermann
45354a421c
time/FileTime: preserve the FILETIME resolution
...
Don't truncate the FILETIME to second resolution to pass it to
std::chrono::system_clock::from_time_t(); instead, calculate the
offset between the FILETIME epoch and the
std::system_clock::time_point epoch, and use that to initialize the
time_point directly.
2021-08-10 15:16:59 +02:00
Max Kellermann
9fc3c60910
time/FileTime: add FileTimeToChronoDuration()
2021-08-10 15:13:22 +02:00
Max Kellermann
1976003e91
time/FileTime: allow negative times
2021-08-10 15:13:16 +02:00
Max Kellermann
488afc47d4
time/FileTime: use uint_least64_t
2021-08-10 15:12:49 +02:00
Max Kellermann
f3d67115d7
output/wasapi: check ENABLE_DSD before setting dsd_mode
2021-08-10 15:00:58 +02:00
Max Kellermann
0dacde32f2
output/pipewire: append output name to PW node name
2021-08-10 11:30:25 +02:00
Max Kellermann
528e05f025
output/pipewire: add config option "remote"
2021-08-10 11:28:29 +02:00
Max Kellermann
269583f5dd
output/pipewire: allow specifying a target by its name
2021-08-10 11:17:16 +02:00
Max Kellermann
7c9f4f7e4f
output/pipewire: create inactive stream, fill ring_buffer first
...
This avoids underruns at the start of playback.
2021-08-10 10:50:42 +02:00
Max Kellermann
00fd692eba
output/pipewire: wait for buffer to fill before resuming
2021-08-10 10:48:25 +02:00
Max Kellermann
668c3782b2
output/pipewire: smaller ring buffer, 500ms should be enough
2021-08-10 10:43:56 +02:00
Max Kellermann
1e0af2dadf
output/pipewire: add type alias for boost::lockfree::spsc_queue
2021-08-10 10:43:54 +02:00
Max Kellermann
4ea2ea2a52
output/pipewire: update nbytes
after calling PcmSilence()
...
This was missing in commit 8a243e6e28
2021-08-10 10:43:28 +02:00
Max Kellermann
8a243e6e28
output/pipewire: call pw_stream_flush() only if really draining
...
If draining was not requested, generate silence instead if there is no
data in the ring buffer.
The problem is that pw_stream_flush() appears to disable the stream
permanently, even though there is no state_changed callback - the
stream state remains at PW_STREAM_STATE_STREAMING, but the stream is
defunct. I have no idea why and I havn't found any documentation
about it.
Closes https://github.com/MusicPlayerDaemon/MPD/issues/1219
2021-08-10 06:30:58 +02:00
Max Kellermann
d33aa01000
output/pipewire: reset the "paused" flag
...
This was missing in commit 4d1ce7023b
2021-08-09 19:31:22 +02:00
Max Kellermann
bd893e6336
release v0.22.10
...
-----BEGIN PGP SIGNATURE-----
iQJEBAABCgAuFiEEA5IzWngIOJSkMBxDI26KWMbbRRIFAmENYHwQHG1heEBtdXNp
Y3BkLm9yZwAKCRAjbopYxttFEpGtD/9ToU27x36NAAFpChicSqbu3h2wtJ29lowT
ivV80XB26pQeGK0DSXADSs38MVXo42i3vqg0zGWV9TRbcDs5VErXANVLN16qsKCu
U0v1BDY11UiYp6ATiUjIahyG1UsmbRVZlfDyVIhYvmFpGLFw6+03HH6w2k/v85ns
FxyXkYDYcUokPJPEQcChE1eIwKsGM6MjbdVIkJAEo3wGhL/Hhy2KUskrFcCo1PDj
7xxGrwauG+8wSjAWMA5vzl3udRaDauuXztm5QbQIDdsbRaCiBAdgkzC0PvIxTOr0
bR4WHVB0KSiM96yIXNtg/WZxO0XrxppmX/E4eZSgz0JGKMrAHcoTJAUCIDu3X719
gJnJLg7r2X5dTchXezv09YoJolKbw1bOooyAuE4FCDWMsOa2GRuBZC+8w7DNTZuo
PTh+Z40fnfpNBofe+e/WZrXr6i2TKk8CqHEidq2GHlOkvTR7g6m8MjOLvZNHotMb
9ECr9MhzXH+nvEX8IaxvjWsfLJiDbUgnVsQ+6akGtkbragaDN/Wgr/XdkELoLlsK
LZFY5ngnZmDXOu4tjBLJtfrTkZB2/Hld4xtF1qlsy9fvZBRKeKlpABTLaa8r/vnR
Ta0rB2O3/dculZbHZRUnZvLS4Xv4g322vW9Wso9IBoWRn9fC8b2zR93k7breAqcn
pKbYGg/j6g==
=/954
-----END PGP SIGNATURE-----
Merge tag 'v0.22.10'
release v0.22.10
2021-08-06 18:21:59 +02:00
Max Kellermann
04eb911a51
mixer/alsa: use cached values to work around rounding errors
...
This replaces 967af60327
with a more
effective workaround.
Closes https://github.com/MusicPlayerDaemon/MPD/issues/822
2021-08-06 18:16:37 +02:00
Max Kellermann
351b39e0c5
mixer/alsa: skip the snd_mixer_handle_events() call in alsa_mixer_elem_callback()
...
snd_mixer_handle_events() has already been called by
DispatchSockets(). This way, we can also skip the exception handler.
2021-08-06 18:03:36 +02:00
Max Kellermann
3b6d4e6673
mixer/alsa: move alsa_mixer_elem_callback() into the AlsaMixer class
2021-08-06 18:01:19 +02:00
Max Kellermann
e8f328d8ad
mixer/alsa: move code to GetPercentVolume()
2021-08-06 17:56:30 +02:00
Max Kellermann
5f5b5f63af
mixer/alsa: move code to NormalizedToPercent()
2021-08-06 17:55:59 +02:00
Max Kellermann
ad6e303047
mixer/alsa: move code to GetNormalizedVolume()
2021-08-06 17:53:45 +02:00
Max Kellermann
1985786ed2
db/simple: prune CUE entries from database for non-existent songs
...
Closes https://github.com/MusicPlayerDaemon/MPD/issues/1019
2021-08-05 20:26:21 +02:00
Max Kellermann
8e0d39ae94
db/update/Playlist: prepend "../" only for relative URIs
...
Prepending "../" to absolute URIs would break them.
2021-08-05 20:19:33 +02:00
Max Kellermann
1761fb14af
fs/Traits: add PathTraitsUTF8::IsAbsoluteOrHasScheme()
2021-08-05 20:09:06 +02:00
Max Kellermann
ef2fc4e6f6
db/simple/Directory: remove obsolete API doc
2021-08-05 19:05:03 +02:00
Max Kellermann
b979245d6c
decoder/Bridge: call UpdateStreamTag() only if there is no pending seek
...
If UpdateStreamTag() gets called while an initial seek is pending, the
result will never be submitted to a MusicChunk. By avoiding the
UpdateStreamTag() call in that case (by moving UpdateStreamTag() to
after the PrepareInitialSeek() check), the song_tag is preserved until
UpdateStreamTag() is called again from SubmitData().
This fixes missing tags in the "httpd" output.
Closes https://github.com/MusicPlayerDaemon/MPD/issues/1137
2021-08-05 18:02:45 +02:00
Max Kellermann
a74b07728e
tag/Tag: add Merge() which takes Tag pointers
2021-08-05 17:36:14 +02:00
Max Kellermann
7d69cbbda7
tag/Tag: Merge() returns Tag, MergePtr() returns std::unique_ptr<Tag>
2021-08-05 17:32:23 +02:00
Constantin Fuerst
955502f881
output/oss: enable DoP
...
Explanation
This adds support for DOP using the PcmExport function if the macro
ENABLE_DSD is defined. If enabled within the config-file using "dop",
the boolean dop_setting will be true. If DSD input is encountered and
the setting is on, it is checked whether the oss-device supports the
required samplerate. If that is the case, dop_active is set to true
and conversion of the input is prevented. If the sample rate is not
supported, conversion to S32 is requested. When playing back, the
PcmExport is used to pack the incoming stream into PCM. Reasoning
This is required for OSs without the required driver support for
native DSD playback that also have no ALSA. Mainly *BSD users are the
target audience for this functionality, as ALSA here is only a proxy
without full functionality. Requirements
DAC that supports the DOP standard
Building with OSS, DSD and S32-Format
Supported Formats / Required PCM Formats
DSF, DFF and WavPack-DSD will work.
DSD64, 1 Channel -> S24:176.4kHz (untested, lack of time / missing samples)
DSD64, 2 Channel -> S24:352.8kHz
DSD64, 4 Channel -> S24:705.6kHz (untested, lmissing equipment)
DSD128, 1 Channel -> S24:352.8kHz (untested, lack of time / missing samples)
DSD128, 2 Channel -> S24:705.6kHz
DSD256, 1 Channel -> S24:705.6kHz (untested, lack of time / missing samples)
Changes
inclusion of required files
adding new domain for logging
adding dop_satisfied private function
adding required member variables for storing dop state and for dop-packing
adding dop boolean parameter to many functions that are required to act a little differently when dop is active
Testing
This has been tested to work with a Sabaj Da2 on FreeBSD, where the
red status indicator LED clearly shows that DSD playback is taking
place, instead of purple for "hi-res" which is seen when converting.
Issues
I have not tested this with S24 and right now AFMT_S32_NE is
required. If not defined, ENABLE_DSD will be undef'ed. This will be
addressed in a bit, however no DAC which supports DOP but not 32Bit is
known to me. Also, AFMT_S32_NE is not defined when building on FreeBSD
which is why this is just blatantly defined in the file at the moment.
Additionally, the new dop-option is not added into any documentation
whatsoever.
2021-08-05 16:21:43 +02:00
Max Kellermann
dee5d1b87b
output/oss: replace the AudioFormat field with 3 raw OSS integers
...
This simplifies Reopen().
2021-08-05 16:03:53 +02:00
Max Kellermann
d42342e0ba
output/oss: check returned value in oss_try_ioctl()
2021-08-05 15:53:30 +02:00
Max Kellermann
8da3f8c6a7
output/oss: oss_try_ioctl() throws on EINVAL
...
Eliminate some duplicate code.
2021-08-05 15:47:11 +02:00
Max Kellermann
c8c553c75c
pcm/Export: add method IsDopEnabled()
2021-08-05 15:35:11 +02:00
Max Kellermann
c97aabe43a
Merge branch 'v0.22.x'
2021-08-05 15:17:07 +02:00
Max Kellermann
17b0ac75ca
output/oss: always enable PcmExport for alsa_channel_order
...
We need this even when AFMT_S24_PACKED is not available, for the
correct channel order in multi-channel files. Internally, MPD uses
FLAC channel order, but OSS uses the same channel order as ALSA.
2021-08-05 15:11:54 +02:00
Max Kellermann
bde64a13e2
tag/Builder: do not acquire tag_pool_lock if TagItem list is empty
2021-08-05 14:32:58 +02:00
Max Kellermann
96875921b7
tag/Builder: use std::swap() in move operator
...
This way, we save the overhead for acquiring the tag_pool_lock.
2021-08-05 14:28:37 +02:00
Cebtenzzre
551c941b5a
tag/Builder: don't ignore the result of tag_pool_dup_item
...
Also, use RemoveAll() instead of directly clearing TagBuilder::items in
most cases, as its elements represent references that must be released.
Closes #1023
2021-08-05 14:25:55 +02:00
Cebtenzzre
624c77ab43
tag/Builder: another missing RemoveAll() call
2021-08-05 14:25:05 +02:00
Cebtenzzre
ba13b4b5d6
tag/Builder: use RemoveAll() to give up references
2021-08-05 14:23:48 +02:00
Cebtenzzre
4b2d9e544c
tag/Pool: add [[nodiscard]]
2021-08-05 14:20:59 +02:00
Max Kellermann
97c43954e8
input/tidal: remove defunct unmaintained plugin
...
This plugin has been defunct for several years. Tidal has not ever
replied to any of my emails, so they're apparently not interested in
MPD support.
2021-08-05 13:52:05 +02:00
Max Kellermann
b77acd35f7
output/winmm: fix struct/class mismatch
2021-08-05 11:40:47 +02:00
Max Kellermann
968624035c
mixer/pipewire: new plugin
2021-08-05 10:57:37 +02:00
Max Kellermann
b838bf3109
output/pipewire: un-inline StateChanged()
2021-08-05 10:48:17 +02:00
Max Kellermann
4d1ce7023b
output/pipewire: implement Pause()
2021-08-04 17:26:54 +02:00
Max Kellermann
52577ac87a
output/pipewire: implement Cancel() properly
2021-08-04 17:24:49 +02:00
Max Kellermann
9fa3984a2f
input/icy: adjust offset at end of stream in Read()
...
ProxyInputStream::Read() assigns the `offset` field, which is the
wrong offset because it does not consider Icy metadata removed from
the stream. Therefore, after every ProxyInputStream::Read() call,
IcyInputStream::Read() needs to override this offset. This was
missing at the end of the stream, when Read()==0.
Closes https://github.com/MusicPlayerDaemon/MPD/issues/1216
2021-08-02 16:40:04 +02:00
Max Kellermann
239698cb5a
output/pipewire: set channel positions
2021-07-30 15:55:37 +02:00
Max Kellermann
e55de6e9f0
output/pipewire: implement Drain()
2021-07-30 15:28:01 +02:00
Max Kellermann
cfaf2ed03c
output/pipewire: move code to CheckThrowError()
2021-07-30 15:24:20 +02:00
Max Kellermann
6015960871
output/pipewire: reset the "interrupted" flag in Cancel()
...
This fixes seeking.
2021-07-30 15:20:32 +02:00
Max Kellermann
26328cc915
output/pipewire: detect connection errors
2021-07-30 14:31:06 +02:00
Max Kellermann
cd512f0b40
output/pipewire: replace usleep() with with pw_thread_loop_wait()
2021-07-30 14:31:04 +02:00
Max Kellermann
be14dd59a8
output/pipewire: remove obsolete TODO comment
2021-07-30 13:50:55 +02:00
Max Kellermann
97e5787ff7
output/pipewire: call libpipewire only while holding the lock
...
Closes https://github.com/MusicPlayerDaemon/MPD/issues/1210
2021-07-30 13:49:22 +02:00
Max Kellermann
6975d3ca4b
output/pipewire: switch from pw_main_loop to pw_thread_loop
...
We need this for pw_thread_loop_lock().
2021-07-30 13:42:59 +02:00
Max Kellermann
cdca27e6bb
decoder/Bridge: fix libfmt string
2021-07-30 13:32:27 +02:00
Max Kellermann
5355335f19
db/simple/ExportedSong: check src.OwnsTag(), not this->OwnsTag()
...
this->OwnsTag() accesses fields that are not yet initialized.
2021-07-30 13:10:09 +02:00
Sam Bazley
5b775ca5b4
decoder/ffmpeg: check if long_name is not null
2021-07-28 16:05:15 +01:00
Jacob Vosmaer
ea95da3b1a
archive/meson.build: add missing libfmt dependency
2021-07-26 23:26:07 +02:00
Sam Bazley
57687779be
Android: add option to pause MPD when headphones disconnect
2021-07-26 19:02:47 +01:00
Max Kellermann
64fa76c568
command/file: support "albumart" for virtual tracks in CUE sheets
...
Instead of checking for "cover.jpg" in the virtual directory
representing the CUE sheet, check its enclosing directory.
Closes https://github.com/MusicPlayerDaemon/MPD/issues/1206
2021-07-16 09:04:35 +02:00
Max Kellermann
19a44076cf
command/file: pass directory uri to read_stream_art()
2021-07-16 08:31:58 +02:00
Max Kellermann
809a18913a
fs/Traits: add overload GetParent(string_view)
2021-07-16 08:30:34 +02:00
Max Kellermann
5eab2d96f4
output/winmm: fix struct/class mismatch
2021-07-16 08:30:34 +02:00
Khem Raj
d39b11ba5d
include <utility> for std::forward
...
Fixes
../git/src/Log.hxx:121:42: error: no member named 'forward' in namespace 'std'
LogFormat(LogLevel::ERROR, e, fmt, std::forward<Args>(args)...);
Signed-off-by: Khem Raj <raj.khem@gmail.com>
2021-06-29 19:34:28 -07:00
Max Kellermann
b29a43b4d7
decoder/mad, ...: more libfmt logging
2021-06-25 20:52:08 +02:00
Max Kellermann
f60a42e0b6
Log, client/Response: adapt to libfmt 8.0.0 API changes
2021-06-25 20:29:25 +02:00
Max Kellermann
85b0029ba2
meson.build: add missing dependencies on libfmt
2021-06-25 20:28:54 +02:00
Max Kellermann
0e0f46a1e0
Log: remove unused Format functions
2021-06-24 21:40:12 +02:00
Max Kellermann
6f539cfcd6
Partition, ...: use libfmt for logging
2021-06-24 21:40:11 +02:00
Max Kellermann
0185d58a2b
Log: add libfmt support
2021-06-24 21:14:42 +02:00
Max Kellermann
d7df5e1c90
LogBackend: pass std::string_view to Log()
2021-06-24 13:43:13 +02:00
Max Kellermann
e4e4576a39
release v0.22.9
...
-----BEGIN PGP SIGNATURE-----
iQJEBAABCgAuFiEEA5IzWngIOJSkMBxDI26KWMbbRRIFAmDTg80QHG1heEBtdXNp
Y3BkLm9yZwAKCRAjbopYxttFErvaD/93cfFvY/E9NZbI7XmuEfrfX0dUEo2dd8bi
O1tbEU+8uquNLV5cyb5iEpu6RCbAQxjj8clqVuMgfl0Qe3NQ+Z+nyOg0YVEB4Z16
cQBDFGawth7HuaqBIdMgnoapUxyGW3KMFw6si5OsV5AMkT5ybdsWg3sOXIXG+cLa
7KoIwVlgum+DsAPCSKis9fiuZJCnsg9SVcsJnpoaa7ZVOASPp1Wd7F9Kv6wj03/R
fEQ3z/s/4ILsWmZFHnclFq5LSpNvom5fAiedO15WVsJCxoZHEAg0ZpnNn/whU1HA
fciGImrjHLCTKVS5xpWNXUMaov2k7LEbLka2AqYwdeuxf7kAeoZC42H/cwK6tH/F
xuNWg4l9DZQUoGFxN4hfxJi3fsVpx0+3FR+cJQWOuUtwcmh4e7qJKX1gxAjHvEQY
GPS+jx7ndpcVDJyupvhFVGT0VDEOP7yMTjdY6uc5dXa4Ulx59duvgTdEyYgS4feM
BqNOYkD2FXnN7nv56f23q5SkRHF5D5nnoc8robIWkng9PXoq1Faq42MwLFxyCdH1
duRHk06FaFYpPv7gYagarFYIwOKCteL8aOwLymYbJop0O8ripYVQ7hHcEeWNvV+f
Q1ggllNBD/igvom6tRNl+S7TeQijr44M3/pDvDI3oXJPCfh1ZFGjwKqKqS76JfEu
v4V1N0rseA==
=p1U2
-----END PGP SIGNATURE-----
Merge tag 'v0.22.9'
release v0.22.9
2021-06-23 21:02:06 +02:00
Max Kellermann
5019bdcd52
TagAny: invoke ScanGenericTags() on remote files
...
This fixes reading ID3 tags on remote files with the commands
"readcomments" and "readpicture".
Closes https://github.com/MusicPlayerDaemon/MPD/issues/1180
2021-06-23 20:49:30 +02:00
Max Kellermann
175d2c6d29
Main: use AtScopeExit() to call ZeroconfDeinit()
...
Make sure that ZeroconfDeinit() gets called even if startup fails with
an exception. Fixes an assertion failure because an Avahi TimerEvent
is still active.
Closes https://github.com/MusicPlayerDaemon/MPD/issues/1192
2021-06-22 20:31:45 +02:00
Rosen Penev
6af7be4a45
add constexpr
...
Found with cppcoreguidelines-interfaces-global-init
Signed-off-by: Rosen Penev <rosenp@gmail.com>
2021-05-31 13:45:39 -07:00
Max Kellermann
ac59ec34f9
decoder/ffmpeg: fix build failure with FFmpeg 3.4
...
av_demuxer_iterate() was added in libavformat 58.9.100.
Closes https://github.com/MusicPlayerDaemon/MPD/issues/1178
2021-05-31 18:10:06 +02:00
Max Kellermann
82da57b7ce
decoder/ffmpeg: suppress -Wunused with libavformat<58.6.100
2021-05-31 16:49:48 +02:00
Max Kellermann
aa6dac9bd2
db/proxy: suppress -Wunused with libmpdclient<2.12
2021-05-31 16:49:08 +02:00
Rosen Penev
220d2bf026
clang-tidy: add explicit deleted constructors
...
Found with cppcoreguidelines-special-member-functions
Signed-off-by: Rosen Penev <rosenp@gmail.com>
2021-05-30 22:47:20 -07:00
Rosen Penev
9ef1cf15a9
clang-tidy: default virtual destructors
...
Found with cppcoreguidelines-special-member-functions
Signed-off-by: Rosen Penev <rosenp@gmail.com>
2021-05-30 22:46:46 -07:00
Max Kellermann
679b3bc00f
output/print, command/player: print bool as integer
...
Fixes protocol breakage after commit 0440c41cba
libfmt is too clever for the MPD protocol!
Closes https://github.com/MusicPlayerDaemon/MPD/issues/1175
2021-05-28 18:02:00 +02:00
Max Kellermann
36410daaa4
queue/PlaylistEdit: fix inverted check
...
Regression by commit 471c37be59
Closes https://github.com/MusicPlayerDaemon/MPD/issues/1135
2021-05-28 13:56:01 +02:00
Max Kellermann
38bfef7d0b
Merge branch 'add-openmpt-decoder' of git://github.com/GrimReaperFloof/MPD
2021-05-28 13:53:43 +02:00
GrimReaperFloof
724754f16c
Fix std::to_string warning for booleans in openmpt decoder
2021-05-27 20:47:45 +02:00
Max Kellermann
4d32454697
android/LogListener: pass formatted message to OnLog()
2021-05-27 16:21:36 +02:00
Max Kellermann
4db882f666
android/LogListener: cache the jmethodID
2021-05-27 16:14:43 +02:00
Max Kellermann
a83bf97b98
android/LogListener: un-inline the constructor
2021-05-27 16:13:22 +02:00
Max Kellermann
262e1957b7
lib/icu/Converter: use libfmt
2021-05-27 16:09:56 +02:00
Max Kellermann
792411384d
protocol/ArgParser: add function MakeArgError()
...
Replaces FormatProtocolError().
2021-05-27 16:01:44 +02:00
Max Kellermann
78b0ff83e8
client/Response: include cleanup
2021-05-27 15:59:06 +02:00
Max Kellermann
23613355f3
client/Response: remove unused method FormatV()
2021-05-27 15:16:35 +02:00