@@ -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; | ||||
@@ -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; | ||||
@@ -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; | ||||
} | } | ||||
@@ -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; | ||||
@@ -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; | ||||
@@ -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; | ||||
@@ -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) | ||||
@@ -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): | ||||