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
|
- ffmpeg: recognize MIME type audio/aacp
|
||||||
* output
|
* output
|
||||||
- fix memory leak after filter initialization error
|
- 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
|
* fix assertion failure on unsupported PCM conversion
|
||||||
* auto-disable plugins that require GLib when --disable-glib is used
|
* auto-disable plugins that require GLib when --disable-glib is used
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "OutputAPI.hxx"
|
#include "OutputAPI.hxx"
|
||||||
#include "Domain.hxx"
|
#include "Domain.hxx"
|
||||||
#include "pcm/PcmMix.hxx"
|
#include "pcm/PcmMix.hxx"
|
||||||
|
#include "pcm/Domain.hxx"
|
||||||
#include "notify.hxx"
|
#include "notify.hxx"
|
||||||
#include "filter/FilterInternal.hxx"
|
#include "filter/FilterInternal.hxx"
|
||||||
#include "filter/plugins/ConvertFilterPlugin.hxx"
|
#include "filter/plugins/ConvertFilterPlugin.hxx"
|
||||||
@ -165,6 +166,10 @@ AudioOutput::Open()
|
|||||||
out_audio_format.ApplyMask(config_audio_format);
|
out_audio_format.ApplyMask(config_audio_format);
|
||||||
|
|
||||||
mutex.unlock();
|
mutex.unlock();
|
||||||
|
|
||||||
|
const AudioFormat retry_audio_format = out_audio_format;
|
||||||
|
|
||||||
|
retry_without_dsd:
|
||||||
success = ao_plugin_open(this, out_audio_format, error);
|
success = ao_plugin_open(this, out_audio_format, error);
|
||||||
mutex.lock();
|
mutex.lock();
|
||||||
|
|
||||||
@ -189,6 +194,31 @@ AudioOutput::Open()
|
|||||||
|
|
||||||
mutex.unlock();
|
mutex.unlock();
|
||||||
ao_plugin_close(this);
|
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();
|
CloseFilter();
|
||||||
mutex.lock();
|
mutex.lock();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user