Esecuzione di comandi AV/C non elaborati

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Le interfacce IAMExtDevice, IAMExtTransport e IAMTimecodeReader funzionano convertendo le chiamate al metodo in comandi per il driver, quindi interpretando la risposta del driver e restituendola tramite un HRESULT o un parametro di output. Tuttavia, alcune funzioni del dispositivo potrebbero non essere accessibili tramite questi metodi. PERTANTO, MSDV supporta l'invio di comandi AV/C non elaborati al dispositivo.

Quando si usa questa funzionalità, tenere presente quanto segue:

  • Il comando viene passato direttamente al dispositivo, senza controllo degli errori o convalida dei parametri. Per questo motivo, è consigliabile eseguire comandi AV/C non elaborati solo quando le interfacce DirectShow non implementano la funzionalità necessaria.
  • Tutti i comandi AV/C non elaborati sono sincroni. Il thread che esegue il comando si blocca fino a quando il comando non restituisce.
  • È possibile mandare un solo comando alla volta. Durante l'elaborazione del comando, il dispositivo rifiuterà eventuali comandi aggiuntivi.
  • Il driver UVC non supporta i comandi AV/C non elaborati.

Per inviare un comando AV/C, formattare il comando come matrice di byte. Chiama quindi IAMExtTransport::GetTransportBasicParameters. Passare il flag ED_RAW_EXT_DEV_CMD, le dimensioni della matrice e la matrice. È necessario eseguire il cast dell'indirizzo della matrice in un tipo LPOLESTR* , perché lo scopo originale di questo parametro era quello di restituire un valore stringa.

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

Il contenuto della matrice viene passato direttamente al dispositivo, quindi è necessario prestare attenzione a formattarlo correttamente. Un comando può indirizzare l'unità (unità) o una subunit (nastro o fotocamera). Gli standard pertinenti sono disponibili nel sito Web 1394 Trade Association.

  • Specifica generale del set di comandi dell'interfaccia digitale AV/C
  • Specifica del registratore nastro AV/C/Player Subunit

Il primo descrive come formattare i comandi AV/C ed elenca i comandi dell'unità. La seconda specifica elenca i comandi di subunit.

Il metodo GetTransportBasicParameters può restituire uno dei codici di errore seguenti:

Codice di errore Descrizione
ERROR_TIMEOUT Timeout del comando.
ERROR_REQ_NOT_ACCEP Il dispositivo non ha accettato il comando.
ERROR_NOT_SUPPORTED Il dispositivo non supporta il comando .
ERROR_REQUEST_ABORTED Il comando è stato interrotto. Possbly il dispositivo è stato rimosso o si è verificato un ripristino del bus.

 

Nota

Questi errori vengono restituiti come codici di errore Win32, non HRESULT, pertanto è consigliabile verificare direttamente questi valori anziché usare le macro SUCCEEDED e FAILED .

 

Se il metodo restituisce S_OK, la risposta dal dispositivo viene copiata nella matrice. Il payload della risposta potrebbe essere maggiore del comando, quindi è necessario allocare un buffer di dimensioni sufficienti per tenerlo. La dimensione massima del payload è di 512 byte. Si noti che un valore restituito di S_OK non sempre significa che il dispositivo ha eseguito correttamente il comando. L'applicazione deve esaminare il payload della risposta per determinare lo stato.

L'esempio seguente mostra il comando per cercare una ricerca di numeri di traccia assoluta:

// 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);

Controllo di un DV Dv