Fixed mixer to work with PCM WAVs. Outputs are still IEEE 32-bit floats
This commit is contained in:
parent
e6e9744529
commit
aed077749a
87
main.c
87
main.c
@ -242,7 +242,10 @@ void process_sample(FILE* in, FILE* out, wav_data* header, float volume)
|
|||||||
uint32_t u32;
|
uint32_t u32;
|
||||||
float f;
|
float f;
|
||||||
} un;
|
} un;
|
||||||
|
|
||||||
uint8_t u8[4];
|
uint8_t u8[4];
|
||||||
|
int16_t i16;
|
||||||
|
int32_t i32;
|
||||||
|
|
||||||
float src[8];
|
float src[8];
|
||||||
float dst[2];
|
float dst[2];
|
||||||
@ -252,11 +255,82 @@ void process_sample(FILE* in, FILE* out, wav_data* header, float volume)
|
|||||||
src[i] = 0;
|
src[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < header->channel_count; ++i)
|
if (3 == header->data_fmt)
|
||||||
{
|
{
|
||||||
fread(u8, sizeof(uint8_t), 4, in);
|
// Read float
|
||||||
wavtoh32(u8, &un.u32, header->is_be);
|
for (int i = 0; i < header->channel_count; ++i)
|
||||||
src[i] = un.f;
|
{
|
||||||
|
fread(u8, sizeof(uint8_t), 4, in);
|
||||||
|
wavtoh32(u8, &un.u32, header->is_be);
|
||||||
|
src[i] = un.f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Read PCM
|
||||||
|
for (int i = 0; i < header->channel_count; ++i)
|
||||||
|
{
|
||||||
|
fread(u8, sizeof(uint8_t), header->bits_per_sample/8, in);
|
||||||
|
switch (header->bits_per_sample)
|
||||||
|
{
|
||||||
|
// 8 bit is unsigned
|
||||||
|
case 8:
|
||||||
|
src[i] = u8[0];
|
||||||
|
src[i] -= 128;
|
||||||
|
if (src[i] < 0)
|
||||||
|
{
|
||||||
|
src[i] /= 128.0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
src[i] /= 127.0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 16:
|
||||||
|
wavtoh16(u8, (uint16_t*)&i16, header->is_be);
|
||||||
|
src[i] = i16;
|
||||||
|
if (src[i] < 0)
|
||||||
|
{
|
||||||
|
src[i] /= 32768.0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
src[i] /= 32767.0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 24:
|
||||||
|
wavtoh24(u8, (uint32_t*)&i32, header->is_be);
|
||||||
|
src[i] = i32;
|
||||||
|
if (src[i] < 0)
|
||||||
|
{
|
||||||
|
src[i] /= 8388608.0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
src[i] /= 8388607.0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 32:
|
||||||
|
wavtoh32(u8, (uint32_t*)&i32, header->is_be);
|
||||||
|
src[i] = i32;
|
||||||
|
if (src[i] < 0)
|
||||||
|
{
|
||||||
|
src[i] /= 2147483648.0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
src[i] /= 2147483647.0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
printf("BITS PER SAMPLE WTF - %u\n", header->bits_per_sample);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef LFE_ENABLE
|
#ifdef LFE_ENABLE
|
||||||
@ -320,7 +394,8 @@ int main(int argc, char** argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 1 is PCM, 3 is float
|
// 1 is PCM, 3 is float
|
||||||
if ((in_header.data_fmt != 3) || (in_header.bits_per_sample != 32) ||
|
if (((in_header.data_fmt != 3) && (in_header.data_fmt != 1)) ||
|
||||||
|
((in_header.bits_per_sample != 8) && (in_header.bits_per_sample != 16) && (in_header.bits_per_sample != 32)) ||
|
||||||
((in_header.channel_count != 8) && (in_header.channel_count != 2)))
|
((in_header.channel_count != 8) && (in_header.channel_count != 2)))
|
||||||
{
|
{
|
||||||
printf("Weird Header\n");
|
printf("Weird Header\n");
|
||||||
@ -348,6 +423,8 @@ int main(int argc, char** argv)
|
|||||||
|
|
||||||
out_header = in_header;
|
out_header = in_header;
|
||||||
out_header.channel_count = 2;
|
out_header.channel_count = 2;
|
||||||
|
out_header.data_fmt = 3;
|
||||||
|
out_header.bits_per_sample=32;
|
||||||
out_header.is_be = 0;
|
out_header.is_be = 0;
|
||||||
write_header(out_file, &out_header);
|
write_header(out_file, &out_header);
|
||||||
|
|
||||||
|
|||||||
@ -63,6 +63,37 @@ void wavtoh32(uint8_t* in, uint32_t* out, uint8_t is_be)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
void wavtoh16(uint8_t* in, uint16_t* out, uint8_t is_be)
|
||||||
{
|
{
|
||||||
wav_u un;
|
wav_u un;
|
||||||
@ -99,6 +130,24 @@ void htowav32(uint32_t* in, uint8_t* out, uint8_t is_be)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
void htowav16(uint16_t* in, uint8_t* out, uint8_t is_be)
|
||||||
{
|
{
|
||||||
wav_u un;
|
wav_u un;
|
||||||
|
|||||||
@ -4,9 +4,11 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
void wavtoh32(uint8_t* in, uint32_t* out, uint8_t is_be);
|
void wavtoh32(uint8_t* in, uint32_t* out, uint8_t is_be);
|
||||||
|
void wavtoh24(uint8_t* in, uint32_t* out, uint8_t is_be);
|
||||||
void wavtoh16(uint8_t* in, uint16_t* out, uint8_t is_be);
|
void wavtoh16(uint8_t* in, uint16_t* out, uint8_t is_be);
|
||||||
|
|
||||||
void htowav32(uint32_t* in, uint8_t* out, uint8_t is_be);
|
void htowav32(uint32_t* in, uint8_t* out, uint8_t is_be);
|
||||||
|
void htowav24(uint32_t* in, uint8_t* out, uint8_t is_be);
|
||||||
void htowav16(uint16_t* in, uint8_t* out, uint8_t is_be);
|
void htowav16(uint16_t* in, uint8_t* out, uint8_t is_be);
|
||||||
|
|
||||||
#endif // WAV_CONVERT_H_
|
#endif // WAV_CONVERT_H_
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user