apex-mix/wav_convert.c

168 lines
2.1 KiB
C

#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];
}
}