Performing File I/O on RIFF Files

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.

  • oid 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.

.

.

.

}

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