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


[Back] [Next]