1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-05-04 09:39:42 +02:00
audacity/lib-src/slv2/utils/lv2_inspect.c
2010-01-24 09:19:39 +00:00

287 lines
8.0 KiB
C

/* lv2_inspect - Display information about an LV2 plugin.
* Copyright (C) 2007 Dave Robillard <drobilla.net>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include CONFIG_H_PATH
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <slv2/slv2.h>
#include <locale.h>
SLV2Value event_class = NULL;
SLV2Value control_class = NULL;
void
print_port(SLV2Plugin p, uint32_t index, float* mins, float* maxes, float* defaults)
{
SLV2Port port = slv2_plugin_get_port_by_index(p, index);
printf("\n\tPort %d:\n", index);
SLV2Values classes = slv2_port_get_classes(p, port);
printf("\t\tClasses:\n");
for (unsigned i=0; i < slv2_values_size(classes); ++i) {
printf("\t\t\t%s\n", slv2_value_as_uri(slv2_values_get_at(classes, i)));
}
if (slv2_port_is_a(p, port, event_class)) {
SLV2Values supported = slv2_port_get_value_by_qname(p, port,
"lv2ev:supportsEvent");
if (slv2_values_size(supported) > 0) {
printf("\n\t\tSupported events:\n");
for (unsigned i=0; i < slv2_values_size(supported); ++i) {
printf("\t\t\t%s\n", slv2_value_as_uri(slv2_values_get_at(supported, i)));
}
}
slv2_values_free(supported);
}
SLV2ScalePoints points = slv2_port_get_scale_points(p, port);
if (points)
printf("\t\tScale Points:\n");
for (unsigned i=0; i < slv2_scale_points_size(points); ++i) {
SLV2ScalePoint p = slv2_scale_points_get_at(points, i);
printf("\t\t\t%s = \"%s\"\n",
slv2_value_as_string(slv2_scale_point_get_value(p)),
slv2_value_as_string(slv2_scale_point_get_label(p)));
}
slv2_scale_points_free(points);
SLV2Value val = slv2_port_get_symbol(p, port);
printf("\n\t\tSymbol: %s\n", slv2_value_as_string(val));
val = slv2_port_get_name(p, port);
printf("\t\tName: %s\n", slv2_value_as_string(val));
slv2_value_free(val);
if (slv2_port_is_a(p, port, control_class)) {
if (!isnan(mins[index]))
printf("\t\tMinimum: %f\n", mins[index]);
if (!isnan(mins[index]))
printf("\t\tMaximum: %f\n", maxes[index]);
if (!isnan(mins[index]))
printf("\t\tDefault: %f\n", defaults[index]);
}
SLV2Values properties = slv2_port_get_properties(p, port);
if (slv2_values_size(properties) > 0)
printf("\t\tProperties: ");
for (unsigned i=0; i < slv2_values_size(properties); ++i) {
if (i > 0) {
printf("\n\t\t ");
}
printf("%s\n", slv2_value_as_uri(slv2_values_get_at(properties, i)));
}
if (slv2_values_size(properties) > 0)
printf("\n");
slv2_values_free(properties);
}
void
print_plugin(SLV2Plugin p)
{
SLV2Value val = NULL;
printf("%s\n\n", slv2_value_as_uri(slv2_plugin_get_uri(p)));
val = slv2_plugin_get_name(p);
printf("\tName: %s\n", slv2_value_as_string(val));
slv2_value_free(val);
SLV2Value class_label = slv2_plugin_class_get_label(slv2_plugin_get_class(p));
printf("\tClass: %s\n", slv2_value_as_string(class_label));
val = slv2_plugin_get_author_name(p);
if (val) {
printf("\tAuthor: %s\n", slv2_value_as_string(val));
slv2_value_free(val);
}
val = slv2_plugin_get_author_email(p);
if (val) {
printf("\tAuthor Email: %s\n", slv2_value_as_uri(val));
slv2_value_free(val);
}
val = slv2_plugin_get_author_homepage(p);
if (val) {
printf("\tAuthor Homepage: %s\n", slv2_value_as_uri(val));
slv2_value_free(val);
}
if (slv2_plugin_has_latency(p)) {
uint32_t latency_port = slv2_plugin_get_latency_port_index(p);
printf("\tHas latency: yes, reported by port %d\n", latency_port);
} else {
printf("\tHas latency: no\n");
}
printf("\tBundle: %s\n", slv2_value_as_uri(slv2_plugin_get_bundle_uri(p)));
printf("\tBinary: %s\n", slv2_value_as_uri(slv2_plugin_get_library_uri(p)));
SLV2UIs uis = slv2_plugin_get_uis(p);
if (slv2_values_size(uis) > 0) {
printf("\tGUI: ");
for (unsigned i=0; i < slv2_uis_size(uis); ++i) {
SLV2UI ui = slv2_uis_get_at(uis, i);
printf("%s\n", slv2_value_as_uri(slv2_ui_get_uri(ui)));
const char* binary = slv2_value_as_uri(slv2_ui_get_binary_uri(ui));
SLV2Values types = slv2_ui_get_classes(ui);
for (unsigned i=0; i < slv2_values_size(types); ++i) {
printf("\t Class: %s\n",
slv2_value_as_uri(slv2_values_get_at(types, i)));
}
if (binary)
printf("\t Binary: %s\n", binary);
printf("\t Bundle: %s\n",
slv2_value_as_uri(slv2_ui_get_bundle_uri(ui)));
}
}
slv2_uis_free(uis);
//SLV2Values ui = slv2_plugin_get_value_for_subject(p,
// "<http://ll-plugins.nongnu.org/lv2/ext/gtk2ui#ui>");
printf("\tData URIs: ");
SLV2Values data_uris = slv2_plugin_get_data_uris(p);
for (unsigned i=0; i < slv2_values_size(data_uris); ++i) {
if (i > 0) {
printf("\n\t ");
}
printf("%s", slv2_value_as_uri(slv2_values_get_at(data_uris, i)));
}
printf("\n");
/* Required Features */
SLV2Values features = slv2_plugin_get_required_features(p);
if (features)
printf("\tRequired Features: ");
for (unsigned i=0; i < slv2_values_size(features); ++i) {
if (i > 0) {
printf("\n\t ");
}
printf("%s\n", slv2_value_as_uri(slv2_values_get_at(features, i)));
}
if (features)
printf("\n");
slv2_values_free(features);
/* Optional Features */
features = slv2_plugin_get_optional_features(p);
if (features)
printf("\tOptional Features: ");
for (unsigned i=0; i < slv2_values_size(features); ++i) {
if (i > 0) {
printf("\n\t ");
}
printf("%s\n", slv2_value_as_uri(slv2_values_get_at(features, i)));
}
if (features)
printf("\n");
slv2_values_free(features);
/* Ports */
const uint32_t num_ports = slv2_plugin_get_num_ports(p);
float* mins = calloc(num_ports, sizeof(float));
float* maxes = calloc(num_ports, sizeof(float));
float* defaults = calloc(num_ports, sizeof(float));
slv2_plugin_get_port_ranges_float(p, mins, maxes, defaults);
//printf("\n\t# Ports: %d\n", num_ports);
for (uint32_t i=0; i < num_ports; ++i)
print_port(p, i, mins, maxes, defaults);
}
void
print_version()
{
printf("lv2_inspect (slv2) " PACKAGE_VERSION "\n");
printf("Copyright (C) 2007 Dave Robillard <dave@drobilla.net>\n");
printf("License: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>\n");
printf("This is free software: you are free to change and redistribute it.\n");
printf("There is NO WARRANTY, to the extent permitted by law.\n");
}
void
print_usage()
{
printf("Usage: lv2_inspect PLUGIN_URI\n");
printf("Show information about an installed LV2 plugin.\n");
}
int
main(int argc, char** argv)
{
setlocale (LC_ALL, "");
SLV2World world = slv2_world_new();
slv2_world_load_all(world);
event_class = slv2_value_new_uri(world, SLV2_PORT_CLASS_EVENT);
control_class = slv2_value_new_uri(world, SLV2_PORT_CLASS_CONTROL);
if (argc != 2) {
print_usage();
return -1;
}
if (!strcmp(argv[1], "--version")) {
print_version();
return 0;
} else if (!strcmp(argv[1], "--help")) {
print_usage();
return 0;
} else if (argv[1][0] == '-') {
print_usage();
return -1;
}
SLV2Plugins plugins = slv2_world_get_all_plugins(world);
SLV2Value uri = slv2_value_new_uri(world, argv[1]);
SLV2Plugin p = slv2_plugins_get_by_uri(plugins, uri);
if (p) {
print_plugin(p);
} else {
fprintf(stderr, "Plugin not found.\n");
}
slv2_value_free(uri);
slv2_plugins_free(world, plugins);
slv2_world_free(world);
return (p != NULL ? 0 : -1);
}