168 lines
2.1 KiB
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];
|
|
}
|
|
}
|