Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package mpd for openSUSE:Factory checked in at 2026-07-20 09:58:38 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/mpd (Old) and /work/SRC/openSUSE:Factory/.mpd.new.24530 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "mpd" Mon Jul 20 09:58:38 2026 rev:64 rq:1366552 version:0.24.13 Changes: -------- --- /work/SRC/openSUSE:Factory/mpd/mpd.changes 2026-06-22 17:33:35.510474810 +0200 +++ /work/SRC/openSUSE:Factory/.mpd.new.24530/mpd.changes 2026-07-20 10:00:45.022977811 +0200 @@ -1,0 +2,18 @@ +Sat Jul 18 22:13:56 UTC 2026 - Илья Индиго <[email protected]> + +- Removed mpd.firewalld (upstreamed in firewalld 2.3.2). +- Removed README.mpd (Outdated instructions for ALSA). +- Updated to 0.24.13 + * https://raw.githubusercontent.com/MusicPlayerDaemon/MPD/v0.24.13/NEWS + * configuration + * add range checks to number parser + * copy replay_gain_mode when creating a new partition + * storage: curl: eliminate auth probe requests + * decoder: opus: do not add 5 dB to Opus header playback gain + * tags: id3: limit ID3 tags to 4 MB + * output + * pipewire: fix file descriptor leak bug after connect failure + * pipewire: support the "media.album" tag + * systemd: allow AF_NETLINK when UPnP is enabled + +------------------------------------------------------------------- @@ -5 +23 @@ - * https://raw.githubusercontent.com/MusicPlayerDaemon/MPD/v0.24.10/NEWS + * https://raw.githubusercontent.com/MusicPlayerDaemon/MPD/v0.24.12/NEWS Old: ---- README.mpd mpd-0.24.12.tar.xz mpd-0.24.12.tar.xz.sig mpd.firewalld New: ---- mpd-0.24.13.tar.xz mpd-0.24.13.tar.xz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ mpd.spec ++++++ --- /var/tmp/diff_new_pack.8UmwNX/_old 2026-07-20 10:00:45.687000158 +0200 +++ /var/tmp/diff_new_pack.8UmwNX/_new 2026-07-20 10:00:45.687000158 +0200 @@ -18,18 +18,16 @@ %define ver 0.24 Name: mpd -Version: %{ver}.12 +Version: %{ver}.13 Release: 0 Summary: Music Player Daemon License: GPL-2.0-or-later URL: https://musicpd.org Source0: https://musicpd.org/download/%{name}/%{ver}/%{name}-%{version}.tar.xz Source1: https://musicpd.org/download/%{name}/%{ver}/%{name}-%{version}.tar.xz.sig -Source2: README.%{name} +Source2: %{name}.keyring Source3: %{name}-user.conf -Source4: %{name}.firewalld -Source5: %{name}.tmpfiles.d -Source9: %{name}.keyring +Source4: %{name}.tmpfiles.d Patch0: %{name}-conf.patch Patch1: %{name}-sndfile.patch BuildRequires: gcc-c++ @@ -106,9 +104,7 @@ 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. There a bunch of clients to control mpd: -for Gnome, KDE, console and Apache (PHP). - -Please read README.mpd how to configure it. +for GTK, Qt, and console. %package doc Summary: Additional Package Documentation @@ -134,9 +130,8 @@ %meson_install mv %{buildroot}%{_datadir}/doc/%{name}/html . rm -r %{buildroot}%{_datadir}/doc/%{name} -install -pm0644 %{SOURCE2} %{SOURCE3} . -install -Dpm0644 %{SOURCE4} %{buildroot}%{_prefix}/lib/firewalld/services/%{name}.xml -install -Dpm0644 %{SOURCE5} %{buildroot}%{_tmpfilesdir}/%{name}.conf +install -pm0644 %{SOURCE3} . +install -Dpm0644 %{SOURCE4} %{buildroot}%{_tmpfilesdir}/%{name}.conf install -Dpm0644 doc/mpdconf.example %{buildroot}%{_sysconfdir}/%{name}.conf # Remove duplicate for mpd.socket and replace it with a symlink. rm %{buildroot}%{_userunitdir}/%{name}.socket @@ -160,7 +155,7 @@ %files %license COPYING -%doc AUTHORS NEWS README.md README.%{name} %{name}-user.conf doc/mpdconf.example +%doc AUTHORS NEWS README.md %{name}-user.conf doc/mpdconf.example %config(noreplace) %{_sysconfdir}/%{name}.conf %{_bindir}/%{name} %attr(0755,mpd,audio) %{_localstatedir}/lib/%{name} @@ -171,9 +166,6 @@ %{_unitdir}/%{name}.socket %{_userunitdir}/%{name}.socket %{_userunitdir}/%{name}.service -%dir %{_prefix}/lib/firewalld -%dir %{_prefix}/lib/firewalld/services -%{_prefix}/lib/firewalld/services/%{name}.xml %{_tmpfilesdir}/%{name}.conf %ghost %dir %attr(0755,%{name},audio) /run/%{name} ++++++ mpd-0.24.12.tar.xz -> mpd-0.24.13.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/.github/workflows/build.yml new/mpd-0.24.13/.github/workflows/build.yml --- old/mpd-0.24.12/.github/workflows/build.yml 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/.github/workflows/build.yml 2026-07-10 11:50:29.000000000 +0200 @@ -72,7 +72,7 @@ steps: - id: checkout - uses: actions/checkout@v5 + uses: actions/checkout@v7 - name: Install dependencies run: | @@ -205,7 +205,7 @@ steps: - id: checkout - uses: actions/checkout@v5 + uses: actions/checkout@v7 - name: Install dependencies run: | @@ -272,7 +272,7 @@ runs-on: windows-latest steps: - id: checkout - uses: actions/checkout@v5 + uses: actions/checkout@v7 - uses: msys2/setup-msys2@v2 with: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/.github/workflows/build_android.yml new/mpd-0.24.13/.github/workflows/build_android.yml --- old/mpd-0.24.12/.github/workflows/build_android.yml 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/.github/workflows/build_android.yml 2026-07-10 11:50:29.000000000 +0200 @@ -40,7 +40,7 @@ runs-on: ubuntu-24.04 steps: - id: checkout - uses: actions/checkout@v5 + uses: actions/checkout@v7 - name: Install dependencies run: | diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/.github/workflows/build_mingw.yml new/mpd-0.24.13/.github/workflows/build_mingw.yml --- old/mpd-0.24.12/.github/workflows/build_mingw.yml 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/.github/workflows/build_mingw.yml 2026-07-10 11:50:29.000000000 +0200 @@ -52,10 +52,10 @@ steps: - id: checkout - uses: actions/checkout@v5 + uses: actions/checkout@v7 - name: "Cache third-party libraries" - uses: actions/cache@v4 + uses: actions/cache@v6 with: key: ${{runner.os}}-libs-${{matrix.cpu}}-${{hashFiles('win32/build.py', 'python/**')}} path: | diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/NEWS new/mpd-0.24.13/NEWS --- old/mpd-0.24.12/NEWS 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/NEWS 2026-07-10 11:50:29.000000000 +0200 @@ -1,3 +1,18 @@ +ver 0.24.13 (2026/07/10) +* configuration + - add range checks to number parser + - copy replay_gain_mode when creating a new partition +* storage + - curl: eliminate auth probe requests +* decoder + - opus: do not add 5 dB to Opus header playback gain +* tags: + - id3: limit ID3 tags to 4 MB +* output + - pipewire: fix file descriptor leak bug after connect failure + - pipewire: support the "media.album" tag +* systemd: allow AF_NETLINK when UPnP is enabled + ver 0.24.12 (2026/05/15) * protocol - allow empty URI in "lsinfo", "add" etc. (0.24.11 regression) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/meson.build new/mpd-0.24.13/meson.build --- old/mpd-0.24.12/meson.build 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/meson.build 2026-07-10 11:50:29.000000000 +0200 @@ -1,7 +1,7 @@ project( 'mpd', ['c', 'cpp'], - version: '0.24.12', + version: '0.24.13', meson_version: '>= 1.0', default_options: [ 'c_std=c11', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/python/build/libs.py new/mpd-0.24.13/python/build/libs.py --- old/mpd-0.24.12/python/build/libs.py 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/python/build/libs.py 2026-07-10 11:50:29.000000000 +0200 @@ -40,8 +40,8 @@ ) libopenmpt = AutotoolsProject( - 'https://lib.openmpt.org/files/libopenmpt/src/libopenmpt-0.8.6+release.autotools.tar.gz', - 'caa2fa959e389f4374d9e2df3af5c633452c12dd80442cba2e89cb7ff2b93c5b', + 'https://lib.openmpt.org/files/libopenmpt/src/libopenmpt-0.8.7+release.autotools.tar.gz', + '275c29ef47be9992f62a35fcc96f7ca05c06d2fd05c9298b8dee9f743f75b089', 'lib/libopenmpt.a', [ '--disable-shared', '--enable-static', @@ -53,7 +53,7 @@ '--without-portaudio', '--without-portaudiocpp', '--without-sndfile', '--without-flac', ], - base='libopenmpt-0.8.6+release.autotools', + base='libopenmpt-0.8.7+release.autotools', ) wildmidi = CmakeProject( @@ -83,8 +83,8 @@ ) ffmpeg = FfmpegProject( - 'https://ffmpeg.org/releases/ffmpeg-8.1.1.tar.xz', - 'b6863adde98898f42602017462871b5f6333e65aec803fdd7a6308639c52edf3', + 'https://ffmpeg.org/releases/ffmpeg-8.1.2.tar.xz', + '464beb5e7bf0c311e68b45ae2f04e9cc2af88851abb4082231742a74d97b524c', 'lib/libavcodec.a', [ '--disable-shared', '--enable-static', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/Main.cxx new/mpd-0.24.13/src/Main.cxx --- old/mpd-0.24.12/src/Main.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/Main.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -406,8 +406,7 @@ if (name == nullptr) throw std::runtime_error("Missing 'name'"); - instance.partitions.emplace_back(instance, name, - partition_config); + instance.partitions.emplace_back(name, instance.partitions.front()); }); client_manager_init(raw_config); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/Mapper.cxx new/mpd-0.24.13/src/Mapper.cxx --- old/mpd-0.24.12/src/Mapper.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/Mapper.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -17,8 +17,12 @@ #include "Main.hxx" #endif +#include <fmt/format.h> + #include <cassert> +using std::string_view_literals::operator""sv; + /** * The absolute path of the playlist directory encoded in the * filesystem character set. @@ -99,9 +103,7 @@ if (playlist_dir_fs.IsNull()) return nullptr; - std::string filename_utf8 = name; - filename_utf8.append(PLAYLIST_FILE_SUFFIX); - + const auto filename_utf8 = fmt::format("{}" PLAYLIST_FILE_SUFFIX ""sv, name); const auto filename_fs = AllocatedPath::FromUTF8(filename_utf8); if (filename_fs.IsNull()) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/Partition.cxx new/mpd-0.24.13/src/Partition.cxx --- old/mpd-0.24.12/src/Partition.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/Partition.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -34,6 +34,12 @@ UpdateEffectiveReplayGainMode(); } +Partition::Partition(const char *_name, const Partition &src) noexcept + :Partition(src.instance, _name, src.config) +{ + SetReplayGainMode(src.replay_gain_mode); +} + Partition::~Partition() noexcept = default; void diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/Partition.hxx new/mpd-0.24.13/src/Partition.hxx --- old/mpd-0.24.12/src/Partition.hxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/Partition.hxx 2026-07-10 11:50:29.000000000 +0200 @@ -68,10 +68,18 @@ ReplayGainMode replay_gain_mode = ReplayGainMode::OFF; + [[nodiscard]] Partition(Instance &_instance, const char *_name, const PartitionConfig &_config) noexcept; + /** + * Construct a new partition that inherits configuration from + * an existing partition. + */ + [[nodiscard]] + Partition(const char *_name, const Partition &src) noexcept; + ~Partition() noexcept; void BeginShutdown() noexcept; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/command/PartitionCommands.cxx new/mpd-0.24.13/src/command/PartitionCommands.cxx --- old/mpd-0.24.12/src/command/PartitionCommands.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/command/PartitionCommands.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -79,8 +79,8 @@ return CommandResult::ERROR; } - instance.partitions.emplace_back(instance, name, - client.GetPartition().config); + instance.partitions.emplace_back(name, + client.GetPartition()); auto &partition = instance.partitions.back(); partition.UpdateEffectiveReplayGainMode(); @@ -161,7 +161,8 @@ else /* copy the AudioOutputControl and add it to the output list */ dest_partition.outputs.AddMoveFrom(std::move(*output), - was_enabled); + was_enabled, + dest_partition.replay_gain_mode); instance.EmitIdle(IDLE_OUTPUT); return CommandResult::OK; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/config/Parser.cxx new/mpd-0.24.13/src/config/Parser.cxx --- old/mpd-0.24.12/src/config/Parser.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/config/Parser.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -7,6 +7,7 @@ #include "util/StringUtil.hxx" #include <cstdlib> +#include <cerrno> bool ParseBool(const char *value) @@ -27,10 +28,14 @@ ParseLong(const char *s) { char *endptr; + errno = 0; long value = strtol(s, &endptr, 10); if (endptr == s || *endptr != 0) throw std::runtime_error("Failed to parse number"); + if (errno == ERANGE) + throw std::runtime_error("Number out of range"); + return value; } @@ -69,10 +74,14 @@ ParseSize(const char *s, std::size_t default_factor) { char *endptr; + errno = 0; std::size_t value = strtoul(s, &endptr, 10); if (endptr == s) throw std::runtime_error("Failed to parse integer"); + if (errno == ERANGE) + throw std::runtime_error("Integer out of range"); + static constexpr std::size_t KILO = 1024; static constexpr std::size_t MEGA = 1024 * KILO; static constexpr std::size_t GIGA = 1024 * MEGA; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/db/plugins/upnp/UpnpDatabasePlugin.cxx new/mpd-0.24.13/src/db/plugins/upnp/UpnpDatabasePlugin.cxx --- old/mpd-0.24.12/src/db/plugins/upnp/UpnpDatabasePlugin.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/db/plugins/upnp/UpnpDatabasePlugin.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -24,7 +24,7 @@ #include "util/StringSplit.hxx" #include "config/Block.hxx" -#include <fmt/core.h> +#include <fmt/format.h> #include <cassert> #include <string> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/decoder/plugins/OpusDecoderPlugin.cxx new/mpd-0.24.13/src/decoder/plugins/OpusDecoderPlugin.cxx --- old/mpd-0.24.12/src/decoder/plugins/OpusDecoderPlugin.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/decoder/plugins/OpusDecoderPlugin.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -47,17 +47,6 @@ return packet.bytes >= 8 && memcmp(packet.packet, "OpusTags", 8) == 0; } -/** - * Convert an EBU R128 value to ReplayGain. - */ -static constexpr float -EbuR128ToReplayGain(float ebu_r128) noexcept -{ - /* add 5dB to compensate for the different reference levels - between ReplayGain (89dB) and EBU R128 (-23 LUFS) */ - return ebu_r128 + 5; -} - static bool mpd_opus_init([[maybe_unused]] const ConfigBlock &block) { @@ -279,11 +268,12 @@ if (rgi.IsDefined()) { /* submit all valid EBU R128 values with output_gain - applied */ + applied. conversion from EBU R128 -> ReplayGain + happened in ScanOpusTags already. */ if (rgi.track.IsDefined()) - rgi.track.gain += EbuR128ToReplayGain(output_gain); + rgi.track.gain += output_gain; if (rgi.album.IsDefined()) - rgi.album.gain += EbuR128ToReplayGain(output_gain); + rgi.album.gain += output_gain; client.SubmitReplayGain(&rgi); submitted_replay_gain = true; } @@ -309,7 +299,7 @@ gain" value */ ReplayGainInfo rgi; rgi.Clear(); - rgi.track.gain = EbuR128ToReplayGain(output_gain); + rgi.track.gain = output_gain; client.SubmitReplayGain(&rgi); submitted_replay_gain = true; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/decoder/plugins/OpusTags.cxx new/mpd-0.24.13/src/decoder/plugins/OpusTags.cxx --- old/mpd-0.24.12/src/decoder/plugins/OpusTags.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/decoder/plugins/OpusTags.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -17,6 +17,17 @@ using std::string_view_literals::operator""sv; +/** + * Convert an EBU R128 value to ReplayGain. + */ +static constexpr float +EbuR128ToReplayGain(float ebu_r128) noexcept +{ + /* add 5dB to compensate for the different reference levels + between ReplayGain (89dB) and EBU R128 (-23 LUFS) */ + return ebu_r128 + 5; +} + [[gnu::pure]] static TagType ParseOpusTagName(std::string_view name) noexcept @@ -47,14 +58,14 @@ dB */ if (const auto i = ParseInteger<int_least32_t>(value)) - rgi->track.gain = float(*i) / 256.0f; + rgi->track.gain = EbuR128ToReplayGain(float(*i) / 256.0f); } else if (rgi != nullptr && StringIsEqualIgnoreCase(name, "R128_ALBUM_GAIN"sv)) { /* R128_ALBUM_GAIN is a Q7.8 fixed point number in dB */ if (const auto i = ParseInteger<int_least32_t>(value)) - rgi->album.gain = float(*i) / 256.0f; + rgi->album.gain = EbuR128ToReplayGain(float(*i) / 256.0f); } handler.OnPair(name, value); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/input/plugins/AlsaInputPlugin.cxx new/mpd-0.24.13/src/input/plugins/AlsaInputPlugin.cxx --- old/mpd-0.24.12/src/input/plugins/AlsaInputPlugin.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/input/plugins/AlsaInputPlugin.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -27,7 +27,7 @@ #include <alsa/asoundlib.h> -#include <fmt/core.h> +#include <fmt/format.h> #include <cassert> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/input/plugins/QobuzClient.cxx new/mpd-0.24.13/src/input/plugins/QobuzClient.cxx --- old/mpd-0.24.12/src/input/plugins/QobuzClient.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/input/plugins/QobuzClient.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -5,7 +5,7 @@ #include "lib/crypto/MD5.hxx" #include "thread/ScopeUnlock.hxx" -#include <fmt/core.h> +#include <fmt/format.h> #include <cassert> #include <stdexcept> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/input/plugins/QobuzLoginRequest.cxx new/mpd-0.24.13/src/input/plugins/QobuzLoginRequest.cxx --- old/mpd-0.24.12/src/input/plugins/QobuzLoginRequest.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/input/plugins/QobuzLoginRequest.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -6,7 +6,7 @@ #include "QobuzSession.hxx" #include "lib/curl/Form.hxx" -#include <fmt/core.h> +#include <fmt/format.h> #include <nlohmann/json.hpp> #include <cassert> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/input/plugins/QobuzTrackRequest.cxx new/mpd-0.24.13/src/input/plugins/QobuzTrackRequest.cxx --- old/mpd-0.24.12/src/input/plugins/QobuzTrackRequest.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/input/plugins/QobuzTrackRequest.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -5,7 +5,7 @@ #include "QobuzErrorParser.hxx" #include "QobuzClient.hxx" -#include <fmt/core.h> +#include <fmt/format.h> #include <nlohmann/json.hpp> using std::string_view_literals::operator""sv; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/lib/avahi/Publisher.cxx new/mpd-0.24.13/src/lib/avahi/Publisher.cxx --- old/mpd-0.24.12/src/lib/avahi/Publisher.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/lib/avahi/Publisher.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -13,7 +13,7 @@ #include <avahi-common/malloc.h> #include <avahi-common/alternative.h> -#include <fmt/core.h> +#include <fmt/format.h> #include <cassert> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/lib/curl/Setup.cxx new/mpd-0.24.13/src/lib/curl/Setup.cxx --- old/mpd-0.24.12/src/lib/curl/Setup.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/lib/curl/Setup.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -17,7 +17,6 @@ easy.SetNoProgress(); easy.SetNoSignal(); easy.SetConnectTimeout(std::chrono::seconds{10}); - easy.SetOption(CURLOPT_HTTPAUTH, (long) CURLAUTH_ANY); } } // namespace Curl diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/lib/nfs/FileReader.cxx new/mpd-0.24.13/src/lib/nfs/FileReader.cxx --- old/mpd-0.24.12/src/lib/nfs/FileReader.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/lib/nfs/FileReader.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -10,7 +10,7 @@ #include <nfsc/libnfs.h> // for struct nfs_stat_64 -#include <fmt/core.h> +#include <fmt/format.h> #include <cassert> #include <cstring> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/net/ToString.cxx new/mpd-0.24.13/src/net/ToString.cxx --- old/mpd-0.24.12/src/net/ToString.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/net/ToString.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -6,7 +6,7 @@ #include "SocketAddress.hxx" #include "IPv4Address.hxx" -#include <fmt/core.h> +#include <fmt/format.h> #include <algorithm> #include <cassert> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/output/MultipleOutputs.cxx new/mpd-0.24.13/src/output/MultipleOutputs.cxx --- old/mpd-0.24.12/src/output/MultipleOutputs.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/output/MultipleOutputs.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -114,13 +114,15 @@ void MultipleOutputs::AddMoveFrom(AudioOutputControl &&src, - bool enable) noexcept + bool enable, + ReplayGainMode replay_gain_mode) noexcept { // TODO: this operation needs to be protected with a mutex outputs.push_back(std::make_unique<AudioOutputControl>(std::move(src), client)); outputs.back()->LockSetEnabled(enable); + outputs.back()->SetReplayGainMode(replay_gain_mode); client.ApplyEnabled(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/output/MultipleOutputs.hxx new/mpd-0.24.13/src/output/MultipleOutputs.hxx --- old/mpd-0.24.12/src/output/MultipleOutputs.hxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/output/MultipleOutputs.hxx 2026-07-10 11:50:29.000000000 +0200 @@ -8,14 +8,15 @@ #include "MusicChunkPtr.hxx" #include "player/Outputs.hxx" #include "pcm/AudioFormat.hxx" -#include "ReplayGainMode.hxx" #include "Chrono.hxx" #include <algorithm> #include <cassert> +#include <cstdint> #include <memory> #include <vector> +enum class ReplayGainMode : uint8_t; class MusicPipe; class EventLoop; class MixerListener; @@ -109,8 +110,8 @@ } void AddMoveFrom(AudioOutputControl &&src, - bool enable) noexcept; - + bool enable, + ReplayGainMode replay_gain_mode) noexcept; void SetReplayGainMode(ReplayGainMode mode) noexcept; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/output/plugins/PipeWireOutputPlugin.cxx new/mpd-0.24.13/src/output/plugins/PipeWireOutputPlugin.cxx --- old/mpd-0.24.12/src/output/plugins/PipeWireOutputPlugin.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/output/plugins/PipeWireOutputPlugin.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -593,8 +593,12 @@ PW_STREAM_FLAG_MAP_BUFFERS | PW_STREAM_FLAG_RT_PROCESS), params, 1); - if (error < 0) + if (error < 0) { + ring_buffer = {}; + pw_stream_destroy(stream); + stream = nullptr; throw PipeWire::MakeError(error, "Failed to connect stream"); + } } void @@ -924,6 +928,9 @@ const char *pipewire; } tag_map[] = { { TAG_ARTIST, PW_KEY_MEDIA_ARTIST }, +#ifdef PW_KEY_MEDIA_ALBUM + { TAG_ALBUM, PW_KEY_MEDIA_ALBUM }, +#endif { TAG_TITLE, PW_KEY_MEDIA_TITLE }, { TAG_DATE, PW_KEY_MEDIA_DATE }, { TAG_COMMENT, PW_KEY_MEDIA_COMMENT }, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/output/plugins/httpd/HttpdClient.cxx new/mpd-0.24.13/src/output/plugins/httpd/HttpdClient.cxx --- old/mpd-0.24.12/src/output/plugins/httpd/HttpdClient.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/output/plugins/httpd/HttpdClient.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -13,7 +13,7 @@ #include "util/StringSplit.hxx" #include "Log.hxx" -#include <fmt/core.h> +#include <fmt/format.h> #include <cassert> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/output/plugins/httpd/IcyMetaDataServer.cxx new/mpd-0.24.13/src/output/plugins/httpd/IcyMetaDataServer.cxx --- old/mpd-0.24.12/src/output/plugins/httpd/IcyMetaDataServer.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/output/plugins/httpd/IcyMetaDataServer.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -5,7 +5,7 @@ #include "tag/Tag.hxx" #include "util/TruncateString.hxx" -#include <fmt/core.h> +#include <fmt/format.h> #include <iterator> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/song/AddedSinceSongFilter.cxx new/mpd-0.24.13/src/song/AddedSinceSongFilter.cxx --- old/mpd-0.24.12/src/song/AddedSinceSongFilter.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/song/AddedSinceSongFilter.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -6,7 +6,7 @@ #include "time/ISO8601.hxx" #include "util/StringBuffer.hxx" -#include <fmt/core.h> +#include <fmt/format.h> using std::string_view_literals::operator""sv; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/song/AudioFormatSongFilter.cxx new/mpd-0.24.13/src/song/AudioFormatSongFilter.cxx --- old/mpd-0.24.12/src/song/AudioFormatSongFilter.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/song/AudioFormatSongFilter.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -5,7 +5,7 @@ #include "LightSong.hxx" #include "util/StringBuffer.hxx" -#include <fmt/core.h> +#include <fmt/format.h> using std::string_view_literals::operator""sv; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/song/LightSong.cxx new/mpd-0.24.13/src/song/LightSong.cxx --- old/mpd-0.24.12/src/song/LightSong.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/song/LightSong.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -4,6 +4,18 @@ #include "LightSong.hxx" #include "tag/Tag.hxx" +#include <fmt/format.h> + +using std::string_view_literals::operator""sv; + +std::string LightSong::GetURI() const noexcept +{ + if (directory == nullptr) + return std::string(uri); + + return fmt::format("{}/{}"sv, directory, uri); +} + SignedSongTime LightSong::GetDuration() const noexcept { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/song/LightSong.hxx new/mpd-0.24.13/src/song/LightSong.hxx --- old/mpd-0.24.12/src/song/LightSong.hxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/song/LightSong.hxx 2026-07-10 11:50:29.000000000 +0200 @@ -96,15 +96,7 @@ audio_format(src.audio_format) {} [[gnu::pure]] - std::string GetURI() const noexcept { - if (directory == nullptr) - return std::string(uri); - - std::string result(directory); - result.push_back('/'); - result.append(uri); - return result; - } + std::string GetURI() const noexcept; [[gnu::pure]] SignedSongTime GetDuration() const noexcept; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/song/ModifiedSinceSongFilter.cxx new/mpd-0.24.13/src/song/ModifiedSinceSongFilter.cxx --- old/mpd-0.24.12/src/song/ModifiedSinceSongFilter.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/song/ModifiedSinceSongFilter.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -6,7 +6,7 @@ #include "time/ISO8601.hxx" #include "util/StringBuffer.hxx" -#include <fmt/core.h> +#include <fmt/format.h> using std::string_view_literals::operator""sv; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/song/TagSongFilter.cxx new/mpd-0.24.13/src/song/TagSongFilter.cxx --- old/mpd-0.24.12/src/song/TagSongFilter.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/song/TagSongFilter.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -8,6 +8,10 @@ #include "tag/Tag.hxx" #include "tag/Fallback.hxx" +#include <fmt/format.h> + +using std::string_view_literals::operator""sv; + std::string TagSongFilter::ToExpression() const noexcept { @@ -15,8 +19,9 @@ ? "any" : tag_item_names[type]; - return std::string("(") + name + " " + filter.GetOperator() - + " \"" + EscapeFilterString(filter.GetValue()) + "\")"; + return fmt::format("({} {} \"{}\")"sv, + name, filter.GetOperator(), + EscapeFilterString(filter.GetValue())); } bool diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/song/UriSongFilter.cxx new/mpd-0.24.13/src/song/UriSongFilter.cxx --- old/mpd-0.24.12/src/song/UriSongFilter.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/song/UriSongFilter.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -5,11 +5,15 @@ #include "Escape.hxx" #include "LightSong.hxx" +#include <fmt/format.h> + +using std::string_view_literals::operator""sv; + std::string UriSongFilter::ToExpression() const noexcept { - return std::string("(file ") + filter.GetOperator() - + " \"" + EscapeFilterString(filter.GetValue()) + "\")"; + return fmt::format("(file {} \"{}\")"sv, + filter.GetOperator(), EscapeFilterString(filter.GetValue())); } bool diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/song/meson.build new/mpd-0.24.13/src/song/meson.build --- old/mpd-0.24.12/src/song/meson.build 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/song/meson.build 2026-07-10 11:50:29.000000000 +0200 @@ -16,6 +16,7 @@ 'LightSong.cxx', include_directories: inc, dependencies: [ + pcm_basic_dep, pcre_dep, fmt_dep, ], diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/storage/plugins/NfsStorage.cxx new/mpd-0.24.13/src/storage/plugins/NfsStorage.cxx --- old/mpd-0.24.12/src/storage/plugins/NfsStorage.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/storage/plugins/NfsStorage.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -29,7 +29,7 @@ #include <nfsc/libnfs-raw-nfs.h> } -#include <fmt/core.h> +#include <fmt/format.h> #include <cassert> #include <string> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/src/tag/Id3Load.cxx new/mpd-0.24.13/src/tag/Id3Load.cxx --- old/mpd-0.24.12/src/tag/Id3Load.cxx 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/src/tag/Id3Load.cxx 2026-07-10 11:50:29.000000000 +0200 @@ -47,6 +47,9 @@ const std::size_t tag_size = static_cast<std::size_t>(query); + if (tag_size > 4 * 1024 * 1024) + return nullptr; + /* Found a tag. Allocate a buffer and read it in. */ if (tag_size <= sizeof(query_buffer)) /* we have enough data already */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/subprojects/expat.wrap new/mpd-0.24.13/subprojects/expat.wrap --- old/mpd-0.24.12/subprojects/expat.wrap 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/subprojects/expat.wrap 2026-07-10 11:50:29.000000000 +0200 @@ -1,14 +1,14 @@ [wrap-file] -directory = expat-2.7.5 -source_url = https://github.com/libexpat/libexpat/releases/download/R_2_7_5/expat-2.7.5.tar.xz -source_filename = expat-2.7.5.tar.xz -source_hash = 1032dfef4ff17f70464827daa28369b20f6584d108bc36f17ab1676e1edd2f91 -source_fallback_url = https://wrapdb.mesonbuild.com/v2/expat_2.7.5-1/get_source/expat-2.7.5.tar.xz -patch_filename = expat_2.7.5-1_patch.zip -patch_url = https://wrapdb.mesonbuild.com/v2/expat_2.7.5-1/get_patch -patch_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/expat_2.7.5-1/expat_2.7.5-1_patch.zip -patch_hash = f3de751df71265847b359914ac48ec2ced85a98cd6c3a35dd45890a331919f65 -wrapdb_version = 2.7.5-1 +directory = expat-2.8.2 +source_url = https://github.com/libexpat/libexpat/releases/download/R_2_8_2/expat-2.8.2.tar.xz +source_filename = expat-2.8.2.tar.xz +source_hash = 3ad89b8588e6644bd4e49981480d48b21289eebbcd4f0a1a4afb1c29f99b6ab4 +source_fallback_url = https://wrapdb.mesonbuild.com/v2/expat_2.8.2-1/get_source/expat-2.8.2.tar.xz +patch_filename = expat_2.8.2-1_patch.zip +patch_url = https://wrapdb.mesonbuild.com/v2/expat_2.8.2-1/get_patch +patch_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/expat_2.8.2-1/expat_2.8.2-1_patch.zip +patch_hash = 3d4ec67cce3ced0388f0c4b4c62b27d8059dcb520a7d49cf317cd8d4d5b44fb1 +wrapdb_version = 2.8.2-1 [provide] dependency_names = expat diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/subprojects/libmpdclient.wrap new/mpd-0.24.13/subprojects/libmpdclient.wrap --- old/mpd-0.24.12/subprojects/libmpdclient.wrap 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/subprojects/libmpdclient.wrap 2026-07-10 11:50:29.000000000 +0200 @@ -1,6 +1,6 @@ [wrap-git] url = https://github.com/MusicPlayerDaemon/libmpdclient -revision = v2.22 +revision = v2.26 [provide] libmpdclient = libmpdclient_dep diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/subprojects/sqlite3.wrap new/mpd-0.24.13/subprojects/sqlite3.wrap --- old/mpd-0.24.12/subprojects/sqlite3.wrap 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/subprojects/sqlite3.wrap 2026-07-10 11:50:29.000000000 +0200 @@ -1,14 +1,14 @@ [wrap-file] -directory = sqlite-amalgamation-3530100 -source_url = https://www.sqlite.org/2026/sqlite-amalgamation-3530100.zip -source_filename = sqlite-amalgamation-3530100.zip -source_hash = 36ad6e7f38540a3b21a2ac36340833f0a9e426bc1c752751c3ba669466827eae -source_fallback_url = https://wrapdb.mesonbuild.com/v2/sqlite3_3.53.1-1/get_source/sqlite-amalgamation-3530100.zip -patch_filename = sqlite3_3.53.1-1_patch.zip -patch_url = https://wrapdb.mesonbuild.com/v2/sqlite3_3.53.1-1/get_patch -patch_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/sqlite3_3.53.1-1/sqlite3_3.53.1-1_patch.zip -patch_hash = d1a5758285f8a0659317f0f84e9c9c8c839fe7c1d19448ac62d95ecefd5ba3a5 -wrapdb_version = 3.53.1-1 +directory = sqlite-amalgamation-3530300 +source_url = https://www.sqlite.org/2026/sqlite-amalgamation-3530300.zip +source_filename = sqlite-amalgamation-3530300.zip +source_hash = 646421e12aac110282ef8cc68f1a62d4bb15fc7b8f09da0b53e29ee690500431 +source_fallback_url = https://wrapdb.mesonbuild.com/v2/sqlite3_3.53.3-1/get_source/sqlite-amalgamation-3530300.zip +patch_filename = sqlite3_3.53.3-1_patch.zip +patch_url = https://wrapdb.mesonbuild.com/v2/sqlite3_3.53.3-1/get_patch +patch_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/sqlite3_3.53.3-1/sqlite3_3.53.3-1_patch.zip +patch_hash = acd1a0cca89d7d4b50375002e61eaf67f5a432b6801721fa38cab05a9f1e0385 +wrapdb_version = 3.53.3-1 [provide] dependency_names = sqlite3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpd-0.24.12/systemd/meson.build new/mpd-0.24.13/systemd/meson.build --- old/mpd-0.24.12/systemd/meson.build 2026-05-15 07:46:52.000000000 +0200 +++ new/mpd-0.24.13/systemd/meson.build 2026-07-10 11:50:29.000000000 +0200 @@ -2,7 +2,7 @@ systemd_unit_conf.set('prefix', get_option('prefix')) address_families = ['AF_INET', 'AF_INET6', 'AF_UNIX'] -if get_option('smbclient').enabled() +if get_option('smbclient').enabled() or upnp_dep.found() # AF_NETLINK is required by libsmbclient, or it will exit() .. *sigh* address_families += 'AF_NETLINK' endif
