ちゅんラヂにおけるJCBA受信について

 
ちゅんラヂ
Booskanium's
ちゅんラヂ Tips.

JCBAを独自に受信する

まず「JCBA受信(聴取)の試作 」を試みました。

上記の手順をJavaScriptで表現すると

 公開出来る日が訪れますように m(゚- ゚ )カミサマ!
		

JCBA受信のフローチャート

フローチャートのみの公開です。
この受信方法は本家とは別物です。パケットを解析して作成したものです。
以下のフローは正常動作のみを示すもので、実用的にはTry&Catch等を考慮する必要があります。
なお、落書き人が忘れないためのメモです。フロー表現も独自です。雰囲気から察してください。


//Callback processing settings
this.events = {
	PARSED: {},     //再生可能になった時に行うcallbackで戻し値は:局ID
	ERROR: {},		//Websocketがエラーになった時に行うcallbackで戻し値は:DOMException オブジェクト
	ENDED: {}		//Websocketがクローズされた時に呼び出す
}

■on (ev,fn)
◇ev in this.events
├Yes
│・this.events[ev] = fn;
├No
│・console.log('Rejected due to Illegal event registration.');
┷

■attachJCBA(media)
|・Verify the ID of the receiving broadcast station.
|・Check that the audio elements are ready.
|・The distributor is either JCBA or FM++.
▽
└new Promise() ─┐
┌←()──────┘
└□_getWssToken()──┐
      Get the WSS URL.│
┌←(wss) ──────┘
└□_getterChunk(wss)──────┐
     Receiving Stream Chunk Data.│
┌←(wss)────────────┘
└return new Promise() ──────┐
  ☎setTimeout ※キャッシュ時間待つ│
  ・events.PARSED()※再生可能を通知│
┌←(wss)─────────────┘
△
┷

■_getWssToken(station)
▽
└new Promisenew Promise()────────────┐
  ▽                                              │
  └async()=> ─────────────────┐│
     res = await JCBAのWSS lcationとtokenを取得 ││
     resolve(await res.json())                  ││
  ┌←─────────────────────┘│
┌△({code,location,token}) ───────────┘
△

■_getterChunk({code,location,token})
│□_initialMse()‖
│・socket = new WebSocet(location)
│☎socekt.onerror
││・socket.send(token)
│┷
│☎socekt.onopen
││□__ongoingChunk()‖
││・socket.send(token)
│┷
┷

■__ongoingChunk()
├
├☎socket.onmessage
│├▽
││└async()=> ──────────────────┐
││   ・受信したarraybufferデータをUnit8Arrayに変換│
││   ・oggコンテナからwebmコンテナに載せ替え      │
││   ・□__appendCunk()‖                         │
││┌───────────────────────┘
││△
│┷
┷

■async __appendCunk()
▽
└await new Promise() ─────────────┐
  ・受信したデータをMSEのsourceBufferに追加     │
  ▽                                            │
  └await new Promise() ───────────┐│
    ☎MSEのsourceBufferが更新されたらresolve()││
  ┌─────────────────────┘│
  △                                            │
┌───────────────────────┘
△
┷

■async detachJCBA() 
▽
└───────────────────────┐
  ◇WebSocketが停止していなければ               │
  ├Yes                                         │
  │☎Socket.onclose                            │
  ││□_closeWse()                             │
  ││・Websocketが閉じたことを呼び出し元に通知 │
  │┷                                          │
  │・socket.close()                            │
  ├No                                          │
  │□_closeWse()                               │
  │◇Socektオブジェクト有り                    │
  │├Yes                                       │
  ││・Socektオブジェクトをnull                │
  │┷                                          │
  │・Websocketが閉じたことを呼び出し元に通知   │
  ┷                                            │
┌───────────────────────┘
△
┷

■async _initialMse()
▽
└─────────────────────────┐
  ・MSE(mediaSource)をインスタンス化                │
  ・audio要素のsrc(Soource)にMSEのMedia Sourceを接続│
  ▽                                                │
  └await new Promise() ─────────────┐│
    ☎MSEのmediaSourceが開くまで待つ              ││
  ┌───────────────────────┘│
  △                                                │
  ・mediaSourceにsourceBufferを追加                 │
  ・sourceBufferのでmodeをsequenceにする            │
  ・Mse-Audio-Wrapperのインスタンス化               │
┌─────────────────────────┘
△
┷

■_closeWse()
│◇MSEのmediaSourceが接続されていたら
│├Yes
││・mediaSourceをremove
│┷
│・MSEのsourceBufferをnull
│・MSEのmediaSourceをnull
┷