Partilhar via


Implementação de terminais conectáveis

Os requisitos gerais para a implementação de terminais conectáveis são:

  • O código de streaming subjacente de um terminal conectável deve corresponder aos recursos dos MSPs desejados.
  • O terminal deve usar filtros DirectShow para trabalhar com a maioria dos MSPs (isso é assumido daqui em diante).
  • Os terminais de áudio devem suportar PCM monolinear de 16 bits de 8 kHz para a maioria dos MSPs.
  • O terminal deve permitir o empacotamento com rosca livre através da implementação de IMarshal. O terminal pode fazer isso chamando a API COM CoCreateFreeThreadedMarshaler e agregando IMarshal ao ponteiro retornado. O destrutor do objeto terminal deve chamar IMarshal->Release.
  • O terminal deve implementar ou agregar quaisquer interfaces adicionais específicas do terminal que sejam adequadas.
  • A implementação do terminal deve ser thread-safe.
  • A implementação do terminal deve utilizar #include Termmgr.h para a definição de ITTerminalControl. Isso é além das inclusões e libs usuais que são necessárias para aplicativos TAPI 3 ou TAPI 3 no Windows 2000 SP1.

Notas sobre a implementação da interface e do método:

O terminal deve implementar ITTerminal (dual interface–vtable + IDispatch).

ITTerminal::get_TerminalClass

O terminal deve retornar um BSTR representação de um GUID que você escolheu que identifica seu tipo de terminal. Aloque o BSTR através de SysAllocString. Para converter de GUID para BSTR, chame StringFromCLSID, SysAllocStringe CoTaskMemFree.

ITTerminal::get_TerminalType

Geralmente, o terminal deve devolver TT_DYNAMIC se uma aplicação implementar o terminal. Retornar TT_STATIC também funcionará, e retornar esse valor pode ser apropriado se o terminal corresponder a um dispositivo de hardware; no entanto, fazer isso pode ser confuso para os usuários porque um terminal estático não estará presente na enumeração de terminal estático do MSP.

ITTerminal::get_State

Se a implementação do terminal não limitar arbitrariamente o número de fluxos aos quais o terminal pode ser conectado simultaneamente, o terminal deve sempre retornar TS_NOTINUSE.

Caso contrário, a implementação do terminal limita arbitrariamente o número de fluxos aos quais o terminal pode ser conectado de cada vez. Neste caso, o terminal deve manter uma contagem de a quantos fluxos está conectado. O terminal deve incrementar esta contagem interna em uma chamada ITTerminalControl::ConnectTerminal bem-sucedida e diminuí-la em uma chamada bem-sucedida ITTerminalControl::DisconnectTerminal. Em ITTerminal::get_State, ele deve retornar TS_INUSE se essa contagem for igual ao número máximo de fluxos em que o terminal pode ser selecionado de cada vez; caso contrário, deverá voltar TS_NOTINUSE. Observe que, se o limite for um, a contagem pode simplesmente ser um valor booleano ou TERMINAL_STATE.

ITTerminal::get_Name

O terminal deve retornar um BSTR nome de sua escolha, alocado via SysAllocString. Esse nome deve ser significativo para o usuário e deve ser localizado.

ITTerminal::get_MediaType

O terminal deve retornar seu tipo de mídia, TAPIMEDIATYPE_AUDIO ou TAPIMEDIATYPE_VIDEO.

ITTerminal::get_Direction

O terminal devolve o valor enum TERMINAL_DIRECTION que indica a direção do terminal. Se o terminal for bidirecional (por exemplo, uma ponte), ele deve retornar TD_BIDIRECTIONAL.

O terminal deve implementar ITTerminalControl (somente vtable).

ITTerminalControl::get_AddressHandle

Um terminal fornecido pelo aplicativo deve sempre retornar NULL como o identificador de endereço. Isso indica ao MSP que esse terminal não foi criado em um objeto de endereço MSP específico.

ITTerminalControl::ConnectTerminal

Nesta chamada, o terminal adicionará o(s) seu(s) filtro(s) ao gráfico fornecido e conectá-los-á uns aos outros, se aplicável. Em seguida, o terminal deve retornar o(s) pino(s) exposto(s) pelo terminal para a direção de fluxo especificada.

Um terminal que não suporta conexão simultânea com vários fluxos definiria uma variável interna para TS_INUSE na conclusão bem-sucedida desse método.

O terminal pode usar o parâmetro dwTerminalDirection dessa chamada para determinar a direção do fluxo ao qual está sendo conectado. Isto é necessário para terminais bidirecionais.

Observação

Normalmente, (nas classes base MSP e em todos os MSPs conhecidos), o código de fluxo MSP falhará na conexão se o terminal retornar mais de um pino de uma única chamada ConnectTerminal. Isso é bom, porque um terminal que retorna mais de um pino durante a conexão requer que o MSP tenha conhecimento especial do terminal para fazer uso dos pinos extras de forma eficaz.

 

ITTerminalControl::CompleteConnectTerminal

O terminal deve apenas devolver S_OK. O terminal também pode fazer inicialização pós-conexão, se necessário.

ITTerminalControl::DisconnectTerminal

O terminal deve fazer o que for necessário para desconectar o terminal do resto do gráfico. Normalmente, isso envolve remover todos os filtros dos terminais do gráfico e definir o estado do terminal para TS_NOTINUSE.

ITTerminalControl::RunRenderFilter

O terminal deve apenas devolver E_NOTIMPL.

ITTerminalControl::StopRenderFilter

O terminal deve apenas devolver E_NOTIMPL.