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', () => {