1

我正在修改Qt 音频输出示例,如下所示:

  • 我可以从第三方访问混音器 API。
  • 从这个混音器读取数据的方法是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*使用 a输出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;
}
4

1 回答 1

8

在 C++ 中没有表示“字节”的本机类型,只能char保证恰好保存一个字节。表示原始二进制数据的字节类型是否应该签名存在不同的意见,因此有些使用unsigned char( uint8_t) ,有些使用 plain char。最后,这并不重要,因为您通常不对二进制数据执行算术运算,而只是读取和解释它。

因此,您可以只使用类型转换在不同的二进制数据表示之间进行转换。由于这是 C++,您应该使用reinterpret_cast(支持 C 风格的强制转换):

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

是否使用reinterpret_cast或 C 风格的演员表显然是有争议的。C++ 的创造者 Bjarne Stroustrup肯定会提倡 .reinterpret_cast,但其他人不喜欢它,这没关系。

于 2012-04-24T16:07:43.543 回答