iPad鼓式计算机触摸 - >音频延迟

时间:2011-12-28 17:59:23

标签: objective-c ios ipad latency audiotoolbox

我们为iPad制作了一个鼓计算机应用程序,可以播放现场音乐(在舞台上或在您的卧室中)。设置非常基本:按下其中一个按钮,相应的样本将播放。一切都很顺利,但不幸的是,在你放下手指的那一刻和声音的回放之间似乎有一个小的(虽然令人讨厌)延迟。我试图测量延迟量(通过耳朵),它似乎是0.05 - 0.1秒。

使用AudioToolbox框架(扩展音频文件服务,音频单元)实现音频播放。声音从文件流式传输,存储在设备上,以防止不同声音库之间的加载时间。样本采用原始wav格式(线性PCM,16位小尾数有符号整数,2个通道,44100 Hz),据我所知,这应该是处理速度最快的(与mp3压缩的东西相反)。

我已经测量了按下按钮(UIButton触摸事件)和将样本的第一帧传送到调音台之间的时间(通过回放回调)。它非常稳定,在0.02到0.03秒之间。对我而言,这看起来非常快,但可能还不够快。

这可能是问题,还是可能是延迟交付触摸事件?

更新

正如蒂尔所说,我已经重写了样本的加载。它们现在全部预装到内存中,因此磁盘IO不再是问题。最重要的是,我为回声效果做了相当多的memcpy,我已经禁用了它,稍后将使用链接列表解决方案。

虽然这可以减少延迟,但按下按钮>播放仍然在0.005到0.02秒之间(但更常见的是0.02)。这仍然是显而易见的。我想这可能是由于回放回调的缓冲区大小,目前是1024字节。

关于如何做到这一点的任何想法?设置kAudioUnitProperty_MaximumFramesPerSlice似乎不起作用。

2 个答案:

答案 0 :(得分:2)

我通过指定首选硬件I / O缓冲区持续时间解决了延迟问题,如Audio Session Cookbook

中所述
NSTimeInterval preferredBufferDuration = 0.005;
[audioSession setPreferredIOBufferDuration:preferredBufferDuration error:&audioSessionError];

if (audioSessionError != nil) 
{
    NSLog (@"Error setting preferred buffer duration.");
    return;
}

通过将缓冲持续时间设置为0.005,您的应用程序每个周期只需提供256个字节(44Khz)。这(显然)将延迟从0.02减少到0.005,但音频必须以更快的速度产生。

即使从磁盘读取IO,iPad 2也完全能够应对这种速度。不幸的是,第一代iPad不够快(有和没有磁盘IO),所以我希望我能找到一些方法来区分这两者,并为iPad 1提供更多延迟以获得更好的性能。

答案 1 :(得分:1)

您可以使用带有TimeProfiler(Apple Documentation on Instruments)模板的工具来确切了解运行的方法。运行时,请务必取消选中“反转调用树”选项并选中“隐藏系统库”。