Browse Source

Carla: cleanup, fix LADSPA for forced-stereo

tags/v0.9.0
falkTX 12 years ago
parent
commit
cb4f2ac670
9 changed files with 753 additions and 648 deletions
  1. +262
    -202
      c++/carla-backend/carla_plugin.h
  2. +56
    -56
      c++/carla-backend/dssi.cpp
  3. +35
    -35
      c++/carla-backend/fluidsynth.cpp
  4. +238
    -209
      c++/carla-backend/ladspa.cpp
  5. +24
    -24
      c++/carla-backend/linuxsampler.cpp
  6. +60
    -60
      c++/carla-backend/lv2.cpp
  7. +52
    -52
      c++/carla-backend/vst.cpp
  8. +16
    -0
      c++/carla-includes/carla_osc_includes.h
  9. +10
    -10
      src/carla.py

+ 262
- 202
c++/carla-backend/carla_plugin.h
File diff suppressed because it is too large
View File


+ 56
- 56
c++/carla-backend/dssi.cpp View File

@@ -325,8 +325,8 @@ public:
// Delete old data // Delete old data
deleteBuffers(); deleteBuffers();


uint32_t ains, aouts, mins, params, j;
ains = aouts = mins = params = 0;
uint32_t aIns, aOuts, mIns, params, j;
aIns = aOuts = mIns = params = 0;


const double sampleRate = x_engine->getSampleRate(); const double sampleRate = x_engine->getSampleRate();
const unsigned long PortCount = ldescriptor->PortCount; const unsigned long PortCount = ldescriptor->PortCount;
@@ -337,30 +337,30 @@ public:
if (LADSPA_IS_PORT_AUDIO(PortType)) if (LADSPA_IS_PORT_AUDIO(PortType))
{ {
if (LADSPA_IS_PORT_INPUT(PortType)) if (LADSPA_IS_PORT_INPUT(PortType))
ains += 1;
aIns += 1;
else if (LADSPA_IS_PORT_OUTPUT(PortType)) else if (LADSPA_IS_PORT_OUTPUT(PortType))
aouts += 1;
aOuts += 1;
} }
else if (LADSPA_IS_PORT_CONTROL(PortType)) else if (LADSPA_IS_PORT_CONTROL(PortType))
params += 1; params += 1;
} }


if (carlaOptions.forceStereo && (ains == 1 || aouts == 1) && ! h2)
if (carlaOptions.forceStereo && (aIns == 1 || aOuts == 1) && ! h2)
h2 = ldescriptor->instantiate(ldescriptor, sampleRate); h2 = ldescriptor->instantiate(ldescriptor, sampleRate);


if (descriptor->run_synth || descriptor->run_multiple_synths) if (descriptor->run_synth || descriptor->run_multiple_synths)
mins = 1;
mIns = 1;


if (ains > 0)
if (aIns > 0)
{ {
ain.ports = new CarlaEngineAudioPort*[ains];
ain.rindexes = new uint32_t[ains];
aIn.ports = new CarlaEngineAudioPort*[aIns];
aIn.rindexes = new uint32_t[aIns];
} }


if (aouts > 0)
if (aOuts > 0)
{ {
aout.ports = new CarlaEngineAudioPort*[aouts];
aout.rindexes = new uint32_t[aouts];
aOut.ports = new CarlaEngineAudioPort*[aOuts];
aOut.rindexes = new uint32_t[aOuts];
} }


if (params > 0) if (params > 0)
@@ -395,15 +395,15 @@ public:


if (LADSPA_IS_PORT_INPUT(PortType)) if (LADSPA_IS_PORT_INPUT(PortType))
{ {
j = ain.count++;
ain.ports[j] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, true);
ain.rindexes[j] = i;
j = aIn.count++;
aIn.ports[j] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, true);
aIn.rindexes[j] = i;
} }
else if (LADSPA_IS_PORT_OUTPUT(PortType)) else if (LADSPA_IS_PORT_OUTPUT(PortType))
{ {
j = aout.count++;
aout.ports[j] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, false);
aout.rindexes[j] = i;
j = aOut.count++;
aOut.ports[j] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, false);
aOut.rindexes[j] = i;
needsCin = true; needsCin = true;
} }
else else
@@ -639,7 +639,7 @@ public:
param.portCout = (CarlaEngineControlPort*)x_client->addPort(CarlaEnginePortTypeControl, portName, false); param.portCout = (CarlaEngineControlPort*)x_client->addPort(CarlaEnginePortTypeControl, portName, false);
} }


if (mins > 0)
if (mIns > 0)
{ {
#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS)
@@ -654,14 +654,14 @@ public:
midi.portMin = (CarlaEngineMidiPort*)x_client->addPort(CarlaEnginePortTypeMIDI, portName, true); midi.portMin = (CarlaEngineMidiPort*)x_client->addPort(CarlaEnginePortTypeMIDI, portName, true);
} }


ain.count = ains;
aout.count = aouts;
aIn.count = aIns;
aOut.count = aOuts;
param.count = params; param.count = params;


// plugin checks // plugin checks
m_hints &= ~(PLUGIN_IS_SYNTH | PLUGIN_USES_CHUNKS | PLUGIN_CAN_DRYWET | PLUGIN_CAN_VOLUME | PLUGIN_CAN_BALANCE); m_hints &= ~(PLUGIN_IS_SYNTH | PLUGIN_USES_CHUNKS | PLUGIN_CAN_DRYWET | PLUGIN_CAN_VOLUME | PLUGIN_CAN_BALANCE);


if (midi.portMin && aout.count > 0)
if (midi.portMin && aOut.count > 0)
m_hints |= PLUGIN_IS_SYNTH; m_hints |= PLUGIN_IS_SYNTH;


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
@@ -672,13 +672,13 @@ public:
} }
#endif #endif


if (aouts > 0 && (ains == aouts || ains == 1))
if (aOuts > 0 && (aIns == aOuts || aIns == 1))
m_hints |= PLUGIN_CAN_DRYWET; m_hints |= PLUGIN_CAN_DRYWET;


if (aouts > 0)
if (aOuts > 0)
m_hints |= PLUGIN_CAN_VOLUME; m_hints |= PLUGIN_CAN_VOLUME;


if ((aouts >= 2 && aouts%2 == 0) || h2)
if ((aOuts >= 2 && aOuts%2 == 0) || h2)
m_hints |= PLUGIN_CAN_BALANCE; m_hints |= PLUGIN_CAN_BALANCE;


reloadPrograms(true); reloadPrograms(true);
@@ -794,9 +794,9 @@ public:
// -------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------
// Input VU // Input VU


