Implementieren von steckbaren Klemmen
Die allgemeinen Anforderungen für die Implementierung von steckbaren Terminals sind:
- Der dem Pluggable-Terminal zugrunde liegende Streamingcode sollte mit den Funktionen der gewünschten MSPs übereinstimmen.
- Das Terminal muss DirectShow-Filter verwenden, um mit den meisten MSPs zu arbeiten (dies wird von hier an angenommen).
- Audioterminals müssen 8 kHz 16-Bit-monolineares PCM für die meisten MSPs unterstützen.
- Das Terminal sollte das free Threaded Marshalling durch die Implementierung von IMarshal aktivieren. Dazu kann das Terminal die COM-API CoCreateFreeThreadedMarshaler aufrufen und IMarshal mit dem zurückgegebenen Zeiger aggregieren. Der Destruktor des Terminalobjekts sollte IMarshal-Release> aufrufen.
- Das Terminal sollte alle zusätzlichen terminalspezifischen Schnittstellen implementieren oder aggregieren, die geeignet sind.
- Die Terminalimplementierung muss threadsicher sein.
- Die Terminalimplementierung muss Termmgr.h für die Definition von ITTerminalControl #include. Dies ist zusätzlich zu den üblichen Includes und Libs, die für TAPI 3- oder TAPI 3-Anwendungen unter Windows 2000 SP1 benötigt werden.
Hinweise zur Schnittstellen- und Methodenimplementierung:
Das Terminal muss ITTerminal (Dual Interface –vtable + IDispatch) implementieren.
Das Terminal muss eine BSTR-Darstellung einer von Ihnen ausgewählten GUID zurückgeben, die Ihren Terminaltyp identifiziert. Ordnen Sie den BSTR über SysAllocString zu. Um von GUID in BSTR zu konvertieren, rufen Sie StringFromCLSID, SysAllocString und CoTaskMemFree auf.
Das Terminal sollte in der Regel TT_DYNAMIC zurückgeben, wenn eine Anwendung das Terminal implementiert. Das Zurückgeben TT_STATIC funktioniert ebenfalls, und die Rückgabe dieses Werts kann angemessen sein, wenn das Terminal einem Hardwaregerät entspricht. Dies kann jedoch für Benutzer verwirrend sein, da in der statischen Terminalaufzählung des MSP kein statisches Terminal vorhanden ist.
Wenn die Terminalimplementierung die Anzahl von Streams, mit denen das Terminal gleichzeitig verbunden werden kann, nicht willkürlich einschränkt, sollte das Terminal immer TS_NOTINUSE zurückgeben.
Andernfalls schränkt die Terminalimplementierung willkürlich die Anzahl von Streams ein, mit denen das Terminal gleichzeitig verbunden werden kann. In diesem Fall sollte das Terminal eine Anzahl der Datenströme beibehalten, mit der es verbunden ist. Das Terminal sollte diese interne Anzahl für einen erfolgreichen ITTerminalControl::ConnectTerminal-Aufruf erhöhen und bei einem erfolgreichen ITTerminalControl::D isconnectTerminal-Aufruf erhöhen. In ITTerminal::get_State sollte TS_INUSE zurückgegeben werden, wenn diese Anzahl der maximalen Anzahl von Streams entspricht, für die das Terminal gleichzeitig ausgewählt werden kann; andernfalls sollte TS_NOTINUSE zurückgegeben werden. Beachten Sie, dass die Anzahl, wenn das Limit 1 ist, einfach ein boolescher oder ein TERMINAL_STATE-Wert sein kann.
Das Terminal sollte einen BSTR-Namen seiner Wahl zurückgeben, der über SysAllocString zugewiesen 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 Brücke), muss es TD_BIDIRECTIONAL zurückgeben.
Das Terminal muss ITTerminalControl (nur vtable) implementieren.
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 dem angegebenen Diagramm seine Filter hinzu und verbindet sie ggf. miteinander. Anschließend sollte das Terminal die vom Terminal verfügbar gemachten Pins für die angegebene Streamrichtung zurückgeben.
Ein Terminal, das die gleichzeitige Verbindung mit mehreren Datenströmen nicht unterstützt, würde eine interne Variable auf TS_INUSE festlegen, wenn diese Methode erfolgreich abgeschlossen wurde.
Das Terminal kann den dwTerminalDirection-Parameter aus diesem Aufruf verwenden, um die Richtung des Datenstroms zu bestimmen, mit dem es verbunden 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 mehr als einen Pin von einem einzelnen ConnectTerminal-Aufruf zurückgibt. Dies ist in Ordnung, da ein Terminal, das während der Verbindung mehr als einen Pin zurückgibt, erfordert, dass der MSP über spezielle Kenntnisse des Terminals verfügt, um die zusätzlichen Pins effektiv zu nutzen.
ITTerminalControl::CompleteConnectTerminal
Das Terminal sollte nur S_OK zurückgeben. Das Terminal kann bei Bedarf auch die 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 besteht dies darin, alle Filter der Terminals aus dem Diagramm zu entfernen und den Terminalstatus auf TS_NOTINUSE festzulegen.
ITTerminalControl::RunRenderFilter
Das Terminal sollte einfach E_NOTIMPL zurückgeben.
ITTerminalControl::StopRenderFilter
Das Terminal sollte einfach E_NOTIMPL zurückgeben.