Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
phi-jp opened this issue Feb 24, 2016 · 6 comments

Comments

@phi-jp
Copy link
Collaborator

commented Feb 24, 2016

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

@simiraaaa

This comment has been minimized.

Copy link
Contributor

commented Feb 24, 2016

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

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

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

phina.jsに関係なくわれる

@minimo

This comment has been minimized.

Copy link
Contributor

commented Feb 24, 2016

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

iOS9.2.1で確認しました。

@simiraaaa

This comment has been minimized.

Copy link
Contributor

commented Feb 24, 2016

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

@simiraaaa

This comment has been minimized.

Copy link
Contributor

commented Mar 31, 2016

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

@simiraaaa

This comment has been minimized.

Copy link
Contributor

commented Mar 31, 2016

現象回避コード

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);

@simiraaaa

This comment has been minimized.

Copy link
Contributor

commented Apr 2, 2016

スマートな実装

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);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
3 participants
You can’t perform that action at this time.