Index   Commented   Search   About

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;

}

}

Related Links

Software for Delphi and C++ Builder developers
Software for Visual Studio .NET developers
Software for Visual Basic 6 developers
Delphi Tips&Tricks
MegaDetailed.NET
TMS Scripter Studio Pro components for Delphi/C++Builder

More Online Helps

Win32 Programmer's Reference (win32.hlp)
OLE Programmer's Reference (ole.hlp)
Microsoft Windows Pen API Programmer's Reference (penapi.hlp)
Microsoft Windows Sockets 2 Reference (sock2.hlp)
Microsoft Windows Telephony API (TAPI) Programmer's Reference (tapi.hlp)
Unix Manual Pages

Free Tech Secrets ;) Copyright © 2008 Free Tect Secrets ;) greatis just4fun network just4fun