Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c iPad drumcomputer touch->;音频延迟_Objective C_Ios_Ipad_Latency_Audiotoolbox - Fatal编程技术网

Objective c iPad drumcomputer touch->;音频延迟

Objective c iPad drumcomputer touch->;音频延迟,objective-c,ios,ipad,latency,audiotoolbox,Objective C,Ios,Ipad,Latency,Audiotoolbox,我们已经为iPad构建了一个drumcomputer应用程序,可以在舞台上或卧室里播放现场音乐。设置非常基本:您按下其中一个按钮,相应的示例将播放。一切都很顺利,但不幸的是,从你放下手指到播放声音之间似乎有一个很小的(尽管很烦人)延迟。我试着(通过耳朵)测量延迟量,它似乎是0.05-0.1秒 使用AudioToolbox框架(扩展音频文件服务、音频单元)实现了音频播放。声音从存储在设备上的文件流式传输,以防止不同声音库之间的加载时间。样本是原始wav格式(线性PCM,16位小端有符号整数,2个通

我们已经为iPad构建了一个drumcomputer应用程序,可以在舞台上或卧室里播放现场音乐。设置非常基本:您按下其中一个按钮,相应的示例将播放。一切都很顺利,但不幸的是,从你放下手指到播放声音之间似乎有一个很小的(尽管很烦人)延迟。我试着(通过耳朵)测量延迟量,它似乎是0.05-0.1秒

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

我已经测量了从按下按钮(UIButton touch事件)到将样本的第一帧传送到混音器(通过回放回调)之间的时间。它非常稳定,在0.02到0.03秒之间。对我来说这似乎很快,但可能还不够快

这可能是问题所在,还是其他原因,比如触摸事件的延迟交付

更新:

根据Till的建议,我已经重写了样品的装载。它们现在都预加载到内存中,因此磁盘IO不再是一个问题。除此之外,我还为回声效果做了很多memcpy,我已经禁用了它,稍后将使用链表解决方案修复它

虽然这减少了延迟,但按键->播放仍然测量在0.005到0.02秒之间(但更常见的情况是0.02秒)。这仍然是显而易见的。我想这可能是因为回放回调的缓冲区大小,目前是1024字节


有什么办法吗?设置kAudioUnitProperty\u MaximumFramesPerSlice似乎不起作用。

您可以将工具与TimeProfiler()模板一起使用,以准确了解要运行多少方法。运行时,请确保取消选中“反转调用树”选项并选中“隐藏系统库”

您可以使用带有TimeProfiler()模板的工具来准确地了解运行什么方法需要花费很多时间。运行时,请确保取消选中“反转调用树”选项并选中“隐藏系统库”

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

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


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

我通过指定首选硬件I/O缓冲区持续时间来解决延迟问题,如中所述

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


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

我想流式文件是问题所在。在使用当前移动设备的文件系统时,千万不要低估速度(或缺乏速度)。尝试直接从内存中预加载和播放。我猜流文件就是问题所在。在使用当前移动设备的文件系统时,千万不要低估速度(或缺乏速度)。试着直接从内存中预加载和播放。我没有意识到乐器内置了这个功能。这肯定会帮我解决问题,谢谢!我没有意识到仪器内置了这个功能。这肯定会帮我解决问题,谢谢!
NSTimeInterval preferredBufferDuration = 0.005;
[audioSession setPreferredIOBufferDuration:preferredBufferDuration error:&audioSessionError];

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