Ausstellen von unformatten AV/C-Befehlen

Die Schnittstellen IAMExtDevice, IAMExtTransportund IAMTimecodeReader übersetzen die Methodenaufrufe in Befehle für den Treiber, interpretieren dann die Antwort des Treibers und geben sie über ein HRESULT oder einen Ausgabeparameter zurück. Auf einige Gerätefunktionen kann jedoch möglicherweise nicht über diese Methoden zugegriffen werden. Daher unterstützt MSDV das Senden von unformatierten AV/C-Befehlen an das Gerät.

Beachten Sie bei der Verwendung dieses Features folgende Punkte:

  • Der Befehl wird ohne Fehlerüberprüfung oder Parameterüberprüfung direkt an das Gerät übergeben. Aus diesem Grund sollten Sie UN-AV/C-Befehle nur dann ausführen, wenn die DirectShow-Schnittstellen die von Ihnen benötigten Funktionen nicht implementieren.
  • Alle unformatten AV/C-Befehle sind synchron. Der Thread, der den Befehl ausgibt, wird blockiert, bis der Befehl zurückgegeben wird.
  • Es kann immer nur ein Befehl gleichzeitig angegeben werden. Während der Verarbeitung des Befehls lehnt das Gerät alle zusätzlichen Befehle ab.
  • Der UVC-Treiber unterstützt keine unformatten AV/C-Befehle.

Um einen AV/C-Befehl zu senden, formatieren Sie den Befehl als Bytearray. Rufen Sie dann IAMExtTransport::GetTransportBasicParameters auf. Übergeben Sie das ED _ RAW _ EXT DEV _ _ CMD-Flag, die Arraygröße und das Array. Sie müssen die Arrayadresse in einen * LPOLESTR-Typ castieren, da der ursprüngliche Zweck dieses Parameters das Zurückgeben eines Zeichenfolgenwerts war.

BYTE AvcCmd[] = { ... }; // Contains the AV/C command (not shown)
long cbCmd = sizeof(AvcCmd);
hr = pTransport->GetTransportBasicParameters(
    ED_RAW_EXT_DEV_CMD, 
    &cbCmd,
    (LPOLESTR*) AvcCmd);

Der Inhalt des Arrays wird direkt an das Gerät übergeben, daher müssen Sie darauf achten, es ordnungsgemäß zu formatieren. Ein Befehl kann auf die Einheit (Eineste) oder eine Untereinheit (Band oder Kamera) zielen. Die relevanten Standards sind auf der Website 1394 Trade Association verfügbar.

  • Allgemeine Spezifikation des AV/C Digital Interface-Befehlssets
  • AV/C Tape Recorder/Player Subunit Specification

Im ersten Abschnitt wird beschrieben, wie AV/C-Befehle formatiert werden, und es werden die Einheitenbefehle aufgeführt. Die zweite Spezifikation listet die Untereinheitsbefehle auf.

Die GetTransportBasicParameters-Methode gibt möglicherweise einen der folgenden Fehlercodes zurück:

Fehlercode BESCHREIBUNG
_FEHLERZEITÜBERSCHREITUNG Time out des Befehls.
FEHLER _ REQ _ NOT _ ACCEP Das Gerät hat den Befehl nicht akzeptiert.
FEHLER _ WIRD NICHT _ UNTERSTÜTZT Das Gerät unterstützt den Befehl nicht.
FEHLERANFORDERUNG _ _ ABGEBROCHEN Der Befehl wurde abgebrochen. Es kann sein, dass das Gerät entfernt wurde oder ein Bus zurückgesetzt wurde.

Hinweis

Diese Fehler werden als Win32-Fehlercodes und nicht als HRESULTs zurückgegeben. Daher sollten Sie diese Werte direkt testen, anstatt die Makros SUCCEEDED und FAILED zu verwenden.

Wenn die Methode S OK zurückgibt, wird die Antwort des Geräts _ in das Array kopiert. Die Antwortnutzlast ist möglicherweise größer als der Befehl, daher müssen Sie einen Puffer zuordnen, der groß genug ist, um ihn zu halten. Die maximale Nutzlastgröße beträgt 512 Bytes. Beachten Sie, dass der Rückgabewert S OK nicht immer bedeutet, _ dass das Gerät den Befehl erfolgreich ausgeführt hat. Die Anwendung muss die Antwortnutzlast untersuchen, um den Status zu ermitteln.

Das folgende Beispiel zeigt den Befehl zum Suchen nach einer absoluten Tracknummersuche:

// Set up the ATN search command.
BYTE AvcCmd[] = 
{ 
    0x00,   // ctype = "control"
    0x20,   // subunit_type, subunit_id
    0x52,   // opcode (ATN)
    0x20,   // operand 0 = "search"
    0x00,   // operand 1 = ATN
    0x00,   // operand 2 = ATN
    0x00,   // operand 3 = ATN
    0xFF   //  operand 4 = D-VCR medium type.
};
// Specify a track number.
ULONG ulTrackNumber = track_number; // Specify the track number here.
// Shift over by 1 (LSB of operand 1 is a 1-bit blank flag)
ulTrackNumber = ulTrackNumber << 1; 
// Plug this number into operands 1 - 3.
AvcCmd[4] = (BYTE) (ulTrackNumber & 0x000000FF);
AvcCmd[5] = (BYTE)((ulTrackNumber & 0x0000FF00) >> 8);
AvcCmd[6] = (BYTE)((ulTrackNumber & 0x00FF0000) >> 16);

Steuern eines DV-Dvd