我使用配置为输入和输出的简单输出音频单元使用核心音频(OS X,10.11.4 Beta,较旧的mac mini)进行播放(尽管我的所有问题似乎都与输出有关)。这是来自套接字/互联网的流音频源,馈入升级无锁队列,然后将其馈送到输出AU。我得到的音频丢失似乎是因为AU渲染回调没有间歇性地被核心音频调用。 这是一个graph。在此部分之前,有大约10秒的完美音频。
黑色:样本音频,简单的正弦波
蓝色:渲染回调的挂钟持续时间(OutputProc)以ms为单位,上图中的点是~120ms
橙色:samples / 1000中无锁队列(playback_buf)的大小,以便很好地适应图形
x轴:以毫秒为单位的时间
所有内容都记录在OutputProc中,因此如果没有调用,则不会记录任何内容,但图形工具会在这些时段之间连接点。缓冲区中总是有足够的样本。似乎从~22475ms到~22780ms,OutputProc仅在22640被调用一次。它在该特定实例上确实具有长的挂钟时间,但似乎是由于先发制人。后来在22800到23000范围内仍然存在丢失但是OutputProc不会比正常情况持续更长时间并且当然不会超出实时窗口(这里约为6ms ......硬件采样率为96kHz)。所以,我认为这是其他一些先发制人的线索。我希望核心音频线程具有非常高的prio。我确实有一些提升asio套接字输入/输出并行(例如boost :: asio :: io_service io_service),但我希望它始终失去核心音频的优先级。如果您有任何指向实际问题的指示...这总是受欢迎的...但是,如果我能找到在感兴趣的时间段内正在执行的线程,我可以取得进展吗? Xcode中有什么能告诉我调度程序历史记录或线程历史记录,可能是每个CPU核心吗? OutputProc如果有帮助:
Uri imageUri = Uri.parse(path);
Intent imageEditorIntent = new AdobeImageIntent.Builder(this)
.setData(imageUri)
.build();
startActivityForResult(imageEditorIntent, 1);
答案 0 :(得分:1)
您的日志记录机制可能会干扰实时线程。任何,任何可以锁定或管理内存(如字符串创建或stdout文件IO)的调用都可能导致音频单元回调中的丢失和其他故障。
如果是这种情况,您可以尝试在无锁循环日志FIFO中填充时间戳,并在另一个线程中执行任何文件IO。