Технические вопросы и ответы QA1317

Сигнализация конца данных при использовании AudioConverterFillComplexBuffer

Q: При использовании AudioConverterFillComplexBuffer для преобразования данных, что я должен сделать, когда я исчерпываю данные?

A: Когда Вы исчерпаете данные, будет три случая:

  1. Конец потока - В Вашей входной процедуре, необходимо установить общую сумму пакетного чтения и размеры данных в AudioBufferList для обнуления. Входная процедура должна также возвратить noErr. Это будет сигнализировать AudioConverter, что Вы вне данных. Более в частности, набор ioNumberDataPackets и ioBufferList->mDataByteSize обнулить в Вашем вводе proc и возвратить noErr. Где ioNumberDataPackets преобразованный объем данных и ioBufferList->mDataByteSize размер объема данных, преобразованного в каждом AudioBuffer в Вашем входном обратном вызове процедуры. Вашу входную процедуру можно вызвать еще несколько раз; необходимо просто продолжить возвращать нуль и noErr.

  2. Некоторые доступные данные от входного потока, но недостаточно удовлетворить входной запрос - Если данные передавались потоком в режиме реального времени, могут быть ситуацией, где существует недостаточно данных, которые будут обработаны, который встречает объем данных, который требуют в Вашем обратном вызове. В этом случае необходимо возвратить noErr и сумму пакетов, обработанных от входного обратного вызова. Ваш входной обратный вызов вызовут снова для остающихся пакетов.

  3. Никакие в настоящее время доступные данные - Если нет никаких данных, в настоящее время доступных от входного потока, но данных, не остаются быть преобразованными, установленными ioNumberDataPackets обнулить и возвратить ошибку (любое ненулевое значение). Ошибка будет распространена назад к вызывающей стороне. Если какие-либо данные были преобразованы, который будет также возвращен к вызывающей стороне.

Вы никогда не должны также пытаться предположить точно сколько данных, чтобы запросить от Вашего обратного вызова преобразовать весь буфер данных в одном вызове. Кодекам позволяют сохранить любой объем данных буферизованным внутренне; поэтому, необходимо запросить меньшие объемы данных. Издержки запроса преобразования являются маленькими по сравнению с самим преобразованием. Запрос очень больших буферов также плох для кэша. Это заставляет каждый внутренний буфер должным быть быть большим, или должным быть разделяться на меньшие блоки.

См. AudioConverter.h в AudioToolbox.framework для большего количества подробных данных относительно использования AudioConverter.



История версии документа


ДатаПримечания
21.07.2011

Передовая статья

26.04.2004

Неуказанные версии содержания.

23.10.2003

Новый документ это, как сигнализировать конец данных при использовании AudioConverterFillComplexBuffer для преобразования аудиоданных.