QSoundEffect不会重新加载源

时间:2019-05-03 08:08:26

标签: qt

在我的程序中,可以选择动作的声音。声音是可变的,这意味着.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

我在俯视什么吗?

1 个答案:

答案 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);