Skip to content

Commit

Permalink
Merge c802680 into 6da014a
Browse files Browse the repository at this point in the history
  • Loading branch information
rorywalsh committed May 29, 2018
2 parents 6da014a + c802680 commit cd76551
Showing 1 changed file with 74 additions and 1 deletion.
75 changes: 74 additions & 1 deletion Opcodes/fluidOpcodes/fluidOpcodes.cpp
Expand Up @@ -37,7 +37,7 @@
#include <map>
#include <string>
#include <vector>

#include <sstream>
#include "OpcodeBase.hpp"
#include "csdl.h"
#include <fluidsynth.h>
Expand Down Expand Up @@ -224,6 +224,77 @@ class FluidLoad : public OpcodeBase<FluidLoad> {
}
};

/* from Opcodes/arrays.c */
static inline void tabensure(CSOUND *csound, ARRAYDAT *p, int size) {
if (p->data == NULL || p->dimensions == 0 ||
(p->dimensions == 1 && p->sizes[0] < size)) {
size_t ss;
if (p->data == NULL) {
CS_VARIABLE *var = p->arrayType->createVariable(csound, NULL);
p->arrayMemberSize = var->memBlockSize;
}

ss = p->arrayMemberSize * size;
if (p->data == NULL)
p->data = (MYFLT *)csound->Calloc(csound, ss);
else
p->data = (MYFLT *)csound->ReAlloc(csound, p->data, ss);
p->dimensions = 1;
p->sizes = (int *)csound->Malloc(csound, sizeof(int));
p->sizes[0] = size;
}
}

//Rory Walsh 2018
class FluidInfo : public OpcodeBase<FluidInfo> {
// Outputs.
ARRAYDAT *outArr;
// Inputs.
MYFLT *iFluidSynth;
// State.
std::vector<std::string> programs;
char *program;
fluid_synth_t *fluidSynth;
int32_t listPresets;
void *mutex;

public:
int32_t init(CSOUND *csound) {
mutex = csound->Create_Mutex(0);
LockGuard guard(csound, mutex);
int32_t result = OK;
toa(iFluidSynth, fluidSynth);
fluid_sfont_t *fluidSoundfont =
fluid_synth_get_sfont(fluidSynth, 0);
fluid_preset_t fluidPreset;
fluidSoundfont->iteration_start(fluidSoundfont);
OPARMS oparms;
csound->GetOParms(csound, &oparms);
if (oparms.msglevel & 0x7)
while (fluidSoundfont->iteration_next(fluidSoundfont, &fluidPreset))
{
std::stringstream ss;
ss << "Bank: " << fluidPreset.get_banknum(&fluidPreset) <<
" Preset: " << fluidPreset.get_num(&fluidPreset) <<
" Name: " << fluidPreset.get_name(&fluidPreset);
programs.push_back(ss.str());
}

tabensure(csound, outArr, programs.size());
STRINGDAT *strings = (STRINGDAT *)outArr->data;

for (int i = 0; i < programs.size(); i++) {
program = &programs[i][0u];
strings[i].size = strlen(program) + 1;
strings[i].data = csound->Strdup(csound, program);
}

programs.clear();

return result;
}
};

class FluidProgramSelect : public OpcodeBase<FluidProgramSelect>
{
// Inputs.
Expand Down Expand Up @@ -593,6 +664,8 @@ static OENTRY localops[] = {
(char *)"ppoo", (SUBR)&FluidEngine::init_, (SUBR)0, (SUBR)0},
{(char *)"fluidLoad", sizeof(FluidLoad), 0, 1, (char *)"i", (char *)"Tio",
(SUBR)&FluidLoad::init_, (SUBR)0, (SUBR)0},
{(char *)"fluidInfo", sizeof(FluidInfo), 0, 1, (char *)"S[]", (char *)"i",
(SUBR)&FluidInfo::init_, (SUBR)0, (SUBR)0},
{(char *)"fluidProgramSelect", sizeof(FluidProgramSelect), 0, 1, (char *)"",
(char *)"iiiii", (SUBR)&FluidProgramSelect::init_, (SUBR)0, (SUBR)0},
{(char *)"fluidCCi", sizeof(FluidCCI), 0, 1, (char *)"", (char *)"iiii",
Expand Down

0 comments on commit cd76551

Please sign in to comment.