У меня есть умный динамик и компьютер. Они устанавливают соединение TCP. Интеллектуальное громкоговоритель ведет запись и передает аудиоданные на ПК в режиме реального времени. Теперь я хочу, чтобы ПК сохранял полученные аудиоданные в буфере. В то же время звук в буфере воспроизводится.
Теперь вы, возможно, уже знаете поток данных на стороне ПК.
3 объекта, принимать аудиопоток A, передаваемый со стороны устройства buffer буфер хранения звука B play область воспроизведения звука C.
А должен продолжать записывать данные в Б,
C необходимо постоянно читать данные в B,
Мой вопрос сейчас такой: какую структуру данных я использую для этого буфера (то есть B)?
Я изначально хотел использовать c # queue.look текущий код.
(https://codereview.stackexchange.com/questions/33142/producer-consumer-in-c)
Тем не менее, я немного волнуюсь. Поскольку объем аудиоданных относительно велик, количество байтов на запись B и чтение B велико. Это около 4 КБ, _myQueue.Dequeue
или _myQueue.Enqueue
может входить и выходить из элемента только по одному байту за раз. Чтобы завершить чтение и запись 4 КБ, вам нужно часто вызывать 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;
}