Example of Writing Waveform Data

The following example illustrates the steps required to allocate and set up a WAVEHDR structure and write a block of data to a waveform output device.

// Global variables.

HANDLE hData = NULL; // handle of waveform data memory

HPSTR lpData = NULL; // pointer to waveform data memory

  • oid WriteWaveData(void)

{

HWAVEOUT hWaveOut;

HGLOBAL hWaveHdr;

LPWAVEHDR lpWaveHdr;

HMMIO hmmio;

UINT wResult;

HANDLE hFormat;

WAVEFORMAT *pFormat;

DWORD dwDataSize;

// Open a waveform device for output using window callback.

if (waveOutOpen((LPHWAVEOUT)&hWaveOut, WAVE_MAPPER,

(LPWAVEFORMAT)pFormat,

(LONG)hwndApp, 0L, CALLBACK_WINDOW))

{

MessageBox(hwndApp,

"Failed to open waveform output device.",

NULL, MB_OK | MB_ICONEXCLAMATION);

LocalUnlock(hFormat);

LocalFree(hFormat);

mmioClose(hmmio, 0);

return;

}

// Allocate and lock memory for the waveform data.

hData = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, dwDataSize );

if (!hData)

{

MessageBox(hwndApp, "Out of memory.",

NULL, MB_OK | MB_ICONEXCLAMATION);

mmioClose(hmmio, 0);

return;

}

if ((lpData = GlobalLock(hData)) == NULL)

{

MessageBox(hwndApp, "Failed to lock memory for data chunk.",

NULL, MB_OK | MB_ICONEXCLAMATION);

GlobalFree(hData);

mmioClose(hmmio, 0);

return;

}

// Read the waveform data subchunk.

if(mmioRead(hmmio, (HPSTR) lpData, dwDataSize) != (LRESULT)dwDataSize)

{

MessageBox(hwndApp, "Failed to read data chunk.",

NULL, MB_OK | MB_ICONEXCLAMATION);

GlobalUnlock(hData);

GlobalFree(hData);

mmioClose(hmmio, 0);

return;

}

// Allocate and lock memory for the header.

hWaveHdr = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE,

(DWORD) sizeof(WAVEHDR));

if (hWaveHdr == NULL)

{

GlobalUnlock(hData);

GlobalFree(hData);

MessageBox(hwndApp, "Not enough memory for header.",

NULL, MB_OK | MB_ICONEXCLAMATION);

return;

}

lpWaveHdr = (LPWAVEHDR) GlobalLock(hWaveHdr);

if (lpWaveHdr == NULL)

{

GlobalUnlock(hData);

GlobalFree(hData);

MessageBox(hwndApp,

"Failed to lock memory for header.",

NULL, MB_OK | MB_ICONEXCLAMATION);

return;

}

// After allocation, set up and prepare header.

lpWaveHdr->lpData = lpData;

lpWaveHdr->dwBufferLength = dwDataSize;

lpWaveHdr->dwFlags = 0L;

lpWaveHdr->dwLoops = 0L;

waveOutPrepareHeader(hWaveOut, lpWaveHdr, sizeof(WAVEHDR));

// Now the data block can be sent to the output device. The

// waveOutWrite function returns immediately and waveform

// data is sent to the output device in the background.

wResult = waveOutWrite(hWaveOut, lpWaveHdr, sizeof(WAVEHDR));

if (wResult != 0)

{

waveOutUnprepareHeader(hWaveOut, lpWaveHdr,

sizeof(WAVEHDR));

GlobalUnlock( hData);

GlobalFree(hData);

MessageBox(hwndApp, "Failed to write block to device",

NULL, MB_OK | MB_ICONEXCLAMATION);

return;

}

}

Software for developers
Delphi Components
.Net Components
Software for Android Developers
More information resources
MegaDetailed.Net
Unix Manual Pages
Delphi Examples