|
|
@@ -328,9 +328,6 @@ public: |
|
|
|
|
|
|
|
uint options = 0x0; |
|
|
|
|
|
|
|
if (hasMidiProgs && (fDescriptor->supports & NATIVE_PLUGIN_SUPPORTS_PROGRAM_CHANGES) == 0) |
|
|
|
options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; |
|
|
|
|
|
|
|
if (getMidiInCount() == 0 && (fDescriptor->hints & NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS) == 0) |
|
|
|
options |= PLUGIN_OPTION_FIXED_BUFFERS; |
|
|
|
|
|
|
@@ -353,6 +350,11 @@ public: |
|
|
|
if (fDescriptor->supports & NATIVE_PLUGIN_SUPPORTS_ALL_SOUND_OFF) |
|
|
|
options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; |
|
|
|
|
|
|
|
if (fDescriptor->supports & NATIVE_PLUGIN_SUPPORTS_PROGRAM_CHANGES) |
|
|
|
options |= PLUGIN_OPTION_SEND_PROGRAM_CHANGES; |
|
|
|
else if (hasMidiProgs) |
|
|
|
options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; |
|
|
|
|
|
|
|
return options; |
|
|
|
} |
|
|
|
|
|
|
@@ -1628,7 +1630,6 @@ public: |
|
|
|
NativeMidiEvent& nativeEvent(fMidiEvents[fMidiEventCount++]); |
|
|
|
carla_zeroStruct(nativeEvent); |
|
|
|
|
|
|
|
nativeEvent.port = 0; |
|
|
|
nativeEvent.time = sampleAccurate ? startTime : event.time; |
|
|
|
nativeEvent.data[0] = uint8_t(MIDI_STATUS_CONTROL_CHANGE | (event.channel & MIDI_CHANNEL_BIT)); |
|
|
|
nativeEvent.data[1] = MIDI_CONTROL_ALL_SOUND_OFF; |
|
|
@@ -2140,19 +2141,18 @@ protected: |
|
|
|
{ |
|
|
|
CARLA_SAFE_ASSERT_RETURN(pData->enabled, false); |
|
|
|
CARLA_SAFE_ASSERT_RETURN(fIsProcessing, false); |
|
|
|
CARLA_SAFE_ASSERT_RETURN(fMidiOut.count > 0, false); |
|
|
|
CARLA_SAFE_ASSERT_RETURN(pData->event.portOut != nullptr, false); |
|
|
|
CARLA_SAFE_ASSERT_RETURN(fMidiOut.count > 0 || pData->event.portOut != nullptr, false); |
|
|
|
CARLA_SAFE_ASSERT_RETURN(event != nullptr, false); |
|
|
|
CARLA_SAFE_ASSERT_RETURN(event->data[0] != 0, false); |
|
|
|
|
|
|
|
// reverse-find first free event, and put it there |
|
|
|
for (uint32_t i=(kPluginMaxMidiEvents*2)-1; i >= fMidiEventCount; --i) |
|
|
|
{ |
|
|
|
if (fMidiEvents[i].data[0] == 0) |
|
|
|
{ |
|
|
|
std::memcpy(&fMidiEvents[i], event, sizeof(NativeMidiEvent)); |
|
|
|
return true; |
|
|
|
} |
|
|
|
if (fMidiEvents[i].data[0] != 0) |
|
|
|
continue; |
|
|
|
|
|
|
|
std::memcpy(&fMidiEvents[i], event, sizeof(NativeMidiEvent)); |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
carla_stdout("CarlaPluginNative::handleWriteMidiEvent(%p) - buffer full", event); |
|
|
@@ -2346,9 +2346,6 @@ public: |
|
|
|
|
|
|
|
pData->options = 0x0; |
|
|
|
|
|
|
|
if (hasMidiProgs && (fDescriptor->supports & NATIVE_PLUGIN_SUPPORTS_PROGRAM_CHANGES) == 0) |
|
|
|
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; |
|
|
|
|
|
|
|
if (getMidiInCount() > 0 || (fDescriptor->hints & NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS) != 0) |
|
|
|
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; |
|
|
|
|
|
|
@@ -2364,6 +2361,17 @@ public: |
|
|
|
if (fDescriptor->supports & NATIVE_PLUGIN_SUPPORTS_ALL_SOUND_OFF) |
|
|
|
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; |
|
|
|
|
|
|
|
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) |
|
|
|
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; |
|
|
|
|
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|