Core Audio iOS: получение временных меток прошлого и будущего для захваченных и подлежащих рендерингу сэмплов

Вопрос

У меня есть очень простое приложение 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)

Я подозреваю, что могу упустить что-то очевидное, поэтому, надеюсь, кто-то может пролить свет на это.

Заранее спасибо.


person Andy Barnard    schedule 05.11.2013    source источник


Ответы (1)


Если вы пытаетесь учесть фактическое время захвата и фактическое время вывода, возможно, вы могли бы проверить свойства аппаратной задержки в аудиосеансе. Аудиоустройства также имеют свойство задержки. Не уверен, что это даст вам точность, которую вы ищете.

person invalidname    schedule 05.11.2013