pcm/Convert: add option to enable the integer-only dsd2pcm implementation

This commit is contained in:
Max Kellermann 2020-01-17 16:37:09 +01:00
parent 925b5954c3
commit c84bae739a
5 changed files with 42 additions and 0 deletions

1
NEWS
View File

@ -22,6 +22,7 @@ ver 0.22 (not yet released)
- ffmpeg: new plugin based on FFmpeg's libavfilter library
- hdcd: new plugin based on FFmpeg's "af_hdcd" for HDCD playback
- volume: convert S16 to S24 to preserve quality and reduce dithering noise
- dsd: add integer-only DSD to PCM converter
* output
- jack: add option "auto_destination_ports"
- jack: report error details

View File

@ -568,6 +568,26 @@ Sometimes, music needs to be resampled before it can be played; for example, CDs
Check the :ref:`resampler_plugins` reference for a list of resamplers
and how to configure them.
DSD
^^^
There are three ways to play back DSD (Direct Stream Digital):
- natively if your output supports it (ALSA only and requires a sound
card with native DSD support)
- `DSD over PCM <http://dsd-guide.com/dop-open-standard>`_: wrapped
inside fake 24 bit PCM samples (ALSA and OSX only and requires an
external DAC with DoP support)
- for everything else, MPD automatically converts DSD to PCM
For the last option, the setting ``dsd2pcm_converter`` selects a
conversion method. The default is ``float`` which converts to
floating point samples. For CPUs with a weak floating point unit
(e.g. some ARMs like the one in the Raspberry Pi), it may be faster to
use ``integer``, which is an integer-only implementation of the
conversion algorithm.
Client Connections
------------------

View File

@ -79,6 +79,7 @@ enum class ConfigOption {
DESPOTIFY_USER,
DESPOTIFY_PASSWORD,
DESPOTIFY_HIGH_BITRATE,
DSD2PCM_CONVERTER,
MAX
};

View File

@ -75,6 +75,7 @@ const ConfigTemplate config_param_templates[] = {
{ "despotify_user", false, true },
{ "despotify_password", false, true },
{ "despotify_high_bitrate", false, true },
{ "dsd2pcm_converter" },
};
static constexpr unsigned n_config_param_templates =

View File

@ -19,16 +19,35 @@
#include "Convert.hxx"
#include "ConfiguredResampler.hxx"
#include "config/Data.hxx"
#include "util/ConstBuffer.hxx"
#include "util/StringAPI.hxx"
#include <stdexcept>
#include <assert.h>
#ifdef ENABLE_DSD
static bool dsd2pcm_integer = false;
#endif
void
pcm_convert_global_init(const ConfigData &config)
{
pcm_resampler_global_init(config);
#ifdef ENABLE_DSD
dsd2pcm_integer = config.With(ConfigOption::DSD2PCM_CONVERTER, [](const char *s){
if (s == nullptr)
return false;
else if (StringIsEqual(s, "float"))
return false;
else if (StringIsEqual(s, "integer"))
return true;
else
throw std::runtime_error("Unrecognized value");
});
#endif
}
PcmConvert::PcmConvert(const AudioFormat _src_format,