OutputThread: fall back to PCM if given DSD sample rate is not supported
Works around the "PCM conversion from f to dsd is not implemented" error message that prevents DSD playback.
This commit is contained in:
parent
bc5a53574c
commit
d7f024c510
1
NEWS
1
NEWS
|
@ -4,6 +4,7 @@ ver 0.19.2 (not yet released)
|
|||
- ffmpeg: recognize MIME type audio/aacp
|
||||
* output
|
||||
- fix memory leak after filter initialization error
|
||||
- fall back to PCM if given DSD sample rate is not supported
|
||||
* fix assertion failure on unsupported PCM conversion
|
||||
* auto-disable plugins that require GLib when --disable-glib is used
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include "OutputAPI.hxx"
|
||||
#include "Domain.hxx"
|
||||
#include "pcm/PcmMix.hxx"
|
||||
#include "pcm/Domain.hxx"
|
||||
#include "notify.hxx"
|
||||
#include "filter/FilterInternal.hxx"
|
||||
#include "filter/plugins/ConvertFilterPlugin.hxx"
|
||||
|
@ -165,6 +166,10 @@ AudioOutput::Open()
|
|||
out_audio_format.ApplyMask(config_audio_format);
|
||||
|
||||
mutex.unlock();
|
||||
|
||||
const AudioFormat retry_audio_format = out_audio_format;
|
||||
|
||||
retry_without_dsd:
|
||||
success = ao_plugin_open(this, out_audio_format, error);
|
||||
mutex.lock();
|
||||
|
||||
|
@ -189,6 +194,31 @@ AudioOutput::Open()
|
|||
|
||||
mutex.unlock();
|
||||
ao_plugin_close(this);
|
||||
|
||||
if (error.IsDomain(pcm_domain) &&
|
||||
out_audio_format.format == SampleFormat::DSD) {
|
||||
/* if the audio output supports DSD, but not
|
||||
the given sample rate, it asks MPD to
|
||||
resample; resampling DSD however is not
|
||||
implemented; our last resort is to give up
|
||||
DSD and fall back to PCM */
|
||||
|
||||
// TODO: clean up this workaround
|
||||
|
||||
FormatError(output_domain, "Retrying without DSD");
|
||||
|
||||
out_audio_format = retry_audio_format;
|
||||
out_audio_format.format = SampleFormat::FLOAT;
|
||||
|
||||
/* clear the Error to allow reusing it */
|
||||
error.Clear();
|
||||
|
||||
/* sorry for the "goto" - this is a workaround
|
||||
for the stable branch that should be as
|
||||
unintrusive as possible */
|
||||
goto retry_without_dsd;
|
||||
}
|
||||
|
||||
CloseFilter();
|
||||
mutex.lock();
|
||||
|
||||
|
|
Loading…
Reference in New Issue