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);
スピーカーへの出力がありません(親が宣言されています)。
ありがとう