我有一个来自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(偏移量)从44个第一个字节(WAVE标准)获取文件格式,并使用GetSound(偏移量)获取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!
我是否必须以某种方式“限制”mBufferedAudio,以便QAudioOutput在样本完成时“知道”?
另外,我有什么人可以告诉我为什么当我像这样初始化mAudioOut时(声明父母):
mAudioOut = new QAudioOutput(*mAudioFormat, this);
而不是(不宣布父母):
mAudioOut = new QAudioOutput(*mAudioFormat);
我没有得到扬声器的任何输出(父母声明)。
由于
答案 0 :(得分:1)
可能会this
被删除吗?因此,在指定父级时也会删除mAudioOut
。它还可以解释为什么不接收状态更改(如果对象被删除,则无法再调用插槽)。