if (ain.count > 0)
if (aIn.count > 0)
{ {
uint32_t count = h2 ? 2 : ain.count;
uint32_t count = h2 ? 2 : aIn.count;


if (count == 1) if (count == 1)
{ {
@@ -858,7 +858,7 @@ public:
double value; double value;


// Control backend stuff // Control backend stuff
if (cinEvent->channel == cin_channel)
if (cinEvent->channel == m_ctrlInChannel)
{ {
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(cinEvent->controller) && (m_hints & PLUGIN_CAN_DRYWET) > 0) if (MIDI_IS_CONTROL_BREATH_CONTROLLER(cinEvent->controller) && (m_hints & PLUGIN_CAN_DRYWET) > 0)
{ {
@@ -938,12 +938,12 @@ public:
} }


case CarlaEngineEventMidiBankChange: case CarlaEngineEventMidiBankChange:
if (cinEvent->channel == cin_channel)
if (cinEvent->channel == m_ctrlInChannel)
nextBankId = rint(cinEvent->value); nextBankId = rint(cinEvent->value);
break; break;


case CarlaEngineEventMidiProgramChange: case CarlaEngineEventMidiProgramChange:
if (cinEvent->channel == cin_channel)
if (cinEvent->channel == m_ctrlInChannel)
{ {
uint32_t nextProgramId = rint(cinEvent->value); uint32_t nextProgramId = rint(cinEvent->value);


@@ -960,7 +960,7 @@ public:
break; break;


case CarlaEngineEventAllSoundOff: case CarlaEngineEventAllSoundOff:
if (cinEvent->channel == cin_channel)
if (cinEvent->channel == m_ctrlInChannel)
{ {
if (midi.portMin && ! allNotesOffSent) if (midi.portMin && ! allNotesOffSent)
sendMidiAllNotesOff(); sendMidiAllNotesOff();
@@ -982,7 +982,7 @@ public:
break; break;


case CarlaEngineEventAllNotesOff: case CarlaEngineEventAllNotesOff:
if (cinEvent->channel == cin_channel)
if (cinEvent->channel == m_ctrlInChannel)
{ {
if (midi.portMin && ! allNotesOffSent) if (midi.portMin && ! allNotesOffSent)
sendMidiAllNotesOff(); sendMidiAllNotesOff();
@@ -999,7 +999,7 @@ public:
// -------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------
// MIDI Input (External) // MIDI Input (External)


if (midi.portMin && cin_channel >= 0 && cin_channel < 16 && m_active && m_activeBefore)
if (midi.portMin && m_ctrlInChannel >= 0 && m_ctrlInChannel < 16 && m_active && m_activeBefore)
{ {
engineMidiLock(); engineMidiLock();


@@ -1012,7 +1012,7 @@ public:
memset(midiEvent, 0, sizeof(snd_seq_event_t)); memset(midiEvent, 0, sizeof(snd_seq_event_t));


midiEvent->type = extMidiNotes[i].velo ? SND_SEQ_EVENT_NOTEON : SND_SEQ_EVENT_NOTEOFF; midiEvent->type = extMidiNotes[i].velo ? SND_SEQ_EVENT_NOTEON : SND_SEQ_EVENT_NOTEOFF;
midiEvent->data.note.channel = cin_channel;
midiEvent->data.note.channel = m_ctrlInChannel;
midiEvent->data.note.note = extMidiNotes[i].note; midiEvent->data.note.note = extMidiNotes[i].note;
midiEvent->data.note.velocity = extMidiNotes[i].velo; midiEvent->data.note.velocity = extMidiNotes[i].velo;


@@ -1066,7 +1066,7 @@ public:
midiEvent->data.note.channel = channel; midiEvent->data.note.channel = channel;
midiEvent->data.note.note = note; midiEvent->data.note.note = note;


if (channel == cin_channel)
if (channel == m_ctrlInChannel)
postponeEvent(PluginPostEventNoteOff, channel, note, 0.0); postponeEvent(PluginPostEventNoteOff, channel, note, 0.0);
} }
else if (MIDI_IS_STATUS_NOTE_ON(status)) else if (MIDI_IS_STATUS_NOTE_ON(status))
@@ -1079,7 +1079,7 @@ public:
midiEvent->data.note.note = note; midiEvent->data.note.note = note;
midiEvent->data.note.velocity = velo; midiEvent->data.note.velocity = velo;


if (channel == cin_channel)
if (channel == m_ctrlInChannel)
postponeEvent(PluginPostEventNoteOn, channel, note, velo); postponeEvent(PluginPostEventNoteOn, channel, note, velo);
} }
else if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status)) else if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status))
@@ -1140,16 +1140,16 @@ public:
{ {
if (! m_activeBefore) if (! m_activeBefore)
{ {
if (midi.portMin && cin_channel >= 0 && cin_channel < 16)
if (midi.portMin && m_ctrlInChannel >= 0 && m_ctrlInChannel < 16)
{ {
memset(&midiEvents[0], 0, sizeof(snd_seq_event_t)); memset(&midiEvents[0], 0, sizeof(snd_seq_event_t));
midiEvents[0].type = SND_SEQ_EVENT_CONTROLLER; midiEvents[0].type = SND_SEQ_EVENT_CONTROLLER;
midiEvents[0].data.control.channel = cin_channel;
midiEvents[0].data.control.channel = m_ctrlInChannel;
midiEvents[0].data.control.param = MIDI_CONTROL_ALL_SOUND_OFF; midiEvents[0].data.control.param = MIDI_CONTROL_ALL_SOUND_OFF;


memset(&midiEvents[1], 0, sizeof(snd_seq_event_t)); memset(&midiEvents[1], 0, sizeof(snd_seq_event_t));
midiEvents[1].type = SND_SEQ_EVENT_CONTROLLER; midiEvents[1].type = SND_SEQ_EVENT_CONTROLLER;
midiEvents[1].data.control.channel = cin_channel;
midiEvents[1].data.control.channel = m_ctrlInChannel;
midiEvents[1].data.control.param = MIDI_CONTROL_ALL_NOTES_OFF; midiEvents[1].data.control.param = MIDI_CONTROL_ALL_NOTES_OFF;


midiEventCount = 2; midiEventCount = 2;
@@ -1162,16 +1162,16 @@ public:
} }
} }


for (i=0; i < ain.count; i++)
for (i=0; i < aIn.count; i++)
{ {
ldescriptor->connect_port(handle, ain.rindexes[i], inBuffer[i]);
if (h2 && i == 0) ldescriptor->connect_port(h2, ain.rindexes[i], inBuffer[1]);
ldescriptor->connect_port(handle, aIn.rindexes[i], inBuffer[i]);
if (h2 && i == 0) ldescriptor->connect_port(h2, aIn.rindexes[i], inBuffer[1]);
} }


for (i=0; i < aout.count; i++)
for (i=0; i < aOut.count; i++)
{ {
ldescriptor->connect_port(handle, aout.rindexes[i], outBuffer[i]);
if (h2 && i == 0) ldescriptor->connect_port(h2, aout.rindexes[i], outBuffer[1]);
ldescriptor->connect_port(handle, aOut.rindexes[i], outBuffer[i]);
if (h2 && i == 0) ldescriptor->connect_port(h2, aOut.rindexes[i], outBuffer[1]);
} }


if (descriptor->run_synth) if (descriptor->run_synth)
@@ -1211,14 +1211,14 @@ public:


if (m_active) if (m_active)
{ {
bool do_drywet = (m_hints & PLUGIN_CAN_DRYWET) > 0 && x_drywet != 1.0;
bool do_volume = (m_hints & PLUGIN_CAN_VOLUME) > 0 && x_vol != 1.0;
bool do_balance = (m_hints & PLUGIN_CAN_BALANCE) > 0 && (x_bal_left != -1.0 || x_bal_right != 1.0);
bool do_drywet = (m_hints & PLUGIN_CAN_DRYWET) > 0 && x_dryWet != 1.0;
bool do_volume = (m_hints & PLUGIN_CAN_VOLUME) > 0 && x_volume != 1.0;
bool do_balance = (m_hints & PLUGIN_CAN_BALANCE) > 0 && (x_balanceLeft != -1.0 || x_balanceRight != 1.0);


double bal_rangeL, bal_rangeR; double bal_rangeL, bal_rangeR;
float oldBufLeft[do_balance ? frames : 0]; float oldBufLeft[do_balance ? frames : 0];


uint32_t count = h2 ? 2 : aout.count;
uint32_t count = h2 ? 2 : aOut.count;


for (i=0; i < count; i++) for (i=0; i < count; i++)
{ {
@@ -1227,10 +1227,10 @@ public:
{ {
for (k=0; k < frames; k++) for (k=0; k < frames; k++)
{ {
if (aout.count == 1 && ! h2)
outBuffer[i][k] = (outBuffer[i][k]*x_drywet)+(inBuffer[0][k]*(1.0-x_drywet));
if (aOut.count == 1 && ! h2)
outBuffer[i][k] = (outBuffer[i][k]*x_dryWet)+(inBuffer[0][k]*(1.0-x_dryWet));
else else
outBuffer[i][k] = (outBuffer[i][k]*x_drywet)+(inBuffer[i][k]*(1.0-x_drywet));
outBuffer[i][k] = (outBuffer[i][k]*x_dryWet)+(inBuffer[i][k]*(1.0-x_dryWet));
} }
} }


@@ -1240,8 +1240,8 @@ public:
if (i%2 == 0) if (i%2 == 0)
memcpy(&oldBufLeft, outBuffer[i], sizeof(float)*frames); memcpy(&oldBufLeft, outBuffer[i], sizeof(float)*frames);


bal_rangeL = (x_bal_left+1.0)/2;
bal_rangeR = (x_bal_right+1.0)/2;
bal_rangeL = (x_balanceLeft+1.0)/2;
bal_rangeR = (x_balanceRight+1.0)/2;


for (k=0; k < frames; k++) for (k=0; k < frames; k++)
{ {
@@ -1264,7 +1264,7 @@ public:
if (do_volume) if (do_volume)
{ {
for (k=0; k < frames; k++) for (k=0; k < frames; k++)
outBuffer[i][k] *= x_vol;
outBuffer[i][k] *= x_volume;
} }


// Output VU // Output VU
@@ -1278,7 +1278,7 @@ public:
else else
{ {
// disable any output sound if not active // disable any output sound if not active
for (i=0; i < aout.count; i++)
for (i=0; i < aOut.count; i++)
memset(outBuffer[i], 0.0f, sizeof(float)*frames); memset(outBuffer[i], 0.0f, sizeof(float)*frames);


aouts_peak_tmp[0] = 0.0; aouts_peak_tmp[0] = 0.0;


+ 35
- 35
c++/carla-backend/fluidsynth.cpp View File

@@ -359,7 +359,7 @@ public:
{ {
Q_ASSERT(index < (int32_t)midiprog.count); Q_ASSERT(index < (int32_t)midiprog.count);


if (cin_channel < 0 || cin_channel > 15)
if (m_ctrlInChannel < 0 || m_ctrlInChannel > 15)
return; return;


if (index >= 0) if (index >= 0)
@@ -367,12 +367,12 @@ public:
if (x_engine->isOffline()) if (x_engine->isOffline())
{ {
const CarlaEngine::ScopedLocker m(x_engine, block); const CarlaEngine::ScopedLocker m(x_engine, block);
fluid_synth_program_select(f_synth, cin_channel, f_id, midiprog.data[index].bank, midiprog.data[index].program);
fluid_synth_program_select(f_synth, m_ctrlInChannel, f_id, midiprog.data[index].bank, midiprog.data[index].program);
} }
else else
{ {
const ScopedDisabler m(this, block); const ScopedDisabler m(this, block);
fluid_synth_program_select(f_synth, cin_channel, f_id, midiprog.data[index].bank, midiprog.data[index].program);
fluid_synth_program_select(f_synth, m_ctrlInChannel, f_id, midiprog.data[index].bank, midiprog.data[index].program);
} }
} }


@@ -398,12 +398,12 @@ public:
// Delete old data // Delete old data
deleteBuffers(); deleteBuffers();


uint32_t aouts, params, j;
aouts = 2;
uint32_t aOuts, params, j;
aOuts = 2;
params = FluidSynthParametersMax; params = FluidSynthParametersMax;


aout.ports = new CarlaEngineAudioPort*[aouts];
aout.rindexes = new uint32_t[aouts];
aOut.ports = new CarlaEngineAudioPort*[aOuts];
aOut.rindexes = new uint32_t[aOuts];


param.data = new ParameterData[params]; param.data = new ParameterData[params];
param.ranges = new ParameterRanges[params]; param.ranges = new ParameterRanges[params];
@@ -424,8 +424,8 @@ public:
#endif #endif
strcpy(portName, "out-left"); strcpy(portName, "out-left");


aout.ports[0] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, false);
aout.rindexes[0] = 0;
aOut.ports[0] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, false);
aOut.rindexes[0] = 0;


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS)
@@ -437,8 +437,8 @@ public:
#endif #endif
strcpy(portName, "out-right"); strcpy(portName, "out-right");


aout.ports[1] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, false);
aout.rindexes[1] = 1;
aOut.ports[1] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, false);
aOut.rindexes[1] = 1;


// --------------------------------------- // ---------------------------------------
// MIDI Input // MIDI Input
@@ -708,7 +708,7 @@ public:


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


aout.count = aouts;
aOut.count = aOuts;
param.count = params; param.count = params;


// plugin checks // plugin checks
@@ -827,8 +827,8 @@ public:


unsigned char nextBankIds[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0 }; unsigned char nextBankIds[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0 };


if (midiprog.current >= 0 && midiprog.count > 0 && cin_channel >= 0 && cin_channel < 16)
nextBankIds[cin_channel] = midiprog.data[midiprog.current].bank;
if (midiprog.current >= 0 && midiprog.count > 0 && m_ctrlInChannel >= 0 && m_ctrlInChannel < 16)
nextBankIds[m_ctrlInChannel] = midiprog.data[midiprog.current].bank;


for (i=0; i < nEvents; i++) for (i=0; i < nEvents; i++)
{ {
@@ -853,7 +853,7 @@ public:
double value; double value;


// Control backend stuff // Control backend stuff
if (cinEvent->channel == cin_channel)
if (cinEvent->channel == m_ctrlInChannel)
{ {
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(cinEvent->controller) && (m_hints & PLUGIN_CAN_DRYWET) > 0) if (MIDI_IS_CONTROL_BREATH_CONTROLLER(cinEvent->controller) && (m_hints & PLUGIN_CAN_DRYWET) > 0)
{ {
@@ -947,7 +947,7 @@ public:
{ {
if (midiprog.data[k].bank == bankId && midiprog.data[k].program == progId) if (midiprog.data[k].bank == bankId && midiprog.data[k].program == progId)
{ {
if (cinEvent->channel == cin_channel)
if (cinEvent->channel == m_ctrlInChannel)
{ {
setMidiProgram(k, false, false, false, false); setMidiProgram(k, false, false, false, false);
postponeEvent(PluginPostEventMidiProgramChange, k, 0, 0.0); postponeEvent(PluginPostEventMidiProgramChange, k, 0, 0.0);
@@ -962,7 +962,7 @@ public:
break; break;


case CarlaEngineEventAllSoundOff: case CarlaEngineEventAllSoundOff:
if (cinEvent->channel == cin_channel)
if (cinEvent->channel == m_ctrlInChannel)
{ {
if (! allNotesOffSent) if (! allNotesOffSent)
sendMidiAllNotesOff(); sendMidiAllNotesOff();
@@ -970,8 +970,8 @@ public:
allNotesOffSent = true; allNotesOffSent = true;


#ifdef FLUIDSYNTH_VERSION_NEW_API #ifdef FLUIDSYNTH_VERSION_NEW_API
fluid_synth_all_notes_off(f_synth, cin_channel);
fluid_synth_all_sounds_off(f_synth, cin_channel);
fluid_synth_all_notes_off(f_synth, m_ctrlInChannel);
fluid_synth_all_sounds_off(f_synth, m_ctrlInChannel);
} }
else if (cinEvent->channel < 16) else if (cinEvent->channel < 16)
{ {
@@ -982,7 +982,7 @@ public:
break; break;


case CarlaEngineEventAllNotesOff: case CarlaEngineEventAllNotesOff:
if (cinEvent->channel == cin_channel)
if (cinEvent->channel == m_ctrlInChannel)
{ {
if (! allNotesOffSent) if (! allNotesOffSent)
sendMidiAllNotesOff(); sendMidiAllNotesOff();
@@ -990,7 +990,7 @@ public:
allNotesOffSent = true; allNotesOffSent = true;


#ifdef FLUIDSYNTH_VERSION_NEW_API #ifdef FLUIDSYNTH_VERSION_NEW_API
fluid_synth_all_notes_off(f_synth, cin_channel);
fluid_synth_all_notes_off(f_synth, m_ctrlInChannel);
} }
else if (cinEvent->channel < 16) else if (cinEvent->channel < 16)
{ {
@@ -1007,7 +1007,7 @@ public:
// -------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------
// MIDI Input (External) // MIDI Input (External)


if (cin_channel >= 0 && cin_channel < 16 && m_active && m_activeBefore)
if (m_ctrlInChannel >= 0 && m_ctrlInChannel < 16 && m_active && m_activeBefore)
{ {
engineMidiLock(); engineMidiLock();


@@ -1017,9 +1017,9 @@ public:
break; break;


if (extMidiNotes[i].velo) if (extMidiNotes[i].velo)
fluid_synth_noteon(f_synth, cin_channel, extMidiNotes[i].note, extMidiNotes[i].velo);
fluid_synth_noteon(f_synth, m_ctrlInChannel, extMidiNotes[i].note, extMidiNotes[i].velo);
else else
fluid_synth_noteoff(f_synth, cin_channel, extMidiNotes[i].note);
fluid_synth_noteoff(f_synth, m_ctrlInChannel, extMidiNotes[i].note);


extMidiNotes[i].channel = -1; extMidiNotes[i].channel = -1;
midiEventCount += 1; midiEventCount += 1;
@@ -1064,7 +1064,7 @@ public:


fluid_synth_noteoff(f_synth, channel, note); fluid_synth_noteoff(f_synth, channel, note);


if (channel == cin_channel)
if (channel == m_ctrlInChannel)
postponeEvent(PluginPostEventNoteOff, channel, note, 0.0); postponeEvent(PluginPostEventNoteOff, channel, note, 0.0);
} }
else if (MIDI_IS_STATUS_NOTE_ON(status)) else if (MIDI_IS_STATUS_NOTE_ON(status))
@@ -1074,7 +1074,7 @@ public:


fluid_synth_noteon(f_synth, channel, note, velo); fluid_synth_noteon(f_synth, channel, note, velo);


if (channel == cin_channel)
if (channel == m_ctrlInChannel)
postponeEvent(PluginPostEventNoteOn, channel, note, velo); postponeEvent(PluginPostEventNoteOn, channel, note, velo);
} }
else if (MIDI_IS_STATUS_AFTERTOUCH(status)) else if (MIDI_IS_STATUS_AFTERTOUCH(status))
@@ -1106,10 +1106,10 @@ public:
{ {
if (! m_activeBefore) if (! m_activeBefore)
{ {
if (cin_channel >= 0 && cin_channel < 16)
if (m_ctrlInChannel >= 0 && m_ctrlInChannel < 16)
{ {
fluid_synth_cc(f_synth, cin_channel, MIDI_CONTROL_ALL_SOUND_OFF, 0);
fluid_synth_cc(f_synth, cin_channel, MIDI_CONTROL_ALL_NOTES_OFF, 0);
fluid_synth_cc(f_synth, m_ctrlInChannel, MIDI_CONTROL_ALL_SOUND_OFF, 0);
fluid_synth_cc(f_synth, m_ctrlInChannel, MIDI_CONTROL_ALL_NOTES_OFF, 0);
} }


#ifdef FLUIDSYNTH_VERSION_NEW_API #ifdef FLUIDSYNTH_VERSION_NEW_API
@@ -1131,12 +1131,12 @@ public:


if (m_active) if (m_active)
{ {
bool do_balance = (x_bal_left != -1.0 || x_bal_right != 1.0);
bool do_balance = (x_balanceLeft != -1.0 || x_balanceRight != 1.0);


double bal_rangeL, bal_rangeR; double bal_rangeL, bal_rangeR;
float oldBufLeft[do_balance ? frames : 0]; float oldBufLeft[do_balance ? frames : 0];


for (i=0; i < aout.count; i++)
for (i=0; i < aOut.count; i++)
{ {
// Balance // Balance
if (do_balance) if (do_balance)
@@ -1144,8 +1144,8 @@ public:
if (i%2 == 0) if (i%2 == 0)
memcpy(&oldBufLeft, outBuffer[i], sizeof(float)*frames); memcpy(&oldBufLeft, outBuffer[i], sizeof(float)*frames);


bal_rangeL = (x_bal_left+1.0)/2;
bal_rangeR = (x_bal_right+1.0)/2;
bal_rangeL = (x_balanceLeft+1.0)/2;
bal_rangeR = (x_balanceRight+1.0)/2;


for (k=0; k < frames; k++) for (k=0; k < frames; k++)
{ {
@@ -1165,7 +1165,7 @@ public:
} }


// Volume, using fluidsynth internals // Volume, using fluidsynth internals
fluid_synth_set_gain(f_synth, x_vol);
fluid_synth_set_gain(f_synth, x_volume);


// Output VU // Output VU
for (k=0; i < 2 && k < frames; k++) for (k=0; i < 2 && k < frames; k++)
@@ -1178,7 +1178,7 @@ public:
else else
{ {
// disable any output sound if not active // disable any output sound if not active
for (i=0; i < aout.count; i++)
for (i=0; i < aOut.count; i++)
memset(outBuffer[i], 0.0f, sizeof(float)*frames); memset(outBuffer[i], 0.0f, sizeof(float)*frames);


aouts_peak_tmp[0] = 0.0; aouts_peak_tmp[0] = 0.0;


+ 238
- 209
c++/carla-backend/ladspa.cpp View File

@@ -35,14 +35,15 @@ CARLA_BACKEND_START_NAMESPACE
class LadspaPlugin : public CarlaPlugin class LadspaPlugin : public CarlaPlugin
{ {
public: public:
LadspaPlugin(CarlaEngine* const engine, unsigned short id) : CarlaPlugin(engine, id)
LadspaPlugin(CarlaEngine* const engine, const unsigned short id)
: CarlaPlugin(engine, id)
{ {
qDebug("LadspaPlugin::LadspaPlugin()"); qDebug("LadspaPlugin::LadspaPlugin()");


m_type = PLUGIN_LADSPA; m_type = PLUGIN_LADSPA;


handle = h2 = nullptr; handle = h2 = nullptr;
descriptor = nullptr;
descriptor = nullptr;
rdf_descriptor = nullptr; rdf_descriptor = nullptr;


param_buffers = nullptr; param_buffers = nullptr;
@@ -82,34 +83,34 @@ public:
{ {
if (rdf_descriptor) if (rdf_descriptor)
{ {
LADSPA_Properties Category = rdf_descriptor->Type;
const LADSPA_Properties category = rdf_descriptor->Type;


// Specific Types // Specific Types
if (Category & (LADSPA_CLASS_DELAY|LADSPA_CLASS_REVERB))
if (category & (LADSPA_CLASS_DELAY|LADSPA_CLASS_REVERB))
return PLUGIN_CATEGORY_DELAY; return PLUGIN_CATEGORY_DELAY;
if (Category & (LADSPA_CLASS_PHASER|LADSPA_CLASS_FLANGER|LADSPA_CLASS_CHORUS))
if (category & (LADSPA_CLASS_PHASER|LADSPA_CLASS_FLANGER|LADSPA_CLASS_CHORUS))
return PLUGIN_CATEGORY_MODULATOR; return PLUGIN_CATEGORY_MODULATOR;
if (Category & (LADSPA_CLASS_AMPLIFIER))
if (category & (LADSPA_CLASS_AMPLIFIER))
return PLUGIN_CATEGORY_DYNAMICS; return PLUGIN_CATEGORY_DYNAMICS;
if (Category & (LADSPA_CLASS_UTILITY|LADSPA_CLASS_SPECTRAL|LADSPA_CLASS_FREQUENCY_METER))
if (category & (LADSPA_CLASS_UTILITY|LADSPA_CLASS_SPECTRAL|LADSPA_CLASS_FREQUENCY_METER))
return PLUGIN_CATEGORY_UTILITY; return PLUGIN_CATEGORY_UTILITY;


// Pre-set LADSPA Types // Pre-set LADSPA Types
if (LADSPA_IS_PLUGIN_DYNAMICS(Category))
if (LADSPA_IS_PLUGIN_DYNAMICS(category))
return PLUGIN_CATEGORY_DYNAMICS; return PLUGIN_CATEGORY_DYNAMICS;
if (LADSPA_IS_PLUGIN_AMPLITUDE(Category))
if (LADSPA_IS_PLUGIN_AMPLITUDE(category))
return PLUGIN_CATEGORY_MODULATOR; return PLUGIN_CATEGORY_MODULATOR;
if (LADSPA_IS_PLUGIN_EQ(Category))
if (LADSPA_IS_PLUGIN_EQ(category))
return PLUGIN_CATEGORY_EQ; return PLUGIN_CATEGORY_EQ;
if (LADSPA_IS_PLUGIN_FILTER(Category))
if (LADSPA_IS_PLUGIN_FILTER(category))
return PLUGIN_CATEGORY_FILTER; return PLUGIN_CATEGORY_FILTER;
if (LADSPA_IS_PLUGIN_FREQUENCY(Category))
if (LADSPA_IS_PLUGIN_FREQUENCY(category))
return PLUGIN_CATEGORY_UTILITY; return PLUGIN_CATEGORY_UTILITY;
if (LADSPA_IS_PLUGIN_SIMULATOR(Category))
if (LADSPA_IS_PLUGIN_SIMULATOR(category))
return PLUGIN_CATEGORY_OTHER; return PLUGIN_CATEGORY_OTHER;
if (LADSPA_IS_PLUGIN_TIME(Category))
if (LADSPA_IS_PLUGIN_TIME(category))
return PLUGIN_CATEGORY_DELAY; return PLUGIN_CATEGORY_DELAY;
if (LADSPA_IS_PLUGIN_GENERATOR(Category))
if (LADSPA_IS_PLUGIN_GENERATOR(category))
return PLUGIN_CATEGORY_SYNTH; return PLUGIN_CATEGORY_SYNTH;
} }


@@ -118,19 +119,27 @@ public:


long uniqueId() long uniqueId()
{ {
Q_ASSERT(descriptor);

return descriptor->UniqueID; return descriptor->UniqueID;
} }


// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Information (count) // Information (count)


uint32_t parameterScalePointCount(uint32_t parameterId)
uint32_t parameterScalePointCount(const uint32_t parameterId)
{ {
Q_ASSERT(parameterId < param.count); Q_ASSERT(parameterId < param.count);

int32_t rindex = param.data[parameterId].rindex; int32_t rindex = param.data[parameterId].rindex;


if (rdf_descriptor && rindex < (int32_t)rdf_descriptor->PortCount) if (rdf_descriptor && rindex < (int32_t)rdf_descriptor->PortCount)
return rdf_descriptor->Ports[rindex].ScalePointCount;
{
const LADSPA_RDF_Port* const port = &rdf_descriptor->Ports[rindex];

if (port)
return port->ScalePointCount;
}


return 0; return 0;
} }
@@ -138,24 +147,31 @@ public:
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Information (per-plugin data) // Information (per-plugin data)


double getParameterValue(uint32_t parameterId)
double getParameterValue(const uint32_t parameterId)
{ {
Q_ASSERT(parameterId < param.count); Q_ASSERT(parameterId < param.count);

return param_buffers[parameterId]; return param_buffers[parameterId];
} }


double getParameterScalePointValue(uint32_t parameterId, uint32_t scalePointId)
double getParameterScalePointValue(const uint32_t parameterId, const uint32_t scalePointId)
{ {
Q_ASSERT(parameterId < param.count); Q_ASSERT(parameterId < param.count);
Q_ASSERT(scalePointId < parameterScalePointCount(parameterId)); Q_ASSERT(scalePointId < parameterScalePointCount(parameterId));

int32_t rindex = param.data[parameterId].rindex; int32_t rindex = param.data[parameterId].rindex;


if (rdf_descriptor && rindex < (int32_t)rdf_descriptor->PortCount) if (rdf_descriptor && rindex < (int32_t)rdf_descriptor->PortCount)
{ {
const LADSPA_RDF_ScalePoint* const scalePoint = &rdf_descriptor->Ports[rindex].ScalePoints[scalePointId];
const LADSPA_RDF_Port* const port = &rdf_descriptor->Ports[rindex];

if (port && scalePointId < port->ScalePointCount)
{
const LADSPA_RDF_ScalePoint* const scalePoint = &port->ScalePoints[scalePointId];


if (scalePoint)
return rdf_descriptor->Ports[rindex].ScalePoints[scalePointId].Value;
if (scalePoint)
return scalePoint->Value;
}
} }


return 0.0; return 0.0;
@@ -163,7 +179,9 @@ public:


void getLabel(char* const strBuf) void getLabel(char* const strBuf)
{ {
if (descriptor->Label)
Q_ASSERT(descriptor);

if (descriptor && descriptor->Label)
strncpy(strBuf, descriptor->Label, STR_MAX); strncpy(strBuf, descriptor->Label, STR_MAX);
else else
CarlaPlugin::getLabel(strBuf); CarlaPlugin::getLabel(strBuf);
@@ -171,9 +189,11 @@ public:


void getMaker(char* const strBuf) void getMaker(char* const strBuf)
{ {
Q_ASSERT(descriptor);

if (rdf_descriptor && rdf_descriptor->Creator) if (rdf_descriptor && rdf_descriptor->Creator)
strncpy(strBuf, rdf_descriptor->Creator, STR_MAX); strncpy(strBuf, rdf_descriptor->Creator, STR_MAX);
else if (descriptor->Maker)
else if (descriptor && descriptor->Maker)
strncpy(strBuf, descriptor->Maker, STR_MAX); strncpy(strBuf, descriptor->Maker, STR_MAX);
else else
CarlaPlugin::getMaker(strBuf); CarlaPlugin::getMaker(strBuf);
@@ -181,7 +201,9 @@ public:


void getCopyright(char* const strBuf) void getCopyright(char* const strBuf)
{ {
if (descriptor->Copyright)
Q_ASSERT(descriptor);

if (descriptor && descriptor->Copyright)
strncpy(strBuf, descriptor->Copyright, STR_MAX); strncpy(strBuf, descriptor->Copyright, STR_MAX);
else else
CarlaPlugin::getCopyright(strBuf); CarlaPlugin::getCopyright(strBuf);
@@ -189,53 +211,62 @@ public:


void getRealName(char* const strBuf) void getRealName(char* const strBuf)
{ {
Q_ASSERT(descriptor);

if (rdf_descriptor && rdf_descriptor->Title) if (rdf_descriptor && rdf_descriptor->Title)
strncpy(strBuf, rdf_descriptor->Title, STR_MAX); strncpy(strBuf, rdf_descriptor->Title, STR_MAX);
else if (descriptor->Name)
else if (descriptor && descriptor->Name)
strncpy(strBuf, descriptor->Name, STR_MAX); strncpy(strBuf, descriptor->Name, STR_MAX);
else else
CarlaPlugin::getRealName(strBuf); CarlaPlugin::getRealName(strBuf);
} }


void getParameterName(uint32_t parameterId, char* const strBuf)
void getParameterName(const uint32_t parameterId, char* const strBuf)
{ {
Q_ASSERT(descriptor);
Q_ASSERT(parameterId < param.count); Q_ASSERT(parameterId < param.count);

int32_t rindex = param.data[parameterId].rindex; int32_t rindex = param.data[parameterId].rindex;


strncpy(strBuf, descriptor->PortNames[rindex], STR_MAX);
if (descriptor && rindex < (int32_t)descriptor->PortCount)
strncpy(strBuf, descriptor->PortNames[rindex], STR_MAX);
else
CarlaPlugin::getParameterName(parameterId, strBuf);
} }


void getParameterSymbol(uint32_t parameterId, char* const strBuf)
void getParameterSymbol(const uint32_t parameterId, char* const strBuf)
{ {
Q_ASSERT(parameterId < param.count); Q_ASSERT(parameterId < param.count);

int32_t rindex = param.data[parameterId].rindex; int32_t rindex = param.data[parameterId].rindex;


if (rdf_descriptor && rindex < (int32_t)rdf_descriptor->PortCount) if (rdf_descriptor && rindex < (int32_t)rdf_descriptor->PortCount)
{ {
const LADSPA_RDF_Port* const Port = &rdf_descriptor->Ports[rindex];
const LADSPA_RDF_Port* const port = &rdf_descriptor->Ports[rindex];


if (LADSPA_PORT_HAS_LABEL(Port->Hints) && Port->Label)
if (LADSPA_PORT_HAS_LABEL(port->Hints) && port->Label)
{ {
strncpy(strBuf, Port->Label, STR_MAX);
strncpy(strBuf, port->Label, STR_MAX);
return; return;
} }
} }


*strBuf = 0;
CarlaPlugin::getParameterSymbol(parameterId, strBuf);
} }


void getParameterUnit(uint32_t parameterId, char* const strBuf)
void getParameterUnit(const uint32_t parameterId, char* const strBuf)
{ {
Q_ASSERT(parameterId < param.count); Q_ASSERT(parameterId < param.count);

int32_t rindex = param.data[parameterId].rindex; int32_t rindex = param.data[parameterId].rindex;


if (rdf_descriptor && rindex < (int32_t)rdf_descriptor->PortCount) if (rdf_descriptor && rindex < (int32_t)rdf_descriptor->PortCount)
{ {
const LADSPA_RDF_Port* const Port = &rdf_descriptor->Ports[rindex];
const LADSPA_RDF_Port* const port = &rdf_descriptor->Ports[rindex];


if (LADSPA_PORT_HAS_UNIT(Port->Hints))
if (LADSPA_PORT_HAS_UNIT(port->Hints))
{ {
switch (Port->Unit)
switch (port->Unit)
{ {
case LADSPA_UNIT_DB: case LADSPA_UNIT_DB:
strncpy(strBuf, "dB", STR_MAX); strncpy(strBuf, "dB", STR_MAX);
@@ -259,36 +290,41 @@ public:
} }
} }


*strBuf = 0;
CarlaPlugin::getParameterUnit(parameterId, strBuf);
} }


void getParameterScalePointLabel(uint32_t parameterId, uint32_t scalePointId, char* const strBuf)
void getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf)
{ {
Q_ASSERT(parameterId < param.count); Q_ASSERT(parameterId < param.count);
Q_ASSERT(scalePointId < parameterScalePointCount(parameterId)); Q_ASSERT(scalePointId < parameterScalePointCount(parameterId));

int32_t rindex = param.data[parameterId].rindex; int32_t rindex = param.data[parameterId].rindex;


if (rdf_descriptor && rindex < (int32_t)rdf_descriptor->PortCount) if (rdf_descriptor && rindex < (int32_t)rdf_descriptor->PortCount)
{ {
const LADSPA_RDF_ScalePoint* const scalePoint = &rdf_descriptor->Ports[rindex].ScalePoints[scalePointId];
const LADSPA_RDF_Port* const port = &rdf_descriptor->Ports[rindex];


if (scalePoint && scalePoint->Label)
if (port && scalePointId < port->ScalePointCount)
{ {
strncpy(strBuf, rdf_descriptor->Ports[rindex].ScalePoints[scalePointId].Label, STR_MAX);
return;
const LADSPA_RDF_ScalePoint* const scalePoint = &port->ScalePoints[scalePointId];

if (scalePoint && scalePoint->Label)
strncpy(strBuf, scalePoint->Label, STR_MAX);
} }
} }


*strBuf = 0;
CarlaPlugin::getParameterScalePointLabel(parameterId, scalePointId, strBuf);
} }


// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Set data (plugin-specific stuff) // Set data (plugin-specific stuff)


void setParameterValue(uint32_t parameterId, double value, bool sendGui, bool sendOsc, bool sendCallback)
void setParameterValue(const uint32_t parameterId, double value, const bool sendGui, const bool sendOsc, const bool sendCallback)
{ {
Q_ASSERT(parameterId < param.count); Q_ASSERT(parameterId < param.count);

param_buffers[parameterId] = fixParameterValue(value, param.ranges[parameterId]); param_buffers[parameterId] = fixParameterValue(value, param.ranges[parameterId]);

CarlaPlugin::setParameterValue(parameterId, value, sendGui, sendOsc, sendCallback); CarlaPlugin::setParameterValue(parameterId, value, sendGui, sendOsc, sendCallback);
} }


@@ -311,39 +347,57 @@ public:
// Delete old data // Delete old data
deleteBuffers(); deleteBuffers();


uint32_t ains, aouts, params, j;
ains = aouts = params = 0;
uint32_t aIns, aOuts, params, j;
aIns = aOuts = params = 0;


const double sampleRate = x_engine->getSampleRate(); const double sampleRate = x_engine->getSampleRate();
const unsigned long PortCount = descriptor->PortCount;
const unsigned long portCount = descriptor->PortCount;

bool forcedStereoIn, forcedStereoOut;
forcedStereoIn = forcedStereoOut = false;


for (unsigned long i=0; i < PortCount; i++)
for (unsigned long i=0; i < portCount; i++)
{ {
const LADSPA_PortDescriptor PortType = descriptor->PortDescriptors[i];
if (LADSPA_IS_PORT_AUDIO(PortType))
const LADSPA_PortDescriptor portType = descriptor->PortDescriptors[i];

if (LADSPA_IS_PORT_AUDIO(portType))
{ {
if (LADSPA_IS_PORT_INPUT(PortType))
ains += 1;
else if (LADSPA_IS_PORT_OUTPUT(PortType))
aouts += 1;
if (LADSPA_IS_PORT_INPUT(portType))
aIns += 1;
else if (LADSPA_IS_PORT_OUTPUT(portType))
aOuts += 1;
} }
else if (LADSPA_IS_PORT_CONTROL(PortType))
else if (LADSPA_IS_PORT_CONTROL(portType))
params += 1; params += 1;
} }


if (carlaOptions.forceStereo && (ains == 1 || aouts == 1) && ! h2)
if (carlaOptions.forceStereo && (aIns == 1 || aOuts == 1) && ! h2)
{
h2 = descriptor->instantiate(descriptor, sampleRate); h2 = descriptor->instantiate(descriptor, sampleRate);


if (ains > 0)
if (aIns == 1)
{
aIns = 2;
forcedStereoIn = true;
}

if (aOuts == 1)
{
aOuts = 2;
forcedStereoOut = true;
}
}

if (aIns > 0)
{ {
ain.ports = new CarlaEngineAudioPort*[ains];
ain.rindexes = new uint32_t[ains];
aIn.ports = new CarlaEngineAudioPort*[aIns];
aIn.rindexes = new uint32_t[aIns];
} }


if (aouts > 0)
if (aOuts > 0)
{ {
aout.ports = new CarlaEngineAudioPort*[aouts];
aout.rindexes = new uint32_t[aouts];
aOut.ports = new CarlaEngineAudioPort*[aOuts];
aOut.rindexes = new uint32_t[aOuts];
} }


if (params > 0) if (params > 0)
@@ -355,16 +409,16 @@ public:


const int portNameSize = CarlaEngine::maxPortNameSize() - 1; const int portNameSize = CarlaEngine::maxPortNameSize() - 1;
char portName[portNameSize]; char portName[portNameSize];
bool needsCin = false;
bool needsCout = false;
bool needsCtrlIn = false;
bool needsCtrlOut = false;


for (unsigned long i=0; i<PortCount; i++)
for (unsigned long i=0; i < portCount; i++)
{ {
const LADSPA_PortDescriptor PortType = descriptor->PortDescriptors[i];
const LADSPA_PortRangeHint PortHint = descriptor->PortRangeHints[i];
const bool HasPortRDF = (rdf_descriptor && i < rdf_descriptor->PortCount);
const LADSPA_PortDescriptor portType = descriptor->PortDescriptors[i];
const LADSPA_PortRangeHint portHints = descriptor->PortRangeHints[i];
const bool hasPortRDF = (rdf_descriptor && i < rdf_descriptor->PortCount);


if (LADSPA_IS_PORT_AUDIO(PortType))
if (LADSPA_IS_PORT_AUDIO(portType))
{ {
#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS)
@@ -377,23 +431,37 @@ public:
#endif #endif
strncpy(portName, descriptor->PortNames[i], portNameSize); strncpy(portName, descriptor->PortNames[i], portNameSize);


if (LADSPA_IS_PORT_INPUT(PortType))
if (LADSPA_IS_PORT_INPUT(portType))
{ {
j = ain.count++;
ain.ports[j] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, true);
ain.rindexes[j] = i;
j = aIn.count++;
aIn.ports[j] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, true);
aIn.rindexes[j] = i;

if (forcedStereoIn)
{
strcat(portName, "-2");
aIn.ports[1] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, true);
aIn.rindexes[1] = i;
}
} }
else if (LADSPA_IS_PORT_OUTPUT(PortType))
else if (LADSPA_IS_PORT_OUTPUT(portType))
{ {
j = aout.count++;
aout.ports[j] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, false);
aout.rindexes[j] = i;
needsCin = true;
j = aOut.count++;
aOut.ports[j] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, false);
aOut.rindexes[j] = i;
needsCtrlIn = true;

if (forcedStereoOut)
{
strcat(portName, "-2");
aOut.ports[1] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, false);
aOut.rindexes[1] = i;
}
} }
else else
qWarning("WARNING - Got a broken Port (Audio, but not input or output)"); qWarning("WARNING - Got a broken Port (Audio, but not input or output)");
} }
else if (LADSPA_IS_PORT_CONTROL(PortType))
else if (LADSPA_IS_PORT_CONTROL(portType))
{ {
j = param.count++; j = param.count++;
param.data[j].index = j; param.data[j].index = j;
@@ -402,17 +470,17 @@ public:
param.data[j].midiChannel = 0; param.data[j].midiChannel = 0;
param.data[j].midiCC = -1; param.data[j].midiCC = -1;


double min, max, def, step, step_small, step_large;
double min, max, def, step, stepSmall, stepLarge;


// min value // min value
if (LADSPA_IS_HINT_BOUNDED_BELOW(PortHint.HintDescriptor))
min = PortHint.LowerBound;
if (LADSPA_IS_HINT_BOUNDED_BELOW(portHints.HintDescriptor))
min = portHints.LowerBound;
else else
min = 0.0; min = 0.0;


// max value // max value
if (LADSPA_IS_HINT_BOUNDED_ABOVE(PortHint.HintDescriptor))
max = PortHint.UpperBound;
if (LADSPA_IS_HINT_BOUNDED_ABOVE(portHints.HintDescriptor))
max = portHints.UpperBound;
else else
max = 1.0; max = 1.0;


@@ -428,72 +496,17 @@ public:
} }


// default value // default value
if (HasPortRDF && LADSPA_PORT_HAS_DEFAULT(rdf_descriptor->Ports[i].Hints))
if (hasPortRDF && LADSPA_PORT_HAS_DEFAULT(rdf_descriptor->Ports[i].Hints))
def = rdf_descriptor->Ports[i].Default; def = rdf_descriptor->Ports[i].Default;

else if (LADSPA_IS_HINT_HAS_DEFAULT(PortHint.HintDescriptor))
{
switch (PortHint.HintDescriptor & LADSPA_HINT_DEFAULT_MASK)
{
case LADSPA_HINT_DEFAULT_MINIMUM:
def = min;
break;
case LADSPA_HINT_DEFAULT_MAXIMUM:
def = max;
break;
case LADSPA_HINT_DEFAULT_0:
def = 0.0;
break;
case LADSPA_HINT_DEFAULT_1:
def = 1.0;
break;
case LADSPA_HINT_DEFAULT_100:
def = 100.0;
break;
case LADSPA_HINT_DEFAULT_440:
def = 440.0;
break;
case LADSPA_HINT_DEFAULT_LOW:
if (LADSPA_IS_HINT_LOGARITHMIC(PortHint.HintDescriptor))
def = exp((log(min)*0.75) + (log(max)*0.25));
else
def = (min*0.75) + (max*0.25);
break;
case LADSPA_HINT_DEFAULT_MIDDLE:
if (LADSPA_IS_HINT_LOGARITHMIC(PortHint.HintDescriptor))
def = sqrt(min*max);
else
def = (min+max)/2;
break;
case LADSPA_HINT_DEFAULT_HIGH:
if (LADSPA_IS_HINT_LOGARITHMIC(PortHint.HintDescriptor))
def = exp((log(min)*0.25) + (log(max)*0.75));
else
def = (min*0.25) + (max*0.75);
break;
default:
if (min < 0.0 && max > 0.0)
def = 0.0;
else
def = min;
break;
}
}
else else
{
// no default value
if (min < 0.0 && max > 0.0)
def = 0.0;
else
def = min;
}
def = get_default_ladspa_port_value(portHints.HintDescriptor, min, max);


if (def < min) if (def < min)
def = min; def = min;
else if (def > max) else if (def > max)
def = max; def = max;


if (LADSPA_IS_HINT_SAMPLE_RATE(PortHint.HintDescriptor))
if (LADSPA_IS_HINT_SAMPLE_RATE(portHints.HintDescriptor))
{ {
min *= sampleRate; min *= sampleRate;
max *= sampleRate; max *= sampleRate;
@@ -501,36 +514,36 @@ public:
param.data[j].hints |= PARAMETER_USES_SAMPLERATE; param.data[j].hints |= PARAMETER_USES_SAMPLERATE;
} }


if (LADSPA_IS_HINT_TOGGLED(PortHint.HintDescriptor))
if (LADSPA_IS_HINT_TOGGLED(portHints.HintDescriptor))
{ {
step = max - min; step = max - min;
step_small = step;
step_large = step;
stepSmall = step;
stepLarge = step;
param.data[j].hints |= PARAMETER_IS_BOOLEAN; param.data[j].hints |= PARAMETER_IS_BOOLEAN;
} }
else if (LADSPA_IS_HINT_INTEGER(PortHint.HintDescriptor))
else if (LADSPA_IS_HINT_INTEGER(portHints.HintDescriptor))
{ {
step = 1.0; step = 1.0;
step_small = 1.0;
step_large = 10.0;
stepSmall = 1.0;
stepLarge = 10.0;
param.data[j].hints |= PARAMETER_IS_INTEGER; param.data[j].hints |= PARAMETER_IS_INTEGER;
} }
else else
{ {
double range = max - min; double range = max - min;
step = range/100.0; step = range/100.0;
step_small = range/1000.0;
step_large = range/10.0;
stepSmall = range/1000.0;
stepLarge = range/10.0;
} }


if (LADSPA_IS_PORT_INPUT(PortType))
if (LADSPA_IS_PORT_INPUT(portType))
{ {
param.data[j].type = PARAMETER_INPUT; param.data[j].type = PARAMETER_INPUT;
param.data[j].hints |= PARAMETER_IS_ENABLED; param.data[j].hints |= PARAMETER_IS_ENABLED;
param.data[j].hints |= PARAMETER_IS_AUTOMABLE; param.data[j].hints |= PARAMETER_IS_AUTOMABLE;
needsCin = true;
needsCtrlIn = true;
} }
else if (LADSPA_IS_PORT_OUTPUT(PortType))
else if (LADSPA_IS_PORT_OUTPUT(portType))
{ {
if (strcmp(descriptor->PortNames[i], "latency") == 0 || strcmp(descriptor->PortNames[i], "_latency") == 0) if (strcmp(descriptor->PortNames[i], "latency") == 0 || strcmp(descriptor->PortNames[i], "_latency") == 0)
{ {
@@ -538,18 +551,27 @@ public:
max = sampleRate; max = sampleRate;
def = 0.0; def = 0.0;
step = 1.0; step = 1.0;
step_small = 1.0;
step_large = 1.0;
stepSmall = 1.0;
stepLarge = 1.0;


param.data[j].type = PARAMETER_LATENCY; param.data[j].type = PARAMETER_LATENCY;
param.data[j].hints = 0; param.data[j].hints = 0;
} }
else if (strcmp(descriptor->PortNames[i], "_sample-rate") == 0)
{
step = 1.0;
stepSmall = 1.0;
stepLarge = 1.0;

param.data[j].type = PARAMETER_SAMPLE_RATE;
param.data[j].hints = 0;
}
else else
{ {
param.data[j].type = PARAMETER_OUTPUT; param.data[j].type = PARAMETER_OUTPUT;
param.data[j].hints |= PARAMETER_IS_ENABLED; param.data[j].hints |= PARAMETER_IS_ENABLED;
param.data[j].hints |= PARAMETER_IS_AUTOMABLE; param.data[j].hints |= PARAMETER_IS_AUTOMABLE;
needsCout = true;
needsCtrlOut = true;
} }
} }
else else
@@ -559,19 +581,19 @@ public:
} }


// extra parameter hints // extra parameter hints
if (LADSPA_IS_HINT_LOGARITHMIC(PortHint.HintDescriptor))
if (LADSPA_IS_HINT_LOGARITHMIC(portHints.HintDescriptor))
param.data[j].hints |= PARAMETER_IS_LOGARITHMIC; param.data[j].hints |= PARAMETER_IS_LOGARITHMIC;


// check for scalepoints, require at least 2 to make it useful // check for scalepoints, require at least 2 to make it useful
if (HasPortRDF && rdf_descriptor->Ports[i].ScalePointCount > 1)
if (hasPortRDF && rdf_descriptor->Ports[i].ScalePointCount > 1)
param.data[j].hints |= PARAMETER_USES_SCALEPOINTS; param.data[j].hints |= PARAMETER_USES_SCALEPOINTS;


param.ranges[j].min = min; param.ranges[j].min = min;
param.ranges[j].max = max; param.ranges[j].max = max;
param.ranges[j].def = def; param.ranges[j].def = def;
param.ranges[j].step = step; param.ranges[j].step = step;
param.ranges[j].stepSmall = step_small;
param.ranges[j].stepLarge = step_large;
param.ranges[j].stepSmall = stepSmall;
param.ranges[j].stepLarge = stepLarge;


// Start parameters in their default values // Start parameters in their default values
param_buffers[j] = def; param_buffers[j] = def;
@@ -588,7 +610,7 @@ public:
} }
} }


if (needsCin)
if (needsCtrlIn)
{ {
#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS)
@@ -603,7 +625,7 @@ public:
param.portCin = (CarlaEngineControlPort*)x_client->addPort(CarlaEnginePortTypeControl, portName, true); param.portCin = (CarlaEngineControlPort*)x_client->addPort(CarlaEnginePortTypeControl, portName, true);
} }


if (needsCout)
if (needsCtrlOut)
{ {
#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS)
@@ -618,20 +640,20 @@ public:
param.portCout = (CarlaEngineControlPort*)x_client->addPort(CarlaEnginePortTypeControl, portName, false); param.portCout = (CarlaEngineControlPort*)x_client->addPort(CarlaEnginePortTypeControl, portName, false);
} }


ain.count = ains;
aout.count = aouts;
aIn.count = aIns;
aOut.count = aOuts;
param.count = params; param.count = params;


// plugin checks // plugin checks
m_hints &= ~(PLUGIN_IS_SYNTH | PLUGIN_USES_CHUNKS | PLUGIN_CAN_DRYWET | PLUGIN_CAN_VOLUME | PLUGIN_CAN_BALANCE); m_hints &= ~(PLUGIN_IS_SYNTH | PLUGIN_USES_CHUNKS | PLUGIN_CAN_DRYWET | PLUGIN_CAN_VOLUME | PLUGIN_CAN_BALANCE);


if (aouts > 0 && (ains == aouts || ains == 1))
if (aOuts > 0 && (aIns == aOuts || aIns == 1))
m_hints |= PLUGIN_CAN_DRYWET; m_hints |= PLUGIN_CAN_DRYWET;


if (aouts > 0)
if (aOuts > 0)
m_hints |= PLUGIN_CAN_VOLUME; m_hints |= PLUGIN_CAN_VOLUME;


if ((aouts >= 2 && aouts%2 == 0) || h2)
if ((aOuts >= 2 && aOuts%2 == 0) || h2)
m_hints |= PLUGIN_CAN_BALANCE; m_hints |= PLUGIN_CAN_BALANCE;


x_client->activate(); x_client->activate();
@@ -642,39 +664,39 @@ public:
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Plugin processing // Plugin processing


void process(float** inBuffer, float** outBuffer, uint32_t frames, uint32_t framesOffset)
void process(float* const* const inBuffer, float* const* const outBuffer, const uint32_t frames, const uint32_t framesOffset)
{ {
uint32_t i, k; uint32_t i, k;


double ains_peak_tmp[2] = { 0.0 };
double aouts_peak_tmp[2] = { 0.0 };
double aInsPeak[2] = { 0.0 };
double aOutsPeak[2] = { 0.0 };


CARLA_PROCESS_CONTINUE_CHECK; CARLA_PROCESS_CONTINUE_CHECK;


// -------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------
// Input VU // Input VU


if (ain.count > 0)
if (aIn.count > 0)
{ {
uint32_t count = h2 ? 2 : ain.count;
uint32_t count = h2 ? 2 : aIn.count;


if (count == 1) if (count == 1)
{ {
for (k=0; k < frames; k++) for (k=0; k < frames; k++)
{ {
if (abs(inBuffer[0][k]) > ains_peak_tmp[0])
ains_peak_tmp[0] = abs(inBuffer[0][k]);
if (abs(inBuffer[0][k]) > aInsPeak[0])
aInsPeak[0] = abs(inBuffer[0][k]);
} }
} }
else if (count > 1) else if (count > 1)
{ {
for (k=0; k < frames; k++) for (k=0; k < frames; k++)
{ {
if (abs(inBuffer[0][k]) > ains_peak_tmp[0])
ains_peak_tmp[0] = abs(inBuffer[0][k]);
if (abs(inBuffer[0][k]) > aInsPeak[0])
aInsPeak[0] = abs(inBuffer[0][k]);


if (abs(inBuffer[1][k]) > ains_peak_tmp[1])
ains_peak_tmp[1] = abs(inBuffer[1][k]);
if (abs(inBuffer[1][k]) > aInsPeak[1])
aInsPeak[1] = abs(inBuffer[1][k]);
} }
} }
} }
@@ -704,12 +726,15 @@ public:
// Control change // Control change
switch (cinEvent->type) switch (cinEvent->type)
{ {
case CarlaEngineEventNull:
break;

case CarlaEngineEventControlChange: case CarlaEngineEventControlChange:
{ {
double value; double value;


// Control backend stuff // Control backend stuff
if (cinEvent->channel == cin_channel)
if (cinEvent->channel == m_ctrlInChannel)
{ {
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(cinEvent->controller) && (m_hints & PLUGIN_CAN_DRYWET) > 0) if (MIDI_IS_CONTROL_BREATH_CONTROLLER(cinEvent->controller) && (m_hints & PLUGIN_CAN_DRYWET) > 0)
{ {
@@ -732,12 +757,12 @@ public:
double left, right; double left, right;
value = cinEvent->value/0.5 - 1.0; value = cinEvent->value/0.5 - 1.0;


if (value < 0)
if (value < 0.0)
{ {
left = -1.0; left = -1.0;
right = (value*2)+1.0; right = (value*2)+1.0;
} }
else if (value > 0)
else if (value > 0.0)
{ {
left = (value*2)-1.0; left = (value*2)-1.0;
right = 1.0; right = 1.0;
@@ -788,8 +813,12 @@ public:
break; break;
} }


case CarlaEngineEventMidiBankChange:
case CarlaEngineEventMidiProgramChange:
break;

case CarlaEngineEventAllSoundOff: case CarlaEngineEventAllSoundOff:
if (cinEvent->channel == cin_channel)
if (cinEvent->channel == m_ctrlInChannel)
{ {
if (descriptor->deactivate) if (descriptor->deactivate)
{ {
@@ -805,7 +834,7 @@ public:
} }
break; break;


default:
case CarlaEngineEventAllNotesOff:
break; break;
} }
} }
@@ -842,16 +871,16 @@ public:
} }
} }


for (i=0; i < ain.count; i++)
for (i=0; i < aIn.count; i++)
{ {
descriptor->connect_port(handle, ain.rindexes[i], inBuffer[i]);
if (h2 && i == 0) descriptor->connect_port(h2, ain.rindexes[i], inBuffer[1]);
if (i == 0 || ! h2) descriptor->connect_port(handle, aIn.rindexes[i], inBuffer[i]);
if (i == 1 && h2) descriptor->connect_port(h2, aIn.rindexes[i], inBuffer[i]);
} }


for (i=0; i < aout.count; i++)
for (i=0; i < aOut.count; i++)
{ {
descriptor->connect_port(handle, aout.rindexes[i], outBuffer[i]);
if (h2 && i == 0) descriptor->connect_port(h2, aout.rindexes[i], outBuffer[1]);
if (i == 0 || ! h2) descriptor->connect_port(handle, aOut.rindexes[i], outBuffer[i]);
if (i == 1 && h2) descriptor->connect_port(h2, aOut.rindexes[i], outBuffer[i]);
} }


descriptor->run(handle, frames); descriptor->run(handle, frames);
@@ -876,14 +905,14 @@ public:


if (m_active) if (m_active)
{ {
bool do_drywet = (m_hints & PLUGIN_CAN_DRYWET) > 0 && x_drywet != 1.0;
bool do_volume = (m_hints & PLUGIN_CAN_VOLUME) > 0 && x_vol != 1.0;
bool do_balance = (m_hints & PLUGIN_CAN_BALANCE) > 0 && (x_bal_left != -1.0 || x_bal_right != 1.0);
bool do_drywet = (m_hints & PLUGIN_CAN_DRYWET) > 0 && x_dryWet != 1.0;
bool do_volume = (m_hints & PLUGIN_CAN_VOLUME) > 0 && x_volume != 1.0;
bool do_balance = (m_hints & PLUGIN_CAN_BALANCE) > 0 && (x_balanceLeft != -1.0 || x_balanceRight != 1.0);


double bal_rangeL, bal_rangeR; double bal_rangeL, bal_rangeR;
float oldBufLeft[do_balance ? frames : 0]; float oldBufLeft[do_balance ? frames : 0];


uint32_t count = h2 ? 2 : aout.count;
uint32_t count = h2 ? 2 : aOut.count;


for (i=0; i < count; i++) for (i=0; i < count; i++)
{ {
@@ -892,10 +921,10 @@ public:
{ {
for (k=0; k < frames; k++) for (k=0; k < frames; k++)
{ {
if (aout.count == 1 && ! h2)
outBuffer[i][k] = (outBuffer[i][k]*x_drywet)+(inBuffer[0][k]*(1.0-x_drywet));
if (aOut.count == 1 && ! h2)
outBuffer[i][k] = (outBuffer[i][k]*x_dryWet)+(inBuffer[0][k]*(1.0-x_dryWet));
else else
outBuffer[i][k] = (outBuffer[i][k]*x_drywet)+(inBuffer[i][k]*(1.0-x_drywet));
outBuffer[i][k] = (outBuffer[i][k]*x_dryWet)+(inBuffer[i][k]*(1.0-x_dryWet));
} }
} }


@@ -905,8 +934,8 @@ public:
if (i%2 == 0) if (i%2 == 0)
memcpy(&oldBufLeft, outBuffer[i], sizeof(float)*frames); memcpy(&oldBufLeft, outBuffer[i], sizeof(float)*frames);


bal_rangeL = (x_bal_left+1.0)/2;
bal_rangeR = (x_bal_right+1.0)/2;
bal_rangeL = (x_balanceLeft+1.0)/2;
bal_rangeR = (x_balanceRight+1.0)/2;


for (k=0; k < frames; k++) for (k=0; k < frames; k++)
{ {
@@ -929,25 +958,25 @@ public:
if (do_volume) if (do_volume)
{ {
for (k=0; k < frames; k++) for (k=0; k < frames; k++)
outBuffer[i][k] *= x_vol;
outBuffer[i][k] *= x_volume;
} }


// Output VU // Output VU
for (k=0; i < 2 && k < frames; k++) for (k=0; i < 2 && k < frames; k++)
{ {
if (abs(outBuffer[i][k]) > aouts_peak_tmp[i])
aouts_peak_tmp[i] = abs(outBuffer[i][k]);
if (abs(outBuffer[i][k]) > aOutsPeak[i])
aOutsPeak[i] = abs(outBuffer[i][k]);
} }
} }
} }
else else
{ {
// disable any output sound if not active // disable any output sound if not active
for (i=0; i < aout.count; i++)
for (i=0; i < aOut.count; i++)
memset(outBuffer[i], 0.0f, sizeof(float)*frames); memset(outBuffer[i], 0.0f, sizeof(float)*frames);


aouts_peak_tmp[0] = 0.0;
aouts_peak_tmp[1] = 0.0;
aOutsPeak[0] = 0.0;
aOutsPeak[1] = 0.0;


} // End of Post-processing } // End of Post-processing


@@ -980,10 +1009,10 @@ public:
// -------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------
// Peak Values // Peak Values


x_engine->setInputPeak(m_id, 0, ains_peak_tmp[0]);
x_engine->setInputPeak(m_id, 1, ains_peak_tmp[1]);
x_engine->setOutputPeak(m_id, 0, aouts_peak_tmp[0]);
x_engine->setOutputPeak(m_id, 1, aouts_peak_tmp[1]);
x_engine->setInputPeak(m_id, 0, aInsPeak[0]);
x_engine->setInputPeak(m_id, 1, aInsPeak[1]);
x_engine->setOutputPeak(m_id, 0, aOutsPeak[0]);
x_engine->setOutputPeak(m_id, 1, aOutsPeak[1]);


m_activeBefore = m_active; m_activeBefore = m_active;
} }


+ 24
- 24
c++/carla-backend/linuxsampler.cpp View File

@@ -147,11 +147,11 @@ public:
// Delete old data // Delete old data
deleteBuffers(); deleteBuffers();


uint32_t aouts;
aouts = 2;
uint32_t aOuts;
aOuts = 2;


aout.ports = new CarlaEngineAudioPort*[aouts];
aout.rindexes = new uint32_t[aouts];
aOut.ports = new CarlaEngineAudioPort*[aOuts];
aOut.rindexes = new uint32_t[aOuts];


char portName[STR_MAX]; char portName[STR_MAX];


@@ -168,8 +168,8 @@ public:
#endif #endif
strcpy(portName, "out-left"); strcpy(portName, "out-left");


aout.ports[0] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, false);
aout.rindexes[0] = 0;
aOut.ports[0] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, false);
aOut.rindexes[0] = 0;


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS)
@@ -181,8 +181,8 @@ public:
#endif #endif
strcpy(portName, "out-right"); strcpy(portName, "out-right");


aout.ports[1] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, false);
aout.rindexes[1] = 1;
aOut.ports[1] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, false);
aOut.rindexes[1] = 1;


// --------------------------------------- // ---------------------------------------
// MIDI Input // MIDI Input
@@ -201,7 +201,7 @@ public:


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


aout.count = aouts;
aOut.count = aOuts;


// plugin checks // plugin checks
m_hints &= ~(PLUGIN_IS_SYNTH | PLUGIN_USES_CHUNKS | PLUGIN_CAN_DRYWET | PLUGIN_CAN_VOLUME | PLUGIN_CAN_BALANCE); m_hints &= ~(PLUGIN_IS_SYNTH | PLUGIN_USES_CHUNKS | PLUGIN_CAN_DRYWET | PLUGIN_CAN_VOLUME | PLUGIN_CAN_BALANCE);
@@ -283,7 +283,7 @@ public:
// -------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------
// MIDI Input (External) // MIDI Input (External)


if (cin_channel >= 0 && cin_channel < 16 && m_active && m_activeBefore)
if (m_ctrlInChannel >= 0 && m_ctrlInChannel < 16 && m_active && m_activeBefore)
{ {
engineMidiLock(); engineMidiLock();


@@ -293,9 +293,9 @@ public:
break; break;


if (extMidiNotes[i].velo) if (extMidiNotes[i].velo)
midiInputPort->DispatchNoteOn(extMidiNotes[i].note, extMidiNotes[i].velo, cin_channel, 0);
midiInputPort->DispatchNoteOn(extMidiNotes[i].note, extMidiNotes[i].velo, m_ctrlInChannel, 0);
else else
midiInputPort->DispatchNoteOff(extMidiNotes[i].note, extMidiNotes[i].velo, cin_channel, 0);
midiInputPort->DispatchNoteOff(extMidiNotes[i].note, extMidiNotes[i].velo, m_ctrlInChannel, 0);


extMidiNotes[i].channel = -1; extMidiNotes[i].channel = -1;
midiEventCount += 1; midiEventCount += 1;
@@ -340,7 +340,7 @@ public:


midiInputPort->DispatchNoteOff(note, 0, channel, time); midiInputPort->DispatchNoteOff(note, 0, channel, time);


if (channel == cin_channel)
if (channel == m_ctrlInChannel)
postponeEvent(PluginPostEventNoteOff, channel, note, 0.0); postponeEvent(PluginPostEventNoteOff, channel, note, 0.0);
} }
else if (MIDI_IS_STATUS_NOTE_ON(status)) else if (MIDI_IS_STATUS_NOTE_ON(status))
@@ -350,7 +350,7 @@ public:


midiInputPort->DispatchNoteOn(note, velo, channel, time); midiInputPort->DispatchNoteOn(note, velo, channel, time);


if (channel == cin_channel)
if (channel == m_ctrlInChannel)
postponeEvent(PluginPostEventNoteOn, channel, note, velo); postponeEvent(PluginPostEventNoteOn, channel, note, velo);
} }
else if (MIDI_IS_STATUS_AFTERTOUCH(status)) else if (MIDI_IS_STATUS_AFTERTOUCH(status))
@@ -382,10 +382,10 @@ public:
{ {
if (! m_activeBefore) if (! m_activeBefore)
{ {
if (cin_channel >= 0 && cin_channel < 16)
if (m_ctrlInChannel >= 0 && m_ctrlInChannel < 16)
{ {
midiInputPort->DispatchControlChange(MIDI_CONTROL_ALL_SOUND_OFF, 0, cin_channel);
midiInputPort->DispatchControlChange(MIDI_CONTROL_ALL_NOTES_OFF, 0, cin_channel);
midiInputPort->DispatchControlChange(MIDI_CONTROL_ALL_SOUND_OFF, 0, m_ctrlInChannel);
midiInputPort->DispatchControlChange(MIDI_CONTROL_ALL_NOTES_OFF, 0, m_ctrlInChannel);
} }
} }


@@ -402,13 +402,13 @@ public:


if (m_active) if (m_active)
{ {
bool do_volume = x_vol != 1.0;
bool do_balance = (x_bal_left != -1.0 || x_bal_right != 1.0);
bool do_volume = x_volume != 1.0;
bool do_balance = (x_balanceLeft != -1.0 || x_balanceRight != 1.0);


double bal_rangeL, bal_rangeR; double bal_rangeL, bal_rangeR;
float oldBufLeft[do_balance ? frames : 0]; float oldBufLeft[do_balance ? frames : 0];


for (i=0; i < aout.count; i++)
for (i=0; i < aOut.count; i++)
{ {
// Balance // Balance
if (do_balance) if (do_balance)
@@ -416,8 +416,8 @@ public:
if (i%2 == 0) if (i%2 == 0)
memcpy(&oldBufLeft, outBuffer[i], sizeof(float)*frames); memcpy(&oldBufLeft, outBuffer[i], sizeof(float)*frames);


bal_rangeL = (x_bal_left+1.0)/2;
bal_rangeR = (x_bal_right+1.0)/2;
bal_rangeL = (x_balanceLeft+1.0)/2;
bal_rangeR = (x_balanceRight+1.0)/2;


for (k=0; k < frames; k++) for (k=0; k < frames; k++)
{ {
@@ -440,7 +440,7 @@ public:
if (do_volume) if (do_volume)
{ {
for (k=0; k < frames; k++) for (k=0; k < frames; k++)
outBuffer[i][k] *= x_vol;
outBuffer[i][k] *= x_volume;
} }


// Output VU // Output VU
@@ -454,7 +454,7 @@ public:
else else
{ {
// disable any output sound if not active // disable any output sound if not active
for (i=0; i < aout.count; i++)
for (i=0; i < aOut.count; i++)
memset(outBuffer[i], 0.0f, sizeof(float)*frames); memset(outBuffer[i], 0.0f, sizeof(float)*frames);


aouts_peak_tmp[0] = 0.0; aouts_peak_tmp[0] = 0.0;


+ 60
- 60
c++/carla-backend/lv2.cpp View File

@@ -921,13 +921,16 @@ public:
// Delete old data // Delete old data
deleteBuffers(); deleteBuffers();


uint32_t ains, aouts, cvIns, cvOuts, params, j;
ains = aouts = cvIns = cvOuts = params = 0;
uint32_t aIns, aOuts, cvIns, cvOuts, params, j;
aIns = aOuts = cvIns = cvOuts = params = 0;
std::vector<unsigned int> evIns, evOuts; std::vector<unsigned int> evIns, evOuts;


const double sampleRate = x_engine->getSampleRate(); const double sampleRate = x_engine->getSampleRate();
const uint32_t PortCount = rdf_descriptor->PortCount; const uint32_t PortCount = rdf_descriptor->PortCount;


bool forcedStereoIn, forcedStereoOut;
forcedStereoIn = forcedStereoOut = false;

for (uint32_t i=0; i < PortCount; i++) for (uint32_t i=0; i < PortCount; i++)
{ {
const LV2_Property PortType = rdf_descriptor->Ports[i].Type; const LV2_Property PortType = rdf_descriptor->Ports[i].Type;
@@ -935,9 +938,9 @@ public:
if (LV2_IS_PORT_AUDIO(PortType)) if (LV2_IS_PORT_AUDIO(PortType))
{ {
if (LV2_IS_PORT_INPUT(PortType)) if (LV2_IS_PORT_INPUT(PortType))
ains += 1;
aIns += 1;
else if (LV2_IS_PORT_OUTPUT(PortType)) else if (LV2_IS_PORT_OUTPUT(PortType))
aouts += 1;
aOuts += 1;
} }
else if (LV2_IS_PORT_CV(PortType)) else if (LV2_IS_PORT_CV(PortType))
{ {
@@ -971,36 +974,33 @@ public:
params += 1; params += 1;
} }


bool forcedStereoIn, forcedStereoOut;
forcedStereoIn = forcedStereoOut = true;

if (carlaOptions.forceStereo && (ains == 1 || aouts == 1) && ! h2)
if (carlaOptions.forceStereo && (aIns == 1 || aOuts == 1) && ! h2)
{ {
h2 = descriptor->instantiate(descriptor, sampleRate, rdf_descriptor->Bundle, features); h2 = descriptor->instantiate(descriptor, sampleRate, rdf_descriptor->Bundle, features);


if (ains == 1)
if (aIns == 1)
{ {
ains = 2;
aIns = 2;
forcedStereoIn = true; forcedStereoIn = true;
} }


if (aouts == 1)
if (aOuts == 1)
{ {
aouts = 2;
aOuts = 2;
forcedStereoOut = true; forcedStereoOut = true;
} }
} }


if (ains > 0)
if (aIns > 0)
{ {
ain.ports = new CarlaEngineAudioPort*[ains];
ain.rindexes = new uint32_t[ains];
aIn.ports = new CarlaEngineAudioPort*[aIns];
aIn.rindexes = new uint32_t[aIns];
} }


if (aouts > 0)
if (aOuts > 0)
{ {
aout.ports = new CarlaEngineAudioPort*[aouts];
aout.rindexes = new uint32_t[aouts];
aOut.ports = new CarlaEngineAudioPort*[aOuts];
aOut.rindexes = new uint32_t[aOuts];
} }


if (evIns.size() > 0) if (evIns.size() > 0)
@@ -1105,29 +1105,29 @@ public:
{ {
if (LV2_IS_PORT_INPUT(PortType)) if (LV2_IS_PORT_INPUT(PortType))
{ {
j = ain.count++;
ain.ports[j] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, true);
ain.rindexes[j] = i;
j = aIn.count++;
aIn.ports[j] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, true);
aIn.rindexes[j] = i;


if (forcedStereoIn) if (forcedStereoIn)
{ {
strcat(portName, "2"); strcat(portName, "2");
ain.ports[1] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, true);
ain.rindexes[1] = i;
aIn.ports[1] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, true);
aIn.rindexes[1] = i;
} }
} }
else if (LV2_IS_PORT_OUTPUT(PortType)) else if (LV2_IS_PORT_OUTPUT(PortType))
{ {
j = aout.count++;
aout.ports[j] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, false);
aout.rindexes[j] = i;
j = aOut.count++;
aOut.ports[j] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, false);
aOut.rindexes[j] = i;
needsCin = true; needsCin = true;


if (forcedStereoOut) if (forcedStereoOut)
{ {
strcat(portName, "2"); strcat(portName, "2");
aout.ports[1] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, false);
aout.rindexes[1] = i;
aOut.ports[1] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, false);
aOut.rindexes[1] = i;
} }
} }
else else
@@ -1451,8 +1451,8 @@ public:
param.portCout = (CarlaEngineControlPort*)x_client->addPort(CarlaEnginePortTypeControl, portName, false); param.portCout = (CarlaEngineControlPort*)x_client->addPort(CarlaEnginePortTypeControl, portName, false);
} }


ain.count = ains;
aout.count = aouts;
aIn.count = aIns;
aOut.count = aOuts;
evin.count = evIns.size(); evin.count = evIns.size();
evout.count = evOuts.size(); evout.count = evOuts.size();
param.count = params; param.count = params;
@@ -1463,13 +1463,13 @@ public:
if (LV2_IS_GENERATOR(rdf_descriptor->Type)) if (LV2_IS_GENERATOR(rdf_descriptor->Type))
m_hints |= PLUGIN_IS_SYNTH; m_hints |= PLUGIN_IS_SYNTH;


if (aouts > 0 && (ains == aouts || ains == 1))
if (aOuts > 0 && (aIns == aOuts || aIns == 1))
m_hints |= PLUGIN_CAN_DRYWET; m_hints |= PLUGIN_CAN_DRYWET;


if (aouts > 0)
if (aOuts > 0)
m_hints |= PLUGIN_CAN_VOLUME; m_hints |= PLUGIN_CAN_VOLUME;


if (aouts >= 2 && aouts%2 == 0)
if (aOuts >= 2 && aOuts%2 == 0)
m_hints |= PLUGIN_CAN_BALANCE; m_hints |= PLUGIN_CAN_BALANCE;


// check extensions // check extensions
@@ -1657,9 +1657,9 @@ public:
// -------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------
// Input VU // Input VU


if (ain.count > 0)
if (aIn.count > 0)
{ {
uint32_t count = h2 ? 2 : ain.count;
uint32_t count = h2 ? 2 : aIn.count;


if (count == 1) if (count == 1)
{ {
@@ -1721,7 +1721,7 @@ public:
double value; double value;


// Control backend stuff // Control backend stuff
if (cinEvent->channel == cin_channel)
if (cinEvent->channel == m_ctrlInChannel)
{ {
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(cinEvent->controller) && (m_hints & PLUGIN_CAN_DRYWET) > 0) if (MIDI_IS_CONTROL_BREATH_CONTROLLER(cinEvent->controller) && (m_hints & PLUGIN_CAN_DRYWET) > 0)
{ {
@@ -1801,12 +1801,12 @@ public:
} }


case CarlaEngineEventMidiBankChange: case CarlaEngineEventMidiBankChange:
if (cinEvent->channel == cin_channel)
if (cinEvent->channel == m_ctrlInChannel)
nextBankId = rint(cinEvent->value); nextBankId = rint(cinEvent->value);
break; break;


case CarlaEngineEventMidiProgramChange: case CarlaEngineEventMidiProgramChange:
if (cinEvent->channel == cin_channel)
if (cinEvent->channel == m_ctrlInChannel)
{ {
uint32_t nextProgramId = rint(cinEvent->value); uint32_t nextProgramId = rint(cinEvent->value);


@@ -1823,7 +1823,7 @@ public:
break; break;


case CarlaEngineEventAllSoundOff: case CarlaEngineEventAllSoundOff:
if (cinEvent->channel == cin_channel)
if (cinEvent->channel == m_ctrlInChannel)
{ {
if (midi.portMin && ! allNotesOffSent) if (midi.portMin && ! allNotesOffSent)
sendMidiAllNotesOff(); sendMidiAllNotesOff();
@@ -1845,7 +1845,7 @@ public:
break; break;


case CarlaEngineEventAllNotesOff: case CarlaEngineEventAllNotesOff:
if (cinEvent->channel == cin_channel)
if (cinEvent->channel == m_ctrlInChannel)
{ {
if (midi.portMin && ! allNotesOffSent) if (midi.portMin && ! allNotesOffSent)
sendMidiAllNotesOff(); sendMidiAllNotesOff();
@@ -1862,7 +1862,7 @@ public:
// -------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------
// MIDI Input (External) // MIDI Input (External)


if (evin.count > 0 && cin_channel >= 0 && cin_channel < 16 && m_active && m_activeBefore)
if (evin.count > 0 && m_ctrlInChannel >= 0 && m_ctrlInChannel < 16 && m_active && m_activeBefore)
{ {
engineMidiLock(); engineMidiLock();


@@ -1872,7 +1872,7 @@ public:
break; break;


uint8_t midiEvent[4] = { 0 }; uint8_t midiEvent[4] = { 0 };
midiEvent[0] = cin_channel + extMidiNotes[i].velo ? MIDI_STATUS_NOTE_ON : MIDI_STATUS_NOTE_OFF;
midiEvent[0] = m_ctrlInChannel + extMidiNotes[i].velo ? MIDI_STATUS_NOTE_ON : MIDI_STATUS_NOTE_OFF;
midiEvent[1] = extMidiNotes[i].note; midiEvent[1] = extMidiNotes[i].note;
midiEvent[2] = extMidiNotes[i].velo; midiEvent[2] = extMidiNotes[i].velo;


@@ -1964,7 +1964,7 @@ public:
else if (evin.data[i].type & CARLA_EVENT_DATA_MIDI_LL) else if (evin.data[i].type & CARLA_EVENT_DATA_MIDI_LL)
lv2midi_put_event(&evinMidiStates[i], time, minEvent->size, minEvent->data); lv2midi_put_event(&evinMidiStates[i], time, minEvent->size, minEvent->data);


if (channel == cin_channel)
if (channel == m_ctrlInChannel)
{ {
if (MIDI_IS_STATUS_NOTE_OFF(status)) if (MIDI_IS_STATUS_NOTE_OFF(status))
postponeEvent(PluginPostEventNoteOff, channel, minEvent->data[1], 0.0); postponeEvent(PluginPostEventNoteOff, channel, minEvent->data[1], 0.0);
@@ -2057,16 +2057,16 @@ public:
} }
} }


for (i=0; i < ain.count; i++)
for (i=0; i < aIn.count; i++)
{ {
if (i == 0 || ! h2) descriptor->connect_port(handle, ain.rindexes[i], inBuffer[i]);
if (h2 && i == 1) descriptor->connect_port(h2, ain.rindexes[i], inBuffer[1]);
if (i == 0 || ! h2) descriptor->connect_port(handle, aIn.rindexes[i], inBuffer[i]);
if (i == 1 && h2) descriptor->connect_port(h2, aIn.rindexes[i], inBuffer[i]);
} }


for (i=0; i < aout.count; i++)
for (i=0; i < aOut.count; i++)
{ {
if (i == 0 || ! h2) descriptor->connect_port(handle, aout.rindexes[i], outBuffer[i]);
if (h2 && i == 1) descriptor->connect_port(h2, aout.rindexes[i], outBuffer[1]);
if (i == 0 || ! h2) descriptor->connect_port(handle, aOut.rindexes[i], outBuffer[i]);
if (i == 1 && h2) descriptor->connect_port(h2, aOut.rindexes[i], outBuffer[i]);
} }


descriptor->run(handle, frames); descriptor->run(handle, frames);
@@ -2091,14 +2091,14 @@ public:


if (m_active) if (m_active)
{ {
bool do_drywet = (m_hints & PLUGIN_CAN_DRYWET) > 0 && x_drywet != 1.0;
bool do_volume = (m_hints & PLUGIN_CAN_VOLUME) > 0 && x_vol != 1.0;
bool do_balance = (m_hints & PLUGIN_CAN_BALANCE) > 0 && (x_bal_left != -1.0 || x_bal_right != 1.0);
bool do_drywet = (m_hints & PLUGIN_CAN_DRYWET) > 0 && x_dryWet != 1.0;
bool do_volume = (m_hints & PLUGIN_CAN_VOLUME) > 0 && x_volume != 1.0;
bool do_balance = (m_hints & PLUGIN_CAN_BALANCE) > 0 && (x_balanceLeft != -1.0 || x_balanceRight != 1.0);


double bal_rangeL, bal_rangeR; double bal_rangeL, bal_rangeR;
float oldBufLeft[do_balance ? frames : 0]; float oldBufLeft[do_balance ? frames : 0];


uint32_t count = h2 ? 2 : aout.count;
uint32_t count = h2 ? 2 : aOut.count;


for (i=0; i < count; i++) for (i=0; i < count; i++)
{ {
@@ -2107,10 +2107,10 @@ public:
{ {
for (k=0; k < frames; k++) for (k=0; k < frames; k++)
{ {
if (aout.count == 1 && ! h2)
outBuffer[i][k] = (outBuffer[i][k]*x_drywet)+(inBuffer[0][k]*(1.0-x_drywet));
if (aOut.count == 1 && ! h2)
outBuffer[i][k] = (outBuffer[i][k]*x_dryWet)+(inBuffer[0][k]*(1.0-x_dryWet));
else else
outBuffer[i][k] = (outBuffer[i][k]*x_drywet)+(inBuffer[i][k]*(1.0-x_drywet));
outBuffer[i][k] = (outBuffer[i][k]*x_dryWet)+(inBuffer[i][k]*(1.0-x_dryWet));
} }
} }


@@ -2120,8 +2120,8 @@ public:
if (i%2 == 0) if (i%2 == 0)
memcpy(&oldBufLeft, outBuffer[i], sizeof(float)*frames); memcpy(&oldBufLeft, outBuffer[i], sizeof(float)*frames);


bal_rangeL = (x_bal_left+1.0)/2;
bal_rangeR = (x_bal_right+1.0)/2;
bal_rangeL = (x_balanceLeft+1.0)/2;
bal_rangeR = (x_balanceRight+1.0)/2;


for (k=0; k < frames; k++) for (k=0; k < frames; k++)
{ {
@@ -2144,7 +2144,7 @@ public:
if (do_volume) if (do_volume)
{ {
for (k=0; k < frames; k++) for (k=0; k < frames; k++)
outBuffer[i][k] *= x_vol;
outBuffer[i][k] *= x_volume;
} }


// Output VU // Output VU
@@ -2158,7 +2158,7 @@ public:
else else
{ {
// disable any output sound if not active // disable any output sound if not active
for (i=0; i < aout.count; i++)
for (i=0; i < aOut.count; i++)
memset(outBuffer[i], 0.0f, sizeof(float)*frames); memset(outBuffer[i], 0.0f, sizeof(float)*frames);


aouts_peak_tmp[0] = 0.0; aouts_peak_tmp[0] = 0.0;


+ 52
- 52
c++/carla-backend/vst.cpp View File

@@ -333,29 +333,29 @@ public:
// Delete old data // Delete old data
deleteBuffers(); deleteBuffers();


uint32_t ains, aouts, mins, mouts, params, j;
ains = aouts = mins = mouts = params = 0;
uint32_t aIns, aOuts, mIns, mOuts, params, j;
aIns = aOuts = mIns = mOuts = params = 0;


ains = effect->numInputs;
aouts = effect->numOutputs;
aIns = effect->numInputs;
aOuts = effect->numOutputs;
params = effect->numParams; params = effect->numParams;


if (VstPluginCanDo(effect, "receiveVstEvents") || VstPluginCanDo(effect, "receiveVstMidiEvent") || (effect->flags & effFlagsIsSynth) > 0 || (m_hints & PLUGIN_WANTS_MIDI_INPUT)) if (VstPluginCanDo(effect, "receiveVstEvents") || VstPluginCanDo(effect, "receiveVstMidiEvent") || (effect->flags & effFlagsIsSynth) > 0 || (m_hints & PLUGIN_WANTS_MIDI_INPUT))
mins = 1;
mIns = 1;


if (VstPluginCanDo(effect, "sendVstEvents") || VstPluginCanDo(effect, "sendVstMidiEvent")) if (VstPluginCanDo(effect, "sendVstEvents") || VstPluginCanDo(effect, "sendVstMidiEvent"))
mouts = 1;
mOuts = 1;


if (ains > 0)
if (aIns > 0)
{ {
ain.ports = new CarlaEngineAudioPort*[ains];
ain.rindexes = new uint32_t[ains];
aIn.ports = new CarlaEngineAudioPort*[aIns];
aIn.rindexes = new uint32_t[aIns];
} }


if (aouts > 0)
if (aOuts > 0)
{ {
aout.ports = new CarlaEngineAudioPort*[aouts];
aout.rindexes = new uint32_t[aouts];
aOut.ports = new CarlaEngineAudioPort*[aOuts];
aOut.rindexes = new uint32_t[aOuts];
} }


if (params > 0) if (params > 0)
@@ -366,9 +366,9 @@ public:


const int portNameSize = CarlaEngine::maxPortNameSize() - 1; const int portNameSize = CarlaEngine::maxPortNameSize() - 1;
char portName[portNameSize]; char portName[portNameSize];
bool needsCin = (aouts > 0 || params > 0);
bool needsCin = (aOuts > 0 || params > 0);


for (j=0; j<ains; j++)
for (j=0; j < aIns; j++)
{ {
#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS)
@@ -377,11 +377,11 @@ public:
#endif #endif
sprintf(portName, "input_%02i", j+1); sprintf(portName, "input_%02i", j+1);


ain.ports[j] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, true);
ain.rindexes[j] = j;
aIn.ports[j] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, true);
aIn.rindexes[j] = j;
} }


for (j=0; j<aouts; j++)
for (j=0; j < aOuts; j++)
{ {
#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS)
@@ -390,8 +390,8 @@ public:
#endif #endif
sprintf(portName, "output_%02i", j+1); sprintf(portName, "output_%02i", j+1);


aout.ports[j] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, false);
aout.rindexes[j] = j;
aOut.ports[j] = (CarlaEngineAudioPort*)x_client->addPort(CarlaEnginePortTypeAudio, portName, false);
aOut.rindexes[j] = j;
} }


for (j=0; j<params; j++) for (j=0; j<params; j++)
@@ -524,7 +524,7 @@ public:
param.portCin = (CarlaEngineControlPort*)x_client->addPort(CarlaEnginePortTypeControl, portName, true); param.portCin = (CarlaEngineControlPort*)x_client->addPort(CarlaEnginePortTypeControl, portName, true);
} }


if (mins == 1)
if (mIns == 1)
{ {
#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS)
@@ -539,7 +539,7 @@ public:
midi.portMin = (CarlaEngineMidiPort*)x_client->addPort(CarlaEnginePortTypeMIDI, portName, true); midi.portMin = (CarlaEngineMidiPort*)x_client->addPort(CarlaEnginePortTypeMIDI, portName, true);
} }


if (mouts == 1)
if (mOuts == 1)
{ {
#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS)
@@ -554,8 +554,8 @@ public:
midi.portMout = (CarlaEngineMidiPort*)x_client->addPort(CarlaEnginePortTypeMIDI, portName, false); midi.portMout = (CarlaEngineMidiPort*)x_client->addPort(CarlaEnginePortTypeMIDI, portName, false);
} }


ain.count = ains;
aout.count = aouts;
aIn.count = aIns;
aOut.count = aOuts;
param.count = params; param.count = params;


// plugin checks // plugin checks
@@ -569,13 +569,13 @@ public:
if (effect->flags & effFlagsProgramChunks) if (effect->flags & effFlagsProgramChunks)
m_hints |= PLUGIN_USES_CHUNKS; m_hints |= PLUGIN_USES_CHUNKS;


if (aouts > 0 && (ains == aouts || ains == 1))
if (aOuts > 0 && (aIns == aOuts || aIns == 1))
m_hints |= PLUGIN_CAN_DRYWET; m_hints |= PLUGIN_CAN_DRYWET;


if (aouts > 0)
if (aOuts > 0)
m_hints |= PLUGIN_CAN_VOLUME; m_hints |= PLUGIN_CAN_VOLUME;


if (aouts >= 2 && aouts%2 == 0)
if (aOuts >= 2 && aOuts%2 == 0)
m_hints |= PLUGIN_CAN_BALANCE; m_hints |= PLUGIN_CAN_BALANCE;


reloadPrograms(true); reloadPrograms(true);
@@ -701,9 +701,9 @@ public:
// -------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------
// Input VU // Input VU


if (ain.count > 0)
if (aIn.count > 0)
{ {
if (ain.count == 1)
if (aIn.count == 1)
{ {
for (k=0; k < frames; k++) for (k=0; k < frames; k++)
{ {
@@ -711,7 +711,7 @@ public:
ains_peak_tmp[0] = abs(inBuffer[0][k]); ains_peak_tmp[0] = abs(inBuffer[0][k]);
} }
} }
else if (ain.count >= 1)
else if (aIn.count >= 1)
{ {
for (k=0; k < frames; k++) for (k=0; k < frames; k++)
{ {
@@ -759,7 +759,7 @@ public:
double value; double value;


// Control backend stuff // Control backend stuff
if (cinEvent->channel == cin_channel)
if (cinEvent->channel == m_ctrlInChannel)
{ {
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(cinEvent->controller) && (m_hints & PLUGIN_CAN_DRYWET) > 0) if (MIDI_IS_CONTROL_BREATH_CONTROLLER(cinEvent->controller) && (m_hints & PLUGIN_CAN_DRYWET) > 0)
{ {
@@ -842,7 +842,7 @@ public:
break; break;


case CarlaEngineEventMidiProgramChange: case CarlaEngineEventMidiProgramChange:
if (cinEvent->channel == cin_channel)
if (cinEvent->channel == m_ctrlInChannel)
{ {
uint32_t progId = rint(cinEvent->value); uint32_t progId = rint(cinEvent->value);


@@ -855,7 +855,7 @@ public:
break; break;


case CarlaEngineEventAllSoundOff: case CarlaEngineEventAllSoundOff:
if (cinEvent->channel == cin_channel)
if (cinEvent->channel == m_ctrlInChannel)
{ {
if (midi.portMin && ! allNotesOffSent) if (midi.portMin && ! allNotesOffSent)
sendMidiAllNotesOff(); sendMidiAllNotesOff();
@@ -871,7 +871,7 @@ public:
break; break;


case CarlaEngineEventAllNotesOff: case CarlaEngineEventAllNotesOff:
if (cinEvent->channel == cin_channel)
if (cinEvent->channel == m_ctrlInChannel)
{ {
if (midi.portMin && ! allNotesOffSent) if (midi.portMin && ! allNotesOffSent)
sendMidiAllNotesOff(); sendMidiAllNotesOff();
@@ -888,7 +888,7 @@ public:
// -------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------
// MIDI Input (External) // MIDI Input (External)


if (midi.portMin && cin_channel >= 0 && cin_channel < 16 && m_active && m_activeBefore)
if (midi.portMin && m_ctrlInChannel >= 0 && m_ctrlInChannel < 16 && m_active && m_activeBefore)
{ {
engineMidiLock(); engineMidiLock();


@@ -902,7 +902,7 @@ public:


midiEvent->type = kVstMidiType; midiEvent->type = kVstMidiType;
midiEvent->byteSize = sizeof(VstMidiEvent); midiEvent->byteSize = sizeof(VstMidiEvent);
midiEvent->midiData[0] = cin_channel + extMidiNotes[i].velo ? MIDI_STATUS_NOTE_ON : MIDI_STATUS_NOTE_OFF;
midiEvent->midiData[0] = m_ctrlInChannel + extMidiNotes[i].velo ? MIDI_STATUS_NOTE_ON : MIDI_STATUS_NOTE_OFF;
midiEvent->midiData[1] = extMidiNotes[i].note; midiEvent->midiData[1] = extMidiNotes[i].note;
midiEvent->midiData[2] = extMidiNotes[i].velo; midiEvent->midiData[2] = extMidiNotes[i].velo;


@@ -957,7 +957,7 @@ public:
midiEvent->midiData[0] = status; midiEvent->midiData[0] = status;
midiEvent->midiData[1] = note; midiEvent->midiData[1] = note;


if (channel == cin_channel)
if (channel == m_ctrlInChannel)
postponeEvent(PluginPostEventNoteOff, channel, note, 0.0); postponeEvent(PluginPostEventNoteOff, channel, note, 0.0);
} }
else if (MIDI_IS_STATUS_NOTE_ON(status)) else if (MIDI_IS_STATUS_NOTE_ON(status))
@@ -969,7 +969,7 @@ public:
midiEvent->midiData[1] = note; midiEvent->midiData[1] = note;
midiEvent->midiData[2] = velo; midiEvent->midiData[2] = velo;


if (channel == cin_channel)
if (channel == m_ctrlInChannel)
postponeEvent(PluginPostEventNoteOn, channel, note, velo); postponeEvent(PluginPostEventNoteOn, channel, note, velo);
} }
else if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status)) else if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status))
@@ -1013,18 +1013,18 @@ public:
{ {
if (! m_activeBefore) if (! m_activeBefore)
{ {
if (midi.portMin && cin_channel >= 0 && cin_channel < 16)
if (midi.portMin && m_ctrlInChannel >= 0 && m_ctrlInChannel < 16)
{ {
memset(&midiEvents[0], 0, sizeof(VstMidiEvent)); memset(&midiEvents[0], 0, sizeof(VstMidiEvent));
midiEvents[0].type = kVstMidiType; midiEvents[0].type = kVstMidiType;
midiEvents[0].byteSize = sizeof(VstMidiEvent); midiEvents[0].byteSize = sizeof(VstMidiEvent);
midiEvents[0].midiData[0] = MIDI_STATUS_CONTROL_CHANGE + cin_channel;
midiEvents[0].midiData[0] = MIDI_STATUS_CONTROL_CHANGE + m_ctrlInChannel;
midiEvents[0].midiData[1] = MIDI_CONTROL_ALL_SOUND_OFF; midiEvents[0].midiData[1] = MIDI_CONTROL_ALL_SOUND_OFF;


memset(&midiEvents[1], 0, sizeof(VstMidiEvent)); memset(&midiEvents[1], 0, sizeof(VstMidiEvent));
midiEvents[1].type = kVstMidiType; midiEvents[1].type = kVstMidiType;
midiEvents[1].byteSize = sizeof(VstMidiEvent); midiEvents[1].byteSize = sizeof(VstMidiEvent);
midiEvents[1].midiData[0] = MIDI_STATUS_CONTROL_CHANGE + cin_channel;
midiEvents[1].midiData[0] = MIDI_STATUS_CONTROL_CHANGE + m_ctrlInChannel;
midiEvents[1].midiData[1] = MIDI_CONTROL_ALL_NOTES_OFF; midiEvents[1].midiData[1] = MIDI_CONTROL_ALL_NOTES_OFF;


midiEventCount = 2; midiEventCount = 2;
@@ -1051,7 +1051,7 @@ public:
} }
else else
{ {
for (i=0; i < aout.count; i++)
for (i=0; i < aOut.count; i++)
memset(outBuffer[i], 0, sizeof(float)*frames); memset(outBuffer[i], 0, sizeof(float)*frames);


#if ! VST_FORCE_DEPRECATED #if ! VST_FORCE_DEPRECATED
@@ -1076,24 +1076,24 @@ public:


if (m_active) if (m_active)
{ {
bool do_drywet = (m_hints & PLUGIN_CAN_DRYWET) > 0 && x_drywet != 1.0;
bool do_volume = (m_hints & PLUGIN_CAN_VOLUME) > 0 && x_vol != 1.0;
bool do_balance = (m_hints & PLUGIN_CAN_BALANCE) > 0 && (x_bal_left != -1.0 || x_bal_right != 1.0);
bool do_drywet = (m_hints & PLUGIN_CAN_DRYWET) > 0 && x_dryWet != 1.0;
bool do_volume = (m_hints & PLUGIN_CAN_VOLUME) > 0 && x_volume != 1.0;
bool do_balance = (m_hints & PLUGIN_CAN_BALANCE) > 0 && (x_balanceLeft != -1.0 || x_balanceRight != 1.0);


double bal_rangeL, bal_rangeR; double bal_rangeL, bal_rangeR;
float oldBufLeft[do_balance ? frames : 0]; float oldBufLeft[do_balance ? frames : 0];


for (i=0; i < aout.count; i++)
for (i=0; i < aOut.count; i++)
{ {
// Dry/Wet // Dry/Wet
if (do_drywet || do_volume) if (do_drywet || do_volume)
{ {
for (k=0; k < frames; k++) for (k=0; k < frames; k++)
{ {
if (aout.count == 1)
outBuffer[i][k] = (outBuffer[i][k]*x_drywet)+(inBuffer[0][k]*(1.0-x_drywet));
if (aOut.count == 1)
outBuffer[i][k] = (outBuffer[i][k]*x_dryWet)+(inBuffer[0][k]*(1.0-x_dryWet));
else else
outBuffer[i][k] = (outBuffer[i][k]*x_drywet)+(inBuffer[i][k]*(1.0-x_drywet));
outBuffer[i][k] = (outBuffer[i][k]*x_dryWet)+(inBuffer[i][k]*(1.0-x_dryWet));
} }
} }


@@ -1103,8 +1103,8 @@ public:
if (i%2 == 0) if (i%2 == 0)
memcpy(&oldBufLeft, outBuffer[i], sizeof(float)*frames); memcpy(&oldBufLeft, outBuffer[i], sizeof(float)*frames);


bal_rangeL = (x_bal_left+1.0)/2;
bal_rangeR = (x_bal_right+1.0)/2;
bal_rangeL = (x_balanceLeft+1.0)/2;
bal_rangeR = (x_balanceRight+1.0)/2;


for (k=0; k < frames; k++) for (k=0; k < frames; k++)
{ {
@@ -1127,7 +1127,7 @@ public:
if (do_volume) if (do_volume)
{ {
for (k=0; k < frames; k++) for (k=0; k < frames; k++)
outBuffer[i][k] *= x_vol;
outBuffer[i][k] *= x_volume;
} }


// Output VU // Output VU
@@ -1141,7 +1141,7 @@ public:
else else
{ {
// disable any output sound if not active // disable any output sound if not active
for (i=0; i < aout.count; i++)
for (i=0; i < aOut.count; i++)
memset(outBuffer[i], 0.0f, sizeof(float)*frames); memset(outBuffer[i], 0.0f, sizeof(float)*frames);


aouts_peak_tmp[0] = 0.0; aouts_peak_tmp[0] = 0.0;


+ 16
- 0
c++/carla-includes/carla_osc_includes.h View File

@@ -150,6 +150,22 @@ void osc_send_midi(const CarlaOscData* const oscData, const uint8_t buf[4])
} }
} }


static inline
void osc_send_sample_rate(const CarlaOscData* const oscData, const float sampleRate)
{
Q_ASSERT(oscData && oscData->path);
Q_ASSERT(sampleRate >= 0.0f);
qDebug("osc_send_sample_rate(path:\"%s\", %f)", oscData->path, sampleRate);

if (oscData->target)
{
char targetPath[strlen(oscData->path)+12];
strcpy(targetPath, oscData->path);
strcat(targetPath, "/sample_rate");
lo_send(oscData->target, targetPath, "f", sampleRate);
}
}

#ifdef BUILD_BRIDGE #ifdef BUILD_BRIDGE
static inline static inline
void osc_send_update(const CarlaOscData* const oscData, const char* const url) void osc_send_update(const CarlaOscData* const oscData, const char* const url)


+ 10
- 10
src/carla.py View File

@@ -1298,23 +1298,23 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW):
print("DEBUG :: %i, %i, %i, %f)" % (plugin_id, value1, value2, value3)) print("DEBUG :: %i, %i, %i, %f)" % (plugin_id, value1, value2, value3))


@pyqtSlot(int, int, float) @pyqtSlot(int, int, float)
def slot_handleParameterCallback(self, plugin_id, parameter_id, value):
pwidget = self.m_plugin_list[plugin_id]
def slot_handleParameterCallback(self, pluginId, parameterId, value):
pwidget = self.m_plugin_list[pluginId]
if pwidget: if pwidget:
pwidget.parameter_activity_timer = ICON_STATE_ON
pwidget.m_parameterIconTimer = ICON_STATE_ON


if parameter_id == PARAMETER_ACTIVE:
if parameterId == PARAMETER_ACTIVE:
pwidget.set_active((value > 0.0), True, False) pwidget.set_active((value > 0.0), True, False)
elif parameter_id == PARAMETER_DRYWET:
elif parameterId == PARAMETER_DRYWET:
pwidget.set_drywet(value * 1000, True, False) pwidget.set_drywet(value * 1000, True, False)
elif parameter_id == PARAMETER_VOLUME:
elif parameterId == PARAMETER_VOLUME:
pwidget.set_volume(value * 1000, True, False) pwidget.set_volume(value * 1000, True, False)
elif parameter_id == PARAMETER_BALANCE_LEFT:
elif parameterId == PARAMETER_BALANCE_LEFT:
pwidget.set_balance_left(value * 1000, True, False) pwidget.set_balance_left(value * 1000, True, False)
elif parameter_id == PARAMETER_BALANCE_RIGHT:
elif parameterId == PARAMETER_BALANCE_RIGHT:
pwidget.set_balance_right(value * 1000, True, False) pwidget.set_balance_right(value * 1000, True, False)
elif parameter_id >= 0:
pwidget.edit_dialog.set_parameter_to_update(parameter_id)
elif parameterId >= 0:
pwidget.edit_dialog.set_parameter_to_update(parameterId)


@pyqtSlot(int, int) @pyqtSlot(int, int)
def slot_handleProgramCallback(self, plugin_id, program_id): def slot_handleProgramCallback(self, plugin_id, program_id):


Loading…
Cancel
Save