Add a panic button
This commit is contained in:
parent
ac93e0cbd3
commit
7d625bc736
7 changed files with 53 additions and 0 deletions
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -579,6 +579,8 @@ void sfz::Synth::noteOn(int delay, int noteNumber, uint8_t velocity) noexcept
|
||||||
ASSERT(noteNumber < 128);
|
ASSERT(noteNumber < 128);
|
||||||
ASSERT(noteNumber >= 0);
|
ASSERT(noteNumber >= 0);
|
||||||
|
|
||||||
|
DBG("Note on at " << noteNumber << " (" << +velocity << ")");
|
||||||
|
|
||||||
ScopedTiming logger { dispatchDuration, ScopedTiming::Operation::addToDuration };
|
ScopedTiming logger { dispatchDuration, ScopedTiming::Operation::addToDuration };
|
||||||
resources.midiState.noteOnEvent(delay, noteNumber, velocity);
|
resources.midiState.noteOnEvent(delay, noteNumber, velocity);
|
||||||
|
|
||||||
|
|
@ -595,6 +597,8 @@ void sfz::Synth::noteOff(int delay, int noteNumber, uint8_t velocity) noexcept
|
||||||
ASSERT(noteNumber >= 0);
|
ASSERT(noteNumber >= 0);
|
||||||
UNUSED(velocity);
|
UNUSED(velocity);
|
||||||
|
|
||||||
|
DBG("Note off at " << noteNumber << " (" << +velocity << ")");
|
||||||
|
|
||||||
ScopedTiming logger { dispatchDuration, ScopedTiming::Operation::addToDuration };
|
ScopedTiming logger { dispatchDuration, ScopedTiming::Operation::addToDuration };
|
||||||
resources.midiState.noteOffEvent(delay, noteNumber, velocity);
|
resources.midiState.noteOffEvent(delay, noteNumber, velocity);
|
||||||
|
|
||||||
|
|
@ -962,3 +966,11 @@ void sfz::Synth::disableLogging() noexcept
|
||||||
{
|
{
|
||||||
resources.logger.disableLogging();
|
resources.logger.disableLogging();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sfz::Synth::allSoundOff() noexcept
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue