ロー AV/C コマンドの発行
IAMExtDevice インターフェイス、IAMExtTransport インターフェイス、IAMTimecodeReader インターフェイスの処理内容は、メソッド呼び出しをドライバ用のコマンドに変換し、ドライバの応答を解釈し、その応答を HRESULT または出力パラメータを介して返すことである。ただし、デバイス関数の中にはこれらのメソッドからはアクセスできないものもある。したがって、MSDV は IAMExtTransport::GetTransportBasicParameters メソッドを使って、デバイスへのロー AV/C コマンドの送信をサポートしている。
この機能を使う際は、以下の点に注意すること。
- コマンドは、エラー チェックやパラメータの検証なしに、デバイスに直接渡される。このため、DirectShow インターフェイスが必要な機能を実装していない場合に限って、ロー AV/C コマンドを発行すること。
- すべてのロー AV/C コマンドは同期をとっている。コマンドを発行するスレッドは、コマンドから制御が返されるまで動作を停止する。
- 一度に指定できるコマンドは 1 つのみである。コマンドの処理中は、デバイスは追加コマンドは拒否する。
AV/C コマンドを送信するには、コマンドのフォーマットをバイト配列として設定する。次に、GetTransportBasicParameters メソッドを呼び出して、ED_RAW_EXT_DEV_CMD フラグ、配列サイズ、配列を渡す。配列のアドレスを LPOLESTR* 型にキャストする必要がある。なぜなら、このパラメータの本来の目的は文字列型の値を返すことだったからである。
BYTE AvcCmd[] = { ... }; // AV/C コマンドを含む (省略)。
long cbCmd = sizeof(AvcCmd);
hr = pTransport->GetTransportBasicParameters(
ED_RAW_EXT_DEV_CMD,
&cbCmd,
(LPOLESTR*) AvcCmd);
配列の内容はデバイスに直接渡されるので、フォーマットを正しく設定するように注意すること。コマンドは、対象としてユニット (カムコーダ) またはサブユニット (テープまたはカメラ) を指定できる。適切な規格は、1394 Trade Association Web サイトから入手可能である。
- AV/C Digital Interface Command Set General Specification
- AV/C Tape Recorder/Player Subunit Specification
前者は、AV/C コマンドのフォーマットを設定する方法を説明し、ユニット コマンドの一覧を記載している。後者の仕様は、サブユニット コマンドの一覧を記載している。
GetTransportBasicParameters メソッドは、以下のいずれかのエラー コードを返す場合がある。
エラー コード | 説明 |
ERROR_TIMEOUT | コマンドのタイム アウト。 |
ERROR_REQ_NOT_ACCEP | デバイスがコマンドを受け付けなかった。 |
ERROR_NOT_SUPPORTED | デバイスがコマンドをサポートしていない。 |
ERROR_REQUEST_ABORTED | コマンドが中止された。デバイスが取り外されたか、バスがリセットされた可能性がある。 |
注 : これらのエラーは、HRESULT ではなく Win32 エラー コードとして返される。したがって、SUCCEEDED マクロや FAILED マクロを使うのではなく、これらの値を直接テストする必要がある。
メソッドから S_OK が返されると、デバイスの応答が配列内にコピーされる。応答ペイロードはコマンドよりも大きい場合があるので、その応答ペイロードを十分保持できるだけのバッファを割り当てる必要がある。ペイロードの最大サイズは 512 バイトである。S_OK の戻り値は必ずしも常に、デバイスがコマンドの実行に成功したことを意味するわけではない点に注意すること。アプリケーション側が応答ペイロードを調べて、状態を判断する必要がある。
次の例は、絶対トラック番号を検索するコマンドを示したものである。
// ATN 検索コマンドをセットアップする。
BYTE AvcCmd[] =
{
0x00, // ctype = "control"
0x20, // subunit_type、subunit_id
0x52, // オペコード (ATN)
0x20, // 演算子 0 = "search"
0x00, // 演算子1 = ATN
0x00, // 演算子2 = ATN
0x00, // 演算子3 = ATN
0xFF // 演算子4 = D-VCR メディア タイプ
};
// トラック番号を指定する。
ULONG ulTrackNumber = track_number; // ここでトラック番号を指定する。
// 1 だけシフトする (演算子1 の LSB は 1 ビットのブランク フラグである)。
ulTrackNumber = ulTrackNumber << 1;
// この番号を演算子1 ~ 3 に代入する。
AvcCmd[4] = (BYTE) (ulTrackNumber & 0x000000FF);
AvcCmd[5] = (BYTE)((ulTrackNumber & 0x0000FF00) >> 8);
AvcCmd[6] = (BYTE)((ulTrackNumber & 0x00FF0000) >> 16);