2016-02-19 8 views
0

Я занят созданием алгоритма реверберации. Во время работы с QSound я нашел несколько проблем.QT5.5 QSound isFinshed

Во-первых, звук не воспроизводится при попытке к QSound::play() вроде этого:

/// Play output .wav file. 
QSound sound("C:/Users/mvdelft/Documents/Reverb_configurator/output.wav", this); 
sound.play(); 

Он играет только звук, если я даю путь Побейте с (файл QString) QSound::play так:

/// Play output .wav file. 
QSound sound("C:/Users/mvdelft/Documents/Reverb_configurator/output.wav", this); 
sound.play("C:/Users/mvdelft/Documents/Reverb_configurator/output.wav"); 

Связанная проблема Я имею отношение к функции bool QSound::isFinshed(), которая не работает для меня. Код:

/// Play output .wav file. 
QSound sound("C:/Users/mvdelft/Documents/Reverb_configurator/output.wav", this); 
sound.play("C:/Users/mvdelft/Documents/Reverb_configurator/output.wav"); 
sound.setLoops(10); 

/// Check is sound is finished 
while (!sound.isFinished()){} 

ui->listWidget->addItem("Finished playing sound"); 
}/// End of scope 

ответ

1

В первом варианте, вы создаете QSound объект на стеке с файлом, начать играть, и немедленно уничтожить его. Это остановит воспроизведение звука, поэтому вы ничего не услышите.

Во второй версии QSound::play(const QString &) является статическим методом. Он будет воспроизводить звук в фоновом режиме. Вот почему вы что-то слышите. С помощью статического метода вызовы setLoops и isFinished не будут работать. Кроме того, цикл занятости (while (!sound.isFinished()) ;) очень плох, так как он будет потреблять 100% процессор и, вероятно, блокирует воспроизведение звука.

Чтобы звук работал, вы должны создать его в куче и регулярно проверять isFinished() на событии таймера. Тем не менее, я предлагаю QSoundEffect, так как он дает вам больше контроля. Самое главное, сигнал playingChanged(), который сообщит вам, когда игра закончится без необходимости постоянной проверки.

Outline:

void MyObject::playSomeSound() { 
    QSoundEffect *s = new QSoundEffect(this); 
    connect(s, SIGNAL(playingChanged()), this, SLOT(soundPlayingChanged())); 
    s->setSource("C:/Users/mvdelft/Documents/Reverb_configurator/output.wav"); 
    s->setLoopCount(10); 
    s->play(); 
} 

void MyObject::soundPlayingChanged() { 
    QSoundEffect *s = qobject_cast<QSoundEffect *> (sender()); 
    // Will also be called when playing was started, so check if really finished 
    if (!s->isPlaying()) { 
     s->deleteLater(); 

     // Do what you need to do when playing finished 
    } 
} 
+0

Спасибо за быстрый комментарий, он работает сейчас! Как человек со средними навыками программирования, он все еще меня смущает проблема с памятью. Спасибо хоть! – Whiteshift