Implementieren von austauschbaren Terminals
Die allgemeinen Anforderungen für die Implementierung eines austauschbaren Terminals sind:
- Der zugrunde liegende Streamingcode eines austauschbaren Terminals sollte den Funktionen der gewünschten MSPs entsprechen.
- Das Terminal muss DirectShow-Filter verwenden, um mit den meisten MSPs zu arbeiten (dies wird von hier aus angenommen).
- Audioterminals müssen für die meisten MSPs ein lineares MONO-PCM mit 8 kHz und 16 Bit unterstützen.
- Das Terminal sollte das freie Threading marshallen, indem IMarshalimplementiert wird. Hierzu kann das Terminal die COM-API CoCreateFreeThreadedMarshaler aufrufen und IMarshal auf den zurückgegebenen Zeiger aggregieren. Der Destruktor des Terminalobjekts sollte IMarshal->Releaseaufrufen.
- Das Terminal sollte alle zusätzlichen terminalspezifischen Schnittstellen implementieren oder aggregieren, die geeignet sind.
- Die Terminalimplementierungen müssen threadsicher sein.
- Die Terminalimplementierung muss # Termmgr.h für die Definition von ITTerminalControlenthalten. Dies ist zusätzlich zu den üblichen Includes und Bibliotheken, die für TAPI 3- oder TAPI 3-Anwendungen unter Windows 2000 SP1 erforderlich sind.
Hinweise zur Implementierung von Schnittstellen und Methoden:
Das Terminal muss ITTerminal implementieren (duale Schnittstelle – vtable + IDispatch).
ITTerminal::get _ TerminalClass
Das Terminal muss eine BSTR-Darstellung einer von Ihnen ausgewählten GUID zurückgeben, die Ihren Terminaltyp identifiziert. Ordnen Sie den BSTR über SysAllocStringzu. Um von GUID in BSTR zu konvertieren, rufen Sie StringFromCLSID, SysAllocString und CoTaskMemFreeauf.
ITTerminal::get _ TerminalType
Das Terminal sollte in der Regel TT _ DYNAMIC zurückgeben, wenn eine Anwendung das Terminal implementiert. Die Rückgabe von TT _ STATIC funktioniert ebenfalls, und die Rückgabe dieses Werts kann sinnvoll sein, wenn das Terminal einem Hardwaregerät entspricht. Dies kann jedoch für Benutzer verwirrend sein, da ein statisches Terminal in der statischen Terminalenumeration des MSP nicht vorhanden ist.
Wenn die Terminalimplementierungen die Anzahl der Streams, mit denen das Terminal gleichzeitig verbunden werden kann, nicht beliebig begrenzen, sollte das Terminal immer TS _ NOTINUSE zurückgeben.
Andernfalls schränkt die Terminalimplementierungen beliebig die Anzahl der Streams ein, mit denen das Terminal gleichzeitig verbunden werden kann. In diesem Fall sollte das Terminal die Anzahl der Streams beibehalten, mit der es verbunden ist. Das Terminal sollte diese interne Anzahl bei einem erfolgreichen ITTerminalControl::ConnectTerminal-Aufruf erhöhen und bei einem erfolgreichen ITTerminalControl::D isconnectTerminal-Aufruf dekrementieren. In ITTerminal::get _ Statesollte TS INUSE zurückgegeben _ werden, wenn diese Anzahl der maximalen Anzahl von Datenströmen entspricht, für die das Terminal gleichzeitig ausgewählt werden kann. Andernfalls sollte TS _ NOTINUSE zurückgegeben werden. Beachten Sie Folgendes: Wenn der Grenzwert 1 ist, kann die Anzahl einfach ein boolescher Wert oder ein TERMINAL _ STATE-Wert sein.
Das Terminal sollte einen BSTR-Namen seiner Wahl zurückgeben, der über SysAllocStringzugeordnet wird. Dieser Name sollte für den Benutzer aussagekräftig sein und lokalisiert werden.
Das Terminal sollte seinen Medientyp zurückgeben, entweder TAPIMEDIATYPE _ AUDIO oder TAPIMEDIATYPE _ VIDEO.
Das Terminal gibt den TERMINAL _ DIRECTION-Enumerationswert zurück, der die Richtung des Terminals angibt. Wenn das Terminal bidirektional ist (z. B. eine Bridge), muss es TD _ BIDIRECTIONAL zurückgeben.
Das Terminal muss ITTerminalControl implementieren (nur vtable).
ITTerminalControl::get _ AddressHandle
Ein von der Anwendung bereitgestelltes Terminal sollte immer NULL als Adresshandle zurückgeben. Dies gibt dem MSP an, dass dieses Terminal nicht für ein bestimmtes MSP-Adressobjekt erstellt wurde.
ITTerminalControl::ConnectTerminal
Bei diesem Aufruf fügt das Terminal seine Filter dem angegebenen Graphen hinzu und verbindet sie ggf. miteinander. Anschließend sollte das Terminal die pin(s) zurückgeben, die vom Terminal für die angegebene Streamrichtung verfügbar gemacht werden.
Ein Terminal, das keine gleichzeitige Verbindung mit mehreren Streams unterstützt, würde bei erfolgreichem Abschluss dieser Methode eine interne Variable auf TS _ INUSE festlegen.
Das Terminal kann den dwTerminalDirection-Parameter aus diesem Aufruf verwenden, um die Richtung des Streams zu bestimmen, mit dem eine Verbindung hergestellt wird. Dies ist für bidirektionale Terminals erforderlich.
Hinweis
In der Regel (in den MSP-Basisklassen und in allen bekannten MSPs) schlägt der MSP-Streamcode die Verbindung fehl, wenn das Terminal mehrere Pins von einem einzelnen ConnectTerminal-Aufruf zurückgibt. Dies ist in Ordnung, da ein Terminal, das während der Verbindung mehrere Pins zurückgibt, über spezielle Kenntnisse des Terminals verfügen muss, um die zusätzlichen Pins effektiv nutzen zu können.
ITTerminalControl::CompleteConnectTerminal
Das Terminal sollte einfach S _ OK zurückgeben. Das Terminal kann ggf. auch eine Initialisierung nach der Verbindung durchführen.
ITTerminalControl::D isconnectTerminal
Das Terminal sollte alles tun, was erforderlich ist, um das Terminal vom Rest des Diagramms zu trennen. In der Regel umfasst dies das Entfernen aller Filter der Terminals aus dem Diagramm und das Festlegen des Endzustands auf TS _ NOTINUSE.
ITTerminalControl::RunRenderFilter
Das Terminal sollte einfach E _ NOTIMPL zurückgeben.
ITTerminalControl::StopRenderFilter
Das Terminal sollte einfach E _ NOTIMPL zurückgeben.