wam-community
Version:
A collection of prebuilt Web Audio Modules ready for use
125 lines (108 loc) • 2.96 kB
JavaScript
/** @typedef {import('@webaudiomodules/api').WamProcessor} IWamProcessor */
/** @typedef {import('@webaudiomodules/api').WamEnv} IWamEnv */
/** @typedef {import('@webaudiomodules/api').WamGroup} IWamGroup */
/** @typedef {import('@webaudiomodules/api').WamEvent} WamEvent */
/** @typedef {import('@webaudiomodules/api').AudioWorkletGlobalScope} AudioWorkletGlobalScope */
/**
* @param {string} apiVersion
*/
const initializeWamEnv = (apiVersion) => {
/** @type {AudioWorkletGlobalScope} */
// @ts-ignore
const audioWorkletGlobalScope = globalThis;
if (audioWorkletGlobalScope.AudioWorkletProcessor
&& audioWorkletGlobalScope.webAudioModules) return; // already initialized
/** @type {Map<string, any>} */
const moduleScopes = new Map();
/** @type {Map<string, IWamGroup>} */
const groups = new Map();
/**
* @implements {IWamEnv}
*/
class WamEnv {
constructor() {}
get apiVersion() {
return apiVersion;
}
/**
* @param {string} moduleId
* @returns {Record<string, any>}
*/
getModuleScope(moduleId) {
if (!moduleScopes.has(moduleId)) moduleScopes.set(moduleId, {});
return moduleScopes.get(moduleId);
}
/**
* @param {string} groupId
* @param {string} groupKey
*/
getGroup(groupId, groupKey) {
const group = groups.get(groupId);
if (group.validate(groupKey)) return group;
else throw 'Invalid key';
}
/**
* @param {IWamGroup} group
*/
addGroup(group) {
if (!groups.has(group.groupId)) groups.set(group.groupId, group);
}
/**
* @param {IWamGroup} group
*/
removeGroup(group) {
groups.delete(group.groupId);
}
/**
* @param {IWamProcessor} wam
*/
addWam(wam) {
/** @type {IWamGroup} */
const group = groups.get(wam.groupId);
group.addWam(wam);
}
/**
* @param {IWamProcessor} wam
*/
removeWam(wam) {
/** @type {IWamGroup} */
const group = groups.get(wam.groupId);
group.removeWam(wam);
}
/**
* @param {string} groupId
* @param {string} fromId
* @param {string} toId
* @param {number} [output]
*/
connectEvents(groupId, fromId, toId, output = 0) {
/** @type {IWamGroup} */
const group = groups.get(groupId);
group.connectEvents(fromId, toId, output);
}
/**
* @param {string} groupId
* @param {string} fromId
* @param {string} [toId]
* @param {number} [output]
*/
disconnectEvents(groupId, fromId, toId, output) {
/** @type {IWamGroup} */
const group = groups.get(groupId);
group.disconnectEvents(fromId, toId, output);
}
/**
* @param {IWamProcessor} from
* @param {WamEvent[]} events
*/
emitEvents(from, ...events) {
/** @type {IWamGroup} */
const group = groups.get(from.groupId);
group.emitEvents(from, ...events);
}
}
if (audioWorkletGlobalScope.AudioWorkletProcessor) {
if (!audioWorkletGlobalScope.webAudioModules) audioWorkletGlobalScope.webAudioModules = new WamEnv();
}
};
export default initializeWamEnv;