QSoundEffect не перезагружает источник - PullRequest
0 голосов
/ 03 мая 2019

В моей программе можно выбрать звук для действия. звук изменяемый, это означает, что файл .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 голосов
/ 03 мая 2019

Это не упоминается в официальных документах, но вы можете найти реализацию на 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...