release v0.21.15
-----BEGIN PGP SIGNATURE----- iQJEBAABCgAuFiEEA5IzWngIOJSkMBxDI26KWMbbRRIFAl2LvuAQHG1heEBtdXNp Y3BkLm9yZwAKCRAjbopYxttFEg3VD/9uWiK11PPXfpAqOQgL63c1CS/6HJizwnox n0ns3T7eJJPXy06NTwuo5M8JeAIhuysEciHlJeGBf4NIGwGGHOL3nQv3FkWJlfeh UrIJq66gIzElZ62Jvq+7zkkfjm6A0tmQoAEoIPouus+A4RNwndpqsKSotZzLK0yY ACkJTxl8JJj+UbLzleDKSA+RxG817onGKl+urkvNDRdD7xs3VEUX6jhddVM1n3m+ BqCaihuQZYXur45mYIwFI7H5JevRawnEX8L6tERW0cE8j5IhnnPjwYvMX+DcZoTe DgYuGkfPTfl31QufbbetTwWITjf4nrummYrAM/fKcNJcaqZFo4hs7m7N6p9c2ebm QCUG0On32Lvkq4/iLAxXIdoy38mPkarREB2XQebHa6j2XPFjxB01lXLGYJzPtqBu LCFRpR+ssWeZDQ3uP+fAzlgMXmB+owWa9NVqU5vlx97TCmXInOeim6tfq1T4keGW 3VFLqM6VAw4QyhrbowU0xbvxvYkWrgpkYbM5NcfwI67xZGLsI5vnRzX05VgF6BFZ B7g+JIWjv+Mjm1ltsvC4OlJEcCXZb0BQWvwLHq0EGeEP/R9MWYX6BxlF1V8FWR2S bIL0qIqtZfuUI66irNn23ZCyN4DilMcZkS8f30321hB2GLputG8zZwCcjxy1a/ft 1OoHXRfKNw== =uONC -----END PGP SIGNATURE----- Merge tag 'v0.21.15' release v0.21.15
This commit is contained in:
commit
0643b5abad
7
NEWS
7
NEWS
|
@ -31,6 +31,13 @@ ver 0.22 (not yet released)
|
||||||
* switch to C++17
|
* switch to C++17
|
||||||
- GCC 7 or clang 4 (or newer) recommended
|
- GCC 7 or clang 4 (or newer) recommended
|
||||||
|
|
||||||
|
ver 0.21.15 (2019/09/25)
|
||||||
|
* decoder
|
||||||
|
- dsdiff, dsf: fix displayed bit rate
|
||||||
|
- mpcdec: fix bogus ReplayGain values
|
||||||
|
* output
|
||||||
|
- solaris: fix build with glibc 2.30
|
||||||
|
|
||||||
ver 0.21.14 (2019/08/21)
|
ver 0.21.14 (2019/08/21)
|
||||||
* decoder
|
* decoder
|
||||||
- sidplay: show track durations in database
|
- sidplay: show track durations in database
|
||||||
|
|
|
@ -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="37"
|
android:versionCode="38"
|
||||||
android:versionName="0.21.14">
|
android:versionName="0.21.15">
|
||||||
|
|
||||||
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="26"/>
|
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="26"/>
|
||||||
|
|
||||||
|
|
|
@ -15,8 +15,8 @@ libmpdclient = MesonProject(
|
||||||
)
|
)
|
||||||
|
|
||||||
libogg = AutotoolsProject(
|
libogg = AutotoolsProject(
|
||||||
'http://downloads.xiph.org/releases/ogg/libogg-1.3.3.tar.xz',
|
'http://downloads.xiph.org/releases/ogg/libogg-1.3.4.tar.xz',
|
||||||
'4f3fc6178a533d392064f14776b23c397ed4b9f48f5de297aba73b643f955c08',
|
'c163bc12bc300c401b6aa35907ac682671ea376f13ae0969a220f7ddf71893fe',
|
||||||
'lib/libogg.a',
|
'lib/libogg.a',
|
||||||
[
|
[
|
||||||
'--disable-shared', '--enable-static',
|
'--disable-shared', '--enable-static',
|
||||||
|
@ -38,8 +38,8 @@ libvorbis = AutotoolsProject(
|
||||||
)
|
)
|
||||||
|
|
||||||
opus = AutotoolsProject(
|
opus = AutotoolsProject(
|
||||||
'https://archive.mozilla.org/pub/opus/opus-1.3.tar.gz',
|
'https://archive.mozilla.org/pub/opus/opus-1.3.1.tar.gz',
|
||||||
'4f3d69aefdf2dbaf9825408e452a8a414ffc60494c70633560700398820dc550',
|
'65b58e1e25b2a114157014736a3d9dfeaad8d41be1c8179866f144a2fb44ff9d',
|
||||||
'lib/libopus.a',
|
'lib/libopus.a',
|
||||||
[
|
[
|
||||||
'--disable-shared', '--enable-static',
|
'--disable-shared', '--enable-static',
|
||||||
|
@ -112,8 +112,8 @@ liblame = AutotoolsProject(
|
||||||
)
|
)
|
||||||
|
|
||||||
ffmpeg = FfmpegProject(
|
ffmpeg = FfmpegProject(
|
||||||
'http://ffmpeg.org/releases/ffmpeg-4.1.3.tar.xz',
|
'http://ffmpeg.org/releases/ffmpeg-4.2.tar.xz',
|
||||||
'0c3020452880581a8face91595b239198078645e7d7184273b8bcc7758beb63d',
|
'023f10831a97ad93d798f53a3640e55cd564abfeba807ecbe8524dac4fedecd5',
|
||||||
'lib/libavcodec.a',
|
'lib/libavcodec.a',
|
||||||
[
|
[
|
||||||
'--disable-shared', '--enable-static',
|
'--disable-shared', '--enable-static',
|
||||||
|
@ -341,8 +341,8 @@ ffmpeg = FfmpegProject(
|
||||||
)
|
)
|
||||||
|
|
||||||
curl = AutotoolsProject(
|
curl = AutotoolsProject(
|
||||||
'http://curl.haxx.se/download/curl-7.64.1.tar.xz',
|
'http://curl.haxx.se/download/curl-7.65.3.tar.xz',
|
||||||
'9252332a7f871ce37bfa7f78bdd0a0e3924d8187cc27cb57c76c9474a7168fb3',
|
'f2d98854813948d157f6a91236ae34ca4a1b4cb302617cebad263d79b0235fea',
|
||||||
'lib/libcurl.a',
|
'lib/libcurl.a',
|
||||||
[
|
[
|
||||||
'--disable-shared', '--enable-static',
|
'--disable-shared', '--enable-static',
|
||||||
|
@ -365,8 +365,8 @@ curl = AutotoolsProject(
|
||||||
)
|
)
|
||||||
|
|
||||||
libexpat = AutotoolsProject(
|
libexpat = AutotoolsProject(
|
||||||
'https://github.com/libexpat/libexpat/releases/download/R_2_2_6/expat-2.2.6.tar.bz2',
|
'https://github.com/libexpat/libexpat/releases/download/R_2_2_7/expat-2.2.7.tar.bz2',
|
||||||
'17b43c2716d521369f82fc2dc70f359860e90fa440bea65b3b85f0b246ea81f2',
|
'cbc9102f4a31a8dafd42d642e9a3aa31e79a0aedaa1f6efd2795ebc83174ec18',
|
||||||
'lib/libexpat.a',
|
'lib/libexpat.a',
|
||||||
[
|
[
|
||||||
'--disable-shared', '--enable-static',
|
'--disable-shared', '--enable-static',
|
||||||
|
@ -392,7 +392,7 @@ libnfs = AutotoolsProject(
|
||||||
)
|
)
|
||||||
|
|
||||||
boost = BoostProject(
|
boost = BoostProject(
|
||||||
'http://downloads.sourceforge.net/project/boost/boost/1.70.0/boost_1_70_0.tar.bz2',
|
'https://dl.bintray.com/boostorg/release/1.71.0/source/boost_1_71_0.tar.bz2',
|
||||||
'430ae8354789de4fd19ee52f3b1f739e1fba576f0aded0897c3c2bc00fb38778',
|
'd73a8da01e8bf8c7eda40b4c84915071a8c8a0df4a6734537ddde4a8580524ee',
|
||||||
'include/boost/version.hpp',
|
'include/boost/version.hpp',
|
||||||
)
|
)
|
||||||
|
|
|
@ -38,6 +38,10 @@ struct ReplayGainTuple {
|
||||||
return gain > -100;
|
return gain > -100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static constexpr ReplayGainTuple Undefined() noexcept {
|
||||||
|
return {-200.0f, 0.0f};
|
||||||
|
}
|
||||||
|
|
||||||
gcc_pure
|
gcc_pure
|
||||||
float CalculateScale(const ReplayGainConfig &config) const noexcept;
|
float CalculateScale(const ReplayGainConfig &config) const noexcept;
|
||||||
};
|
};
|
||||||
|
@ -49,6 +53,13 @@ struct ReplayGainInfo {
|
||||||
return track.IsDefined() || album.IsDefined();
|
return track.IsDefined() || album.IsDefined();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static constexpr ReplayGainInfo Undefined() noexcept {
|
||||||
|
return {
|
||||||
|
ReplayGainTuple::Undefined(),
|
||||||
|
ReplayGainTuple::Undefined(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
const ReplayGainTuple &Get(ReplayGainMode mode) const noexcept {
|
const ReplayGainTuple &Get(ReplayGainMode mode) const noexcept {
|
||||||
return mode == ReplayGainMode::ALBUM
|
return mode == ReplayGainMode::ALBUM
|
||||||
? (album.IsDefined() ? album : track)
|
? (album.IsDefined() ? album : track)
|
||||||
|
|
|
@ -362,6 +362,7 @@ dsdiff_decode_chunk(DecoderClient &client, InputStream &is,
|
||||||
unsigned channels, unsigned sample_rate,
|
unsigned channels, unsigned sample_rate,
|
||||||
const offset_type total_bytes)
|
const offset_type total_bytes)
|
||||||
{
|
{
|
||||||
|
const unsigned kbit_rate = channels * sample_rate / 1000;
|
||||||
const offset_type start_offset = is.GetOffset();
|
const offset_type start_offset = is.GetOffset();
|
||||||
|
|
||||||
uint8_t buffer[8192];
|
uint8_t buffer[8192];
|
||||||
|
@ -408,7 +409,7 @@ dsdiff_decode_chunk(DecoderClient &client, InputStream &is,
|
||||||
bit_reverse_buffer(buffer, buffer + nbytes);
|
bit_reverse_buffer(buffer, buffer + nbytes);
|
||||||
|
|
||||||
cmd = client.SubmitData(is, buffer, nbytes,
|
cmd = client.SubmitData(is, buffer, nbytes,
|
||||||
sample_rate / 1000);
|
kbit_rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -255,6 +255,7 @@ dsf_decode_chunk(DecoderClient &client, InputStream &is,
|
||||||
offset_type n_blocks,
|
offset_type n_blocks,
|
||||||
bool bitreverse)
|
bool bitreverse)
|
||||||
{
|
{
|
||||||
|
const unsigned kbit_rate = channels * sample_rate / 1000;
|
||||||
const size_t block_size = channels * DSF_BLOCK_SIZE;
|
const size_t block_size = channels * DSF_BLOCK_SIZE;
|
||||||
const offset_type start_offset = is.GetOffset();
|
const offset_type start_offset = is.GetOffset();
|
||||||
|
|
||||||
|
@ -290,7 +291,7 @@ dsf_decode_chunk(DecoderClient &client, InputStream &is,
|
||||||
|
|
||||||
cmd = client.SubmitData(is,
|
cmd = client.SubmitData(is,
|
||||||
interleaved_buffer, block_size,
|
interleaved_buffer, block_size,
|
||||||
sample_rate / 1000);
|
kbit_rate);
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -136,6 +136,28 @@ mpc_to_mpd_buffer(MpcdecSampleTraits::pointer_type dest,
|
||||||
*dest++ = mpc_to_mpd_sample(*src++);
|
*dest++ = mpc_to_mpd_sample(*src++);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static constexpr ReplayGainTuple
|
||||||
|
ImportMpcdecReplayGain(mpc_uint16_t gain, mpc_uint16_t peak) noexcept
|
||||||
|
{
|
||||||
|
auto t = ReplayGainTuple::Undefined();
|
||||||
|
|
||||||
|
if (gain != 0 && peak != 0) {
|
||||||
|
t.gain = MPC_OLD_GAIN_REF - (gain / 256.);
|
||||||
|
t.peak = pow(10, peak / 256. / 20) / 32767;
|
||||||
|
}
|
||||||
|
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr ReplayGainInfo
|
||||||
|
ImportMpcdecReplayGain(const mpc_streaminfo &info) noexcept
|
||||||
|
{
|
||||||
|
auto rgi = ReplayGainInfo::Undefined();
|
||||||
|
rgi.album = ImportMpcdecReplayGain(info.gain_album, info.peak_album);
|
||||||
|
rgi.track = ImportMpcdecReplayGain(info.gain_title, info.peak_title);
|
||||||
|
return rgi;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mpcdec_decode(DecoderClient &client, InputStream &is)
|
mpcdec_decode(DecoderClient &client, InputStream &is)
|
||||||
{
|
{
|
||||||
|
@ -166,14 +188,11 @@ mpcdec_decode(DecoderClient &client, InputStream &is)
|
||||||
mpcdec_sample_format,
|
mpcdec_sample_format,
|
||||||
info.channels);
|
info.channels);
|
||||||
|
|
||||||
ReplayGainInfo rgi;
|
{
|
||||||
rgi.Clear();
|
const auto rgi = ImportMpcdecReplayGain(info);
|
||||||
rgi.album.gain = MPC_OLD_GAIN_REF - (info.gain_album / 256.);
|
if (rgi.IsDefined())
|
||||||
rgi.album.peak = pow(10, info.peak_album / 256. / 20) / 32767;
|
client.SubmitReplayGain(&rgi);
|
||||||
rgi.track.gain = MPC_OLD_GAIN_REF - (info.gain_title / 256.);
|
}
|
||||||
rgi.track.peak = pow(10, info.peak_title / 256. / 20) / 32767;
|
|
||||||
|
|
||||||
client.SubmitReplayGain(&rgi);
|
|
||||||
|
|
||||||
client.Ready(audio_format, is.IsSeekable(),
|
client.Ready(audio_format, is.IsSeekable(),
|
||||||
SongTime::FromS(mpc_streaminfo_get_length(&info)));
|
SongTime::FromS(mpc_streaminfo_get_length(&info)));
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
#include "system/FileDescriptor.hxx"
|
#include "system/FileDescriptor.hxx"
|
||||||
#include "system/Error.hxx"
|
#include "system/Error.hxx"
|
||||||
|
|
||||||
#include <sys/stropts.h>
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
@ -31,11 +30,18 @@
|
||||||
|
|
||||||
#ifdef __sun
|
#ifdef __sun
|
||||||
#include <sys/audio.h>
|
#include <sys/audio.h>
|
||||||
|
#include <sys/stropts.h>
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/* some fake declarations that allow build this plugin on systems
|
/* some fake declarations that allow build this plugin on systems
|
||||||
other than Solaris, just to see if it compiles */
|
other than Solaris, just to see if it compiles */
|
||||||
|
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
|
#ifndef I_FLUSH
|
||||||
|
#define I_FLUSH 0
|
||||||
|
#endif
|
||||||
|
|
||||||
#define AUDIO_GETINFO 0
|
#define AUDIO_GETINFO 0
|
||||||
#define AUDIO_SETINFO 0
|
#define AUDIO_SETINFO 0
|
||||||
#define AUDIO_ENCODING_LINEAR 0
|
#define AUDIO_ENCODING_LINEAR 0
|
||||||
|
|
Loading…
Reference in New Issue