Browse Source

Misc NativePlugin changes, update local ZynAddSubFX

tags/1.9.4
falkTX 12 years ago
parent
commit
bf6fa847f8
8 changed files with 124 additions and 131 deletions
  1. +18
    -23
      source/backend/CarlaNative.h
  2. +4
    -4
      source/backend/Makefile.mk
  3. +57
    -86
      source/backend/native/zynaddsubfx.cpp
  4. +1
    -1
      source/backend/native/zynaddsubfx/Misc/Master.cpp
  5. +1
    -0
      source/backend/native/zynaddsubfx/Output/DSSIaudiooutput.cpp
  6. +36
    -16
      source/backend/plugin/NativePlugin.cpp
  7. +5
    -1
      source/backend/standalone/CarlaStandalone.cpp
  8. +2
    -0
      source/widgets/Makefile

+ 18
- 23
source/backend/CarlaNative.h View File

@@ -193,37 +193,32 @@ typedef struct _PluginDescriptor {


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------


// Register single plugin (plugin-side)
// Register plugin
void carla_register_native_plugin(const PluginDescriptor* desc); void carla_register_native_plugin(const PluginDescriptor* desc);


// Register all plugins (host-side)
static inline
void carla_register_all_plugins()
{
// Simple plugins
void carla_register_native_plugin_bypass();
void carla_register_native_plugin_midiSequencer();
void carla_register_native_plugin_midiSplit();
void carla_register_native_plugin_midiThrough();
void carla_register_native_plugin_midiTranspose();
void carla_register_native_plugin_nekofilter();

// DISTRHO plugins
void carla_register_native_plugin_3BandEQ();
void carla_register_native_plugin_3BandSplitter();
void carla_register_native_plugin_PingPongPan();
void carla_register_native_plugin_Notes();
// Simple plugins
void carla_register_native_plugin_bypass();
void carla_register_native_plugin_midiSequencer();
void carla_register_native_plugin_midiSplit();
void carla_register_native_plugin_midiThrough();
void carla_register_native_plugin_midiTranspose();
void carla_register_native_plugin_nekofilter();

// DISTRHO plugins
void carla_register_native_plugin_3BandEQ();
void carla_register_native_plugin_3BandSplitter();
void carla_register_native_plugin_PingPongPan();
void carla_register_native_plugin_Notes();


#ifdef WANT_AUDIOFILE #ifdef WANT_AUDIOFILE
// AudioFile
void carla_register_native_plugin_audiofile();
// AudioFile
void carla_register_native_plugin_audiofile();
#endif #endif


#ifdef WANT_ZYNADDSUBFX #ifdef WANT_ZYNADDSUBFX
// ZynAddSubFX
void carla_register_native_plugin_zynaddsubfx();
// ZynAddSubFX
void carla_register_native_plugin_zynaddsubfx();
#endif #endif
}


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------




+ 4
- 4
source/backend/Makefile.mk View File

@@ -8,11 +8,11 @@ include ../../Makefile.mk


# -------------------------------------------------------------- # --------------------------------------------------------------


BASE_FLAGS = -pthread -fvisibility=hidden -fPIC -I. -I.. -I../../includes
BASE_FLAGS += $(shell pkg-config --cflags gl)
BACKEND_FLAGS = -pthread -fvisibility=hidden -fPIC -I. -I.. -I../../includes
BACKEND_FLAGS += $(shell pkg-config --cflags gl)


BUILD_C_FLAGS += $(BASE_FLAGS)
BUILD_CXX_FLAGS += $(BASE_FLAGS) -I../../libs -I../../libs/distrho -I../../utils
BUILD_C_FLAGS += $(BACKEND_FLAGS)
BUILD_CXX_FLAGS += $(BACKEND_FLAGS) -I../../libs -I../../libs/distrho -I../../utils
LINK_FLAGS += $(shell pkg-config --libs gl) -lpthread LINK_FLAGS += $(shell pkg-config --libs gl) -lpthread


# -------------------------------------------------------------- # --------------------------------------------------------------


+ 57
- 86
source/backend/native/zynaddsubfx.cpp View File

@@ -50,40 +50,41 @@ public:


ZynAddSubFxPlugin(const HostDescriptor* const host) ZynAddSubFxPlugin(const HostDescriptor* const host)
: PluginDescriptorClass(host), : PluginDescriptorClass(host),
m_master(new Master)
kMaster(new Master()),
kSampleRate(getSampleRate())
{ {
// refresh banks // refresh banks
m_master->bank.rescanforbanks();
kMaster->bank.rescanforbanks();


for (uint32_t i=0, size = m_master->bank.banks.size(); i < size; i++)
for (uint32_t i=0, size = kMaster->bank.banks.size(); i < size; i++)
{ {
if (m_master->bank.banks[i].dir.empty())
if (kMaster->bank.banks[i].dir.empty())
continue; continue;


m_master->bank.loadbank(m_master->bank.banks[i].dir);
kMaster->bank.loadbank(kMaster->bank.banks[i].dir);


for (unsigned int instrument = 0; instrument < BANK_SIZE; instrument++) for (unsigned int instrument = 0; instrument < BANK_SIZE; instrument++)
{ {
const std::string insName(m_master->bank.getname(instrument));
const std::string insName(kMaster->bank.getname(instrument));


if (insName.empty() || insName[0] == '\0' || insName[0] == ' ') if (insName.empty() || insName[0] == '\0' || insName[0] == ' ')
continue; continue;


ProgramInfo pInfo(i, instrument, insName.c_str()); ProgramInfo pInfo(i, instrument, insName.c_str());
m_programs.push_back(pInfo);
fPrograms.push_back(pInfo);
} }
} }
} }


~ZynAddSubFxPlugin() ~ZynAddSubFxPlugin()
{ {
//ensure that everything has stopped with the mutex wait
pthread_mutex_lock(&m_master->mutex);
pthread_mutex_unlock(&m_master->mutex);
//ensure that everything has stopped
pthread_mutex_lock(&kMaster->mutex);
pthread_mutex_unlock(&kMaster->mutex);


m_programs.clear();
fPrograms.clear();


delete m_master;
delete kMaster;
} }


protected: protected:
@@ -135,7 +136,7 @@ protected:
{ {
#if 0 #if 0
case PARAMETER_MASTER: case PARAMETER_MASTER:
return m_master->Pvolume;
return kMaster->Pvolume;
#endif #endif
default: default:
return 0.0f; return 0.0f;
@@ -147,17 +148,17 @@ protected:


uint32_t getMidiProgramCount() uint32_t getMidiProgramCount()
{ {
return m_programs.size();
return fPrograms.size();
} }


const MidiProgram* getMidiProgramInfo(const uint32_t index) const MidiProgram* getMidiProgramInfo(const uint32_t index)
{ {
CARLA_ASSERT(index < getMidiProgramCount()); CARLA_ASSERT(index < getMidiProgramCount());


if (index >= m_programs.size())
if (index >= fPrograms.size())
return nullptr; return nullptr;


const ProgramInfo& pInfo(m_programs[index]);
const ProgramInfo& pInfo(fPrograms[index]);


static MidiProgram midiProgram; static MidiProgram midiProgram;
midiProgram.bank = pInfo.bank; midiProgram.bank = pInfo.bank;
@@ -186,21 +187,21 @@ protected:


void setMidiProgram(const uint32_t bank, const uint32_t program) void setMidiProgram(const uint32_t bank, const uint32_t program)
{ {
if (bank >= m_master->bank.banks.size())
if (bank >= kMaster->bank.banks.size())
return; return;
if (program >= BANK_SIZE) if (program >= BANK_SIZE)
return; return;


const std::string bankdir(m_master->bank.banks[bank].dir);
const std::string bankdir(kMaster->bank.banks[bank].dir);


if (! bankdir.empty()) if (! bankdir.empty())
{ {
pthread_mutex_lock(&m_master->mutex);
pthread_mutex_lock(&kMaster->mutex);


m_master->bank.loadbank(bankdir);
m_master->bank.loadfromslot(program, m_master->part[0]);
kMaster->bank.loadbank(bankdir);
kMaster->bank.loadfromslot(program, kMaster->part[0]);


pthread_mutex_unlock(&m_master->mutex);
pthread_mutex_unlock(&kMaster->mutex);
} }
} }


@@ -209,81 +210,50 @@ protected:


void activate() void activate()
{ {
m_master->setController(0, MIDI_CONTROL_ALL_SOUND_OFF, 0);
kMaster->setController(0, MIDI_CONTROL_ALL_SOUND_OFF, 0);
} }


void process(float**, float** const outBuffer, const uint32_t frames, const uint32_t midiEventCount, const MidiEvent* const midiEvents) void process(float**, float** const outBuffer, const uint32_t frames, const uint32_t midiEventCount, const MidiEvent* const midiEvents)
{ {
if (pthread_mutex_trylock(&m_master->mutex) != 0)
if (pthread_mutex_trylock(&kMaster->mutex) != 0)
{ {
carla_zeroFloat(outBuffer[0], frames); carla_zeroFloat(outBuffer[0], frames);
carla_zeroFloat(outBuffer[1], frames); carla_zeroFloat(outBuffer[1], frames);
return; return;
} }


uint32_t fromFrame = 0;
uint32_t eventIndex = 0;
uint32_t nextEventFrame = 0;
uint32_t toFrame = 0;

do {
// Find the time of the next event, if any
if (eventIndex >= midiEventCount)
nextEventFrame = UINT32_MAX;
else
nextEventFrame = midiEvents[eventIndex].time;

// find the end of the sub-sample to be processed this time round...
// if the next event falls within the desired sample interval...
if ((nextEventFrame < frames) && (nextEventFrame >= toFrame))
// set the end to be at that event
toFrame = nextEventFrame;
else
// ...else go for the whole remaining sample
toFrame = frames;

if (fromFrame < toFrame)
for (uint32_t i=0; i < midiEventCount; i++)
{
const MidiEvent* const midiEvent = &midiEvents[i];

const uint8_t status = MIDI_GET_STATUS_FROM_DATA(midiEvent->data);
const uint8_t channel = MIDI_GET_CHANNEL_FROM_DATA(midiEvent->data);

if (MIDI_IS_STATUS_NOTE_OFF(status))
{ {
// call master to fill from `fromFrame` to `toFrame`:
m_master->GetAudioOutSamples(toFrame - fromFrame, (unsigned)getSampleRate(), &outBuffer[0][fromFrame], &outBuffer[1][fromFrame]);
// next sub-sample please...
fromFrame = toFrame;
const uint8_t note = midiEvent->data[1];

kMaster->noteOff(channel, note);
} }
else if (MIDI_IS_STATUS_NOTE_ON(status))
{
const uint8_t note = midiEvent->data[1];
const uint8_t velo = midiEvent->data[2];


// Now process any event(s) at the current timing point
while (eventIndex < midiEventCount && midiEvents[eventIndex].time == toFrame)
kMaster->noteOn(channel, note, velo);
}
else if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status))
{ {
const uint8_t status = MIDI_GET_STATUS_FROM_DATA(midiEvents[eventIndex].data);
const uint8_t channel = MIDI_GET_CHANNEL_FROM_DATA(midiEvents[eventIndex].data);

if (MIDI_IS_STATUS_NOTE_OFF(status))
{
const uint8_t note = midiEvents[eventIndex].data[1];

m_master->noteOff(channel, note);
}
else if (MIDI_IS_STATUS_NOTE_ON(status))
{
const uint8_t note = midiEvents[eventIndex].data[1];
const uint8_t velo = midiEvents[eventIndex].data[2];

m_master->noteOn(channel, note, velo);
}
else if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status))
{
const uint8_t note = midiEvents[eventIndex].data[1];
const uint8_t pressure = midiEvents[eventIndex].data[2];

m_master->polyphonicAftertouch(channel, note, pressure);
}

eventIndex++;
const uint8_t note = midiEvent->data[1];
const uint8_t pressure = midiEvent->data[2];

kMaster->polyphonicAftertouch(channel, note, pressure);
} }
}


// Keep going until we have the desired total length of sample...
} while (toFrame < frames);
kMaster->GetAudioOutSamples(frames, kSampleRate, outBuffer[0], outBuffer[1]);


pthread_mutex_unlock(&m_master->mutex);
pthread_mutex_unlock(&kMaster->mutex);
} }


// ------------------------------------------------------------------- // -------------------------------------------------------------------
@@ -302,16 +272,17 @@ private:
ProgramInfo() = delete; ProgramInfo() = delete;
}; };


