diff options
-rw-r--r-- | src/control.c | 9 | ||||
-rw-r--r-- | src/jack.c | 6 | ||||
-rw-r--r-- | src/jalv.c | 54 | ||||
-rw-r--r-- | src/jalv_gtk.c | 17 | ||||
-rw-r--r-- | src/log.c | 70 | ||||
-rw-r--r-- | src/log.h | 18 | ||||
-rw-r--r-- | src/portaudio.c | 12 | ||||
-rw-r--r-- | src/state.c | 16 |
8 files changed, 125 insertions, 77 deletions
diff --git a/src/control.c b/src/control.c index 3624d5c..23bdf05 100644 --- a/src/control.c +++ b/src/control.c @@ -5,6 +5,8 @@ #include "control.h" +#include "log.h" + #include "lilv/lilv.h" #include "lv2/atom/atom.h" #include "lv2/atom/forge.h" @@ -12,7 +14,6 @@ #include <stdbool.h> #include <stdint.h> -#include <stdio.h> #include <stdlib.h> #include <string.h> @@ -160,9 +161,9 @@ new_property_control(LilvWorld* const world, (id->value_type == forge->Int || id->value_type == forge->Long); if (!id->value_type) { - fprintf(stderr, - "Unknown value type for property <%s>\n", - lilv_node_as_string(property)); + jalv_log(JALV_LOG_WARNING, + "Unknown value type for property <%s>\n", + lilv_node_as_string(property)); } return id; @@ -274,7 +274,7 @@ jack_process_cb(jack_nframes_t nframes, void* data) ev->size = sizeof(float); *(float*)(ev + 1) = port->control; if (zix_ring_write(jalv->plugin_events, buf, sizeof(buf)) < sizeof(buf)) { - fprintf(stderr, "Plugin => UI buffer overflow!\n"); + jalv_log(JALV_LOG_ERR, "Plugin => UI buffer overflow!\n"); } } } @@ -510,7 +510,7 @@ jack_initialize(jack_client_t* const client, const char* const load_init) { const size_t args_len = strlen(load_init); if (args_len > JACK_LOAD_INIT_LIMIT) { - fprintf(stderr, "error: Too many arguments given\n"); + jalv_log(JALV_LOG_ERR, "Too many arguments given\n"); return -1; } @@ -562,7 +562,7 @@ jack_finish(void* const arg) Jalv* const jalv = (Jalv*)arg; if (jalv) { if (jalv_close(jalv)) { - fprintf(stderr, "Failed to close Jalv\n"); + jalv_log(JALV_LOG_ERR, "Failed to close Jalv\n"); } free(jalv); @@ -150,7 +150,7 @@ feature_is_supported(Jalv* jalv, const char* uri) static void die(const char* msg) { - fprintf(stderr, "%s\n", msg); + jalv_log(JALV_LOG_ERR, "%s\n", msg); exit(EXIT_FAILURE); } @@ -253,10 +253,9 @@ jalv_create_ports(Jalv* jalv) if (jalv->ports[index].type == TYPE_EVENT) { jalv->control_in = index; } else { - fprintf(stderr, - "warning: Non-event port %u has lv2:control designation, " - "ignored\n", - index); + jalv_log(JALV_LOG_WARNING, + "Non-event port %u has lv2:control designation, ignored\n", + index); } } @@ -368,9 +367,9 @@ jalv_create_controls(Jalv* jalv, bool writable) if (record->value_type) { add_control(&jalv->controls, record); } else { - fprintf(stderr, - "Parameter <%s> has unknown value type, ignored\n", - lilv_node_as_string(record->node)); + jalv_log(JALV_LOG_WARNING, + "Parameter <%s> has unknown value type, ignored\n", + lilv_node_as_string(record->node)); free(record); } } @@ -491,15 +490,15 @@ jalv_ui_write(void* const jalv_handle, Jalv* const jalv = (Jalv*)jalv_handle; if (protocol != 0 && protocol != jalv->urids.atom_eventTransfer) { - fprintf(stderr, - "UI write with unsupported protocol %u (%s)\n", - protocol, - unmap_uri(jalv, protocol)); + jalv_log(JALV_LOG_ERR, + "UI write with unsupported protocol %u (%s)\n", + protocol, + unmap_uri(jalv, protocol)); return; } if (port_index >= jalv->num_ports) { - fprintf(stderr, "UI write to out of range port index %u\n", port_index); + jalv_log(JALV_LOG_ERR, "UI write to invalid port index %u\n", port_index); return; } @@ -542,7 +541,7 @@ jalv_apply_ui_events(Jalv* jalv, uint32_t nframes) char body[MSG_BUFFER_SIZE]; if (zix_ring_read(jalv->ui_events, body, ev.size) != ev.size) { - fprintf(stderr, "error: Error reading from UI ring buffer\n"); + jalv_log(JALV_LOG_ERR, "Failed to read from UI ring buffer\n"); break; } @@ -561,8 +560,8 @@ jalv_apply_ui_events(Jalv* jalv, uint32_t nframes) atom->size, (const uint8_t*)LV2_ATOM_BODY_CONST(atom)); } else { - fprintf( - stderr, "error: Unknown control change protocol %u\n", ev.protocol); + jalv_log( + JALV_LOG_ERR, "Unknown control change protocol %u\n", ev.protocol); } } } @@ -628,7 +627,7 @@ jalv_send_to_ui(Jalv* jalv, return true; } - fprintf(stderr, "Plugin => UI buffer overflow!\n"); + jalv_log(JALV_LOG_ERR, "Plugin => UI buffer overflow\n"); return false; } @@ -718,13 +717,14 @@ jalv_apply_control_arg(Jalv* jalv, const char* s) char sym[256]; float val = 0.0f; if (sscanf(s, "%[^=]=%f", sym, &val) != 2) { - fprintf(stderr, "warning: Ignoring invalid value `%s'\n", s); + jalv_log(JALV_LOG_WARNING, "Ignoring invalid value `%s'\n", s); return false; } ControlID* control = jalv_control_by_symbol(jalv, sym); if (!control) { - fprintf(stderr, "warning: Ignoring value for unknown control `%s'\n", sym); + jalv_log( + JALV_LOG_WARNING, "Ignoring value for unknown control `%s'\n", sym); return false; } @@ -1018,7 +1018,7 @@ jalv_open(Jalv* const jalv, int* argc, char*** argv) jalv->world, &jalv->map, NULL, jalv->opts.load); } if (!state) { - fprintf(stderr, "Failed to load state from %s\n", jalv->opts.load); + jalv_log(JALV_LOG_ERR, "Failed to load state from %s\n", jalv->opts.load); jalv_close(jalv); return -2; } @@ -1032,7 +1032,7 @@ jalv_open(Jalv* const jalv, int* argc, char*** argv) } if (!plugin_uri) { - fprintf(stderr, "Missing plugin URI, try lv2ls to list plugins\n"); + jalv_log(JALV_LOG_ERR, "Missing plugin URI, try lv2ls to list plugins\n"); jalv_close(jalv); return -3; } @@ -1042,7 +1042,7 @@ jalv_open(Jalv* const jalv, int* argc, char*** argv) jalv->plugin = lilv_plugins_get_by_uri(plugins, plugin_uri); lilv_node_free(plugin_uri); if (!jalv->plugin) { - fprintf(stderr, "Failed to find plugin\n"); + jalv_log(JALV_LOG_ERR, "Failed to find plugin\n"); jalv_close(jalv); return -4; } @@ -1056,7 +1056,7 @@ jalv_open(Jalv* const jalv, int* argc, char*** argv) jalv->preset = state; lilv_node_free(preset); if (!state) { - fprintf(stderr, "Failed to find preset <%s>\n", jalv->opts.preset); + jalv_log(JALV_LOG_ERR, "Failed to find preset <%s>\n", jalv->opts.preset); jalv_close(jalv); return -5; } @@ -1107,7 +1107,7 @@ jalv_open(Jalv* const jalv, int* argc, char*** argv) jalv_create_controls(jalv, false); if (!(jalv->backend = jalv_backend_init(jalv))) { - fprintf(stderr, "Failed to connect to audio system\n"); + jalv_log(JALV_LOG_ERR, "Failed to connect to audio system\n"); jalv_close(jalv); return -6; } @@ -1217,7 +1217,7 @@ jalv_open(Jalv* const jalv, int* argc, char*** argv) jalv->feature_list = (const LV2_Feature**)calloc(1, sizeof(features)); if (!jalv->feature_list) { - fprintf(stderr, "Failed to allocate feature list\n"); + jalv_log(JALV_LOG_ERR, "Failed to allocate feature list\n"); jalv_close(jalv); return -7; } @@ -1228,7 +1228,7 @@ jalv_open(Jalv* const jalv, int* argc, char*** argv) LILV_FOREACH (nodes, f, req_feats) { const char* uri = lilv_node_as_uri(lilv_nodes_get(req_feats, f)); if (!feature_is_supported(jalv, uri)) { - fprintf(stderr, "Feature %s is not supported\n", uri); + jalv_log(JALV_LOG_ERR, "Feature %s is not supported\n", uri); jalv_close(jalv); return -8; } @@ -1239,7 +1239,7 @@ jalv_open(Jalv* const jalv, int* argc, char*** argv) jalv->instance = lilv_plugin_instantiate( jalv->plugin, jalv->sample_rate, jalv->feature_list); if (!jalv->instance) { - fprintf(stderr, "Failed to instantiate plugin.\n"); + jalv_log(JALV_LOG_ERR, "Failed to instantiate plugin.\n"); jalv_close(jalv); return -9; } diff --git a/src/jalv_gtk.c b/src/jalv_gtk.c index 98c9711..40f7e28 100644 --- a/src/jalv_gtk.c +++ b/src/jalv_gtk.c @@ -4,6 +4,7 @@ #include "control.h" #include "frontend.h" #include "jalv_internal.h" +#include "log.h" #include "nodes.h" #include "options.h" #include "port.h" @@ -688,7 +689,7 @@ control_changed(Jalv* jalv, } else if (GTK_IS_RANGE(widget)) { gtk_range_set_value(GTK_RANGE(widget), fvalue); } else { - fprintf(stderr, "Unknown widget type for value\n"); + jalv_log(JALV_LOG_WARNING, "Unknown widget type for value\n"); } if (controller->spin) { @@ -700,7 +701,7 @@ control_changed(Jalv* jalv, } else if (GTK_IS_FILE_CHOOSER(widget) && type == jalv->urids.atom_Path) { gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widget), (const char*)body); } else { - fprintf(stderr, "Unknown widget type for value\n"); + jalv_log(JALV_LOG_WARNING, "Unknown widget type for value\n"); } } @@ -717,12 +718,12 @@ patch_set_get(Jalv* jalv, value, 0); if (!*property) { - fprintf(stderr, "patch:Set message with no property\n"); + jalv_log(JALV_LOG_WARNING, "patch:Set message with no property\n"); return 1; } if ((*property)->atom.type != jalv->forge.URID) { - fprintf(stderr, "patch:Set property is not a URID\n"); + jalv_log(JALV_LOG_WARNING, "patch:Set property is not a URID\n"); return 1; } @@ -736,12 +737,12 @@ patch_put_get(Jalv* jalv, { lv2_atom_object_get(obj, jalv->urids.patch_body, (const LV2_Atom*)body, 0); if (!*body) { - fprintf(stderr, "patch:Put message with no body\n"); + jalv_log(JALV_LOG_WARNING, "patch:Put message with no body\n"); return 1; } if (!lv2_atom_forge_is_object_type(&jalv->forge, (*body)->atom.type)) { - fprintf(stderr, "patch:Put body is not an object\n"); + jalv_log(JALV_LOG_WARNING, "patch:Put body is not an object\n"); return 1; } @@ -824,7 +825,7 @@ jalv_ui_port_event(Jalv* jalv, } if (protocol != jalv->urids.atom_eventTransfer) { - fprintf(stderr, "Unknown port event protocol\n"); + jalv_log(JALV_LOG_WARNING, "Unknown port event protocol\n"); return; } @@ -847,7 +848,7 @@ jalv_ui_port_event(Jalv* jalv, } } } else { - fprintf(stderr, "Unknown object type\n"); + jalv_log(JALV_LOG_ERR, "Unknown object type\n"); } updating = false; } @@ -58,11 +58,41 @@ jalv_strjoin(const char* const a, const char* const b) } int -jalv_printf(LV2_Log_Handle handle, LV2_URID type, const char* fmt, ...) +jalv_vlog(const JalvLogLevel level, const char* const fmt, va_list ap) +{ + bool fancy = false; + switch (level) { + case JALV_LOG_ERR: + fancy = jalv_ansi_start(stderr, 31); + fprintf(stderr, "error: "); + break; + case JALV_LOG_WARNING: + fancy = jalv_ansi_start(stderr, 33); + fprintf(stderr, "warning: "); + break; + case JALV_LOG_DEBUG: + fancy = jalv_ansi_start(stderr, 32); + fprintf(stderr, "trace: "); + break; + } + + const int st = vfprintf(stderr, fmt, ap); + + if (fancy) { + jalv_ansi_reset(stderr); + } + + return st; +} + +int +jalv_log(const JalvLogLevel level, const char* const fmt, ...) { va_list args; va_start(args, fmt); - const int ret = jalv_vprintf(handle, type, fmt, args); + + const int ret = jalv_vlog(level, fmt, args); + va_end(args); return ret; } @@ -70,29 +100,31 @@ jalv_printf(LV2_Log_Handle handle, LV2_URID type, const char* fmt, ...) int jalv_vprintf(LV2_Log_Handle handle, LV2_URID type, const char* fmt, va_list ap) { - // TODO: Lock - Jalv* jalv = (Jalv*)handle; - bool fancy = true; + Jalv* const jalv = (Jalv*)handle; + if (type == jalv->urids.log_Trace && jalv->opts.trace) { - jalv_ansi_start(stderr, 32); - fprintf(stderr, "trace: "); - } else if (type == jalv->urids.log_Error) { - jalv_ansi_start(stderr, 31); - fprintf(stderr, "error: "); - } else if (type == jalv->urids.log_Warning) { - jalv_ansi_start(stderr, 33); - fprintf(stderr, "warning: "); - } else { - fancy = false; + return jalv_vlog(JALV_LOG_DEBUG, fmt, ap); } - const int st = vfprintf(stderr, fmt, ap); + if (type == jalv->urids.log_Error) { + return jalv_vlog(JALV_LOG_ERR, fmt, ap); + } - if (fancy) { - jalv_ansi_reset(stderr); + if (type == jalv->urids.log_Warning) { + return jalv_vlog(JALV_LOG_WARNING, fmt, ap); } - return st; + return vfprintf(stderr, fmt, ap); +} + +int +jalv_printf(LV2_Log_Handle handle, LV2_URID type, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + const int ret = jalv_vprintf(handle, type, fmt, args); + va_end(args); + return ret; } bool @@ -26,6 +26,12 @@ struct Port; // String and log utilities +typedef enum { + JALV_LOG_ERR = 3, + JALV_LOG_WARNING = 4, + JALV_LOG_DEBUG = 7, +} JalvLogLevel; + void jalv_print_control(Jalv* jalv, const struct Port* port, float value); @@ -35,14 +41,22 @@ jalv_strdup(const char* str); char* jalv_strjoin(const char* a, const char* b); -JALV_LOG_FUNC(3, 4) +JALV_LOG_FUNC(2, 0) int -jalv_printf(LV2_Log_Handle handle, LV2_URID type, const char* fmt, ...); +jalv_vlog(JalvLogLevel level, const char* fmt, va_list ap); + +JALV_LOG_FUNC(2, 3) +int +jalv_log(JalvLogLevel level, const char* fmt, ...); JALV_LOG_FUNC(3, 0) int jalv_vprintf(LV2_Log_Handle handle, LV2_URID type, const char* fmt, va_list ap); +JALV_LOG_FUNC(3, 4) +int +jalv_printf(LV2_Log_Handle handle, LV2_URID type, const char* fmt, ...); + bool jalv_ansi_start(FILE* stream, int color); diff --git a/src/portaudio.c b/src/portaudio.c index f50c262..fb8aec2 100644 --- a/src/portaudio.c +++ b/src/portaudio.c @@ -89,7 +89,7 @@ pa_process_cb(const void* inputs, ev->size = sizeof(float); *(float*)(ev + 1) = port->control; if (zix_ring_write(jalv->plugin_events, buf, sizeof(buf)) < sizeof(buf)) { - fprintf(stderr, "Plugin => UI buffer overflow!\n"); + jalv_log(JALV_LOG_ERR, "Plugin => UI buffer overflow\n"); } } } @@ -100,7 +100,7 @@ pa_process_cb(const void* inputs, static JalvBackend* pa_error(const char* msg, PaError err) { - fprintf(stderr, "error: %s (%s)\n", msg, Pa_GetErrorText(err)); + jalv_log(JALV_LOG_ERR, "%s (%s)\n", msg, Pa_GetErrorText(err)); Pa_Terminate(); return NULL; } @@ -187,8 +187,8 @@ jalv_backend_activate(Jalv* jalv) { const int st = Pa_StartStream(jalv->backend->stream); if (st != paNoError) { - fprintf( - stderr, "error: Error starting audio stream (%s)\n", Pa_GetErrorText(st)); + jalv_log( + JALV_LOG_ERR, "Error starting audio stream (%s)\n", Pa_GetErrorText(st)); } } @@ -197,8 +197,8 @@ jalv_backend_deactivate(Jalv* jalv) { const int st = Pa_CloseStream(jalv->backend->stream); if (st != paNoError) { - fprintf( - stderr, "error: Error closing audio stream (%s)\n", Pa_GetErrorText(st)); + jalv_log( + JALV_LOG_ERR, "Error closing audio stream (%s)\n", Pa_GetErrorText(st)); } } diff --git a/src/state.c b/src/state.c index 11fcb5c..6c00f86 100644 --- a/src/state.c +++ b/src/state.c @@ -95,9 +95,9 @@ jalv_load_presets(Jalv* jalv, PresetSink sink, void* data) sink(jalv, preset, label, data); lilv_nodes_free(labels); } else { - fprintf(stderr, - "Preset <%s> has no rdfs:label\n", - lilv_node_as_string(lilv_nodes_get(presets, i))); + jalv_log(JALV_LOG_WARNING, + "Preset <%s> has no rdfs:label\n", + lilv_node_as_string(lilv_nodes_get(presets, i))); } } lilv_nodes_free(presets); @@ -129,7 +129,7 @@ set_port_value(const char* port_symbol, Jalv* jalv = (Jalv*)user_data; struct Port* port = jalv_port_by_symbol(jalv, port_symbol); if (!port) { - fprintf(stderr, "error: Preset port `%s' is missing\n", port_symbol); + jalv_log(JALV_LOG_ERR, "Preset port `%s' is missing\n", port_symbol); return; } @@ -143,10 +143,10 @@ set_port_value(const char* port_symbol, } else if (type == jalv->forge.Long) { fvalue = *(const int64_t*)value; } else { - fprintf(stderr, - "error: Preset `%s' value has bad type <%s>\n", - port_symbol, - jalv->unmap.unmap(jalv->unmap.handle, type)); + jalv_log(JALV_LOG_ERR, + "Preset `%s' value has bad type <%s>\n", + port_symbol, + jalv->unmap.unmap(jalv->unmap.handle, type)); return; } |