public async Task PlayWave(RiffCodec riff) { uint WAVE_MAPPER = uint.MaxValue; int CALLBACK_NULL = 0; IntPtr handle = IntPtr.Zero; var header = riff.FormatHeader as WaveFormatHeader; int duration = Convert.ToInt32(header.AvgBytesPerSec / header.SampleRate); var waveFormat = new WAVEFORMAT { wFormatTag = header.FormatTag, nChannels = header.ChannelsCount, nSamplesPerSec = header.SampleRate, nAvgBytesPerSec = header.AvgBytesPerSec, nBlockAlign = header.BlockAlign, wBitsPerSample = header.BitsPerSample, cbSize = header.ExtraInfoSize }; var waveHdr = new WAVEHDR { dwBufferLength = riff.DataSize, dwBytesRecorded = riff.DataSize, dwUser = 0, dwFlags = 0, dwLoops = 0 }; using var buffer = new UnamanagedMemory((int)riff.DataSize); Marshal.Copy(riff.Data, 0, buffer.Pointer, riff.Data.Length); waveHdr.lpData = buffer.Pointer; uint res = uint.MaxValue; res = WindowsMultimedia.waveOutOpen(ref handle, WAVE_MAPPER, ref waveFormat, 0, 0, CALLBACK_NULL); CheckMethodResult(nameof(WindowsMultimedia.waveOutOpen), res); res = WindowsMultimedia.waveOutPrepareHeader(handle, ref waveHdr, Marshal.SizeOf(waveHdr)); CheckMethodResult(nameof(WindowsMultimedia.waveOutPrepareHeader), res); res = WindowsMultimedia.waveOutWrite(handle, ref waveHdr, Marshal.SizeOf(waveHdr)); CheckMethodResult(nameof(WindowsMultimedia.waveOutWrite), res); await Task.Delay(duration * 1000); res = WindowsMultimedia.waveOutClose(handle); CheckMethodResult(nameof(WindowsMultimedia.waveOutClose), res); }
public static extern int waveOutOpen(ref IntPtr t, uint id, ref WAVEFORMAT pwfx, IntPtr dwCallback, int dwInstance, int fdwOpen);
public static extern int waveInOpen(out IntPtr phwi, int uDeviceID, WAVEFORMAT lpFormat, int dwCallback, int dwInstance, int dwFlags);
public static extern int waveOutOpen( ref int lphWaveOut, int uDeviceID, ref WAVEFORMAT lpFormat, int dwCallback, int dwInstance, int dwFlags );
public static extern int mmioRead(IntPtr hmmio, ref WAVEFORMAT pch, int cch);
public static extern uint waveOutOpen(ref IntPtr phwo, uint uDeviceID, ref WAVEFORMAT pwfx, int dwCallback, int dwInstance, int fdwOpen);