1
我試圖發揮使用的portaudio C庫中的portaudiosharp綁定C#波形文件時遇到了問題設想用正確的方法去這樣做。我將粘貼我目前使用的代碼。它有點作用,但我認爲這不是正確的做事方式。使用回調來播放帶有端口音頻的音頻文件?
這是我的回調函數:
public PortAudio.PaStreamCallbackResult myPaStreamCallback(
IntPtr input,
IntPtr output,
uint frameCount,
ref PortAudio.PaStreamCallbackTimeInfo timeInfo,
PortAudio.PaStreamCallbackFlags statusFlags,
IntPtr userData)
{
short[] mybuffer = (short[])myQ.Dequeue();
Marshal.Copy(mybuffer, 0, output, (int)frameCount * 2);
return PortAudio.PaStreamCallbackResult.paContinue;
}
然後,我有一個「主循環」:
PortAudio.Pa_Initialize();
IntPtr stream;
IntPtr userdata = IntPtr.Zero;
PortAudio.Pa_OpenDefaultStream(out stream, 1, 2, 8,
48000, NUM_SAMPLES/2, new PortAudio.PaStreamCallbackDelegate(myPaStreamCallback), userdata);
PortAudio.Pa_StartStream(stream);
while (readerPosition < reader.Length)
{
short[] qBuffer = new short[NUM_SAMPLES];
read = reader.Read(buffer, 0, NUM_SAMPLES * 2); //read a block out from my wave file
Buffer.BlockCopy(buffer, 0, qBuffer, 0, read); //copy them to the short buffer
myQ.Enqueue(qBuffer);
readerPosition += read;
}
while(PortAudio.Pa_IsStreamActive(stream) == 0)
{
//this while loop never gets entered -- why??
Console.WriteLine("waiting");
}
System.Threading.Thread.Sleep(5000); //need this so that the callback function fires
PortAudio.Pa_StopStream(stream);
我試圖實現一個FIFO緩衝區,但我想我可能已經做到了以一種愚蠢的方式,基本上發生了什麼是隊列被填滿,直到沒有更多的樣本留在那裏,只有PA回調開始發射。
什麼是這樣做的更好的辦法?如何讓我的主循環良率,使回調函數可以啓動,而不必睡覺?
我正在使用NAudio wavreader從波形文件中讀取數據,但我不認爲這很重要。如果是,我可以發佈更多細節。