The following example shows how to open a RIFF file for buffered I/O, as well as how to descend, ascend, and read "RIFF" chunks.
// ReversePlay--Plays a waveform-audio file backward.
void ReversePlay()
{
char szFileName[128]; // filename of file to open
HMMIO hmmio; // file handle for open file
MMCKINFO mmckinfoParent; // parent chunk information
MMCKINFO mmckinfoSubchunk; // subchunk information structure
DWORD dwFmtSize; // size of "FMT" chunk
DWORD dwDataSize; // size of "DATA" chunk
WAVEFORMAT *pFormat; // address of "FMT" chunk
HPSTR lpData; // address of "DATA" chunk
// Get the filename from the edit control.
.
.
.
// Open the file for reading with buffered I/O
// by using the default internal buffer
if(!(hmmio = mmioOpen(szFileName, NULL,
MMIO_READ | MMIO_ALLOCBUF)))
{
Error("Failed to open file.");
return;
}
// Locate a "RIFF" chunk with a "WAVE" form type to make
// sure the file is a waveform-audio file.
mmckinfoParent.fccType = mmioFOURCC('W', 'A', 'V', 'E');
if (mmioDescend(hmmio, (LPMMCKINFO) &mmckinfoParent, NULL,
MMIO_FINDRIFF))
{
Error("This is not a waveform-audio file.");
mmioClose(hmmio, 0);
return;
}
// Find the "FMT" chunk (form type "FMT"); it must be
// a subchunk of the "RIFF" chunk.
mmckinfoSubchunk.ckid = mmioFOURCC('f', 'm', 't', ' ');
if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent,
MMIO_FINDCHUNK))
{
Error("Waveform-audio file has no "FMT" chunk.");
mmioClose(hmmio, 0);
return;
}
// Get the size of the "FMT" chunk. Allocate
// and lock memory for it.
dwFmtSize = mmckinfoSubchunk.cksize;
.
.
.
// Read the "FMT" chunk.
if (mmioRead(hmmio, (HPSTR) pFormat, dwFmtSize) != dwFmtSize){
Error("Failed to read format chunk.");
.
.
.
mmioClose(hmmio, 0);
return;
}
// Ascend out of the "FMT" subchunk.
mmioAscend(hmmio, &mmckinfoSubchunk 0);
// Find the data subchunk. The current file position should be at
// the beginning of the data chunk; however, you should not make
// this assumption. Use mmioDescend to locate the data chunk.
mmckinfoSubchunk.ckid = mmioFOURCC('d', 'a', 't', 'a');
if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent,
MMIO_FINDCHUNK))
{
Error("Waveform-audio file has no data chunk.");
.
.
.
mmioClose(hmmio, 0);
return;
}
// Get the size of the data subchunk.
dwDataSize = mmckinfoSubchunk.cksize;
if (dwDataSize == 0L){
Error("The data chunk contains no data.");
.
.
.
mmioClose(hmmio, 0);
return;
}
// Open a waveform-audio output device.
.
.
.
// Allocate and lock memory for the waveform-audio data.
.
.
.
// Read the waveform-audio data subchunk.
if(mmioRead(hmmio, (HPSTR) lpData, dwDataSize) != dwDataSize){
Error("Failed to read data chunk.");
.
.
.
mmioClose(hmmio, 0);
return;
}
// Close the file.
mmioClose(hmmio, 0);
// Reverse the sound and play it.
.
.
.
}