41 lines
1.2 KiB
C#
41 lines
1.2 KiB
C#
|
using System;
|
|||
|
using System.IO;
|
|||
|
|
|||
|
// This file is part of the ANX.Framework and originally taken from
|
|||
|
// the AC.AL OpenAL library, released under the MIT License.
|
|||
|
// For details see: http://acal.codeplex.com/license
|
|||
|
|
|||
|
namespace WaveUtils
|
|||
|
{
|
|||
|
public static class IEEEFloat
|
|||
|
{
|
|||
|
public static void ConvertToPcm(WaveInfo data, int resultChannelCount)
|
|||
|
{
|
|||
|
bool is64BitFloat = data.BitsPerSample == 64;
|
|||
|
|
|||
|
using (BinaryReader sourceReader = new BinaryReader(new MemoryStream(data.Data)))
|
|||
|
{
|
|||
|
MemoryStream destStream = new MemoryStream();
|
|||
|
BinaryWriter destWriter = new BinaryWriter(destStream);
|
|||
|
|
|||
|
int length = data.Data.Length / (is64BitFloat ? 8 : 4);
|
|||
|
|
|||
|
int increment = 1;
|
|||
|
if (data.Channels == 2 && resultChannelCount == 1)
|
|||
|
increment = 2;
|
|||
|
|
|||
|
data.Channels = resultChannelCount;
|
|||
|
data.ALFormat = data.Channels == 1 ? ALFormat.Mono16 : ALFormat.Stereo16;
|
|||
|
|
|||
|
for (int index = 0; index < length; index += increment)
|
|||
|
{
|
|||
|
double value = is64BitFloat ? sourceReader.ReadDouble() : sourceReader.ReadSingle();
|
|||
|
destWriter.Write((short)(value * 32767));
|
|||
|
}
|
|||
|
|
|||
|
data.Data = destStream.ToArray();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|