From e0c79e06bb3436bb44f5f6c0d1fc15e247ee9c74 Mon Sep 17 00:00:00 2001
From: unanmed <1319491857@qq.com>
Date: Sun, 19 Jan 2025 02:13:52 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E9=9F=B3=E6=95=88=E9=9F=B3=E9=87=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/core/main/setting.ts  |  7 +++----
 src/module/audio/sound.ts | 27 ++++++++++++++++++++++++++-
 2 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/src/core/main/setting.ts b/src/core/main/setting.ts
index c635d35..0af05ee 100644
--- a/src/core/main/setting.ts
+++ b/src/core/main/setting.ts
@@ -3,13 +3,12 @@ import { EventEmitter } from '../common/eventEmitter';
 import { GameStorage } from './storage';
 import { has, triggerFullscreen } from '@/plugin/utils';
 import { createSettingComponents } from './init/settings';
-import { SoundEffect } from '../audio/sound';
 import settingsText from '@/data/settings.json';
 import { isMobile } from '@/plugin/use';
 import { fontSize } from '@/plugin/ui/statusBar';
 import { CustomToolbar } from './custom/toolbar';
 import { fixedUi } from './init/ui';
-import { bgmController } from '@/module';
+import { bgmController, soundPlayer } from '@/module';
 
 export interface SettingComponentProps {
     item: MotaSettingItem;
@@ -390,9 +389,9 @@ function handleAudioSetting<T extends number | boolean>(
     } else if (key === 'bgmVolume') {
         bgmController.setVolume((n as number) / 100);
     } else if (key === 'soundEnabled') {
-        SoundEffect.disable = !n;
+        soundPlayer.setEnabled(n as boolean);
     } else if (key === 'soundVolume') {
-        SoundEffect.volume = (n as number) / 100;
+        soundPlayer.setVolume((n as number) / 100)
     }
 }
 
diff --git a/src/module/audio/sound.ts b/src/module/audio/sound.ts
index 582156d..00ed9f8 100644
--- a/src/module/audio/sound.ts
+++ b/src/module/audio/sound.ts
@@ -1,6 +1,7 @@
 import EventEmitter from 'eventemitter3';
 import { audioPlayer, AudioPlayer } from './player';
 import { logger } from '@/core/common/logger';
+import { VolumeEffect } from './effect';
 
 type LocationArray = [number, number, number];
 
@@ -16,9 +17,32 @@ export class SoundPlayer<
     readonly buffer: Map<T, AudioBuffer> = new Map();
     /** 所有正在播放的音乐 */
     readonly playing: Set<number> = new Set();
+    /** 音量节点 */
+    readonly gain: VolumeEffect;
+
+    /** 是否已经启用 */
+    enabled: boolean = true;
 
     constructor(public readonly player: AudioPlayer) {
         super();
+        this.gain = player.createVolumeEffect();
+    }
+
+    /**
+     * 设置是否启用音效
+     * @param enabled 是否启用音效
+     */
+    setEnabled(enabled: boolean) {
+        if (!enabled) this.stopAllSounds();
+        this.enabled = enabled;
+    }
+
+    /**
+     * 设置音量大小
+     * @param volume 音量大小
+     */
+    setVolume(volume: number) {
+        this.gain.setVolume(volume);
     }
 
     /**
@@ -46,6 +70,7 @@ export class SoundPlayer<
         position: LocationArray = [0, 0, 0],
         orientation: LocationArray = [1, 0, 0]
     ) {
+        if (!this.enabled) return -1;
         const buffer = this.buffer.get(id);
         if (!buffer) {
             logger.warn(52, id);
@@ -58,7 +83,7 @@ export class SoundPlayer<
         const stereo = this.player.createStereoEffect();
         stereo.setPosition(position[0], position[1], position[2]);
         stereo.setOrientation(orientation[0], orientation[1], orientation[2]);
-        route.addEffect(stereo);
+        route.addEffect([stereo, this.gain]);
         this.player.addRoute(`sounds.${soundNum}`, route);
         route.play();
         source.output.addEventListener('ended', () => {