aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/control.c9
-rw-r--r--src/jack.c6
-rw-r--r--src/jalv.c54
-rw-r--r--src/jalv_gtk.c17
-rw-r--r--src/log.c70
-rw-r--r--src/log.h18
-rw-r--r--src/portaudio.c12
-rw-r--r--src/state.c16
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;
diff --git a/src/jack.c b/src/jack.c
index 021e5b7..0f55e6d 100644
--- a/src/jack.c
+++ b/src/jack.c
@@ -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);
diff --git a/src/jalv.c b/src/jalv.c
index ea1573c..609fcb9 100644
--- a/src/jalv.c
+++ b/src/jalv.c
@@ -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;
}
diff --git a/src/log.c b/src/log.c
index ae0705b..ae7b126 100644
--- a/src/log.c
+++ b/src/log.c
@@ -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
diff --git a/src/log.h b/src/log.h
index a08edd7..f5b9b08 100644
--- a/src/log.h
+++ b/src/log.h
@@ -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;
}