Я работаю над приложением в Android
с чисто C/C++
и приложение должно непрерывно записывать звук и обрабатывать данные синхронно, поэтому мне интересно, когда я использую буферную очередь в openSL для записи звука, могу ли я освободить те, которые заполнены, и ввести очереди очередных пустых в буферную очередь?
Я рассмотрел решение по очистке всей очереди буферов, когда все буферы заполнены и перезапущены очереди с помощью обратного вызова, но я боюсь, что этот процесс может занять некоторое время, и я потеряю данные во время время.
Я не знаю, каков ваш вопрос. Буферную очередь следует рассматривать как круговую/кольцевую очередь, то есть: вы записываете содержимое нового буфера в следующий буфер (таким образом, "свободный"), когда текущий буфер заканчивается, буфер очереди становится текущим, а ранее текущий буфер - новый установленный буфер, в основном заменяющий их статус. Вы не должны беспокоиться об этом при записи и обработке звука, но сосредоточьтесь на одном, временном буфере, в который вы записываете и записываете это содержимое в буфер очереди. Затем кольцевой буфер для вывода может продолжать делать это, а при следующем обратном вызове (т.е. Когда буферы в очереди обмениваются) вы очищаете содержимое временного буфера и заполняете его всем волшебством, которое вы хотели бы сохранить. В основном это сводится к тому, что вся ваша запись и рендеринг будут выполняться после каждого обратного вызова, и у вас есть очередь как для вывода, так и для ввода, что позволит избежать потери данных.