Oboe Systrace - неполные буферы считаются опустошением или нет?

Я использую библиотеку oboe для создания музыкального приложения. Там я создаю музыку, записывая значения с плавающей запятой PCM в заданный указатель. У меня редко бывают просадки, которые я слышу. Я также проверяю это с помощью следующих API-интерфейсов гобоя:

managedStream->getXRunCount();

Документы говорят следующее:

 * An XRun is an Underrun or an Overrun.
 * During playing, an underrun will occur if the stream is not written in time
 * and the system runs out of valid data.
 * An underrun or overrun can cause an audible "pop" or "glitch".

Я пытаюсь отладить проблему. Я нашел это замечательное руководство от Дона. Я записал 10 секунд systrace со следующим: обратите внимание, что в течение этих 10 секунд я слышал 0 слышимых звуков хлопков/щелчков:

systrace.py --time=10 -o trace.html -a com.example.app частота планирования аудио

Результат при вызове aaRdy выглядит следующим образом (высота синего прямоугольника показывает, сколько семплов находится в буфере, чем больше высота, тем сэмпл требуется): введите здесь описание изображения Это лишь малая часть ааРдый звонок. Никогда не бывает так, чтобы в моем буфере было 0 сэмплов. Я все это проверил. В статье, написанной Доном, он говорит следующее:

Но потом буфер начинает пустеть, сначала падает до 96 кадров, потом… о боже… до нуля! При нуле у нас гарантированно будет сбой звука, потому что в буфере нет данных.

Вот скриншот из статьи: введите здесь описание изображения

Мой вопрос, глядя на статью, я могу гарантировать, что если синяя коробка пуста, значит, есть опустошение. Тем не менее, в моей системной трассе она никогда не бывает пустой, и я не слышал никаких кликов о недоставке, НО managedStream->getXRunCount();call фактически вернул 12. Я не уверен, есть ли недоработка или нет.

Означает ли уменьшение в синих прямоугольниках, что имеет место опустошение, даже если оно не равно 0?


person cs guy    schedule 08.04.2021    source источник
comment
Я ничего не знаю об обработке звука, но вы можете увидеть, как значение счетчика aaRdy systrace измеряется в исходном коде Android: cs.android.com/android/platform/superproject/+/. По сути, это количество полных кадров в очереди буфера данных. Когда он равен 0, это, вероятно, означает, что буфер заполнен.   -  person Yi Yang    schedule 15.04.2021
comment
Я думаю, вы хотели сказать: «когда он равен 0, буфер пуст».   -  person cs guy    schedule 15.04.2021
comment
Это количество доступных полных кадров (mAudioEndpoint->getFullFramesAvailable()), то есть буферных кадров, доступных для записи. Когда он равен 0, буфер полностью занят и что-то нужно удалить.   -  person Yi Yang    schedule 16.04.2021


Ответы (2)


Дон сюда :)

что значит иметь не полный буфер в трассировке.

Это означает, что в данный момент звуковое оборудование считывает (и удаляет) данные из буфера быстрее, чем ваше приложение записывает их.

Это довольно нормальная ситуация, если ваше приложение использует значительные ресурсы ЦП для генерации аудиоданных. Возможно, какой-то другой процесс в системе имел приоритет над аудиопотоком, и ваше приложение не могло достаточно быстро генерировать необходимое количество аудиокадров.

Это становится проблемой только в том случае, если ситуация медленной записи длится достаточно долго для полного опустошения буфера, а аудиоустройство читает из буфера, пока он пуст. В этом случае вы получите недоработку, и счетчик XRuns будет увеличен.

Как вы правильно заметили, счетчик XRuns будет регистрировать количество недозагрузок (или переполнений для записываемого потока) за все время существования потока.

person donturner    schedule 04.06.2021
comment
Спасибо за объяснение. Кстати, я очень ценю гобой. Это фантастика и делает работу с низкоуровневым звуком намного проще, чем плохо документированные низкоуровневые аудиофреймворки IOS. Гобой очень хорошо задокументирован, и до сих пор было очень весело использовать гобой. Продолжайте в том же духе:) - person cs guy; 04.06.2021
comment
???? Спасибо за добрые слова, очень приятно, что вы находите это полезным. - person donturner; 04.06.2021

Я нырнул глубоко и обнаружил, что

managedStream->getXRunCount();

Возвращает количество XRuns для потоков за все время существования. Я думал, что он вернет значение относительно предыдущего вызова. Таким образом, очевидно, я получил 12, но не было недогрузки, потому что это было из сеанса, в котором предыдущая недоработка была.

Тем не менее, я хотел бы увидеть объяснение того, что означает наличие неполного буфера в трассировке.

person cs guy    schedule 14.04.2021