次の方法で共有


HFP デバイスの起動

この記事では、Bluetoothハンズフリー プロファイル (HFP) デバイスがオーディオ システムに到着するプロセスについて説明します。

オーディオ システムに到着するペアリングされた HFP デバイスごとに、Windows HFP ドライバーはデバイス インターフェイスを GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS クラスに登録します。 オーディオ ドライバーは、デバイス インターフェイス通知を使用して、GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS インターフェイスのすべてのインスタンスに関する情報を常に把握します。 オーディオ ドライバーは、AVStrMiniDevicePostStart ドライバー ルーチン内から (または同等の Portcls ルーチンから) IoRegisterPlugPlayNotification を呼び出して、現在インストールされている HFP デバイスを検出し、新しい HFP デバイスの通知を受け取るコールバックを登録します。

オーディオ ドライバーが IoRegisterPlugPlayNotification を呼び出すと、次のパラメーターを使用して呼び出しが行われます。

  • EventCategory は EventCategoryDeviceInterfaceChange に設定されます。
  • EventCategoryFlags は、通常、既存のインターフェイスの即時通知を受信するためにPNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACESに設定されます。 ただし、一部の代替オーディオ ドライバー設計では、他の方法で既存のインターフェイスが見つかる場合があります。
  • EventCategoryData はGUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASSに設定されています。
  • DriverObject はオーディオ ドライバーの DriverObject に設定されます。
  • CallbackRoutine は、通知を受信するオーディオ ドライバーのルーチンに設定されます。

次のセクションでは、ペアリングされた HFP デバイスの登録済みインスタンスごとにオーディオ ドライバーが実行できるタスクについて説明します。

インターフェイス インスタンスの処理

GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS クラスに登録されているインターフェイス インスタンスごとに、オーディオ ドライバーは通信に次のプロトコルを使用する必要があります。

  • オーディオ ドライバーが IoRegisterPlugPlayNotification を呼び出す際に登録したコールバック ルーチンを Windows が呼び出すとき、Windows は DEVICE_INTERFACE_CHANGE_NOTIFICATION を使用して HFP インターフェースのシンボリックリンクSymbolicLinkNameを渡します。
  • オーディオ ドライバーが IoGetDeviceObjectPointer を呼び出すと、ドライバーはシンボリック リンクを使用して HFP FileObject と HFP デバイスの DeviceObject を取得します。
  • オーディオ ドライバーが HFP ドライバーに IOCTL を送信すると、ドライバーは HFP デバイスの HFP FileObject と DeviceObject を使用します。

静的な情報の取得

オーディオ ドライバーは、HFP ドライバーから静的な情報を取得できます。 たとえば、HFP ドライバーは、ksnodetype、コンテナー ID、およびペアの HFP デバイスのフレンドリ名を指定できます。 オーディオ ドライバーは、この情報を使用して、ペアの HFP デバイスを表す KS フィルターまたはフィルターを作成および初期化できます。 オーディオ ドライバーは 、この情報を 取得するためにIOCTL_BTHHFP_DEVICE_GET_DESCRIPTORを使用します。

オーディオ ドライバーは、ペアリングされた HFP デバイスのBluetooth アドレスを取得することもできます。 ペアリングされた各 HFP デバイスには一意のBluetooth アドレスがあり、一意の識別子文字列として役立ちます。 詳細については、「 HF デバイスのBluetoothアドレスの取得」を参照してください。

オーディオ固有のフィルター ファクトリ コンテキストの作成、初期化

オーディオ固有のフィルター ファクトリ コンテキストを作成して初期化するには、オーディオ ドライバーが HFP DeviceObject と HFP FileObject をフィルター ファクトリ コンテキストに格納し、IsConnected フィールドを false に初期化する必要があります。

KSフィルターファクトリーの作成

GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS インターフェイス クラスの各デバイス インスタンスに対して、オーディオ ドライバーによって 1 つ以上のフィルター ファクトリが作成され、有効になります。

オーディオ ドライバーが AVStream ドライバーの場合、オーディオ ドライバーは KsCreateFilterFactory を呼び出して新しいフィルター ファクトリを追加し、KsFilterFactorySetDeviceClassesState を呼び出してファクトリを有効にします。 オーディオ ドライバーが PortCls ドライバーの場合は、PcRegisterSubdevice を呼び出して KS フィルター ファクトリを間接的に作成して有効にします。 多くの PortCls オーディオ ドライバー設計では、特定のペアリングされた HFP デバイスに 2 つのサブデバイスが登録されています。

各フィルター ファクトリ (または PortCls オーディオ ドライバーの場合、フィルター ファクトリの各ペア) は、1 つのペアの HFP デバイスのオーディオ機能を表します。 オーディオ ドライバーは、GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS インターフェイスの一意のインスタンスで表される、ペアリングされた HFP デバイスごとに個別のフィルター ファクトリを作成します。 ペアリングされた HFP デバイスごとに、オーディオ ドライバーは KsCreateFilterFactory の RefString パラメーターまたは PcRegisterSubdevice の Name パラメーターに一意の文字列を使用する必要があります。 ドライバー開発者は、ペアの HFP デバイスの Bluetooth アドレス文字列を一意の文字列として使用すると便利な場合があります。 一意のストリング を取得する方法については、HF 装置のBluetooth・アドレス の取得を参照してください。

可能なペアリングされた HFP デバイスの最大数は特定されないため、オーディオ ドライバーはハード コーディング固有の制限を回避する必要があります。 代わりに、オーディオ ドライバーは、複数のGUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS インターフェイスの動的到着と削除を正しく処理する必要があります。

ただし、実際には、PortCls ドライバーは、PcAddAdapterDevice を呼び出すときに、サブデバイスの最大数を指定する必要があります。 PcAddAdapterDevice は、潜在的なサブデバイスごとに追加のメモリを事前に割り当てます。 オーディオ ドライバーの開発者は、多数のペアリングされたデバイスを収容するのに十分な高さの数値を選択する必要がありますが、同時にリソースの無駄にならない数値を選択してください。 たとえば、2 台の HFP デバイスのみをサポートすると不十分な場合があり、2,000 台をサポートすると、リソースが過剰になる可能性があります。 ただし、16 のサポートを提供することは、合理的であると考えられます。

実行時にオーディオ ドライバーに別のGUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS インターフェイスの通知を受け取ったが、サブデバイスの最大数が既に登録されている場合、オーディオ ドライバーは、いくつかのアルゴリズムを呼び出して、新しい HFP デバイス用のスペースを作るために登録解除できるサブデバイスを持つ、ペアリングされた HFP デバイスを選択できます。 たとえば、オーディオ ドライバーは、最も古い接続で HFP デバイスを追跡できます。 よりシンプルですが、おそらくユーザーフレンドリーではないオーディオドライバーが、その最大値に達した後は、追加のGUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASSインターフェイスを無視することもできます。

接続状態取得のためのIOCTLの送信

オーディオ ドライバーは、接続状態の取得 IOCTL を送信して、接続で発生したすべての変更に関する情報を取得します。

ボリュームの状態を取得する IOCTL を送信する

オーディオ ドライバーは、ヘッドセットのボリュームの状態で発生したボリューム レベルの変更に関する情報を取得するボリュームの状態の取得 IOCTL を送信します。