42 lines
1.5 KiB
C#
42 lines
1.5 KiB
C#
using NAudio.Dmo;
|
|
using NAudio.Wave;
|
|
|
|
namespace ytLive.Services.Audio;
|
|
|
|
/// <summary>
|
|
/// Converts NAudio's raw WASAPI capture buffers (byte[], whatever bit depth the
|
|
/// device's mix format reports) into interleaved PCM float samples. Pure —
|
|
/// unit-tested; the two WASAPI sources share it.
|
|
/// </summary>
|
|
public static class WaveToFloat
|
|
{
|
|
public static float[] Convert(byte[] buffer, int bytesRecorded, WaveFormat format)
|
|
{
|
|
if (format.Encoding == WaveFormatEncoding.IeeeFloat && format.BitsPerSample == 32)
|
|
return ConvertIeeeFloat(buffer, bytesRecorded);
|
|
if (format.Encoding == WaveFormatEncoding.Pcm && format.BitsPerSample == 16)
|
|
return ConvertPcm16(buffer, bytesRecorded);
|
|
if (format is WaveFormatExtensible extensible
|
|
&& extensible.SubFormat == AudioMediaSubtypes.MEDIASUBTYPE_IEEE_FLOAT)
|
|
return ConvertIeeeFloat(buffer, bytesRecorded);
|
|
return ConvertPcm16(buffer, bytesRecorded);
|
|
}
|
|
|
|
private static float[] ConvertIeeeFloat(byte[] buffer, int bytesRecorded)
|
|
{
|
|
var count = bytesRecorded / 4;
|
|
var result = new float[count];
|
|
Buffer.BlockCopy(buffer, 0, result, 0, count * 4);
|
|
return result;
|
|
}
|
|
|
|
private static float[] ConvertPcm16(byte[] buffer, int bytesRecorded)
|
|
{
|
|
var count = bytesRecorded / 2;
|
|
var result = new float[count];
|
|
for (var i = 0; i < count; i++)
|
|
result[i] = BitConverter.ToInt16(buffer, i * 2) / 32768f;
|
|
return result;
|
|
}
|
|
}
|