我有一个大小为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);
}
}
答案 0 :(得分:1)
void stateChanged ( QAudio::State state )
<〜播放器更改时的信号。挂钩到班级中的一个插槽,只需在状态停止时重复播放过程。简单。我喜欢Qt的原因之一。
答案 1 :(得分:0)
AFAICT QAudioOutput没有任何内置的音频循环支持,因此我认为您必须通过定期向QAudioOutput设备发送新的音频缓冲区来模拟音频循环,以便它永远不会耗尽音频字节到播放。
我认为最简单的方法是编写自己的QIODevice子类,假装是一个非常长(无限?)的文件,但在查询时会一遍又一遍地返回循环样本。然后将您的QIODevice-subclass-obect作为参数传递给QAudioOutput :: start()。