| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * Carla LV2 Plugin | * Carla LV2 Plugin | ||||
| * Copyright (C) 2011-2016 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2011-2017 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
| * modify it under the terms of the GNU General Public License as | * modify it under the terms of the GNU General Public License as | ||||
| @@ -3373,17 +3373,19 @@ public: | |||||
| } // End of Plugin processing (no events) | } // End of Plugin processing (no events) | ||||
| // -------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------- | ||||
| // MIDI Output | |||||
| // Events/MIDI Output | |||||
| if (fEventsOut.ctrl != nullptr) | |||||
| for (uint32_t i=0; i < fEventsOut.count; ++i) | |||||
| { | { | ||||
| if (fEventsOut.ctrl->type & CARLA_EVENT_DATA_ATOM) | |||||
| Lv2EventData& evData(fEventsOut.data[i]); | |||||
| if (evData.type & CARLA_EVENT_DATA_ATOM) | |||||
| { | { | ||||
| const LV2_Atom_Event* ev; | const LV2_Atom_Event* ev; | ||||
| LV2_Atom_Buffer_Iterator iter; | LV2_Atom_Buffer_Iterator iter; | ||||
| uint8_t* data; | uint8_t* data; | ||||
| lv2_atom_buffer_begin(&iter, fEventsOut.ctrl->atom); | |||||
| lv2_atom_buffer_begin(&iter, evData.atom); | |||||
| for (;;) | for (;;) | ||||
| { | { | ||||
| @@ -3395,29 +3397,29 @@ public: | |||||
| if (ev->body.type == CARLA_URI_MAP_ID_MIDI_EVENT) | if (ev->body.type == CARLA_URI_MAP_ID_MIDI_EVENT) | ||||
| { | { | ||||
| if (fEventsOut.ctrl->port != nullptr) | |||||
| if (evData.port != nullptr) | |||||
| { | { | ||||
| CARLA_SAFE_ASSERT_CONTINUE(ev->time.frames >= 0); | CARLA_SAFE_ASSERT_CONTINUE(ev->time.frames >= 0); | ||||
| CARLA_SAFE_ASSERT_CONTINUE(ev->body.size < 0xFF); | CARLA_SAFE_ASSERT_CONTINUE(ev->body.size < 0xFF); | ||||
| fEventsOut.ctrl->port->writeMidiEvent(static_cast<uint32_t>(ev->time.frames), static_cast<uint8_t>(ev->body.size), data); | |||||
| evData.port->writeMidiEvent(static_cast<uint32_t>(ev->time.frames), static_cast<uint8_t>(ev->body.size), data); | |||||
| } | } | ||||
| } | } | ||||
| else //if (ev->body.type == CARLA_URI_MAP_ID_ATOM_BLANK) | else //if (ev->body.type == CARLA_URI_MAP_ID_ATOM_BLANK) | ||||
| { | { | ||||
| //carla_stdout("Got out event, %s", carla_lv2_urid_unmap(this, ev->body.type)); | //carla_stdout("Got out event, %s", carla_lv2_urid_unmap(this, ev->body.type)); | ||||
| fAtomBufferOut.put(&ev->body, fEventsOut.ctrl->rindex); | |||||
| fAtomBufferOut.put(&ev->body, evData.rindex); | |||||
| } | } | ||||
| lv2_atom_buffer_increment(&iter); | lv2_atom_buffer_increment(&iter); | ||||
| } | } | ||||
| } | } | ||||
| else if ((fEventsOut.ctrl->type & CARLA_EVENT_DATA_EVENT) != 0 && fEventsOut.ctrl->port != nullptr) | |||||
| else if ((evData.type & CARLA_EVENT_DATA_EVENT) != 0 && evData.port != nullptr) | |||||
| { | { | ||||
| const LV2_Event* ev; | const LV2_Event* ev; | ||||
| LV2_Event_Iterator iter; | LV2_Event_Iterator iter; | ||||
| uint8_t* data; | uint8_t* data; | ||||
| lv2_event_begin(&iter, fEventsOut.ctrl->event); | |||||
| lv2_event_begin(&iter, evData.event); | |||||
| for (;;) | for (;;) | ||||
| { | { | ||||
| @@ -3430,15 +3432,15 @@ public: | |||||
| if (ev->type == CARLA_URI_MAP_ID_MIDI_EVENT) | if (ev->type == CARLA_URI_MAP_ID_MIDI_EVENT) | ||||
| { | { | ||||
| CARLA_SAFE_ASSERT_CONTINUE(ev->size < 0xFF); | CARLA_SAFE_ASSERT_CONTINUE(ev->size < 0xFF); | ||||
| fEventsOut.ctrl->port->writeMidiEvent(ev->frames, static_cast<uint8_t>(ev->size), data); | |||||
| evData.port->writeMidiEvent(ev->frames, static_cast<uint8_t>(ev->size), data); | |||||
| } | } | ||||
| lv2_event_increment(&iter); | lv2_event_increment(&iter); | ||||
| } | } | ||||
| } | } | ||||
| else if ((fEventsOut.ctrl->type & CARLA_EVENT_DATA_MIDI_LL) != 0 && fEventsOut.ctrl->port != nullptr) | |||||
| else if ((evData.type & CARLA_EVENT_DATA_MIDI_LL) != 0 && evData.port != nullptr) | |||||
| { | { | ||||
| LV2_MIDIState state = { &fEventsOut.ctrl->midi, frames, 0 }; | |||||
| LV2_MIDIState state = { &evData.midi, frames, 0 }; | |||||
| uint32_t eventSize; | uint32_t eventSize; | ||||
| double eventTime; | double eventTime; | ||||
| @@ -3457,7 +3459,7 @@ public: | |||||
| CARLA_SAFE_ASSERT_CONTINUE(eventSize < 0xFF); | CARLA_SAFE_ASSERT_CONTINUE(eventSize < 0xFF); | ||||
| CARLA_SAFE_ASSERT_CONTINUE(eventTime >= 0.0); | CARLA_SAFE_ASSERT_CONTINUE(eventTime >= 0.0); | ||||
| fEventsOut.ctrl->port->writeMidiEvent(static_cast<uint32_t>(eventTime), static_cast<uint8_t>(eventSize), eventData); | |||||
| evData.port->writeMidiEvent(static_cast<uint32_t>(eventTime), static_cast<uint8_t>(eventSize), eventData); | |||||
| lv2midi_step(&state); | lv2midi_step(&state); | ||||
| } | } | ||||
| } | } | ||||