次の方法で共有


HFP デバイス接続

この記事では、Bluetooth ハンズフリー プロファイル (HFP) デバイスの接続状態情報をオーディオ システムが決定して処理する方法について説明します。

オーディオ ドライバーは 、KSPROPERTY_JACK_DESCRIPTIONを サポートし、フィルター ファクトリ コンテキストで IsConnected フィールドを維持する必要があります。 ドライバーは、KSPROPERTY_JACK_DESCRIPTION プロパティを処理するときにこの値 使用します。

IOCTL_BTHHFP_DEVICE_GET_CONNECTION_STATUS_UPDATEが正常に完了すると、オーディオ ドライバーは IsConnected を新しい接続状態で更新します。 状態が変更された場合、オーディオ ドライバーは KSEVENT_PINCAPS_JACKINFOCHANGE イベントを発生させ、オーディオ システムが接続状態を再評価します。 その後、オーディオ ドライバーは 、IOCTL_BTHHFP_DEVICE_GET_CONNECTION_STATUS_UPDATE の別のインスタンスを呼び出して、次の状態変更を受け取ります。 以前の状態変更要求がまだ保留中の場合、この 2 回目の呼び出しは失敗し、オーディオ ドライバーは接続状態を更新せず、状態変更情報に対して別の要求を行いません。

カーネル ストリーミングに関する考慮事項で説明したように、オーディオ ドライバーはKSPROPERTY_ONESHOT_RECONNECTKSPROPERTY_ONESHOT_DISCONNECTをサポートする必要があります。 これらのプロパティのハンドラーは、それぞれ REQUESTCONNECT および REQUESTDISCONNECT IOCTL を HFP ドライバーに送信する必要があります。 これらの IOCTL はすぐに完了し、オーディオ ドライバーは返された結果に応答する準備ができている必要があります。

この記事では、オーディオ ドライバーの開発者が認識する必要がある他のBluetoothオーディオ デバイス接続関連の要因についても説明します。

ストリーム チャネル

ストリーム チャネルは、オーディオ ドライバーによる空中帯域幅の割り当てを表します。 ほとんどの場合、これは SCO チャネルです。 ただし、SCO チャネルの状態の管理の詳細の一部は、HFP ドライバー内で完全に処理されます。 これには、たとえば、HF が AG へのオーディオ転送を開始する呼び出しシナリオが原因である可能性があるリモート切断が含まれます (この場合、PC が AG の役割を果たします)。

オーディオ フィルターのピンの状態

オーディオ ドライバーは、2 つの KS ピンの KS ピン状態ハンドラーを実装します。 これらのピンのいずれかが空中でデータを転送するには、SCO ストリーム チャネルが必要です。 これらのピンのいずれかがKSSTATE_ACQUIREに遷移すると、オーディオ ドライバーは HFP ドライバーに IOCTL_BTHHFP_STREAM_OPEN を送信してチャネルを開きます。 この非同期呼び出しが完了するまでに数秒かかる場合があります。 オーディオ ドライバーは、独自のタイムアウト メカニズムを実装する必要はありません。IOCTL が完了するまで待ってから、KSSTATE_ACQUIREへの移行を完了する必要があります。

両方の KS ピンがKSSTATE_STOPに移行すると、オーディオ ドライバーは HFP ドライバーにIOCTL_BTHHFP_STREAM_CLOSEを送信します。これはすぐに完了します。

オーディオ ドライバーは、 IOCTL_BTHHFP_STREAM_OPENIOCTL_BTHHFP_STREAM_CLOSEを送信するタイミングを決定するために、単純な参照カウント メカニズムを使用して、SCO ストリーム チャネルを必要とするピンの数を追跡できます。 参照カウントが 0 から 1 に変わると、オーディオ ドライバーは SCO ストリーム チャネルを開いて閉じます。

IOCTL_BTHHFP_STREAM_OPENにおいて、HFP ドライバーは、まだ開いていない場合にSCOチャネルを要求し、SCO要求の結果で要求を完了します。 IOCTL_BTHHFP_STREAM_CLOSEが発行されると、HFPドライバーがSCOチャネルの切断を要求します(チャネルが開いている場合)。

リモート SCO の接続と切断

リモート SCO 切断では、ストリーム チャネルが閉じられている場合、HFP ドライバーは何も行いません。 ストリーム チャネルが開かれている場合、HFP ドライバーは再接続タイマーを開始します。 タイマーの有効期限が切れると、SCO がまだ切断され、ストリーム チャネルがまだ開いている場合、ドライバーは SCO チャネルを要求します。 SCO が切断されている間、音声データは空中で転送されないため、この期間中はオーディオにギャップが発生します。 SCO 要求が失敗した場合、HFP ドライバーは、呼び出しIOCTL_BTHHFP_STREAM_GET_STATUS_UPDATEを完了することによって、オーディオ ドライバーにストリーム チャネルの状態の 変更を通知します。 通常、リモート SCO 切断は、オーディオ ゲートウェイへの通話オーディオの転送を要求する HF デバイスに関連付けられているので、これはまれです。 オーディオ ドライバーは、この中間ストリーム エラー状態を考慮する必要があります。

この手順により、VoIP アプリケーションが CallButtons API からオーディオ転送コールバックを受け取り、ストリーミング エラーを発生させるのではなく、HFP エンドポイントでオーディオ リソースをクリーンに解放できます。

リモート SCO 接続では、ストリーム チャネルが開いている場合、ドライバーは接続を受け入れるだけです。 ストリーム チャネルが閉じている場合、HFP ドライバーは接続を受け入れ、切断タイマーを開始します。 切断タイマーの有効期限が切れると、SCO がまだ接続されていて、ストリーム チャネルがまだ閉じられている場合、ドライバーは SCO 接続を切断します。

この手順により、VoIP アプリケーションが CallButtons API からオーディオ転送コールバックを受信し、SCO 接続を途中で拒否または閉じることなく、HFP エンドポイントでオーディオ リソースを確立できます。