我对Qt并不十分有经验,但我正在处理媒体,所以请原谅我,如果我的答案不是很具体,而是从一个更普遍的角度来解决你的问题.
我看着你的代码,我一般认为你的想法应该工作.我看到一些问题:
> writeData方法似乎没有准备好处理缓冲区的完整状态.当循环缓冲区填满时,它只会覆盖旧数据,并且不正确地继续增加currentBufferLength变量.我认为这里要做的正确的事情是更新readPosition以跳过丢失的数据,并防止currentBufferLength从缓冲区大小过去.
>你几乎在同一时间开始写作者和读者.相反,您应该启动笔者并填充循环缓冲区,然后启动阅读器.请记住,您将无法记录和播放零延迟.至少您的延迟将是单个缓冲区写入的大小,但实际上您可能需要使用几个缓冲区来避免打嗝.
>您应该分别调试读写器和作者.仅设置写入程序并验证循环缓冲区是否定期进行写入(首先如上所述修复溢出情况).要调试,可以将缓冲区转储到文件中,然后检查音频播放器中的文件(例如,Audacity),也可以使用printf调试来确保您不断获取数据.然后只用一个读者做类似的事情.
>最后的想法调用readData和writeData方法的代码可能运行在其他线程上,可能是两个不同的线程,一个用于读取器,另一个用于写入器.如果我的猜测是正确的,那么你的圆形结构有一个很大的问题.您必须保护访问确定读取和写入位置和大小的变量,如果不是,您将有竞争条件.
祝你好运.