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

コメント
[…] DeviceTopology API を使ってみる – すらりん日記 […]