【发布时间】:2012-04-24 13:12:26
【问题描述】:
我正在修改Qt Audio Output example如下:
- 我可以访问第三方的音频混音器 API。
- 从这个混音器读取数据的方法是
void AudioMixer::ReadData(uint8_t *stream, uint32_t len); - 在示例中我更改为输出此数据的函数是
qint64 Generator::readData(char *data, qint64 len)
如果我的理解是正确的,我应该可以通过覆盖Generator::readData方法调用AudioMixer::ReadData方法并将AudioMixer使用的uint8_t*转换为推送模式来操作QIODevice 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;
}
【问题讨论】:
-
uint8_t *a; char *b = (char *)a;
-
真的就这么简单吗?是否因为
char本质上已签名而没有潜在问题? -
只有当您要进行位移操作时,签名(没有更好的词)才应该是相关的。如果右移无符号变量总是用 0 填充,有符号变量根据值用 1 或 0 填充。