using System.Runtime.InteropServices;
namespace Susurrus.XAudio2
{
///
/// The WAVEFORMATEX that tells XAudio2 what a source voice's samples look like.
///
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct WaveFormatEx
{
public const ushort PcmTag = 1;
public const ushort FloatTag = 3;
public ushort FormatTag;
public ushort Channels;
public uint SamplesPerSecond;
public uint AverageBytesPerSecond;
public ushort BlockAlign;
public ushort BitsPerSample;
public ushort ExtraSize;
///
/// Returns the format of interleaved samples of .
///
public static WaveFormatEx Of(SampleFormat format, int channelCount, int sampleRate)
{
int bytesPerSample = DecodedSound.GetBytesPerSample(format);
WaveFormatEx returnMe = new WaveFormatEx();
returnMe.FormatTag = format == SampleFormat.Float32 ? FloatTag : PcmTag;
returnMe.Channels = (ushort)channelCount;
returnMe.SamplesPerSecond = (uint)sampleRate;
returnMe.BlockAlign = (ushort)(bytesPerSample * channelCount);
returnMe.AverageBytesPerSecond = (uint)(returnMe.BlockAlign * sampleRate);
returnMe.BitsPerSample = (ushort)(bytesPerSample * 8);
returnMe.ExtraSize = 0;
return returnMe;
}
}
}