Вопрос
У меня есть очень простое приложение iOS Core Audio со следующей структурой:
Remote I/O Unit Input Bus --> Render Callback --> Remote I/O Unit Output Bus
Функция обратного вызова рендеринга, вызываемая выходной шиной удаленного ввода-вывода, извлекает выборки из входного оборудования, вызывая AudioUnitRender()
на входной шине удаленного ввода-вывода. Затем он обрабатывает/воздействует на эти сэмплы, записывая в предоставленный AudioBufferList*
и возвращаясь, заставляя затронутые сэмплы воспроизводиться через выходное оборудование. Все работает хорошо.
Мой вопрос заключается в том, как я могу узнать или рассчитать точное время, когда:
- Образцы были захвачены входным оборудованием
- Сэмплы фактически воспроизводились на выходном оборудовании.
Обсуждение
Структура AudioTimeStamp
передается в обратный вызов рендеринга с допустимыми значениями mHostTime
, mSampleTime
и mRateScalar
. Мне не ясно, что именно отражает эта отметка времени. В документации указано:
inTimeStamp Отметка времени, связанная с этим вызовом рендеринга аудиоустройства.
Звучит так, как будто это время запуска рендеринга, но как это связано (если вообще связано) со временем, когда входные образцы были захвачены, а выходные образцы будут сильный> рендерится?
Несколько ресурсов в Интернете говорят об использовании mach_absolute_time()
или CACurrentMediaTime()
для расчета текущего времени хоста, однако опять же я не могу установить связь между текущим временем хоста и прошлым или будущим временем хоста.
Следующая цитата из ветки списка рассылки Apple говорит о трех метках времени, включая отдельную метку времени как для входных данных в прошлом, так и для выходных данных в будущем. Это именно то, что я ищу, однако я считаю, что это работает на OS X и использует ввод-вывод AUHAL. Я не могу найти способ получить эти метки времени на iOS.
Итак, способ работы CoreAudio заключается в том, что процесс ввода-вывода срабатывает и дает вам 3 метки времени: (1) метка времени входных данных — если они есть, конечно. Это всегда будет по крайней мере размер буфера в прошлом (2) Это отметка времени на данный момент - когда процесс ввода-вывода был разбужен для запуска (3) Это отметка времени для выходных данных, которые вы предоставите. Это будет всегда некоторое время в будущем - обычно это размер буфера в будущем. (http://lists.apple.com/archives/coreaudio-api/2005/Sep/msg00220.html)
Я подозреваю, что могу упустить что-то очевидное, поэтому, надеюсь, кто-то может пролить свет на это.
Заранее спасибо.