IOAudioBlitterLib.cpp [plain text]
#include "IOAudioBlitterLib.h"
void Float32ToSwapInt24_Portable(const Float32 *src, UInt8 *vdest, unsigned int nSamples)
{
UInt32 *dest = (UInt32 *)vdest;
double maxInt32 = 2147483648.0; double round = 128.0;
double max32 = maxInt32 - 1.0 - round;
double min32 = -2147483648.0;
int shift = 8, count;
SET_ROUNDMODE
count = nSamples >> 2;
while (count--) {
double f1 = src[0] * maxInt32 + round;
double f2 = src[1] * maxInt32 + round;
double f3 = src[2] * maxInt32 + round;
double f4 = src[3] * maxInt32 + round;
SInt32 i1 = FloatToInt(f1, min32, max32) >> shift;
SInt32 i2 = FloatToInt(f2, min32, max32) >> shift;
SInt32 i3 = FloatToInt(f3, min32, max32) >> shift;
SInt32 i4 = FloatToInt(f4, min32, max32) >> shift;
#if TARGET_RT_BIG_ENDIAN
dest[0] = ((i1 & 0x000000FF) << 24)
| ((i1 & 0x0000FF00) << 8)
| ((i1 & 0x00FF0000) >> 8)
| (i2 & 0x000000FF);
dest[1] = ((i2 & 0x0000FF00) << 16)
| (i2 & 0x00FF0000)
| ((i3 & 0x000000FF) << 8)
| ((i3 & 0x0000FF00) >> 8);
dest[2] = ((i3 & 0x00FF0000) << 8)
| ((i4 & 0x000000FF) << 16)
| (i4 & 0x0000FF00)
| ((i4 & 0x00FF0000) >> 16);
#else
dest[0] = ((i2 & 0x00FF0000) << 8)
| ((i1 & 0x000000FF) << 16)
| (i1 & 0x0000FF00)
| ((i1 & 0x00FF0000) >> 16);
dest[1] = ((i3 & 0x0000FF00) << 16)
| (i3 & 0x00FF0000)
| ((i2 & 0x000000FF) << 8)
| ((i2 & 0x0000FF00) >> 8);
dest[2] = ((i4 & 0x000000FF) << 24)
| ((i4 & 0x0000FF00) << 8)
| ((i4 & 0x00FF0000) >> 8)
| (i3 & 0x000000FF);
#endif
src += 4;
dest += 3;
}
UInt8 *p = (UInt8 *)dest;
count = nSamples & 3;
while (count--) {
double f1 = *src++ * maxInt32 + round;
SInt32 i1 = FloatToInt(f1, min32, max32) >> shift;
#if TARGET_RT_BIG_ENDIAN
p[0] = i1;
p[1] = i1 >> 8;
p[2] = i1 >> 16;
#else
p[0] = UInt8(i1 >> 16);
p[1] = UInt8(i1 >> 8);
p[2] = UInt8(i1);
#endif
p += 3;
}
RESTORE_ROUNDMODE
}
void NativeInt24ToFloat32_Portable( const UInt8 *vsrc, Float32 *dest, unsigned int count )
{
const UInt32 *src = (const UInt32 *)vsrc;
Float32 scale = (1. / 2147483648.0);
int nSamples4 = count >> 2;
while (nSamples4--) {
SInt32 lv1 = src[0]; SInt32 lv2 = src[1]; SInt32 lv3 = src[2]; SInt32 lv4;
#if TARGET_RT_BIG_ENDIAN
lv4 = lv3 << 8;
lv3 = (lv2 << 16) | ((lv3 & 0xFF000000) >> 16);
lv2 = (lv1 << 24) | ((lv2 & 0xFFFF0000) >> 8);
lv1 &= 0xFFFFFF00;
#else
lv4 = lv3 & 0xFFFFFF00;
lv3 = (lv3 << 24) | ((lv2 & 0xFFFF0000) >> 8);
lv2 = (lv2 << 16) | ((lv1 & 0xFF000000) >> 16);
lv1 = (lv1 << 8);
#endif
dest[0] = lv1 * scale;
dest[1] = lv2 * scale;
dest[2] = lv3 * scale;
dest[3] = lv4 * scale;
src += 3;
dest += 4;
}
int nSamples = count & 3;
UInt8 *p = (UInt8 *)src;
while (nSamples--) {
#if TARGET_RT_BIG_ENDIAN
SInt32 lv = (p[0] << 16) | (p[1] << 8) | p[2];
#else
SInt32 lv = p[0] | (p[1] << 8) | (p[2] << 16);
#endif
lv <<= 8;
p += 3;
*dest++ = lv * scale;
}
}
void SwapInt24ToFloat32_Portable( const UInt8 *vsrc, Float32 *dest, unsigned int count )
{
const UInt32 *src = (const UInt32 *)vsrc;
Float32 scale = (1. / 2147483648.0);
int nSamples4 = count >> 2;
while (nSamples4--) {
SInt32 lv1 = src[0]; SInt32 lv2 = src[1]; SInt32 lv3 = src[2]; SInt32 lv4;
#if TARGET_RT_BIG_ENDIAN
lv4 = (lv3 << 24)
| ((lv3 & 0x0000FF00) << 8)
| ((lv3 & 0x00FF0000) >> 8);
lv3 = (lv3 & 0xFF000000)
| ((lv2 & 0x000000FF) << 16)
| ((lv2 & 0x0000FF00));
lv2 = ((lv2 & 0x00FF0000) << 8)
| ((lv2 & 0xFF000000) >> 8)
| ((lv1 & 0x000000FF) << 8);
lv1 = ((lv1 & 0x0000FF00) << 16)
| (lv1 & 0x00FF0000)
| ((lv1 & 0xFF000000) >> 16);
#else
lv4 = ((lv3 & 0x0000FF00) << 16)
| (lv3 & 0x00FF0000)
| ((lv3 & 0xFF000000) >> 16);
lv3 = ((lv2 & 0x00FF0000) << 8)
| ((lv2 & 0xFF000000) >> 8)
| ((lv3 & 0x000000FF) << 8);
lv2 = (lv1 & 0xFF000000)
| ((lv2 & 0x000000FF) << 16)
| (lv2 & 0x0000FF00);
lv1 = (lv1 << 24)
| ((lv1 & 0x0000FF00) << 8)
| ((lv1 & 0x00FF0000) >> 8);
#endif
dest[0] = lv1 * scale;
dest[1] = lv2 * scale;
dest[2] = lv3 * scale;
dest[3] = lv4 * scale;
src += 3;
dest += 4;
}
int nSamples = count & 3;
UInt8 *p = (UInt8 *)src;
while (nSamples--) {
#if TARGET_RT_LITTLE_ENDIAN
SInt32 lv = (p[0] << 16) | (p[1] << 8) | p[2];
#else
SInt32 lv = p[0] | (p[1] << 8) | (p[2] << 16);
#endif
lv <<= 8;
p += 3;
*dest++ = lv * scale;
}
}