基本的に私はこれを Chrome でテストしましたが、おそらくコードの順序がずれているか、レンジ リクエストのバグのために「Web オーディオ」を使用して HTML5 オーディオの機能の一部をカバーしようとしました。エフェクトと音楽...
「不正な例外」エラーが発生します。コードは次のとおりです。
var url='example.mp3';
var a_result=new Object();
a_result.loaded=false;
a_result.evalstring='';
a_result.loop=false;
a_result.play=function(){
var asrc=a_result.source;
asrc.loop=a_result.loop;
//try{
var playfunc=asrc.start||asrc.noteOn;
playfunc(0);
//}catch(e){
/* do nothing */
//}
}
a_result.pause=function(){
var asrc=a_result.source;
try{
var stopfunc=asrc.stop||asrc.noteOff;
stopfunc(0);
}catch(e){
/* do nothing */
}
}
var asrc=actx.createBufferSource();
asrc.connect(actx.destination);
var req=new XMLHttpRequest();
req.open('GET',url,true);
req.responseType='arraybuffer';
req.onload=function(){
if(a_result.loaded==false){
asrc.buffer=actx.createBuffer(req.response,false);
a_result.source=asrc;
a_result.loaded=true;
}
var cont=a_result;
eval(cont.evalstring);
}
req.onerror = function() {
if(a_result.loaded==false){
a_result.loaded=true;
}
}
try{
req.send(null);
}catch(e){
req.onerror();
}
return a_result;
その後、サウンドがロードされた後、次のようなことを行います。
a_result.play();
そして、再生する代わりにエラーが発生します。
上記のコードと以下に提案されている修正を使用したサウンド テストを次に示します。このテストは Chrome で動作し、粗末な Web サーバーでの範囲リクエストの問題をうまく回避しています。問題のある別のものがあります(Iron では asrc.buffer=actx.createBuffer(req.response,false); である種の「無効な文字列」エラーをスローし、Chrome では静かに失敗します)。
提案に従って編集されたコードは次のとおりです。
var url='example.mp3'
var a_result=new Object();
a_result.loaded=false;
a_result.evalstring='';
a_result.loop=false;
a_result.play=function(){
var asrc=a_result.source;
asrc.loop=a_result.loop;
try{
if(asrc.start){
asrc.start(0);
}else{
asrc.noteOn(0);
}
}catch(e){
/* do nothing */
}
}
a_result.pause=function(){
var asrc=a_result.source;
try{
if(asrc.stop){
asrc.stop(0);
}else{
asrc.noteOff(0);
}
}catch(e){
/* do nothing */
}
}
var asrc=actx.createBufferSource();
asrc.connect(actx.destination);
var req=new XMLHttpRequest();
req.open('GET',url,true);
req.responseType='arraybuffer';
req.onload=function(){
actx.decodeAudioData(req.response,function(buffer){
if(buffer){
if(a_result.loaded==false){
asrc.buffer=buffer;
a_result.source=asrc;
a_result.loaded=true;
}
var cont=a_result;
eval(cont.evalstring);
}
});
}
req.onerror = function() {
if(a_result.loaded==false){
a_result.loaded=true;
}
}
try{
req.send(null);
}catch(e){
req.onerror();
}
return a_result;
構文エラーはないように見えますが、Chrome でのプレイアビリティの問題は解決していないようです (上記の 2 番目のテスト ケースが更新されました)。具体的には、サウンドが停止した後、再び再生する必要はありません。――どうやら仕様のせいですね。バッファは、再生するたびに新しい音源に適用する必要があります。