pcm/Convert: choose pcm2dsd float/integer according to dest_format
This commit is contained in:
parent
452e1c1a6f
commit
a37d22de8a
1
NEWS
1
NEWS
|
@ -22,6 +22,7 @@ ver 0.22 (not yet released)
|
||||||
- ffmpeg: new plugin based on FFmpeg's libavfilter library
|
- ffmpeg: new plugin based on FFmpeg's libavfilter library
|
||||||
- hdcd: new plugin based on FFmpeg's "af_hdcd" for HDCD playback
|
- hdcd: new plugin based on FFmpeg's "af_hdcd" for HDCD playback
|
||||||
- volume: convert S16 to S24 to preserve quality and reduce dithering noise
|
- volume: convert S16 to S24 to preserve quality and reduce dithering noise
|
||||||
|
- dsd: add integer-only DSD to PCM converter
|
||||||
* output
|
* output
|
||||||
- jack: add option "auto_destination_ports"
|
- jack: add option "auto_destination_ports"
|
||||||
- jack: report error details
|
- jack: report error details
|
||||||
|
|
|
@ -41,7 +41,10 @@ PcmConvert::PcmConvert(const AudioFormat _src_format,
|
||||||
AudioFormat format = _src_format;
|
AudioFormat format = _src_format;
|
||||||
if (format.format == SampleFormat::DSD) {
|
if (format.format == SampleFormat::DSD) {
|
||||||
#ifdef ENABLE_DSD
|
#ifdef ENABLE_DSD
|
||||||
format.format = SampleFormat::FLOAT;
|
dsd2pcm_float = dest_format.format == SampleFormat::FLOAT;
|
||||||
|
format.format = dsd2pcm_float
|
||||||
|
? SampleFormat::FLOAT
|
||||||
|
: SampleFormat::S24_P32;
|
||||||
#else
|
#else
|
||||||
throw std::runtime_error("DSD support is disabled");
|
throw std::runtime_error("DSD support is disabled");
|
||||||
#endif
|
#endif
|
||||||
|
@ -115,11 +118,13 @@ PcmConvert::Convert(ConstBuffer<void> buffer)
|
||||||
#ifdef ENABLE_DSD
|
#ifdef ENABLE_DSD
|
||||||
if (src_format.format == SampleFormat::DSD) {
|
if (src_format.format == SampleFormat::DSD) {
|
||||||
auto s = ConstBuffer<uint8_t>::FromVoid(buffer);
|
auto s = ConstBuffer<uint8_t>::FromVoid(buffer);
|
||||||
auto d = dsd.ToFloat(src_format.channels, s);
|
auto d = dsd2pcm_float
|
||||||
|
? dsd.ToFloat(src_format.channels, s).ToVoid()
|
||||||
|
: dsd.ToS24(src_format.channels, s).ToVoid();
|
||||||
if (d.IsNull())
|
if (d.IsNull())
|
||||||
throw std::runtime_error("DSD to PCM conversion failed");
|
throw std::runtime_error("DSD to PCM conversion failed");
|
||||||
|
|
||||||
buffer = d.ToVoid();
|
buffer = d;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,10 @@ class PcmConvert {
|
||||||
|
|
||||||
bool enable_resampler, enable_format, enable_channels;
|
bool enable_resampler, enable_format, enable_channels;
|
||||||
|
|
||||||
|
#ifdef ENABLE_DSD
|
||||||
|
bool dsd2pcm_float;
|
||||||
|
#endif
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue