核心音频(Wasapi)缓冲区事件时机
Core Audio (WASAPI) buffer event timing
我正在使用Windows Core Audio函数(主要是Wasapi)来渲染独家流,按照独家模式流中的示例。
这会创建两个交替的缓冲区,并交替填充。有一个与缓冲区完成有关的事件,可以唤醒线程,以便可以重新填充刚刚完成的缓冲区。GetPosition表明,当电流缓冲区位于160帧缓冲区的框架147时,线程唤醒。这给我留下了13/160的缓冲时间,以获取新的缓冲区,填充并释放它。我有很多计算要做,这还不够。我想我可以在填充缓冲区时保持对处理器的控制,而不是睡觉,但这似乎不是正确的解决方案。
此外,即使我的过程是" Pro Audio",优先级为25,有时缓冲区的完成事件仍会延迟,因此系统开始重播未填充的缓冲区。我还没有发现有关该时间应该如何工作的讨论,或者如何控制它。我希望缓冲区完成事件在少数框架内到达下一个缓冲区。有人熟悉这些东西吗?用解决方案或有关在哪里寻找的线索?
您应该有两个线程。在主线程中,您可以进行所有音频处理和计算,并将结果交付给辅助线程。次要线程的作业仅仅是等待Wasapi事件,并将主线程的产品写入声卡。编写音频的线程不应进行音频处理。
看来,您的共享模式设置为共享非独家,在独家模式下,您会在一个缓冲区完成后获得两个相同大小的缓冲区返回相同的尺寸
但是,如果您将共享模式设置为共享,则只给出一个缓冲区,帮助页面iaudioclient :: getDeviceperiod方法解释了这一点。
相关文章:
- C++字符*缓冲区的大小
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- Android NDK传感器向事件队列报告奇怪的间隔
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- 从文本文件中读取时钟时间和事件时间并进行处理
- WMI检测进程创建事件-c++
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 多线程双缓冲区
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- 套接字读取后,我在缓冲区中看到意外输入
- 处理闪烁窗口事件
- C++Builder中的OnClick事件签名存在问题
- C++ / RS232C 串口 / 事件回调异步读取缓冲区 / 不使用线程
- 核心音频(Wasapi)缓冲区事件时机