Compartir a través de


Implementación de terminales conectables

Los requisitos generales para la implementación del terminal acoplable son:

  • El código de streaming subyacente de un terminal conectable debe coincidir con las funcionalidades de los MSP deseados.
  • El terminal debe usar filtros DirectShow para trabajar con la mayoría de los MSP (esto se supone desde aquí).
  • Los terminales de audio deben admitir PCM mono lineal de 8 kHz de 16 bits para la mayoría de los MSP.
  • El terminal debe habilitar la serialización libre de subprocesos mediante la implementación de IMarshal. El terminal puede hacerlo llamando a la API COM CoCreateFreeThreadedMarshaler y agregando IMarshal al puntero devuelto. El destructor del objeto terminal debe llamar a IMarshal-Release>.
  • El terminal debe implementar o agregar cualquier interfaz adicional específica del terminal que sea adecuada.
  • La implementación del terminal debe ser segura para subprocesos.
  • La implementación del terminal debe #include Termmgr.h para la definición de ITTerminalControl. Esto se suma a las inclusión y bibliotecas habituales necesarias para las aplicaciones TAPI 3 o TAPI 3 en Windows 2000 SP1.

Notas de implementación de la interfaz y del método:

El terminal debe implementar ITTerminal (dual interface-vtable + IDispatch).

ITTerminal::get_TerminalClass

El terminal debe devolver una representación BSTR de un GUID que haya seleccionado que identifique el tipo de terminal. Asigne el BSTR a través de SysAllocString. Para convertir de GUID a BSTR, llame a StringFromCLSID, SysAllocString y CoTaskMemFree.

ITTerminal::get_TerminalType

Por lo general, el terminal debe devolver TT_DYNAMIC si una aplicación implementa el terminal. Devolver TT_STATIC también funcionará y devolver este valor puede ser adecuado si el terminal corresponde a un dispositivo de hardware; Sin embargo, hacerlo puede resultar confuso para los usuarios porque un terminal estático no estará presente en la enumeración de terminal estático del MSP.

ITTerminal::get_State

Si la implementación del terminal no limita arbitrariamente el número de secuencias a las que se puede conectar simultáneamente el terminal, el terminal siempre debe devolver TS_NOTINUSE.

De lo contrario, la implementación del terminal limita arbitrariamente el número de secuencias a las que se puede conectar el terminal a la vez. En este caso, el terminal debe mantener un recuento de cuántas secuencias está conectada. El terminal debe incrementar este recuento interno en una llamada ITTerminalControl::ConnectTerminal correcta y disminuirla en una llamada ITTerminalControl::D isconnectTerminal correcta. En ITTerminal::get_State, debe devolver TS_INUSE si este recuento es igual al número máximo de secuencias en las que se puede seleccionar el terminal a la vez; de lo contrario, debe devolver TS_NOTINUSE. Tenga en cuenta que si el límite es uno, el recuento puede ser simplemente un valor booleano o un valor de TERMINAL_STATE.

ITTerminal::get_Name

El terminal debe devolver un nombre BSTR de su elección, asignado a través de SysAllocString. Este nombre debe ser significativo para el usuario y debe localizarse.

ITTerminal::get_MediaType

El terminal debe devolver su tipo de medio, ya sea TAPIMEDIATYPE_AUDIO o TAPIMEDIATYPE_VIDEO.

ITTerminal::get_Direction

El terminal devuelve el valor de enumeración TERMINAL_DIRECTION que indica la dirección del terminal. Si el terminal es bidireccional (por ejemplo, un puente), debe devolver TD_BIDIRECTIONAL.

El terminal debe implementar ITTerminalControl (solo vtable).

ITTerminalControl::get_AddressHandle

Un terminal proporcionado por la aplicación siempre debe devolver NULL como identificador de dirección. Esto indica al MSP que este terminal no se creó en un objeto de dirección MSP específico.

ITTerminalControl::ConnectTerminal

En esta llamada, el terminal agregará sus filtros al gráfico especificado y los conectará entre sí, si procede. A continuación, el terminal debe devolver las patillas expuestas por el terminal para la dirección de la secuencia especificada.

Un terminal que no admite la conexión simultánea a varias secuencias establecería una variable interna en TS_INUSE al completar correctamente este método.

El terminal puede usar el parámetro dwTerminalDirection de esta llamada para determinar la dirección de la secuencia a la que se está conectando. Esto es necesario para los terminales bidireccionales.

Nota

Normalmente (en las clases base msp y en todos los MSP conocidos), el código de secuencia msp producirá un error en la conexión si el terminal devuelve más de un pin desde una sola llamada ConnectTerminal . Esto es correcto, ya que un terminal que devuelve más de un pin durante la conexión requiere que el MSP tenga un conocimiento especial del terminal para hacer uso de los pines adicionales de forma eficaz.

 

ITTerminalControl::CompleteConnectTerminal

El terminal solo debe devolver S_OK. El terminal también puede realizar la inicialización posterior a la conexión si es necesario.

ITTerminalControl::D isconnectTerminal

El terminal debe hacer lo que sea necesario para desconectar el terminal del resto del gráfico. Normalmente, esto implica quitar todos los filtros de los terminales del gráfico y establecer el estado del terminal en TS_NOTINUSE.

ITTerminalControl::RunRenderFilter

El terminal solo debe devolver E_NOTIMPL.

ITTerminalControl::StopRenderFilter

El terminal solo debe devolver E_NOTIMPL.