1

たとえば4096のサイズのバッファがあり、そこにデータを格納します。バッファがいっぱいの場合、バッファの先頭から開始されます。これはうまくいくようです。

しかし、バッファからのデータの再生に問題があります。

QByteArray          m_buffer;
QBuffer             m_audioOutputIODevice;
QAudioOutput*       m_audioOutput;
m_audioOutputIODevice.close();
m_audioOutputIODevice.setBuffer(&m_buffer);
m_audioOutputIODevice.open(QIODevice::ReadOnly);
m_audioOutput->start(&m_audioOutputIODevice);

これでバッファからサウンドを再生できますが、バッファの終わりに達すると再生が停止します。コードを変更して、バッファーの終わりに達したときにすべて最初から開始するようにするにはどうすればよいですか?どうもありがとうございます

更新コード:

connect(m_audioOutput,SIGNAL(stateChanged(QAudio::State)),SLOT(resetPlayBuffer(QAudio::State)));

    void bufferPlayback::resetPlayBuffer (QAudio::State state)
{
    if (state == QAudio::IdleState) {
        m_audioOutputIODevice.close();
        m_audioOutputIODevice.setBuffer(&m_buffer);
        m_audioOutputIODevice.open(QIODevice::ReadOnly);
    }
}
4

2 に答える 2

1

void stateChanged ( QAudio::State state )<~ プレイヤーが変わったときの合図。クラスのスロットにフックし、状態が停止したときに再生プロセスを繰り返すだけです。単純。私が Qt を愛する理由の 1 つです。

于 2012-05-07T19:59:44.073 に答える
0

AFAICT QAudioOutputにはオーディオループのサポートが組み込まれていないため、再生するオーディオバイトが不足しないように、QAudioOutputデバイスに新しいオーディオバッファーを定期的に送信してオーディオループをシミュレートする必要があると思います。

そのための最も簡単な方法は、非常に長い(無限?)ファイルのふりをするQIODeviceの独自のサブクラスを作成することですが、クエリを実行するとループするサンプルが何度も返されます。次に、QIODevice-subclass-obectを引数としてQAudioOutput :: start()に渡します。

于 2012-05-07T19:08:58.423 に答える