Browse Source

Ensure all LV2 port_event calls use the correct atom size, closes #151

tags/1.9.5
falkTX 11 years ago
parent
commit
45b1bef1ea
3 changed files with 25 additions and 23 deletions
  1. +10
    -12
      source/backend/plugin/Lv2Plugin.cpp
  2. +7
    -9
      source/bridges-ui/CarlaBridgeUI-LV2.cpp
  3. +8
    -2
      source/utils/CarlaLv2Utils.hpp

+ 10
- 12
source/backend/plugin/Lv2Plugin.cpp View File

@@ -1329,14 +1329,14 @@ public:
{
if (pData->osc.data.target != nullptr)
{
CarlaString chunk(CarlaString::asBase64(atom, sizeof(LV2_Atom)+atom->size));
CarlaString chunk(CarlaString::asBase64(atom, lv2_atom_total_size(atom)));
osc_send_lv2_atom_transfer(pData->osc.data, portIndex, chunk.buffer());
}
}
else
{
if (hasPortEvent)
fUI.descriptor->port_event(fUI.handle, portIndex, atom->size, CARLA_URI_MAP_ID_ATOM_TRANSFER_EVENT, atom);
fUI.descriptor->port_event(fUI.handle, portIndex, lv2_atom_total_size(atom), CARLA_URI_MAP_ID_ATOM_TRANSFER_EVENT, atom);
}
}
}
@@ -3783,7 +3783,7 @@ public:
if (fUI.handle != nullptr && fUI.descriptor != nullptr && fUI.descriptor->port_event != nullptr)
{
CARLA_SAFE_ASSERT_RETURN(pData->param.data[index].rindex >= 0,);
fUI.descriptor->port_event(fUI.handle, static_cast<uint32_t>(pData->param.data[index].rindex), sizeof(float), 0, &value);
fUI.descriptor->port_event(fUI.handle, static_cast<uint32_t>(pData->param.data[index].rindex), sizeof(float), CARLA_URI_MAP_ID_NULL, &value);
}
}
}
@@ -3828,14 +3828,13 @@ public:
if (fUI.handle != nullptr && fUI.descriptor != nullptr && fUI.descriptor->port_event != nullptr && fEventsIn.ctrl != nullptr)
{
LV2_Atom_MidiEvent midiEv;
midiEv.event.time.frames = 0;
midiEv.event.body.type = CARLA_URI_MAP_ID_MIDI_EVENT;
midiEv.event.body.size = 3;
midiEv.atom.type = CARLA_URI_MAP_ID_MIDI_EVENT;
midiEv.atom.size = 3;
midiEv.data[0] = uint8_t(MIDI_STATUS_NOTE_ON | (channel & MIDI_CHANNEL_BIT));
midiEv.data[1] = note;
midiEv.data[2] = velo;

fUI.descriptor->port_event(fUI.handle, fEventsIn.ctrl->rindex, 3, CARLA_URI_MAP_ID_ATOM_TRANSFER_ATOM, &midiEv);
fUI.descriptor->port_event(fUI.handle, fEventsIn.ctrl->rindex, lv2_atom_total_size(midiEv), CARLA_URI_MAP_ID_ATOM_TRANSFER_EVENT, &midiEv);
}
}
}
@@ -3861,14 +3860,13 @@ public:
if (fUI.handle != nullptr && fUI.descriptor != nullptr && fUI.descriptor->port_event != nullptr && fEventsIn.ctrl != nullptr)
{
LV2_Atom_MidiEvent midiEv;
midiEv.event.time.frames = 0;
midiEv.event.body.type = CARLA_URI_MAP_ID_MIDI_EVENT;
midiEv.event.body.size = 3;
midiEv.atom.type = CARLA_URI_MAP_ID_MIDI_EVENT;
midiEv.atom.size = 3;
midiEv.data[0] = uint8_t(MIDI_STATUS_NOTE_OFF | (channel & MIDI_CHANNEL_BIT));
midiEv.data[1] = note;
midiEv.data[2] = 0;

fUI.descriptor->port_event(fUI.handle, fEventsIn.ctrl->rindex, 3, CARLA_URI_MAP_ID_ATOM_TRANSFER_ATOM, &midiEv);
fUI.descriptor->port_event(fUI.handle, fEventsIn.ctrl->rindex, lv2_atom_total_size(midiEv), CARLA_URI_MAP_ID_ATOM_TRANSFER_EVENT, &midiEv);
}
}
}
@@ -4426,7 +4424,7 @@ public:
const LV2_Atom* const atom((const LV2_Atom*)buffer);

