home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / tolkit45.zip / os2tk45 / samples / mm / admct / admcconn.c < prev    next >
C/C++ Source or Header  |  1999-05-11  |  16KB  |  422 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 <ssm.h>                        // SSM spi includes.
  38. #include <meerror.h>                    // MM Error Messages.
  39. #include <mmioos2.h>                    // MMIO Include.
  40. #include <mcios2.h>                     // MM System Include.
  41. #include <mmdrvos2.h>                   // Mci Driver Include.
  42. #include <mcipriv.h>                    // MCI Connection stuff
  43. #include <mcd.h>                        // VSDIDriverInterface.
  44. #include <hhpheap.h>                    // Heap Manager Definitions
  45. #include <qos.h>
  46. #include <audiomcd.h>                   // Component Definitions.
  47. #include "admcfunc.h"                   // Function Prototypes
  48. #include <sw.h>
  49. #include <checkmem.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.    /* To determine a connector's status--we must be connected */
  136.  
  137. #ifdef CONNECTION
  138.    if ( !ulpInstance->fConnected )
  139.       return ( MCIERR_NO_CONNECTION );
  140. #endif
  141.  
  142.  
  143.    /* if they want to set a type */
  144.  
  145.    if ( ulConnectorType )
  146.          {
  147.          // Investigate!!!!!!!!!
  148.          /* I am not sure that I should be checking indexes, the amp should */
  149.          // Investigate!!!!!!!!!!!!!!!
  150.  
  151.          if ( ulParam1 & MCI_CONNECTOR_INDEX && ( pConParms->ulConnectorIndex != 1) )
  152.               {
  153.               if ( pConParms->ulConnectorType != MCI_SPEAKERS_CONNECTOR )
  154.                  {
  155.                  return ( MCIERR_INVALID_CONNECTOR_INDEX );
  156.                 }
  157.                else
  158.                  {
  159.                  if ( pConParms->ulConnectorIndex != 2 )
  160.                     {
  161.                     return ( MCIERR_INVALID_CONNECTOR_INDEX );
  162.                     }
  163.                  }
  164.               }
  165.  
  166.           if ( ulHoldConFlag & ~( MCI_ENABLE_CONNECTOR  |
  167.                                   MCI_DISABLE_CONNECTOR |
  168.                                   MCI_QUERY_CONNECTOR_STATUS ) )
  169.              {
  170.              return ( MCIERR_INVALID_FLAG );
  171.              }
  172.  
  173.          switch( ulHoldConFlag )
  174.                  {
  175.                  /*-------------------------------------------------------------*
  176.                  * Enable connector
  177.                  *-------------------------------------------------------------*/
  178.  
  179.                  case MCI_ENABLE_CONNECTOR:
  180.                        switch( pConParms->ulConnectorType )
  181.                                {
  182.                                /*-----------------------------------------------------
  183.                                * since we know that we are connected to an amp/mixer
  184.                                * we can pass the command on
  185.                                *----------------------------------------------------*/
  186.                                case MCI_LINE_IN_CONNECTOR:
  187.                                case MCI_AUDIO_IN_CONNECTOR   :
  188.                                case MCI_MICROPHONE_CONNECTOR:
  189.                                case MCI_LINE_OUT_CONNECTOR:
  190.                                case MCI_AUDIO_OUT_CONNECTOR  :
  191.                                case MCI_SPEAKERS_CONNECTOR:
  192.                                case MCI_HEADPHONES_CONNECTOR:
  193.                                   {
  194. // CONNECTOR FEATURE
  195.                                   /********************************
  196.                                   * It is possbile that although we
  197.                                   * are connected, there is no amp
  198.                                   * in the network to forward the
  199.                                   * command to (i.e. cd->wave).
  200.                                   * Check to make sure.
  201.                                   *********************************/
  202. #ifdef CONNECTION
  203.                                   ulrc = FindAmp( ulpInstance);
  204.                                   if ( ulrc )
  205.                                      {
  206.                                      return (ulrc);
  207.                                      }
  208. #endif
  209. // CONNECTOR FEATURE
  210.                                   ulrc = mciSendCommand ( ulpInstance->usAmpDeviceID,
  211.                                                          (USHORT) MCI_CONNECTOR,
  212.                                                          ulParam1,
  213.                                                          (PVOID) pConParms,
  214.                                                          pFuncBlock->usUserParm );
  215.                                   }
  216.                                   break;
  217.                                case MCI_WAVE_STREAM_CONNECTOR:
  218.  
  219.                                   ulrc = MCIERR_CANNOT_MODIFY_CONNECTOR;
  220.                                   break;
  221.                                case MCI_MIDI_STREAM_CONNECTOR:
  222.                                case MCI_AMP_STREAM_CONNECTOR:
  223.                                case MCI_CD_STREAM_CONNECTOR  :
  224.                                case MCI_VIDEO_IN_CONNECTOR   :
  225.                                case MCI_VIDEO_OUT_CONNECTOR  :
  226.                                case MCI_PHONE_SET_CONNECTOR  :
  227.                                case MCI_PHONE_LINE_CONNECTOR :
  228.                                case MCI_UNIVERSAL_CONNECTOR  :
  229.  
  230.                                   ulrc = MCIERR_UNSUPPORTED_CONN_TYPE;
  231.                                   break;
  232.                                default:
  233.                                        ulrc = MCIERR_INVALID_CONNECTOR_TYPE;
  234.                                        break;
  235.                                }
  236.                        break;
  237.  
  238.                  /*-------------------------------------------------------------*
  239.                  * Disable connector
  240.                  *-------------------------------------------------------------*/
  241.  
  242.                  case MCI_DISABLE_CONNECTOR:
  243.                        switch( pConParms->ulConnectorType )
  244.                                {
  245.                                case MCI_LINE_IN_CONNECTOR:
  246.                                case MCI_AUDIO_IN_CONNECTOR   :
  247.                                case MCI_MICROPHONE_CONNECTOR:
  248.                                case MCI_LINE_OUT_CONNECTOR:
  249.                                case MCI_AUDIO_OUT_CONNECTOR  :
  250.                                case MCI_SPEAKERS_CONNECTOR:
  251.                                case MCI_HEADPHONES_CONNECTOR:
  252.  
  253. // CONNECTOR FEATURE
  254.                                   /********************************
  255.                                   * It is possbile that although we
  256.                                   * are connected, there is no amp
  257.                                   * in the network to forward the
  258.                                   * command to (i.e. cd->wave).
  259.                                   * Check to make sure.
  260.                                   *********************************/
  261. #ifdef CONNECTION
  262.                                   ulrc = FindAmp( ulpInstance);
  263.                                   if ( ulrc )
  264.                                      {
  265.                                      return (ulrc);
  266.                                      }
  267. #endif
  268. // CONNECTOR FEATURE
  269.                                   ulrc = mciSendCommand ( ulpInstance->usAmpDeviceID,
  270.                                                          (USHORT) MCI_CONNECTOR,
  271.                                                          ulParam1,
  272.                                                          (PVOID) pConParms,
  273.                                                          pFuncBlock->usUserParm );
  274.                                        break;
  275.                                case MCI_WAVE_STREAM_CONNECTOR:
  276.  
  277.                                   ulrc = MCIERR_CANNOT_MODIFY_CONNECTOR;
  278.                                   break;
  279.                                case MCI_MIDI_STREAM_CONNECTOR:
  280.                                case MCI_AMP_STREAM_CONNECTOR:
  281.                                case MCI_CD_STREAM_CONNECTOR  :
  282.                                case MCI_VIDEO_IN_CONNECTOR   :
  283.                                case MCI_VIDEO_OUT_CONNECTOR  :
  284.                                case MCI_PHONE_SET_CONNECTOR  :
  285.                                case MCI_PHONE_LINE_CONNECTOR :
  286.                                case MCI_UNIVERSAL_CONNECTOR  :
  287.  
  288.                                   ulrc = MCIERR_UNSUPPORTED_CONN_TYPE;
  289.                                   break;
  290.  
  291.                                default:
  292.                                        ulrc = MCIERR_INVALID_CONNECTOR_TYPE;
  293.                                        break;
  294.                                } /* switch the connector type */
  295.                        break;
  296.                  /*-------------------------------------------------------------*
  297.                  * QUERY connector
  298.                  *-------------------------------------------------------------*/
  299.  
  300.                  case MCI_QUERY_CONNECTOR_STATUS :
  301.                        switch( pConParms->ulConnectorType )
  302.                                {
  303.                                case MCI_LINE_IN_CONNECTOR:
  304.                                case MCI_AUDIO_IN_CONNECTOR   :
  305.                                case MCI_MICROPHONE_CONNECTOR:
  306.                                case MCI_LINE_OUT_CONNECTOR:
  307.                                case MCI_AUDIO_OUT_CONNECTOR  :
  308.                                case MCI_SPEAKERS_CONNECTOR:
  309.                                case MCI_HEADPHONES_CONNECTOR:
  310.  
  311. // CONNECTOR FEATURE
  312.                                   /********************************
  313.                                   * It is possbile that although we
  314.                                   * are connected, there is no amp
  315.                                   * in the network to forward the
  316.                                   * command to (i.e. cd->wave).
  317.                                   * Check to make sure.
  318.                                   *********************************/
  319. #ifdef CONNECTION
  320.  
  321.                                   ulrc = FindAmp( ulpInstance);
  322.                                   if ( ulrc )
  323.                                      {
  324.                                      return (ulrc);
  325.                                      }
  326. #endif
  327. // CONNECTOR FEATURE
  328.                                   ulrc = mciSendCommand ( ulpInstance->usAmpDeviceID,
  329.                                                          (USHORT) MCI_CONNECTOR,
  330.                                                          ulParam1,
  331.                                                          (PVOID) pConParms,
  332.                                                          pFuncBlock->usUserParm );
  333.                                   break;
  334.  
  335.                                case MCI_WAVE_STREAM_CONNECTOR:
  336.                                  if ( ulParam1 & MCI_CONNECTOR_INDEX )
  337.                                    {
  338.                                    if (pConParms->ulConnectorIndex != 1)
  339.  
  340.                                       {
  341.                                       return MCIERR_INVALID_CONNECTOR_INDEX;
  342.                                       }
  343.                                  }
  344.                                  pConParms->ulReturn = TRUE;
  345.                                  ulrc = MAKEULONG( MCIERR_SUCCESS, MCI_TRUE_FALSE_RETURN );
  346.                                  break;
  347.                                case MCI_MIDI_STREAM_CONNECTOR:
  348.                                case MCI_AMP_STREAM_CONNECTOR:
  349.                                case MCI_CD_STREAM_CONNECTOR  :
  350.                                case MCI_VIDEO_IN_CONNECTOR   :
  351.                                case MCI_VIDEO_OUT_CONNECTOR  :
  352.                                case MCI_PHONE_SET_CONNECTOR  :
  353.                                case MCI_PHONE_LINE_CONNECTOR :
  354.                                case MCI_UNIVERSAL_CONNECTOR  :
  355.  
  356.                                   ulrc = MCIERR_UNSUPPORTED_CONN_TYPE;
  357.                                   break;
  358.  
  359.                                default:
  360.                                        ulrc = MCIERR_INVALID_CONNECTOR_TYPE;
  361.                                        break;
  362.                                }
  363.  
  364.                        break;
  365.  
  366.                  /*-------------------------------------------------------------*
  367.                  * Unknown request
  368.                  *-------------------------------------------------------------*/
  369.  
  370.                  default:
  371.                          ulrc = MCIERR_MISSING_FLAG;
  372.                          break;
  373.                  } /* switch the connector type */
  374.  
  375.          } /* if !ulrc */
  376.   else if ( ulParam1 & MCI_CONNECTOR_INDEX )
  377.      {
  378.      if (pConParms->ulConnectorIndex != 1)
  379.  
  380.         {
  381.         return MCIERR_INVALID_CONNECTOR_INDEX;
  382.         }
  383.  
  384.      if (  ( ulParam1 & ~( MCI_CONNECTOR_INDEX + MCI_QUERY_CONNECTOR_STATUS) ) > 0  )
  385.        {
  386.        return ( MCIERR_INVALID_FLAG );
  387.        }
  388.  
  389.  
  390.      if ( !(ulParam1 & MCI_QUERY_CONNECTOR_STATUS)  )
  391.         {
  392.         return ( MCIERR_MISSING_FLAG );
  393.         }
  394.  
  395.      pConParms->ulReturn = TRUE;
  396.      ulrc = MAKEULONG( MCIERR_SUCCESS, MCI_TRUE_FALSE_RETURN );
  397.  
  398.      } /* see if the index only flag is set */
  399.   else
  400.      /*-----------------------------------
  401.      * else there was neither a connector
  402.      * index nor a connector type
  403.      * must be one or both
  404.      *------------------------------------*/
  405.  
  406.      {
  407.      if ( !(ulParam1 & MCI_QUERY_CONNECTOR_STATUS)  )
  408.         {
  409.         return MCIERR_MISSING_FLAG;
  410.         }
  411.  
  412.      pConParms->ulReturn = TRUE;
  413.      ulrc = MAKEULONG( MCIERR_SUCCESS, MCI_TRUE_FALSE_RETURN );
  414.      }
  415.  
  416.  
  417.    return (ulrc);
  418.  
  419. } /* MCIConnector */
  420.  
  421.  
  422.