Browse Source

vst-plugin: Simplify code for handling MIDI, working MIDI-Out

tags/1.9.5
falkTX 11 years ago
parent
commit
4a64d89442
1 changed files with 21 additions and 46 deletions
  1. +21
    -46
      source/plugin/carla-vst.cpp

+ 21
- 46
source/plugin/carla-vst.cpp View File

@@ -153,7 +153,7 @@ public:
fHandle = fDescriptor->instantiate(&fHost); fHandle = fDescriptor->instantiate(&fHost);
CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr, false); CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr, false);


carla_zeroStruct<NativeMidiEvent>(fMidiEvents, kMaxMidiEvents*2);
carla_zeroStruct<NativeMidiEvent>(fMidiEvents, kMaxMidiEvents);
carla_zeroStruct<NativeTimeInfo>(fTimeInfo); carla_zeroStruct<NativeTimeInfo>(fTimeInfo);


return true; return true;
@@ -196,7 +196,6 @@ public:
fDescriptor->activate(fHandle); fDescriptor->activate(fHandle);


fMidiEventCount = 0; fMidiEventCount = 0;
carla_zeroStruct<NativeMidiEvent>(fMidiEvents, kMaxMidiEvents*2);
carla_zeroStruct<NativeTimeInfo>(fTimeInfo); carla_zeroStruct<NativeTimeInfo>(fTimeInfo);
} }
else else
@@ -294,7 +293,7 @@ public:
fMidiEvents[j].size = 3; fMidiEvents[j].size = 3;


for (uint32_t k=0; k<3; ++k) for (uint32_t k=0; k<3; ++k)
fMidiEvents[fMidiEventCount].data[k] = static_cast<uint8_t>(vstMidiEvent->midiData[k]);
fMidiEvents[j].data[k] = static_cast<uint8_t>(vstMidiEvent->midiData[k]);
} }
} }
break; break;
@@ -373,40 +372,12 @@ public:
fTimeInfo.bbt.barStartTick = fTimeInfo.bbt.ticksPerBeat*fTimeInfo.bbt.beatsPerBar*(fTimeInfo.bbt.bar-1); fTimeInfo.bbt.barStartTick = fTimeInfo.bbt.ticksPerBeat*fTimeInfo.bbt.beatsPerBar*(fTimeInfo.bbt.bar-1);
} }


const uint32_t oldMidiEventCount(fMidiEventCount);
fMidiOutEvents.numEvents = 0;


if (fHandle != nullptr) if (fHandle != nullptr)
fDescriptor->process(fHandle, const_cast<float**>(inputs), outputs, static_cast<uint32_t>(sampleFrames), fMidiEvents, fMidiEventCount); fDescriptor->process(fHandle, const_cast<float**>(inputs), outputs, static_cast<uint32_t>(sampleFrames), fMidiEvents, fMidiEventCount);


const uint32_t newMidiEventCount(fMidiEventCount);

fMidiEventCount = 0; fMidiEventCount = 0;
carla_zeroStruct<NativeMidiEvent>(fMidiEvents, kMaxMidiEvents*2);

CARLA_SAFE_ASSERT_RETURN(newMidiEventCount == oldMidiEventCount,);

fMidiOutEvents.numEvents = 0;

// reverse lookup MIDI events
for (uint32_t i = (kMaxMidiEvents*2)-1; i >= newMidiEventCount; --i)
{
if (fMidiEvents[i].data[0] == 0)
break;

NativeMidiEvent& midiEvent(fMidiEvents[i]);
VstMidiEvent& vstMidiEvent(fMidiOutEvents.mdata[i]);

vstMidiEvent.type = kVstMidiType;
vstMidiEvent.byteSize = kVstMidiEventSize;

uint8_t j=0;
for (; j<midiEvent.size; ++j)
vstMidiEvent.midiData[j] = static_cast<char>(midiEvent.data[j]);
for (; j<4; ++j)
vstMidiEvent.midiData[j] = 0;

++(fMidiOutEvents.numEvents);
}


if (fMidiOutEvents.numEvents > 0) if (fMidiOutEvents.numEvents > 0)
fAudioMaster(fEffect, audioMasterProcessEvents, 0, 0, &fMidiOutEvents, 0.0f); fAudioMaster(fEffect, audioMasterProcessEvents, 0, 0, &fMidiOutEvents, 0.0f);
@@ -441,15 +412,19 @@ protected:
CARLA_SAFE_ASSERT_RETURN(event != nullptr, false); CARLA_SAFE_ASSERT_RETURN(event != nullptr, false);
CARLA_SAFE_ASSERT_RETURN(event->data[0] != 0, false); CARLA_SAFE_ASSERT_RETURN(event->data[0] != 0, false);


// reverse-find first free event, and put it there
for (uint32_t i=(kMaxMidiEvents*2)-1; i > fMidiEventCount; --i)
{
if (fMidiEvents[i].data[0] == 0)
{
std::memcpy(&fMidiEvents[i], event, sizeof(NativeMidiEvent));
return true;
}
}
if (fMidiOutEvents.numEvents >= static_cast<int32_t>(kMaxMidiEvents))
return false;

VstMidiEvent& vstMidiEvent(fMidiOutEvents.mdata[fMidiOutEvents.numEvents++]);

vstMidiEvent.type = kVstMidiType;
vstMidiEvent.byteSize = kVstMidiEventSize;

uint8_t i=0;
for (; i<event->size; ++i)
vstMidiEvent.midiData[i] = static_cast<char>(event->data[i]);
for (; i<4; ++i)
vstMidiEvent.midiData[i] = 0;


return false; return false;
} }
@@ -503,15 +478,15 @@ private:


// Temporary data // Temporary data
uint32_t fMidiEventCount; uint32_t fMidiEventCount;
NativeMidiEvent fMidiEvents[kMaxMidiEvents*2];
NativeMidiEvent fMidiEvents[kMaxMidiEvents];
NativeTimeInfo fTimeInfo; NativeTimeInfo fTimeInfo;
ERect fVstRect; ERect fVstRect;


struct FixedVstEvents { struct FixedVstEvents {
int32_t numEvents; int32_t numEvents;
intptr_t reserved; intptr_t reserved;
VstEvent* data[kMaxMidiEvents*2];
VstMidiEvent mdata[kMaxMidiEvents*2];
VstEvent* data[kMaxMidiEvents];
VstMidiEvent mdata[kMaxMidiEvents];


FixedVstEvents() FixedVstEvents()
: numEvents(0), : numEvents(0),
@@ -519,9 +494,9 @@ private:
data(), data(),
mdata() mdata()
{ {
for (uint32_t i=0; i<kMaxMidiEvents*2; ++i)
for (uint32_t i=0; i<kMaxMidiEvents; ++i)
data[i] = (VstEvent*)&mdata[i]; data[i] = (VstEvent*)&mdata[i];
carla_zeroStruct<VstMidiEvent>(mdata, kMaxMidiEvents*2);
carla_zeroStruct<VstMidiEvent>(mdata, kMaxMidiEvents);
} }


CARLA_DECLARE_NON_COPY_STRUCT(FixedVstEvents); CARLA_DECLARE_NON_COPY_STRUCT(FixedVstEvents);


Loading…
Cancel
Save