TCHAR* DrumFileRead(DRUM* pdrum, TCHAR* szFileName)
{
DRUM drum;
HMMIO hmmio;
int i, iFormat;
MMCKINFO[3] mmckinfo;
// Open the file
hmmio = mmioOpen(szFileName, NULL, MMIO_READ);
if (hmmio == NULL)
return szErrorNotFound;
// Locate a "RIFF" chunk with a "DRUM" form-type
mmckinfo[0].ckid = mmioStringToFOURCC(szDrumID, 0);
if (mmioDescend(hmmio, &mmckinfo[0], NULL, MMIO_FINDRIFF))
{
mmioClose(hmmio, 0);
return szErrorNotDrum;
}
// Locate, read, and verify the "fmt " sub-chunk
mmckinfo[1].ckid = mmioStringToFOURCC(szFmtID, 0);
if (mmioDescend(hmmio, &mmckinfo[1], &mmckinfo[0], MMIO_FINDCHUNK))
{
mmioClose(hmmio, 0);
return szErrorNotDrum;
}
if (mmckinfo[1].cksize != int.sizeof)
{
mmioClose(hmmio, 0);
return szErrorUnsupported;
}
if (mmioRead(hmmio, cast(PSTR)&iFormat, int.sizeof) != int.sizeof)
{
mmioClose(hmmio, 0);
return szErrorCannotRead;
}
if (iFormat != 1 && iFormat != 2)
{
mmioClose(hmmio, 0);
return szErrorUnsupported;
}
// Go to end of "fmt " sub-chunk
mmioAscend(hmmio, &mmckinfo[1], 0);
// Locate, read, and verify the "data" sub-chunk
mmckinfo[1].ckid = mmioStringToFOURCC(szDataID, 0);
writeln((cast(char*)&mmckinfo[1].ckid)[0..4]);
if (mmioDescend(hmmio, &mmckinfo[1], &mmckinfo[0], MMIO_FINDCHUNK))
{
mmioClose(hmmio, 0);
return szErrorNotDrum;
}
if (mmckinfo[1].cksize != DRUM.sizeof)
{
mmioClose(hmmio, 0);
return szErrorUnsupported;
}
if (mmioRead(hmmio, cast(LPSTR)&drum, DRUM.sizeof != DRUM.sizeof))
{
mmioClose(hmmio, 0);
return szErrorCannotRead;
}
// Close the file
mmioClose(hmmio, 0);
// Convert format 1 to format 2 and copy the DRUM structure data
if (iFormat == 1)
{
for (i = 0; i < NUM_PERC; i++)
{
drum.dwSeqPerc [i] = drum.dwSeqPian [i];
drum.dwSeqPian [i] = 0;
}
}
*pdrum = drum;
return NULL;
}