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; } } }