| @@ -2694,8 +2694,6 @@ public: | |||
| return false; | |||
| } | |||
| // TODO: set default options | |||
| return true; | |||
| } | |||
| @@ -417,23 +417,23 @@ public: | |||
| uint options = 0x0; | |||
| if (! fNeedsFixedBuffers) | |||
| { | |||
| // can't disable fixed buffers if using latency | |||
| if (fLatencyIndex == -1) | |||
| options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
| // can't disable fixed buffers if using latency | |||
| if (fLatencyIndex == -1 && ! fNeedsFixedBuffers) | |||
| options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
| // can't disable forced stereo if in rack mode | |||
| if (pData->engine->getProccessMode() == ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | |||
| pass(); | |||
| // if inputs or outputs are just 1, then yes we can force stereo | |||
| else if (pData->audioIn.count == 1 || pData->audioOut.count == 1 || fForcedStereoIn || fForcedStereoOut) | |||
| options |= PLUGIN_OPTION_FORCE_STEREO; | |||
| } | |||
| // can't disable forced stereo if in rack mode | |||
| if (pData->engine->getProccessMode() == ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | |||
| pass(); | |||
| // if inputs or outputs are just 1, then yes we can force stereo | |||
| else if (pData->audioIn.count == 1 || pData->audioOut.count == 1 || fForcedStereoIn || fForcedStereoOut) | |||
| options |= PLUGIN_OPTION_FORCE_STEREO; | |||
| if (fDssiDescriptor->get_program != nullptr && fDssiDescriptor->select_program != nullptr) | |||
| options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
| if (fUsesCustomData) | |||
| options |= PLUGIN_OPTION_USE_CHUNKS; | |||
| if (fDssiDescriptor->run_synth != nullptr) | |||
| { | |||
| options |= PLUGIN_OPTION_SEND_CONTROL_CHANGES; | |||
| @@ -443,9 +443,6 @@ public: | |||
| options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
| } | |||
| if (fUsesCustomData) | |||
| options |= PLUGIN_OPTION_USE_CHUNKS; | |||
| return options; | |||
| } | |||
| @@ -2174,8 +2171,8 @@ public: | |||
| if (fOscData.source == nullptr) | |||
| { | |||
| // if no UI is registered yet only "update" message is valid | |||
| CARLA_SAFE_ASSERT_RETURN(std::strcmp(method, "update") == 0,) | |||
| // if no UI is registered yet only "configure" and "update" messages are valid | |||
| CARLA_SAFE_ASSERT_RETURN(std::strcmp(method, "configure") == 0 || std::strcmp(method, "update") == 0,) | |||
| } | |||
| else | |||
| { | |||
| @@ -2333,11 +2330,7 @@ public: | |||
| if (pData->midiprog.current >= 0) | |||
| { | |||
| const MidiProgramData& curMidiProg(pData->midiprog.getCurrent()); | |||
| if (getType() == PLUGIN_DSSI) | |||
| osc_send_program(fOscData, curMidiProg.bank, curMidiProg.program); | |||
| else | |||
| osc_send_midi_program(fOscData, curMidiProg.bank, curMidiProg.program); | |||
| osc_send_program(fOscData, curMidiProg.bank, curMidiProg.program); | |||
| } | |||
| for (uint32_t i=0; i < pData->param.count; ++i) | |||
| @@ -2651,14 +2644,17 @@ public: | |||
| /**/ if (fLatencyIndex >= 0 || fNeedsFixedBuffers) | |||
| pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
| else if (options & PLUGIN_OPTION_FIXED_BUFFERS) | |||
| else if (options & PLUGIN_OPTION_FIXED_BUFFERS) | |||
| pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
| /**/ if (pData->engine->getOptions().forceStereo) | |||
| pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||
| else if (options & PLUGIN_OPTION_FORCE_STEREO) | |||
| else if (options & PLUGIN_OPTION_FORCE_STEREO) | |||
| pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||
| if (fDssiDescriptor->get_program != nullptr && fDssiDescriptor->select_program != nullptr) | |||
| pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
| if (fUsesCustomData) | |||
| pData->options |= PLUGIN_OPTION_USE_CHUNKS; | |||
| @@ -2669,8 +2665,8 @@ public: | |||
| pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||
| pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
| if (fDssiDescriptor->get_program != nullptr && fDssiDescriptor->select_program != nullptr) | |||
| pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
| if (options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) | |||
| pData->options |= PLUGIN_OPTION_SEND_CONTROL_CHANGES; | |||
| } | |||
| return true; | |||
| @@ -150,8 +150,6 @@ public: | |||
| uint32_t getParameterScalePointCount(const uint32_t parameterId) const noexcept override | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, 0); | |||
| switch (parameterId) | |||
| { | |||
| case FluidSynthChorusType: | |||
| @@ -193,9 +191,6 @@ public: | |||
| float getParameterScalePointValue(const uint32_t parameterId, const uint32_t scalePointId) const noexcept override | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, 0.0f); | |||
| CARLA_SAFE_ASSERT_RETURN(scalePointId < getParameterScalePointCount(parameterId), 0.0f); | |||
| switch (parameterId) | |||
| { | |||
| case FluidSynthChorusType: | |||
| @@ -1632,11 +1627,10 @@ public: | |||
| pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||
| pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
| // TODO: read some options | |||
| if (options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) | |||
| pData->options |= PLUGIN_OPTION_SEND_CONTROL_CHANGES; | |||
| return true; | |||
| (void)options; | |||
| } | |||
| private: | |||
| @@ -151,6 +151,9 @@ public: | |||
| options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
| options |= PLUGIN_OPTION_USE_CHUNKS; | |||
| if (fInstance->getNumPrograms() > 1) | |||
| options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
| if (fInstance->acceptsMidi()) | |||
| { | |||
| options |= PLUGIN_OPTION_SEND_CONTROL_CHANGES; | |||
| @@ -1220,7 +1223,7 @@ public: | |||
| pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
| pData->options |= PLUGIN_OPTION_USE_CHUNKS; | |||
| if (fDesc.isInstrument) | |||
| if (fInstance->getNumPrograms() > 1) | |||
| pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
| if (fInstance->acceptsMidi()) | |||
| @@ -1229,10 +1232,10 @@ public: | |||
| pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||
| pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||
| pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
| } | |||
| // TODO: read some options | |||
| ignoreUnused(options); | |||
| if (options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) | |||
| pData->options |= PLUGIN_OPTION_SEND_CONTROL_CHANGES; | |||
| } | |||
| return true; | |||
| } | |||
| @@ -187,19 +187,16 @@ public: | |||
| { | |||
| uint options = 0x0; | |||
| if (! fNeedsFixedBuffers) | |||
| { | |||
| // can't disable fixed buffers if using latency | |||
| if (fLatencyIndex == -1) | |||
| options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
| // can't disable forced stereo if in rack mode | |||
| if (pData->engine->getProccessMode() == ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | |||
| pass(); | |||
| // if inputs or outputs are just 1, then yes we can force stereo | |||
| else if (pData->audioIn.count == 1 || pData->audioOut.count == 1 || fForcedStereoIn || fForcedStereoOut) | |||
| options |= PLUGIN_OPTION_FORCE_STEREO; | |||
| } | |||
| // can't disable fixed buffers if using latency | |||
| if (fLatencyIndex == -1 && ! fNeedsFixedBuffers) | |||
| options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
| // can't disable forced stereo if in rack mode | |||
| if (pData->engine->getProccessMode() == ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | |||
| pass(); | |||
| // if inputs or outputs are just 1, then yes we can force stereo | |||
| else if (pData->audioIn.count == 1 || pData->audioOut.count == 1 || fForcedStereoIn || fForcedStereoOut) | |||
| options |= PLUGIN_OPTION_FORCE_STEREO; | |||
| return options; | |||
| } | |||
| @@ -808,28 +808,25 @@ public: | |||
| uint getOptionsAvailable() const noexcept override | |||
| { | |||
| const bool hasMidiIn(getMidiInCount() > 0); | |||
| const uint32_t midiOutCount(getMidiOutCount()); | |||
| uint options = 0x0; | |||
| if (fExt.programs != nullptr) | |||
| options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
| // can't disable fixed buffers if using latency or MIDI output | |||
| if (fLatencyIndex == -1 && midiOutCount == 0 && ! fNeedsFixedBuffers) | |||
| options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
| // can't disable fixed buffers if using latency or MIDI | |||
| if (fLatencyIndex >= 0 || hasMidiIn || fNeedsFixedBuffers) | |||
| // can't disable forced stereo if in rack mode | |||
| if (pData->engine->getProccessMode() == ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | |||
| pass(); | |||
| else | |||
| options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
| // if inputs or outputs are just 1, then yes we can force stereo | |||
| else if ((pData->audioIn.count == 1 || pData->audioOut.count == 1) && fCanInit2) | |||
| options |= PLUGIN_OPTION_FORCE_STEREO; | |||
| if (fCanInit2 && pData->engine->getProccessMode() != ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | |||
| { | |||
| if (pData->options & PLUGIN_OPTION_FORCE_STEREO) | |||
| options |= PLUGIN_OPTION_FORCE_STEREO; | |||
| else if (pData->audioIn.count <= 1 && pData->audioOut.count <= 1 && (pData->audioIn.count != 0 || pData->audioOut.count != 0)) | |||
| options |= PLUGIN_OPTION_FORCE_STEREO; | |||
| } | |||
| if (fExt.programs != nullptr) | |||
| options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
| if (hasMidiIn) | |||
| if (midiOutCount != 0) | |||
| { | |||
| options |= PLUGIN_OPTION_SEND_PROGRAM_CHANGES; | |||
| options |= PLUGIN_OPTION_SEND_CONTROL_CHANGES; | |||
| @@ -5020,14 +5017,13 @@ public: | |||
| // --------------------------------------------------------------- | |||
| // set default options | |||
| pData->options = 0x0; | |||
| const uint32_t midiOutCount(getMidiOutCount()); | |||
| if (fExt.programs != nullptr && getCategory() == PLUGIN_CATEGORY_SYNTH) | |||
| pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
| pData->options = 0x0; | |||
| if (fLatencyIndex >= 0 || getMidiInCount() > 0 || fNeedsFixedBuffers) | |||
| if (fLatencyIndex >= 0 || midiOutCount != 0 || fNeedsFixedBuffers) | |||
| pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
| else if (options & PLUGIN_OPTION_FIXED_BUFFERS) | |||
| else if (options & PLUGIN_OPTION_FIXED_BUFFERS) | |||
| pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
| if (fCanInit2) | |||
| @@ -5038,12 +5034,18 @@ public: | |||
| pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||
| } | |||
| if (getMidiInCount() > 0) | |||
| if (fExt.programs != nullptr) | |||
| pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
| if (midiOutCount != 0) | |||
| { | |||
| pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||
| pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||
| pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||
| pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
| if (options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) | |||
| pData->options |= PLUGIN_OPTION_SEND_CONTROL_CHANGES; | |||
| } | |||
| // --------------------------------------------------------------- | |||
| @@ -1345,8 +1345,6 @@ public: | |||
| if (kIsGIG) | |||
| pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
| // TODO: read some options | |||
| return true; | |||
| (void)options; | |||
| @@ -330,23 +330,29 @@ public: | |||
| uint getOptionsAvailable() const noexcept override | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, 0x0); | |||
| CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr, 0); | |||
| CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr, 0x0); | |||
| // FIXME - try | |||
| const bool hasMidiProgs(fDescriptor->get_midi_program_count != nullptr && fDescriptor->get_midi_program_count(fHandle) > 0); | |||
| bool hasMidiProgs = false; | |||
| if (fDescriptor->get_midi_program_count != nullptr) | |||
| { | |||
| try { | |||
| hasMidiProgs = fDescriptor->get_midi_program_count(fHandle) > 0; | |||
| } catch (...) {} | |||
| } | |||
| uint options = 0x0; | |||
| if (getMidiInCount() == 0 && (fDescriptor->hints & NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS) == 0) | |||
| // can't disable fixed buffers if using MIDI output | |||
| if (getMidiOutCount() == 0 && (fDescriptor->hints & NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS) == 0) | |||
| options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
| if (pData->engine->getProccessMode() != ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | |||
| { | |||
| if (pData->options & PLUGIN_OPTION_FORCE_STEREO) | |||
| options |= PLUGIN_OPTION_FORCE_STEREO; | |||
| else if (pData->audioIn.count <= 1 && pData->audioOut.count <= 1 && (pData->audioIn.count != 0 || pData->audioOut.count != 0)) | |||
| options |= PLUGIN_OPTION_FORCE_STEREO; | |||
| } | |||
| // can't disable forced stereo if in rack mode | |||
| if (pData->engine->getProccessMode() == ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | |||
| pass(); | |||
| // if inputs or outputs are just 1, then yes we can force stereo | |||
| else if (pData->audioIn.count == 1 || pData->audioOut.count == 1) | |||
| options |= PLUGIN_OPTION_FORCE_STEREO; | |||
| if (fDescriptor->supports & NATIVE_PLUGIN_SUPPORTS_CONTROL_CHANGES) | |||
| options |= PLUGIN_OPTION_SEND_CONTROL_CHANGES; | |||
| @@ -2383,11 +2389,18 @@ public: | |||
| // --------------------------------------------------------------- | |||
| // set default options | |||
| const bool hasMidiProgs(fDescriptor->get_midi_program_count != nullptr && fDescriptor->get_midi_program_count(fHandle) > 0); | |||
| bool hasMidiProgs = false; | |||
| if (fDescriptor->get_midi_program_count != nullptr) | |||
| { | |||
| try { | |||
| hasMidiProgs = fDescriptor->get_midi_program_count(fHandle) > 0; | |||
| } catch (...) {} | |||
| } | |||
| pData->options = 0x0; | |||
| if (getMidiInCount() > 0 || (fDescriptor->hints & NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS) != 0) | |||
| if (getMidiOutCount() != 0 || (fDescriptor->hints & NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS) != 0) | |||
| pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
| else if (options & PLUGIN_OPTION_FIXED_BUFFERS) | |||
| pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
| @@ -2406,15 +2419,18 @@ public: | |||
| if (fDescriptor->supports & NATIVE_PLUGIN_SUPPORTS_ALL_SOUND_OFF) | |||
| pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
| if (fDescriptor->supports & NATIVE_PLUGIN_SUPPORTS_CONTROL_CHANGES) | |||
| { | |||
| if (options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) | |||
| pData->options |= PLUGIN_OPTION_SEND_CONTROL_CHANGES; | |||
| } | |||
| if (fDescriptor->supports & NATIVE_PLUGIN_SUPPORTS_PROGRAM_CHANGES) | |||
| { | |||
| CARLA_SAFE_ASSERT(! hasMidiProgs); | |||
| pData->options |= PLUGIN_OPTION_SEND_PROGRAM_CHANGES; | |||
| if (fDescriptor->supports & NATIVE_PLUGIN_SUPPORTS_CONTROL_CHANGES) | |||
| pData->options |= PLUGIN_OPTION_SEND_CONTROL_CHANGES; | |||
| } | |||
| else if (hasMidiProgs && fDescriptor->category == NATIVE_PLUGIN_CATEGORY_SYNTH) | |||
| else if (hasMidiProgs) | |||
| pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
| return true; | |||
| @@ -205,18 +205,21 @@ public: | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(fEffect != nullptr, 0); | |||
| const bool hasMidiOut(hasMidiOutput()); | |||
| uint options = 0x0; | |||
| options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
| // can't disable fixed buffers if using latency or MIDI output | |||
| if (pData->latency.frames == 0 && ! hasMidiOut) | |||
| options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
| if (fEffect->numPrograms > 1) | |||
| options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
| if (fEffect->flags & effFlagsProgramChunks) | |||
| options |= PLUGIN_OPTION_USE_CHUNKS; | |||
| if (getMidiInCount() == 0) | |||
| { | |||
| options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
| } | |||
| else | |||
| if (hasMidiOut) | |||
| { | |||
| options |= PLUGIN_OPTION_SEND_CONTROL_CHANGES; | |||
| options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||
| @@ -1795,7 +1798,8 @@ protected: | |||
| case audioMasterGetNumAutomatableParameters: | |||
| // Deprecated in VST SDK 2.4 | |||
| ret = carla_fixedValue<intptr_t>(0, static_cast<intptr_t>(pData->engine->getOptions().maxParameters), fEffect->numParams); | |||
| ret = static_cast<intptr_t>(pData->engine->getOptions().maxParameters); | |||
| ret = carla_minPositive<intptr_t>(ret, fEffect->numParams); | |||
| break; | |||
| case audioMasterGetParameterQuantization: | |||
| @@ -2181,24 +2185,31 @@ public: | |||
| // --------------------------------------------------------------- | |||
| // set default options | |||
| const bool hasMidiOut(hasMidiOutput()); | |||
| pData->options = 0x0; | |||
| if (fEffect->flags & effFlagsIsSynth) | |||
| if (pData->latency.frames != 0 || hasMidiOut) | |||
| pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
| else if (options & PLUGIN_OPTION_FIXED_BUFFERS) | |||
| pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
| if (fEffect->numPrograms > 1) | |||
| pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
| if (fEffect->flags & effFlagsProgramChunks) | |||
| pData->options |= PLUGIN_OPTION_USE_CHUNKS; | |||
| if (hasMidiInput()) | |||
| if (hasMidiOut) | |||
| { | |||
| pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
| pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||
| pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||
| pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||
| pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
| if (options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) | |||
| pData->options |= PLUGIN_OPTION_SEND_CONTROL_CHANGES; | |||
| } | |||
| else if (options & PLUGIN_OPTION_FIXED_BUFFERS) | |||
| pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
| return true; | |||
| @@ -2338,7 +2349,7 @@ private: | |||
| return 1; | |||
| case audioMasterGetVendorVersion: | |||
| return 0x110; // 1.1.0 | |||
| return CARLA_VERSION_HEX; | |||
| case audioMasterCanDo: | |||
| CARLA_SAFE_ASSERT_RETURN(ptr != nullptr, 0); | |||