2012-04-24 125 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