From 55584d38ddd52ab0952faed16b5aeff21ddcca34 Mon Sep 17 00:00:00 2001 From: Joel Holdsworth Date: Sun, 24 Sep 2017 22:07:30 -0600 Subject: [PATCH] dreamsourcelab-dslogic: Fixed deinterleaving when non-contiguous set of channels are enabled --- src/hardware/dreamsourcelab-dslogic/protocol.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/hardware/dreamsourcelab-dslogic/protocol.c b/src/hardware/dreamsourcelab-dslogic/protocol.c index 3b4848ee..90b773d9 100644 --- a/src/hardware/dreamsourcelab-dslogic/protocol.c +++ b/src/hardware/dreamsourcelab-dslogic/protocol.c @@ -733,10 +733,12 @@ static void deinterleave_buffer(const uint8_t *src, size_t length, for (int bit = 0; bit != 64; bit++) { const uint64_t *word_ptr = src_ptr; sample = 0; - for (size_t channel = 0; channel != channel_count; + for (unsigned int channel = 0; channel != 16; channel++) { - if ((channel_mask & (1 << channel)) && - (*word_ptr++ & (1ULL << bit))) + const uint16_t m = channel_mask >> channel; + if (!m) + break; + if ((m & 1) && ((*word_ptr++ >> bit) & 1ULL)) sample |= 1 << channel; } *dst_ptr++ = sample;