-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
I hadn't realised my patches are getting mangled. I'm sure Evolution
used to work with git-format-patch mailbox imports without mangling,
but apparently not any more. I'll create a repo on my github accound
and send a pull request.
Same applies to my other patch.
Sorry for the useless patches.
On 18/10/14 14:25, Steven Newbury wrote:
> Changes in v3: Dropped useless reverse endian code
>
> Changes in v2: * DSD support * Cleanup
>
> "MPD doesn't support the other pulseaudio sample formats, so we
> just force MPD to send us everything as 16 bit"
>
> At some point the comment was probably true, but recent versions
> of pulseaudio have no trouble with any reasonable selection of
> sample formats.
>
> There are some exceptions:
>
> * at present DSD is not (yet) supported in pulseaudio, so in the
> meantime DSD is supported by downsampling to a decent PCM spec
>
> * pulseaudio supports U8, but not S8, vis-versa for mpd
>
> * pulseaudio supports both packed and unpacked variants of S24 for
> both endian, but mpd apparently doesn't support non-packed 24bit
> samples, which is a little odd since the ALSA output plugin
> assumes it does and so seems to always fall back to packed for
> 24bit formats!?! (bug?)
>
> I originally started this patch from the multi-format support code
> in the ALSA plugin, and as such it still contains the logic for
> fall-back formats, but whereas the ALSA plugin attempts to open a
> stream, this isn't necessary in this case since there's a pulse
> API for testing the validity of a sample_spec. ---
> src/output/plugins/PulseOutputPlugin.cxx | 91
> +++++++++++++++++++++++++++++--- 1 file changed, 85 insertions(+),
> 6 deletions(-)
>
> diff --git a/src/output/plugins/PulseOutputPlugin.cxx
> b/src/output/plugins/PulseOutputPlugin.cxx index 0d79af7..30ab396
> 100644 --- a/src/output/plugins/PulseOutputPlugin.cxx +++
> b/src/output/plugins/PulseOutputPlugin.cxx @@ -544,6 +544,54 @@
> pulse_output_setup_stream(PulseOutput *po, const pa_sample_spec
> *ss, return true; }
>
> +static pa_sample_format_t +get_bitformat(SampleFormat
> sample_format) +{ + /* Pulse supports U8 and S24LE/BE
> formats but mpd + currently does not. Pulse does not support
> S8. */ + switch (sample_format) { + case
> SampleFormat::UNDEFINED: + case SampleFormat::DSD: + case
> SampleFormat::S8: + return PA_SAMPLE_INVALID; + + case
> SampleFormat::S16: + return PA_SAMPLE_S16NE; + + case
> SampleFormat::S24_P32: + return PA_SAMPLE_S24_32NE; + + case
> SampleFormat::S32: + return PA_SAMPLE_S32NE; + + case
> SampleFormat::FLOAT: + return PA_SAMPLE_FLOAT32NE; + } + +
> assert(false); + gcc_unreachable(); +} + +static
> pa_sample_spec +pulse_get_valid_spec(uint32_t sample_rate,
> SampleFormat sample_format, + uint8_t channels) +{ +
> pa_sample_spec test_spec; + int ret; + + test_spec.format =
> get_bitformat(sample_format); + test_spec.rate = sample_rate; +
> test_spec.channels = channels; + if (test_spec.format ==
> PA_SAMPLE_INVALID) + return test_spec; + + ret =
> pa_sample_spec_valid(&test_spec); + if (ret == 0) +
> test_spec.format = PA_SAMPLE_INVALID; + + return test_spec;
> +} + static bool pulse_output_open(AudioOutput *ao, AudioFormat
> &audio_format, Error &error) @@ -579,13 +627,44 @@
> pulse_output_open(AudioOutput *ao, AudioFormat &audio_format,
> return false; }
>
> - /* MPD doesn't support the other pulseaudio sample
> formats, so - we just force MPD to send us everything as 16
> bit */ - audio_format.format = SampleFormat::S16; + /*
> pulseaudio can validate a sample_spec before opening the stream */
> + + ss = pulse_get_valid_spec(audio_format.sample_rate, +
> audio_format.format, audio_format.channels);
>
> - ss.format = PA_SAMPLE_S16NE; - ss.rate =
> audio_format.sample_rate; - ss.channels =
> audio_format.channels; + /* if unsupported, try other
> formats */ + + if (ss.format == PA_SAMPLE_INVALID) { +
> /* Pulse doesn't yet support DSD so attempt to resample + to
> high quality PCM - maybe higher would be better, + but that
> would then typically need to be resampled + twice! :-/ */ +
> if (audio_format.format == SampleFormat::DSD) + { +
> audio_format.format = SampleFormat::FLOAT; +
> audio_format.sample_rate = 48000; + } + + static const
> SampleFormat probe_formats[] = { + SampleFormat::S32, +
> SampleFormat::S24_P32, + SampleFormat::S16, +
> SampleFormat::UNDEFINED, + }; + + for (unsigned i = 0;
> + ss.format == PA_SAMPLE_INVALID && probe_formats[i] !=
> SampleFormat::UNDEFINED; + ++i) { + const SampleFormat
> mpd_format = probe_formats[i]; + if (mpd_format ==
> audio_format.format) + continue; + + ss =
> pulse_get_valid_spec(audio_format.sample_rate, + mpd_format,
> audio_format.channels); + if (ss.format != PA_SAMPLE_INVALID)
> + audio_format.format = mpd_format; + } + }
>
> /* create a stream .. */
>
> -- 2.1.0
>
>
>
> _______________________________________________ mpd-devel mailing
> list [email protected]
> http://mailman.blarg.de/listinfo/mpd-devel
>
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2
iEYEARECAAYFAlRCeA8ACgkQGcb56gMuC60SmQCgiUCA/KPwwHAd3CtuaHeyknft
ddoAn0q4d9xxZUIbvxDyMUbTb7aeSSMw
=YzS0
-----END PGP SIGNATURE-----
_______________________________________________
mpd-devel mailing list
[email protected]
http://mailman.blarg.de/listinfo/mpd-devel