2012-04-24 66 views
1

我修改Qt Audio Output example如下:轉換uint8_t *爲char *爲使用的QIODevice

  • 我已經從第三方獲得的音頻混音器API。
  • 從該混頻器讀取數據的方法是void AudioMixer::ReadData(uint8_t *stream, uint32_t len);
  • 我改變輸出這些數據的例子是qint64 Generator::readData(char *data, qint64 len)

如果我的理解是正確的,我應該能夠操作功能QIODevice處於推模式,方法是重寫Generator::readData方法來調用AudioMixer::ReadData方法,並將AudioMixer使用的uint8_t*轉換爲char*以與QIODevice一起使用。

我正確地認爲這是可能的嗎?如果是這樣,有人可以建議如何做演員?如果不是的話,你能提供一個關於如何使用QIODevice來輸出uint8_t*的解釋嗎?

爲了完整起見,方法是:

void AudioMixer::ReadData(uint8_t *stream, uint32_t len) 
{ 
    if(buffer.GetMaximumReadSize() < len) 
    { 
     memset(stream, 0, len); 
    } 
    else 
    { 
     buffer.Read(stream, len); 
    } 
} 

qint64 Generator::readData(char *data, qint64 len) 
{ 
    qint64 total = 0; 
    while (len - total > 0) { 
     const qint64 chunk = qMin((m_buffer.size() - m_pos), len - total); 
     memcpy(data + total, m_buffer.constData() + m_pos, chunk); 
     m_pos = (m_pos + chunk) % m_buffer.size(); 
     total += chunk; 

     // Need to call AudioMixer::readData in here 
    } 
    return total; 
} 
+0

uint8_t * a; char * b =(char *)a; – 2012-04-24 13:13:48

+0

真的那麼簡單嗎?是否沒有潛在的問題,因爲'char'本質上是簽名的? – 2012-04-24 13:21:26

+0

簽名(缺少更好的單詞)只應在您要執行移位操作時纔有用。如果向右移動,則無符號變量將始終填充0,帶符號的變量帶有1或0,具體取決於值。 – 2012-04-24 13:25:06

回答

6

沒有天然類型來表示C++中的「字節」,僅char這是保證保持恰好一個字節。對於表示原始二進制數據的字節類型是否應該簽名有不同意見,所以有些人使用unsigned charuint8_t),而其他人使用普通char。最後,它並不重要,因爲通常不會對二進制數據執行算術運算,而只是讀取並解釋它。

因此,您可以使用類型轉換來在不同的二進制數據表示之間進行轉換。由於這是C++,你應該使用reinterpret_cast(支持C-風格轉換):

char* dst = reinterpret_cast<char*>(/* your uint8_t* expression */); 

是否使用reinterpret_cast或C風格的轉換顯然是有爭議的。 C++的創造者Bjarne Stroustrup將certainly advocate reinterpret_cast,但其他人不喜歡它,這沒關係。

+0

停止推送reinterpret_cast是否需要。 reinterp ....是很多打字,在這種情況下,完全等同於一個古老的C劇組。有些情況下它在運行時很重要(即vtable偏移)或幫助類型安全(無意識的buggy類型轉換)。但是,真的,你必須理解它,而不是有一個愚蠢的規則說 - 更多的只是因爲它看起來更像不同C. – 2012-04-24 18:12:25

+1

「應該使用」不,你不應該。你「應該」使用最簡單的正確解決方案。在這種情況下,這是C風格。 – SigTerm 2012-04-24 20:43:04

+3

'reinterpret_cast'是有原因的,許多C++編碼指南清楚地表明,你應該比C風格的演員更喜歡新風格的演員陣容。我不知道你爲什麼在這裏大驚小怪。是的,這很漫長(Bjarne Stroustoup說這是「醜陋的手術醜陋的表示法」),但是來吧,打字沒什麼意義。 – 2012-04-25 07:28:49