2017-10-10 31 views
1

我試圖爲實時音頻應用程序實現雙緩衝區,而QAudioInput要求它是QIODevice的子類。我發現這個方法的文檔很混亂。實現QIODevice :: writeData,令人困惑的文檔

首先,文檔中的方法簽名與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

更改參數的名稱對函數的簽名沒有影響。或者是虛擬的打擾你? – user463035818

+1

不錯的發現! :] [QDataStream]的當前實現(http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/io/qdatastream.cpp)似乎不使用'writeData'。 – bezet

+0

這是參數名稱的含義擾亂了我。對我來說,maxSize意味着我不需要寫出所有的數據,而len沒有任何含義。結合我想要澄清的混淆文檔。 –

回答

0

他們基本上想說的是:通過的datamaxSize字節長。您的實現應寫入所有數據並返回寫入的字節數。

可以寫出更少的數據然後可用,但不應該。如果你這樣做,一些使用你的設備的類可能不會對此做出反應(如QDataStream)。這取決於QAudioInput如何處理寫入呼叫。如果它檢查結果並寫入丟失的數據(如果沒有完整寫入),則不寫入所有數據都沒有問題。如果不是這種情況,則必須始終寫入所有數據。

只需試一試:總是隻寫1個字節(並返回1)。如果有效,那麼很好,如果不是,則必須始終寫入所有傳遞的數據,否則將失敗,返回-1。