using NAudio.Dmo; using NAudio.Wave; namespace ytLive.Services.Audio; /// /// 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. /// 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; } }