c++ - 如何配置音频回调

标签 c++ macos audio profiling stack-trace

我在写音乐播放器。我已经做了很多工作来改善音频回调的性能:

  • 所有解码等当然都在单独的线程中完成。这将填满一些缓冲区。
  • 为了避免任何锁定,我避免了任何互斥并仅基于原子操作对所有相关结构进行了编码。它基本上是一个无锁的FIFO。
  • 我尝试通过在所有分配的内存上使用mlock来避免页面错误。
  • 我通过thread_policy_set(类似于here)将线程设置为实时约束。

  • 有时仍然会发生下溢。我想知道如何调试它,因为我想知道是什么导致了它们。
  • 我正在考虑一种可能的方法,如果它花费的时间超过2毫秒左右,则可以跟踪音频回调的当前执行。但是我该怎么办呢?
  • 另外,也许它仍然读取一些内存,这会导致页面错误。我该如何调试呢?
  • 回调中的所有代码仍然有些复杂。也许太复杂了。我可以通过引入另一个间接方法来解决此问题,并仅使用简单的环形缓冲区使代码真正最少。那会带来更多的延迟,我不确定这是否真的是问题所在。
  • 最佳答案

    我要尝试的是,如果我要在不到2ms的时间内完成一个过程,则在进入该过程时将设置一个2ms的闹钟中断,并在退出该过程时将其清除。
    即使加类很少发生,也一定可以解决。

    因此,当发生中断时,我可以在调试器中捕获它并检查堆栈。
    这是否会花费额外的时间进行操作?
    也许(也许不是),但多次这样做必定会揭示出一些有趣的东西。

    我要做的另一件事就是简单地在回调本身中寻找加速。
    为此,我会在它运行时手动将其随机多次暂停,并每次检查堆栈。
    我只会忽略回调不在堆栈上的所有示例。
    对于其余示例,回调位于堆栈中,它将在回调的状态序列中处于随机位置,因此,如果有任何事情正在做,其优化将节省大量时间,那么我将看到它在做它。

    关于c++ - 如何配置音频回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21376695/

    相关文章:

    Android:链接到预建的静态库

    c++ - 引用/initializer_list 的生命周期

    c++ - 从已编译的 C++ 代码中提取 int 数组

    android:检测声级

    javascript - Web Audio API Analyzer节点无法按预期工作

    java - 播放的音频超过了java中设置的持续时间

    c++ - OpenCV 找到轮廓 : no matching function

    python - 类型错误 : histogram() got an unexpected keyword argument 'new'

    python - 警告 : xcodeproj is not installed or is not configured properly

    CGI 无法在 MAMP 下打印