我正在嘗試將NAudio與Reactive Extentions相結合,並且我正在收聽NAudio播放音頻的問題。NAudio沒有播放,但WaveProvider32讀取正在被呼叫
以下是到目前爲止我的代碼:
public class WaveOutPlayer : IDisposable
{
WaveOut wavOut = new WaveOut(WaveCallbackInfo.FunctionCallback());
public WaveOutPlayer(int device, int sampleRate, int channels, IStereoSource source)
{
var provider = new WavProv(source, sampleRate, channels);
provider.SetWaveFormat(sampleRate,channels);
wavOut.Init(provider);
}
private class WavProv : WaveProvider32
{
AutoResetEvent are = new AutoResetEvent(false);
ConcurrentQueue<float> queue = new ConcurrentQueue<float>();
public WavProv(IStereoSource source, int sampleRate, int channels)
{
source.ChannelLeft
.Zip(source.ChannelRight, (ls, rs) => new double[] { ls, rs }) //one sample from each channel
.SelectMany(samps => samps) //convert to samples array l,r,l,r,l
.Buffer(sampleRate * channels * 1) //buffer samplerate*channels*2 seconds
.Select(x => x.ToArray()) // to observable of chunks
.Do(x => { are.Set(); })
.SubscribeOn(NewThreadScheduler.Default)
.Subscribe(data =>
{
//queue.Enqueue((float)data);
data.ToList().ForEach((x) => queue.Enqueue((float)x));
});
}
public override int Read(float[] buffer, int offset, int sampleCount)
{
int itemsRead;
if (!queue.Any()) //No data in the queue
{
//are.WaitOne();
buffer = Enumerable.Repeat(0.0f, sampleCount).ToArray(); //Wait for some data
itemsRead = sampleCount;
}
else
{
//number of items to read is lower of samplecount or items in queue
int itemsToRead = (queue.Count() > sampleCount) ? sampleCount : queue.Count();
for (itemsRead = 0; itemsRead < itemsToRead; itemsRead++)
{
float res;
if(queue.TryDequeue(out res))
buffer[itemsRead + offset] = res; //add items from queue to buffer
}
}
Console.WriteLine("Requested:{0}, Read: {1}",sampleCount, itemsRead);
return itemsRead;
}
}
public void Play()
{
wavOut.Play();
}
public void Dispose()
{
wavOut.Dispose();
}
}
Read方法被調用,並Console.WriteLine命令是顯示我總是提供足夠的數據。可以肯定的是,如果我減慢信號的產生,這樣我需要偶爾提供一個全零緩衝區,(代碼目前不存在),然後我得到一個'點擊'的聲音。
是否有其他問題/遺漏我已經錯過了?
例如幅度範圍僅在0-1之間,還是支持全範圍的浮動?
感謝
GregC,同意代碼確實有問題,但是我更感興趣的是在當時獲得任何聲音,而不是獲得乾淨的聲音!請參閱更新的代碼。 – stevenrcfox 2012-07-11 15:09:48