1

我正在尝试为实时音频应用程序实现双缓冲区,并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实现是否负责在一次调用中缓冲所有数据?

4

1 回答 1

0

他们基本上想说的是:传递data的是maxSize字节长。您的实现应该写入所有数据并返回写入的字节数。

可以写入比可用数据更少的数据,但您不应该这样做。如果你这样做了,一些使用你的设备的类可能不会对此做出反应(比如 QDataStream)。这取决于如何QAudioInput处理 write 调用。如果它检查结果并在未完全写入的情况下再次写入丢失的数据,则不写入所有数据是可以的。如果不是这样,您必须始终写入所有数据。

简单地尝试一下:总是只写 1 个字节(并返回 1)。如果它有效,那很好,如果不是,您必须始终写入所有传递的数据,或者以-1 失败。

于 2017-10-11T13:03:12.367 回答