The following example illustrates how to associate a CODEC procedure with a file (track).
LONG ioAssociateCodec ( PMMIOINFO pmmioinfo,
PINSTANCE pinstance,
PCODECASSOC pcodecassoc )
{
LONG rc = MMIO_SUCCESS; /* Return code of IOProc's call.*/
PCCB pccb;
ULONG hCodec; /* Possibly returned from ioLoadCodecDLL */
/* Check for NULL pointers */
if (!pcodecassoc->pCodecOpen || !pcodecassoc->pCODECIniFileInfo) {
return (MMIOERR_INVALID_PARAMETER);
}
/* Force the correct values into the CODECINIFILEINFO structure */
pcodecassoc->pCODECIniFileInfo->ulStructLen = sizeof(CODECINIFILEINFO);
pcodecassoc->pCODECIniFileInfo->fcc = pmmioinfo->fccIOProc;
pcodecassoc->pCODECIniFileInfo->ulCapsFlags |= CODEC_COMPRESS;
/* Find the codec to load */
if (rc = ioDetermineCodec(pinstance, 0, pcodecassoc->pCODECIniFileInfo))
{
return(rc); /* return error */
}
else { /* load and open the compression CODEC */
/***********************************************/
/* Check for previously installed CODECs. */
/* De-install any loaded. Load new one. */
/* Allows only 1 CODEC to be loaded at a time. */
/***********************************************/
if (pinstance->pccbList) {
pccb = pinstance->pccbList;
pinstance->pccbList = pccb->pccbNext; /* unlink from list */
ioCloseCodec(pccb);
}
/* Load the CODEC DLL */
if (pccb = ioLoadCodecDLL(pinstance,
pcodecassoc->pCODECIniFileInfo,
&hCodec)) {
/* Save the CODEC open information in the ccb */
((PCODECOPEN)pcodecassoc->pCodecOpen)->ulFlags |= CODEC_COMPRESS;
/* Force open of compressor */
if (!(rc = ioInitCodecopen(pccb,(PCODECOPEN)pcodecassoc->
pCodecOpen))) {
/* Open the CODEC */
if (!(rc = pccb->pmmioproc(&hCodec,
MMIOM_CODEC_OPEN,
(LONG)&pccb->codecopen,
0L))) {
pccb->hCodec = hCodec; /* save handle to CODEC */
}
}
/* handle error conditions */
if (rc) {
pinstance->pccbList = pccb->pccbNext; /* unlink from list */
ioCloseCodec(pccb);
}
}
else {
rc = MMIO_ERROR;
}
}
return(rc);
}