home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mmpm21tk.zip / TK / ADMCT / ADMCCONN.C < prev    next >
C/C++ Source or Header  |  1993-03-02  |  13KB  |  364 lines

  1. /********************* START OF SPECIFICATIONS *********************
  2. *
  3. * SUBROUTINE NAME: ADMCCONN.C
  4. *
  5. * DESCRIPTIVE NAME: Audio MCD Connector routine.
  6. *
  7. *              Copyright (c) IBM Corporation  1991, 1993
  8. *                        All Rights Reserved
  9. *
  10. *
  11. * FUNCTION:Enable, Disable and Query Connectors
  12. *
  13. * NOTES:
  14. *
  15. * ENTRY POINTS:
  16. *
  17. * INPUT: MCI_PLAY message.
  18. *
  19. * EXIT-NORMAL: Return Code 0.
  20. *
  21. * EXIT_ERROR:  Error Code.
  22. *
  23. * EFFECTS:
  24. *
  25. * INTERNAL REFERENCES:
  26. *
  27. * EXTERNAL REFERENCES:    mciSendCommand  ().
  28. *
  29. *********************** END OF SPECIFICATIONS **********************/
  30. #define INCL_BASE
  31. #define INCL_DOSMODULEMGR
  32. #define INCL_DOSSEMAPHORES
  33.  
  34. #include <os2.h>
  35. #include <string.h>
  36. #include <os2medef.h>                   // MME includes files.
  37. #include <audio.h>                      // Audio Device defines
  38. #include <ssm.h>                        // SSM spi includes.
  39. #include <meerror.h>                    // MM Error Messages.
  40. #include <mmioos2.h>                    // MMIO Include.
  41. #include <mcios2.h>                     // MM System Include.
  42. #include <mmdrvos2.h>                   // Mci Driver Include.
  43. #include <mcipriv.h>                    // MCI Connection stuff
  44. #include <mcd.h>                        // VSDIDriverInterface.
  45. #include <hhpheap.h>                    // Heap Manager Definitions
  46. #include <qos.h>
  47. #include <audiomcd.h>                   // Component Definitions.
  48. #include "admcfunc.h"                   // Function Prototypes
  49. #include <sw.h>
  50.  
  51.  
  52.  
  53.  
  54. /********************* START OF SPECIFICATIONS *********************
  55. *
  56. * SUBROUTINE NAME: MCICNCT.c
  57. *
  58. * DESCRIPTIVE NAME: Audio MCD Connections.
  59. *
  60. * FUNCTION:Process Connector Message.
  61. *
  62. * NOTES:
  63. *
  64. * ENTRY POINTS:
  65. *     LINKAGE:   CALL FAR
  66. *
  67. * INPUT: MCI_PLAY message.
  68. *
  69. * EXIT-NORMAL: Return Code 0.
  70. *
  71. * EXIT_ERROR:  Error Code.
  72. *
  73. * EFFECTS:
  74. *
  75. * INTERNAL REFERENCES:
  76. *                     DestroyStream(),
  77. *                     SetAmpDefaults(),
  78. *                     SetWaveDeviceDefaults().
  79. *
  80. * EXTERNAL REFERENCES:
  81. *
  82. *********************** END OF SPECIFICATIONS **********************/
  83. // This function has an absimal name--rename!!!!!
  84.  
  85. RC MCIConnector ( FUNCTION_PARM_BLOCK *pFuncBlock)
  86. {
  87.    ULONG            ulrc;              // RC
  88.    ULONG            ulParam1;          // Incoming MCI Flags
  89.    ULONG            ulConnectorType;   // Struct to hold connector flag
  90.    ULONG            ulHoldConFlag;     // flag to hold enable/disable etc.
  91.    ULONG            ulFlagCount;
  92.    INSTANCE *       ulpInstance;        // Local Instance
  93.  
  94.    PMCI_CONNECTOR_PARMS pConParms;   // MCI Msg Data
  95.  
  96.    ulpInstance = (INSTANCE *) pFuncBlock->ulpInstance;
  97.    ulParam1 = pFuncBlock->ulParam1;
  98.  
  99.    pConParms = (PMCI_CONNECTOR_PARMS) pFuncBlock->ulParam2;
  100.  
  101.  
  102.    /* Check for a valid connector pointer */
  103.  
  104.    ulrc = CheckMem ( (PVOID) pConParms,
  105.                      sizeof (MCI_CONNECTOR_PARMS),
  106.                      PAG_READ);
  107.  
  108.    if ( ulrc != MCIERR_SUCCESS )
  109.      {
  110.      return ( MCIERR_MISSING_PARAMETER );
  111.      }
  112.  
  113.    /* Remove excess flags */
  114.  
  115.    ulParam1 &= ~( MCI_NOTIFY + MCI_WAIT );
  116.  
  117.    /* Ensure a command flag was sent */
  118.  
  119.    if ( !ulParam1 )
  120.      {
  121.      return ( MCIERR_MISSING_FLAG );
  122.      }
  123.  
  124.    ulConnectorType = ( ulParam1 & MCI_CONNECTOR_TYPE ) ? 1 : 0;
  125.  
  126.    ulHoldConFlag = ulParam1 & ~( MCI_CONNECTOR_TYPE| MCI_CONNECTOR_INDEX);
  127.  
  128.    ulFlagCount = ( ulParam1 & MCI_ENABLE_CONNECTOR ) ? 1 : 0;
  129.    ulFlagCount += ( ulParam1 & MCI_DISABLE_CONNECTOR ) ? 1 : 0;
  130.    ulFlagCount += ( ulParam1 & MCI_QUERY_CONNECTOR_STATUS ) ? 1 : 0;
  131.  
  132.    if ( ulFlagCount > 1 )
  133.       return ( MCIERR_FLAGS_NOT_COMPATIBLE );
  134.  
  135.    /* if they want to set a type */
  136.  
  137.    if ( ulConnectorType )
  138.      {
  139.      // Investigate!!!!!!!!!
  140.      /* I am not sure that I should be checking indexes, the amp should */
  141.      // Investigate!!!!!!!!!!!!!!!
  142.  
  143.      if ( ulParam1 & MCI_CONNECTOR_INDEX && ( pConParms->ulConnectorIndex != 1) )
  144.               {
  145.           if ( pConParms->ulConnectorType != MCI_SPEAKERS_CONNECTOR )
  146.                  {
  147.          return ( MCIERR_INVALID_CONNECTOR_INDEX );
  148.         }
  149.            else
  150.          {
  151.          if ( pConParms->ulConnectorIndex != 2 )
  152.                     {
  153.             return ( MCIERR_INVALID_CONNECTOR_INDEX );
  154.                     }
  155.                  }
  156.               }
  157.  
  158.           if ( ulHoldConFlag & ~( MCI_ENABLE_CONNECTOR  |
  159.                                   MCI_DISABLE_CONNECTOR |
  160.                                   MCI_QUERY_CONNECTOR_STATUS ) )
  161.              {
  162.          return ( MCIERR_INVALID_FLAG );
  163.              }
  164.  
  165.          switch( ulHoldConFlag )
  166.                  {
  167.                  /*-------------------------------------------------------------*
  168.                  * Enable connector
  169.                  *-------------------------------------------------------------*/
  170.  
  171.                  case MCI_ENABLE_CONNECTOR:
  172.                switch( pConParms->ulConnectorType )
  173.                                {
  174.                    /*-----------------------------------------------------
  175.                    * since we know that we are connected to an amp/mixer
  176.                    * we can pass the command on
  177.                    *----------------------------------------------------*/
  178.                                case MCI_LINE_IN_CONNECTOR:
  179.                                case MCI_AUDIO_IN_CONNECTOR   :
  180.                                case MCI_MICROPHONE_CONNECTOR:
  181.                                case MCI_LINE_OUT_CONNECTOR:
  182.                                case MCI_AUDIO_OUT_CONNECTOR  :
  183.                                case MCI_SPEAKERS_CONNECTOR:
  184.                                case MCI_HEADPHONES_CONNECTOR:
  185.  
  186.                                   ulrc = mciSendCommand ( ulpInstance->usAmpDeviceID,
  187.                                                          (USHORT) MCI_CONNECTOR,
  188.                                                          ulParam1,
  189.                              (PVOID) pConParms,
  190.                                                          pFuncBlock->usUserParm );
  191.                                   break;
  192.                                case MCI_WAVE_STREAM_CONNECTOR:
  193.  
  194.                                   ulrc = MCIERR_CANNOT_MODIFY_CONNECTOR;
  195.                                   break;
  196.                                case MCI_MIDI_STREAM_CONNECTOR:
  197.                                case MCI_AMP_STREAM_CONNECTOR:
  198.                                case MCI_CD_STREAM_CONNECTOR  :
  199.                                case MCI_VIDEO_IN_CONNECTOR   :
  200.                                case MCI_VIDEO_OUT_CONNECTOR  :
  201.                                case MCI_PHONE_SET_CONNECTOR  :
  202.                                case MCI_PHONE_LINE_CONNECTOR :
  203.                                case MCI_UNIVERSAL_CONNECTOR  :
  204.  
  205.                                   ulrc = MCIERR_UNSUPPORTED_CONN_TYPE;
  206.                                   break;
  207.                                default:
  208.                                        ulrc = MCIERR_INVALID_CONNECTOR_TYPE;
  209.                                        break;
  210.                                }
  211.                        break;
  212.  
  213.                  /*-------------------------------------------------------------*
  214.                  * Disable connector
  215.                  *-------------------------------------------------------------*/
  216.  
  217.                  case MCI_DISABLE_CONNECTOR:
  218.                switch( pConParms->ulConnectorType )
  219.                                {
  220.                                case MCI_LINE_IN_CONNECTOR:
  221.                                case MCI_AUDIO_IN_CONNECTOR   :
  222.                                case MCI_MICROPHONE_CONNECTOR:
  223.                                case MCI_LINE_OUT_CONNECTOR:
  224.                                case MCI_AUDIO_OUT_CONNECTOR  :
  225.                                case MCI_SPEAKERS_CONNECTOR:
  226.                                case MCI_HEADPHONES_CONNECTOR:
  227.  
  228.                                   ulrc = mciSendCommand ( ulpInstance->usAmpDeviceID,
  229.                                                          (USHORT) MCI_CONNECTOR,
  230.                                                          ulParam1,
  231.                              (PVOID) pConParms,
  232.                                                          pFuncBlock->usUserParm );
  233.                                        break;
  234.                                case MCI_WAVE_STREAM_CONNECTOR:
  235.  
  236.                                   ulrc = MCIERR_CANNOT_MODIFY_CONNECTOR;
  237.                                   break;
  238.                                case MCI_MIDI_STREAM_CONNECTOR:
  239.                                case MCI_AMP_STREAM_CONNECTOR:
  240.                                case MCI_CD_STREAM_CONNECTOR  :
  241.                                case MCI_VIDEO_IN_CONNECTOR   :
  242.                                case MCI_VIDEO_OUT_CONNECTOR  :
  243.                                case MCI_PHONE_SET_CONNECTOR  :
  244.                                case MCI_PHONE_LINE_CONNECTOR :
  245.                                case MCI_UNIVERSAL_CONNECTOR  :
  246.  
  247.                                   ulrc = MCIERR_UNSUPPORTED_CONN_TYPE;
  248.                                   break;
  249.  
  250.                                default:
  251.                                        ulrc = MCIERR_INVALID_CONNECTOR_TYPE;
  252.                                        break;
  253.                                } /* switch the connector type */
  254.                        break;
  255.                  /*-------------------------------------------------------------*
  256.                  * QUERY connector
  257.                  *-------------------------------------------------------------*/
  258.  
  259.                  case MCI_QUERY_CONNECTOR_STATUS :
  260.                switch( pConParms->ulConnectorType )
  261.                                {
  262.                                case MCI_LINE_IN_CONNECTOR:
  263.                                case MCI_AUDIO_IN_CONNECTOR   :
  264.                                case MCI_MICROPHONE_CONNECTOR:
  265.                                case MCI_LINE_OUT_CONNECTOR:
  266.                                case MCI_AUDIO_OUT_CONNECTOR  :
  267.                                case MCI_SPEAKERS_CONNECTOR:
  268.                                case MCI_HEADPHONES_CONNECTOR:
  269.  
  270.                                   ulrc = mciSendCommand ( ulpInstance->usAmpDeviceID,
  271.                                                          (USHORT) MCI_CONNECTOR,
  272.                                                          ulParam1,
  273.                              (PVOID) pConParms,
  274.                                                          pFuncBlock->usUserParm );
  275.                                   break;
  276.  
  277.                                case MCI_WAVE_STREAM_CONNECTOR:
  278.                                  if ( ulParam1 & MCI_CONNECTOR_INDEX )
  279.                                    {
  280.                    if (pConParms->ulConnectorIndex != 1)
  281.  
  282.                                       {
  283.                                       return MCIERR_INVALID_CONNECTOR_INDEX;
  284.                                       }
  285.                                  }
  286.                  pConParms->ulReturn = TRUE;
  287.                                  ulrc = MAKEULONG( MCIERR_SUCCESS, MCI_TRUE_FALSE_RETURN );
  288.                                  break;
  289.                                case MCI_MIDI_STREAM_CONNECTOR:
  290.                                case MCI_AMP_STREAM_CONNECTOR:
  291.                                case MCI_CD_STREAM_CONNECTOR  :
  292.                                case MCI_VIDEO_IN_CONNECTOR   :
  293.                                case MCI_VIDEO_OUT_CONNECTOR  :
  294.                                case MCI_PHONE_SET_CONNECTOR  :
  295.                                case MCI_PHONE_LINE_CONNECTOR :
  296.                                case MCI_UNIVERSAL_CONNECTOR  :
  297.  
  298.                                   ulrc = MCIERR_UNSUPPORTED_CONN_TYPE;
  299.                                   break;
  300.  
  301.                                default:
  302.                                        ulrc = MCIERR_INVALID_CONNECTOR_TYPE;
  303.                                        break;
  304.                                }
  305.  
  306.                        break;
  307.  
  308.                  /*-------------------------------------------------------------*
  309.                  * Unknown request
  310.                  *-------------------------------------------------------------*/
  311.  
  312.                  default:
  313.                          ulrc = MCIERR_MISSING_FLAG;
  314.                          break;
  315.                  } /* switch the connector type */
  316.  
  317.          } /* if !ulrc */
  318.   else if ( ulParam1 & MCI_CONNECTOR_INDEX )
  319.      {
  320.      if (pConParms->ulConnectorIndex != 1)
  321.  
  322.         {
  323.         return MCIERR_INVALID_CONNECTOR_INDEX;
  324.         }
  325.  
  326.      if (  ( ulParam1 & ~( MCI_CONNECTOR_INDEX + MCI_QUERY_CONNECTOR_STATUS) ) > 0  )
  327.        {
  328.        return ( MCIERR_INVALID_FLAG );
  329.        }
  330.  
  331.  
  332.      if ( !(ulParam1 & MCI_QUERY_CONNECTOR_STATUS)  )
  333.         {
  334.     return ( MCIERR_MISSING_FLAG );
  335.         }
  336.  
  337.      pConParms->ulReturn = TRUE;
  338.      ulrc = MAKEULONG( MCIERR_SUCCESS, MCI_TRUE_FALSE_RETURN );
  339.  
  340.      } /* see if the index only flag is set */
  341.   else
  342.      /*-----------------------------------
  343.      * else there was neither a connector
  344.      * index nor a connector type
  345.      * must be one or both
  346.      *------------------------------------*/
  347.  
  348.      {
  349.      if ( !(ulParam1 & MCI_QUERY_CONNECTOR_STATUS)  )
  350.         {
  351.         return MCIERR_MISSING_FLAG;
  352.         }
  353.  
  354.      pConParms->ulReturn = TRUE;
  355.      ulrc = MAKEULONG( MCIERR_SUCCESS, MCI_TRUE_FALSE_RETURN );
  356.      }
  357.  
  358.  
  359.    return (ulrc);
  360.  
  361. } /* MCIConnector */
  362.  
  363.  
  364.