home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / cset21v6.zip / MMPM2TK / TK / ULIOT / IOSET.C < prev    next >
C/C++ Source or Header  |  1993-04-08  |  15KB  |  301 lines

  1. /*************************START OF SPECIFICATIONS *************************/
  2. /* SOURCE FILE NAME:  IOSET.C                                             */
  3. /*                                                                        */
  4. /* DESCRIPTIVE NAME: File Format IO Proc routine for MMIOM_SET            */
  5. /*                                                                        */
  6. /* COPYRIGHT:     IBM - International Business Machines                   */
  7. /*            Copyright (c) IBM Corporation  1991, 1992, 1993             */
  8. /*                        All Rights Reserved                             */
  9. /*                                                                        */
  10. /* STATUS: OS/2 Release 2.0                                               */
  11. /*                                                                        */
  12. /* FUNCTION: This source module contains the set functions.               */
  13. /* NOTES:                                                                 */
  14. /*    DEPENDENCIES: none                                                  */
  15. /*    RESTRICTIONS: Runs in 32 bit protect mode (OS/2 2.0)                */
  16. /*                                                                        */
  17. /* ENTRY POINTS:                                                          */
  18. /*              IOProcSet                                                 */
  19. /*                                                                        */
  20. /************************* END OF SPECIFICATIONS **************************/
  21.  
  22.  
  23. #include        <stdio.h>
  24. #include        <string.h>
  25. #include        <stdlib.h>
  26. #include        <memory.h>
  27.  
  28. #define         INCL_DOS                        /* #define  INCL_DOSPROCESS.*/
  29. #define         INCL_ERRORS
  30. #define         INCL_WIN
  31. #define         INCL_GPI
  32. #include        <os2.h>                         /* OS/2 headers.            */
  33. #include        <pmbitmap.h>
  34.  
  35. #define         INCL_OS2MM
  36. #define         INCL_MMIO_CODEC
  37. #define         INCL_MMIO_DOSIOPROC
  38.  
  39. #include        <os2me.h>                     /* Multi-Media IO extensions. */
  40. #include        <hhpheap.h>
  41. #include        <ioi.h>
  42.  
  43.  
  44. /************************** START OF SPECIFICATIONS *************************/
  45. /*                                                                          */
  46. /* SUBROUTINE NAME: IOProcSet                                               */
  47. /*                                                                          */
  48. /* DESCRIPTIVE NAME: Set various conditions in IO Proc                      */
  49. /*                                                                          */
  50. /* FUNCTION:                                                                */
  51. /*                                                                          */
  52. /* NOTES: None                                                              */
  53. /*                                                                          */
  54. /* ENTRY POINT: IOProcSet                                                   */
  55. /*   LINKAGE:   CALL FAR (00:32)                                            */
  56. /*                                                                          */
  57. /* INPUT:                                                                   */
  58. /*   PMMIOINFO             pmmioinfo          - ptr to instance structure.  */
  59. /*   LONG                  lParam1  - first parameter                       */
  60. /*   LONG                  lParam2  - Second parameter                      */
  61. /*                                                                          */
  62. /*                                                                          */
  63. /* EXIT-NORMAL:                                                             */
  64. /*              MMIO_SUCCESS                                                */
  65. /*                                                                          */
  66. /* EXIT-ERROR:                                                              */
  67. /*              MMIO_ERROR                                                  */
  68. /*                                                                          */
  69. /*                                                                          */
  70. /* SIDE EFFECTS:                                                            */
  71. /*                                                                          */
  72. /*************************** END OF SPECIFICATIONS **************************/
  73. LONG IOProcSet ( PMMIOINFO pmmioinfo,
  74.                  LONG lParam1,
  75.                  LONG lParam2 )
  76.  
  77. {
  78.    PINSTANCE       pinstance;
  79.    LONG            rc = MMIO_SUCCESS;
  80.    PMMEXTENDINFO   pmmextendinfo = (PMMEXTENDINFO)lParam1;
  81.    PCCB            pccb;
  82.    ULONG           ulCCBCount;
  83.    PCODECASSOC     pcodecassoc;
  84.    ULONG           ulSize;
  85.    PVOID           PtrNextAvail;
  86.  
  87.    if (rc = ioGetPtrInstance(pmmioinfo,&pinstance))
  88.       return(rc);
  89.  
  90.    switch(lParam2){
  91.       /*************************/
  92.       /* SET INFO              */
  93.       /*************************/
  94.       case MMIO_SET_EXTENDEDINFO:   /* Set extended information */
  95.          if (pmmextendinfo) {     /* error check */
  96.  
  97.             /********************/
  98.             /* Set active track */
  99.             /********************/
  100.             if (pmmextendinfo->ulFlags & MMIO_TRACK) {
  101.  
  102.                if (pmmextendinfo->ulTrackID == (ULONG)MMIO_RESETTRACKS) {
  103.                   pinstance->lCurrentTrack = pmmextendinfo->ulTrackID;
  104.                   }
  105.                else {
  106.                   if (pinstance->ulFlags & OPENED_READONLY) {
  107.                      if (ioFindTracki(pinstance,pmmextendinfo->ulTrackID)) {
  108.                         pinstance->lCurrentTrack = pmmextendinfo->ulTrackID;
  109.                         }
  110.                      else {
  111.                         pmmioinfo->ulErrorRet = MMIOERR_INVALID_PARAMETER;
  112.                         rc = MMIO_ERROR;
  113.                         break;
  114.                         }
  115.                      }
  116.  
  117.                   else if (pinstance->ulFlags &  
  118.                           (OPENED_READWRITE | OPENED_WRITECREATE)) {
  119.                      pinstance->lCurrentTrack = pmmextendinfo->ulTrackID;
  120.                      }
  121.  
  122.                   else {
  123.                      pmmioinfo->ulErrorRet = MMIOERR_INVALID_PARAMETER;
  124.                      rc = MMIO_ERROR;
  125.                      break;
  126.                      }
  127.                   } /* else */
  128.                }  /* MMIO_TRACK */
  129.  
  130.             /****************************************************************/
  131.             /* Reset all Non-normal reading modes.  All request audio and   */
  132.             /* video frames are returned.                                   */
  133.             /****************************************************************/
  134.             if (pmmextendinfo->ulFlags & MMIO_NORMAL_READ) {
  135.                pinstance->ulMode = MODE_NORMALREAD;
  136.                } /* MMIO_NORMAL_READ */
  137.  
  138.             /****************************************************************/
  139.             /* Set io proc into SCAN mode for the active track. Reading     */
  140.             /* will now be done, but only Key frames are returned for video */
  141.             /****************************************************************/
  142.             else if (pmmextendinfo->ulFlags & MMIO_SCAN_READ) {
  143.                pinstance->ulMode = MODE_SCANREAD;
  144.                } /* MMIO_SCAN_READ */
  145.  
  146.             /****************************************************************/
  147.             /* Set io proc into REVERSE mode for the active track. Reading  */
  148.             /* will now be done, but only Key frames are returned for video */
  149.             /****************************************************************/
  150.             else if (pmmextendinfo->ulFlags & MMIO_REVERSE_READ) {
  151.                pinstance->ulMode = MODE_REVERSEREAD;
  152.                } /* MMIO_REVERSE_READ */
  153.  
  154.             /****************************************************************/
  155.             /* Associate CODEC information for recording                    */
  156.             /****************************************************************/
  157.             if (pmmextendinfo->ulFlags & MMIO_CODEC_ASSOC) {
  158.  
  159.                /* Don't alow a CODEC association for read only files */
  160.                if (pinstance->ulFlags & OPENED_READONLY) {
  161.                   pmmioinfo->ulErrorRet = MMIOERR_INVALID_PARAMETER;
  162.                   rc = MMIO_ERROR;
  163.                   break;
  164.                   }
  165.  
  166.                /* Can only associate 1 CODEC for record */
  167.                if (pmmextendinfo->ulNumCODECs == 1) {
  168.                   if (rc = ioAssociateCodec(pmmioinfo,
  169.                                             pinstance,
  170.                                             pmmextendinfo->pCODECAssoc)) {
  171.                      pmmioinfo->ulErrorRet = rc;
  172.                      rc = MMIO_ERROR;
  173.                      }
  174.                   }
  175.                else {
  176.                   pmmioinfo->ulErrorRet = MMIOERR_INVALID_PARAMETER;
  177.                   rc = MMIO_ERROR;
  178.                   }
  179.                } /* MMIO_CODEC_ASSOC */
  180.             } /* pmmextendedinfo */
  181.  
  182.          else { /* error - data structure missing */
  183.             pmmioinfo->ulErrorRet = MMIOERR_INVALID_PARAMETER;
  184.             rc = MMIO_ERROR;
  185.             }
  186.          break;
  187.  
  188.       /********************************/
  189.       /* QUERY BASE AND CODEC INFO    */
  190.       /********************************/
  191.       case MMIO_QUERY_EXTENDEDINFO_ALL: /* Query Also CODEC associated info */
  192.  
  193.          /* Create the array of codecassoc structures to return to caller */
  194.          pcodecassoc = pmmextendinfo->pCODECAssoc;  /* Point to beginning */
  195.          for (pccb = pinstance->pccbList; pccb; pccb = pccb->pccbNext) {
  196.             pcodecassoc->pCodecOpen = NULL;
  197.             pcodecassoc->pCODECIniFileInfo = NULL;
  198.             pcodecassoc++;
  199.             }
  200.          PtrNextAvail = (PVOID)pcodecassoc;
  201.  
  202.          /* Fill in pointers to the CODECIniFileInfo structures to follow */
  203.          ulSize = 0L;
  204.          pcodecassoc = pmmextendinfo->pCODECAssoc;  /* Point to beginning */
  205.          for (pccb = pinstance->pccbList; pccb; pccb = pccb->pccbNext) {
  206.  
  207.             /* Create and copy CODECINIFILEINFO structure */
  208.             pcodecassoc->pCODECIniFileInfo = (PCODECINIFILEINFO)PtrNextAvail;
  209.             memcpy(pcodecassoc->pCODECIniFileInfo,&pccb->cifi,sizeof(CODECINIFILEINFO));
  210.             PtrNextAvail = (PVOID) (((ULONG)PtrNextAvail) + sizeof(CODECINIFILEINFO));
  211.  
  212.             /* Create and copy CODECOPEN structure */
  213.             pcodecassoc->pCodecOpen = PtrNextAvail;
  214.             memcpy(pcodecassoc->pCodecOpen,&pccb->codecopen,sizeof(CODECOPEN));
  215.             PtrNextAvail = (PVOID) (((ULONG)PtrNextAvail) + sizeof(CODECOPEN));
  216.  
  217.             /* Create and copy Pointers to structures in CODECOPEN structure */
  218.             if (pccb->codecopen.pControlHdr) {
  219.                ulSize = *((PULONG)pccb->codecopen.pControlHdr);
  220.                ((PCODECOPEN)pcodecassoc->pCodecOpen)->pControlHdr = (PVOID)PtrNextAvail;
  221.                memcpy(((PCODECOPEN)pcodecassoc->pCodecOpen)->pControlHdr,
  222.                       pccb->codecopen.pControlHdr,
  223.                       ulSize);
  224.                PtrNextAvail = (PVOID) (((ULONG)PtrNextAvail) + ulSize);
  225.                }
  226.  
  227.             if (pccb->codecopen.pSrcHdr) {
  228.                ulSize = *((PULONG)pccb->codecopen.pSrcHdr);
  229.                ((PCODECOPEN)pcodecassoc->pCodecOpen)->pSrcHdr = PtrNextAvail;
  230.                memcpy(((PCODECOPEN)pcodecassoc->pCodecOpen)->pSrcHdr,
  231.                       pccb->codecopen.pSrcHdr,
  232.                       ulSize);
  233.                PtrNextAvail = (PVOID) (((ULONG)PtrNextAvail) + ulSize);
  234.                }
  235.  
  236.             if (pccb->codecopen.pDstHdr) {
  237.                ulSize = *((PULONG)pccb->codecopen.pDstHdr);
  238.                ((PCODECOPEN)pcodecassoc->pCodecOpen)->pDstHdr = PtrNextAvail;
  239.                memcpy(((PCODECOPEN)pcodecassoc->pCodecOpen)->pDstHdr,
  240.                       pccb->codecopen.pDstHdr,
  241.                       ulSize);
  242.                PtrNextAvail = (PVOID) (((ULONG)PtrNextAvail) + ulSize);
  243.                }
  244.  
  245.             if (pccb->codecopen.pOtherInfo) {
  246.                ulSize = *((PULONG)pccb->codecopen.pOtherInfo);
  247.                ((PCODECOPEN)pcodecassoc->pCodecOpen)->pOtherInfo = PtrNextAvail;
  248.                memcpy(((PCODECOPEN)pcodecassoc->pCodecOpen)->pOtherInfo,
  249.                       pccb->codecopen.pOtherInfo,
  250.                       ulSize);
  251.                PtrNextAvail = (PVOID) (((ULONG)PtrNextAvail) + ulSize);
  252.                }
  253.             pcodecassoc++;
  254.             }
  255.  
  256.       /*********************************************************/
  257.       /* QUERY BASE INFO  (NOTE:Fall thru from previous case!) */
  258.       /*********************************************************/
  259.       case MMIO_QUERY_EXTENDEDINFO_BASE: /* Query only MMEXTENDINFO info */
  260.          pmmextendinfo->ulStructLen = sizeof(MMEXTENDINFO);
  261.          pmmextendinfo->ulTrackID = (ULONG)pinstance->lCurrentTrack;
  262.          /* pmmextendinfo->pCODECAssoc = NULL;  */
  263.  
  264.          /* Compute ulBufSize for complete information return */
  265.          ulSize = 0L;
  266.          for (pccb = pinstance->pccbList, ulCCBCount = 0;  /* Count CCB's */
  267.               pccb;
  268.               ulCCBCount++, pccb = pccb->pccbNext) {
  269.             ulSize += sizeof(CODECASSOC)+sizeof(CODECOPEN)+sizeof(CODECINIFILEINFO); /* static stuff */
  270.  
  271.             /* extract ulStructLen as first field of structure that ptr points to */
  272.             if (pccb->codecopen.pControlHdr) {
  273.                ulSize += *((PULONG)pccb->codecopen.pControlHdr);
  274.                }
  275.             if (pccb->codecopen.pSrcHdr) {
  276.                ulSize += *((PULONG)pccb->codecopen.pSrcHdr);
  277.                }
  278.             if (pccb->codecopen.pDstHdr) {
  279.                ulSize += *((PULONG)pccb->codecopen.pDstHdr);
  280.                }
  281.             if (pccb->codecopen.pOtherInfo) {
  282.                ulSize += *((PULONG)pccb->codecopen.pOtherInfo);
  283.                }
  284.             }
  285.  
  286.          pmmextendinfo->ulNumCODECs = ulCCBCount;
  287.          pmmextendinfo->ulBufSize = ulSize;
  288.          break;
  289.  
  290.       /*********/
  291.       /* ERROR */
  292.       /*********/
  293.       default:
  294.          pmmioinfo->ulErrorRet = MMIOERR_INVALID_PARAMETER;
  295.          rc = MMIO_ERROR;
  296.          break;
  297.       }/* end switch */
  298.  
  299.    return(rc);
  300. }
  301.