2013-07-10 102 views
1

在我的應用程序中,我播放兩個聲音文件,它們是Wave文件,兩個資源,一個用於「成功」操作,另一個用於發生「錯誤」。如何使用NAudio更改wav資源的音量?

所以對於打他們,我這樣做:

My.Computer.Audio.Play(My.Resources.Success, AudioPlayMode.Background) 

現在,我想在我的應用程序添加一個選項來修改容積是wavefiles,我的意思是比原體積體積小(打他們如果用戶想這樣做的話)。

我爲它搜索Naudio和其他StackOverFlow問題,如我的,我注意到NAudio庫可以做這個工作,問題是所有的樣本都在C#中,也是超專業編碼,所以真的不明白如何我可以改變我的wav文件的音量。

我正在使用VB.NET。

如果再在這裏需要額外的信息是n音訊LIB:http://naudio.codeplex.com/releases/view/96875

這裏是n音訊的中的demoApp的有趣的部分,我覺得這裏是音量上升或下降......但我不敢肯定:

 namespace NAudioDemo.AudioPlaybackDemo 

     this.fileWaveStream = plugin.CreateWaveStream(fileName); 
     var waveChannel = new SampleChannel(this.fileWaveStream, true); 
     this.setVolumeDelegate = (vol) => waveChannel.Volume = vol; 
     waveChannel.PreVolumeMeter += OnPreVolumeMeter; 

     var postVolumeMeter = new MeteringSampleProvider(waveChannel); 
     postVolumeMeter.StreamVolume += OnPostVolumeMeter; 

回答

1

擴展解決方案:

#Region " NAudio " 

Public Class NAudio_Helper 

' [ NAudio ] 
' 
' // By Elektro [email protected] 
' 
' Instructions: 
' 1. Add a reference for the "NAudio.dll" file into the project. 
' 
' Examples: 
' 
' Dim Stream As NAudio.Wave.WaveFileReader = New NAudio.Wave.WaveFileReader(File) 
' 
' Set_Volume(Stream, 0.5) 
' Play_Sound(Stream, 1) 
' Play_Sound(My.Resources.AudioFile) 
' Play_Sound("C:\File.wav") 


' Play Sound (File) 
Private Sub Play_Sound(ByVal File As String, _ 
         Optional ByVal Volume As Single = Nothing) 

    Dim Wave As New NAudio.Wave.WaveOut 

    Select Case File.Split(".").Last.ToLower 
     Case "aiff" 
      Wave.Init(New NAudio.Wave.AiffFileReader(File)) 
     Case "mp3" 
      Wave.Init(New NAudio.Wave.Mp3FileReader(File)) 
     Case "wav" 
      Wave.Init(New NAudio.Wave.WaveFileReader(File)) 
     Case Else 
      Wave.Init(New NAudio.Wave.BlockAlignReductionStream(NAudio.Wave.WaveFormatConversionStream.CreatePcmStream(New NAudio.Wave.AudioFileReader(File)))) 
    End Select 

    If Not Volume = Nothing Then Wave.Volume = Volume 
    Wave.Play() 

End Sub 

' Play Sound (MemoryStream) 
Private Sub Play_Sound(ByVal Stream As IO.MemoryStream, _ 
         Optional ByVal Volume As Single = Nothing) 

    Dim Wave As New NAudio.Wave.WaveOut 
    Wave.Init(New NAudio.Wave.BlockAlignReductionStream(NAudio.Wave.WaveFormatConversionStream.CreatePcmStream(New NAudio.Wave.WaveFileReader(Stream)))) 
    If Not Volume = Nothing Then Wave.Volume = Volume 
    Wave.Play() 

End Sub 

' Play Sound (Unmanaged MemoryStream) 
Private Sub Play_Sound(ByVal Stream As IO.UnmanagedMemoryStream, _ 
         Optional ByVal Volume As Single = Nothing) 

    Dim Wave As New NAudio.Wave.WaveOut 
    Wave.Init(New NAudio.Wave.BlockAlignReductionStream(NAudio.Wave.WaveFormatConversionStream.CreatePcmStream(New NAudio.Wave.WaveFileReader(Stream)))) 
    If Not Volume = Nothing Then Wave.Volume = Volume 
    Wave.Play() 

End Sub 

' Play Sound (NAudio Stream) 
Private Sub Play_Sound(ByVal NAudio_Stream As Object, _ 
         Optional ByVal Volume As Single = Nothing) 

    Dim Wave As New NAudio.Wave.WaveOut 
    Wave.Init(NAudio_Stream) 
    If Not Volume = Nothing Then Wave.Volume = Volume 
    Wave.Play() 

End Sub 

' Set Volume (NAudio Stream) 
Private Function Set_Volume(ByVal NAudio_Stream As Object, ByVal Volume As Single) _ 
As NAudio.Wave.WaveOut 

    Dim Wave As New NAudio.Wave.WaveOut 
    Wave.Init(NAudio_Stream) 
    Wave.Volume = Volume 
    Return Wave 

End Function 

End Class 

#End Region 
+0

WaveOut.Volume現已棄用。這個答案已經過時了。 – stricq

2

如果你能得到你的資源保持作爲一個流,那麼你可以使用一個WaveFileReader加載它,然後傳遞到SampleChannel,使您可以調節音量。不需要MeteringSampleProvider

+0

謝謝,但我只能按照第一步:公共wavefile作爲新NAudio.Wave.WaveFileReader( 「C:\ Success.wav」),我不知道是怎麼下一步要做的。 – ElektroStudios

+1

下一步與您的問題中顯示的相同 - 將其傳遞給SampleChannel構造函數。然後確保您將該樣本通道傳遞到您的WaveOut中進行播放,或者將其音量設置爲無效 –