LE Audio ブロードキャスト オーディオ ストリーミング(★)

[BLE(Bluetooth Low Energy), LE Audioの開発依頼は、フィールドデザインまでお気軽にお問い合わせください。]

ここでは、LE Audioの複数のユーザーに転送できるブロードキャスト通信について説明します。


動作の概略

下図は、放送機器などのBroadcast Sourceから、ヘッドホンなどのBroadcast Sinkに対して、音声データを送るシーケンス図です。

IsochronousチャネルにてBIS(Broadcast Isochronous Streams)というLC3のAudioデータが入ったフレームをLeft,Rightの順番に送ります(順番は問いません)。
この一回に送信する複数のBISをBIG(Broadcast Isochronous Group)というグループで定義しています。
このBIGを定期的(ここでは10msごと)に送ることで、ストリーミングを実現しています。

BISは、Isochronous PDU(Bluetooth Low Energyのフレームフォーマットの基本参照)を使い、PayloadにSegmentation Headerをつけて、LC3のデータを入れています。

BISの場合は、ブロードキャスト転送なので当然Ackがありません。そのため、データをロスした時に、再送はできませんが、複数回送ることで、ノイズ耐性を高くしています。その転送の際に、周波数ホッピングをしますが、周波数チャネルは必ず6MHz以上離れる仕様になっているため、周波数選択性のノイズに対して強くなっています。


詳細な動作の説明

下図は、Broadcast Source側がどのようなフレームを送信しているかを説明しています。受信側の機器は、これらのフレームを順番に取得していくことで、ストリーミングデータに同期することができ、Audioを聴くことができます。






受信機側の動作として説明した方がわかりやすいため、受信機と仮定して説明します。

  1. まず、Primary Advertisingチャネル(37ch,38ch,39ch)をスキャンして、ADV_EXT_INDを探します。
  2. 取得したADV_EXT_INDには、AUX_ADV_INDのチャネル番号を示すAuxPtrが含まれているので、そのチャネルをスキャンします。
  3. 取得したAUX_ADV_INDには、Local Nameや、Service UUIDが含まれているため、Audioのブロードキャストであることがわかります。また、Broadcast IDというそのブロードキャストを識別するためのIDも含まれています。さらに、Periodic Advertising(AUX_SYNC_IND)のチャネル番号やタイミングを示すSyncInfoも含まれているので、そのチャネルをスキャンします。
  4. 取得したAUX_SYNC_INDには、BIS Dataのチャネル番号やタイミングを示すBIGInfoが含まれますので、そのチャネルをスキャンします。
  5. BIS Dataを受信することで、LC3のAudioデータを取得できます。その後は、BIS Dataのみに同期を取って、受信しつづける方法でもかまいませんし、Periodic Advertising(AUX_SYNC_IND)に同期を取って、その都度、BIS Dataを受信する方法でもかまいません。通常は、BIS Dataはロストしやすいので、Periodic Advertisingに同期を取る実装がされています。

この動作の中で、最もわかりにくいのは、BIS Dataを取得するまで、3段階も別のパケットを辿ることになることです。
次に、わかりにくいのは、途中までAdvertising PDUを受信しているのに、BIS DataのところになるとIsochronous PDUを受信することになります。
また、Primary Advertisingチャネル(37ch,38ch,39ch)以外に、Advertising PDUが流れているのもわかりにくいです。
Bluetooth Low Energyは、当初の仕様から、増築を繰り返して来たために、ぐちゃぐちゃになってしまいました。後方互換性を保つ通信の規格では、よくあることです。

なお、LE Audio仕様では、Periodic Advertingの間隔はデフォルトで10msです(40msなどでも問題ありません)。また、IsochronousチャネルのBIGの間隔(ISO interval)は、デフォルトで10msです(オプションで7.5ms)。