Hello
Here is code I wrote long ago using C, you can convert it to C# easily
using interop
WAVEFORMATEX waveFormat;
ZeroMemory(&waveFormat, sizeof(waveFormat));
waveFormat.cbSize = sizeof(waveFormat);
waveFormat.wFormatTag = WAVE_FORMAT_PCM;
waveFormat.nChannels = 1;
waveFormat.nSamplesPerSec = 44100;
waveFormat.wBitsPerSample = 16;
waveFormat.nBlockAlign = waveFormat.nChannels * waveFormat.wBitsPerSample /
8;
waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec *
waveFormat.nBlockAlign;
float frequency = 100;
UINT ndevices = waveOutGetNumDevs();
HWAVEOUT waveOut = NULL;
MMRESULT openRes = waveOutOpen(&waveOut, WAVE_MAPPER, &waveFormat, 0, 0,
CALLBACK_NULL | WAVE_FORMAT_DIRECT);
if(openRes == MMSYSERR_NOERROR)
{
WAVEHDR hdr;
ZeroMemory(&hdr, sizeof(hdr));
unsigned short *data = new unsigned short[waveFormat.nSamplesPerSec];
if(data != NULL)
{
for(int i = 0; i < (int)waveFormat.nSamplesPerSec; i++)
{
data = (unsigned short)(65535.0f * sin(frequency * (float)i /
(float)waveFormat.nSamplesPerSec));
}
hdr.dwBufferLength = sizeof(unsigned short) * waveFormat.nSamplesPerSec;
hdr.lpData = (LPSTR)data;
hdr.dwLoops = 5;
MMRESULT prepareRes = waveOutPrepareHeader(waveOut, &hdr, sizeof(hdr));
hdr.dwFlags |= WHDR_BEGINLOOP | WHDR_ENDLOOP;
if(prepareRes == MMSYSERR_NOERROR)
{
MMRESULT playRes = waveOutWrite(waveOut, &hdr, sizeof(hdr));
if(playRes == MMSYSERR_NOERROR)
{
while(waveOutUnprepareHeader(waveOut, &hdr, sizeof(hdr)) ==
WAVERR_STILLPLAYING)
{
Sleep(100);
}
}
}
delete[] data;
}
}