Мое приложение (только для 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 информации о Это. Может ли кто-нибудь прояснить это для меня? Спасибо