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).
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.
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.
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.
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.
Il terminale deve restituire il tipo di supporto, TAPIMEDIATYPE_AUDIO o TAPIMEDIATYPE_VIDEO.
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.