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
Databases for Amazon shops developers
Amazon Categories Database
Browse Nodes Database