gpt4 book ai didi

javascript - 实现 JavaScript AudioNode

转载 作者:可可西里 更新时间:2023-11-01 02:41:14 26 4
gpt4 key购买 nike

是否可以实现自定义 AudioNode使用网络音频 API?

我想构建一个包含多个其他节点(ChannelSplitters 和 AnalyserNodes)的节点。理想情况下,我将能够像任何其他 AudioNode 一样连接到这个自定义节点。例如,

var customNode = new CustomNode();
mediaStreamSource = context.createMediaStreamSource(userMedia);

// This will not work, as I need to know what to implement in CustomNode
mediaStreamSource.connect(customNode);
customNode.connect(context.destination);

根据MDN documentation ,一个 AudioNode 实现一个 EventTarget interface .这就是用于随机播放音频的所有内容吗?如果可以,如何以处理音频的方式实现此接口(interface)?

最佳答案

AudioNode类文件

"use strict";

var AudioNode = global.AudioNode;
var AudioNode$connect;
var AudioNode$disconnect;

function connect() {
var args = [].slice.call(arguments);

if (args.length && typeof args[0].__connectFrom === "function") {
args[0].__connectFrom.apply(args[0], [ this ].concat(args.slice(1)));
} else {
AudioNode$connect.apply(this, args);
}
}

function disconnect() {
var args = [].slice.call(arguments);

if (args.length && typeof args[0].__disconnectFrom === "function") {
args[0].__disconnectFrom.apply(args[0], [ this ].concat(args.slice(1)));
} else {
AudioNode$disconnect.apply(this, args);
}
}

function use() {
if (typeof AudioNode !== "undefined" && AudioNode.prototype.connect !== connect) {
AudioNode$connect = AudioNode.prototype.connect;
AudioNode$disconnect = AudioNode.prototype.disconnect;

AudioNode.prototype.connect = connect;
AudioNode.prototype.disconnect = disconnect;
}
}

function unuse() {
if (typeof AudioNode !== "undefined" && AudioNode.prototype.connect === connect) {
AudioNode.prototype.connect = AudioNode$connect;
AudioNode.prototype.disconnect = AudioNode$disconnect;
}
}

module.exports = {
use: use,
unuse: unuse,
};

AudioNode 测试文件

"use strict";

var assert = require("power-assert");
var PowerAudioNode = require("../");

function CustomAudioNode(audioContext) {
this.audioContext = audioContext;
this.gain1 = audioContext.createGain();
this.gain2 = audioContext.createGain();
this.inlet = this.gain1;
this.outlet = this.gain2;
}

CustomAudioNode.prototype.connect = function() {
this.gain1.connect(this.gain2);
this.gain2.connect.apply(this.gain2, arguments);
};

CustomAudioNode.prototype.disconnect = function() {
this.gain1.disconnect();
this.gain2.disconnect.apply(this.gain2, arguments);
};

CustomAudioNode.prototype.__connectFrom = function(source) {
source.connect(this.gain1);
};

CustomAudioNode.prototype.__disconnectFrom = function(source) {
source.disconnect();
};

describe("PowerAudioNode", function() {
describe("use(): void", function() {
before(PowerAudioNode.use);
before(PowerAudioNode.use);
it("works", function() {
var audioContext = new global.AudioContext();
var oscillator = audioContext.createOscillator();
var customAudioNode = new CustomAudioNode(audioContext);
var compressor = audioContext.createDynamicsCompressor();

oscillator.connect(customAudioNode);
customAudioNode.connect(compressor);
compressor.connect(audioContext.destination);

assert(audioContext.destination.$isConnectedFrom(compressor));
assert(compressor.$isConnectedFrom(customAudioNode.outlet));
assert(customAudioNode.inlet.$isConnectedFrom(oscillator));

oscillator.disconnect(customAudioNode);
customAudioNode.disconnect();
compressor.disconnect();

assert(!audioContext.destination.$isConnectedFrom(compressor));
assert(!compressor.$isConnectedFrom(customAudioNode.outlet));
assert(!customAudioNode.inlet.$isConnectedFrom(oscillator));
});
});
describe("unuse(): void", function() {
before(PowerAudioNode.unuse);
it("works", function() {
var audioContext = new global.AudioContext();
var oscillator = audioContext.createOscillator();
var customAudioNode = new CustomAudioNode(audioContext);
var compressor = audioContext.createDynamicsCompressor();

assert.throws(function() {
oscillator.connect(customAudioNode);
});
customAudioNode.connect(compressor);
compressor.connect(audioContext.destination);

assert(audioContext.destination.$isConnectedFrom(compressor));
assert(compressor.$isConnectedFrom(customAudioNode.outlet));
assert(!customAudioNode.inlet.$isConnectedFrom(oscillator));

oscillator.disconnect();
customAudioNode.disconnect();
compressor.disconnect();

assert(!audioContext.destination.$isConnectedFrom(compressor));
assert(!compressor.$isConnectedFrom(customAudioNode.outlet));
assert(!customAudioNode.inlet.$isConnectedFrom(oscillator));
});
});
});

关于javascript - 实现 JavaScript AudioNode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19895442/

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