Как определить задержку между аудиовходом и выходом в 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);