diff --git a/bun.lockb b/bun.lockb index ff971e71..010eee6e 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index fcc84a5c..a85d9381 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "tailwindcss-animate": "^1.0.7", "tslib": "^2.8.1", "typescript": "^5.6.3", - "wxt": "^0.19.13" + "wxt": "^0.19.29" }, "private": true, "scripts": { diff --git a/src/lib/audio-effects/audio-manager.ts b/src/lib/audio-effects/audio-manager.ts index 3cd21d3c..b1a5a2c3 100644 --- a/src/lib/audio-effects/audio-manager.ts +++ b/src/lib/audio-effects/audio-manager.ts @@ -243,10 +243,10 @@ export default class AudioManager { getGainPairing(effect: string) { const pairings = { - kick_ir: { dry: 0.95, wet: 0.05 }, - muffler_ir: { dry: 0.9, wet: 0.1 }, - diffusor_ir: { dry: 0.9, wet: 0.1 }, - telephone_ir: { dry: 0.65, wet: 0.35 } + kick_ir: { dry: 0.5, wet: 0.5 }, + muffler_ir: { dry: 0.4, wet: 0.6 }, + diffusor_ir: { dry: 0.4, wet: 0.6 }, + telephone_ir: { dry: 0.3, wet: 0.7 } } return pairings[effect as keyof typeof pairings] } @@ -410,11 +410,19 @@ export default class AudioManager { disconnect() { if (!this.isConnectable) return - // Clear all active effects + // CRITICAL: First cleanup the effect chain while we still have references to the effect nodes + // This ensures all effect nodes are properly disconnected before we clear the references + this.cleanupEffectChain() + + // Now clear all active effects this._activeEffects = {} - // Rebuild with no effects (just gain → soundTouch → destination) - this.rebuildEffectChain() + // Reconnect the basic chain: source → gain → soundTouch → destination + if (this.source && this._gainNode && this._soundTouchNode && this.destination) { + this.source.connect(this._gainNode) + this._gainNode.connect(this._soundTouchNode) + this._soundTouchNode.connect(this.destination) + } } removeEffect(effectType: 'equalizer' | 'msProcessor' | 'reverb') { diff --git a/src/lib/audio-effects/ms-processor/index.ts b/src/lib/audio-effects/ms-processor/index.ts index 99aeb8d2..4547d64f 100644 --- a/src/lib/audio-effects/ms-processor/index.ts +++ b/src/lib/audio-effects/ms-processor/index.ts @@ -13,16 +13,13 @@ export default class MSProcessor { } async setMSEffect(effect: string) { - console.log('MSProcessor.setMSEffect called with:', effect) if (!this._audioManager.audioContext) { - console.warn('MSProcessor: AudioContext not initialized yet, skipping') return } this._audioContext = this._audioManager.audioContext if (effect === 'none') { - console.log('MSProcessor: disconnecting') this.cleanup() if (this._audioManager.audioContext) { this._audioManager.removeEffect('msProcessor') @@ -34,7 +31,6 @@ export default class MSProcessor { await this.createMSProcessor() this.connectMSProcessor() this.applyMSEffect(effect) - console.log('MSProcessor: effect applied successfully') } catch (error) { console.error('Error setting MS effect:', error) this.cleanup() @@ -46,9 +42,7 @@ export default class MSProcessor { } async applyManualParams(params: MSParams) { - console.log('MSProcessor.applyManualParams called with:', params) if (!this._audioManager.audioContext) { - console.warn('MSProcessor: AudioContext not initialized yet, skipping') return } @@ -62,7 +56,6 @@ export default class MSProcessor { } this.applyParams(params) - console.log('MSProcessor: manual params applied successfully') } catch (error) { console.error('Error applying manual MS params:', error) throw error diff --git a/src/lib/audio-effects/reverb/index.ts b/src/lib/audio-effects/reverb/index.ts index 02158e5e..17c6c1aa 100644 --- a/src/lib/audio-effects/reverb/index.ts +++ b/src/lib/audio-effects/reverb/index.ts @@ -23,15 +23,12 @@ export default class Reverb { } async setReverbEffect(effect: string) { - console.log('Reverb.setReverbEffect called with:', effect) if (!this._audioManager.audioContext) { - console.warn('Reverb: AudioContext not initialized yet, skipping') return } this._audioContext = this._audioManager.audioContext if (effect === 'none') { - console.log('Reverb: disconnecting') this.cleanup() if (this._audioManager.audioContext) { this._audioManager.removeEffect('reverb') @@ -43,12 +40,10 @@ export default class Reverb { const isImpulse = this.isImpulse(effect) if (isImpulse) { await this.createImpulseReverb(effect) - console.log('Reverb: impulse reverb applied') } else { await this.createDigitalReverb() this.connectDigitalReverb() this.applyReverbEffect(effect) - console.log('Reverb: digital reverb applied') } } catch (error) { console.error('Error setting reverb effect:', error) diff --git a/src/lib/media/media-element.ts b/src/lib/media/media-element.ts index 8f1cc91c..ba04a490 100644 --- a/src/lib/media/media-element.ts +++ b/src/lib/media/media-element.ts @@ -52,9 +52,6 @@ export default class MediaElement { this.loadMediaOverride() document.dispatchEvent(new CustomEvent('FROM_MEDIA_PLAY_INIT')) - - // Trigger re-application of stored effects after media is ready - window.postMessage({ type: 'REQUEST_EFFECT_REAPPLY' }, '*') }) // Set up window message listener (instance-based, v2.7.1 pattern) diff --git a/src/lib/observers/track.ts b/src/lib/observers/track.ts index 85a0b67d..13d2f2f8 100644 --- a/src/lib/observers/track.ts +++ b/src/lib/observers/track.ts @@ -48,9 +48,7 @@ export class TrackObserver { private async processMediaPlayInit() { await this.trackStateManager.updateTrackType() await this.trackStateManager.setPlayback(this.audioPreset) - // Note: setEffect() will be called via REQUEST_EFFECT_REAPPLY message - // dispatched from media-element.ts, so we don't need to call it here - // to avoid redundant effect applications + this.setEffect() } // Simplified getters for commonly accessed stores diff --git a/src/lib/stores/effects.ts b/src/lib/stores/effects.ts index 251983fc..a4b2cfb7 100644 --- a/src/lib/stores/effects.ts +++ b/src/lib/stores/effects.ts @@ -83,15 +83,6 @@ function createAudioEffectsStore() { set(syncedValue) }) - // Listen for requests to reapply effects (e.g., after media element recreation) - // Only set up listener if window is available (not in service worker context) - if (typeof window !== 'undefined') { - window.addEventListener('message', (event) => { - if (event.source !== window) return - if (event.data?.type === 'REQUEST_EFFECT_REAPPLY') dispatchEffect() - }) - } - return { set, reset, diff --git a/src/lib/stores/ms-params.ts b/src/lib/stores/ms-params.ts index 66378d3e..6686bd91 100644 --- a/src/lib/stores/ms-params.ts +++ b/src/lib/stores/ms-params.ts @@ -98,20 +98,6 @@ function createMSParamsStore() { set(syncedValue) }) - // Listen for requests to reapply params (e.g., after media element recreation) - // Only set up listener if window is available (not in service worker context) - if (typeof window !== 'undefined') { - window.addEventListener('message', (event) => { - if (event.source !== window) return - if ( - event.data?.type === 'REQUEST_MS_PARAMS_REAPPLY' || - event.data?.type === 'REQUEST_EFFECT_REAPPLY' - ) { - dispatchParams() - } - }) - } - return { set, reset, diff --git a/src/lib/stores/playback.ts b/src/lib/stores/playback.ts index e22bf7de..de8ca0d1 100644 --- a/src/lib/stores/playback.ts +++ b/src/lib/stores/playback.ts @@ -190,17 +190,6 @@ function createPlaybackStore() { set(syncedValues) }) - // Listen for requests to reapply playback settings (e.g., after media element recreation) - // Only set up listener if window is available (not in service worker context) - if (typeof window !== 'undefined') { - window.addEventListener('message', (event) => { - if (event.source !== window) return - if (event.data?.type === 'REQUEST_EFFECT_REAPPLY') { - dispatchPlaybackSettings() - } - }) - } - return { reset, togglePin, diff --git a/src/lib/stores/volume.ts b/src/lib/stores/volume.ts index 6230ccc9..d6352fe7 100644 --- a/src/lib/stores/volume.ts +++ b/src/lib/stores/volume.ts @@ -121,17 +121,6 @@ function createVolumeStore() { set(syncedVolume) }) - // Listen for requests to reapply volume (e.g., after media element recreation) - // Only set up listener if window is available (not in service worker context) - if (typeof window !== 'undefined') { - window.addEventListener('message', (event) => { - if (event.source !== window) return - if (event.data?.type === 'REQUEST_EFFECT_REAPPLY') { - dispatchVolumeEvent() - } - }) - } - return { mute, unMute,