#include "wav_convert.h" typedef union wav_u { uint8_t u8[4]; uint16_t u16[2]; uint32_t u32; } wav_u; uint32_t endian_swap32(uint32_t in) { wav_u un; uint8_t u8[4]; un.u32 = in; for (int i = 0; i < 4; ++i) { u8[i] = un.u8[3 - i]; } for (int i = 0; i < 4; ++i) { un.u8[i] = u8[i]; } return un.u32; } uint16_t endian_swap16(uint16_t in) { wav_u un; uint8_t u8[2]; un.u16[0] = in; for (int i = 0; i < 2; ++i) { u8[i] = un.u8[1 - i]; } for (int i = 0; i < 2; ++i) { un.u8[i] = u8[i]; } return un.u16[0]; } void wavtoh32(uint8_t* in, uint32_t* out, uint8_t is_be) { wav_u un; for (int i = 0; i < 4; ++i) { un.u8[i] = in[i]; } if (0 == is_be) { *out = un.u32; } else { *out = endian_swap32(un.u32); } } void wavtoh24(uint8_t* in, uint32_t* out, uint8_t is_be) { wav_u un; int adjust; if (0 == is_be) { adjust = 0; un.u8[3] = 0; } else { adjust = 1; un.u8[0] = 0; } for (int i = 0; i < 3; ++i) { un.u8[i + adjust] = in[i]; } if (0 == is_be) { *out = un.u32; } else { *out = endian_swap32(un.u32); } } void wavtoh16(uint8_t* in, uint16_t* out, uint8_t is_be) { wav_u un; for (int i = 0; i < 2; ++i) { un.u8[i] = in[i]; } if (0 == is_be) { *out = un.u16[0]; } else { *out = endian_swap16(un.u16[0]); } } void htowav32(uint32_t* in, uint8_t* out, uint8_t is_be) { wav_u un; if (0 == is_be) { un.u32 = *in; } else { un.u32 = endian_swap32(*in); } for (int i = 0; i < 4; ++i) { out[i] = un.u8[i]; } } void htowav24(uint32_t* in, uint8_t* out, uint8_t is_be) { wav_u un; if (0 == is_be) { un.u32 = *in; } else { un.u32 = endian_swap32(*in); } for (int i = 0; i < 4; ++i) { out[i] = un.u8[i]; } } void htowav16(uint16_t* in, uint8_t* out, uint8_t is_be) { wav_u un; if (0 == is_be) { un.u16[0] = *in; } else { un.u16[0] = endian_swap16(*in); } for (int i = 0; i < 2; ++i) { out[i] = un.u8[i]; } }