我正在修改Qt Audio Output example,如下所示:
void AudioMixer::ReadData(uint8_t *stream, uint32_t len);
qint64 Generator::readData(char *data, qint64 len)
如果我的理解是正确的,我应该能够通过覆盖QIODevice
方法以推送方式操作Generator::readData
以调用AudioMixer::ReadData
方法并投射uint8_t*
} AudioMixer
用于char*
用于QIODevice
。
我认为这在某种程度上是可能的吗?如果是这样,有人可以建议如何进行演员表演吗?如果没有,您是否可以提供有关如何使用uint8_t*
输出QIODevice
的说明?
为了完整起见,方法是:
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 :(得分:6)
在C ++中没有表示“byte”的本机类型,只保证char
只能保存一个字节。对于表示原始二进制数据的字节类型是否应该签名,有不同的意见,因此有些使用unsigned char
(uint8_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
,但其他人不喜欢它,那没关系。