生 AV/C コマンドの発行
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
IAMExtDevice、IAMExtTransport、および IAMTimecodeReader インターフェイスは、メソッド呼び出しをドライバーのコマンドに変換してから、ドライバーの応答を解釈し、HRESULT または出力パラメーターを使用して返すことで機能します。 ただし、一部のデバイス関数には、これらのメソッドを使用してアクセスできない場合があります。 そのため、MSDV では、デバイスへの未加工の AV/C コマンドの送信がサポートされます。
この機能を使用する場合は、次の点に留意する必要があります。
- コマンドは、エラー チェックやパラメーター検証なしで、デバイスに直接渡されます。 このため、DirectShow インターフェイスに必要な機能が実装されていない場合にのみ、生の AV/C コマンドを発行する必要があります。
- 生の AV/C コマンドはすべて同期的です。 コマンドを発行するスレッドは、コマンドが戻るまでブロックします。
- 一度に指定できるコマンドは 1 つだけです。 コマンドの処理中に、デバイスは追加のコマンドを拒否します。
- UVC ドライバーは、生の AV/C コマンドをサポートしていません。
AV/C コマンドを送信するには、コマンドをバイト配列として書式設定します。 次に 、IAMExtTransport::GetTransportBasicParameters を呼び出します。 ED_RAW_EXT_DEV_CMD フラグ、配列サイズ、配列を渡します。 このパラメーターの元の目的は文字列値を返すため、配列アドレスを LPOLESTR* 型にキャストする必要があります。
BYTE AvcCmd[] = { ... }; // Contains the AV/C command (not shown)
long cbCmd = sizeof(AvcCmd);
hr = pTransport->GetTransportBasicParameters(
ED_RAW_EXT_DEV_CMD,
&cbCmd,
(LPOLESTR*) AvcCmd);
配列の内容はデバイスに直接渡されるため、正しく書式設定するように注意する必要があります。 コマンドは、ユニット (ビデオカメラ) またはサブユニット (テープまたはカメラ) をターゲットにすることができます。 関連する標準は 、1394 貿易協会の Web サイトから入手できます。
- AV/C デジタル インターフェイス コマンド セットの一般的な仕様
- AV/C テープ レコーダー/プレーヤー サブユニットの仕様
前者は AV/C コマンドの書式を設定する方法を説明し、ユニット コマンドを一覧表示します。 後者の仕様では、サブユニット コマンドの一覧を示します。
GetTransportBasicParameters メソッドは、次のいずれかのエラー コードを返す場合があります。
エラー コード | 説明 |
---|---|
ERROR_TIMEOUT | コマンドがタイムアウトしました。 |
ERROR_REQ_NOT_ACCEP | デバイスがコマンドを受け入れませんでした。 |
ERROR_NOT_SUPPORTED | デバイスは コマンドをサポートしていません。 |
ERROR_REQUEST_ABORTED | コマンドが中止されました。 デバイスが削除されたか、バスのリセットが発生しました。 |
注意
これらのエラーは HRESULT ではなく Win32 エラー コードとして返されるため、 SUCCEEDED マクロと FAILED マクロを使用するのではなく、これらの値を直接テストする必要があります。
メソッドがS_OKを返す場合、デバイスからの応答が配列にコピーされます。 応答ペイロードはコマンドよりも大きくなる可能性があるため、バッファーを保持するのに十分な大きさのバッファーを割り当てる必要があります。 最大ペイロード サイズは 512 バイトです。 S_OKの戻り値は、必ずしもデバイスがコマンドを正常に実行したことを意味するわけではないことに注意してください。 アプリケーションは、応答ペイロードを調べて状態を確認する必要があります。
次の例は、絶対トラック番号検索を検索するコマンドを示しています。
// 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);
関連トピック