Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d91da96798 | ||
|
|
b3897df682 | ||
|
|
3cacb56bb7 | ||
|
|
15a1973e28 | ||
|
|
ad7d47a8ba | ||
|
|
0948c607b6 | ||
|
|
60d04052c5 | ||
|
|
c1780ac657 | ||
|
|
e49cf0ec38 | ||
|
|
e1d641f684 | ||
|
|
4efd0a9f77 | ||
|
|
f6f8751332 | ||
|
|
abb28593ce | ||
|
|
115693b046 | ||
|
|
e4b055eb6d |
11
NEWS
11
NEWS
@@ -1,3 +1,14 @@
|
|||||||
|
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 @@
|
|||||||
<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"/>
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
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')
|
|||||||
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(
|
|||||||
)
|
)
|
||||||
|
|
||||||
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(
|
|||||||
)
|
)
|
||||||
|
|
||||||
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 @@
|
|||||||
#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
|
|||||||
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
|
|||||||
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 @@
|
|||||||
#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:
|
|||||||
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
|
|||||||
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 @@
|
|||||||
#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:
|
|||||||
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:
|
|||||||
* 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
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)
|
|||||||
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
|
|||||||
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)
|
||||||
|
|||||||
Reference in New Issue
Block a user