【发布时间】:2015-07-15 21:56:29
【问题描述】:
我在 c#(wpf) 中录制声音,当声卡中的数据可用时,它会调用此事件:
void myWaveIn_DataAvailable(object sender, WaveInEventArgs e)
{
for (int index = 0; index < e.BytesRecorded; index += 2)//Here I convert in a loop the stream into floating number samples
{
short sample = (short)((e.Buffer[index + 1] << 8) |
e.Buffer[index + 0]);
samples32Queue.Enqueue(sample/32768f);
}
//***Do some Processing with data inside Queue
}
如您所见,我将每个样本从记录的缓冲区推送到声明如下的队列:
Queue<float> samples32Queue = new Queue<float>();
正如您在for loop 之后的事件内部看到的那样,我想对队列进行一些处理。我担心在处理数据时,新的样本会来自声卡,我的处理会丢失。
- 正确的方法是什么?
- 我从事件中调用的处理是静态方法/非静态的吗?
【问题讨论】:
-
它是 RT 系统吗?如果没有,您可以缓冲样本并稍后处理它们。如果是,那么您别无选择 - 您必须确保您的处理功能比传入的样本“更快”。
-
你好,我试着让它RT
-
每个样本的处理必须在新样本到达之前结束吗?或者可以建模为生产者-消费者设计?
-
没有。我可以稍后继续处理它
-
在这种情况下,考虑使用 BlockingCollection
而不是 Queue - msdn.microsoft.com/en-us/library/dd997371(v=vs.110).aspx
标签: c# wpf multithreading parallel-processing audio-streaming