Просмотр исходного кода

Merge pull request #5415 from tangge233/NAudio

优化:自动切换到默认音频设备
龙腾猫跃 1 год назад
Родитель
Сommit
e7034db134
1 измененных файлов с 51 добавлено и 47 удалено
  1. 51 47
      Plain Craft Launcher 2/Modules/ModMusic.vb

+ 51 - 47
Plain Craft Launcher 2/Modules/ModMusic.vb

@@ -1,4 +1,7 @@
-Public Module ModMusic
+Imports NAudio.CoreAudioApi
+Imports NAudio.CoreAudioApi.Interfaces
+
+Public Module ModMusic
 
 #Region "播放列表"
 
@@ -66,44 +69,44 @@
     ''' </summary>
     Private Sub MusicRefreshUI()
         RunInUi(
-        Sub()
-            Try
+            Sub()
+                Try
 
-                If Not MusicAllList.Any() Then
-                    '无背景音乐
-                    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
+                    If Not MusicAllList.Any() Then
+                        '无背景音乐
+                        FrmMain.BtnExtraMusic.Show = False
                     Else
-                        FrmMain.BtnExtraMusic.Logo = Logo.IconMusic
-                        FrmMain.BtnExtraMusic.LogoScale = 1
-                        ToolTipText = "正在播放:" & GetFileNameWithoutExtentionFromPath(MusicCurrent)
-                        If MusicAllList.Count > 1 Then
-                            ToolTipText += vbCrLf & "左键暂停,右键播放下一曲。"
+                        '有背景音乐
+                        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
-                            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
+                        FrmMain.BtnExtraMusic.ToolTip = ToolTipText
+                        ToolTipService.SetVerticalOffset(FrmMain.BtnExtraMusic, If(ToolTipText.Contains(vbLf), 10, 16))
                     End If
-                    FrmMain.BtnExtraMusic.ToolTip = ToolTipText
-                    ToolTipService.SetVerticalOffset(FrmMain.BtnExtraMusic, If(ToolTipText.Contains(vbLf), 10, 16))
-                End If
-                If FrmSetupUI IsNot Nothing Then FrmSetupUI.MusicRefreshUI()
+                    If FrmSetupUI IsNot Nothing Then FrmSetupUI.MusicRefreshUI()
 
-            Catch ex As Exception
-                Log(ex, "刷新背景音乐 UI 失败", LogLevel.Feedback)
-            End Try
-        End Sub)
+                Catch ex As Exception
+                    Log(ex, "刷新背景音乐 UI 失败", LogLevel.Feedback)
+                End Try
+            End Sub)
     End Sub
 
     ''' <summary>
@@ -223,11 +226,11 @@
     Public Function MusicPause() As Boolean
         If MusicState = MusicStates.Play Then
             RunInThread(
-            Sub()
-                Log("[Music] 已暂停播放")
-                MusicNAudio?.Pause()
-                MusicRefreshUI()
-            End Sub)
+                Sub()
+                    Log("[Music] 已暂停播放")
+                    MusicNAudio?.Pause()
+                    MusicRefreshUI()
+                End Sub)
             Return True
         Else
             Log($"[Music] 无需暂停播放,当前状态为 {MusicState}")
@@ -243,11 +246,11 @@
             Return False
         Else
             RunInThread(
-            Sub()
-                Log("[Music] 已恢复播放")
-                MusicNAudio?.Play()
-                MusicRefreshUI()
-            End Sub)
+                Sub()
+                    Log("[Music] 已恢复播放")
+                    MusicNAudio?.Play()
+                    MusicRefreshUI()
+                End Sub)
             Return True
         End If
     End Function
@@ -255,7 +258,7 @@
 #End Region
 
     ''' <summary>
-    ''' 当前正在播放的 NAudio.Wave.WaveOut。
+    ''' 当前正在播放的 NAudio.Wave.WaveOutEvent。
     ''' </summary>
     Public MusicNAudio = Nothing
     ''' <summary>
@@ -267,12 +270,13 @@
     ''' 在 MusicUuid 不变的前提下,持续播放某地址的音乐,且在播放结束后随机播放下一曲。
     ''' </summary>
     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()
@@ -303,7 +307,7 @@
             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)
             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)
             Else
                 Log(ex, "播放音乐失败(" & GetFileNameFromPath(MusicCurrent) & ")", LogLevel.Hint)