added support for 24 and 32 bit signed PCM

This commit is contained in:
Ahmet Inan 2018-03-11 16:38:27 +01:00
commit 7e437b2fc9

30
wav.hh
View file

@ -25,6 +25,8 @@ class ReadWAV : public ReadPCM<TYPE>
v |= is.get() << (8 * i);
if (b == 2 && v > 32767)
v |= ~32767;
if (b == 3 && v > 8388607)
v |= ~8388607;
return v;
}
bool cmp4(const char *a, const char *b)
@ -61,7 +63,7 @@ public:
int ByteRate = readLE(4);
int BlockAlign = readLE(2);
bits = readLE(2);
if (bits != 8 && bits != 16)
if (bits != 8 && bits != 16 && bits != 24 && bits != 32)
return;
bytes = bits / 8;
if (bytes * channels != BlockAlign)
@ -85,6 +87,14 @@ public:
offset = 0;
factor = 32767;
break;
case 24:
offset = 0;
factor = 8388607;
break;
case 32:
offset = 0;
factor = 2147483647;
break;
default:
return;
}
@ -120,6 +130,24 @@ public:
min = 0;
max = 255;
break;
case 16:
offset = 0;
factor = 32767;
min = -32768;
max = 32767;
break;
case 24:
offset = 0;
factor = 8388607;
min = -8388608;
max = 8388607;
break;
case 32:
offset = 0;
factor = 2147483647;
min = -2147483648;
max = 2147483647;
break;
default:
bits = 16;
bytes = 2;