1

QByteArray に連結された一連の WAVE ファイルをメンバー変数として持つ QObject からの派生クラスがあります。

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削除されるかも?親が指定されている場合はsomAudioOutも削除されます。また、状態の変更を受信しない理由も説明します (オブジェクトが削除されると、スロットを呼び出すことができなくなります)。

于 2013-07-08T21:51:22.087 に答える