electron 0.33.7におけるWeb Audio APIの不具合をまとめておこう。 Qiitaに書こうかなと思ったけどTipsじゃないし、一過性のものだと思うからね。
AudioContext.decodeAudioData()
はopusをサポートしない。
audio
タグではopusファイルはサポートされているにも関わらず、AudioContext.decodeAudioData()ではエラーとなる。またエラーの際に引数として渡されるオブジェクトはnull
である。
このエラーはelectronというよりは、chromiumの不具合らしい。
https://code.google.com/p/chromium/issues/detail?id=482934
上記を読むと内臓のffmpegがopusをサポートしていないようなことが書いてある。またaudio
タグとはデコードのされ方が違うようなことも。
まだクローズしてないから、フィックスされるのはまだ先なのかな。。
今のところ別フォーマットのファイルで再生するしかないようだ。
AudioBufferSourceNode
は明示的にstop()
メソッドを呼ばないとonended
イベントを発火しない。
規格上はAudioBufferSourceNode
はloop
属性がtrue
以外のときはonended
イベントを発火するはずだが、なぜか発火しない。なので、下記のようなコードを書く必要がある。
// 不具合対策
setTimeout(()=>{
source.stop(0);
},((source.buffer.duration / source.playbackRate.value) * 1000));
source.onended = function(e)
{
console.log('end');
end = true;
}
これもIssueとして挙がっている。これもまたChromiumの不具合であった。
https://code.google.com/p/chromium/issues/detail?id=484176
上記2つのエラーはFirefoxでは起こらない。たしか Web Audio APIはGoogle起案のはずだが。。
Web Audio APIははやく勧告になってほしいね。
Web Audio APIのスケジュールってどうなっているんだろうね。はやくWeb Audio APIが勧告となって、規格を固定してもらいたいところだ。Editor's Draftではまだ規格の内容に揺れがあるようなのでまだまだ先のことかもしれない。規格が安定しないと実装も固まらないからね。やっぱり対応は消極的になってしまうよね。上記2つの不具合の対応が遅いのも。規格が固まらないことによるせいかもしれない。
Web Audio APIはモジュラー構造を採用していてとても面白いAPIなのだけれども、中途半端な気もしないでもない。高レベルと低レベルの中間のような。Audio Data APIのような低レベルのAPIをまずしっかり作って、それを補うためのAPIとして別に切り出したほうがいいような気もする。実際JSで低レベルのAPIだけで音声処理を行うのはちょっときついし、ネイティブサポートは必要だからWeb Audio APIのようなものは必要だけれどもね。
個人的にはVSTをノードとして取り扱えるようにしてほしいけど、それは無理だろうね。ベンダーの規格をそのまま採用することはないだろうからね。