Freigeben über


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.

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 SysAllocString zu. Um von GUID in BSTR zu konvertieren, rufen Sie StringFromCLSID, SysAllocString und CoTaskMemFree auf.

ITTerminal::get_TerminalType

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.

ITTerminal::get_State

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.

ITTerminal::get_Name

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.

ITTerminal::get_MediaType

Das Terminal sollte seinen Medientyp zurückgeben, entweder TAPIMEDIATYPE_AUDIO oder TAPIMEDIATYPE_VIDEO.

ITTerminal::get_Direction

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.