From 482d6f71fcbcb116faf4012268c616608a72e533 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 15 Mar 2025 01:24:57 +0800 Subject: [PATCH] =?UTF-8?q?fix(ModMusic):=20=E5=8D=83=E5=B9=B4=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E8=80=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Modules/ModMusic.vb | 87 +--------------------- 1 file changed, 4 insertions(+), 83 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/ModMusic.vb b/Plain Craft Launcher 2/Modules/ModMusic.vb index 3e24a0f..0632b83 100644 --- a/Plain Craft Launcher 2/Modules/ModMusic.vb +++ b/Plain Craft Launcher 2/Modules/ModMusic.vb @@ -258,7 +258,7 @@ Public Module ModMusic #End Region ''' - ''' 当前正在播放的 NAudio.Wave.WaveOut。 + ''' 当前正在播放的 NAudio.Wave.WaveOutEvent。 ''' Public MusicNAudio = Nothing ''' @@ -266,18 +266,17 @@ Public Module ModMusic ''' Private MusicCurrent As String = "" - Dim deviceHandler As New AudioDeviceChangeHandler - ''' ''' 在 MusicUuid 不变的前提下,持续播放某地址的音乐,且在播放结束后随机播放下一曲。 ''' Private Sub MusicLoop(Optional IsFirstLoad As Boolean = False) - Dim CurrentWave As NAudio.Wave.WaveOut = Nothing + Dim CurrentWave As NAudio.Wave.WaveOutEvent = Nothing Dim Reader As NAudio.Wave.WaveStream = Nothing Try '开始播放 - CurrentWave = New NAudio.Wave.WaveOut() + CurrentWave = New NAudio.Wave.WaveOutEvent() MusicNAudio = CurrentWave + CurrentWave.DeviceNumber = -1 Reader = New NAudio.Wave.AudioFileReader(MusicCurrent) CurrentWave.Init(Reader) CurrentWave.Play() @@ -331,82 +330,4 @@ Public Module ModMusic End Try End Sub - Public Class AudioDeviceChangeHandler - Implements Interfaces.IMMNotificationClient - Private deviceWatcher As MMDeviceEnumerator - Private callback As IMMNotificationClient - - Public Sub New() - ' 初始化音频设备枚举器 - deviceWatcher = New MMDeviceEnumerator() - ' 创建设备通知回调对象 - callback = New DeviceNotificationClient(Me) - ' 注册回调以接收音频设备更改通知 - deviceWatcher.RegisterEndpointNotificationCallback(callback) - End Sub - - ' 实现IMMNotificationClient接口的方法以处理设备更改事件 - Public Sub OnDefaultDeviceChanged(dataFlow As DataFlow, role As Role, defaultDeviceId As String) Implements IMMNotificationClient.OnDefaultDeviceChanged - ' 处理默认音频设备更改事件 - If MusicNAudio Is Nothing Then Exit Sub - ' 切换到系统默认输出设备 - Log($"音频默认输出设备切换到 {defaultDeviceId}") - Dim target As NAudio.Wave.WaveOut = MusicNAudio - target.Stop() - target.DeviceNumber = -1 - target.Resume() - End Sub - - Public Sub OnDeviceAdded(deviceId As String) Implements IMMNotificationClient.OnDeviceAdded - ' 处理音频设备添加事件 - If MusicNAudio Is Nothing Then Exit Sub - CType(MusicNAudio, NAudio.Wave.WaveOut).DeviceNumber = -1 - End Sub - - Public Sub OnDeviceRemoved(deviceId As String) Implements IMMNotificationClient.OnDeviceRemoved - ' 处理音频设备移除事件 - If MusicNAudio Is Nothing Then Exit Sub - CType(MusicNAudio, NAudio.Wave.WaveOut).DeviceNumber = -1 - End Sub - - Public Sub OnDeviceStateChanged(deviceId As String, newState As DeviceState) Implements IMMNotificationClient.OnDeviceStateChanged - ' 处理音频设备状态更改事件 - End Sub - - Public Sub OnPropertyValueChanged(deviceId As String, key As PropertyKey) Implements IMMNotificationClient.OnPropertyValueChanged - ' 处理音频设备属性值更改事件 - End Sub - End Class - - ' 实现IMMNotificationClient接口的类 - Friend Class DeviceNotificationClient - Implements IMMNotificationClient - - Private container As AudioDeviceChangeHandler - - Public Sub New(container As AudioDeviceChangeHandler) - Me.container = container - End Sub - - Public Sub OnDefaultDeviceChanged(dataFlow As DataFlow, role As Role, defaultDeviceId As String) Implements IMMNotificationClient.OnDefaultDeviceChanged - container.OnDefaultDeviceChanged(dataFlow, role, defaultDeviceId) - End Sub - - Public Sub OnDeviceAdded(deviceId As String) Implements IMMNotificationClient.OnDeviceAdded - container.OnDeviceAdded(deviceId) - End Sub - - Public Sub OnDeviceRemoved(deviceId As String) Implements IMMNotificationClient.OnDeviceRemoved - container.OnDeviceRemoved(deviceId) - End Sub - - Public Sub OnDeviceStateChanged(deviceId As String, newState As DeviceState) Implements IMMNotificationClient.OnDeviceStateChanged - container.OnDeviceStateChanged(deviceId, newState) - End Sub - - Public Sub OnPropertyValueChanged(deviceId As String, key As PropertyKey) Implements IMMNotificationClient.OnPropertyValueChanged - container.OnPropertyValueChanged(deviceId, key) - End Sub - End Class - End Module