次の方法で共有


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 接続を切断します。

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