Added a feedback for unknown opcodes in the C wrapper and the LV2 synth

This commit is contained in:
Paul Ferrand 2019-12-08 21:43:15 +01:00
parent c6a9ba88da
commit 66e916db19
3 changed files with 55 additions and 1 deletions

View file

@ -802,7 +802,19 @@ work(LV2_Handle instance,
{
const char *sfz_file_path = LV2_ATOM_BODY_CONST(atom);
lv2_log_note(&self->logger, "[work] Loading file: %s\n", sfz_file_path);
sfizz_load_file(self->synth, sfz_file_path);
if (sfizz_load_file(self->synth, sfz_file_path))
{
char * unknown_opcodes = sfizz_get_unknown_opcodes(self->synth);
if (unknown_opcodes) {
lv2_log_note(&self->logger, "[work] Unknown opcodes: %s\n", unknown_opcodes);
free(unknown_opcodes);
}
}
else
{
lv2_log_error(&self->logger, "[work] Error with %s; no file should be loaded.\n", sfz_file_path);
}
}
else if (atom->type == self->sfizz_num_voices_uri)
{

View file

@ -324,8 +324,27 @@ int sfizz_get_num_buffers(sfizz_synth_t* synth);
*/
int sfizz_get_num_bytes(sfizz_synth_t* synth);
/**
* @brief Enables freewheeling on the synth.
*
* @param synth
*/
void sfizz_enable_freewheeling(sfizz_synth_t* synth);
/**
* @brief Disables freewheeling on the synth.
*
* @param synth
*/
void sfizz_disable_freewheeling(sfizz_synth_t* synth);
/**
* @brief Get a comma separated list of unknown opcodes. The caller has to free()
* the string returned. This function allocates memory, do not call on the
* audio thread.
*
* @param synth
* @return char*
*/
char* sfizz_get_unknown_opcodes(sfizz_synth_t* synth);
#ifdef __cplusplus
}
#endif

View file

@ -216,6 +216,29 @@ void sfizz_disable_freewheeling(sfizz_synth_t* synth)
self->disableFreeWheeling();
}
char* sfizz_get_unknown_opcodes(sfizz_synth_t* synth)
{
auto self = reinterpret_cast<sfz::Synth*>(synth);
const auto unknownOpcodes = self->getUnknownOpcodes();
int totalLength = 0;
for (auto& opcode: unknownOpcodes)
totalLength += opcode.length();
if (totalLength == 0)
return nullptr;
auto opcodeList = (char *)std::malloc(totalLength + unknownOpcodes.size());
auto listIterator = opcodeList;
for (auto& opcode: unknownOpcodes) {
std::copy(opcode.begin(), opcode.end(), listIterator);
listIterator += opcode.length();
*listIterator++ = ',';
}
opcodeList[totalLength] = '\0';
return opcodeList;
}
#ifdef __cplusplus
}
#endif