2012-03-05 92 views
2

我使用NAudio在運行時生成並播放聲波。使用NAudio混合WaveProviders

我已經成功地得到使用本教程中產生的正弦波: http://mark-dot-net.blogspot.com/2009/10/playback-of-sine-wave-in-naudio.html

但是 - 我真正需要的是能夠對許多個別波添加到WaveMixerStream,在運行時。

我明白要做到這一點,我需要單獨的WaveStreams,但我不知道如何將WaveProvider的輸出轉換爲WaveStream以添加到WaveMixerStream。

我認爲這是不可能的,所以改變了代碼來給出派生的WaveStream類。

我說:

public override long Length 
    { 
     get { return long.MaxValue; } 
    } 

但我不知道怎麼去的位置:

public override long Position 
{ 
    get 
    { 
     return //What here? 
    } 
    set 
    { 
     // What here? = value; 
    } 

} 

所以,問題是:1。將這項工作? 2.我如何獲得/設置職位?

在此先感謝。

回答

2

IWaveProviderWaveStream之間的區別在於WaveStream支持報告長度和位置以及設置位置。但是,由於您傳遞的是IWaveProvider,因此您不知道長度,並且無法設置位置。只需在Position setter和Position getter中不執行任何操作,返回到目前爲止從Read方法返回的字節總數(只需要一個long類型的專用變量來存儲該字節)。

另一種方法是將WaveMixerStream的代碼複製到IWaveProvider而不是WaveStream。這實際上會簡化它很多,WaveMixerStream的很多複雜性在重新定位時都會正確地重新定位所有混音器輸入。 (順便說一下,在未來我會鼓勵人們使用ISampleProvider界面,並且已經有MixingSampleProvider,它完全符合你的要求,但我還沒有到這裏寫教程,但它是所有在那裏)

+0

謝謝你的快速和有用的幫助。我想我已經明白了,但如果它變得醜陋,可能會回到這個問題!再次感謝。 – jwddixon

+1

昨天晚上我確實在一個(完全未測試的)MixingWaveProvider32中進行了檢查,所以如果你想要去IWaveProvider路由,你可以看看。 –

+0

@MarkHeath:你有關於使用ISampleProvider和MixingSampleProvider的教程嗎? – user523234