diff --git a/audio/midi/fluid/sfont.cpp b/audio/midi/fluid/sfont.cpp index cb19226ae..f808dc662 100644 --- a/audio/midi/fluid/sfont.cpp +++ b/audio/midi/fluid/sfont.cpp @@ -145,15 +145,21 @@ Preset::~Preset() void Preset::loadSamples() { + QFile fd(sfont->get_name()); + if (!fd.open(QIODevice::ReadOnly)) { + qWarning("SoundFont(%s) failed to open", qPrintable(sfont->get_name())); + return; + } + bool locked = sfont->synth->mutex.tryLock(); if (_global_zone && _global_zone->instrument) { Instrument* i = _global_zone->instrument; if (i->global_zone && i->global_zone->sample) - i->global_zone->sample->load(); + i->global_zone->sample->load(&fd); for (Zone* iz : qAsConst(i->zones)) - iz->sample->load(); + iz->sample->load(&fd); } int currentInstrZone = 0; @@ -162,7 +168,7 @@ void Preset::loadSamples() sfont->synth->setLoadProgress(currentInstrZone++ / instrSize * 100); Instrument* i = z->instrument; if (i->global_zone && i->global_zone->sample) - i->global_zone->sample->load(); + i->global_zone->sample->load(&fd); for (Zone* iz : qAsConst(i->zones)) { if (sfont->synth->globalTerminate()) { @@ -171,7 +177,7 @@ void Preset::loadSamples() return; } - iz->sample->load(); + iz->sample->load(&fd); } } @@ -630,19 +636,16 @@ Sample::~Sample() // load //--------------------------------------------------------- -void Sample::load() +void Sample::load(QFile *fp) { if (!_valid || data) return; - QFile fd(sf->get_name()); - if (!fd.open(QIODevice::ReadOnly)) - return; if (sampletype & FLUID_SAMPLETYPE_OGG_VORBIS) { - if (!fd.seek(sf->samplePos() + start)) + if (!fp->seek(sf->samplePos() + start)) return; } else { - if (!fd.seek(sf->samplePos() + start * sizeof(short))) + if (!fp->seek(sf->samplePos() + start * sizeof(short))) return; } unsigned int size = end - start; @@ -651,7 +654,7 @@ void Sample::load() #ifdef SOUNDFONT3 std::vector p; p.resize(size); - if (fd.read(p.data(), size) != size) { + if (fp->read(p.data(), size) != size) { qWarning("SoundFont(%s) Sample(%s) read %u bytes failed", qPrintable(sf->get_name()), name, size); setValid(false); return; @@ -663,7 +666,7 @@ void Sample::load() data = new short[size]; size *= sizeof(short); - if (fd.read((char*)data, size) != size) { + if (fp->read((char*)data, size) != size) { qWarning("SoundFont(%s) Sample(%s) read %u bytes failed", qPrintable(sf->get_name()), name, size); setValid(false); return; diff --git a/audio/midi/fluid/sfont.h b/audio/midi/fluid/sfont.h index 15e048e68..d4b02fc54 100644 --- a/audio/midi/fluid/sfont.h +++ b/audio/midi/fluid/sfont.h @@ -160,7 +160,7 @@ class Sample { bool inRom() const; void optimize(); - void load(); + void load(QFile *fp); bool valid() const { return _valid; } void setValid(bool v) { _valid = v; } #ifdef SOUNDFONT3