Merge pull request #5415 from tangge233/NAudio

优化:自动切换到默认音频设备
This commit is contained in:
龙腾猫跃
2025-03-15 17:43:19 +08:00
committed by GitHub
+51 -47
View File
@@ -1,4 +1,7 @@
Public Module ModMusic Imports NAudio.CoreAudioApi
Imports NAudio.CoreAudioApi.Interfaces
Public Module ModMusic
#Region "播放列表" #Region "播放列表"
@@ -66,44 +69,44 @@
''' </summary> ''' </summary>
Private Sub MusicRefreshUI() Private Sub MusicRefreshUI()
RunInUi( RunInUi(
Sub() Sub()
Try Try
If Not MusicAllList.Any() Then If Not MusicAllList.Any() Then
'无背景音乐 '无背景音乐
FrmMain.BtnExtraMusic.Show = False FrmMain.BtnExtraMusic.Show = False
Else
'有背景音乐
FrmMain.BtnExtraMusic.Show = True
Dim ToolTipText As String
If MusicState = MusicStates.Pause Then
FrmMain.BtnExtraMusic.Logo = Logo.IconPlay
FrmMain.BtnExtraMusic.LogoScale = 0.8
ToolTipText = "已暂停:" & GetFileNameWithoutExtentionFromPath(MusicCurrent)
If MusicAllList.Count > 1 Then
ToolTipText += vbCrLf & "左键恢复播放,右键播放下一曲。"
Else
ToolTipText += vbCrLf & "左键恢复播放,右键重新从头播放。"
End If
Else Else
FrmMain.BtnExtraMusic.Logo = Logo.IconMusic '有背景音乐
FrmMain.BtnExtraMusic.LogoScale = 1 FrmMain.BtnExtraMusic.Show = True
ToolTipText = "正在播放:" & GetFileNameWithoutExtentionFromPath(MusicCurrent) Dim ToolTipText As String
If MusicAllList.Count > 1 Then If MusicState = MusicStates.Pause Then
ToolTipText += vbCrLf & "左键暂停,右键播放下一曲。" FrmMain.BtnExtraMusic.Logo = Logo.IconPlay
FrmMain.BtnExtraMusic.LogoScale = 0.8
ToolTipText = "已暂停:" & GetFileNameWithoutExtentionFromPath(MusicCurrent)
If MusicAllList.Count > 1 Then
ToolTipText += vbCrLf & "左键恢复播放,右键播放下一曲。"
Else
ToolTipText += vbCrLf & "左键恢复播放,右键重新从头播放。"
End If
Else Else
ToolTipText += vbCrLf & "左键暂停,右键重新从头播放。" FrmMain.BtnExtraMusic.Logo = Logo.IconMusic
FrmMain.BtnExtraMusic.LogoScale = 1
ToolTipText = "正在播放:" & GetFileNameWithoutExtentionFromPath(MusicCurrent)
If MusicAllList.Count > 1 Then
ToolTipText += vbCrLf & "左键暂停,右键播放下一曲。"
Else
ToolTipText += vbCrLf & "左键暂停,右键重新从头播放。"
End If
End If End If
FrmMain.BtnExtraMusic.ToolTip = ToolTipText
ToolTipService.SetVerticalOffset(FrmMain.BtnExtraMusic, If(ToolTipText.Contains(vbLf), 10, 16))
End If End If
FrmMain.BtnExtraMusic.ToolTip = ToolTipText If FrmSetupUI IsNot Nothing Then FrmSetupUI.MusicRefreshUI()
ToolTipService.SetVerticalOffset(FrmMain.BtnExtraMusic, If(ToolTipText.Contains(vbLf), 10, 16))
End If
If FrmSetupUI IsNot Nothing Then FrmSetupUI.MusicRefreshUI()
Catch ex As Exception Catch ex As Exception
Log(ex, "刷新背景音乐 UI 失败", LogLevel.Feedback) Log(ex, "刷新背景音乐 UI 失败", LogLevel.Feedback)
End Try End Try
End Sub) End Sub)
End Sub End Sub
''' <summary> ''' <summary>
@@ -223,11 +226,11 @@
Public Function MusicPause() As Boolean Public Function MusicPause() As Boolean
If MusicState = MusicStates.Play Then If MusicState = MusicStates.Play Then
RunInThread( RunInThread(
Sub() Sub()
Log("[Music] 已暂停播放") Log("[Music] 已暂停播放")
MusicNAudio?.Pause() MusicNAudio?.Pause()
MusicRefreshUI() MusicRefreshUI()
End Sub) End Sub)
Return True Return True
Else Else
Log($"[Music] 无需暂停播放,当前状态为 {MusicState}") Log($"[Music] 无需暂停播放,当前状态为 {MusicState}")
@@ -243,11 +246,11 @@
Return False Return False
Else Else
RunInThread( RunInThread(
Sub() Sub()
Log("[Music] 已恢复播放") Log("[Music] 已恢复播放")
MusicNAudio?.Play() MusicNAudio?.Play()
MusicRefreshUI() MusicRefreshUI()
End Sub) End Sub)
Return True Return True
End If End If
End Function End Function
@@ -255,7 +258,7 @@
#End Region #End Region
''' <summary> ''' <summary>
''' 当前正在播放的 NAudio.Wave.WaveOut。 ''' 当前正在播放的 NAudio.Wave.WaveOutEvent。
''' </summary> ''' </summary>
Public MusicNAudio = Nothing Public MusicNAudio = Nothing
''' <summary> ''' <summary>
@@ -267,12 +270,13 @@
''' 在 MusicUuid 不变的前提下,持续播放某地址的音乐,且在播放结束后随机播放下一曲。 ''' 在 MusicUuid 不变的前提下,持续播放某地址的音乐,且在播放结束后随机播放下一曲。
''' </summary> ''' </summary>
Private Sub MusicLoop(Optional IsFirstLoad As Boolean = False) 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 Dim Reader As NAudio.Wave.WaveStream = Nothing
Try Try
'开始播放 '开始播放
CurrentWave = New NAudio.Wave.WaveOut() CurrentWave = New NAudio.Wave.WaveOutEvent()
MusicNAudio = CurrentWave MusicNAudio = CurrentWave
CurrentWave.DeviceNumber = -1
Reader = New NAudio.Wave.AudioFileReader(MusicCurrent) Reader = New NAudio.Wave.AudioFileReader(MusicCurrent)
CurrentWave.Init(Reader) CurrentWave.Init(Reader)
CurrentWave.Play() CurrentWave.Play()
@@ -303,7 +307,7 @@
If ex.Message.Contains("Got a frame at sample rate") OrElse ex.Message.Contains("does not support changes to") Then If ex.Message.Contains("Got a frame at sample rate") OrElse ex.Message.Contains("does not support changes to") Then
Hint("播放音乐失败(" & GetFileNameFromPath(MusicCurrent) & "):PCL 不支持播放音频属性在中途发生变化的音乐", HintType.Critical) Hint("播放音乐失败(" & GetFileNameFromPath(MusicCurrent) & "):PCL 不支持播放音频属性在中途发生变化的音乐", HintType.Critical)
ElseIf Not (MusicCurrent.EndsWithF(".wav", True) OrElse MusicCurrent.EndsWithF(".mp3", True) OrElse MusicCurrent.EndsWithF(".flac", True)) OrElse ElseIf Not (MusicCurrent.EndsWithF(".wav", True) OrElse MusicCurrent.EndsWithF(".mp3", True) OrElse MusicCurrent.EndsWithF(".flac", True)) OrElse
ex.Message.Contains("0xC00D36C4") Then '#5096:不支持给定的 URL 的字节流类型。 (异常来自 HRESULT:0xC00D36C4) ex.Message.Contains("0xC00D36C4") Then '#5096:不支持给定的 URL 的字节流类型。 (异常来自 HRESULT:0xC00D36C4)
Hint("播放音乐失败(" & GetFileNameFromPath(MusicCurrent) & "):PCL 可能不支持此音乐格式,请将格式转换为 .wav、.mp3 或 .flac 后再试", HintType.Critical) Hint("播放音乐失败(" & GetFileNameFromPath(MusicCurrent) & "):PCL 可能不支持此音乐格式,请将格式转换为 .wav、.mp3 或 .flac 后再试", HintType.Critical)
Else Else
Log(ex, "播放音乐失败(" & GetFileNameFromPath(MusicCurrent) & ")", LogLevel.Hint) Log(ex, "播放音乐失败(" & GetFileNameFromPath(MusicCurrent) & ")", LogLevel.Hint)