我正在尝试使用端口音频C库的portaudiosharp绑定使用C#播放wave文件,并且无法设想正确的方法来执行此操作。我将粘贴我正在使用的代码。它有点工作,但我不认为这是正确的做事方式。
这是我的回调函数:
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从wave文件中读取,但我认为这不重要。如果是的话,我可以发布更多关于这方面的细节。
答案 0 :(得分:1)
一些显而易见的事情:
其他说明: