在我的程序中,可以选择动作的声音。声音是可变的,这意味着.wav
文件被另一个文件替换。
这可能会导致问题。当我替换文件并设置QSoundEffect
的来源时,声音不会改变。
此刻,我有这样的消息来源:
//variable in .h
QUrl sound = "file:///"+soundDirectory+"sound.wav";
QUrl newSound = "file:///"+soundDirectory+"newSound.wav"; ;
QSoundEffect soundeffect;
//called in setSound() in .cpp
soundEffect.setSource(sound);
声音加载没有问题,我可以播放声音。
我可以使用此代码更改声音
// changing the sound in changeSound()
soundEffect.setSource(newSound);
这也很好。新的声音已加载,我可以播放。
但是也可以在目录中更改声音文件:
//changeSoundFile()
QFile::remove(sound.toLocalFile());
QFile::copy(anyPossibleSound.toLocalFile(), sound.toLocalFile());
这也起作用,并将其目录中的声音文件替换为另一个文件。
如果我在更改文件后调用setSound()
。似乎文件没有重新加载。并且声音没有改变。如果更改了两者之间的声音,这也是一个问题(在启动时调用setSound
,然后调用changeSound,然后再次调用changeSoundFile和setSound
)
我在俯视什么吗?
答案 0 :(得分:0)
官方文档中未提及它,但是您可以在GitHub上找到实现:
void QSoundEffect::setSource(const QUrl &url) {
if (d->source() == url)
return;
d->setSource(url);
emit sourceChanged();
}
由于URL相同,因此不会重新加载文件。该实现将内部缓存与之前已加载的数据一起保存,因此在播放文件时,没有任何变化。
API没有提供强制重置数据源的方法。您有两种选择:
QSoundEffect
实例。// Create a temporal file
const auto uuid = QUuid::createUuid();
const auto new_filename = uuid.toString() + ".wav";
// Copy the file
QFile::remove(sound.toLocalFile());
QFile::copy(anyPossibleSound.toLocalFile(), new_filename);
sound = QUrl(new_filename);
// Use it
soundEffect.setSource(sound);