Émission de commandes AV/C brutes

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Les interfaces IAMExtDevice, IAMExtTransport et IAMTimecodeReader fonctionnent en traduisant les appels de méthode en commandes pour le pilote, puis en interprétant la réponse du pilote et en la renvoyant via un HRESULT ou un paramètre de sortie. Toutefois, certaines fonctions d’appareil peuvent ne pas être accessibles via ces méthodes. Par conséquent, MSDV prend en charge l’envoi de commandes AV/C brutes à l’appareil.

Vous devez garder à l’esprit les points suivants lors de l’utilisation de cette fonctionnalité :

  • La commande est transmise directement à l’appareil, sans vérification des erreurs ni validation des paramètres. Pour cette raison, vous devez émettre des commandes AV/C brutes uniquement lorsque les interfaces DirectShow n’implémentent pas les fonctionnalités dont vous avez besoin.
  • Toutes les commandes AV/C brutes sont synchrones. Le thread qui émet la commande bloque jusqu’à ce que la commande retourne.
  • Une seule commande peut être donnée à la fois. Pendant le traitement de la commande, l’appareil rejette toutes les commandes supplémentaires.
  • Le pilote UVC ne prend pas en charge les commandes AV/C brutes.

Pour envoyer une commande AV/C, mettez la commande en forme sous la forme d’un tableau d’octets. Appelez ensuite IAMExtTransport::GetTransportBasicParameters. Transmettez l’indicateur ED_RAW_EXT_DEV_CMD, la taille du tableau et le tableau. Vous devez caster l’adresse du tableau en type LPOLESTR* , car l’objectif d’origine de ce paramètre était de renvoyer une valeur de chaîne.

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

Le contenu du tableau étant transmis directement à l’appareil, vous devez veiller à le mettre en forme correctement. Une commande peut cibler l’unité (caméscope) ou une sous-unité (bande ou caméra). Les normes pertinentes sont disponibles sur le site Web de la 1394 Trade Association.

  • Spécification générale de l’ensemble de commandes d’interface numérique AV/C
  • Spécification de la sous-unité de lecteur/enregistreur de bande AV/C

Le premier décrit comment mettre en forme les commandes AV/C et répertorie les commandes d’unité. Cette dernière spécification répertorie les commandes de sous-unité.

La méthode GetTransportBasicParameters peut retourner l’un des codes d’erreur suivants :

Code d'erreur Description
ERROR_TIMEOUT La commande a expiré.
ERROR_REQ_NOT_ACCEP L’appareil n’a pas accepté la commande.
ERROR_NOT_SUPPORTED L’appareil ne prend pas en charge la commande.
ERROR_REQUEST_ABORTED La commande a été abandonnée. Il est possible que l’appareil ait été supprimé ou qu’une réinitialisation du bus s’est produite.

 

Notes

Ces erreurs sont retournées sous forme de codes d’erreur Win32, et non de HRESULT. Vous devez donc tester ces valeurs directement, plutôt que d’utiliser les macros SUCCEEDED et FAILED .

 

Si la méthode retourne S_OK, la réponse de l’appareil est copiée dans le tableau. La charge utile de réponse pouvant être supérieure à la commande, vous devez allouer une mémoire tampon suffisamment grande pour la contenir. La taille maximale de la charge utile est de 512 octets. Notez qu’une valeur de retour de S_OK ne signifie pas toujours que l’appareil a correctement exécuté la commande. L’application doit examiner la charge utile de réponse pour déterminer le status.

L’exemple suivant montre la commande permettant de rechercher une recherche de numéro de piste absolue :

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

Contrôle d’un caméscope DV