我有一个智能扬声器设备和一台PC。他们建立一个TCP连接。智能扬声器设备会保持记录并实时将音频数据发送到PC。我现在希望PC将接收到的音频数据存储在缓冲区中。同时,播放缓冲区中的音频。 现在,您可能已经知道PC端的数据流。 3个对象,接收从设备端发送的音频流A,音频存储缓冲区B,音频播放区域C。
A需要继续将数据写入B, C需要不断读取B中的数据,
我现在的问题是:我要为该缓冲区(即B)使用哪种数据结构?
我最初想使用c#queue.look流动的代码。
(https://codereview.stackexchange.com/questions/33142/producer-consumer-in-c)
但是,我有点担心。因为音频数据量相对较大,所以每个写入B和读取B的字节数很大。大约4KB,_myQueue.Dequeue
或_myQueue.Enqueue
一次只能进入和退出一个字节。要完成4KB的读写操作,您需要经常调用上述2种方法。我的意思是,有没有一种方法可以批量写入队列中的元素并读取队列中的元素?所以我想问一下是否有更好的设计方法来实现音频存储缓冲区B。
private int _count = 1000;
private Queue<byte> _myQueue = new Queue<byte>();
private static object _door = new object();
public void AddItem(byte someItem)
{
lock (_door)
{
while (_myQueue.Count == _count)
{
Monitor.Wait(_door);
}
_myQueue.Enqueue(someItem);
Monitor.Pulse(_door);
}
}
public byte RemoveItem()
{
byte item;
lock (_door)
{
while (_myQueue.Count == 0)
{
Monitor.Wait(_door);
}
item = _myQueue.Dequeue();
Monitor.Pulse(_door);
}
return item;
}