Qt QAudioOutput StateChnged总是在ActiveState上(Qt 5.1 Windows MinGW)

时间:2013-07-08 20:09:07

标签: qt audio output

我有一个来自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);

我没有得到扬声器的任何输出(父母声明)。

由于

1 个答案:

答案 0 :(得分:1)

可能会this被删除吗?因此,在指定父级时也会删除mAudioOut。它还可以解释为什么不接收状态更改(如果对象被删除,则无法再调用插槽)。