std::vector<ProgramInfo> m_programs;
std::vector<ProgramInfo> fPrograms;


Master* const m_master;
Master* const kMaster;
const unsigned kSampleRate;


public: public:
static int s_instanceCount;
static int sInstanceCount;


static PluginHandle _instantiate(const PluginDescriptor*, HostDescriptor* host) static PluginHandle _instantiate(const PluginDescriptor*, HostDescriptor* host)
{ {
if (s_instanceCount++ == 0)
if (sInstanceCount++ == 0)
{ {
synth = new SYNTH_T; synth = new SYNTH_T;
synth->buffersize = host->get_buffer_size(host->handle); synth->buffersize = host->get_buffer_size(host->handle);
@@ -336,7 +307,7 @@ public:
{ {
delete (ZynAddSubFxPlugin*)handle; delete (ZynAddSubFxPlugin*)handle;


if (--s_instanceCount == 0)
if (--sInstanceCount == 0)
{ {
delete[] denormalkillbuf; delete[] denormalkillbuf;
denormalkillbuf = nullptr; denormalkillbuf = nullptr;
@@ -349,7 +320,7 @@ public:
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ZynAddSubFxPlugin) CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ZynAddSubFxPlugin)
}; };


int ZynAddSubFxPlugin::s_instanceCount = 0;
int ZynAddSubFxPlugin::sInstanceCount = 0;


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------




+ 1
- 1
source/backend/native/zynaddsubfx/Misc/Master.cpp View File

@@ -490,6 +490,7 @@ void Master::GetAudioOutSamples(size_t nsamples,
if(nsamples >= smps) { if(nsamples >= smps) {
memcpy(outl + out_off, bufl + off, sizeof(float) * smps); memcpy(outl + out_off, bufl + off, sizeof(float) * smps);
memcpy(outr + out_off, bufr + off, sizeof(float) * smps); memcpy(outr + out_off, bufr + off, sizeof(float) * smps);
nsamples -= smps;


//generate samples //generate samples
AudioOut(bufl, bufr); AudioOut(bufl, bufr);
@@ -497,7 +498,6 @@ void Master::GetAudioOutSamples(size_t nsamples,
smps = synth->buffersize; smps = synth->buffersize;


out_off += smps; out_off += smps;
nsamples -= smps;
} }
else { //use some samples else { //use some samples
memcpy(outl + out_off, bufl + off, sizeof(float) * nsamples); memcpy(outl + out_off, bufl + off, sizeof(float) * nsamples);


+ 1
- 0
source/backend/native/zynaddsubfx/Output/DSSIaudiooutput.cpp View File

@@ -629,6 +629,7 @@ DSSIaudiooutput::DSSIaudiooutput(unsigned long sampleRate)
for(int i = 0; i < synth->buffersize; i++) for(int i = 0; i < synth->buffersize; i++)
denormalkillbuf[i] = (RND - 0.5f) * 1e-16; denormalkillbuf[i] = (RND - 0.5f) * 1e-16;


synth->alias();
this->master = new Master(); this->master = new Master();
} }




+ 36
- 16
source/backend/plugin/NativePlugin.cpp View File

@@ -23,6 +23,33 @@


#include <QtGui/QFileDialog> #include <QtGui/QFileDialog>


void carla_register_all_plugins()
{
// Simple plugins
carla_register_native_plugin_bypass();
carla_register_native_plugin_midiSequencer();
carla_register_native_plugin_midiSplit();
carla_register_native_plugin_midiThrough();
carla_register_native_plugin_midiTranspose();
carla_register_native_plugin_nekofilter();

// DISTRHO plugins
carla_register_native_plugin_3BandEQ();
carla_register_native_plugin_3BandSplitter();
carla_register_native_plugin_PingPongPan();
carla_register_native_plugin_Notes();

#ifdef WANT_AUDIOFILE
// AudioFile
carla_register_native_plugin_audiofile();
#endif

#ifdef WANT_ZYNADDSUBFX
// ZynAddSubFX
carla_register_native_plugin_zynaddsubfx();
#endif
}

CARLA_BACKEND_START_NAMESPACE CARLA_BACKEND_START_NAMESPACE


struct NativePluginMidiData { struct NativePluginMidiData {
@@ -224,16 +251,17 @@ public:


if (fDescriptor->name != nullptr) if (fDescriptor->name != nullptr)
{ {
if (std::strcmp(fDescriptor->name, "ZynAddSubFX") == 0)
{
// nothing
}
else
{
options |= PLUGIN_OPTION_FIXED_BUFFER;
}
// if (std::strcmp(fDescriptor->name, "ZynAddSubFX") == 0)
// {
// // nothing
// }
// else
// {
// }
} }


options |= PLUGIN_OPTION_FIXED_BUFFER;
options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES;


//if ((kData->audioIns.count() == 1 || kData->audioOuts.count() == 0) || (kData->audioIns.count() == 0 || kData->audioOuts.count() == 1)) //if ((kData->audioIns.count() == 1 || kData->audioOuts.count() == 0) || (kData->audioIns.count() == 0 || kData->audioOuts.count() == 1))
@@ -910,14 +938,6 @@ public:
// plugin options // plugin options
fOptions = 0x0; fOptions = 0x0;


if (fDescriptor->name != nullptr)
{
if (std::strcmp(fDescriptor->name, "ZynAddSubFX") == 0)
{
fOptions |= PLUGIN_OPTION_FIXED_BUFFER;
}
}

fOptions |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; fOptions |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES;


if (forcedStereoIn || forcedStereoOut) if (forcedStereoIn || forcedStereoOut)


+ 5
- 1
source/backend/standalone/CarlaStandalone.cpp View File

@@ -91,6 +91,10 @@ const char* carla_get_extended_license_text()
retText += "<li>VST plugin support, using official VST SDK 2.4 (trademark of Steinberg Media Technologies GmbH)</li>"; retText += "<li>VST plugin support, using official VST SDK 2.4 (trademark of Steinberg Media Technologies GmbH)</li>";
# endif # endif
#endif #endif
#ifdef WANT_AUDIOFILE
// TODO
//retText += "<li>ZynAddSubFX plugin code, http://zynaddsubfx.sf.net/</li>";
#endif
#ifdef WANT_ZYNADDSUBFX #ifdef WANT_ZYNADDSUBFX
retText += "<li>ZynAddSubFX plugin code, http://zynaddsubfx.sf.net/</li>"; retText += "<li>ZynAddSubFX plugin code, http://zynaddsubfx.sf.net/</li>";
#endif #endif
@@ -104,7 +108,7 @@ const char* carla_get_extended_license_text()
#ifdef WANT_LV2 #ifdef WANT_LV2
retText += "<li>serd, sord, sratom and lilv libraries for LV2 discovery, http://drobilla.net/software/lilv/</li>"; retText += "<li>serd, sord, sratom and lilv libraries for LV2 discovery, http://drobilla.net/software/lilv/</li>";
#endif #endif
#ifdef CARLA_ENGINE_RTAUDIO
#ifdef WANT_RTAUDIO
retText += "<li>RtAudio and RtMidi libraries for extra Audio and MIDI support, http://www.music.mcgill.ca/~gary/rtaudio/</li>"; retText += "<li>RtAudio and RtMidi libraries for extra Audio and MIDI support, http://www.music.mcgill.ca/~gary/rtaudio/</li>";
#endif #endif
retText += "</ul>"; retText += "</ul>";


+ 2
- 0
source/widgets/Makefile View File

@@ -13,6 +13,7 @@ BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore)
LINK_FLAGS += $(shell pkg-config --libs QtCore) LINK_FLAGS += $(shell pkg-config --libs QtCore)


FILES = \ FILES = \
moc_paramspinbox.cpp \
moc_pixmapkeyboard.cpp moc_pixmapkeyboard.cpp


OBJS = \ OBJS = \
@@ -21,6 +22,7 @@ OBJS = \
paramspinbox.cpp.o \ paramspinbox.cpp.o \
pixmapdial.cpp.o \ pixmapdial.cpp.o \
pixmapkeyboard.cpp.o \ pixmapkeyboard.cpp.o \
moc_paramspinbox.cpp.o \
moc_pixmapkeyboard.cpp.o moc_pixmapkeyboard.cpp.o


TARGET = ../libs/widgets.a TARGET = ../libs/widgets.a


Loading…
Cancel
Save