Qt - 如何设置音频播放从缓冲区的开头开始?

时间:2012-05-07 17:40:29

标签: c++ qt audio

我有一个大小为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);
    }
}

2 个答案:

答案 0 :(得分:1)

void stateChanged ( QAudio::State state )<〜播放器更改时的信号。挂钩到班级中的一个插槽,只需在状态停止时重复播放过程。简单。我喜欢Qt的原因之一。

答案 1 :(得分:0)

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

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