// plugins sometimes fail on this, not good...
CARLA_SAFE_ASSERT_INT2(bufferSize == lv2_atom_pad_size(static_cast<uint32_t>(sizeof(LV2_Atom)+atom->size)), bufferSize, atom->size);
CARLA_SAFE_ASSERT_INT2(bufferSize == lv2_atom_pad_size(lv2_atom_total_size(atom)), bufferSize, atom->size);

for (uint32_t i=0; i < fEventsIn.count; ++i)
{


+ 7
- 9
source/bridges-ui/CarlaBridgeUI-LV2.cpp View File

@@ -526,7 +526,7 @@ public:
if (fDescriptor->port_event == nullptr)
return;

fDescriptor->port_event(fHandle, static_cast<uint32_t>(rindex), sizeof(float), 0, &value);
fDescriptor->port_event(fHandle, static_cast<uint32_t>(rindex), sizeof(float), CARLA_URI_MAP_ID_NULL, &value);
}

void setProgram(const uint32_t) override
@@ -552,14 +552,13 @@ public:
return;

LV2_Atom_MidiEvent midiEv;
midiEv.event.time.frames = 0;
midiEv.event.body.type = CARLA_URI_MAP_ID_MIDI_EVENT;
midiEv.event.body.size = 3;
midiEv.atom.type = CARLA_URI_MAP_ID_MIDI_EVENT;
midiEv.atom.size = 3;
midiEv.data[0] = uint8_t(MIDI_STATUS_NOTE_ON | (channel & MIDI_CHANNEL_BIT));
midiEv.data[1] = note;
midiEv.data[2] = velo;

fDescriptor->port_event(fHandle, 0, 3, CARLA_URI_MAP_ID_ATOM_TRANSFER_ATOM, &midiEv);
fDescriptor->port_event(fHandle, /* TODO */ 0, lv2_atom_total_size(midiEv), CARLA_URI_MAP_ID_ATOM_TRANSFER_ATOM, &midiEv);
}

void noteOff(const uint8_t channel, const uint8_t note) override
@@ -571,14 +570,13 @@ public:
return;

LV2_Atom_MidiEvent midiEv;
midiEv.event.time.frames = 0;
midiEv.event.body.type = CARLA_URI_MAP_ID_MIDI_EVENT;
midiEv.event.body.size = 3;
midiEv.atom.type = CARLA_URI_MAP_ID_MIDI_EVENT;
midiEv.atom.size = 3;
midiEv.data[0] = uint8_t(MIDI_STATUS_NOTE_OFF | (channel & MIDI_CHANNEL_BIT));
midiEv.data[1] = note;
midiEv.data[2] = 0;

fDescriptor->port_event(fHandle, 0, 3, CARLA_URI_MAP_ID_ATOM_TRANSFER_ATOM, &midiEv);
fDescriptor->port_event(fHandle, /* TODO */ 0, lv2_atom_total_size(midiEv), CARLA_URI_MAP_ID_ATOM_TRANSFER_ATOM, &midiEv);
}

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


+ 8
- 2
source/utils/CarlaLv2Utils.hpp View File

@@ -105,10 +105,16 @@
// Custom Atom types

struct LV2_Atom_MidiEvent {
LV2_Atom_Event event;
uint8_t data[4];
LV2_Atom atom; /**< Atom header. */
uint8_t data[4]; /**< MIDI data (body). */
};

static inline
uint32_t lv2_atom_total_size(const LV2_Atom_MidiEvent& midiEv)
{
return static_cast<uint32_t>(sizeof(LV2_Atom)) + midiEv.atom.size;
}

// -----------------------------------------------------------------------
// Our LV2 World class



Loading…
Cancel
Save