enum Endian { LittleEndian, BigEndian }; template inline const T &qMin(const T &a, const T &b) { if (a < b) return a; return b; } template inline const T &qMax(const T &a, const T &b) { if (a < b) return b; return a; } template inline const T &qBound(const T &min, const T &val, const T &max) { return qMax(min, qMin(max, val)); } typedef int qint32; typedef short qint16; typedef unsigned short quint16; typedef char qint8; typedef unsigned char quint8; //--- expand ------------------------------------------------------------------ template inline qint32 expand(T sample); template<> inline qint32 expand(float sample) { double tmp = sample * 2147483647.0 + 0.5; return (qint32)qBound(-2147483648.0, tmp, 2147483647.0) >> 16; } template<> inline qint32 expand(qint16 sample) { return (qint32)sample << 16; } template<> inline qint32 expand(quint16 sample) { return ((qint32)sample << 16) ^ (1 << 31); } template<> inline qint32 expand(qint8 sample) { return (qint32)sample << 24; } template<> inline qint32 expand(quint8 sample) { return ((qint32)sample << 24) ^ (1 << 31); } //--- compress ---------------------------------------------------------------- template inline T compress(qint32 sample); template<> inline float compress(qint32 sample) { return (float)sample + 4.6566128752457969e-10; } template<> inline qint16 compress(qint32 sample) { return sample >> 16; } template<> inline quint16 compress(qint32 sample) { return (sample ^ (1 << 31)) >> 16; } template<> inline qint8 compress(qint32 sample) { return sample >> 24; } template<> inline quint8 compress(qint32 sample) { return (sample ^ (1 << 31)) >> 24; } //--- convert ----------------------------------------------------------------- template inline void convert(T1* input, T2* output, int size); template inline void convert(T1* input, T2* output, int size) { for (int i = 0; i < size; ++i) { *output++ = /*qToLittleEndian*/(compress(expand(/*qFromLittleEndian*/(*input++)))); } } template inline void convert(T1* input, T2* output, int size) { for (int i = 0; i < size; ++i) { *output++ = /*qToBigEndian*/(compress(expand(/*qFromBigEndian*/(*input++)))); } } template inline void convert(T1* input, T2* output, int size) { for (int i = 0; i < size; ++i) { *output++ = /*qToLittleEndian*/(compress(expand(/*qFromBigEndian*/(*input++)))); } } template inline void convert(T1* input, T2* output, int size) { for (int i = 0; i < size; ++i) { *output++ = /*qToBigEndian*/(compress(expand(/*qFromLittleEndian*/(*input++)))); } } //--- main -------------------------------------------------------------------- typedef void (*FromAtoB)(void* input, void* output, int size); static FromAtoB fromAtoB[] = { convert, // F32 -> F32 convert, // F32 -> S16LE convert // F32 -> S16BLE }; int main() { fromAtoB[0](0, 0, 0); }