Как определить задержку между аудиовходом и выходом в Core Audio?

Я только что реализовал обратные вызовы для ввода и вывода. Мое приложение получает и воспроизводит аудио. Могу ли я получить задержку между входом и выходом? Я не знаю как, потому что в структуре AudioBufferList нет идентификатора. Адрес памяти одинаков для каждого буфера. Спасибо за ответ!

static void inputCallback(id receiver,
                      AEAudioController  *audioController,
                      void  *source,
                      const AudioTimeStamp *time,
                      UInt32 frames,
                      AudioBufferList *audio) {
AEPlaythroughChannel *THIS = receiver;
.
.
.
}

и вывод

static OSStatus renderCallback(id channel,
                           AEAudioController *audioController,
                           const AudioTimeStamp *time,
                           UInt32 frames,
                           AudioBufferList *audio) {
.
.
.
}

2 ответа

Решение

Вы можете установить предпочтительную задержку

Float32 aBufferLength = 0.005; // In seconds
OSStatus err = AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(aBufferLength), &aBufferLength);

if (noErr != err) {
    NSLog(@"Cannot set preferred audio buffer duration");
}

Который будет пытаться установить размер буфера, который соответствует размеру в секундах. Задержка будет примерно равна этому размеру.

Вы хотели бы получить фактическую продолжительность буфера. Когда вы устанавливаете длительность буфера, это только рекомендация для вашего предпочтительного значения. Аудиосистема обычно выбирает что-то близкое к установленному вами значению. Причина, по которой он не всегда слушает, заключается в том, что значения, которые он выбирает, обычно основаны на степенях 2 и вашей частоте дискретизации. То есть, если вы установите 0,005, это не значит, что на самом деле будет использоваться 0,005. Запросите фактическое значение, используемое после установки предпочтительного значения.

// set your preferred duration
Float32 aBufferLength = 0.005; // In seconds
OSStatus err = AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(aBufferLength), &aBufferLength);


// now get the actual duration used
UInt32 size;
Float32 bufferDuration;
size = sizeof(bufferDuration);
err = AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration,&size, &bufferDuration);
NSLog(@"The actual buffer duration used is %f",bufferDuration);
Другие вопросы по тегам