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 configurazione desiderati.
  • Il terminale deve usare i filtri DirectShow per funzionare con la maggior parte dei provider di servizi di configurazione ( questo si presuppone da qui in poi).
  • 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 libero implementando IMarshal. Il terminale può eseguire questa operazione chiamando coCreateFreeThreadedMarshaler dell'API COM 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 lib necessari 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 una rappresentazione BSTR di un GUID selezionato che identifica il tipo di terminale. Allocare BSTR tramite SysAllocString. Per eseguire la conversione da GUID a BSTR, chiamare StringFromCLSID, SysAllocString e CoTaskMemFree.

ITTerminal::get_TerminalType

Il terminale deve in genere restituire TT_DYNAMIC se un'applicazione implementa il terminale. La restituzione di TT_STATIC funzionerà anche e la restituzione di questo valore potrebbe essere appropriata se il terminale corrisponde a un dispositivo hardware; Tuttavia, questa operazione potrebbe confondere gli utenti perché un terminale statico non sarà presente nell'enumerazione del terminale statico del 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 per una chiamata ITTerminalControl::ConnectTerminal e decrementarla in una chiamata ITTerminalControl::D isconnectTerminal . 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 di propria scelta, 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 sempre restituire NULL come handle 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 relativi 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 i provider di servizi gestiti noti, il codice del flusso MSP avrà esito negativo se il terminale restituisce più pin da una singola chiamata ConnectTerminal . Questa operazione va bene, perché un terminale che restituisce più pin durante la connessione richiede che il 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::D isconnectTerminal

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.