Commit 1a94794c authored by Konstantin A. Lepikhov's avatar Konstantin A. Lepikhov

Merge tag 'v0.23.12' of https://github.com/MusicPlayerDaemon/MPD into sisyphus

release v0.23.12
parents 78ab2d63 d91da967
ver 0.23.12 (2023/01/17)
* input
- curl: require CURL 7.55.0 or later
* decoder
- mad: fix integer underflow with very small files
* tags
- fix crash bug due to race condition
* output
- pipewire: adjust to PipeWire 0.3.64 API change
* fix build failures with GCC 13
ver 0.23.11 (2022/11/28) ver 0.23.11 (2022/11/28)
* database * database
- simple: move default database to ~/.cache/mpd/db from ~/.cache/mpd.db - simple: move default database to ~/.cache/mpd/db from ~/.cache/mpd.db
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.musicpd" package="org.musicpd"
android:installLocation="auto" android:installLocation="auto"
android:versionCode="70" android:versionCode="71"
android:versionName="0.23.11"> android:versionName="0.23.12">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="30"/> <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="30"/>
......
project( project(
'mpd', 'mpd',
['c', 'cpp'], ['c', 'cpp'],
version: '0.23.11', version: '0.23.12',
meson_version: '>= 0.56.0', meson_version: '>= 0.56.0',
default_options: [ default_options: [
'c_std=c11', 'c_std=c11',
...@@ -205,7 +205,6 @@ enable_daemon = not is_windows and not is_android and get_option('daemon') ...@@ -205,7 +205,6 @@ enable_daemon = not is_windows and not is_android and get_option('daemon')
conf.set('ENABLE_DAEMON', enable_daemon) conf.set('ENABLE_DAEMON', enable_daemon)
conf.set('HAVE_GETPWNAM_R', compiler.has_function('getpwnam_r')) 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')) conf.set('HAVE_INITGROUPS', compiler.has_function('initgroups'))
conf.set('HAVE_FNMATCH', compiler.has_function('fnmatch')) conf.set('HAVE_FNMATCH', compiler.has_function('fnmatch'))
......
...@@ -393,8 +393,8 @@ openssl = OpenSSLProject( ...@@ -393,8 +393,8 @@ openssl = OpenSSLProject(
) )
curl = CmakeProject( curl = CmakeProject(
'https://curl.se/download/curl-7.86.0.tar.xz', 'https://curl.se/download/curl-7.87.0.tar.xz',
'2d61116e5f485581f6d59865377df4463f2e788677ac43222b496d4e49fb627b', 'ee5f1a1955b0ed413435ef79db28b834ea5f0fb7c8cfb1ce47175cc3bee08fff',
'lib/libcurl.a', 'lib/libcurl.a',
[ [
'-DBUILD_CURL_EXE=OFF', '-DBUILD_CURL_EXE=OFF',
...@@ -450,7 +450,7 @@ jack = JackProject( ...@@ -450,7 +450,7 @@ jack = JackProject(
) )
boost = BoostProject( boost = BoostProject(
'https://boostorg.jfrog.io/artifactory/main/release/1.80.0/source/boost_1_80_0.tar.bz2', 'https://boostorg.jfrog.io/artifactory/main/release/1.81.0/source/boost_1_81_0.tar.bz2',
'1e19565d82e43bc59209a168f5ac899d3ba471d55c7610c677d4ccf2c9c500c0', '71feeed900fbccca04a3b4f2f84a7c217186f28a940ed8b7ed4725986baf99fa',
'include/boost/version.hpp', 'include/boost/version.hpp',
) )
...@@ -28,7 +28,11 @@ ...@@ -28,7 +28,11 @@
#include <boost/intrusive/list.hpp> #include <boost/intrusive/list.hpp>
#include <boost/intrusive/unordered_set.hpp> #include <boost/intrusive/unordered_set.hpp>
#include <array>
#include <functional>
#include <memory>
#include <string> #include <string>
#include <utility>
class RemoteTagCacheHandler; class RemoteTagCacheHandler;
......
...@@ -798,6 +798,8 @@ MadDecoder::UpdateTimerNextFrame() noexcept ...@@ -798,6 +798,8 @@ MadDecoder::UpdateTimerNextFrame() noexcept
DecoderCommand DecoderCommand
MadDecoder::SubmitPCM(size_t i, size_t pcm_length) noexcept MadDecoder::SubmitPCM(size_t i, size_t pcm_length) noexcept
{ {
assert(i <= pcm_length);
size_t num_samples = pcm_length - i; size_t num_samples = pcm_length - i;
mad_fixed_to_24_buffer(output_buffer, synth.pcm, mad_fixed_to_24_buffer(output_buffer, synth.pcm,
...@@ -843,7 +845,7 @@ MadDecoder::SynthAndSubmit() noexcept ...@@ -843,7 +845,7 @@ MadDecoder::SynthAndSubmit() noexcept
size_t pcm_length = synth.pcm.length; size_t pcm_length = synth.pcm.length;
if (drop_end_samples && if (drop_end_samples &&
current_frame == max_frames - drop_end_frames - 1) { current_frame == max_frames - drop_end_frames - 1) {
if (drop_end_samples >= pcm_length) if (i + drop_end_samples >= pcm_length)
return DecoderCommand::STOP; return DecoderCommand::STOP;
pcm_length -= drop_end_samples; pcm_length -= drop_end_samples;
......
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
#include <shlobj.h> #include <shlobj.h>
#else #else
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h>
#include <pwd.h> #include <pwd.h>
#endif #endif
...@@ -80,15 +79,6 @@ public: ...@@ -80,15 +79,6 @@ public:
return result != nullptr; return result != nullptr;
} }
bool ReadByUid(uid_t uid) {
#ifdef HAVE_GETPWUID_R
getpwuid_r(uid, &pw, buf.data(), buf.size(), &result);
#else
result = getpwuid(uid);
#endif
return result != nullptr;
}
const passwd *operator->() { const passwd *operator->() {
assert(result != nullptr); assert(result != nullptr);
return result; return result;
...@@ -375,10 +365,8 @@ GetHomeDir() noexcept ...@@ -375,10 +365,8 @@ GetHomeDir() noexcept
if (const auto home = getenv("HOME"); if (const auto home = getenv("HOME");
IsValidPathString(home) && IsValidDir(home)) IsValidPathString(home) && IsValidDir(home))
return AllocatedPath::FromFS(home); return AllocatedPath::FromFS(home);
if (PasswdEntry pw; pw.ReadByUid(getuid()))
return SafePathFromFS(pw->pw_dir);
#endif #endif
return nullptr; return nullptr;
} }
......
...@@ -42,6 +42,8 @@ ...@@ -42,6 +42,8 @@
#include "io/UniqueFileDescriptor.hxx" #include "io/UniqueFileDescriptor.hxx"
#endif #endif
#include <cstdint>
class Path; class Path;
class FileInfo; class FileInfo;
......
...@@ -186,10 +186,6 @@ public: ...@@ -186,10 +186,6 @@ public:
SetOption(CURLOPT_POSTFIELDSIZE, (long)size); SetOption(CURLOPT_POSTFIELDSIZE, (long)size);
} }
void SetHttpPost(const struct curl_httppost *post) {
SetOption(CURLOPT_HTTPPOST, post);
}
template<typename T> template<typename T>
bool GetInfo(CURLINFO info, T value_r) const noexcept { bool GetInfo(CURLINFO info, T value_r) const noexcept {
return ::curl_easy_getinfo(handle, info, value_r) == CURLE_OK; return ::curl_easy_getinfo(handle, info, value_r) == CURLE_OK;
...@@ -199,10 +195,10 @@ public: ...@@ -199,10 +195,10 @@ public:
* Returns the response body's size, or -1 if that is unknown. * Returns the response body's size, or -1 if that is unknown.
*/ */
[[gnu::pure]] [[gnu::pure]]
int64_t GetContentLength() const noexcept { curl_off_t GetContentLength() const noexcept {
double value; curl_off_t value;
return GetInfo(CURLINFO_CONTENT_LENGTH_DOWNLOAD, &value) return GetInfo(CURLINFO_CONTENT_LENGTH_DOWNLOAD_T, &value)
? (int64_t)value ? value
: -1; : -1;
} }
......
curl_dep = dependency('libcurl', version: '>= 7.33', required: get_option('curl')) curl_dep = dependency('libcurl', version: '>= 7.55', required: get_option('curl'))
conf.set('ENABLE_CURL', curl_dep.found()) conf.set('ENABLE_CURL', curl_dep.found())
if not curl_dep.found() if not curl_dep.found()
subdir_done() subdir_done()
......
...@@ -523,7 +523,13 @@ PipeWireOutput::Open(AudioFormat &audio_format) ...@@ -523,7 +523,13 @@ PipeWireOutput::Open(AudioFormat &audio_format)
pw_properties_setf(props, PW_KEY_REMOTE_NAME, "%s", remote); pw_properties_setf(props, PW_KEY_REMOTE_NAME, "%s", remote);
if (target != nullptr && target_id == PW_ID_ANY) if (target != nullptr && target_id == PW_ID_ANY)
pw_properties_setf(props, PW_KEY_NODE_TARGET, "%s", target); pw_properties_setf(props,
#if PW_CHECK_VERSION(0, 3, 64)
PW_KEY_TARGET_OBJECT,
#else
PW_KEY_NODE_TARGET,
#endif
"%s", target);
#ifdef PW_KEY_NODE_RATE #ifdef PW_KEY_NODE_RATE
/* ask PipeWire to change the graph sample rate to ours /* ask PipeWire to change the graph sample rate to ours
......
...@@ -263,8 +263,14 @@ TagBuilder::RemoveAll() noexcept ...@@ -263,8 +263,14 @@ TagBuilder::RemoveAll() noexcept
void void
TagBuilder::RemoveType(TagType type) noexcept TagBuilder::RemoveType(TagType type) noexcept
{ {
if (items.empty())
/* don't acquire the tag_pool_lock if we're not going
to call tag_pool_put_item() anyway */
return;
const auto begin = items.begin(), end = items.end(); const auto begin = items.begin(), end = items.end();
const std::scoped_lock<Mutex> protect(tag_pool_lock);
items.erase(std::remove_if(begin, end, items.erase(std::remove_if(begin, end,
[type](TagItem *item) { [type](TagItem *item) {
if (item->type != type) if (item->type != type)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment