From 4fbce1ac7b361c352c934cd491f3ee36facf0baf Mon Sep 17 00:00:00 2001 From: Paolo Date: Mon, 16 Jun 2025 14:42:46 +0200 Subject: [PATCH] lv2 messaging: error checking, ifdefs, code cleaning and better names --- templates/lv2/src/lv2.c | 136 +++++++++++++++++++++------------------- 1 file changed, 72 insertions(+), 64 deletions(-) diff --git a/templates/lv2/src/lv2.c b/templates/lv2/src/lv2.c index e3abe35..4412c5f 100644 --- a/templates/lv2/src/lv2.c +++ b/templates/lv2/src/lv2.c @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with Tibia. If not, see . * - * File author: Stefano D'Angelo + * File authors: Stefano D'Angelo, Paolo Marrone */ #include @@ -98,21 +98,18 @@ static float adjust_param(size_t index, float value) { #ifdef DATA_MESSAGING typedef struct { - LV2_URID prop_customMessage; - LV2_URID atom_String; - LV2_URID atom_eventTransfer; - LV2_URID ui_On; - LV2_URID length; -} communication_URIs; + LV2_URID eventTransfer; + LV2_URID message; + LV2_URID message_length; + LV2_URID message_body; +} messaing_URIs; -static inline void map_comm_uris(LV2_URID_Map* map, communication_URIs* uris) { - uris->prop_customMessage = map->map(map->handle, "http://example.org#message"); - uris->atom_String = map->map(map->handle, LV2_ATOM__String); - uris->atom_eventTransfer = map->map(map->handle, LV2_ATOM__eventTransfer); - uris->ui_On = map->map(map->handle, DATA_LV2_URI "#UIOn"); - uris->length = map->map(map->handle, LV2_ATOM__Int); +static inline void messaing_URIs_map(LV2_URID_Map* map, messaing_URIs* uris) { + uris->eventTransfer = map->map(map->handle, LV2_ATOM__eventTransfer); + uris->message = map->map(map->handle, DATA_LV2_URI"#message"); + uris->message_length = map->map(map->handle, LV2_ATOM__Int); + uris->message_body = map->map(map->handle, DATA_LV2_URI"#message_body"); } - #endif typedef struct { @@ -156,14 +153,14 @@ typedef struct { LV2_State_Store_Function state_store; LV2_State_Handle state_handle; #endif - #ifdef DATA_MESSAGING - LV2_Atom_Forge forge; - LV2_Atom_Forge_Frame frame; - - communication_URIs c_uris; - const LV2_Atom_Sequence* control; - LV2_Atom_Sequence* notify; + struct { + messaing_URIs URIs; + const LV2_Atom_Sequence *control; + LV2_Atom_Sequence *notify; + LV2_Atom_Forge forge; + LV2_Atom_Forge_Frame frame; + } messaging; #endif } plugin_instance; @@ -209,22 +206,22 @@ static char send_to_ui (void *handle, const void *data, size_t bytes) { return 1; } - const uint32_t space = i->notify->atom.size; - lv2_atom_forge_set_buffer(&i->forge, (uint8_t*)i->notify, space); - lv2_atom_forge_sequence_head(&i->forge, &i->frame, 0); + const uint32_t space = i->messaging.notify->atom.size; + lv2_atom_forge_set_buffer(&i->messaging.forge, (uint8_t*)i->messaging.notify, space); + if (!lv2_atom_forge_sequence_head(&i->messaging.forge, &i->messaging.frame, 0)) return 1; LV2_Atom_Forge_Frame frame; - lv2_atom_forge_frame_time(&i->forge, 0); - lv2_atom_forge_object(&i->forge, &frame, 0, i->c_uris.prop_customMessage); + if (!lv2_atom_forge_frame_time(&i->messaging.forge, 0)) return 1; + if (!lv2_atom_forge_object(&i->messaging.forge, &frame, 0, i->messaging.URIs.message)) return 1; - lv2_atom_forge_key(&i->forge, i->c_uris.length); - lv2_atom_forge_int(&i->forge, (int32_t)bytes); + if (!lv2_atom_forge_key(&i->messaging.forge, i->messaging.URIs.message_length)) return 1; + if (!lv2_atom_forge_int(&i->messaging.forge, (int32_t)bytes)) return 1; - lv2_atom_forge_key(&i->forge, i->c_uris.prop_customMessage); - lv2_atom_forge_write(&i->forge, data, bytes); + if (!lv2_atom_forge_key(&i->messaging.forge, i->messaging.URIs.message_body)) return 1; + if (!lv2_atom_forge_write(&i->messaging.forge, data, bytes)) return 1; - lv2_atom_forge_pop(&i->forge, &frame); + lv2_atom_forge_pop(&i->messaging.forge, &frame); return 0; } @@ -312,8 +309,8 @@ static LV2_Handle instantiate(const struct LV2_Descriptor * descriptor, double s instance->c[i] = NULL; #endif #ifdef DATA_MESSAGING - lv2_atom_forge_init(&instance->forge, instance->map); - map_comm_uris(instance->map, &instance->c_uris); + lv2_atom_forge_init(&instance->messaging.forge, instance->map); + messaing_URIs_map(instance->map, &instance->messaging.URIs); #endif return instance; @@ -364,11 +361,11 @@ static void connect_port(LV2_Handle instance, uint32_t port, void * data_locatio #ifdef DATA_MESSAGING if (port < DATA_MESSAGING_PORTS_N) { if (port == 0) { - i->control = (const LV2_Atom_Sequence*)data_location; + i->messaging.control = (const LV2_Atom_Sequence*)data_location; return; } if (port == 1) { - i->notify = (LV2_Atom_Sequence*)data_location; + i->messaging.notify = (LV2_Atom_Sequence*)data_location; return; } } @@ -403,26 +400,29 @@ static void run(LV2_Handle instance, uint32_t sample_count) { plugin_instance * i = (plugin_instance *)instance; #ifdef DATA_MESSAGING - LV2_ATOM_SEQUENCE_FOREACH(i->control, ev) { - if (!lv2_atom_forge_is_object_type(&i->forge, ev->body.type)) + LV2_ATOM_SEQUENCE_FOREACH(i->messaging.control, ev) { + if (!lv2_atom_forge_is_object_type(&i->messaging.forge, ev->body.type)) continue; const LV2_Atom_Object* obj = (const LV2_Atom_Object*)&ev->body; - if (obj->body.otype != i->c_uris.prop_customMessage) + if (obj->body.otype != i->messaging.URIs.message) continue; const LV2_Atom* msg_length = NULL; const LV2_Atom* msg_data = NULL; lv2_atom_object_get(obj, - i->c_uris.length, + i->messaging.URIs.message_length, &msg_length, - i->c_uris.prop_customMessage, + i->messaging.URIs.message_body, &msg_data, 0); - size_t *length = (size_t*) LV2_ATOM_BODY(msg_length); - uint8_t *data = (uint8_t*) msg_data; // LV2_ATOM_BODY(msg_data); + if (!msg_length || !msg_data) + continue; + + size_t *length = (size_t*) LV2_ATOM_BODY(msg_length); + void *data = (void*) msg_data; // LV2_ATOM_BODY(msg_data); plugin_receive_from_ui(&i->p, data, *length); } @@ -631,11 +631,13 @@ typedef struct { LV2UI_Touch touch; # endif # ifdef DATA_MESSAGING - LV2_URID_Map* map; - LV2_Atom_Forge forge; - LV2_Atom_Forge_Frame frame; - communication_URIs c_uris; - uint8_t obj_buf[DATA_MESSAGING_MAX]; + struct { + messaing_URIs URIs; + LV2_URID_Map *map; + LV2_Atom_Forge forge; + LV2_Atom_Forge_Frame frame; + uint8_t obj_buf[DATA_MESSAGING_MAX]; + } messaging; # endif } ui_instance; @@ -681,19 +683,20 @@ static char send_to_dsp (void *handle, const void *data, size_t bytes) { return 1; } - lv2_atom_forge_set_buffer(&instance->forge, instance->obj_buf, sizeof(instance->obj_buf)); + lv2_atom_forge_set_buffer(&instance->messaging.forge, instance->messaging.obj_buf, sizeof(instance->messaging.obj_buf)); - LV2_Atom* msg = (LV2_Atom*) lv2_atom_forge_object(&instance->forge, &instance->frame, 0, instance->c_uris.prop_customMessage); + LV2_Atom* msg = (LV2_Atom*) lv2_atom_forge_object(&instance->messaging.forge, &instance->messaging.frame, 0, instance->messaging.URIs.message); + if (!msg) return 1; - lv2_atom_forge_key(&instance->forge, instance->c_uris.length); - lv2_atom_forge_int(&instance->forge, (int32_t)bytes); + if (!lv2_atom_forge_key(&instance->messaging.forge, instance->messaging.URIs.message_length)) return 1; + if (!lv2_atom_forge_int(&instance->messaging.forge, (int32_t)bytes)) return 1; - lv2_atom_forge_key(&instance->forge, instance->c_uris.prop_customMessage); - lv2_atom_forge_write(&instance->forge, data, bytes); + if (!lv2_atom_forge_key(&instance->messaging.forge, instance->messaging.URIs.message_body)) return 1; + if (!lv2_atom_forge_write(&instance->messaging.forge, data, bytes)) return 1; - lv2_atom_forge_pop(&instance->forge, &instance->frame); + lv2_atom_forge_pop(&instance->messaging.forge, &instance->messaging.frame); - instance->write(instance->controller, DATA_MESSAGING_PORT_IN, lv2_atom_total_size(msg), instance->c_uris.atom_eventTransfer, msg); + instance->write(instance->controller, DATA_MESSAGING_PORT_IN, lv2_atom_total_size(msg), instance->messaging.URIs.eventTransfer, msg); return 0; } @@ -756,13 +759,15 @@ static LV2UI_Handle ui_instantiate(const LV2UI_Descriptor * descriptor, const ch *widget = instance->ui->widget; +# ifdef DATA_MESSAGING for (int i = 0; features[i]; ++i) { if (!strcmp(features[i]->URI, LV2_URID_URI "#map")) { - instance->map = (LV2_URID_Map*)features[i]->data; + instance->messaging.map = (LV2_URID_Map*)features[i]->data; } } - lv2_atom_forge_init(&instance->forge, instance->map); - map_comm_uris(instance->map, &instance->c_uris); + lv2_atom_forge_init(&instance->messaging.forge, instance->messaging.map); + messaing_URIs_map(instance->messaging.map, &instance->messaging.URIs); +# endif return instance; @@ -800,25 +805,28 @@ static void ui_port_event(LV2UI_Handle handle, uint32_t port_index, uint32_t buf plugin_ui_set_parameter(instance->ui, param_out_index[port_index - CONTROL_OUTPUT_INDEX_OFFSET], *((float *)buffer)); # endif } - - else if (format == instance->c_uris.atom_eventTransfer) { +# ifdef DATA_MESSAGING + else if (format == instance->messaging.URIs.eventTransfer) { const LV2_Atom* atom = (const LV2_Atom*)buffer; - if (lv2_atom_forge_is_object_type(&instance->forge, atom->type)) { + if (lv2_atom_forge_is_object_type(&instance->messaging.forge, atom->type)) { const LV2_Atom_Object* obj = (const LV2_Atom_Object*)atom; - if (obj->body.otype == instance->c_uris.prop_customMessage) { + if (obj->body.otype == instance->messaging.URIs.message) { const LV2_Atom* len_a = NULL; const LV2_Atom* data_a = NULL; lv2_atom_object_get(obj, - instance->c_uris.length, &len_a, - instance->c_uris.prop_customMessage, &data_a, NULL); + instance->messaging.URIs.message_length, &len_a, + instance->messaging.URIs.message_body, &data_a, NULL); + if (!len_a || !data_a) + return; const int32_t len = ((const LV2_Atom_Int*) len_a)->body; const uint8_t* data = (uint8_t*) data_a; plugin_ui_receive_from_dsp(instance->ui, data, len); } } } +# endif } # endif