gpt4 book ai didi

javascript - 单击按钮后未调用Web Audio ScriptNode

转载 作者:行者123 更新时间:2023-12-03 01:59:17 25 4
gpt4 key购买 nike

(Windows 7/64,FireFox 41.0.1)我有一个Web音频网络,该网络包含一个(现场麦克风)源,该源连接到脚本节点,该脚本节点又连接到目标节点。如果我包含一个没有“onclick”脚本的按钮元素,则脚本节点(仅执行“console.log”)将保持运行。如果我包含一个onclick脚本,则在执行脚本之后,即使onclick脚本只是向控制台发送一条消息,该脚本节点也不会再被调用。如果没有onclick脚本,它就可以工作;如果按钮调用了onclick脚本,则不再调用脚本节点。这是没有onclick脚本的FireBug控制台:

编辑:如果在有onclick脚本时单击按钮,则来自scriptNode的消息将停止。但是,如果我随后在scriptNode中放置一个断点,则会命中该断点,表明已调用scriptNode。如果然后删除断点并告诉FireBug继续,则scriptnode继续显示其消息,直到再次按下按钮。

这是没有调用onclick脚本的输出:
144 scriptNode.onaudioprocess bug.html(第35行)
(数量继续增长)

以下是带有onclick脚本的输出:

36 scriptNode.onaudioprocess bug.html (line 35)
hello bug.html (line 62)

(无进一步输出)

这是完整的代码。谁能告诉我我哪里出问题了?
<!DOCTYPE html>
<html lang="en-us">
<head>
<title>Bug</title>

<link rel="stylesheet" type="text/css" href="jwm.css">

</head>
<body>

<button onclick="sayHello()">Click me</button><br>
<!-- <button>Click me</button><br> -->

<script>
// Encapsulate the client code in this single function.
//
function runClient(sock,beatsPerCycle,beatsPerMinute) {

// Do necessary fallbacks to get the user media.
navigator.getUserMedia = (navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia);

// Set up the context.
var audioContext = new AudioContext();

// Set up the script node that does all the work.
var scriptNode = audioContext.createScriptProcessor(0, 2, 2);

scriptNode.onaudioprocess = function(audioProcessingEvent) {
console.log("scriptNode.onaudioprocess");
};

if (navigator.getUserMedia) {
navigator.getUserMedia(
{
audio: true
},
function (stream) {
var source = audioContext.createMediaStreamSource(stream);
// Next line courtesy of
// https://support.mozilla.org/en-US/questions/984179
window.horrible_hack_for_mozilla = source;
source.connect(scriptNode);
scriptNode.connect(audioContext.destination);
},
function(err) {
console.log("The following getUserMedia error occured: " + err);
throw("");
}
);
} else {
console.log("browser does not have getUserMedia.");
}
}

function sayHello() {
console.log("hello");
}

runClient()
</script>

</body>
</html>

最佳答案

至少使用此版本的Firefox,调用“onclick”脚本会导致将AudioContext状态更改为“已暂停”,从而停止任何进一步的音频处理。设置一个断点,等待中断,然后继续执行,将导致AudioContext状态恢复为“正在运行”,并且音频处理将恢复。出于我的目的,我现在包含此功能

audioContext.onstatechange = function() {
if (audioContext.state === "suspended") {
audioContext.resume();
}
}

这个hack似乎已经解决了我的问题。希望它也能帮助其他人。

关于javascript - 单击按钮后未调用Web Audio ScriptNode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32955594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com