From 4cdca2f5f8cf13e035dd1dd0cd26d11931c93d1a Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Sat, 5 Feb 2022 04:03:40 -0800 Subject: [PATCH] Converter: Fix DSD gaplessness Signed-off-by: Christopher Snowhill --- Audio/Chain/ConverterNode.m | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/Audio/Chain/ConverterNode.m b/Audio/Chain/ConverterNode.m index 0d1020cd8..e679c9868 100644 --- a/Audio/Chain/ConverterNode.m +++ b/Audio/Chain/ConverterNode.m @@ -693,7 +693,18 @@ tryagain: inputBuffer = realloc(inputBuffer, inputBufferSize = newSize * 3); } - memmove(inputBuffer + N_samples_to_add_ * floatFormat.mBytesPerPacket, inputBuffer, bytesReadFromInput); + size_t bytesToSkip = 0; + if (dsd2pcm) { + bytesToSkip = dsd2pcmLatency * floatFormat.mBytesPerPacket; + if (bytesReadFromInput >= bytesToSkip) { + bytesReadFromInput -= bytesToSkip; + } + else { + bytesToSkip = 0; + } + } + + memmove(inputBuffer + N_samples_to_add_ * floatFormat.mBytesPerPacket, inputBuffer + bytesToSkip, bytesReadFromInput); lpc_extrapolate_bkwd(inputBuffer + N_samples_to_add_ * floatFormat.mBytesPerPacket, samples_in_buffer, prime, floatFormat.mChannelsPerFrame, LPC_ORDER, N_samples_to_add_, &extrapolateBuffer, &extrapolateBufferSize); bytesReadFromInput += N_samples_to_add_ * floatFormat.mBytesPerPacket; @@ -709,6 +720,12 @@ tryagain: if (is_postextrapolated_ == 1) { size_t samples_in_buffer = bytesReadFromInput / floatFormat.mBytesPerPacket; + + if (dsd2pcm) { + if (samples_in_buffer >= dsd2pcmLatency) + samples_in_buffer -= dsd2pcmLatency; + } + size_t prime = min(samples_in_buffer, PRIME_LEN_); size_t newSize = bytesReadFromInput;