サウンドの連続再生
HTML5のAudioタグとJavascriptを使って、複数のサウンドを順番に再生するサンプルを作ってみた。
audio#endedイベントで再生終了が判定できるので、その度に次のサウンドを再生している。
本当はイベントの解除を arguments.callee を使って書ければこんなにトリッキーな書き方をしなくてもいいのだけど、 ストアアプリでも使えるように strictモード で動作させようと思うと callee の呼び出しがエラーになってしまうから。。
といって、無名関数のままではイベントの解除ができなくなってしまうので、変数へ関数をいったん保存しておいて使うという苦肉の策^^;
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Play sound sample</title> <script type="text/javascript"> window.onload = function() { document.getElementById("playButton").addEventListener("click", function (e) { var sound1 = document.getElementById("sound1"); var sound2 = document.getElementById("sound2"); var sound3 = document.getElementById("sound3"); var funcEnded = function (arr) { var funcCurrEnded = function () { if (!arr || arr.length == 0) { return null; } var cur = arr[0]; var nxt = (arr.length > 1) ? arr[1] : null; cur.removeEventListener("ended", funcCurrEnded); if (nxt) { nxt.addEventListener("ended", funcEnded(arr.slice(1))); nxt.play(); } } return funcCurrEnded; } sound1.addEventListener("ended", funcEnded([sound1, sound2, sound3])); sound1.play(); }); } </script> </head> <body> <audio id="sound1"> <source src="./sound1.wav" /> </audio> <audio id="sound2"> <source src="./sound2.wav" /> </audio> <audio id="sound3"> <source src="./sound3.wav" /> </audio> <button id="playButton">Play(Normal)</button> </body> </html>
サウンドが重複して再生されていたりしないから、多分正常に動いているはず。 正解かどうかは分からないけど^^;