次の方法で共有


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.SymbolicLinkName を使用して HFP インターフェイスのシンボリック リンクを渡します。
  • オーディオ ドライバーが IoGetDeviceObjectPointer を呼び出すと、ドライバーはシンボリック リンクを使用して HFP FileObject と HFP デバイスの DeviceObject を取得します。
  • オーディオ ドライバーが IOCTL を HFP ドライバーに送信するとき、ドライバーは HFP デバイスの HFP FileObject と DeviceObject を使用します。

静的情報の取り出し

オーディオ ドライバーは、HFP ドライバーから静的情報を取り出すことができます。 たとえば、HFP ドライバーは、ペアリングされた HFP デバイスの ksnodetype、コンテナー ID、およびフレンドリ名を提供できます。 オーディオ ドライバーは、この情報を使用して、ペアになった 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 オーディオ ドライバーの場合は、フィルター ファクトリの各ペア) は、ペアになった単一の HFP デバイスのオーディオ機能を表します。 オーディオ ドライバーは、GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS インターフェイスの一意のインスタンスによって表される、ペアになった HFP デバイスごとに個別のフィルター ファクトリを作成します。 ペアリングされた HFP デバイスごとに、オーディオ ドライバーは、KsCreateFilterFactory の RefString パラメーター、または PcRegisterSubdevice の 名前 パラメーターに一意の文字列を使用する必要があります。 ドライバー開発者は、ペアリングされた HFP デバイスの Bluetooth アドレス文字列を一意の文字列として使用すると便利な場合があります。 一意の文字列を取得する方法の情報は、HF デバイスの Bluetooth アドレスの取得を参照してください。

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

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

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

接続ステータス取得 IOCTL の送信

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

ボリュームステータス取得 IOCTL の送信

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