Merge branch 'v0.23.x'
This commit is contained in:
commit
9c19368fc7
9
NEWS
9
NEWS
|
@ -46,6 +46,15 @@ ver 0.24 (not yet released)
|
||||||
* remove Boost dependency
|
* remove Boost dependency
|
||||||
* require libfmt 7 or later
|
* require libfmt 7 or later
|
||||||
|
|
||||||
|
ver 0.23.14 (not yet released)
|
||||||
|
* decoder
|
||||||
|
- flac: fix scanning files with non-ASCII names on Windows
|
||||||
|
- mad: fix calculation of LAME peak values
|
||||||
|
* mixer
|
||||||
|
- wasapi: fix problem setting volume
|
||||||
|
* more libfmt 10 fixes
|
||||||
|
* fix auto-detected systemd unit directory
|
||||||
|
|
||||||
ver 0.23.13 (2023/05/22)
|
ver 0.23.13 (2023/05/22)
|
||||||
* input
|
* input
|
||||||
- curl: fix busy loop after connection failed
|
- curl: fix busy loop after connection failed
|
||||||
|
|
|
@ -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="71"
|
android:versionCode="72"
|
||||||
android:versionName="0.23.12">
|
android:versionName="0.23.14">
|
||||||
|
|
||||||
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="30"/>
|
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="30"/>
|
||||||
|
|
||||||
|
|
|
@ -314,6 +314,7 @@ input {
|
||||||
## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
|
## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
|
||||||
# or
|
# or
|
||||||
## device "0" # optional
|
## device "0" # optional
|
||||||
|
## mixer_type "hardware" # optional
|
||||||
## Exclusive mode blocks all other audio source, and get best audio quality without resampling.
|
## Exclusive mode blocks all other audio source, and get best audio quality without resampling.
|
||||||
## exclusive "no" # optional
|
## exclusive "no" # optional
|
||||||
## Enumerate all devices in log.
|
## Enumerate all devices in log.
|
||||||
|
|
|
@ -725,9 +725,11 @@ MPD enables MixRamp if:
|
||||||
- Cross-fade is enabled
|
- Cross-fade is enabled
|
||||||
- :ref:`mixrampdelay <command_mixrampdelay>` is set to a positive
|
- :ref:`mixrampdelay <command_mixrampdelay>` is set to a positive
|
||||||
value, e.g.::
|
value, e.g.::
|
||||||
|
|
||||||
mpc mixrampdelay 1
|
mpc mixrampdelay 1
|
||||||
- :ref:`mixrampdb <command_mixrampdb>` is set to a reasonable value,
|
- :ref:`mixrampdb <command_mixrampdb>` is set to a reasonable value,
|
||||||
e.g.::
|
e.g.::
|
||||||
|
|
||||||
mpc mixrampdb -17
|
mpc mixrampdb -17
|
||||||
- both songs have MixRamp tags (or ``mixramp_analyzer`` is enabled)
|
- both songs have MixRamp tags (or ``mixramp_analyzer`` is enabled)
|
||||||
- both songs have the same audio format (or :ref:`audio_output_format`
|
- both songs have the same audio format (or :ref:`audio_output_format`
|
||||||
|
|
|
@ -158,7 +158,7 @@ gme = CmakeProject(
|
||||||
'-DBUILD_SHARED_LIBS=OFF',
|
'-DBUILD_SHARED_LIBS=OFF',
|
||||||
'-DENABLE_UBSAN=OFF',
|
'-DENABLE_UBSAN=OFF',
|
||||||
'-DZLIB_INCLUDE_DIR=OFF',
|
'-DZLIB_INCLUDE_DIR=OFF',
|
||||||
'-DSDL2_DIR=OFF',
|
'-DCMAKE_DISABLE_FIND_PACKAGE_SDL2=ON',
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include "lib/xiph/FlacMetadataChain.hxx"
|
#include "lib/xiph/FlacMetadataChain.hxx"
|
||||||
#include "OggCodec.hxx"
|
#include "OggCodec.hxx"
|
||||||
#include "input/InputStream.hxx"
|
#include "input/InputStream.hxx"
|
||||||
|
#include "input/LocalOpen.hxx"
|
||||||
#include "fs/Path.hxx"
|
#include "fs/Path.hxx"
|
||||||
#include "fs/NarrowPath.hxx"
|
#include "fs/NarrowPath.hxx"
|
||||||
#include "Log.hxx"
|
#include "Log.hxx"
|
||||||
|
@ -54,13 +55,30 @@ static bool
|
||||||
flac_scan_file(Path path_fs, TagHandler &handler) noexcept
|
flac_scan_file(Path path_fs, TagHandler &handler) noexcept
|
||||||
{
|
{
|
||||||
FlacMetadataChain chain;
|
FlacMetadataChain chain;
|
||||||
if (!chain.Read(NarrowPath(path_fs))) {
|
const bool succeed = [&chain, &path_fs]() noexcept {
|
||||||
|
// read by NarrowPath
|
||||||
|
if (chain.Read(NarrowPath(path_fs))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (std::is_same_v<Path::value_type, char> ||
|
||||||
|
chain.GetStatus() != FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// read by InputStream
|
||||||
|
Mutex mutex;
|
||||||
|
auto is = OpenLocalInputStream(path_fs, mutex);
|
||||||
|
if (is && chain.Read(*is)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}();
|
||||||
|
|
||||||
|
if (!succeed) {
|
||||||
FmtDebug(flac_domain,
|
FmtDebug(flac_domain,
|
||||||
"Failed to read FLAC tags: {}",
|
"Failed to read FLAC tags: {}",
|
||||||
chain.GetStatusString());
|
chain.GetStatusString());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
chain.Scan(handler);
|
chain.Scan(handler);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -546,7 +546,21 @@ parse_lame(struct lame *lame, struct mad_bitptr *ptr, int *bitlen) noexcept
|
||||||
|
|
||||||
mad_bit_skip(ptr, 16);
|
mad_bit_skip(ptr, 16);
|
||||||
|
|
||||||
lame->peak = MAD_F(mad_bit_read(ptr, 32) << 5); /* peak */
|
/* The lame peak value is a float multiplied by 2^23 and stored as an
|
||||||
|
* unsigned integer (it is always positive). MAD's fixed-point format uses
|
||||||
|
* 28 bits for the fractional part, so shift the 23 bit fraction up before
|
||||||
|
* converting to a float.
|
||||||
|
*/
|
||||||
|
unsigned long peak_int = mad_bit_read(ptr, 32);
|
||||||
|
|
||||||
|
#define LAME_PEAK_FRACBITS 23
|
||||||
|
#if MAD_F_FRACBITS > LAME_PEAK_FRACBITS
|
||||||
|
peak_int <<= (MAD_F_FRACBITS - LAME_PEAK_FRACBITS);
|
||||||
|
#elif LAME_PEAK_FRACBITS > MAD_F_FRACBITS
|
||||||
|
peak_int >>= (LAME_PEAK_FRACBITS - MAD_F_FRACBITS);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
lame->peak = mad_f_todouble(peak_int); /* peak */
|
||||||
FmtDebug(mad_domain, "LAME peak found: {}", lame->peak);
|
FmtDebug(mad_domain, "LAME peak found: {}", lame->peak);
|
||||||
|
|
||||||
lame->track_gain = 0;
|
lame->track_gain = 0;
|
||||||
|
|
|
@ -1007,7 +1007,7 @@ WasapiOutput::EnumerateDevices(IMMDeviceEnumerator &enumerator)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
FmtNotice(wasapi_output_domain,
|
FmtNotice(wasapi_output_domain,
|
||||||
"Device \"{}\" \"{}\"", i, name);
|
"Device \"{}\" \"{}\"", i, name.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -114,7 +114,7 @@ public:
|
||||||
|
|
||||||
void set_value(const T &value) {
|
void set_value(const T &value) {
|
||||||
std::unique_lock<CriticalSection> lock(mutex);
|
std::unique_lock<CriticalSection> lock(mutex);
|
||||||
if (!std::holds_alternative<std::monostate>(&result)) {
|
if (!std::holds_alternative<std::monostate>(result)) {
|
||||||
throw WinFutureError(WinFutureErrc::promise_already_satisfied);
|
throw WinFutureError(WinFutureErrc::promise_already_satisfied);
|
||||||
}
|
}
|
||||||
result.template emplace<T>(value);
|
result.template emplace<T>(value);
|
||||||
|
|
|
@ -40,17 +40,17 @@ public:
|
||||||
using R = std::invoke_result_t<std::decay_t<Function>>;
|
using R = std::invoke_result_t<std::decay_t<Function>>;
|
||||||
auto promise = std::make_shared<Promise<R>>();
|
auto promise = std::make_shared<Promise<R>>();
|
||||||
auto future = promise->get_future();
|
auto future = promise->get_future();
|
||||||
Push([function = std::forward<Function>(function),
|
Push([func = std::forward<Function>(function),
|
||||||
promise = std::move(promise)]() mutable {
|
prom = std::move(promise)]() mutable {
|
||||||
try {
|
try {
|
||||||
if constexpr (std::is_void_v<R>) {
|
if constexpr (std::is_void_v<R>) {
|
||||||
std::invoke(std::forward<Function>(function));
|
std::invoke(std::forward<Function>(func));
|
||||||
promise->set_value();
|
prom->set_value();
|
||||||
} else {
|
} else {
|
||||||
promise->set_value(std::invoke(std::forward<Function>(function)));
|
prom->set_value(std::invoke(std::forward<Function>(func)));
|
||||||
}
|
}
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
promise->set_exception(std::current_exception());
|
prom->set_exception(std::current_exception());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return future;
|
return future;
|
||||||
|
|
|
@ -4,7 +4,7 @@ if systemd_system_unit_dir == ''
|
||||||
if systemd.found()
|
if systemd.found()
|
||||||
systemd_system_unit_dir = systemd.get_variable(
|
systemd_system_unit_dir = systemd.get_variable(
|
||||||
pkgconfig: 'systemdsystemunitdir',
|
pkgconfig: 'systemdsystemunitdir',
|
||||||
pkgconfig_define: ['prefix', get_option('prefix')],
|
pkgconfig_define: ['rootprefix', get_option('prefix')],
|
||||||
)
|
)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
Loading…
Reference in New Issue