Index: sys/dev/audio/audio.c =================================================================== RCS file: /cvsroot/src/sys/dev/audio/audio.c,v retrieving revision 1.144 diff -p -u -r1.144 audio.c --- sys/dev/audio/audio.c 5 Jun 2023 16:26:05 -0000 1.144 +++ sys/dev/audio/audio.c 30 Sep 2023 13:22:41 -0000 @@ -9222,7 +9222,6 @@ audio_mixsample_to_linear(audio_filter_a const aint2_t *m; uint8_t *p; u_int sample_count; - bool swap; aint2_t v, xor; u_int i, bps; bool little; @@ -9235,48 +9234,150 @@ audio_mixsample_to_linear(audio_filter_a m = arg->src; p = arg->dst; sample_count = arg->count * fmt->channels; - swap = arg->dstfmt->encoding == AUDIO_ENCODING_SLINEAR_OE; - -#if BYTE_ORDER == LITTLE_ENDIAN - little = !swap; -#endif -#if BYTE_ORDER == BIG_ENDIAN - little = swap; -#endif + little = arg->dstfmt->encoding == AUDIO_ENCODING_SLINEAR_LE; bps = fmt->stride / NBBY; + xor = audio_format2_is_signed(fmt) ? 0 : (aint2_t)1 << 31; - xor = audio_format2_is_signed(fmt) - ? 0 : 1 << (fmt->stride - 1); - - for (i=0; i>= (4 - bps) * NBBY; - - /* signed -> unsigned */ - v ^= xor; - - if (little) { - switch (bps) { - case 4: *p++ = v; v >>= 8; /* FALLTHROUGH */ - case 3: *p++ = v; v >>= 8; /* FALLTHROUGH */ - case 2: *p++ = v; v >>= 8; /* FALLTHROUGH */ - case 1: *p++ = v; /* FALLTHROUGH */ - } - } else { - switch (bps) { - case 4: *p++ = v >> 24; v <<= 8; /* FALLTHROUGH */ - case 3: *p++ = v >> 24; v <<= 8; /* FALLTHROUGH */ - case 2: *p++ = v >> 24; v <<= 8; /* FALLTHROUGH */ - case 1: *p++ = v >> 24; /* FALLTHROUGH */ +#if AUDIO_INTERNAL_BITS == 16 + if (little) { + switch (bps) { + case 4: + for (i=0; i> 8; + } + break; + case 3: + for (i=0; i> 8; + } + break; + case 2: + for (i=0; i> 8; + } + break; + case 1: + for (i=0; i> 8; + } + break; + } + } else { + switch (bps) { + case 4: + for (i=0; i> 8; + *p++ = v; + *p++ = 0; + *p++ = 0; + } + break; + case 3: + for (i=0; i> 8; + *p++ = v; + *p++ = 0; + } + break; + case 2: + for (i=0; i> 8; + *p++ = v; + } + break; + case 1: + for (i=0; i> 8; + } + break; + } + } +#elif AUDIO_INTERNAL_BITS == 32 + if (little) { + switch (bps) { + case 4: + for (i=0; i> 8; + *p++ = v >> 16; + *p++ = v >> 24; } + break; + case 3: + for (i=0; i> 8; + *p++ = v >> 16; + *p++ = v >> 24; + } + break; + case 2: + for (i=0; i> 16; + *p++ = v >> 24; + } + break; + case 1: + for (i=0; i> 24; + } + break; + } + } else { + switch (bps) { + case 4: + for (i=0; i> 24; + *p++ = v >> 16; + *p++ = v >> 8; + *p++ = v; + } + break; + case 3: + for (i=0; i> 24; + *p++ = v >> 16; + *p++ = v >> 8; + } + break; + case 2: + for (i=0; i> 24; + *p++ = v >> 16; + } + break; + case 1: + for (i=0; i> 24; + } + break; } } -} +#endif /* AUDIO_INTERNAL_BITS */ +} #endif /* NAUDIO > 0 */