2016-12-16 4 views
1

Мое приложение (только для MacOS) использует низкоуровневые функции CoreAudio (AudioDevice-low, а не AudioUnit).Mac Core Audio выходной буфер, воспроизводимый после возвращения AudioDeviceIOProc?

Мой вопрос: является ли выходной буфер разыгранным сразу после моего возвращения AudioDeviceIOProc или требуется дополнительный цикл?

Позвольте мне объяснить, откуда этот вопрос возникает из примера. Рассмотрим приложение мониторинга ввода, которое выполняет некоторую обработку на входе и воспроизводит его прямо сейчас, для простоты использования одного и того же устройства для ввода и вывода.

Я установил размер буфера на 480 кадров (10 мс на 48 кГц) до AudioObjectSetPropertyData, обращаясь к объекту kAudioDevicePropertyBufferFrameSize. Когда вызывается мой AudioDeviceIOProc, у меня есть 10 мс входных данных, которые я обрабатываю, а затем записываю в выходной буфер до того, как вернется мой AudioDeviceIOProc.

На данный момент мне нужно понять (раз и навсегда), какой из двух следующих случаев является правильным:

  • A) больше 10 миллисекунд необходимо пройти перед выходным буфером, который я только что установил может быть воспроизведен
  • B) буфер воспроизводится сразу после возврата обратного вызова. Это не представляется возможным, поскольку для этого требуется, чтобы обратный вызов принимал точно одновременно в каждом цикле. На самом деле, если мы рассмотрим в качестве примера, что второй раз, когда ioproc называется обработкой, занимает 20 микросекунд больше, чем в предыдущем цикле, это приведет к зазору почти 1 образца (0.02 * 48000/1000 samples = 0.96 samples).

Я всегда считал, A), чтобы быть правильным ответом, который будет соответствовать с эмпирическим правилом для расчета мониторинга следующего задержки в 2*I/O buffersize (например, как описано здесь https://support.apple.com/en-om/HT201530), но в последнее время я читал discording информации о Это. Может ли кто-нибудь прояснить это для меня? Спасибо

ответ

3

Когда coreaudiod называет ваш IO Proc, он заполняет внутренний буфер для вывода на аудиоустройство. Выход не будет происходить сразу же после того, как Core Audio потребуется время для обработки ваших данных и потенциально смешивать его с потоками из других приложений. Фактически есть даже свойство, которое позволяет вам контролировать, сколько времени в цикле ввода-вывода вам нужно, чтобы подготовить ваши образцы, kAudioDevicePropertyIOCycleUsage.

После того, как Core Audio имеет ваши данные, он не может сразу отправить его на устройство для воспроизведения. Оба объекта AudioDevice и AudioStream имеют настраиваемую задержку. Для AudioStream вы можете прочитать на kAudioStreamPropertyLatency.

С учетом этой сложности AudioDeviceIOProc дает вам параметр, определяющий, когда образцы будут записаны на устройство. Посмотрите второй на последний параметр, const AudioTimeStamp* inOutputTime.

 Смежные вопросы

  • Нет связанных вопросов^_^