本サイトでは、アフィリエイト広告およびGoogleアドセンスを利用しています。

DeviceTopology API を使ってみる

Windows Core Audio APIの1部である DeviceTopology APIを使って、ジャック情報を表示するプログラムを作ってみました。
デフォルトの出力先としているデバイスのジャック情報をコンソールに出力します。

ジャックの情報はスピーカーのプロパティ等で確認することができます。

この情報をプログラム中で取得、表示ということをします。

デフォルトの出力先デバイス(IMMDeviceインターフェース)は取得できているとして、
これから IDeviceToplogyを取得し、そこに接続情報を示す IConnector インターフェースを取得します。

IDeviceTopology* pDeviceTopology = NULL;
pCurrentDevice->Activate( __uuidof(IDeviceTopology), CLSCTX_INPROC_SERVER, NULL, (void**)&pDeviceTopology );
IConnector* pConnEP = NULL;
pDeviceTopology->GetConnector( 0, &pConnEP );

そしてさらにこのコネクタに接続しているコネクタを取得します。

IConnector* pConnDeviceTo;
pConnEP->GetConnectedTo( &pConnDeviceTo );

この IConnector は、コンポーネント間の接続を表現するインターフェースです。
ジャックや各処理ユニットの接続状況がこのインターフェースを用いることで調べることが出来るようです。

そして、1処理ユニットを示すインターフェースが IPart となるようなので、これを IConnector より取得します。
取得するメソッドが見つからないので、COMコンポーネントのおきまりのQueryInterfaceで取り出しています。

IPart* pPart = NULL;
pConnDeviceTo->QueryInterface( __uuidof(IPart), (void**)&pPart );

ここまで取り出しが終わったら、 IKsJackDescription インターフェースを取得して、ジャック情報構造体を取得します。
取得したら各メンバについて表示を行っています。表示を行う関数については省略します。

IKsJackDescription* pJackDesc = NULL;
pPart->Activate( CLSCTX_INPROC_SERVER, __uuidof(IKsJackDescription), (void**)&pJackDesc );
if( pJackDesc ) {
  UINT nNumJacks = 0;
  pJackDesc->GetJackCount( &nNumJacks );
  for( UINT i = 0; i < nNumJacks; ++i ) {
    KSJACK_DESCRIPTION desc;
    pJackDesc->GetJackDescription( i, &desc );

    /* 情報表示 */
    DispLocation( desc.GeoLocation );
    printf( "  " );
    DispConnectionType( desc.ConnectionType );
    printf( " : Color( 0x%06X )\n", desc.Color  );
    DispChannelMapping( desc.ChannelMapping );
    }
}

今回作成したプログラム実行体をおいておきます。dispJackInfo

プログラミング
すらりんをフォローする
すらりん日記

コメント

  1. […] DeviceTopology API を使ってみる – すらりん日記 […]

タイトルとURLをコピーしました