Merge pull request #122 from paulfd/vst-setenable
Avoid purging and recreating the synth in Reaper
This commit is contained in:
commit
7a8b290c61
9 changed files with 66 additions and 9 deletions
|
|
@ -416,7 +416,8 @@ activate(LV2_Handle instance)
|
||||||
static void
|
static void
|
||||||
deactivate(LV2_Handle instance)
|
deactivate(LV2_Handle instance)
|
||||||
{
|
{
|
||||||
UNUSED(instance);
|
sfizz_plugin_t *self = (sfizz_plugin_t *)instance;
|
||||||
|
sfizz_all_sound_off(self->synth);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
||||||
|
|
@ -369,6 +369,13 @@ SFIZZ_EXPORTED_API void sfizz_enable_logging(sfizz_synth_t* synth);
|
||||||
*/
|
*/
|
||||||
SFIZZ_EXPORTED_API void sfizz_disable_logging(sfizz_synth_t* synth);
|
SFIZZ_EXPORTED_API void sfizz_disable_logging(sfizz_synth_t* synth);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Shuts down the current processing, clear buffers and reset the voices.
|
||||||
|
*
|
||||||
|
* @param synth
|
||||||
|
*/
|
||||||
|
SFIZZ_EXPORTED_API void sfizz_all_sound_off(sfizz_synth_t* synth);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -256,6 +256,11 @@ public:
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void disableLogging() noexcept;
|
void disableLogging() noexcept;
|
||||||
|
/**
|
||||||
|
* @brief Shuts down the current processing, clear buffers and reset the voices.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void allSoundOff() noexcept;
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<sfz::Synth> synth;
|
std::unique_ptr<sfz::Synth> synth;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -962,3 +962,16 @@ void sfz::Synth::disableLogging() noexcept
|
||||||
{
|
{
|
||||||
resources.logger.disableLogging();
|
resources.logger.disableLogging();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sfz::Synth::allSoundOff() noexcept
|
||||||
|
{
|
||||||
|
AtomicDisabler callbackDisabler{ canEnterCallback };
|
||||||
|
while (inCallback) {
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto &voice: voices)
|
||||||
|
voice->reset();
|
||||||
|
for (auto& effectBus: effectBuses)
|
||||||
|
effectBus->clear();
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -361,6 +361,12 @@ public:
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void disableLogging() noexcept;
|
void disableLogging() noexcept;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Shuts down the current processing, clear buffers and reset the voices.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void allSoundOff() noexcept;
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* @brief The parser callback; this is called by the parent object each time
|
* @brief The parser callback; this is called by the parent object each time
|
||||||
|
|
|
||||||
|
|
@ -195,3 +195,8 @@ void sfz::Sfizz::disableLogging() noexcept
|
||||||
{
|
{
|
||||||
synth->disableLogging();
|
synth->disableLogging();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sfz::Sfizz::allSoundOff() noexcept
|
||||||
|
{
|
||||||
|
synth->allSoundOff();
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -237,12 +237,19 @@ void sfizz_enable_logging(sfizz_synth_t* synth)
|
||||||
auto self = reinterpret_cast<sfz::Synth*>(synth);
|
auto self = reinterpret_cast<sfz::Synth*>(synth);
|
||||||
return self->enableLogging();
|
return self->enableLogging();
|
||||||
}
|
}
|
||||||
|
|
||||||
void sfizz_disable_logging(sfizz_synth_t* synth)
|
void sfizz_disable_logging(sfizz_synth_t* synth)
|
||||||
{
|
{
|
||||||
auto self = reinterpret_cast<sfz::Synth*>(synth);
|
auto self = reinterpret_cast<sfz::Synth*>(synth);
|
||||||
return self->disableLogging();
|
return self->disableLogging();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sfizz_all_sound_off(sfizz_synth_t* synth)
|
||||||
|
{
|
||||||
|
auto self = reinterpret_cast<sfz::Synth*>(synth);
|
||||||
|
return self->allSoundOff();
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,17 @@ TEST_CASE("[Synth] Play and check active voices")
|
||||||
REQUIRE(synth.getNumActiveVoices() == 0);
|
REQUIRE(synth.getNumActiveVoices() == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("[Synth] All sound off")
|
||||||
|
{
|
||||||
|
sfz::Synth synth;
|
||||||
|
synth.loadSfzFile(fs::current_path() / "tests/TestFiles/groups_avl.sfz");
|
||||||
|
synth.noteOn(0, 36, 24);
|
||||||
|
synth.noteOn(0, 36, 89);
|
||||||
|
REQUIRE(synth.getNumActiveVoices() == 2);
|
||||||
|
synth.allSoundOff();
|
||||||
|
REQUIRE(synth.getNumActiveVoices() == 0);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE("[Synth] Change the number of voice while playing")
|
TEST_CASE("[Synth] Change the number of voice while playing")
|
||||||
{
|
{
|
||||||
sfz::Synth synth;
|
sfz::Synth synth;
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,9 @@ tresult PLUGIN_API SfizzVstProcessor::initialize(FUnknown* context)
|
||||||
|
|
||||||
_state = SfizzVstState();
|
_state = SfizzVstState();
|
||||||
|
|
||||||
|
fprintf(stderr, "[sfizz] new synth\n");
|
||||||
|
_synth.reset(new sfz::Sfizz);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -105,21 +108,20 @@ tresult PLUGIN_API SfizzVstProcessor::canProcessSampleSize(int32 symbolicSampleS
|
||||||
|
|
||||||
tresult PLUGIN_API SfizzVstProcessor::setActive(TBool state)
|
tresult PLUGIN_API SfizzVstProcessor::setActive(TBool state)
|
||||||
{
|
{
|
||||||
stopBackgroundWork();
|
sfz::Sfizz* synth = _synth.get();
|
||||||
_synth.reset();
|
|
||||||
|
if (!synth)
|
||||||
|
return kResultFalse;
|
||||||
|
|
||||||
if (state) {
|
if (state) {
|
||||||
fprintf(stderr, "[Sfizz] new synth\n");
|
|
||||||
sfz::Sfizz* synth = new sfz::Sfizz;
|
|
||||||
_synth.reset(synth);
|
|
||||||
|
|
||||||
synth->setSampleRate(processSetup.sampleRate);
|
synth->setSampleRate(processSetup.sampleRate);
|
||||||
synth->setSamplesPerBlock(processSetup.maxSamplesPerBlock);
|
synth->setSamplesPerBlock(processSetup.maxSamplesPerBlock);
|
||||||
|
|
||||||
syncStateToSynth();
|
|
||||||
|
|
||||||
_workRunning = true;
|
_workRunning = true;
|
||||||
_worker = std::thread([this]() { doBackgroundWork(); });
|
_worker = std::thread([this]() { doBackgroundWork(); });
|
||||||
|
} else {
|
||||||
|
synth->allSoundOff();
|
||||||
|
stopBackgroundWork();
|
||||||
}
|
}
|
||||||
|
|
||||||
return kResultTrue;
|
return kResultTrue;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue