Some low-level audio functions require applications to allocate data blocks to pass to the device drivers for playback or recording purposes. Each of these functions uses a data structure (or header) to describe its data block. The following table identifies these functions and their associated header structures (the MMSYSTEM.H file defines the data structures for these headers):
Function | Header | Purpose |
waveOutWrite | WAVEHDR | Waveform playback |
waveInAddBuffer | WAVEHDR | Waveform recording |
midiOutLongMsg | MIDIHDR | MIDI system-exclusive playback |
midiInAddBuffer | MIDIHDR | MIDI system-exclusive recording |
Before you use one of the functions listed above to pass a data block to a device driver, you must allocate memory for the data block according to the guidelines discussed in the following sections of this chapter.
Before preparing a data block, you must allocate memory for the data block and the header structure that describes the data block.
·To allocate memory:
1.Use GlobalAlloc with the GMEM_MOVEABLE and GMEM_SHARE flags to get a handle to the memory block.
2.Pass this handle to GlobalLock to get a pointer to the memory block.
To free a data block, use GlobalUnlock and GlobalFree.
Before you pass an audio data block to a device driver, you must prepare the data block by passing it to a . . . PrepareHeader function. When the device driver is finished with the data block and returns it, you must clean up this preparation by passing the data block to an . . . UnprepareHeader function before any allocated memory can be freed.
The Multimedia extensions provide the following functions for preparing and cleaning up audio data blocks:
midiInPrepareHeader
Prepares a MIDI input data block.
midiInUnprepareHeader
Cleans up the preparation on a MIDI input data block.
midiOutPrepareHeader
Prepares a MIDI output data block.
midiOutUnprepareHeader
Cleans up the preparation on a MIDI output data block.
waveInPrepareHeader
Prepares a waveform input data block.
waveInUnprepareHeader
Cleans up the preparation on a waveform input data block.
waveOutPrepareHeader
Prepares a waveform output data block.
waveOutUnprepareHeader
Cleans up the preparation on a waveform output data block.