2016-08-16 21 views
0

這裏是我的代碼:網絡音頻API不移動工作的iOS

$(document).ready(function(){ 

var audioCtx = new (window.AudioContext || window.webkitAudioContext)(); 
var oscillator = audioCtx.createOscillator(); 
var gainNode = audioCtx.createGain(); 
oscillator.connect(gainNode); 
gainNode.connect(audioCtx.destination); 
oscillator.type = 'sine'; 
gainNode.gain.value = 0; 
oscillator.start(); 

document.addEventListener("touchmove", function(e) { 
    e.preventDefault(); 
    var touch = e.touches[0]; 
    var x = touch.pageX; 
    var y = touch.pageY; 
    x = Math.round(x); 
    y = Math.round(y); 

    x = mRound(x, 20); 
    y = mRound(y, 10); 

    $("#coords").text(x + ", " + y); 

    gainNode.gain.value = x/10; 
    oscillator.frequency.value = y; 

}, false); 

}); 

function mRound(n, m){ 

if(n > 0) 
    return Math.ceil(n/m) * m; 
else if(n < 0) 
    return Math.floor(n/m) * m; 
else 
    return m; 

} 

這個工程在Chrome和Firefox瀏覽器在Android,但在iOS上的Safari或Chrome沒有播放聲音。網絡音頻api確實可以在safari中工作,因爲我已經使用更簡單的腳本對其進行了測試,並且'touchmove'似乎可以工作,因爲座標出現在#coords中。

謝謝。

回答

0

我正在處理類似的問題。當涉及到「自動啓動」音頻的可能性時,iOS上的WebKit非常挑剔。

對 「touchstart」 事件引發AudioContext的伎倆在我的iPhone SE與iOS 9.1.1:

$(document).ready(function(){ 
    var oscillator, gainNode, audioCtx; 

    var initOnce = false; 

    document.addEventListener("touchstart", function(e) { 
    if (!initOnce){ 
     initOnce = true; 
     audioCtx = new (window.AudioContext || window.webkitAudioContext)(); 
     oscillator = audioCtx.createOscillator(); 
     gainNode = audioCtx.createGain(); 
     oscillator.connect(gainNode); 
     gainNode.connect(audioCtx.destination); 
     oscillator.type = 'sine'; 
     gainNode.gain.value = 0; 
     oscillator.start(); 
    } 
    }); 

    document.addEventListener("touchmove", function(e) { 
     e.preventDefault(); 
     var touch = e.touches[0]; 
     var x = touch.pageX; 
     var y = touch.pageY; 
     x = Math.round(x); 
     y = Math.round(y); 

     x = mRound(x, 20); 
     y = mRound(y, 10); 

     $("#coords").text(x + ", " + y); 

     gainNode.gain.value = x/10; 
     oscillator.frequency.value = y; 

    }, false); 

}); 

function mRound(n, m){ 

if(n > 0) 
    return Math.ceil(n/m) * m; 
else if(n < 0) 
    return Math.floor(n/m) * m; 
else 
    return m; 

}