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 を使ってみる – すらりん日記 […]