我正在尝试为实时音频应用程序实现双缓冲区,QAudioInput
要求它成为QIODevice
的子类。我发现这个方法的文档很混乱。
首先,文档中的方法签名与QT 5.9.2的标题不匹配,后者具有virtual qint64 writeData(const char *data, qint64 len) = 0;
。
文档虽然有这个签名:qint64 QIODevice::writeData(const char *data, qint64 maxSize)
maxSize
参数让我感到困惑,因为它意味着我只能缓冲一些数据,文档中也暗示了这些数据:
从数据写入最多
maxSize
个字节到设备。返回写入的字节数,如果发生错误,则返回-1
。
然而,紧接着文件说明了这一点,这似乎与我相矛盾:
重新实现此功能时,此函数在返回之前写入所有可用数据非常重要。这是
QDataStream
能够在课堂上操作所必需的。QDataStream
假设所有信息都已写入,因此如果出现问题则不会重试写入。
我的QIODevice
实现是否负责在一次通话中缓冲所有数据?
答案 0 :(得分:0)
他们基本上想说的是:传递的data
长度为maxSize
个字节。您的实现应该写入所有数据并返回写入的字节数。
可以写出更少的数据然后可用,但你不应该。如果这样做,某些使用您设备的类可能不会对此做出反应(如QDataStream)。这取决于QAudioInput
处理写入调用的方式。如果它检查结果并且如果没有完全写入则再次写入丢失的数据,则不能写入所有数据。如果不是这种情况,则必须始终写入所有数据。
只需尝试一下:始终只写1个字节(并返回1)。如果它有效,那很好,如果不是,你必须总是写所有传递的数据,或者以-1失败。