Re: DICE: VIA firewire controller can't to > 48KHz
Brought to you by:
aeb,
bencollins
From: Daniel R. <dro...@fu...> - 2014-12-12 20:33:13
|
On Fri, Dec 12, 2014 at 12:46 PM, Clemens Ladisch <cl...@la...> wrote: > And you DoP stuff uses two channels? That would be the problem then. Yes, it's a two-channel DAC. This "works": node ~ # aplay -D plughw:1 -f S32_LE -c 2 -r 176400 -t raw /dev/zero Playing raw data '/dev/zero' : Signed 32 bit Little Endian, Rate 176400 Hz, Stereo ^CAborted by signal Interrupt... aplay: pcm_write:1939: write error: Interrupted system call node ~ # This appears to be the relevant code in mpd relating to setting up alsa for DOP. It appears that it is trying to use S24_P32 rather than S32 -- could this be the issue? alsa_setup_dop(AlsaOutput *ad, const AudioFormat audio_format, bool *shift8_r, bool *packed_r, bool *reverse_endian_r, Error &error) { assert(ad->dop); assert(audio_format.format == SampleFormat::DSD); /* pass 24 bit to alsa_setup() */ AudioFormat dop_format = audio_format; dop_format.format = SampleFormat::S24_P32; dop_format.sample_rate /= 2; const AudioFormat check = dop_format; if (!alsa_setup(ad, dop_format, packed_r, reverse_endian_r, error)) return false; /* if the device allows only 32 bit, shift all DoP samples left by 8 bit and leave the lower 8 bit cleared; the DSD-over-USB documentation does not specify whether this is legal, but there is anecdotical evidence that this is possible (and the only option for some devices) */ *shift8_r = dop_format.format == SampleFormat::S32; if (dop_format.format == SampleFormat::S32) dop_format.format = SampleFormat::S24_P32; if (dop_format != check) { /* no bit-perfect playback, which is required for DSD over USB */ error.Format(alsa_output_domain, "Failed to configure DSD-over-PCM on ALSA device \"%s\"", alsa_device(ad)); delete[] ad->silence; return false; } return true; } Regards, Daniel |