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*AudioMixerchar*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;
}
4

1 に答える 1

8

C ++で「バイト」を表すネイティブ型はなく、char正確に1バイトを保持することが保証されているだけです。生のバイナリデータを表すバイト型に署名するかどうかはさまざまな意見があるため、unsigned charuint8_t)を使用するものとプレーンを使用するものがありcharます。結局、バイナリデータに対して算術演算を実行するのではなく、それを読み取って解釈するだけなので、実際には問題ではありません。

したがって、型キャストを使用して、異なるバイナリデータ表現間で変換することができます。reinterpret_castこれはC++であるため、(Cスタイルのキャストを優先して)使用する必要があります。

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

キャストを使用するreinterpret_castかCスタイルのキャストを使用するかは明らかに論争の的です。C++の作成者であるBjarneStroustrupは確かに支持しreinterpret_castますが、他の人はそれを気に入らないので、それで問題ありません。

于 2012-04-24T16:07:43.543 に答える