phinajs / phina.js

phina.js is game library

Home Page:http://phinajs.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

iOS 9 で WebAudio 使うと音が割れる?

phi-jp opened this issue · comments

commented

phina.js の問題か, OS の問題かを深掘りする.

割るというのは具体的に
音が低く再生速度が遅くなる(結果として割れているように聞こえる)

iOS9.2.1で確認
イヤホンをさしながらだと現象未発生

AudioContextを生成し、WebAudioの再生後、AudioContextの破棄後にWebAudio以外の音を再生せずにAudioContextを生成しWebAudioで音を再生すると現象が発生します

phina.jsに関係なくわれる

simiraaaさんのiPhoneは他のアプリ等で音を鳴らすと現象が出ないとの事でしたが、自分の環境では音を鳴らした後でも現象が出ております。
イヤホンに関しては同様です。
色々試しましたが、ロード中にさすと音が出なくなったり、ロード中にイヤホン抜くと音の再生速度が速まったりしてます。(こちらは出る時と出ない時がありますが)
一回音が出なくなると、他アプリで音を出さないとそのままです。

iOS9.2.1で確認しました。

現象発生時の音サンプル
flickarrow_sound.zip

Safariでの再現方法、Safariで一度WebAudioを再生してるページを開く。
Safari終了、再起動して再度開く
Safari上で2回めのAudioContext生成時に現象が解消される

現象回避コード

var f = function(){
  var s = Sound();
  s.loadFromBuffer();
  s.play()
  Sound.context = new webkitAudioContext();
  s.stop();
  var s = Sound();
  s.loadFromBuffer();
  s.play();
  s.stop();
  app.domElement.removeEventListener('touchend', f);
};

app.domElement.addEventListener('touchend', f);

スマートな実装

var f = function(e){
    dummyPlay();
    checkSampleRateBug();
    dummyPlay();
    app.domElement.removeEventListener('touchend',f);
  };

  function dummyPlay(){
    var s = Sound();
    s.loadFromBuffer();
    s.play().stop();
  }

  function checkSampleRateBug(){
    if(Sound.getAudioContext().sampleRate!==44100){
      // 強制停止。戻り値がtrue かどうかで強制停止されたか判別してください
      Sound.context.close();
      Sound.context = new webkitAudioContext();
      return true;
    }
    return false;
  }

  app.domElement.addEventListener('touchend',f);