diff options
-rw-r--r-- | src/jalv.c | 16 | ||||
-rw-r--r-- | src/lv2_evbuf.c | 9 |
2 files changed, 17 insertions, 8 deletions
@@ -424,7 +424,10 @@ jack_process_cb(jack_nframes_t nframes, void* data) for (size_t i = 0; i < space; i += sizeof(ev) + ev.size) { jack_ringbuffer_read(host->ui_events, (char*)&ev, sizeof(ev)); char body[ev.size]; - jack_ringbuffer_read(host->ui_events, body, ev.size); + if (jack_ringbuffer_read(host->ui_events, body, ev.size) != ev.size) { + fprintf(stderr, "error: Error reading from UI ring buffer\n"); + break; + } struct Port* const port = &host->ports[ev.index]; if (ev.protocol == 0) { assert(ev.size == sizeof(float)); @@ -468,6 +471,7 @@ jack_process_cb(jack_nframes_t nframes, void* data) uint8_t* data; lv2_evbuf_get(i, &frames, &subframes, &type, &size, &data); + assert(size > 0); // FIXME: check type jack_midi_event_write(buf, frames, data, size); @@ -551,10 +555,12 @@ jalv_ui_write(SuilController controller, } if (protocol == host->urids.atom_eventTransfer) { - SerdNode s = serd_node_from_string(SERD_BLANK, USTR("msg")); - SerdNode p = serd_node_from_string(SERD_URI, USTR(NS_RDF "value")); - char* str = atom_to_turtle(&host->unmap, &s, &p, (LV2_Atom*)buffer); - printf("\n## UI => Plugin ##\n%s\n", str); + SerdNode s = serd_node_from_string(SERD_BLANK, USTR("msg")); + SerdNode p = serd_node_from_string(SERD_URI, USTR(NS_RDF "value")); + + const LV2_Atom* atom = (const LV2_Atom*)buffer; + char* str = atom_to_turtle(&host->unmap, &s, &p, atom); + printf("\n## UI => Plugin (%u bytes) ##\n%s\n", atom->size, str); free(str); } diff --git a/src/lv2_evbuf.c b/src/lv2_evbuf.c index f3aea8d..3037e82 100644 --- a/src/lv2_evbuf.c +++ b/src/lv2_evbuf.c @@ -14,6 +14,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include <assert.h> #include <string.h> #include <stdlib.h> @@ -89,7 +90,7 @@ lv2_evbuf_reset(LV2_Evbuf* evbuf, bool input) break; case LV2_EVBUF_ATOM: if (input) { - evbuf->buf.atom.atom.size = 0; + evbuf->buf.atom.atom.size = sizeof(LV2_Atom_Sequence_Body); evbuf->buf.atom.atom.type = evbuf->atom_Sequence; } else { evbuf->buf.atom.atom.size = evbuf->capacity; @@ -105,8 +106,10 @@ lv2_evbuf_get_size(LV2_Evbuf* evbuf) case LV2_EVBUF_EVENT: return evbuf->buf.event.size; case LV2_EVBUF_ATOM: + assert(evbuf->buf.atom.atom.type != evbuf->atom_Sequence + || evbuf->buf.atom.atom.size >= sizeof(LV2_Atom_Sequence_Body)); return evbuf->buf.atom.atom.type == evbuf->atom_Sequence - ? evbuf->buf.atom.atom.size + ? evbuf->buf.atom.atom.size - sizeof(LV2_Atom_Sequence_Body) : 0; } return 0; @@ -134,7 +137,7 @@ lv2_evbuf_begin(LV2_Evbuf* evbuf) LV2_Evbuf_Iterator lv2_evbuf_end(LV2_Evbuf* evbuf) { - const size_t size = lv2_evbuf_get_size(evbuf); + const uint32_t size = lv2_evbuf_get_size(evbuf); const LV2_Evbuf_Iterator iter = { evbuf, lv2_evbuf_pad_size(size) }; return iter; } |