我有一个来自 QObject 的派生类,它在 QByteArray 中有一堆连接的 WAVE 文件作为成员变量。
我想通过 QAudioOuput 播放该数组中的特定文件(假设我有它的偏移量)。
这是 PlaySound 方法的代码:
void DRMUtils::PlaySound(int offset){
mAudioFormat = new QAudioFormat(GetFormat(offset));
mAudioOut = new QAudioOutput(*mAudioFormat);
mBufferedAudio = new QBuffer();
mBufferedAudio->setData(GetSound(offset));
mBufferedAudio->open(QIODevice::ReadOnly);
connect(mAudioOut, SIGNAL(stateChanged(QAudio::State)), this, SLOT(handleAudioStateChanged(QAudio::State)));
mAudioOut->start(mBufferedAudio);
}
我使用 GetFormat(offset) 从前 44 个字节(WAVE 标准)获取文件格式,并使用 GetSound(offset) 获取 QByteArray 格式的数据
一切似乎都很好(我可以听到示例播放),但 QAudioFormat 的状态永远不会从“ActiveState”改变
这是我的插槽代码:
void DRMUtils::handleAudioStateChanged(QAudio::State newState)
{
qDebug() << "State: " << newState;
switch (newState) {
case QAudio::IdleState:
// Finished playing
mAudioOut->stop();
mBufferedAudio->close();
delete mAudioOut;
delete mBufferedAudio;
delete mAudioFormat;
qDebug() << "DELETED!";
break;
case QAudio::StoppedState:
// Stopped for other
qDebug() << "STOPPED!";
if (mAudioOut->error() != QAudio::NoError) {
// Error handling
qDebug() << "STOPPED ERROR!";
}
break;
default:
// ... other cases as appropriate
qDebug() << "DEFAULT!";
break;
}
}
我的调试输出始终是:
State: ActiveState
DEFAULT!
当样本完成时,我是否必须以 QAudioOutput“知道”的某种方式“限制”mBufferedAudio?
另外,当我像这样初始化mAudioOut时,我任何人都可以告诉我为什么(声明父级):
mAudioOut = new QAudioOutput(*mAudioFormat, this);
而不是(不声明父级):
mAudioOut = new QAudioOutput(*mAudioFormat);
我没有得到扬声器的任何输出(声明了父级)。
谢谢