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); }