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