TCP-клиент получает аудиопоток, передаваемый сервером.Какая структура данных используется для временного хранения аудиоданных? - PullRequest
0 голосов
/ 19 июня 2019

У меня есть умный динамик и компьютер. Они устанавливают соединение 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;
}
...