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 的原因之一。

于 2012-05-07T19:59:44.073 回答
0

AFAICT QAudioOutput 没有对音频循环的任何内置支持,因此我认为您必须通过定期向 QAudioOutput 设备发送新的音频缓冲区来模拟音频循环,以便它永远不会用完音频字节来播放。

我认为最简单的方法是编写你自己的 QIODevice 子类,它伪装成一个非常长(无限?)的文件,但在查询时一遍又一遍地返回你的循环样本。然后将 QIODevice-subclass-obect 作为参数传递给 QAudioOutput::start()。

于 2012-05-07T19:08:58.423 回答