Converter: Smarter, if less portable, endian swap
For big endian sample formats, endianness can be swapped using Clang specific byte swap functions, which are present in all supported versions of Xcode. Signed-off-by: Christopher Snowhill <kode54@gmail.com>
This commit is contained in:
parent
5f68131437
commit
c39b7ee96a
1 changed files with 13 additions and 27 deletions
|
@ -358,53 +358,39 @@ static void convert_f64_to_f32(float *output, const double *input, size_t count)
|
|||
|
||||
static void convert_be_to_le(uint8_t *buffer, size_t bitsPerSample, size_t bytes) {
|
||||
size_t i;
|
||||
uint8_t temp;
|
||||
bitsPerSample = (bitsPerSample + 7) / 8;
|
||||
switch(bitsPerSample) {
|
||||
case 2:
|
||||
for(i = 0; i < bytes; i += 2) {
|
||||
temp = buffer[1];
|
||||
buffer[1] = buffer[0];
|
||||
buffer[0] = temp;
|
||||
*(int16_t *)buffer = __builtin_bswap16(*(int16_t *)buffer);
|
||||
buffer += 2;
|
||||
}
|
||||
break;
|
||||
|
||||
case 3:
|
||||
case 3: {
|
||||
union {
|
||||
vDSP_int24 int24;
|
||||
uint32_t int32;
|
||||
} intval;
|
||||
intval.int32 = 0;
|
||||
for(i = 0; i < bytes; i += 3) {
|
||||
temp = buffer[2];
|
||||
buffer[2] = buffer[0];
|
||||
buffer[0] = temp;
|
||||
intval.int24 = *(vDSP_int24 *)buffer;
|
||||
intval.int32 = __builtin_bswap32(intval.int32 << 8);
|
||||
*(vDSP_int24 *)buffer = intval.int24;
|
||||
buffer += 3;
|
||||
}
|
||||
break;
|
||||
} break;
|
||||
|
||||
case 4:
|
||||
for(i = 0; i < bytes; i += 4) {
|
||||
temp = buffer[3];
|
||||
buffer[3] = buffer[0];
|
||||
buffer[0] = temp;
|
||||
temp = buffer[2];
|
||||
buffer[2] = buffer[1];
|
||||
buffer[1] = temp;
|
||||
*(uint32_t *)buffer = __builtin_bswap32(*(uint32_t *)buffer);
|
||||
buffer += 4;
|
||||
}
|
||||
break;
|
||||
|
||||
case 8:
|
||||
for(i = 0; i < bytes; i += 8) {
|
||||
temp = buffer[7];
|
||||
buffer[7] = buffer[0];
|
||||
buffer[0] = temp;
|
||||
temp = buffer[6];
|
||||
buffer[6] = buffer[1];
|
||||
buffer[1] = temp;
|
||||
temp = buffer[5];
|
||||
buffer[5] = buffer[2];
|
||||
buffer[2] = temp;
|
||||
temp = buffer[4];
|
||||
buffer[4] = buffer[3];
|
||||
buffer[3] = temp;
|
||||
*(uint64_t *)buffer = __builtin_bswap64(*(uint64_t *)buffer);
|
||||
buffer += 8;
|
||||
}
|
||||
break;
|
||||
|
|
Loading…
Reference in a new issue