1

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

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

谢谢

4

1 回答 1

1

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

于 2013-07-08T21:51:22.087 回答