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
┷