前回はジャック情報を取得しました。今回はオーディオの各ユニットの接続状況を取得するプログラムを書いてみました。
各ユニットへのIN/OUTの情報をコンソールに出力します。
前回のプログラムを利用し、IPartインターフェースを取得できたところから、接続状況をたどっていきます。
void CheckIPart( IPart* pPart ) { LPWSTR pwszPartName = NULL; IPartsList* pOutGoingParts = NULL; IPartsList* pIncomingParts = NULL; pPart->GetName( &pwszPartName ); pPart->EnumPartsOutgoing( &pOutGoingParts ); pPart->EnumPartsIncoming( &pIncomingParts ); printf( "%ws : \n", pwszPartName ); if( pOutGoingParts ) { DispOutgoing( pOutGoingParts ); } if( pInComingParts ) { DispInComing( pInComingParts ); } /* より入力元の情報へたどる */ UINT nPartsCount = 0; if( pIncomingParts ) { pIncomingParts->GetCount( &nPartsCount ); for( UINT i = 0; i < nPartsCount; ++i ) { IPart* p; pIncomingParts->GetPart( i, &p ); CheckIPart( p ); } } CoTaskMemFree( pwszPartName ); }
このようなコードで、現在のIPartに対して、入力・出力のIPartListを取得し、接続状況を調査します。
入力も出力も情報そのものは同じなので、入力部分のコードだけ下記に示します。
void DispInComing( IPart* pInComingPart ) { UINT nNumParts = 0; pInComingPart->GetCount( &nNumParts ); if( nNumParts > 0 ) { printf( " InComingPart(s)\n" ); } for( UINT i = 0; i < nNumParts; ++i ) { IPart* pConnPart = NULL; pInComingParts->GetPart( i, &pConnPart ); if( pConnPart ) { LPWSTR pwszName = NULL; pConnPart->GetName( &pwszName ); printf( " [%d] : %ws\n", i, pwszName ); /* もっと情報が必要ならここで取得&表示する */ } } }
情報取得の部分では、名前しか今は取得していないですが、接続の情報や処理ユニットのGUIDとか色々ととれる情報があるようです。