From 2c3eeb7194b4871ed7227a2c0b7bfae90b05d17f Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 17 Jun 2019 21:24:32 +0200 Subject: [PATCH] MusicChunk: pad MusicChunkInfo to a multiple of 8 bytes Workaround for a regression caused by commit a06bf388d968279808009d4538def57e78b4bee7, revealing a problem with discarding odd numer of frames in the DSD_U32 and DoP converters, causing distortions with DSD_U32 and DoP on 32 bit CPUs. Closes https://github.com/MusicPlayerDaemon/MPD/issues/469 --- NEWS | 2 ++ src/MusicChunk.hxx | 14 +++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 704b128cb..2d206e325 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,6 @@ ver 0.21.11 (not yet released) +* output + - alsa, osx: fix distortions with DSD_U32 and DoP on 32 bit CPUs * protocol - fix "list" with multiple "group" levels diff --git a/src/MusicChunk.hxx b/src/MusicChunk.hxx index b809afefd..5d75e0432 100644 --- a/src/MusicChunk.hxx +++ b/src/MusicChunk.hxx @@ -43,7 +43,15 @@ struct MusicChunk; /** * Meta information for #MusicChunk. */ -struct MusicChunkInfo { +struct alignas(8) MusicChunkInfo { + /* align to multiple of 8 bytes, which adds padding at the + end, so the size of MusicChunk::data is also a multiple of + 8 bytes; this is a workaround for a bug in the DSD_U32 and + DoP converters which require processing 8 bytes at a time, + discarding the remainder */ + /* TODO: once all converters have been fixed, we should remove + this workaround */ + /** the next chunk in a linked list */ MusicChunkPtr next; @@ -119,6 +127,10 @@ struct MusicChunk : MusicChunkInfo { /** the data (probably PCM) */ uint8_t data[CHUNK_SIZE - sizeof(MusicChunkInfo)]; + /* TODO: remove this check once all converters have been fixed + (see comment in struct MusicChunkInfo for details) */ + static_assert(sizeof(data) % 8 == 0, "Wrong alignment"); + /** * Prepares appending to the music chunk. Returns a buffer * where you may write into. After you are finished, call