VCD Propertiesの基本的な使用法

ここではVCDPropertiesの基本的な機能を紹介します。インターフェースを取得し、値やプロパティの自動設定などのエレメントを取得、設定する方法を説明します。

概要

この例では"Gain"プロパティを使ってどのようにプロパティが体系化されているのか、またどのようにアクセスするのかを紹介しています。Gainの値にアクセスするための範囲(range)インターフェースと、Auto Gainのスイッチインターフェースを使用します。

サンプルプログラムのソースコードはサンプルソースディレクトリの%TOPLEVEL%\samples\VC\VCD Simpleにあります。

プロジェクトの作成

今回のサンプルプログラムはダイアログベースのアプリケーションです。プロジェクトの作成方法ははじめに:Visual C++プロジェクトプログラマーズガイド>はじめに:Visual Studio C++で説明している手順にて行ってください。 今回は"シングルドキュメント"ではなく"ダイアログベース"となります。

チェックボックスとスライダをフォーム追加し、チェックボックスにはIDとしてIDC_GAIN_CHECKを、スライダにはIDC_GAIN_SLIDERを与えます。ライブビデオを表示させるにはダイアログに静的テキストコントロールを追加しIDをIDC_DISPLAYとします。

VCDPropertyItemの取得

プロパティは一つかそれ以上のエレメントから構成されています。エレメントには値や自動設定、ワンプッシュ動作、その他のパラメータがあります。プロパティの調整をするのにインターフェースが使われます。

ここでは、Gainの値とその自動設定のインターフェースを取得するためにCVCDSimpleDlgクラスに2つのメンバ変数を追加します。

DShowLib::tIVCDRangePropertyPtr    m_pGainRange;
DShowLib::tIVCDSwitchPropertyPtr    m_pGainAuto;

ビデオデバイスが選択された後、ゲインの値とその自動インターフェースの為のプロパティインターフェースを取得します。これは、OnInitDialogにコールされるInitPropertyControlsメソッドで実行されます。

m_pGainRange = m_Grabber.getVCDPropertyInterface<IVCDRangeProperty>( VCDID_Gain, VCDElement_Value );
m_pGainAuto = m_Grabber.getVCDPropertyInterface<IVCDRangeProperty>( VCDID_Gain, VCDElement_Auto );
if( m_pGainAuto != NULL )
{
    m_pGainAuto->setSwitch( false );
}

Graber::getVCDPropertyInterfaceクラスライブラリリファレンス>クラス>Grabber>Grabber::getVCDPropertyInterface Methodメソッドを使用してインターフェースを取得します。引数templateにインターフェースの種類を指定し、パラメータにはインターフェースが返されるプロパティを指定します。

この例では、VCDID_GainとVCDElement_Valueを引き渡し、IVCDRangePropertyクラスライブラリリファレンス>クラス>IVCDRangePropertyインターフェースに Gain値を取得します。次にVCDID_GainとVCDElement_Autoを渡すことでIVCDSwitchPropertyクラスライブラリリファレンス>クラス>IVCDSwitchPropertyインターフェースにゲインの自動機能を取得しています。

デバイスによって利用できるアイテムは異なりますが、このプロパティで利用可能な機能の一はStandard Property Item GUIDsクラスライブラリリファレンス>定数>Standard Property Item GUIDs (標準プロパティ項目GUID)Standard Element GUIDsクラスライブラリリファレンス>定数>Standard Element GUIDs (標準エレメントGUID)を参照してください。

インターフェースの呼び出しとコントロールの初期化

インターフェースを取得した後、ユーザーコントロールを初期化します。その方法は次の通りです。

// Gain値のインターフェースが取得できたかをチェック
if( m_pGainRange != NULL )
{
    m_GainSlider.EnableWindow();
    // スライダーの範囲を設定する
    int delta = m_pGainRange->getDelta();
    m_GainSlider.SetRangeMin( m_pGainRange->getRangeMin() / delta );
    m_GainSlider.SetRangeMax( m_pGainRange->getRangeMax() / delta );
    // スライダーのポジションをセット
    m_GainSlider.SetPos( m_pGainRange->getValue() / delta );
}
else
{
    m_GainSlider.EnableWindow( FALSE );
}
// Gainの自動スイッチインターフェースが取得できたかをチェック
if( m_pGainAuto != NULL )
{
    m_GainAutoCheck.EnableWindow();
    m_GainAutoCheck.SetCheck( m_pGainAuto->getSwitch() );
}
else
{
    m_GainAutoCheck.EnableWindow( FALSE );
}

インターフェースクラスがプロパティ項目の要素へのアクセスを容易にしています。

プロパティエレメントの調整

最後に、インターフェースを使ってプロパティの調整を行います。チェック ボックスのClickイベントとWM_HSCROLLメッセージのハンドラを追加します。チェックボックスは"Gain" プロパティの自動設定の切換えを行います。コードは以下のようになります。

if( m_GainAutoCheck.GetCheck() )
{
  m_GainSlider.EnableWindow( FALSE );
  m_pGainAuto->setSwitch( true );
}
else
{
  m_GainSlider.EnableWindow();
  m_pGainAuto->setSwitch( false );
}

上記のコードは単にチェックボックスの状態を"Gain"プロパティの自動設定のエレメントに当てはめただけです。
さらに自動設定が有効である場合、スライダを無効化します。

スライダのScrollイベントのコードはさらにシンプルなものになります。

int delta = m_pGainRange->getDelta();
m_pGainRange->setValue( m_GainSlider.GetPos() * delta ) ;

これで"Gain"プロパティをスライダやチェックボックスを使って調整できるようになります。