private double NextDouble(BinaryReader rdr)
{
double val = 0;
if (_bigEndian)
{
// For now only handle 16-bit big-endian data
if (_bitsPerSample == 16)
{
short beword = rdr.ReadInt16();
beword = System.Net.IPAddress.NetworkToHostOrder(beword);
val = ((double)beword * _scale16);
}
}
else
{
switch (_bitsPerSample)
{
case 16:
val = ((double)rdr.ReadInt16() * _scale16);
break;
case 8:
val = ((double)rdr.ReadByte() - 128) * _scale8; // 8-bit PCM uses unsigned bytes
break;
case 24:
// Little-endian, signed 24-bit
int a = (int)rdr.ReadUInt16();
int b = (int)rdr.ReadSByte();
int c = (b << 16) + a;
val = ((double)c) * _scale24;
break;
case 32:
if (_audioFormat == WaveFormat.IEEE_FLOAT)
{
val = (double)rdr.ReadSingle();
}
else
{
val = ((double)rdr.ReadInt32()) * _scale32;
}
break;
case 64:
if ((_audioFormat == WaveFormat.IEEE_FLOAT) || (_audioFormat == WaveFormat.INTERNAL_DOUBLE))
{
val = rdr.ReadDouble();
}
else
{
// throw new Exception("64-bit PCM not handled");
val = 0;
}
break;
}
}
return val;
}