2013-01-25 6 views
3

이전에 Web Audio API에서 JavaScriptAudioNode을 성공적으로 사용하여 Chrome과 Safari 6.0에서 모두 오디오를 합성하고 혼합했습니다. 그러나 소스 버퍼를 채우기 위해 onaudioprocess을 호출하지 않기 때문에 Safari의 최신 버전이 더 이상 작동하지 않습니다.Safari 6.0.2 onaudioprocess를 호출하지 않음

<html> 
<head> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> 
<script type="text/javascript">  
$(document).ready(function() { 
    $("a").click(function() {  
    var context = new webkitAudioContext(); 
    var mixerNode=context.createJavaScriptNode(2048, 0, 2);     

    mixerNode.onaudioprocess=function(ape) {      
     var buffer=ape.outputBuffer; 
     for(var s=0;s<buffer.length;s++) 
     { 
     buffer.getChannelData(0)[s]=0;  
     buffer.getChannelData(1)[s]=0;  
     } 
     $("body").append("buffering<br/>"); 
    };    

    $("body").html("");    
    mixerNode.connect(context.destination);    
    return false; 
    });               
});       
</script>  
</head> 
<body> 
<a href="#">start</a>   
</body> 
</html> 

위의 예는 데스크톱 사파리에서 예상대로 크롬에서 작동하지만,하지 :

이것은 단지 침묵을 재생하고 onaudioprocess 각 호출에 문서 본문에 텍스트를 추가 단순화 된 예입니다. Safari의 iOS 버전도 작동하지 않지만 처음에는 저에게 맞지 않았습니다.

유형 JavaScriptAudioNode의 적절한 객체를 반환 않습니다 context.createJavaScriptNode를 호출하고 예외를 throw하지 않습니다 목적지 노드에 연결. context.activeSourceCount은 0으로 유지되지만 Chrome에서는이 유형의 활성 노드 인 AudioBufferSourceNode 만 계산하므로이 경우에도 마찬가지입니다. context.currentTime도 예상대로 증가합니다.

내가 여기서 뭔가 잘못하고있는 것입니까, 아니면 실제 버그입니까, Safari에서 누락 된 기능입니까? Apple 설명서에는 JavaScriptAudioNode (새 이름, ScriptProcessorNode)에 대한 언급이 없지만 Safari 6의 첫 번째 릴리스에서는 작동하지 않았습니다. 사용자 입력에 대한 iOS Safari 요구 사항은 도움이되지 않습니다. 위의 내용은이를 처리해야합니다.

간단한 예제는 here이고 더 복잡한 것은 동일한 동작을 보이는 내 Protracker module player입니다.

답변

4

Safari가 웹 오디오 API를 구현할 때주의해야 할 몇 가지 버그가 있습니다. 첫번째는 createJavaScriptNode 생성자이다 .. PARAM이로 변경 0 시도로 설정되고 "입력 채널"문제가있는 것으로 보인다 :

번째 문제는 가비지 컬렉션과 관련이있다
createJavaScriptNode(2048, 1, 2) 

(나는 생각한다); mixerNode 변수가 범위를 벗어나면 Safari는 onaudioprocess 콜백을 중지하는 것 같습니다. 한 가지 해결책은 mixerNode를 최상위 범위에 도입 (예 : 스크립트 상단에 var mixerNode;을 선언) 한 다음 JavaScriptNode를 최상위 변수에 저장하는 것입니다. 여러 mixerNode를 동적으로 만들 계획이라면 최상위 배열 변수에 참조를 저장하여 동일한 효과를 얻을 수 있습니다.

두 가지 변경 사항 (입력 채널 매개 변수를 1로 설정하고 mixerNode에 대한 참조를 유지)을 사용하면 스크립트가 예상대로 Safari에서 작동해야합니다.

+0

우수 답변을 보내 주셔서 감사합니다. 제안 된 변경 사항을 구현하면 실제로 Safari의 문제가 해결되었습니다. – firehawk

+0

와우,이 대답 없이는 절대로 알아 내지 못했을 것입니다. 건배! –

+0

참고로, 저는 카나리아 30.0.1564.0에서 똑같은 문제를 겪고 있다고 확신합니다. onaudioprocess는 GC 패스 직후에 * 호출되는 것을 멈 춥니 다 (DevTools 타임 라인 탭을 사용하여 관찰 됨). 제안 된대로 전역 범위에 항목을 첨부하는 것이 효과적인 해결 방법입니다. 감사합니다. 옳은 길에 나를 두었습니다. – biril

관련 문제