マイク配列ジオメトリのプロパティ
Windows Vista 以降では、マイク配列のサポートが提供されます。 ほとんどの場合、ラップトップまたはモニターに組み込まれた 1 つのマイクでは、音声をうまく捉えることができません。 マイクの配列は、音源を分離し、周囲のノイズと残響を拒否するためにより良いパフォーマンスを発揮します。 KSPROPERTY_AUDIO_MIC_ARRAY_GEOMETRY プロパティは、マイク アレイのジオメトリを指定します。 プロパティ値 KSAUDIO_MIC_ARRAY_GEOMETRY、配列の種類 (線形、平面など)、配列内のマイクの数、およびその他の特徴を表します。
このトピックでは、Windows Vista で提供されるマイク配列のサポートを外部 USB マイク配列で使用する方法について説明します。 外部 USB マイク配列は、GET_MEM 要求に応じて、配列のジオメトリとその他の機能を記述するために必要なパラメーターを提供する必要があります。
USB マイク配列は、標準形式を使用してジオメトリ情報を提供します。 Windows Vista USB オーディオ クラス ドライバーは、ジオメトリ情報を読み取るときに同じ形式を使用する必要があります。 標準形式の詳細については、「マイク アレイ ジオメトリ記述子の形式」を参照してください。
アプリケーションは IPart::GetSubType を呼び出してジャックに関する情報を取得し、ジャックに接続されているデバイスがマイク配列であるかどうかを判断できます。 IPart::GetSubType は、入力ジャックの種類を表すピン カテゴリ GUID を返します。 接続されているデバイスがマイク配列の場合、返される GUID はKSNODETYPE_MICROPHONE_ARRAYと等しくなります。 アプリケーションは、マイク配列を間違ったジャックに接続したかどうかを判断するのにも役立ちます。 後者のシナリオでは、返される pin カテゴリ GUID は、別のデバイス用であるか、マイク ジャックに接続されているデバイスがないことを示します。 ピン カテゴリ GUID の詳細については、「ピン カテゴリ プロパティ」を参照してください。
アプリケーションが正しい入力ジャックに接続されているマイク配列を検出した後、次の手順は、配列のジオメトリを決定することです。 基本的なジオメトリは 3 つあります:直線、平面、三次元 (3-D)。 ジオメトリ情報は、各マイクの周波数範囲や x-y-z 座標などの詳細も提供します。
次のコード例は、オーディオ ドライバーが外部 USB マイク配列を記述するために使用するKSAUDIO_MIC_ARRAY_GEOMETRY構造を示しています。
KSAUDIO_MIC_ARRAY_GEOMETRY mic_Array =
{
0x100,// usVersion (1.0)
KSMICARRAY_MICARRAYTYPE_LINEAR,// usMicArrayType
7854, // wVerticalAngleBegin (45 deg; PI/4 radians x 10000)
-7854, // wVerticalAngleEnd
0, // lHorizontalAngleBegin
0, // lHorizontalAngleEnd
25, // usFrequencyBandLo in Hz
19500, // usFrequencyBandHi in Hz
2, // usNumberOfMicrophones
ar_mic_Coordinates // KsMicCoord
};
前のコード例では、ar_mic_Coordinates変数はKSAUDIO_MICROPHONE_COORDINATES構造体の配列であり、マイク配列内のマイクの座標が含まれています。
次のコード例は、前のコード例で説明したように、ar_mic_Coordinates配列を使用して、マイク配列内のマイクの幾何学的位置を記述する方法を示しています。
KsMicCoord ar_mic_Coordinates[] =
{
// Array microphone 1
{
KSMICARRAY_MICTYPE_CARDIOID,// usType
100, // wXCoord (mic elements are 200 mm apart)
0,// wYCoord
0, // wZCoord
0,// wVerticalAngle
0,// wHorizontalAngle
},
// Array microphone 2
{
KSMICARRAY_MICTYPE_CARDIOID,// usType
-100, // wXCoord
0,// wYCoord
0, // wZCoord
0,// wVerticalAngle
0,// wHorizontalAngle
}
};
前のコード例では、x-y-z 座標は、マイク配列内の各マイクに対して、有効な作業領域を表す垂直方向と水平方向の角度と共に指定されています。
仮想マイク配列の配列ジオメトリ情報を提供するように Micarray MSVAD サンプル ドライバーを変更するには、次のタスクを実行する必要があります。
まず、Src\Audio\Msvad\Micarray に移動し、Mintopo.cpp ファイルを見つけます。 KSAUDIO_MIC_ARRAY_GEOMETRY構造体にマイク配列に関する情報が含まれるように、Mintopo.cppのプロパティ ハンドラー セクションを編集します。 変更する必要があるコードの特定のセクションを次のコード例に示します。
// Modify this portion of PropertyHandlerMicArrayGeometry
PKSAUDIO_MIC_ARRAY_GEOMETRY pMAG = (PKSAUDIO_MIC_ARRAY_GEOMETRY)PropertyRequest->Value;
// fill in mic array geometry fields
pMAG->usVersion = 0x0100; // Version of Mic array specification (0x0100)
pMAG->usMicArrayType = (USHORT)KSMICARRAY_MICARRAYTYPE_LINEAR; // Type of Mic Array
pMAG->wVerticalAngleBegin = -7854; // Work Volume Vertical Angle Begin (-45 degrees)
pMAG->wVerticalAngleEnd = 7854; // Work Volume Vertical Angle End (+45 degrees)
pMAG->wHorizontalAngleBegin = 0; // Work Volume Horizontal Angle Begin
pMAG->wHorizontalAngleEnd = 0; // Work Volume Horizontal Angle End
pMAG->usFrequencyBandLo = 100; // Low end of Freq Range
pMAG->usFrequencyBandHi = 8000; // High end of Freq Range
pMAG->usNumberOfMicrophones = 2; // Count of microphone coordinate structures to follow.
pMAG->KsMicCoord[0].usType = (USHORT)KSMICARRAY_MICTYPE_CARDIOID;
pMAG->KsMicCoord[0].wXCoord = -100; // mic elements are 200 mm apart
pMAG->KsMicCoord[0].wYCoord = 0;
pMAG->KsMicCoord[0].wZCoord = 0;
pMAG->KsMicCoord[0].wVerticalAngle = 0;
pMAG->KsMicCoord[0].wHorizontalAngle = 0;
pMAG->KsMicCoord[1].usType = (USHORT)KSMICARRAY_MICTYPE_CARDIOID;
pMAG->KsMicCoord[1].wXCoord = 100; // mic elements are 200 mm apart
pMAG->KsMicCoord[1].wYCoord = 0;
pMAG->KsMicCoord[1].wZCoord = 0;
pMAG->KsMicCoord[1].wVerticalAngle = 0;
pMAG->KsMicCoord[1].wHorizontalAngle = 0;
前述のコード例は、それぞれがカーディオイド型でアレイの中心から 100 mm の位置にある 2 つのマイク要素を持つリニア マイク アレイに対して提供された情報を示しています。
マイク配列を検出するアプリケーションを開発する方法については、Windows Vista 用のマイク配列をビルドして使用する方法 の付録 C を参照してください。