我不是一个C#程序员,但我已经在我的VB项目中成功实现了几个NAudio功能。
我被困在如何设置信号链以将两个波形文件发送到混音器,然后发送到播放引擎,这是我从 PluralSight 上精彩的 NAudio Course Mark 获得的。
任何人都可以帮助我找到正确的属性组合来使其正常工作吗?
模块1'声明
Public myBackMSP As MixingSampleProvider
Public myLeadMSP As MixingSampleProvider
Public myBackWaveout As WaveOut
Public myLeadWaveout As WaveOut
Public mybackIWP As IWaveProvider
Public myleadIWP As IWaveProvider
Public mybackAFR As AudioFileReader
Public myleadAFR As AudioFileReader
Public myBackVolume As Double
Public myLeadVolume As Double
Public mymixer As MixingSampleProvider
Public myWaveout As WaveOut
' 模块1结束
Private Sub playbackengine()
myWaveout = New WaveOut
mymixer = New MixingSampleProvider(WaveFormat.CreateIeeeFloatWaveFormat(44100, 2))
mymixer.ReadFully = True
myWaveout.Init(mymixer)
myWaveout.Play()
End Sub
Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click, btnStart.Click
dim myBackFileName As String
dim myLeadFileName As String
mybackfilename = "c:\vb\back.wav"
myleadfilename = "c:\vb\lead.wav"
playbackengine()
btnStart.Enabled = False ' to prevent Start being pressed twice
myleadAFR = New AudioFileReader(myLeadFileName)
mybackAFR = New AudioFileReader(myBackFileName)
myleadIWP = New IWaveProvider(myLeadFileName)
mybackIWP = New IWaveProvider(myBackFileName)
myleadIWP = New IWaveProvider(myleadAFR.ToWaveProvider) ' <-- these throw a 'New' Cannot
mybackIWP = New IWaveProvider(mybackAFR.ToWaveProvider) ' <-- be used on an interface
myLeadMSP = New MixingSampleProvider(myleadAFR)
myBackMSP = New MixingSampleProvider(mybackAFR)
myleadAFR.Volume = 0.5
mybackAFR.Volume = 0.5
mymixer.AddMixerInput(myLeadMSP)
mymixer.AddMixerInput(myBackMSP)
End Sub
我一直在将这两个文件发送到 Waveout 的两个实例,但无法独立更改文件的音量。
经过大量挖掘,并参考马克课程,我发现了我的错误。
这是更正后的代码。
Public mybackISP As ISampleProvider
Public myleadISP As ISampleProvider
Public mybackAFR As AudioFileReader
Public myleadAFR As AudioFileReader
Public myBackVolume As Double
Public myLeadVolume As Double
Public mymixer As MixingSampleProvider
Public myWaveout As WaveOut
Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click, btnStart.Click
playbackengine()
btnStart.Enabled = False
mybackAFR = New AudioFileReader(myBackFileName)
myleadAFR = New AudioFileReader(myLeadFileName)
myleadISP = myleadAFR.ToSampleProvider //cast to Sampleprovider !
mybackISP = mybackAFR.ToSampleProvider //cast to Sampleprovider !
mymixer.AddMixerInput(mybackISP)
mymixer.AddMixerInput(myleadISP)
End Sub
// playback engine unchangeed
Private Sub playbackengine()
myWaveout = New WaveOut
mymixer = New MixingSampleProvider(WaveFormat.CreateIeeeFloatWaveFormat(44100, 2))
mymixer.ReadFully = True
myWaveout.Init(mymixer)
myWaveout.Play()
End Sub