我正在修改 Qt音频输出示例 如下。
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;
}
在C++中没有原生类型来表示 "字节",只有 char
的,保证正好可以容纳一个字节。 用来表示原始二进制数据的字节类型是否应该有签名有不同的意见,所以有的人用 unsigned char
(uint8_t
),其他则使用普通的 char
. 最后,这其实并不重要,因为你通常不会对二进制数据进行算术运算,而只是读取和解释它。
因此,你可以使用类型转换来转换不同的二进制数据表示。 由于这是C++,你应该使用 reinterpret_cast
(有利于C型铸型)。
char* dst = reinterpret_cast<char*>(/* your uint8_t* expression */);
是否使用 reinterpret_cast
或C-风格的casts显然是有争议的。 Bjarne Stroustrup,C++的创造者,会在他看来 当然主张 reinterpret_cast
但别人不喜欢,也没关系。