Condividi tramite


Implementazione di terminali collegabili

I requisiti generali per l'implementazione del terminale collegabile sono:

  • Il codice di streaming sottostante di un terminale collegabile deve corrispondere alle funzionalità dei provider di servizi di sicurezza desiderati.
  • Il terminale deve usare i filtri DirectShow per lavorare con la maggior parte dei fornitori di servizi gestiti (cosa che si presume da questo punto in avanti).
  • I terminali audio devono supportare PCM lineare a 16 bit a 8 kHz per la maggior parte degli MSP.
  • Il terminale deve abilitare il marshalling threading gratuito implementando IMarshal. Il terminale può eseguire questa operazione chiamando l'API COM CoCreateFreeThreadedMarshaler e aggregando IMarshal al puntatore restituito. Il distruttore dell'oggetto terminale deve chiamare IMarshal->Release.
  • Il terminale deve implementare o aggregare eventuali interfacce aggiuntive specifiche del terminale appropriate.
  • L'implementazione del terminale deve essere thread-safe.
  • L'implementazione del terminale deve #include Termmgr.h per la definizione di ITTerminalControl. Oltre ai soliti include e librerie necessarie per le applicazioni TAPI 3 o TAPI 3 in Windows 2000 SP1.

Note sull'implementazione dell'interfaccia e del metodo:

Il terminale deve implementare ITTerminal (dual interface-vtable + IDispatch).

ITTerminal::get_TerminalClass

Il terminale deve restituire un BSTR rappresentazione di un GUID selezionato che identifica il tipo di terminale. Allocare il BSTR tramite SysAllocString. Per eseguire la conversione da GUID a BSTR, chiamare StringFromCLSID, SysAllocStringe CoTaskMemFree.

ITTerminal::get_TerminalType

Il terminale dovrebbe in genere restituire TT_DYNAMIC se un'applicazione implementa il terminale. Anche la restituzione di TT_STATIC funzionerà e la restituzione di questo valore potrebbe essere appropriata se il terminale corrisponde a un dispositivo hardware; Tuttavia, questa operazione può generare confusione per gli utenti perché un terminale statico non sarà presente nell'enumerazione statica del terminale MSP.

ITTerminal::get_State

Se l'implementazione del terminale non limita arbitrariamente il numero di flussi a cui il terminale può essere connesso contemporaneamente, il terminale deve sempre restituire TS_NOTINUSE.

In caso contrario, l'implementazione del terminale limita arbitrariamente il numero di flussi a cui il terminale può essere connesso alla volta. In questo caso, il terminale deve mantenere un conteggio del numero di flussi a cui è connesso. Il terminale deve incrementare questo conteggio interno su una chiamata riuscita di ITTerminalControl::ConnectTerminal e decrementarlo su una chiamata riuscita di ITTerminalControl::DisconnectTerminal. In ITTerminal::get_State, deve restituire TS_INUSE se questo conteggio è uguale al numero massimo di flussi su cui è possibile selezionare il terminale alla volta; in caso contrario, deve restituire TS_NOTINUSE. Si noti che se il limite è uno, il conteggio può essere semplicemente un valore booleano o un valore TERMINAL_STATE.

ITTerminal::get_Name

Il terminale deve restituire un nome BSTR scelto, allocato tramite SysAllocString. Questo nome deve essere significativo per l'utente e deve essere localizzato.

ITTerminal::get_MediaType

Il terminale deve restituire il tipo di supporto, TAPIMEDIATYPE_AUDIO o TAPIMEDIATYPE_VIDEO.

ITTerminal::get_Direction

Il terminale restituisce il valore di enumerazione TERMINAL_DIRECTION che indica la direzione del terminale. Se il terminale è bidirezionale ,ad esempio un bridge, deve restituire TD_BIDIRECTIONAL.

Il terminale deve implementare ITTerminalControl (solo vtable).

ITTerminalControl::get_AddressHandle

Un terminale fornito dall'applicazione deve restituire sempre NULL come riferimento di indirizzo. Indica al msp che questo terminale non è stato creato in un oggetto indirizzo MSP specifico.

ITTerminalControl::ConnectTerminal

In questa chiamata, il terminale aggiungerà i filtri al grafico specificato e li connetterà tra loro, se applicabile. Il terminale deve quindi restituire i pin esposti dal terminale per la direzione del flusso specificata.

Un terminale che non supporta la connessione simultanea a più flussi imposta una variabile interna su TS_INUSE al completamento corretto di questo metodo.

Il terminale può usare il parametro dwTerminalDirection da questa chiamata per determinare la direzione del flusso a cui è connesso. Questa operazione è necessaria per i terminali bidirezionali.

Nota

In genere (nelle classi di base MSP e in tutti gli MSP noti), il codice del flusso MSP avrà esito negativo se il terminale restituisce più pin da una singola ConnectTerminal chiamata. Questa operazione va bene, perché un terminale che restituisce più pin durante la connessione richiede che l'MSP abbia una conoscenza speciale del terminale per usare efficacemente i pin aggiuntivi.

 

ITTerminalControl::CompleteConnectTerminal

Il terminale deve restituire solo S_OK. Il terminale può anche eseguire l'inizializzazione post-connessione, se necessario.

ITTerminalControl::DisconnectTerminal

Il terminale deve eseguire qualsiasi operazione necessaria per disconnettere il terminale dal resto del grafico. Questo comporta in genere la rimozione di tutti i filtri dei terminali dal grafico e l'impostazione dello stato del terminale su TS_NOTINUSE.

ITTerminalControl::RunRenderFilter

Il terminale deve restituire solo E_NOTIMPL.

ITTerminalControl::StopRenderFilter

Il terminale deve restituire solo E_NOTIMPL.