@utsp/audio 0.5.0-nightly.20251203194806.f816057 → 0.5.0-nightly.20251204224600.55bf8ac
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AudioManager.js +178 -7
- package/dist/AudioManager.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +29 -0
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
package/dist/AudioManager.js
CHANGED
|
@@ -26,6 +26,9 @@
|
|
|
26
26
|
* audio.playTone(440, 0.5); // A4 note for 0.5 seconds
|
|
27
27
|
* ```
|
|
28
28
|
*/
|
|
29
|
+
/* eslint-disable no-undef */
|
|
30
|
+
// Web Audio API types (AudioNode, BiquadFilterNode, ConvolverNode, etc.)
|
|
31
|
+
// are globally available in browser environments
|
|
29
32
|
import { SoundBank } from './SoundBank';
|
|
30
33
|
/**
|
|
31
34
|
* AudioManager - Main audio management class
|
|
@@ -47,14 +50,19 @@ export class AudioManager {
|
|
|
47
50
|
// Spatial sounds that need real-time updates when listener moves
|
|
48
51
|
spatialSounds = new Map();
|
|
49
52
|
// Spatial audio configuration
|
|
53
|
+
// Default values are suitable for typical game worlds (0-1000 range)
|
|
54
|
+
// For larger worlds, call configureSpatial() with appropriate values
|
|
50
55
|
spatialConfig = {
|
|
51
|
-
listenerX:
|
|
52
|
-
listenerY:
|
|
53
|
-
maxDistance:
|
|
54
|
-
referenceDistance:
|
|
56
|
+
listenerX: 0,
|
|
57
|
+
listenerY: 0,
|
|
58
|
+
maxDistance: 200, // Sounds audible up to 200 units away
|
|
59
|
+
referenceDistance: 20, // Full volume within 20 units
|
|
55
60
|
rolloffFactor: 1.0,
|
|
56
|
-
panSpread: 0
|
|
61
|
+
panSpread: 1.0, // Full stereo panning
|
|
57
62
|
};
|
|
63
|
+
// Shared reverb convolver (lazy initialized)
|
|
64
|
+
reverbConvolver = null;
|
|
65
|
+
reverbGain = null;
|
|
58
66
|
constructor(options = {}) {
|
|
59
67
|
this.options = {
|
|
60
68
|
debug: options.debug ?? false,
|
|
@@ -357,7 +365,7 @@ export class AudioManager {
|
|
|
357
365
|
const gainNode = ctx.createGain();
|
|
358
366
|
const baseVolume = options.volume ?? 1.0;
|
|
359
367
|
const fadeInDuration = options.fadeIn ?? 0;
|
|
360
|
-
// Instance data
|
|
368
|
+
// Instance data (outputNode will be set after connecting)
|
|
361
369
|
const instance = {
|
|
362
370
|
source,
|
|
363
371
|
gainNode,
|
|
@@ -372,6 +380,7 @@ export class AudioManager {
|
|
|
372
380
|
loop: options.loop ?? false,
|
|
373
381
|
playbackRate: options.pitch ?? 1.0,
|
|
374
382
|
buffer: sound.buffer,
|
|
383
|
+
outputNode: gainNode, // Will be updated if panner is added
|
|
375
384
|
};
|
|
376
385
|
// Calculate initial and target volumes
|
|
377
386
|
let initialVolume = baseVolume;
|
|
@@ -400,6 +409,7 @@ export class AudioManager {
|
|
|
400
409
|
instance.pannerNode = pannerNode;
|
|
401
410
|
instance.position = { x: options.position.x, y: options.position.y };
|
|
402
411
|
instance.targetVolume = targetVolume;
|
|
412
|
+
instance.outputNode = pannerNode; // Output is panner for spatial sounds
|
|
403
413
|
// Register for real-time spatial updates
|
|
404
414
|
this.spatialSounds.set(source, {
|
|
405
415
|
gainNode,
|
|
@@ -422,9 +432,14 @@ export class AudioManager {
|
|
|
422
432
|
}
|
|
423
433
|
source.connect(gainNode);
|
|
424
434
|
gainNode.connect(this.masterGainNode);
|
|
435
|
+
// outputNode stays as gainNode (default)
|
|
425
436
|
}
|
|
426
437
|
// Register instance
|
|
427
438
|
this.instances.set(instanceId, instance);
|
|
439
|
+
// Apply initial effects if specified
|
|
440
|
+
if (options.lowpass || options.highpass || options.reverb) {
|
|
441
|
+
this.setEffects(instanceId, options.lowpass, options.highpass, options.reverb);
|
|
442
|
+
}
|
|
428
443
|
// Track by sound name for stopping all instances of a sound
|
|
429
444
|
if (!this.instancesBySound.has(sound.name)) {
|
|
430
445
|
this.instancesBySound.set(sound.name, new Set());
|
|
@@ -913,6 +928,7 @@ export class AudioManager {
|
|
|
913
928
|
* ```
|
|
914
929
|
*/
|
|
915
930
|
configureSpatial(config) {
|
|
931
|
+
this.log(`configureSpatial called with: ${JSON.stringify(config)}`);
|
|
916
932
|
if (config.listenerX !== undefined) {
|
|
917
933
|
this.spatialConfig.listenerX = Math.max(0, Math.min(65535, config.listenerX));
|
|
918
934
|
}
|
|
@@ -931,6 +947,7 @@ export class AudioManager {
|
|
|
931
947
|
if (config.panSpread !== undefined) {
|
|
932
948
|
this.spatialConfig.panSpread = Math.max(0, Math.min(1, config.panSpread));
|
|
933
949
|
}
|
|
950
|
+
this.log(`spatialConfig now: maxDistance=${this.spatialConfig.maxDistance}, refDist=${this.spatialConfig.referenceDistance}, panSpread=${this.spatialConfig.panSpread}`);
|
|
934
951
|
}
|
|
935
952
|
/**
|
|
936
953
|
* Get current spatial audio configuration
|
|
@@ -938,6 +955,159 @@ export class AudioManager {
|
|
|
938
955
|
getSpatialConfig() {
|
|
939
956
|
return { ...this.spatialConfig };
|
|
940
957
|
}
|
|
958
|
+
/**
|
|
959
|
+
* Set audio effects on a playing sound instance
|
|
960
|
+
*
|
|
961
|
+
* @param instanceId - The instance ID returned by play()
|
|
962
|
+
* @param lowpass - Low-pass filter cutoff in Hz (0 = disable)
|
|
963
|
+
* @param highpass - High-pass filter cutoff in Hz (0 = disable)
|
|
964
|
+
* @param reverb - Reverb wet/dry mix 0.0-1.0 (0 = disable)
|
|
965
|
+
*/
|
|
966
|
+
setEffects(instanceId, lowpass, highpass, reverb) {
|
|
967
|
+
if (!this.audioContext || !this.masterGainNode) {
|
|
968
|
+
return;
|
|
969
|
+
}
|
|
970
|
+
const instance = this.instances.get(instanceId);
|
|
971
|
+
if (!instance || instance.stopped) {
|
|
972
|
+
this.log(`setEffects: instance ${instanceId} not found or stopped`);
|
|
973
|
+
return;
|
|
974
|
+
}
|
|
975
|
+
const ctx = this.audioContext;
|
|
976
|
+
// Handle low-pass filter
|
|
977
|
+
if (lowpass !== undefined) {
|
|
978
|
+
if (lowpass > 0) {
|
|
979
|
+
if (!instance.lowpassNode) {
|
|
980
|
+
// Create lowpass filter and insert in chain
|
|
981
|
+
instance.lowpassNode = ctx.createBiquadFilter();
|
|
982
|
+
instance.lowpassNode.type = 'lowpass';
|
|
983
|
+
instance.lowpassNode.Q.value = 1.0;
|
|
984
|
+
this.insertFilterNode(instance, instance.lowpassNode);
|
|
985
|
+
}
|
|
986
|
+
instance.lowpassNode.frequency.setValueAtTime(lowpass, ctx.currentTime);
|
|
987
|
+
this.log(`setEffects: instance ${instanceId} lowpass=${lowpass}Hz`);
|
|
988
|
+
}
|
|
989
|
+
else if (instance.lowpassNode) {
|
|
990
|
+
// Remove lowpass filter
|
|
991
|
+
this.removeFilterNode(instance, instance.lowpassNode);
|
|
992
|
+
instance.lowpassNode = undefined;
|
|
993
|
+
this.log(`setEffects: instance ${instanceId} lowpass disabled`);
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
// Handle high-pass filter
|
|
997
|
+
if (highpass !== undefined) {
|
|
998
|
+
if (highpass > 0) {
|
|
999
|
+
if (!instance.highpassNode) {
|
|
1000
|
+
// Create highpass filter and insert in chain
|
|
1001
|
+
instance.highpassNode = ctx.createBiquadFilter();
|
|
1002
|
+
instance.highpassNode.type = 'highpass';
|
|
1003
|
+
instance.highpassNode.Q.value = 1.0;
|
|
1004
|
+
this.insertFilterNode(instance, instance.highpassNode);
|
|
1005
|
+
}
|
|
1006
|
+
instance.highpassNode.frequency.setValueAtTime(highpass, ctx.currentTime);
|
|
1007
|
+
this.log(`setEffects: instance ${instanceId} highpass=${highpass}Hz`);
|
|
1008
|
+
}
|
|
1009
|
+
else if (instance.highpassNode) {
|
|
1010
|
+
// Remove highpass filter
|
|
1011
|
+
this.removeFilterNode(instance, instance.highpassNode);
|
|
1012
|
+
instance.highpassNode = undefined;
|
|
1013
|
+
this.log(`setEffects: instance ${instanceId} highpass disabled`);
|
|
1014
|
+
}
|
|
1015
|
+
}
|
|
1016
|
+
// Handle reverb
|
|
1017
|
+
if (reverb !== undefined) {
|
|
1018
|
+
if (reverb > 0) {
|
|
1019
|
+
// Ensure shared reverb is initialized
|
|
1020
|
+
this.ensureReverbInitialized();
|
|
1021
|
+
if (!instance.reverbSendNode && this.reverbConvolver) {
|
|
1022
|
+
// Create reverb send and connect
|
|
1023
|
+
instance.reverbSendNode = ctx.createGain();
|
|
1024
|
+
instance.reverbSendNode.gain.value = 0;
|
|
1025
|
+
// Connect from the instance's output node (before master) to reverb
|
|
1026
|
+
instance.outputNode.connect(instance.reverbSendNode);
|
|
1027
|
+
instance.reverbSendNode.connect(this.reverbConvolver);
|
|
1028
|
+
}
|
|
1029
|
+
if (instance.reverbSendNode) {
|
|
1030
|
+
instance.reverbSendNode.gain.setValueAtTime(reverb, ctx.currentTime);
|
|
1031
|
+
this.log(`setEffects: instance ${instanceId} reverb=${reverb.toFixed(2)}`);
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
else if (instance.reverbSendNode) {
|
|
1035
|
+
// Disable reverb (set to 0, but keep node for potential re-enable)
|
|
1036
|
+
instance.reverbSendNode.gain.setValueAtTime(0, ctx.currentTime);
|
|
1037
|
+
this.log(`setEffects: instance ${instanceId} reverb disabled`);
|
|
1038
|
+
}
|
|
1039
|
+
}
|
|
1040
|
+
}
|
|
1041
|
+
/**
|
|
1042
|
+
* Initialize the shared reverb convolver (lazy)
|
|
1043
|
+
*/
|
|
1044
|
+
ensureReverbInitialized() {
|
|
1045
|
+
if (this.reverbConvolver || !this.audioContext || !this.masterGainNode) {
|
|
1046
|
+
return;
|
|
1047
|
+
}
|
|
1048
|
+
const ctx = this.audioContext;
|
|
1049
|
+
// Create a synthetic impulse response (~0.5s, mono, low sample rate)
|
|
1050
|
+
const sampleRate = ctx.sampleRate;
|
|
1051
|
+
const duration = 0.5;
|
|
1052
|
+
const length = Math.floor(sampleRate * duration);
|
|
1053
|
+
const buffer = ctx.createBuffer(1, length, sampleRate);
|
|
1054
|
+
const data = buffer.getChannelData(0);
|
|
1055
|
+
// Simple exponential decay with some noise for natural sound
|
|
1056
|
+
for (let i = 0; i < length; i++) {
|
|
1057
|
+
const t = i / sampleRate;
|
|
1058
|
+
const decay = Math.exp(-t * 6); // Fast decay
|
|
1059
|
+
data[i] = (Math.random() * 2 - 1) * decay;
|
|
1060
|
+
}
|
|
1061
|
+
// Create convolver and connect to master
|
|
1062
|
+
this.reverbConvolver = ctx.createConvolver();
|
|
1063
|
+
this.reverbConvolver.buffer = buffer;
|
|
1064
|
+
// Reverb gain (overall wet level)
|
|
1065
|
+
this.reverbGain = ctx.createGain();
|
|
1066
|
+
this.reverbGain.gain.value = 0.5; // 50% of reverb signal
|
|
1067
|
+
this.reverbConvolver.connect(this.reverbGain);
|
|
1068
|
+
this.reverbGain.connect(this.masterGainNode);
|
|
1069
|
+
this.log('Shared reverb initialized');
|
|
1070
|
+
}
|
|
1071
|
+
/**
|
|
1072
|
+
* Insert a filter node into the instance's audio chain
|
|
1073
|
+
*/
|
|
1074
|
+
insertFilterNode(instance, filterNode) {
|
|
1075
|
+
if (!this.masterGainNode)
|
|
1076
|
+
return;
|
|
1077
|
+
// Disconnect output from master and reconnect through filter
|
|
1078
|
+
// Use try/catch because the connection may not exist (e.g., if another filter is in the chain)
|
|
1079
|
+
try {
|
|
1080
|
+
instance.outputNode.disconnect(this.masterGainNode);
|
|
1081
|
+
}
|
|
1082
|
+
catch {
|
|
1083
|
+
// Not connected to master directly, that's OK
|
|
1084
|
+
}
|
|
1085
|
+
instance.outputNode.connect(filterNode);
|
|
1086
|
+
filterNode.connect(this.masterGainNode);
|
|
1087
|
+
// If there's a reverb send, it stays connected to outputNode
|
|
1088
|
+
}
|
|
1089
|
+
/**
|
|
1090
|
+
* Remove a filter node from the instance's audio chain
|
|
1091
|
+
*/
|
|
1092
|
+
removeFilterNode(instance, filterNode) {
|
|
1093
|
+
if (!this.masterGainNode)
|
|
1094
|
+
return;
|
|
1095
|
+
// Disconnect filter and reconnect output directly to master
|
|
1096
|
+
// Use try/catch because connections may have changed
|
|
1097
|
+
try {
|
|
1098
|
+
filterNode.disconnect();
|
|
1099
|
+
}
|
|
1100
|
+
catch {
|
|
1101
|
+
// Already disconnected
|
|
1102
|
+
}
|
|
1103
|
+
try {
|
|
1104
|
+
instance.outputNode.disconnect(filterNode);
|
|
1105
|
+
}
|
|
1106
|
+
catch {
|
|
1107
|
+
// Not connected
|
|
1108
|
+
}
|
|
1109
|
+
instance.outputNode.connect(this.masterGainNode);
|
|
1110
|
+
}
|
|
941
1111
|
/**
|
|
942
1112
|
* Calculate stereo pan and volume based on sound position relative to listener
|
|
943
1113
|
*
|
|
@@ -982,7 +1152,8 @@ export class AudioManager {
|
|
|
982
1152
|
}
|
|
983
1153
|
this.log(`Spatial: listener(${listenerX.toFixed(1)}, ${listenerY.toFixed(1)}) ` +
|
|
984
1154
|
`sound(${soundX.toFixed(1)}, ${soundY.toFixed(1)}) ` +
|
|
985
|
-
`dist=${distance.toFixed(1)} vol=${distanceVolume.toFixed(2)} pan=${pan.toFixed(2)}`
|
|
1155
|
+
`dist=${distance.toFixed(1)} vol=${distanceVolume.toFixed(2)} pan=${pan.toFixed(2)} ` +
|
|
1156
|
+
`[dx=${dx.toFixed(1)} maxDist=${maxDistance} panSpread=${panSpread}]`);
|
|
986
1157
|
return { pan, distanceVolume };
|
|
987
1158
|
}
|
|
988
1159
|
/**
|
package/dist/AudioManager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioManager.js","sourceRoot":"","sources":["../src/AudioManager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AudioManager.js","sourceRoot":"","sources":["../src/AudioManager.ts"],"names":[],"mappings":"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"}
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var y=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var B=(f,e,t)=>e in f?y(f,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):f[e]=t;var S=(f,e)=>y(f,"name",{value:e,configurable:!0});var M=(f,e)=>{for(var t in e)y(f,t,{get:e[t],enumerable:!0})},w=(f,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of T(e))!N.call(f,o)&&o!==t&&y(f,o,{get:()=>e[o],enumerable:!(n=I(e,o))||n.enumerable});return f};var k=f=>w(y({},"__esModule",{value:!0}),f);var c=(f,e,t)=>(B(f,typeof e!="symbol"?e+"":e,t),t);var V={};M(V,{AudioManager:()=>C,SoundBank:()=>g});module.exports=k(V);var v=class v{constructor(e,t=!1){c(this,"sounds",new Map);c(this,"nameToId",new Map);c(this,"audioContext");c(this,"debug");this.audioContext=e,this.debug=t,this.log("SoundBank created")}async loadFromData(e,t,n){this.log(`Loading sound from data: ${t} (${n.length} bytes)`);try{let o=await this.decodeAudio(n);this.store(e,t,o,{source:"file",originalSize:n.length,loadedAt:Date.now()}),this.log(`\u2713 Loaded: ${t} (${o.duration.toFixed(2)}s)`)}catch(o){throw console.error(`[SoundBank] Failed to decode sound "${t}":`,o),o}}async loadFromUrl(e,t,n,o){this.log(`Loading sound from URL: ${t} \u2192 ${n}`);try{let i=await fetch(n);if(!i.ok)throw new Error(`HTTP ${i.status}: ${i.statusText}`);let r=i.headers.get("content-length"),d=r?parseInt(r,10):0,a;if(d>0&&o&&i.body){let u=i.body.getReader(),l=[],p=0;for(;;){let{done:m,value:h}=await u.read();if(m)break;l.push(h),p+=h.length,o(p,d)}let x=new Uint8Array(p),A=0;for(let m of l)x.set(m,A),A+=m.length;a=x.buffer}else a=await i.arrayBuffer();let s=await this.decodeAudio(new Uint8Array(a));this.store(e,t,s,{source:"external",originalSize:a.byteLength,originalUrl:n,loadedAt:Date.now()}),this.log(`\u2713 Loaded from URL: ${t} (${s.duration.toFixed(2)}s)`)}catch(i){throw console.error(`[SoundBank] Failed to load sound "${t}" from ${n}:`,i),i}}loadFromBuffer(e,t,n){this.log(`Loading sound from buffer: ${t}`),this.store(e,t,n,{source:"procedural",loadedAt:Date.now()}),this.log(`\u2713 Loaded from buffer: ${t} (${n.duration.toFixed(2)}s)`)}store(e,t,n,o){if(this.sounds.has(e)){let r=this.sounds.get(e);this.log(`Replacing sound ID ${e} (was: ${r.name}, now: ${t})`),this.nameToId.delete(r.name)}if(this.nameToId.has(t)){let r=this.nameToId.get(t);r!==e&&this.log(`Warning: Sound name "${t}" already exists with ID ${r}`)}let i={soundId:e,name:t,buffer:n,duration:n.duration,metadata:o};this.sounds.set(e,i),this.nameToId.set(t,e)}async decodeAudio(e){let t=new ArrayBuffer(e.byteLength);return new Uint8Array(t).set(e),this.audioContext.decodeAudioData(t)}get(e){if(typeof e=="number")return this.sounds.get(e);let t=this.nameToId.get(e);return t!==void 0?this.sounds.get(t):void 0}has(e){return this.get(e)!==void 0}getAll(){return Array.from(this.sounds.values())}getNames(){return Array.from(this.nameToId.keys())}get size(){return this.sounds.size}remove(e){let t=this.get(e);return t?(this.sounds.delete(t.soundId),this.nameToId.delete(t.name),this.log(`Removed sound: ${t.name}`),!0):!1}clear(){let e=this.sounds.size;this.sounds.clear(),this.nameToId.clear(),this.log(`Cleared ${e} sounds`)}getStats(){let e=this.getAll(),t=0;for(let n of e){let{buffer:o}=n;t+=o.length*o.numberOfChannels*4}return{totalSounds:e.length,totalDuration:e.reduce((n,o)=>n+o.duration,0),estimatedMemory:t,bySource:{file:e.filter(n=>n.metadata.source==="file").length,external:e.filter(n=>n.metadata.source==="external").length,procedural:e.filter(n=>n.metadata.source==="procedural").length}}}log(e){this.debug&&console.warn(`[SoundBank] ${e}`)}};S(v,"SoundBank");var g=v;var $=class ${constructor(e={}){c(this,"audioContext",null);c(this,"masterGainNode",null);c(this,"soundBank",null);c(this,"options");c(this,"initialized",!1);c(this,"nextInstanceId",1);c(this,"instances",new Map);c(this,"instancesBySound",new Map);c(this,"activeSounds",new Set);c(this,"spatialSounds",new Map);c(this,"spatialConfig",{listenerX:32768,listenerY:32768,maxDistance:16384,referenceDistance:1024,rolloffFactor:1,panSpread:.8});this.options={debug:e.debug??!1,masterVolume:e.masterVolume??1},this.log("AudioManager created")}initialize(){if(this.initialized&&this.audioContext)return this.log("AudioContext already initialized"),!0;try{let e=window.AudioContext||window.webkitAudioContext;return e?(this.audioContext=new e,this.log(`AudioContext initialized (state: ${this.audioContext.state}, sampleRate: ${this.audioContext.sampleRate}Hz)`),this.masterGainNode=this.audioContext.createGain(),this.masterGainNode.gain.value=this.options.masterVolume,this.masterGainNode.connect(this.audioContext.destination),this.audioContext.state==="suspended"&&this.audioContext.resume().then(()=>{this.log("AudioContext resumed")}),this.soundBank=new g(this.audioContext,this.options.debug),this.initialized=!0,!0):(console.warn("[AudioManager] Web Audio API not supported"),!1)}catch(e){return console.error("[AudioManager] Failed to initialize AudioContext:",e),!1}}isInitialized(){return this.initialized&&this.audioContext!==null}getContext(){return this.audioContext}getMasterGain(){return this.masterGainNode}setMasterVolume(e){this.options.masterVolume=Math.max(0,Math.min(1,e)),this.masterGainNode&&(this.masterGainNode.gain.value=this.options.masterVolume),this.log(`Master volume set to ${this.options.masterVolume}`)}getMasterVolume(){return this.options.masterVolume}playStartSound(){if(!this.audioContext||!this.masterGainNode){this.log("Cannot play sound: AudioContext not initialized");return}try{let e=this.audioContext,t=e.currentTime,n=[262,330,392,523],o=.06,i=.07;n.forEach((r,d)=>{let a=t+d*i,s=e.createOscillator();s.type="square",s.frequency.setValueAtTime(r,a);let u=e.createGain();u.gain.setValueAtTime(0,a),u.gain.linearRampToValueAtTime(.15,a+.005),u.gain.setValueAtTime(.15,a+o-.01),u.gain.linearRampToValueAtTime(0,a+o),s.connect(u),u.connect(this.masterGainNode),s.start(a),s.stop(a+o)}),this.log("Start sound played (retro arpeggio)")}catch(e){console.error("[AudioManager] Failed to play start sound:",e)}}playTone(e,t,n={}){if(!this.audioContext||!this.masterGainNode){this.log("Cannot play tone: AudioContext not initialized");return}let{type:o="sine",volume:i=.3,attack:r=.01,release:d=.1}=n;try{let a=this.audioContext,s=a.currentTime,u=a.createOscillator();u.type=o,u.frequency.setValueAtTime(e,s);let l=a.createGain();l.gain.setValueAtTime(0,s),l.gain.linearRampToValueAtTime(i,s+r),l.gain.setValueAtTime(i,s+t-d),l.gain.linearRampToValueAtTime(0,s+t),u.connect(l),l.connect(this.masterGainNode),u.start(s),u.stop(s+t),this.log(`Tone played: ${e}Hz for ${t}s`)}catch(a){console.error("[AudioManager] Failed to play tone:",a)}}playNote(e,t,n={}){let o=this.noteToFrequency(e);if(o===null){console.warn(`[AudioManager] Invalid note: ${e}`);return}this.playTone(o,t,n)}noteToFrequency(e){let t=/^([A-Ga-g])([#b]?)(\d)$/,n=e.match(t);if(!n)return null;let[,o,i,r]=n,d=parseInt(r,10),s={C:0,D:2,E:4,F:5,G:7,A:9,B:11}[o.toUpperCase()];if(s===void 0)return null;i==="#"?s+=1:i==="b"&&(s-=1);let u=s+(d+1)*12;return 440*Math.pow(2,(u-49)/12)}async resumeContext(){this.audioContext&&this.audioContext.state==="suspended"&&(await this.audioContext.resume(),this.log("AudioContext resumed"))}async suspendContext(){this.audioContext&&this.audioContext.state==="running"&&(await this.audioContext.suspend(),this.log("AudioContext suspended"))}getState(){return this.audioContext?.state??null}getSoundBank(){return this.soundBank}play(e,t={}){if(!this.audioContext||!this.masterGainNode||!this.soundBank)return this.log("Cannot play: not initialized"),null;let n=this.soundBank.get(e);if(!n)return console.warn(`[AudioManager] Sound not found: ${e}`),null;try{let o=this.audioContext,i=t.instanceId??this.nextInstanceId++;t.instanceId!==void 0&&t.instanceId>=this.nextInstanceId&&(this.nextInstanceId=t.instanceId+1);let r=o.createBufferSource();r.buffer=n.buffer,r.loop=t.loop??!1,r.playbackRate.value=t.pitch??1;let d=o.createGain(),a=t.volume??1,s=t.fadeIn??0,u={source:r,gainNode:d,soundName:n.name,stopped:!1,baseVolume:a,targetVolume:a,fadingOut:!1,paused:!1,pausedAt:0,startedAt:o.currentTime,loop:t.loop??!1,playbackRate:t.pitch??1,buffer:n.buffer},l=a,p=a;if(t.position){let{pan:m,distanceVolume:h}=this.calculateSpatialAudio(t.position.x,t.position.y),b=o.createStereoPanner();b.pan.value=m,l=s>0?0:a*h,p=a*h,d.gain.setValueAtTime(l,o.currentTime),s>0&&(d.gain.linearRampToValueAtTime(p,o.currentTime+s),this.log(`Fade in: ${n.name} [#${i}] over ${s}s`)),r.connect(d),d.connect(b),b.connect(this.masterGainNode),u.pannerNode=b,u.position={x:t.position.x,y:t.position.y},u.targetVolume=p,this.spatialSounds.set(r,{gainNode:d,pannerNode:b,position:{x:t.position.x,y:t.position.y},baseVolume:a}),this.log(`Playing spatial: ${n.name} [#${i}] at (${t.position.x}, ${t.position.y}) pan=${m.toFixed(2)} vol=${h.toFixed(2)}`)}else l=s>0?0:a,p=a,d.gain.setValueAtTime(l,o.currentTime),s>0&&(d.gain.linearRampToValueAtTime(p,o.currentTime+s),this.log(`Fade in: ${n.name} [#${i}] over ${s}s`)),r.connect(d),d.connect(this.masterGainNode);this.instances.set(i,u),this.instancesBySound.has(n.name)||this.instancesBySound.set(n.name,new Set),this.instancesBySound.get(n.name).add(i),this.activeSounds.add(r),r.onended=()=>{u.paused||this.cleanupInstance(i)},r.start(0,t.offset??0),t.position||this.log(`Playing: ${n.name} [#${i}]`);let x=this.stop.bind(this),A=this.instances;return{instanceId:i,stop:()=>{x(i)},get playing(){let m=A.get(i);return m!==void 0&&!m.stopped},sound:n}}catch(o){return console.error(`[AudioManager] Failed to play sound "${e}":`,o),null}}stop(e){return e==="all"?this.stopAll():typeof e=="number"?this.stopInstance(e)?1:0:this.stopByName(e)}fadeOut(e,t){if(!this.audioContext)return 0;let n=Math.max(.01,t);return e==="all"?this.fadeOutAll(n):typeof e=="number"?this.fadeOutInstance(e,n)?1:0:this.fadeOutByName(e,n)}fadeOutInstance(e,t){let n=this.instances.get(e);if(!n||n.stopped||n.fadingOut||!this.audioContext)return!1;let o=this.audioContext;n.fadingOut=!0;let i=n.gainNode.gain.value;return n.gainNode.gain.cancelScheduledValues(o.currentTime),n.gainNode.gain.setValueAtTime(i,o.currentTime),n.gainNode.gain.linearRampToValueAtTime(0,o.currentTime+t),setTimeout(()=>{this.stopInstance(e)},t*1e3),this.log(`Fading out instance #${e} (${n.soundName}) over ${t}s`),!0}fadeOutByName(e,t){let n=this.instancesBySound.get(e);if(!n||n.size===0)return 0;let o=0;for(let i of Array.from(n))this.fadeOutInstance(i,t)&&o++;return this.log(`Fading out ${o} instances of "${e}" over ${t}s`),o}fadeOutAll(e){let t=0;for(let n of Array.from(this.instances.keys()))this.fadeOutInstance(n,e)&&t++;return this.log(`Fading out all sounds (${t} instances) over ${e}s`),t}pause(e){return e==="all"?this.pauseAll():typeof e=="number"?this.pauseInstance(e)?1:0:this.pauseByName(e)}pauseInstance(e){let t=this.instances.get(e);if(!t||t.stopped||t.paused||t.fadingOut||!this.audioContext)return!1;let o=(this.audioContext.currentTime-t.startedAt)*t.playbackRate;if(t.loop)t.pausedAt=o%t.buffer.duration;else if(t.pausedAt=o,t.pausedAt>=t.buffer.duration)return!1;try{t.source.stop()}catch{}return t.paused=!0,this.log(`Paused instance #${e} (${t.soundName}) at ${t.pausedAt.toFixed(2)}s`),!0}pauseByName(e){let t=this.instancesBySound.get(e);if(!t||t.size===0)return 0;let n=0;for(let o of Array.from(t))this.pauseInstance(o)&&n++;return this.log(`Paused ${n} instances of "${e}"`),n}pauseAll(){let e=0;for(let t of Array.from(this.instances.keys()))this.pauseInstance(t)&&e++;return this.log(`Paused all sounds (${e} instances)`),e}resume(e){return e==="all"?this.resumeAll():typeof e=="number"?this.resumeInstance(e)?1:0:this.resumeByName(e)}resumeInstance(e){let t=this.instances.get(e);if(!t||t.stopped||!t.paused||!this.audioContext||!this.masterGainNode)return!1;let n=this.audioContext,o=n.createBufferSource();return o.buffer=t.buffer,o.loop=t.loop,o.playbackRate.value=t.playbackRate,o.connect(t.gainNode),t.source=o,t.paused=!1,t.startedAt=n.currentTime-t.pausedAt/t.playbackRate,o.onended=()=>{t.paused||this.cleanupInstance(e)},o.start(0,t.pausedAt),this.log(`Resumed instance #${e} (${t.soundName}) from ${t.pausedAt.toFixed(2)}s`),!0}resumeByName(e){let t=this.instancesBySound.get(e);if(!t||t.size===0)return 0;let n=0;for(let o of Array.from(t))this.resumeInstance(o)&&n++;return this.log(`Resumed ${n} instances of "${e}"`),n}resumeAll(){let e=0;for(let t of Array.from(this.instances.keys()))this.resumeInstance(t)&&e++;return this.log(`Resumed all sounds (${e} instances)`),e}stopInstance(e){let t=this.instances.get(e);if(!t||t.stopped)return!1;try{t.source.stop(),t.stopped=!0,this.log(`Stopped instance #${e} (${t.soundName})`)}catch{}return this.cleanupInstance(e),!0}stopByName(e){let t=this.instancesBySound.get(e);if(!t||t.size===0)return 0;let n=0;for(let o of Array.from(t))this.stopInstance(o)&&n++;return this.log(`Stopped ${n} instances of "${e}"`),n}cleanupInstance(e){let t=this.instances.get(e);if(!t)return;this.instances.delete(e);let n=this.instancesBySound.get(t.soundName);n&&(n.delete(e),n.size===0&&this.instancesBySound.delete(t.soundName)),this.activeSounds.delete(t.source),this.spatialSounds.delete(t.source)}setListenerPosition(e,t){e===this.spatialConfig.listenerX&&t===this.spatialConfig.listenerY||(this.spatialConfig.listenerX=e,this.spatialConfig.listenerY=t,this.spatialSounds.size>0&&this.updateAllSpatialSounds())}updateAllSpatialSounds(){for(let[e,t]of this.spatialSounds){if(!this.activeSounds.has(e)){this.spatialSounds.delete(e);continue}let{pan:n,distanceVolume:o}=this.calculateSpatialAudio(t.position.x,t.position.y);t.pannerNode.pan.value=n,t.gainNode.gain.value=t.baseVolume*o}}getListenerPosition(){return{x:this.spatialConfig.listenerX,y:this.spatialConfig.listenerY}}configureSpatial(e){e.listenerX!==void 0&&(this.spatialConfig.listenerX=Math.max(0,Math.min(65535,e.listenerX))),e.listenerY!==void 0&&(this.spatialConfig.listenerY=Math.max(0,Math.min(65535,e.listenerY))),e.maxDistance!==void 0&&(this.spatialConfig.maxDistance=Math.max(1,e.maxDistance)),e.referenceDistance!==void 0&&(this.spatialConfig.referenceDistance=Math.max(1,e.referenceDistance)),e.rolloffFactor!==void 0&&(this.spatialConfig.rolloffFactor=Math.max(0,e.rolloffFactor)),e.panSpread!==void 0&&(this.spatialConfig.panSpread=Math.max(0,Math.min(1,e.panSpread)))}getSpatialConfig(){return{...this.spatialConfig}}calculateSpatialAudio(e,t){let{listenerX:n,listenerY:o,maxDistance:i,referenceDistance:r,panSpread:d}=this.spatialConfig,a=e-n,s=t-o,u=Math.sqrt(a*a+s*s),l;u<=r?l=1:u>=i?l=0:l=1-(u-r)/(i-r);let p=0;return i>0&&d>0&&(p=a/i*d,p=Math.max(-1,Math.min(1,p))),this.log(`Spatial: listener(${n.toFixed(1)}, ${o.toFixed(1)}) sound(${e.toFixed(1)}, ${t.toFixed(1)}) dist=${u.toFixed(1)} vol=${l.toFixed(2)} pan=${p.toFixed(2)}`),{pan:p,distanceVolume:l}}stopAll(){let e=this.instances.size;for(let[,t]of this.instances)if(!t.stopped)try{t.source.stop(),t.stopped=!0}catch{}return this.instances.clear(),this.instancesBySound.clear(),this.activeSounds.clear(),this.spatialSounds.clear(),this.log(`Stopped all sounds (${e} instances)`),e}getPlayingCount(){return this.instances.size}getActiveInstances(){return Array.from(this.instances.keys())}isPlaying(e){let t=this.instances.get(e);return t!==void 0&&!t.stopped}destroy(){this.stopAll(),this.soundBank&&(this.soundBank.clear(),this.soundBank=null),this.audioContext&&(this.audioContext.close(),this.audioContext=null),this.masterGainNode=null,this.initialized=!1,this.log("AudioManager destroyed")}log(e){this.options.debug&&console.warn(`[AudioManager] ${e}`)}};S($,"AudioManager");var C=$;
|
|
1
|
+
"use strict";var y=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var B=Object.prototype.hasOwnProperty;var w=(f,e,t)=>e in f?y(f,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):f[e]=t;var S=(f,e)=>y(f,"name",{value:e,configurable:!0});var I=(f,e)=>{for(var t in e)y(f,t,{get:e[t],enumerable:!0})},M=(f,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of T(e))!B.call(f,i)&&i!==t&&y(f,i,{get:()=>e[i],enumerable:!(n=$(e,i))||n.enumerable});return f};var F=f=>M(y({},"__esModule",{value:!0}),f);var c=(f,e,t)=>(w(f,typeof e!="symbol"?e+"":e,t),t);var G={};I(G,{AudioManager:()=>A,SoundBank:()=>b});module.exports=F(G);var N=class N{constructor(e,t=!1){c(this,"sounds",new Map);c(this,"nameToId",new Map);c(this,"audioContext");c(this,"debug");this.audioContext=e,this.debug=t,this.log("SoundBank created")}async loadFromData(e,t,n){this.log(`Loading sound from data: ${t} (${n.length} bytes)`);try{let i=await this.decodeAudio(n);this.store(e,t,i,{source:"file",originalSize:n.length,loadedAt:Date.now()}),this.log(`\u2713 Loaded: ${t} (${i.duration.toFixed(2)}s)`)}catch(i){throw console.error(`[SoundBank] Failed to decode sound "${t}":`,i),i}}async loadFromUrl(e,t,n,i){this.log(`Loading sound from URL: ${t} \u2192 ${n}`);try{let o=await fetch(n);if(!o.ok)throw new Error(`HTTP ${o.status}: ${o.statusText}`);let s=o.headers.get("content-length"),u=s?parseInt(s,10):0,a;if(u>0&&i&&o.body){let d=o.body.getReader(),l=[],h=0;for(;;){let{done:p,value:m}=await d.read();if(p)break;l.push(m),h+=m.length,i(h,u)}let v=new Uint8Array(h),x=0;for(let p of l)v.set(p,x),x+=p.length;a=v.buffer}else a=await o.arrayBuffer();let r=await this.decodeAudio(new Uint8Array(a));this.store(e,t,r,{source:"external",originalSize:a.byteLength,originalUrl:n,loadedAt:Date.now()}),this.log(`\u2713 Loaded from URL: ${t} (${r.duration.toFixed(2)}s)`)}catch(o){throw console.error(`[SoundBank] Failed to load sound "${t}" from ${n}:`,o),o}}loadFromBuffer(e,t,n){this.log(`Loading sound from buffer: ${t}`),this.store(e,t,n,{source:"procedural",loadedAt:Date.now()}),this.log(`\u2713 Loaded from buffer: ${t} (${n.duration.toFixed(2)}s)`)}store(e,t,n,i){if(this.sounds.has(e)){let s=this.sounds.get(e);this.log(`Replacing sound ID ${e} (was: ${s.name}, now: ${t})`),this.nameToId.delete(s.name)}if(this.nameToId.has(t)){let s=this.nameToId.get(t);s!==e&&this.log(`Warning: Sound name "${t}" already exists with ID ${s}`)}let o={soundId:e,name:t,buffer:n,duration:n.duration,metadata:i};this.sounds.set(e,o),this.nameToId.set(t,e)}async decodeAudio(e){let t=new ArrayBuffer(e.byteLength);return new Uint8Array(t).set(e),this.audioContext.decodeAudioData(t)}get(e){if(typeof e=="number")return this.sounds.get(e);let t=this.nameToId.get(e);return t!==void 0?this.sounds.get(t):void 0}has(e){return this.get(e)!==void 0}getAll(){return Array.from(this.sounds.values())}getNames(){return Array.from(this.nameToId.keys())}get size(){return this.sounds.size}remove(e){let t=this.get(e);return t?(this.sounds.delete(t.soundId),this.nameToId.delete(t.name),this.log(`Removed sound: ${t.name}`),!0):!1}clear(){let e=this.sounds.size;this.sounds.clear(),this.nameToId.clear(),this.log(`Cleared ${e} sounds`)}getStats(){let e=this.getAll(),t=0;for(let n of e){let{buffer:i}=n;t+=i.length*i.numberOfChannels*4}return{totalSounds:e.length,totalDuration:e.reduce((n,i)=>n+i.duration,0),estimatedMemory:t,bySource:{file:e.filter(n=>n.metadata.source==="file").length,external:e.filter(n=>n.metadata.source==="external").length,procedural:e.filter(n=>n.metadata.source==="procedural").length}}}log(e){this.debug&&console.warn(`[SoundBank] ${e}`)}};S(N,"SoundBank");var b=N;var C=class C{constructor(e={}){c(this,"audioContext",null);c(this,"masterGainNode",null);c(this,"soundBank",null);c(this,"options");c(this,"initialized",!1);c(this,"nextInstanceId",1);c(this,"instances",new Map);c(this,"instancesBySound",new Map);c(this,"activeSounds",new Set);c(this,"spatialSounds",new Map);c(this,"spatialConfig",{listenerX:0,listenerY:0,maxDistance:200,referenceDistance:20,rolloffFactor:1,panSpread:1});c(this,"reverbConvolver",null);c(this,"reverbGain",null);this.options={debug:e.debug??!1,masterVolume:e.masterVolume??1},this.log("AudioManager created")}initialize(){if(this.initialized&&this.audioContext)return this.log("AudioContext already initialized"),!0;try{let e=window.AudioContext||window.webkitAudioContext;return e?(this.audioContext=new e,this.log(`AudioContext initialized (state: ${this.audioContext.state}, sampleRate: ${this.audioContext.sampleRate}Hz)`),this.masterGainNode=this.audioContext.createGain(),this.masterGainNode.gain.value=this.options.masterVolume,this.masterGainNode.connect(this.audioContext.destination),this.audioContext.state==="suspended"&&this.audioContext.resume().then(()=>{this.log("AudioContext resumed")}),this.soundBank=new b(this.audioContext,this.options.debug),this.initialized=!0,!0):(console.warn("[AudioManager] Web Audio API not supported"),!1)}catch(e){return console.error("[AudioManager] Failed to initialize AudioContext:",e),!1}}isInitialized(){return this.initialized&&this.audioContext!==null}getContext(){return this.audioContext}getMasterGain(){return this.masterGainNode}setMasterVolume(e){this.options.masterVolume=Math.max(0,Math.min(1,e)),this.masterGainNode&&(this.masterGainNode.gain.value=this.options.masterVolume),this.log(`Master volume set to ${this.options.masterVolume}`)}getMasterVolume(){return this.options.masterVolume}playStartSound(){if(!this.audioContext||!this.masterGainNode){this.log("Cannot play sound: AudioContext not initialized");return}try{let e=this.audioContext,t=e.currentTime,n=[262,330,392,523],i=.06,o=.07;n.forEach((s,u)=>{let a=t+u*o,r=e.createOscillator();r.type="square",r.frequency.setValueAtTime(s,a);let d=e.createGain();d.gain.setValueAtTime(0,a),d.gain.linearRampToValueAtTime(.15,a+.005),d.gain.setValueAtTime(.15,a+i-.01),d.gain.linearRampToValueAtTime(0,a+i),r.connect(d),d.connect(this.masterGainNode),r.start(a),r.stop(a+i)}),this.log("Start sound played (retro arpeggio)")}catch(e){console.error("[AudioManager] Failed to play start sound:",e)}}playTone(e,t,n={}){if(!this.audioContext||!this.masterGainNode){this.log("Cannot play tone: AudioContext not initialized");return}let{type:i="sine",volume:o=.3,attack:s=.01,release:u=.1}=n;try{let a=this.audioContext,r=a.currentTime,d=a.createOscillator();d.type=i,d.frequency.setValueAtTime(e,r);let l=a.createGain();l.gain.setValueAtTime(0,r),l.gain.linearRampToValueAtTime(o,r+s),l.gain.setValueAtTime(o,r+t-u),l.gain.linearRampToValueAtTime(0,r+t),d.connect(l),l.connect(this.masterGainNode),d.start(r),d.stop(r+t),this.log(`Tone played: ${e}Hz for ${t}s`)}catch(a){console.error("[AudioManager] Failed to play tone:",a)}}playNote(e,t,n={}){let i=this.noteToFrequency(e);if(i===null){console.warn(`[AudioManager] Invalid note: ${e}`);return}this.playTone(i,t,n)}noteToFrequency(e){let t=/^([A-Ga-g])([#b]?)(\d)$/,n=e.match(t);if(!n)return null;let[,i,o,s]=n,u=parseInt(s,10),r={C:0,D:2,E:4,F:5,G:7,A:9,B:11}[i.toUpperCase()];if(r===void 0)return null;o==="#"?r+=1:o==="b"&&(r-=1);let d=r+(u+1)*12;return 440*Math.pow(2,(d-49)/12)}async resumeContext(){this.audioContext&&this.audioContext.state==="suspended"&&(await this.audioContext.resume(),this.log("AudioContext resumed"))}async suspendContext(){this.audioContext&&this.audioContext.state==="running"&&(await this.audioContext.suspend(),this.log("AudioContext suspended"))}getState(){return this.audioContext?.state??null}getSoundBank(){return this.soundBank}play(e,t={}){if(!this.audioContext||!this.masterGainNode||!this.soundBank)return this.log("Cannot play: not initialized"),null;let n=this.soundBank.get(e);if(!n)return console.warn(`[AudioManager] Sound not found: ${e}`),null;try{let i=this.audioContext,o=t.instanceId??this.nextInstanceId++;t.instanceId!==void 0&&t.instanceId>=this.nextInstanceId&&(this.nextInstanceId=t.instanceId+1);let s=i.createBufferSource();s.buffer=n.buffer,s.loop=t.loop??!1,s.playbackRate.value=t.pitch??1;let u=i.createGain(),a=t.volume??1,r=t.fadeIn??0,d={source:s,gainNode:u,soundName:n.name,stopped:!1,baseVolume:a,targetVolume:a,fadingOut:!1,paused:!1,pausedAt:0,startedAt:i.currentTime,loop:t.loop??!1,playbackRate:t.pitch??1,buffer:n.buffer,outputNode:u},l=a,h=a;if(t.position){let{pan:p,distanceVolume:m}=this.calculateSpatialAudio(t.position.x,t.position.y),g=i.createStereoPanner();g.pan.value=p,l=r>0?0:a*m,h=a*m,u.gain.setValueAtTime(l,i.currentTime),r>0&&(u.gain.linearRampToValueAtTime(h,i.currentTime+r),this.log(`Fade in: ${n.name} [#${o}] over ${r}s`)),s.connect(u),u.connect(g),g.connect(this.masterGainNode),d.pannerNode=g,d.position={x:t.position.x,y:t.position.y},d.targetVolume=h,d.outputNode=g,this.spatialSounds.set(s,{gainNode:u,pannerNode:g,position:{x:t.position.x,y:t.position.y},baseVolume:a}),this.log(`Playing spatial: ${n.name} [#${o}] at (${t.position.x}, ${t.position.y}) pan=${p.toFixed(2)} vol=${m.toFixed(2)}`)}else l=r>0?0:a,h=a,u.gain.setValueAtTime(l,i.currentTime),r>0&&(u.gain.linearRampToValueAtTime(h,i.currentTime+r),this.log(`Fade in: ${n.name} [#${o}] over ${r}s`)),s.connect(u),u.connect(this.masterGainNode);this.instances.set(o,d),(t.lowpass||t.highpass||t.reverb)&&this.setEffects(o,t.lowpass,t.highpass,t.reverb),this.instancesBySound.has(n.name)||this.instancesBySound.set(n.name,new Set),this.instancesBySound.get(n.name).add(o),this.activeSounds.add(s),s.onended=()=>{d.paused||this.cleanupInstance(o)},s.start(0,t.offset??0),t.position||this.log(`Playing: ${n.name} [#${o}]`);let v=this.stop.bind(this),x=this.instances;return{instanceId:o,stop:()=>{v(o)},get playing(){let p=x.get(o);return p!==void 0&&!p.stopped},sound:n}}catch(i){return console.error(`[AudioManager] Failed to play sound "${e}":`,i),null}}stop(e){return e==="all"?this.stopAll():typeof e=="number"?this.stopInstance(e)?1:0:this.stopByName(e)}fadeOut(e,t){if(!this.audioContext)return 0;let n=Math.max(.01,t);return e==="all"?this.fadeOutAll(n):typeof e=="number"?this.fadeOutInstance(e,n)?1:0:this.fadeOutByName(e,n)}fadeOutInstance(e,t){let n=this.instances.get(e);if(!n||n.stopped||n.fadingOut||!this.audioContext)return!1;let i=this.audioContext;n.fadingOut=!0;let o=n.gainNode.gain.value;return n.gainNode.gain.cancelScheduledValues(i.currentTime),n.gainNode.gain.setValueAtTime(o,i.currentTime),n.gainNode.gain.linearRampToValueAtTime(0,i.currentTime+t),setTimeout(()=>{this.stopInstance(e)},t*1e3),this.log(`Fading out instance #${e} (${n.soundName}) over ${t}s`),!0}fadeOutByName(e,t){let n=this.instancesBySound.get(e);if(!n||n.size===0)return 0;let i=0;for(let o of Array.from(n))this.fadeOutInstance(o,t)&&i++;return this.log(`Fading out ${i} instances of "${e}" over ${t}s`),i}fadeOutAll(e){let t=0;for(let n of Array.from(this.instances.keys()))this.fadeOutInstance(n,e)&&t++;return this.log(`Fading out all sounds (${t} instances) over ${e}s`),t}pause(e){return e==="all"?this.pauseAll():typeof e=="number"?this.pauseInstance(e)?1:0:this.pauseByName(e)}pauseInstance(e){let t=this.instances.get(e);if(!t||t.stopped||t.paused||t.fadingOut||!this.audioContext)return!1;let i=(this.audioContext.currentTime-t.startedAt)*t.playbackRate;if(t.loop)t.pausedAt=i%t.buffer.duration;else if(t.pausedAt=i,t.pausedAt>=t.buffer.duration)return!1;try{t.source.stop()}catch{}return t.paused=!0,this.log(`Paused instance #${e} (${t.soundName}) at ${t.pausedAt.toFixed(2)}s`),!0}pauseByName(e){let t=this.instancesBySound.get(e);if(!t||t.size===0)return 0;let n=0;for(let i of Array.from(t))this.pauseInstance(i)&&n++;return this.log(`Paused ${n} instances of "${e}"`),n}pauseAll(){let e=0;for(let t of Array.from(this.instances.keys()))this.pauseInstance(t)&&e++;return this.log(`Paused all sounds (${e} instances)`),e}resume(e){return e==="all"?this.resumeAll():typeof e=="number"?this.resumeInstance(e)?1:0:this.resumeByName(e)}resumeInstance(e){let t=this.instances.get(e);if(!t||t.stopped||!t.paused||!this.audioContext||!this.masterGainNode)return!1;let n=this.audioContext,i=n.createBufferSource();return i.buffer=t.buffer,i.loop=t.loop,i.playbackRate.value=t.playbackRate,i.connect(t.gainNode),t.source=i,t.paused=!1,t.startedAt=n.currentTime-t.pausedAt/t.playbackRate,i.onended=()=>{t.paused||this.cleanupInstance(e)},i.start(0,t.pausedAt),this.log(`Resumed instance #${e} (${t.soundName}) from ${t.pausedAt.toFixed(2)}s`),!0}resumeByName(e){let t=this.instancesBySound.get(e);if(!t||t.size===0)return 0;let n=0;for(let i of Array.from(t))this.resumeInstance(i)&&n++;return this.log(`Resumed ${n} instances of "${e}"`),n}resumeAll(){let e=0;for(let t of Array.from(this.instances.keys()))this.resumeInstance(t)&&e++;return this.log(`Resumed all sounds (${e} instances)`),e}stopInstance(e){let t=this.instances.get(e);if(!t||t.stopped)return!1;try{t.source.stop(),t.stopped=!0,this.log(`Stopped instance #${e} (${t.soundName})`)}catch{}return this.cleanupInstance(e),!0}stopByName(e){let t=this.instancesBySound.get(e);if(!t||t.size===0)return 0;let n=0;for(let i of Array.from(t))this.stopInstance(i)&&n++;return this.log(`Stopped ${n} instances of "${e}"`),n}cleanupInstance(e){let t=this.instances.get(e);if(!t)return;this.instances.delete(e);let n=this.instancesBySound.get(t.soundName);n&&(n.delete(e),n.size===0&&this.instancesBySound.delete(t.soundName)),this.activeSounds.delete(t.source),this.spatialSounds.delete(t.source)}setListenerPosition(e,t){e===this.spatialConfig.listenerX&&t===this.spatialConfig.listenerY||(this.spatialConfig.listenerX=e,this.spatialConfig.listenerY=t,this.spatialSounds.size>0&&this.updateAllSpatialSounds())}updateAllSpatialSounds(){for(let[e,t]of this.spatialSounds){if(!this.activeSounds.has(e)){this.spatialSounds.delete(e);continue}let{pan:n,distanceVolume:i}=this.calculateSpatialAudio(t.position.x,t.position.y);t.pannerNode.pan.value=n,t.gainNode.gain.value=t.baseVolume*i}}getListenerPosition(){return{x:this.spatialConfig.listenerX,y:this.spatialConfig.listenerY}}configureSpatial(e){this.log(`configureSpatial called with: ${JSON.stringify(e)}`),e.listenerX!==void 0&&(this.spatialConfig.listenerX=Math.max(0,Math.min(65535,e.listenerX))),e.listenerY!==void 0&&(this.spatialConfig.listenerY=Math.max(0,Math.min(65535,e.listenerY))),e.maxDistance!==void 0&&(this.spatialConfig.maxDistance=Math.max(1,e.maxDistance)),e.referenceDistance!==void 0&&(this.spatialConfig.referenceDistance=Math.max(1,e.referenceDistance)),e.rolloffFactor!==void 0&&(this.spatialConfig.rolloffFactor=Math.max(0,e.rolloffFactor)),e.panSpread!==void 0&&(this.spatialConfig.panSpread=Math.max(0,Math.min(1,e.panSpread))),this.log(`spatialConfig now: maxDistance=${this.spatialConfig.maxDistance}, refDist=${this.spatialConfig.referenceDistance}, panSpread=${this.spatialConfig.panSpread}`)}getSpatialConfig(){return{...this.spatialConfig}}setEffects(e,t,n,i){if(!this.audioContext||!this.masterGainNode)return;let o=this.instances.get(e);if(!o||o.stopped){this.log(`setEffects: instance ${e} not found or stopped`);return}let s=this.audioContext;t!==void 0&&(t>0?(o.lowpassNode||(o.lowpassNode=s.createBiquadFilter(),o.lowpassNode.type="lowpass",o.lowpassNode.Q.value=1,this.insertFilterNode(o,o.lowpassNode)),o.lowpassNode.frequency.setValueAtTime(t,s.currentTime),this.log(`setEffects: instance ${e} lowpass=${t}Hz`)):o.lowpassNode&&(this.removeFilterNode(o,o.lowpassNode),o.lowpassNode=void 0,this.log(`setEffects: instance ${e} lowpass disabled`))),n!==void 0&&(n>0?(o.highpassNode||(o.highpassNode=s.createBiquadFilter(),o.highpassNode.type="highpass",o.highpassNode.Q.value=1,this.insertFilterNode(o,o.highpassNode)),o.highpassNode.frequency.setValueAtTime(n,s.currentTime),this.log(`setEffects: instance ${e} highpass=${n}Hz`)):o.highpassNode&&(this.removeFilterNode(o,o.highpassNode),o.highpassNode=void 0,this.log(`setEffects: instance ${e} highpass disabled`))),i!==void 0&&(i>0?(this.ensureReverbInitialized(),!o.reverbSendNode&&this.reverbConvolver&&(o.reverbSendNode=s.createGain(),o.reverbSendNode.gain.value=0,o.outputNode.connect(o.reverbSendNode),o.reverbSendNode.connect(this.reverbConvolver)),o.reverbSendNode&&(o.reverbSendNode.gain.setValueAtTime(i,s.currentTime),this.log(`setEffects: instance ${e} reverb=${i.toFixed(2)}`))):o.reverbSendNode&&(o.reverbSendNode.gain.setValueAtTime(0,s.currentTime),this.log(`setEffects: instance ${e} reverb disabled`)))}ensureReverbInitialized(){if(this.reverbConvolver||!this.audioContext||!this.masterGainNode)return;let e=this.audioContext,t=e.sampleRate,i=Math.floor(t*.5),o=e.createBuffer(1,i,t),s=o.getChannelData(0);for(let u=0;u<i;u++){let a=u/t,r=Math.exp(-a*6);s[u]=(Math.random()*2-1)*r}this.reverbConvolver=e.createConvolver(),this.reverbConvolver.buffer=o,this.reverbGain=e.createGain(),this.reverbGain.gain.value=.5,this.reverbConvolver.connect(this.reverbGain),this.reverbGain.connect(this.masterGainNode),this.log("Shared reverb initialized")}insertFilterNode(e,t){if(this.masterGainNode){try{e.outputNode.disconnect(this.masterGainNode)}catch{}e.outputNode.connect(t),t.connect(this.masterGainNode)}}removeFilterNode(e,t){if(this.masterGainNode){try{t.disconnect()}catch{}try{e.outputNode.disconnect(t)}catch{}e.outputNode.connect(this.masterGainNode)}}calculateSpatialAudio(e,t){let{listenerX:n,listenerY:i,maxDistance:o,referenceDistance:s,panSpread:u}=this.spatialConfig,a=e-n,r=t-i,d=Math.sqrt(a*a+r*r),l;d<=s?l=1:d>=o?l=0:l=1-(d-s)/(o-s);let h=0;return o>0&&u>0&&(h=a/o*u,h=Math.max(-1,Math.min(1,h))),this.log(`Spatial: listener(${n.toFixed(1)}, ${i.toFixed(1)}) sound(${e.toFixed(1)}, ${t.toFixed(1)}) dist=${d.toFixed(1)} vol=${l.toFixed(2)} pan=${h.toFixed(2)} [dx=${a.toFixed(1)} maxDist=${o} panSpread=${u}]`),{pan:h,distanceVolume:l}}stopAll(){let e=this.instances.size;for(let[,t]of this.instances)if(!t.stopped)try{t.source.stop(),t.stopped=!0}catch{}return this.instances.clear(),this.instancesBySound.clear(),this.activeSounds.clear(),this.spatialSounds.clear(),this.log(`Stopped all sounds (${e} instances)`),e}getPlayingCount(){return this.instances.size}getActiveInstances(){return Array.from(this.instances.keys())}isPlaying(e){let t=this.instances.get(e);return t!==void 0&&!t.stopped}destroy(){this.stopAll(),this.soundBank&&(this.soundBank.clear(),this.soundBank=null),this.audioContext&&(this.audioContext.close(),this.audioContext=null),this.masterGainNode=null,this.initialized=!1,this.log("AudioManager destroyed")}log(e){this.options.debug&&console.warn(`[AudioManager] ${e}`)}};S(C,"AudioManager");var A=C;
|
package/dist/index.d.ts
CHANGED
|
@@ -239,6 +239,12 @@ interface PlayOptions {
|
|
|
239
239
|
* If not provided (standalone mode), an ID will be auto-generated.
|
|
240
240
|
*/
|
|
241
241
|
instanceId?: number;
|
|
242
|
+
/** Low-pass filter cutoff frequency in Hz (100-25500, 0 = disabled) */
|
|
243
|
+
lowpass?: number;
|
|
244
|
+
/** High-pass filter cutoff frequency in Hz (100-25500, 0 = disabled) */
|
|
245
|
+
highpass?: number;
|
|
246
|
+
/** Reverb wet/dry mix (0.0-1.0, 0 = disabled) */
|
|
247
|
+
reverb?: number;
|
|
242
248
|
}
|
|
243
249
|
/**
|
|
244
250
|
* Configuration for spatial audio listener
|
|
@@ -287,6 +293,8 @@ declare class AudioManager implements IAudioProcessor {
|
|
|
287
293
|
private activeSounds;
|
|
288
294
|
private spatialSounds;
|
|
289
295
|
private spatialConfig;
|
|
296
|
+
private reverbConvolver;
|
|
297
|
+
private reverbGain;
|
|
290
298
|
constructor(options?: AudioManagerOptions);
|
|
291
299
|
/**
|
|
292
300
|
* Initialize the Web AudioContext
|
|
@@ -578,6 +586,27 @@ declare class AudioManager implements IAudioProcessor {
|
|
|
578
586
|
* Get current spatial audio configuration
|
|
579
587
|
*/
|
|
580
588
|
getSpatialConfig(): Readonly<SpatialConfig>;
|
|
589
|
+
/**
|
|
590
|
+
* Set audio effects on a playing sound instance
|
|
591
|
+
*
|
|
592
|
+
* @param instanceId - The instance ID returned by play()
|
|
593
|
+
* @param lowpass - Low-pass filter cutoff in Hz (0 = disable)
|
|
594
|
+
* @param highpass - High-pass filter cutoff in Hz (0 = disable)
|
|
595
|
+
* @param reverb - Reverb wet/dry mix 0.0-1.0 (0 = disable)
|
|
596
|
+
*/
|
|
597
|
+
setEffects(instanceId: number, lowpass?: number, highpass?: number, reverb?: number): void;
|
|
598
|
+
/**
|
|
599
|
+
* Initialize the shared reverb convolver (lazy)
|
|
600
|
+
*/
|
|
601
|
+
private ensureReverbInitialized;
|
|
602
|
+
/**
|
|
603
|
+
* Insert a filter node into the instance's audio chain
|
|
604
|
+
*/
|
|
605
|
+
private insertFilterNode;
|
|
606
|
+
/**
|
|
607
|
+
* Remove a filter node from the instance's audio chain
|
|
608
|
+
*/
|
|
609
|
+
private removeFilterNode;
|
|
581
610
|
/**
|
|
582
611
|
* Calculate stereo pan and volume based on sound position relative to listener
|
|
583
612
|
*
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var $=Object.defineProperty;var I=(m,t,e)=>t in m?$(m,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):m[t]=e;var A=(m,t)=>$(m,"name",{value:t,configurable:!0});var c=(m,t,e)=>(I(m,typeof t!="symbol"?t+"":t,e),e);var S=class S{constructor(t,e=!1){c(this,"sounds",new Map);c(this,"nameToId",new Map);c(this,"audioContext");c(this,"debug");this.audioContext=t,this.debug=e,this.log("SoundBank created")}async loadFromData(t,e,n){this.log(`Loading sound from data: ${e} (${n.length} bytes)`);try{let o=await this.decodeAudio(n);this.store(t,e,o,{source:"file",originalSize:n.length,loadedAt:Date.now()}),this.log(`\u2713 Loaded: ${e} (${o.duration.toFixed(2)}s)`)}catch(o){throw console.error(`[SoundBank] Failed to decode sound "${e}":`,o),o}}async loadFromUrl(t,e,n,o){this.log(`Loading sound from URL: ${e} \u2192 ${n}`);try{let i=await fetch(n);if(!i.ok)throw new Error(`HTTP ${i.status}: ${i.statusText}`);let r=i.headers.get("content-length"),d=r?parseInt(r,10):0,a;if(d>0&&o&&i.body){let u=i.body.getReader(),l=[],f=0;for(;;){let{done:p,value:h}=await u.read();if(p)break;l.push(h),f+=h.length,o(f,d)}let y=new Uint8Array(f),x=0;for(let p of l)y.set(p,x),x+=p.length;a=y.buffer}else a=await i.arrayBuffer();let s=await this.decodeAudio(new Uint8Array(a));this.store(t,e,s,{source:"external",originalSize:a.byteLength,originalUrl:n,loadedAt:Date.now()}),this.log(`\u2713 Loaded from URL: ${e} (${s.duration.toFixed(2)}s)`)}catch(i){throw console.error(`[SoundBank] Failed to load sound "${e}" from ${n}:`,i),i}}loadFromBuffer(t,e,n){this.log(`Loading sound from buffer: ${e}`),this.store(t,e,n,{source:"procedural",loadedAt:Date.now()}),this.log(`\u2713 Loaded from buffer: ${e} (${n.duration.toFixed(2)}s)`)}store(t,e,n,o){if(this.sounds.has(t)){let r=this.sounds.get(t);this.log(`Replacing sound ID ${t} (was: ${r.name}, now: ${e})`),this.nameToId.delete(r.name)}if(this.nameToId.has(e)){let r=this.nameToId.get(e);r!==t&&this.log(`Warning: Sound name "${e}" already exists with ID ${r}`)}let i={soundId:t,name:e,buffer:n,duration:n.duration,metadata:o};this.sounds.set(t,i),this.nameToId.set(e,t)}async decodeAudio(t){let e=new ArrayBuffer(t.byteLength);return new Uint8Array(e).set(t),this.audioContext.decodeAudioData(e)}get(t){if(typeof t=="number")return this.sounds.get(t);let e=this.nameToId.get(t);return e!==void 0?this.sounds.get(e):void 0}has(t){return this.get(t)!==void 0}getAll(){return Array.from(this.sounds.values())}getNames(){return Array.from(this.nameToId.keys())}get size(){return this.sounds.size}remove(t){let e=this.get(t);return e?(this.sounds.delete(e.soundId),this.nameToId.delete(e.name),this.log(`Removed sound: ${e.name}`),!0):!1}clear(){let t=this.sounds.size;this.sounds.clear(),this.nameToId.clear(),this.log(`Cleared ${t} sounds`)}getStats(){let t=this.getAll(),e=0;for(let n of t){let{buffer:o}=n;e+=o.length*o.numberOfChannels*4}return{totalSounds:t.length,totalDuration:t.reduce((n,o)=>n+o.duration,0),estimatedMemory:e,bySource:{file:t.filter(n=>n.metadata.source==="file").length,external:t.filter(n=>n.metadata.source==="external").length,procedural:t.filter(n=>n.metadata.source==="procedural").length}}}log(t){this.debug&&console.warn(`[SoundBank] ${t}`)}};A(S,"SoundBank");var b=S;var v=class v{constructor(t={}){c(this,"audioContext",null);c(this,"masterGainNode",null);c(this,"soundBank",null);c(this,"options");c(this,"initialized",!1);c(this,"nextInstanceId",1);c(this,"instances",new Map);c(this,"instancesBySound",new Map);c(this,"activeSounds",new Set);c(this,"spatialSounds",new Map);c(this,"spatialConfig",{listenerX:32768,listenerY:32768,maxDistance:16384,referenceDistance:1024,rolloffFactor:1,panSpread:.8});this.options={debug:t.debug??!1,masterVolume:t.masterVolume??1},this.log("AudioManager created")}initialize(){if(this.initialized&&this.audioContext)return this.log("AudioContext already initialized"),!0;try{let t=window.AudioContext||window.webkitAudioContext;return t?(this.audioContext=new t,this.log(`AudioContext initialized (state: ${this.audioContext.state}, sampleRate: ${this.audioContext.sampleRate}Hz)`),this.masterGainNode=this.audioContext.createGain(),this.masterGainNode.gain.value=this.options.masterVolume,this.masterGainNode.connect(this.audioContext.destination),this.audioContext.state==="suspended"&&this.audioContext.resume().then(()=>{this.log("AudioContext resumed")}),this.soundBank=new b(this.audioContext,this.options.debug),this.initialized=!0,!0):(console.warn("[AudioManager] Web Audio API not supported"),!1)}catch(t){return console.error("[AudioManager] Failed to initialize AudioContext:",t),!1}}isInitialized(){return this.initialized&&this.audioContext!==null}getContext(){return this.audioContext}getMasterGain(){return this.masterGainNode}setMasterVolume(t){this.options.masterVolume=Math.max(0,Math.min(1,t)),this.masterGainNode&&(this.masterGainNode.gain.value=this.options.masterVolume),this.log(`Master volume set to ${this.options.masterVolume}`)}getMasterVolume(){return this.options.masterVolume}playStartSound(){if(!this.audioContext||!this.masterGainNode){this.log("Cannot play sound: AudioContext not initialized");return}try{let t=this.audioContext,e=t.currentTime,n=[262,330,392,523],o=.06,i=.07;n.forEach((r,d)=>{let a=e+d*i,s=t.createOscillator();s.type="square",s.frequency.setValueAtTime(r,a);let u=t.createGain();u.gain.setValueAtTime(0,a),u.gain.linearRampToValueAtTime(.15,a+.005),u.gain.setValueAtTime(.15,a+o-.01),u.gain.linearRampToValueAtTime(0,a+o),s.connect(u),u.connect(this.masterGainNode),s.start(a),s.stop(a+o)}),this.log("Start sound played (retro arpeggio)")}catch(t){console.error("[AudioManager] Failed to play start sound:",t)}}playTone(t,e,n={}){if(!this.audioContext||!this.masterGainNode){this.log("Cannot play tone: AudioContext not initialized");return}let{type:o="sine",volume:i=.3,attack:r=.01,release:d=.1}=n;try{let a=this.audioContext,s=a.currentTime,u=a.createOscillator();u.type=o,u.frequency.setValueAtTime(t,s);let l=a.createGain();l.gain.setValueAtTime(0,s),l.gain.linearRampToValueAtTime(i,s+r),l.gain.setValueAtTime(i,s+e-d),l.gain.linearRampToValueAtTime(0,s+e),u.connect(l),l.connect(this.masterGainNode),u.start(s),u.stop(s+e),this.log(`Tone played: ${t}Hz for ${e}s`)}catch(a){console.error("[AudioManager] Failed to play tone:",a)}}playNote(t,e,n={}){let o=this.noteToFrequency(t);if(o===null){console.warn(`[AudioManager] Invalid note: ${t}`);return}this.playTone(o,e,n)}noteToFrequency(t){let e=/^([A-Ga-g])([#b]?)(\d)$/,n=t.match(e);if(!n)return null;let[,o,i,r]=n,d=parseInt(r,10),s={C:0,D:2,E:4,F:5,G:7,A:9,B:11}[o.toUpperCase()];if(s===void 0)return null;i==="#"?s+=1:i==="b"&&(s-=1);let u=s+(d+1)*12;return 440*Math.pow(2,(u-49)/12)}async resumeContext(){this.audioContext&&this.audioContext.state==="suspended"&&(await this.audioContext.resume(),this.log("AudioContext resumed"))}async suspendContext(){this.audioContext&&this.audioContext.state==="running"&&(await this.audioContext.suspend(),this.log("AudioContext suspended"))}getState(){return this.audioContext?.state??null}getSoundBank(){return this.soundBank}play(t,e={}){if(!this.audioContext||!this.masterGainNode||!this.soundBank)return this.log("Cannot play: not initialized"),null;let n=this.soundBank.get(t);if(!n)return console.warn(`[AudioManager] Sound not found: ${t}`),null;try{let o=this.audioContext,i=e.instanceId??this.nextInstanceId++;e.instanceId!==void 0&&e.instanceId>=this.nextInstanceId&&(this.nextInstanceId=e.instanceId+1);let r=o.createBufferSource();r.buffer=n.buffer,r.loop=e.loop??!1,r.playbackRate.value=e.pitch??1;let d=o.createGain(),a=e.volume??1,s=e.fadeIn??0,u={source:r,gainNode:d,soundName:n.name,stopped:!1,baseVolume:a,targetVolume:a,fadingOut:!1,paused:!1,pausedAt:0,startedAt:o.currentTime,loop:e.loop??!1,playbackRate:e.pitch??1,buffer:n.buffer},l=a,f=a;if(e.position){let{pan:p,distanceVolume:h}=this.calculateSpatialAudio(e.position.x,e.position.y),g=o.createStereoPanner();g.pan.value=p,l=s>0?0:a*h,f=a*h,d.gain.setValueAtTime(l,o.currentTime),s>0&&(d.gain.linearRampToValueAtTime(f,o.currentTime+s),this.log(`Fade in: ${n.name} [#${i}] over ${s}s`)),r.connect(d),d.connect(g),g.connect(this.masterGainNode),u.pannerNode=g,u.position={x:e.position.x,y:e.position.y},u.targetVolume=f,this.spatialSounds.set(r,{gainNode:d,pannerNode:g,position:{x:e.position.x,y:e.position.y},baseVolume:a}),this.log(`Playing spatial: ${n.name} [#${i}] at (${e.position.x}, ${e.position.y}) pan=${p.toFixed(2)} vol=${h.toFixed(2)}`)}else l=s>0?0:a,f=a,d.gain.setValueAtTime(l,o.currentTime),s>0&&(d.gain.linearRampToValueAtTime(f,o.currentTime+s),this.log(`Fade in: ${n.name} [#${i}] over ${s}s`)),r.connect(d),d.connect(this.masterGainNode);this.instances.set(i,u),this.instancesBySound.has(n.name)||this.instancesBySound.set(n.name,new Set),this.instancesBySound.get(n.name).add(i),this.activeSounds.add(r),r.onended=()=>{u.paused||this.cleanupInstance(i)},r.start(0,e.offset??0),e.position||this.log(`Playing: ${n.name} [#${i}]`);let y=this.stop.bind(this),x=this.instances;return{instanceId:i,stop:()=>{y(i)},get playing(){let p=x.get(i);return p!==void 0&&!p.stopped},sound:n}}catch(o){return console.error(`[AudioManager] Failed to play sound "${t}":`,o),null}}stop(t){return t==="all"?this.stopAll():typeof t=="number"?this.stopInstance(t)?1:0:this.stopByName(t)}fadeOut(t,e){if(!this.audioContext)return 0;let n=Math.max(.01,e);return t==="all"?this.fadeOutAll(n):typeof t=="number"?this.fadeOutInstance(t,n)?1:0:this.fadeOutByName(t,n)}fadeOutInstance(t,e){let n=this.instances.get(t);if(!n||n.stopped||n.fadingOut||!this.audioContext)return!1;let o=this.audioContext;n.fadingOut=!0;let i=n.gainNode.gain.value;return n.gainNode.gain.cancelScheduledValues(o.currentTime),n.gainNode.gain.setValueAtTime(i,o.currentTime),n.gainNode.gain.linearRampToValueAtTime(0,o.currentTime+e),setTimeout(()=>{this.stopInstance(t)},e*1e3),this.log(`Fading out instance #${t} (${n.soundName}) over ${e}s`),!0}fadeOutByName(t,e){let n=this.instancesBySound.get(t);if(!n||n.size===0)return 0;let o=0;for(let i of Array.from(n))this.fadeOutInstance(i,e)&&o++;return this.log(`Fading out ${o} instances of "${t}" over ${e}s`),o}fadeOutAll(t){let e=0;for(let n of Array.from(this.instances.keys()))this.fadeOutInstance(n,t)&&e++;return this.log(`Fading out all sounds (${e} instances) over ${t}s`),e}pause(t){return t==="all"?this.pauseAll():typeof t=="number"?this.pauseInstance(t)?1:0:this.pauseByName(t)}pauseInstance(t){let e=this.instances.get(t);if(!e||e.stopped||e.paused||e.fadingOut||!this.audioContext)return!1;let o=(this.audioContext.currentTime-e.startedAt)*e.playbackRate;if(e.loop)e.pausedAt=o%e.buffer.duration;else if(e.pausedAt=o,e.pausedAt>=e.buffer.duration)return!1;try{e.source.stop()}catch{}return e.paused=!0,this.log(`Paused instance #${t} (${e.soundName}) at ${e.pausedAt.toFixed(2)}s`),!0}pauseByName(t){let e=this.instancesBySound.get(t);if(!e||e.size===0)return 0;let n=0;for(let o of Array.from(e))this.pauseInstance(o)&&n++;return this.log(`Paused ${n} instances of "${t}"`),n}pauseAll(){let t=0;for(let e of Array.from(this.instances.keys()))this.pauseInstance(e)&&t++;return this.log(`Paused all sounds (${t} instances)`),t}resume(t){return t==="all"?this.resumeAll():typeof t=="number"?this.resumeInstance(t)?1:0:this.resumeByName(t)}resumeInstance(t){let e=this.instances.get(t);if(!e||e.stopped||!e.paused||!this.audioContext||!this.masterGainNode)return!1;let n=this.audioContext,o=n.createBufferSource();return o.buffer=e.buffer,o.loop=e.loop,o.playbackRate.value=e.playbackRate,o.connect(e.gainNode),e.source=o,e.paused=!1,e.startedAt=n.currentTime-e.pausedAt/e.playbackRate,o.onended=()=>{e.paused||this.cleanupInstance(t)},o.start(0,e.pausedAt),this.log(`Resumed instance #${t} (${e.soundName}) from ${e.pausedAt.toFixed(2)}s`),!0}resumeByName(t){let e=this.instancesBySound.get(t);if(!e||e.size===0)return 0;let n=0;for(let o of Array.from(e))this.resumeInstance(o)&&n++;return this.log(`Resumed ${n} instances of "${t}"`),n}resumeAll(){let t=0;for(let e of Array.from(this.instances.keys()))this.resumeInstance(e)&&t++;return this.log(`Resumed all sounds (${t} instances)`),t}stopInstance(t){let e=this.instances.get(t);if(!e||e.stopped)return!1;try{e.source.stop(),e.stopped=!0,this.log(`Stopped instance #${t} (${e.soundName})`)}catch{}return this.cleanupInstance(t),!0}stopByName(t){let e=this.instancesBySound.get(t);if(!e||e.size===0)return 0;let n=0;for(let o of Array.from(e))this.stopInstance(o)&&n++;return this.log(`Stopped ${n} instances of "${t}"`),n}cleanupInstance(t){let e=this.instances.get(t);if(!e)return;this.instances.delete(t);let n=this.instancesBySound.get(e.soundName);n&&(n.delete(t),n.size===0&&this.instancesBySound.delete(e.soundName)),this.activeSounds.delete(e.source),this.spatialSounds.delete(e.source)}setListenerPosition(t,e){t===this.spatialConfig.listenerX&&e===this.spatialConfig.listenerY||(this.spatialConfig.listenerX=t,this.spatialConfig.listenerY=e,this.spatialSounds.size>0&&this.updateAllSpatialSounds())}updateAllSpatialSounds(){for(let[t,e]of this.spatialSounds){if(!this.activeSounds.has(t)){this.spatialSounds.delete(t);continue}let{pan:n,distanceVolume:o}=this.calculateSpatialAudio(e.position.x,e.position.y);e.pannerNode.pan.value=n,e.gainNode.gain.value=e.baseVolume*o}}getListenerPosition(){return{x:this.spatialConfig.listenerX,y:this.spatialConfig.listenerY}}configureSpatial(t){t.listenerX!==void 0&&(this.spatialConfig.listenerX=Math.max(0,Math.min(65535,t.listenerX))),t.listenerY!==void 0&&(this.spatialConfig.listenerY=Math.max(0,Math.min(65535,t.listenerY))),t.maxDistance!==void 0&&(this.spatialConfig.maxDistance=Math.max(1,t.maxDistance)),t.referenceDistance!==void 0&&(this.spatialConfig.referenceDistance=Math.max(1,t.referenceDistance)),t.rolloffFactor!==void 0&&(this.spatialConfig.rolloffFactor=Math.max(0,t.rolloffFactor)),t.panSpread!==void 0&&(this.spatialConfig.panSpread=Math.max(0,Math.min(1,t.panSpread)))}getSpatialConfig(){return{...this.spatialConfig}}calculateSpatialAudio(t,e){let{listenerX:n,listenerY:o,maxDistance:i,referenceDistance:r,panSpread:d}=this.spatialConfig,a=t-n,s=e-o,u=Math.sqrt(a*a+s*s),l;u<=r?l=1:u>=i?l=0:l=1-(u-r)/(i-r);let f=0;return i>0&&d>0&&(f=a/i*d,f=Math.max(-1,Math.min(1,f))),this.log(`Spatial: listener(${n.toFixed(1)}, ${o.toFixed(1)}) sound(${t.toFixed(1)}, ${e.toFixed(1)}) dist=${u.toFixed(1)} vol=${l.toFixed(2)} pan=${f.toFixed(2)}`),{pan:f,distanceVolume:l}}stopAll(){let t=this.instances.size;for(let[,e]of this.instances)if(!e.stopped)try{e.source.stop(),e.stopped=!0}catch{}return this.instances.clear(),this.instancesBySound.clear(),this.activeSounds.clear(),this.spatialSounds.clear(),this.log(`Stopped all sounds (${t} instances)`),t}getPlayingCount(){return this.instances.size}getActiveInstances(){return Array.from(this.instances.keys())}isPlaying(t){let e=this.instances.get(t);return e!==void 0&&!e.stopped}destroy(){this.stopAll(),this.soundBank&&(this.soundBank.clear(),this.soundBank=null),this.audioContext&&(this.audioContext.close(),this.audioContext=null),this.masterGainNode=null,this.initialized=!1,this.log("AudioManager destroyed")}log(t){this.options.debug&&console.warn(`[AudioManager] ${t}`)}};A(v,"AudioManager");var C=v;export{C as AudioManager,b as SoundBank};
|
|
1
|
+
var C=Object.defineProperty;var $=(p,t,e)=>t in p?C(p,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):p[t]=e;var x=(p,t)=>C(p,"name",{value:t,configurable:!0});var c=(p,t,e)=>($(p,typeof t!="symbol"?t+"":t,e),e);var S=class S{constructor(t,e=!1){c(this,"sounds",new Map);c(this,"nameToId",new Map);c(this,"audioContext");c(this,"debug");this.audioContext=t,this.debug=e,this.log("SoundBank created")}async loadFromData(t,e,n){this.log(`Loading sound from data: ${e} (${n.length} bytes)`);try{let o=await this.decodeAudio(n);this.store(t,e,o,{source:"file",originalSize:n.length,loadedAt:Date.now()}),this.log(`\u2713 Loaded: ${e} (${o.duration.toFixed(2)}s)`)}catch(o){throw console.error(`[SoundBank] Failed to decode sound "${e}":`,o),o}}async loadFromUrl(t,e,n,o){this.log(`Loading sound from URL: ${e} \u2192 ${n}`);try{let i=await fetch(n);if(!i.ok)throw new Error(`HTTP ${i.status}: ${i.statusText}`);let s=i.headers.get("content-length"),u=s?parseInt(s,10):0,a;if(u>0&&o&&i.body){let d=i.body.getReader(),l=[],f=0;for(;;){let{done:h,value:m}=await d.read();if(h)break;l.push(m),f+=m.length,o(f,u)}let y=new Uint8Array(f),v=0;for(let h of l)y.set(h,v),v+=h.length;a=y.buffer}else a=await i.arrayBuffer();let r=await this.decodeAudio(new Uint8Array(a));this.store(t,e,r,{source:"external",originalSize:a.byteLength,originalUrl:n,loadedAt:Date.now()}),this.log(`\u2713 Loaded from URL: ${e} (${r.duration.toFixed(2)}s)`)}catch(i){throw console.error(`[SoundBank] Failed to load sound "${e}" from ${n}:`,i),i}}loadFromBuffer(t,e,n){this.log(`Loading sound from buffer: ${e}`),this.store(t,e,n,{source:"procedural",loadedAt:Date.now()}),this.log(`\u2713 Loaded from buffer: ${e} (${n.duration.toFixed(2)}s)`)}store(t,e,n,o){if(this.sounds.has(t)){let s=this.sounds.get(t);this.log(`Replacing sound ID ${t} (was: ${s.name}, now: ${e})`),this.nameToId.delete(s.name)}if(this.nameToId.has(e)){let s=this.nameToId.get(e);s!==t&&this.log(`Warning: Sound name "${e}" already exists with ID ${s}`)}let i={soundId:t,name:e,buffer:n,duration:n.duration,metadata:o};this.sounds.set(t,i),this.nameToId.set(e,t)}async decodeAudio(t){let e=new ArrayBuffer(t.byteLength);return new Uint8Array(e).set(t),this.audioContext.decodeAudioData(e)}get(t){if(typeof t=="number")return this.sounds.get(t);let e=this.nameToId.get(t);return e!==void 0?this.sounds.get(e):void 0}has(t){return this.get(t)!==void 0}getAll(){return Array.from(this.sounds.values())}getNames(){return Array.from(this.nameToId.keys())}get size(){return this.sounds.size}remove(t){let e=this.get(t);return e?(this.sounds.delete(e.soundId),this.nameToId.delete(e.name),this.log(`Removed sound: ${e.name}`),!0):!1}clear(){let t=this.sounds.size;this.sounds.clear(),this.nameToId.clear(),this.log(`Cleared ${t} sounds`)}getStats(){let t=this.getAll(),e=0;for(let n of t){let{buffer:o}=n;e+=o.length*o.numberOfChannels*4}return{totalSounds:t.length,totalDuration:t.reduce((n,o)=>n+o.duration,0),estimatedMemory:e,bySource:{file:t.filter(n=>n.metadata.source==="file").length,external:t.filter(n=>n.metadata.source==="external").length,procedural:t.filter(n=>n.metadata.source==="procedural").length}}}log(t){this.debug&&console.warn(`[SoundBank] ${t}`)}};x(S,"SoundBank");var b=S;var N=class N{constructor(t={}){c(this,"audioContext",null);c(this,"masterGainNode",null);c(this,"soundBank",null);c(this,"options");c(this,"initialized",!1);c(this,"nextInstanceId",1);c(this,"instances",new Map);c(this,"instancesBySound",new Map);c(this,"activeSounds",new Set);c(this,"spatialSounds",new Map);c(this,"spatialConfig",{listenerX:0,listenerY:0,maxDistance:200,referenceDistance:20,rolloffFactor:1,panSpread:1});c(this,"reverbConvolver",null);c(this,"reverbGain",null);this.options={debug:t.debug??!1,masterVolume:t.masterVolume??1},this.log("AudioManager created")}initialize(){if(this.initialized&&this.audioContext)return this.log("AudioContext already initialized"),!0;try{let t=window.AudioContext||window.webkitAudioContext;return t?(this.audioContext=new t,this.log(`AudioContext initialized (state: ${this.audioContext.state}, sampleRate: ${this.audioContext.sampleRate}Hz)`),this.masterGainNode=this.audioContext.createGain(),this.masterGainNode.gain.value=this.options.masterVolume,this.masterGainNode.connect(this.audioContext.destination),this.audioContext.state==="suspended"&&this.audioContext.resume().then(()=>{this.log("AudioContext resumed")}),this.soundBank=new b(this.audioContext,this.options.debug),this.initialized=!0,!0):(console.warn("[AudioManager] Web Audio API not supported"),!1)}catch(t){return console.error("[AudioManager] Failed to initialize AudioContext:",t),!1}}isInitialized(){return this.initialized&&this.audioContext!==null}getContext(){return this.audioContext}getMasterGain(){return this.masterGainNode}setMasterVolume(t){this.options.masterVolume=Math.max(0,Math.min(1,t)),this.masterGainNode&&(this.masterGainNode.gain.value=this.options.masterVolume),this.log(`Master volume set to ${this.options.masterVolume}`)}getMasterVolume(){return this.options.masterVolume}playStartSound(){if(!this.audioContext||!this.masterGainNode){this.log("Cannot play sound: AudioContext not initialized");return}try{let t=this.audioContext,e=t.currentTime,n=[262,330,392,523],o=.06,i=.07;n.forEach((s,u)=>{let a=e+u*i,r=t.createOscillator();r.type="square",r.frequency.setValueAtTime(s,a);let d=t.createGain();d.gain.setValueAtTime(0,a),d.gain.linearRampToValueAtTime(.15,a+.005),d.gain.setValueAtTime(.15,a+o-.01),d.gain.linearRampToValueAtTime(0,a+o),r.connect(d),d.connect(this.masterGainNode),r.start(a),r.stop(a+o)}),this.log("Start sound played (retro arpeggio)")}catch(t){console.error("[AudioManager] Failed to play start sound:",t)}}playTone(t,e,n={}){if(!this.audioContext||!this.masterGainNode){this.log("Cannot play tone: AudioContext not initialized");return}let{type:o="sine",volume:i=.3,attack:s=.01,release:u=.1}=n;try{let a=this.audioContext,r=a.currentTime,d=a.createOscillator();d.type=o,d.frequency.setValueAtTime(t,r);let l=a.createGain();l.gain.setValueAtTime(0,r),l.gain.linearRampToValueAtTime(i,r+s),l.gain.setValueAtTime(i,r+e-u),l.gain.linearRampToValueAtTime(0,r+e),d.connect(l),l.connect(this.masterGainNode),d.start(r),d.stop(r+e),this.log(`Tone played: ${t}Hz for ${e}s`)}catch(a){console.error("[AudioManager] Failed to play tone:",a)}}playNote(t,e,n={}){let o=this.noteToFrequency(t);if(o===null){console.warn(`[AudioManager] Invalid note: ${t}`);return}this.playTone(o,e,n)}noteToFrequency(t){let e=/^([A-Ga-g])([#b]?)(\d)$/,n=t.match(e);if(!n)return null;let[,o,i,s]=n,u=parseInt(s,10),r={C:0,D:2,E:4,F:5,G:7,A:9,B:11}[o.toUpperCase()];if(r===void 0)return null;i==="#"?r+=1:i==="b"&&(r-=1);let d=r+(u+1)*12;return 440*Math.pow(2,(d-49)/12)}async resumeContext(){this.audioContext&&this.audioContext.state==="suspended"&&(await this.audioContext.resume(),this.log("AudioContext resumed"))}async suspendContext(){this.audioContext&&this.audioContext.state==="running"&&(await this.audioContext.suspend(),this.log("AudioContext suspended"))}getState(){return this.audioContext?.state??null}getSoundBank(){return this.soundBank}play(t,e={}){if(!this.audioContext||!this.masterGainNode||!this.soundBank)return this.log("Cannot play: not initialized"),null;let n=this.soundBank.get(t);if(!n)return console.warn(`[AudioManager] Sound not found: ${t}`),null;try{let o=this.audioContext,i=e.instanceId??this.nextInstanceId++;e.instanceId!==void 0&&e.instanceId>=this.nextInstanceId&&(this.nextInstanceId=e.instanceId+1);let s=o.createBufferSource();s.buffer=n.buffer,s.loop=e.loop??!1,s.playbackRate.value=e.pitch??1;let u=o.createGain(),a=e.volume??1,r=e.fadeIn??0,d={source:s,gainNode:u,soundName:n.name,stopped:!1,baseVolume:a,targetVolume:a,fadingOut:!1,paused:!1,pausedAt:0,startedAt:o.currentTime,loop:e.loop??!1,playbackRate:e.pitch??1,buffer:n.buffer,outputNode:u},l=a,f=a;if(e.position){let{pan:h,distanceVolume:m}=this.calculateSpatialAudio(e.position.x,e.position.y),g=o.createStereoPanner();g.pan.value=h,l=r>0?0:a*m,f=a*m,u.gain.setValueAtTime(l,o.currentTime),r>0&&(u.gain.linearRampToValueAtTime(f,o.currentTime+r),this.log(`Fade in: ${n.name} [#${i}] over ${r}s`)),s.connect(u),u.connect(g),g.connect(this.masterGainNode),d.pannerNode=g,d.position={x:e.position.x,y:e.position.y},d.targetVolume=f,d.outputNode=g,this.spatialSounds.set(s,{gainNode:u,pannerNode:g,position:{x:e.position.x,y:e.position.y},baseVolume:a}),this.log(`Playing spatial: ${n.name} [#${i}] at (${e.position.x}, ${e.position.y}) pan=${h.toFixed(2)} vol=${m.toFixed(2)}`)}else l=r>0?0:a,f=a,u.gain.setValueAtTime(l,o.currentTime),r>0&&(u.gain.linearRampToValueAtTime(f,o.currentTime+r),this.log(`Fade in: ${n.name} [#${i}] over ${r}s`)),s.connect(u),u.connect(this.masterGainNode);this.instances.set(i,d),(e.lowpass||e.highpass||e.reverb)&&this.setEffects(i,e.lowpass,e.highpass,e.reverb),this.instancesBySound.has(n.name)||this.instancesBySound.set(n.name,new Set),this.instancesBySound.get(n.name).add(i),this.activeSounds.add(s),s.onended=()=>{d.paused||this.cleanupInstance(i)},s.start(0,e.offset??0),e.position||this.log(`Playing: ${n.name} [#${i}]`);let y=this.stop.bind(this),v=this.instances;return{instanceId:i,stop:()=>{y(i)},get playing(){let h=v.get(i);return h!==void 0&&!h.stopped},sound:n}}catch(o){return console.error(`[AudioManager] Failed to play sound "${t}":`,o),null}}stop(t){return t==="all"?this.stopAll():typeof t=="number"?this.stopInstance(t)?1:0:this.stopByName(t)}fadeOut(t,e){if(!this.audioContext)return 0;let n=Math.max(.01,e);return t==="all"?this.fadeOutAll(n):typeof t=="number"?this.fadeOutInstance(t,n)?1:0:this.fadeOutByName(t,n)}fadeOutInstance(t,e){let n=this.instances.get(t);if(!n||n.stopped||n.fadingOut||!this.audioContext)return!1;let o=this.audioContext;n.fadingOut=!0;let i=n.gainNode.gain.value;return n.gainNode.gain.cancelScheduledValues(o.currentTime),n.gainNode.gain.setValueAtTime(i,o.currentTime),n.gainNode.gain.linearRampToValueAtTime(0,o.currentTime+e),setTimeout(()=>{this.stopInstance(t)},e*1e3),this.log(`Fading out instance #${t} (${n.soundName}) over ${e}s`),!0}fadeOutByName(t,e){let n=this.instancesBySound.get(t);if(!n||n.size===0)return 0;let o=0;for(let i of Array.from(n))this.fadeOutInstance(i,e)&&o++;return this.log(`Fading out ${o} instances of "${t}" over ${e}s`),o}fadeOutAll(t){let e=0;for(let n of Array.from(this.instances.keys()))this.fadeOutInstance(n,t)&&e++;return this.log(`Fading out all sounds (${e} instances) over ${t}s`),e}pause(t){return t==="all"?this.pauseAll():typeof t=="number"?this.pauseInstance(t)?1:0:this.pauseByName(t)}pauseInstance(t){let e=this.instances.get(t);if(!e||e.stopped||e.paused||e.fadingOut||!this.audioContext)return!1;let o=(this.audioContext.currentTime-e.startedAt)*e.playbackRate;if(e.loop)e.pausedAt=o%e.buffer.duration;else if(e.pausedAt=o,e.pausedAt>=e.buffer.duration)return!1;try{e.source.stop()}catch{}return e.paused=!0,this.log(`Paused instance #${t} (${e.soundName}) at ${e.pausedAt.toFixed(2)}s`),!0}pauseByName(t){let e=this.instancesBySound.get(t);if(!e||e.size===0)return 0;let n=0;for(let o of Array.from(e))this.pauseInstance(o)&&n++;return this.log(`Paused ${n} instances of "${t}"`),n}pauseAll(){let t=0;for(let e of Array.from(this.instances.keys()))this.pauseInstance(e)&&t++;return this.log(`Paused all sounds (${t} instances)`),t}resume(t){return t==="all"?this.resumeAll():typeof t=="number"?this.resumeInstance(t)?1:0:this.resumeByName(t)}resumeInstance(t){let e=this.instances.get(t);if(!e||e.stopped||!e.paused||!this.audioContext||!this.masterGainNode)return!1;let n=this.audioContext,o=n.createBufferSource();return o.buffer=e.buffer,o.loop=e.loop,o.playbackRate.value=e.playbackRate,o.connect(e.gainNode),e.source=o,e.paused=!1,e.startedAt=n.currentTime-e.pausedAt/e.playbackRate,o.onended=()=>{e.paused||this.cleanupInstance(t)},o.start(0,e.pausedAt),this.log(`Resumed instance #${t} (${e.soundName}) from ${e.pausedAt.toFixed(2)}s`),!0}resumeByName(t){let e=this.instancesBySound.get(t);if(!e||e.size===0)return 0;let n=0;for(let o of Array.from(e))this.resumeInstance(o)&&n++;return this.log(`Resumed ${n} instances of "${t}"`),n}resumeAll(){let t=0;for(let e of Array.from(this.instances.keys()))this.resumeInstance(e)&&t++;return this.log(`Resumed all sounds (${t} instances)`),t}stopInstance(t){let e=this.instances.get(t);if(!e||e.stopped)return!1;try{e.source.stop(),e.stopped=!0,this.log(`Stopped instance #${t} (${e.soundName})`)}catch{}return this.cleanupInstance(t),!0}stopByName(t){let e=this.instancesBySound.get(t);if(!e||e.size===0)return 0;let n=0;for(let o of Array.from(e))this.stopInstance(o)&&n++;return this.log(`Stopped ${n} instances of "${t}"`),n}cleanupInstance(t){let e=this.instances.get(t);if(!e)return;this.instances.delete(t);let n=this.instancesBySound.get(e.soundName);n&&(n.delete(t),n.size===0&&this.instancesBySound.delete(e.soundName)),this.activeSounds.delete(e.source),this.spatialSounds.delete(e.source)}setListenerPosition(t,e){t===this.spatialConfig.listenerX&&e===this.spatialConfig.listenerY||(this.spatialConfig.listenerX=t,this.spatialConfig.listenerY=e,this.spatialSounds.size>0&&this.updateAllSpatialSounds())}updateAllSpatialSounds(){for(let[t,e]of this.spatialSounds){if(!this.activeSounds.has(t)){this.spatialSounds.delete(t);continue}let{pan:n,distanceVolume:o}=this.calculateSpatialAudio(e.position.x,e.position.y);e.pannerNode.pan.value=n,e.gainNode.gain.value=e.baseVolume*o}}getListenerPosition(){return{x:this.spatialConfig.listenerX,y:this.spatialConfig.listenerY}}configureSpatial(t){this.log(`configureSpatial called with: ${JSON.stringify(t)}`),t.listenerX!==void 0&&(this.spatialConfig.listenerX=Math.max(0,Math.min(65535,t.listenerX))),t.listenerY!==void 0&&(this.spatialConfig.listenerY=Math.max(0,Math.min(65535,t.listenerY))),t.maxDistance!==void 0&&(this.spatialConfig.maxDistance=Math.max(1,t.maxDistance)),t.referenceDistance!==void 0&&(this.spatialConfig.referenceDistance=Math.max(1,t.referenceDistance)),t.rolloffFactor!==void 0&&(this.spatialConfig.rolloffFactor=Math.max(0,t.rolloffFactor)),t.panSpread!==void 0&&(this.spatialConfig.panSpread=Math.max(0,Math.min(1,t.panSpread))),this.log(`spatialConfig now: maxDistance=${this.spatialConfig.maxDistance}, refDist=${this.spatialConfig.referenceDistance}, panSpread=${this.spatialConfig.panSpread}`)}getSpatialConfig(){return{...this.spatialConfig}}setEffects(t,e,n,o){if(!this.audioContext||!this.masterGainNode)return;let i=this.instances.get(t);if(!i||i.stopped){this.log(`setEffects: instance ${t} not found or stopped`);return}let s=this.audioContext;e!==void 0&&(e>0?(i.lowpassNode||(i.lowpassNode=s.createBiquadFilter(),i.lowpassNode.type="lowpass",i.lowpassNode.Q.value=1,this.insertFilterNode(i,i.lowpassNode)),i.lowpassNode.frequency.setValueAtTime(e,s.currentTime),this.log(`setEffects: instance ${t} lowpass=${e}Hz`)):i.lowpassNode&&(this.removeFilterNode(i,i.lowpassNode),i.lowpassNode=void 0,this.log(`setEffects: instance ${t} lowpass disabled`))),n!==void 0&&(n>0?(i.highpassNode||(i.highpassNode=s.createBiquadFilter(),i.highpassNode.type="highpass",i.highpassNode.Q.value=1,this.insertFilterNode(i,i.highpassNode)),i.highpassNode.frequency.setValueAtTime(n,s.currentTime),this.log(`setEffects: instance ${t} highpass=${n}Hz`)):i.highpassNode&&(this.removeFilterNode(i,i.highpassNode),i.highpassNode=void 0,this.log(`setEffects: instance ${t} highpass disabled`))),o!==void 0&&(o>0?(this.ensureReverbInitialized(),!i.reverbSendNode&&this.reverbConvolver&&(i.reverbSendNode=s.createGain(),i.reverbSendNode.gain.value=0,i.outputNode.connect(i.reverbSendNode),i.reverbSendNode.connect(this.reverbConvolver)),i.reverbSendNode&&(i.reverbSendNode.gain.setValueAtTime(o,s.currentTime),this.log(`setEffects: instance ${t} reverb=${o.toFixed(2)}`))):i.reverbSendNode&&(i.reverbSendNode.gain.setValueAtTime(0,s.currentTime),this.log(`setEffects: instance ${t} reverb disabled`)))}ensureReverbInitialized(){if(this.reverbConvolver||!this.audioContext||!this.masterGainNode)return;let t=this.audioContext,e=t.sampleRate,o=Math.floor(e*.5),i=t.createBuffer(1,o,e),s=i.getChannelData(0);for(let u=0;u<o;u++){let a=u/e,r=Math.exp(-a*6);s[u]=(Math.random()*2-1)*r}this.reverbConvolver=t.createConvolver(),this.reverbConvolver.buffer=i,this.reverbGain=t.createGain(),this.reverbGain.gain.value=.5,this.reverbConvolver.connect(this.reverbGain),this.reverbGain.connect(this.masterGainNode),this.log("Shared reverb initialized")}insertFilterNode(t,e){if(this.masterGainNode){try{t.outputNode.disconnect(this.masterGainNode)}catch{}t.outputNode.connect(e),e.connect(this.masterGainNode)}}removeFilterNode(t,e){if(this.masterGainNode){try{e.disconnect()}catch{}try{t.outputNode.disconnect(e)}catch{}t.outputNode.connect(this.masterGainNode)}}calculateSpatialAudio(t,e){let{listenerX:n,listenerY:o,maxDistance:i,referenceDistance:s,panSpread:u}=this.spatialConfig,a=t-n,r=e-o,d=Math.sqrt(a*a+r*r),l;d<=s?l=1:d>=i?l=0:l=1-(d-s)/(i-s);let f=0;return i>0&&u>0&&(f=a/i*u,f=Math.max(-1,Math.min(1,f))),this.log(`Spatial: listener(${n.toFixed(1)}, ${o.toFixed(1)}) sound(${t.toFixed(1)}, ${e.toFixed(1)}) dist=${d.toFixed(1)} vol=${l.toFixed(2)} pan=${f.toFixed(2)} [dx=${a.toFixed(1)} maxDist=${i} panSpread=${u}]`),{pan:f,distanceVolume:l}}stopAll(){let t=this.instances.size;for(let[,e]of this.instances)if(!e.stopped)try{e.source.stop(),e.stopped=!0}catch{}return this.instances.clear(),this.instancesBySound.clear(),this.activeSounds.clear(),this.spatialSounds.clear(),this.log(`Stopped all sounds (${t} instances)`),t}getPlayingCount(){return this.instances.size}getActiveInstances(){return Array.from(this.instances.keys())}isPlaying(t){let e=this.instances.get(t);return e!==void 0&&!e.stopped}destroy(){this.stopAll(),this.soundBank&&(this.soundBank.clear(),this.soundBank=null),this.audioContext&&(this.audioContext.close(),this.audioContext=null),this.masterGainNode=null,this.initialized=!1,this.log("AudioManager destroyed")}log(t){this.options.debug&&console.warn(`[AudioManager] ${t}`)}};x(N,"AudioManager");var A=N;export{A as AudioManager,b as SoundBank};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@utsp/audio",
|
|
3
|
-
"version": "0.5.0-nightly.
|
|
3
|
+
"version": "0.5.0-nightly.20251204224600.55bf8ac",
|
|
4
4
|
"description": "UTSP audio engine - Web Audio API management for UTSP applications",
|
|
5
5
|
"author": "THP Software",
|
|
6
6
|
"license": "MIT",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@types/node": "^24.9.1",
|
|
47
|
-
"@utsp/types": "0.5.0-nightly.
|
|
47
|
+
"@utsp/types": "0.5.0-nightly.20251204224600.55bf8ac",
|
|
48
48
|
"typescript": "^5.6.3"
|
|
49
49
|
},
|
|
50
50
|
"scripts": {
|