mirror of
https://github.com/cookiengineer/audacity
synced 2026-04-25 23:44:13 +02:00
Move library tree where it belongs
This commit is contained in:
25
lib-src/slv2/hosts/Makefile.am
Normal file
25
lib-src/slv2/hosts/Makefile.am
Normal file
@@ -0,0 +1,25 @@
|
||||
AM_CFLAGS = -std=c99 -I$(top_srcdir) @REDLAND_CFLAGS@ @SLV2_CFLAGS@
|
||||
|
||||
if WITH_JACK
|
||||
|
||||
noinst_HEADERS = lv2_event.h lv2_event_helpers.h lv2_uri_map.h
|
||||
|
||||
bin_PROGRAMS = lv2_jack_host lv2_simple_jack_host
|
||||
|
||||
lv2_jack_host_CFLAGS = @JACK_CFLAGS@ $(AM_CFLAGS)
|
||||
|
||||
lv2_jack_host_DEPENDENCIES = ../src/libslv2.la
|
||||
lv2_jack_host_LDADD = ../src/libslv2.la @JACK_LIBS@ @REDLAND_LIBS@
|
||||
|
||||
lv2_simple_jack_host_LDADD = ../src/libslv2.la @JACK_LIBS@ @REDLAND_LIBS@
|
||||
|
||||
lv2_jack_host_SOURCES = \
|
||||
jack_compat.h \
|
||||
lv2_jack_host.c
|
||||
|
||||
lv2_simple_jack_host_SOURCES = \
|
||||
jack_compat.h \
|
||||
lv2_simple_jack_host.c
|
||||
|
||||
endif
|
||||
|
||||
529
lib-src/slv2/hosts/Makefile.in
Normal file
529
lib-src/slv2/hosts/Makefile.in
Normal file
@@ -0,0 +1,529 @@
|
||||
# Makefile.in generated by automake 1.10.2 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||
# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
@SET_MAKE@
|
||||
|
||||
|
||||
VPATH = @srcdir@
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||
install_sh_DATA = $(install_sh) -c -m 644
|
||||
install_sh_PROGRAM = $(install_sh) -c
|
||||
install_sh_SCRIPT = $(install_sh) -c
|
||||
INSTALL_HEADER = $(INSTALL_DATA)
|
||||
transform = $(program_transform_name)
|
||||
NORMAL_INSTALL = :
|
||||
PRE_INSTALL = :
|
||||
POST_INSTALL = :
|
||||
NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
@WITH_JACK_TRUE@bin_PROGRAMS = lv2_jack_host$(EXEEXT) \
|
||||
@WITH_JACK_TRUE@ lv2_simple_jack_host$(EXEEXT)
|
||||
subdir = hosts
|
||||
DIST_COMMON = $(am__noinst_HEADERS_DIST) $(srcdir)/Makefile.am \
|
||||
$(srcdir)/Makefile.in
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = $(top_builddir)/config/config.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
am__installdirs = "$(DESTDIR)$(bindir)"
|
||||
binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
|
||||
PROGRAMS = $(bin_PROGRAMS)
|
||||
am__lv2_jack_host_SOURCES_DIST = jack_compat.h lv2_jack_host.c
|
||||
@WITH_JACK_TRUE@am_lv2_jack_host_OBJECTS = \
|
||||
@WITH_JACK_TRUE@ lv2_jack_host-lv2_jack_host.$(OBJEXT)
|
||||
lv2_jack_host_OBJECTS = $(am_lv2_jack_host_OBJECTS)
|
||||
lv2_jack_host_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(lv2_jack_host_CFLAGS) \
|
||||
$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
|
||||
am__lv2_simple_jack_host_SOURCES_DIST = jack_compat.h \
|
||||
lv2_simple_jack_host.c
|
||||
@WITH_JACK_TRUE@am_lv2_simple_jack_host_OBJECTS = \
|
||||
@WITH_JACK_TRUE@ lv2_simple_jack_host.$(OBJEXT)
|
||||
lv2_simple_jack_host_OBJECTS = $(am_lv2_simple_jack_host_OBJECTS)
|
||||
@WITH_JACK_TRUE@lv2_simple_jack_host_DEPENDENCIES = ../src/libslv2.la
|
||||
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/config
|
||||
depcomp = $(SHELL) $(top_srcdir)/config/depcomp
|
||||
am__depfiles_maybe = depfiles
|
||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
|
||||
--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
|
||||
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
CCLD = $(CC)
|
||||
LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
|
||||
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
|
||||
$(LDFLAGS) -o $@
|
||||
SOURCES = $(lv2_jack_host_SOURCES) $(lv2_simple_jack_host_SOURCES)
|
||||
DIST_SOURCES = $(am__lv2_jack_host_SOURCES_DIST) \
|
||||
$(am__lv2_simple_jack_host_SOURCES_DIST)
|
||||
am__noinst_HEADERS_DIST = lv2_event.h lv2_event_helpers.h \
|
||||
lv2_uri_map.h
|
||||
HEADERS = $(noinst_HEADERS)
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AR = @AR@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CXX = @CXX@
|
||||
CXXCPP = @CXXCPP@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
CXXFLAGS = @CXXFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DEFS = @DEFS@
|
||||
DEPDIR = @DEPDIR@
|
||||
DSYMUTIL = @DSYMUTIL@
|
||||
ECHO = @ECHO@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
EXEEXT = @EXEEXT@
|
||||
F77 = @F77@
|
||||
FFLAGS = @FFLAGS@
|
||||
GREP = @GREP@
|
||||
HAVE_DOXYGEN = @HAVE_DOXYGEN@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
JACK_CFLAGS = @JACK_CFLAGS@
|
||||
JACK_LIBS = @JACK_LIBS@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
NMEDIT = @NMEDIT@
|
||||
OBJEXT = @OBJEXT@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
PACKAGE_NAME = @PACKAGE_NAME@
|
||||
PACKAGE_STRING = @PACKAGE_STRING@
|
||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
PKG_CONFIG = @PKG_CONFIG@
|
||||
PYTHON = @PYTHON@
|
||||
PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@
|
||||
PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@
|
||||
PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@
|
||||
PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
|
||||
PYTHON_SITE_PKG = @PYTHON_SITE_PKG@
|
||||
PYTHON_VERSION = @PYTHON_VERSION@
|
||||
RANLIB = @RANLIB@
|
||||
REDLAND_CFLAGS = @REDLAND_CFLAGS@
|
||||
REDLAND_LIBS = @REDLAND_LIBS@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
SLV2_API_AGE = @SLV2_API_AGE@
|
||||
SLV2_API_CURRENT = @SLV2_API_CURRENT@
|
||||
SLV2_API_REVISION = @SLV2_API_REVISION@
|
||||
SLV2_CFLAGS = @SLV2_CFLAGS@
|
||||
SLV2_LIBS = @SLV2_LIBS@
|
||||
SLV2_SO_VERSION = @SLV2_SO_VERSION@
|
||||
SLV2_SRCDIR = @SLV2_SRCDIR@
|
||||
SLV2_VERSION = @SLV2_VERSION@
|
||||
STRIP = @STRIP@
|
||||
SWIG = @SWIG@
|
||||
VERSION = @VERSION@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
abs_top_srcdir = @abs_top_srcdir@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_CXX = @ac_ct_CXX@
|
||||
ac_ct_F77 = @ac_ct_F77@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
am__tar = @am__tar@
|
||||
am__untar = @am__untar@
|
||||
bindir = @bindir@
|
||||
build = @build@
|
||||
build_alias = @build_alias@
|
||||
build_cpu = @build_cpu@
|
||||
build_os = @build_os@
|
||||
build_vendor = @build_vendor@
|
||||
builddir = @builddir@
|
||||
datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
dvidir = @dvidir@
|
||||
exec_prefix = @exec_prefix@
|
||||
host = @host@
|
||||
host_alias = @host_alias@
|
||||
host_cpu = @host_cpu@
|
||||
host_os = @host_os@
|
||||
host_vendor = @host_vendor@
|
||||
htmldir = @htmldir@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
install_sh = @install_sh@
|
||||
libdir = @libdir@
|
||||
libexecdir = @libexecdir@
|
||||
localedir = @localedir@
|
||||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
target_alias = @target_alias@
|
||||
top_build_prefix = @top_build_prefix@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
AM_CFLAGS = -std=c99 -I$(top_srcdir) @REDLAND_CFLAGS@ @SLV2_CFLAGS@
|
||||
@WITH_JACK_TRUE@noinst_HEADERS = lv2_event.h lv2_event_helpers.h lv2_uri_map.h
|
||||
@WITH_JACK_TRUE@lv2_jack_host_CFLAGS = @JACK_CFLAGS@ $(AM_CFLAGS)
|
||||
@WITH_JACK_TRUE@lv2_jack_host_DEPENDENCIES = ../src/libslv2.la
|
||||
@WITH_JACK_TRUE@lv2_jack_host_LDADD = ../src/libslv2.la @JACK_LIBS@ @REDLAND_LIBS@
|
||||
@WITH_JACK_TRUE@lv2_simple_jack_host_LDADD = ../src/libslv2.la @JACK_LIBS@ @REDLAND_LIBS@
|
||||
@WITH_JACK_TRUE@lv2_jack_host_SOURCES = \
|
||||
@WITH_JACK_TRUE@ jack_compat.h \
|
||||
@WITH_JACK_TRUE@ lv2_jack_host.c
|
||||
|
||||
@WITH_JACK_TRUE@lv2_simple_jack_host_SOURCES = \
|
||||
@WITH_JACK_TRUE@ jack_compat.h \
|
||||
@WITH_JACK_TRUE@ lv2_simple_jack_host.c
|
||||
|
||||
all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c .lo .o .obj
|
||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
||||
&& { if test -f $@; then exit 0; else break; fi; }; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
done; \
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu hosts/Makefile'; \
|
||||
cd $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu hosts/Makefile
|
||||
.PRECIOUS: Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||
*) \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||
esac;
|
||||
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
|
||||
$(top_srcdir)/configure: $(am__configure_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
install-binPROGRAMS: $(bin_PROGRAMS)
|
||||
@$(NORMAL_INSTALL)
|
||||
test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
|
||||
@list='$(bin_PROGRAMS)'; for p in $$list; do \
|
||||
p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
|
||||
if test -f $$p \
|
||||
|| test -f $$p1 \
|
||||
; then \
|
||||
f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
|
||||
echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
|
||||
$(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
|
||||
else :; fi; \
|
||||
done
|
||||
|
||||
uninstall-binPROGRAMS:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(bin_PROGRAMS)'; for p in $$list; do \
|
||||
f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
|
||||
echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
|
||||
rm -f "$(DESTDIR)$(bindir)/$$f"; \
|
||||
done
|
||||
|
||||
clean-binPROGRAMS:
|
||||
@list='$(bin_PROGRAMS)'; for p in $$list; do \
|
||||
f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
|
||||
echo " rm -f $$p $$f"; \
|
||||
rm -f $$p $$f ; \
|
||||
done
|
||||
lv2_jack_host$(EXEEXT): $(lv2_jack_host_OBJECTS) $(lv2_jack_host_DEPENDENCIES)
|
||||
@rm -f lv2_jack_host$(EXEEXT)
|
||||
$(lv2_jack_host_LINK) $(lv2_jack_host_OBJECTS) $(lv2_jack_host_LDADD) $(LIBS)
|
||||
lv2_simple_jack_host$(EXEEXT): $(lv2_simple_jack_host_OBJECTS) $(lv2_simple_jack_host_DEPENDENCIES)
|
||||
@rm -f lv2_simple_jack_host$(EXEEXT)
|
||||
$(LINK) $(lv2_simple_jack_host_OBJECTS) $(lv2_simple_jack_host_LDADD) $(LIBS)
|
||||
|
||||
mostlyclean-compile:
|
||||
-rm -f *.$(OBJEXT)
|
||||
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv2_jack_host-lv2_jack_host.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lv2_simple_jack_host.Po@am__quote@
|
||||
|
||||
.c.o:
|
||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
|
||||
|
||||
.c.obj:
|
||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
|
||||
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
|
||||
|
||||
.c.lo:
|
||||
@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
|
||||
|
||||
lv2_jack_host-lv2_jack_host.o: lv2_jack_host.c
|
||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lv2_jack_host_CFLAGS) $(CFLAGS) -MT lv2_jack_host-lv2_jack_host.o -MD -MP -MF $(DEPDIR)/lv2_jack_host-lv2_jack_host.Tpo -c -o lv2_jack_host-lv2_jack_host.o `test -f 'lv2_jack_host.c' || echo '$(srcdir)/'`lv2_jack_host.c
|
||||
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/lv2_jack_host-lv2_jack_host.Tpo $(DEPDIR)/lv2_jack_host-lv2_jack_host.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lv2_jack_host.c' object='lv2_jack_host-lv2_jack_host.o' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lv2_jack_host_CFLAGS) $(CFLAGS) -c -o lv2_jack_host-lv2_jack_host.o `test -f 'lv2_jack_host.c' || echo '$(srcdir)/'`lv2_jack_host.c
|
||||
|
||||
lv2_jack_host-lv2_jack_host.obj: lv2_jack_host.c
|
||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lv2_jack_host_CFLAGS) $(CFLAGS) -MT lv2_jack_host-lv2_jack_host.obj -MD -MP -MF $(DEPDIR)/lv2_jack_host-lv2_jack_host.Tpo -c -o lv2_jack_host-lv2_jack_host.obj `if test -f 'lv2_jack_host.c'; then $(CYGPATH_W) 'lv2_jack_host.c'; else $(CYGPATH_W) '$(srcdir)/lv2_jack_host.c'; fi`
|
||||
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/lv2_jack_host-lv2_jack_host.Tpo $(DEPDIR)/lv2_jack_host-lv2_jack_host.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lv2_jack_host.c' object='lv2_jack_host-lv2_jack_host.obj' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lv2_jack_host_CFLAGS) $(CFLAGS) -c -o lv2_jack_host-lv2_jack_host.obj `if test -f 'lv2_jack_host.c'; then $(CYGPATH_W) 'lv2_jack_host.c'; else $(CYGPATH_W) '$(srcdir)/lv2_jack_host.c'; fi`
|
||||
|
||||
mostlyclean-libtool:
|
||||
-rm -f *.lo
|
||||
|
||||
clean-libtool:
|
||||
-rm -rf .libs _libs
|
||||
|
||||
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | \
|
||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||
mkid -fID $$unique
|
||||
tags: TAGS
|
||||
|
||||
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||
$(TAGS_FILES) $(LISP)
|
||||
tags=; \
|
||||
here=`pwd`; \
|
||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | \
|
||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||
if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
|
||||
test -n "$$unique" || unique=$$empty_fix; \
|
||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||
$$tags $$unique; \
|
||||
fi
|
||||
ctags: CTAGS
|
||||
CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||
$(TAGS_FILES) $(LISP)
|
||||
tags=; \
|
||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | \
|
||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|
||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||
$$tags $$unique
|
||||
|
||||
GTAGS:
|
||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||
&& cd $(top_srcdir) \
|
||||
&& gtags -i $(GTAGS_ARGS) $$here
|
||||
|
||||
distclean-tags:
|
||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
list='$(DISTFILES)'; \
|
||||
dist_files=`for file in $$list; do echo $$file; done | \
|
||||
sed -e "s|^$$srcdirstrip/||;t" \
|
||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||
case $$dist_files in \
|
||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||
sort -u` ;; \
|
||||
esac; \
|
||||
for file in $$dist_files; do \
|
||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||
if test -d $$d/$$file; then \
|
||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
|
||||
fi; \
|
||||
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
|
||||
else \
|
||||
test -f $(distdir)/$$file \
|
||||
|| cp -p $$d/$$file $(distdir)/$$file \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
check-am: all-am
|
||||
check: check-am
|
||||
all-am: Makefile $(PROGRAMS) $(HEADERS)
|
||||
installdirs:
|
||||
for dir in "$(DESTDIR)$(bindir)"; do \
|
||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||
done
|
||||
install: install-am
|
||||
install-exec: install-exec-am
|
||||
install-data: install-data-am
|
||||
uninstall: uninstall-am
|
||||
|
||||
install-am: all-am
|
||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||
|
||||
installcheck: installcheck-am
|
||||
install-strip:
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
`test -z '$(STRIP)' || \
|
||||
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
||||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
|
||||
distclean-generic:
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
|
||||
maintainer-clean-generic:
|
||||
@echo "This command is intended for maintainers to use"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
clean: clean-am
|
||||
|
||||
clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
|
||||
|
||||
distclean: distclean-am
|
||||
-rm -rf ./$(DEPDIR)
|
||||
-rm -f Makefile
|
||||
distclean-am: clean-am distclean-compile distclean-generic \
|
||||
distclean-tags
|
||||
|
||||
dvi: dvi-am
|
||||
|
||||
dvi-am:
|
||||
|
||||
html: html-am
|
||||
|
||||
info: info-am
|
||||
|
||||
info-am:
|
||||
|
||||
install-data-am:
|
||||
|
||||
install-dvi: install-dvi-am
|
||||
|
||||
install-exec-am: install-binPROGRAMS
|
||||
|
||||
install-html: install-html-am
|
||||
|
||||
install-info: install-info-am
|
||||
|
||||
install-man:
|
||||
|
||||
install-pdf: install-pdf-am
|
||||
|
||||
install-ps: install-ps-am
|
||||
|
||||
installcheck-am:
|
||||
|
||||
maintainer-clean: maintainer-clean-am
|
||||
-rm -rf ./$(DEPDIR)
|
||||
-rm -f Makefile
|
||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||
|
||||
mostlyclean: mostlyclean-am
|
||||
|
||||
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
|
||||
mostlyclean-libtool
|
||||
|
||||
pdf: pdf-am
|
||||
|
||||
pdf-am:
|
||||
|
||||
ps: ps-am
|
||||
|
||||
ps-am:
|
||||
|
||||
uninstall-am: uninstall-binPROGRAMS
|
||||
|
||||
.MAKE: install-am install-strip
|
||||
|
||||
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
|
||||
clean-generic clean-libtool ctags distclean distclean-compile \
|
||||
distclean-generic distclean-libtool distclean-tags distdir dvi \
|
||||
dvi-am html html-am info info-am install install-am \
|
||||
install-binPROGRAMS install-data install-data-am install-dvi \
|
||||
install-dvi-am install-exec install-exec-am install-html \
|
||||
install-html-am install-info install-info-am install-man \
|
||||
install-pdf install-pdf-am install-ps install-ps-am \
|
||||
install-strip installcheck installcheck-am installdirs \
|
||||
maintainer-clean maintainer-clean-generic mostlyclean \
|
||||
mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
|
||||
pdf pdf-am ps ps-am tags uninstall uninstall-am \
|
||||
uninstall-binPROGRAMS
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
||||
65
lib-src/slv2/hosts/jack_compat.h
Normal file
65
lib-src/slv2/hosts/jack_compat.h
Normal file
@@ -0,0 +1,65 @@
|
||||
/* JACK MIDI API compatibility hacks.
|
||||
* Copyright (C) 2007 Nedko Arnaudov <nedko@arnaudov.name>
|
||||
*
|
||||
* 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; version 2 of the License
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef JACK_COMPAT_H
|
||||
#define JACK_COMPAT_H
|
||||
|
||||
|
||||
#if defined(JACK_MIDI_NEEDS_NFRAMES)
|
||||
|
||||
jack_nframes_t
|
||||
jack_midi_get_event_count_compat(
|
||||
void * port_buffer)
|
||||
{
|
||||
#if defined(HAVE_OLD_JACK_MIDI)
|
||||
return jack_midi_port_get_info(port_buffer, 0)->event_count;
|
||||
#else
|
||||
return jack_midi_get_event_count(port_buffer, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
#define jack_midi_get_event_count jack_midi_get_event_count_compat
|
||||
|
||||
int
|
||||
jack_midi_event_get_compat(
|
||||
jack_midi_event_t * event,
|
||||
void * port_buffer,
|
||||
jack_nframes_t event_index)
|
||||
{
|
||||
return jack_midi_event_get(event, port_buffer, event_index, 0);
|
||||
}
|
||||
|
||||
#define jack_midi_event_get jack_midi_event_get_compat
|
||||
|
||||
void
|
||||
jack_midi_clear_buffer_compat(
|
||||
void * port_buffer)
|
||||
{
|
||||
jack_midi_clear_buffer(port_buffer, 0);
|
||||
}
|
||||
|
||||
#define jack_midi_clear_buffer jack_midi_clear_buffer_compat
|
||||
|
||||
#else
|
||||
|
||||
#if defined(HAVE_OLD_JACK_MIDI)
|
||||
#error "Old (0.102.20) JACK MIDI API needs nframes (autotools probably gone mad)"
|
||||
#endif
|
||||
|
||||
#endif /* #if defined(JACK_MIDI_NEEDS_NFRAMES) */
|
||||
|
||||
#endif /* JACK_COMPAT_H */
|
||||
260
lib-src/slv2/hosts/lv2_event.h
Normal file
260
lib-src/slv2/hosts/lv2_event.h
Normal file
@@ -0,0 +1,260 @@
|
||||
/* lv2_event.h - C header file for the LV2 events extension.
|
||||
*
|
||||
* Copyright (C) 2006-2007 Lars Luthman <lars.luthman@gmail.com>
|
||||
* Copyright (C) 2008 Dave Robillard <dave@drobilla.net>
|
||||
*
|
||||
* This header is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This header 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 Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this header; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place, Suite 330, Boston, MA 01222-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef LV2_EVENT_H
|
||||
#define LV2_EVENT_H
|
||||
|
||||
#define LV2_EVENT_URI "http://lv2plug.in/ns/ext/event"
|
||||
#define LV2_EVENT_AUDIO_STAMP 0
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/** @file
|
||||
* This header defines the code portion of the LV2 events extension with URI
|
||||
* <http://lv2plug.in/ns/ext/event> ('lv2ev').
|
||||
*
|
||||
* This extension is a generic transport mechanism for time stamped events
|
||||
* of any type (e.g. MIDI, OSC, ramps, etc). Each port can transport mixed
|
||||
* events of any type; the type of events and timestamps are defined by a URI
|
||||
* which is mapped to an integer by the host for performance reasons.
|
||||
*
|
||||
* This extension requires the host to support the LV2 URI Map extension.
|
||||
* Any host which supports this extension MUST guarantee that any call to
|
||||
* the LV2 URI Map uri_to_id function with the URI of this extension as the
|
||||
* 'map' argument returns a value within the range of uint16_t.
|
||||
*/
|
||||
|
||||
|
||||
/** The best Pulses Per Quarter Note for tempo-based uint32_t timestmaps.
|
||||
* Equal to 2^12 * 5 * 7 * 9 * 11 * 13 * 17, which is evenly divisble
|
||||
* by all integers from 1 through 18 inclusive, and powers of 2 up to 2^12.
|
||||
*/
|
||||
static const uint32_t LV2_EVENT_PPQN = 3136573440U;
|
||||
|
||||
|
||||
/** An LV2 event (header only).
|
||||
*
|
||||
* LV2 events are generic time-stamped containers for any type of event.
|
||||
* The type field defines the format of a given event's contents.
|
||||
*
|
||||
* This struct defines the header of an LV2 event. An LV2 event is a single
|
||||
* chunk of POD (plain old data), usually contained in a flat buffer
|
||||
* (see LV2_EventBuffer below). Unless a required feature says otherwise,
|
||||
* hosts may assume a deep copy of an LV2 event can be created safely
|
||||
* using a simple:
|
||||
*
|
||||
* memcpy(ev_copy, ev, sizeof(LV2_Event) + ev->size); (or equivalent)
|
||||
*/
|
||||
typedef struct {
|
||||
|
||||
/** The frames portion of timestamp. The units used here can optionally be
|
||||
* set for a port (with the lv2ev:timeUnits property), otherwise this
|
||||
* is audio frames, corresponding to the sample_count parameter of the
|
||||
* LV2 run method (e.g. frame 0 is the first frame for that call to run).
|
||||
*/
|
||||
uint32_t frames;
|
||||
|
||||
/** The sub-frames portion of timestamp. The units used here can
|
||||
* optionally be set for a port (with the lv2ev:timeUnits property),
|
||||
* otherwise this is 1/(2^32) of an audio frame.
|
||||
*/
|
||||
uint32_t subframes;
|
||||
|
||||
/** The type of this event, as a number which represents some URI
|
||||
* defining an event type. This value MUST be some value previously
|
||||
* returned from a call to the uri_to_id function defined in the LV2
|
||||
* URI map extension (see lv2_uri_map.h).
|
||||
* There are special rules which must be followed depending on the type
|
||||
* of an event. If the plugin recognizes an event type, the definition
|
||||
* of that event type will describe how to interpret the event, and
|
||||
* any required behaviour. Otherwise, if the type is 0,this event is a
|
||||
* non-POD event and lv2_event_unref MUST be called if the event is
|
||||
* 'dropped' (see above). Even if the plugin does not understand an event,
|
||||
* it may pass the event through to an output by simply copying (and NOT
|
||||
* calling lv2_event_unref). These rules are designed to allow for generic
|
||||
* event handling plugins and large non-POD events, but with minimal hassle
|
||||
* on simple plugins that "don't care" about these more advanced features.
|
||||
*/
|
||||
uint16_t type;
|
||||
|
||||
/** The size of the data portion of this event in bytes, which immediately
|
||||
* follows. The header size (12 bytes) is not included in this value.
|
||||
*/
|
||||
uint16_t size;
|
||||
|
||||
/* size bytes of data follow here */
|
||||
|
||||
} LV2_Event;
|
||||
|
||||
|
||||
|
||||
/** A buffer of LV2 events (header only).
|
||||
*
|
||||
* Like events (which this contains) an event buffer is a single chunk of POD:
|
||||
* the entire buffer (including contents) can be copied with a single memcpy.
|
||||
* The first contained event begins sizeof(LV2_EventBuffer) bytes after
|
||||
* the start of this struct.
|
||||
*
|
||||
* After this header, the buffer contains an event header (defined by struct
|
||||
* LV2_Event), followed by that event's contents (padded to 64 bits), followed by
|
||||
* another header, etc:
|
||||
*
|
||||
* | | | | | | |
|
||||
* | | | | | | | | | | | | | | | | | | | | | | | | |
|
||||
* |FRAMES |SUBFRMS|TYP|LEN|DATA..DATA..PAD|FRAMES | ...
|
||||
*/
|
||||
typedef struct {
|
||||
|
||||
/** The contents of the event buffer. This may or may not reside in the
|
||||
* same block of memory as this header, plugins must not assume either.
|
||||
* The host guarantees this points to at least capacity bytes of allocated
|
||||
* memory (though only size bytes of that are valid events).
|
||||
*/
|
||||
uint8_t* data;
|
||||
|
||||
/** The size of this event header in bytes (including everything).
|
||||
*
|
||||
* This is to allow for extending this header in the future without
|
||||
* breaking binary compatibility. Whenever this header is copied,
|
||||
* it MUST be done using this field (and NOT the sizeof this struct).
|
||||
*/
|
||||
uint16_t header_size;
|
||||
|
||||
/** The type of the time stamps for events in this buffer.
|
||||
* As a special exception, '0' always means audio frames and subframes
|
||||
* (1/UINT32_MAX'th of a frame) in the sample rate passed to instantiate.
|
||||
* INPUTS: The host must set this field to the numeric ID of some URI
|
||||
* defining the meaning of the frames/subframes fields of contained
|
||||
* events (obtained by the LV2 URI Map uri_to_id function with the URI
|
||||
* of this extension as the 'map' argument, see lv2_uri_map.h).
|
||||
* The host must never pass a plugin a buffer which uses a stamp type
|
||||
* the plugin does not 'understand'. The value of this field must
|
||||
* never change, except when connect_port is called on the input
|
||||
* port, at which time the host MUST have set the stamp_type field to
|
||||
* the value that will be used for all subsequent run calls.
|
||||
* OUTPUTS: The plugin may set this to any value that has been returned
|
||||
* from uri_to_id with the URI of this extension for a 'map' argument.
|
||||
* When connected to a buffer with connect_port, output ports MUST set
|
||||
* this field to the type of time stamp they will be writing. On any
|
||||
* call to connect_port on an event input port, the plugin may change
|
||||
* this field on any output port, it is the responsibility of the host
|
||||
* to check if any of these values have changed and act accordingly.
|
||||
*/
|
||||
uint16_t stamp_type;
|
||||
|
||||
/** The number of events in this buffer.
|
||||
* INPUTS: The host must set this field to the number of events
|
||||
* contained in the data buffer before calling run().
|
||||
* The plugin must not change this field.
|
||||
* OUTPUTS: The plugin must set this field to the number of events it
|
||||
* has written to the buffer before returning from run().
|
||||
* Any initial value should be ignored by the plugin.
|
||||
*/
|
||||
uint32_t event_count;
|
||||
|
||||
/** The size of the data buffer in bytes.
|
||||
* This is set by the host and must not be changed by the plugin.
|
||||
* The host is allowed to change this between run() calls.
|
||||
*/
|
||||
uint32_t capacity;
|
||||
|
||||
/** The size of the initial portion of the data buffer containing data.
|
||||
* INPUTS: The host must set this field to the number of bytes used
|
||||
* by all events it has written to the buffer (including headers)
|
||||
* before calling the plugin's run().
|
||||
* The plugin must not change this field.
|
||||
* OUTPUTS: The plugin must set this field to the number of bytes
|
||||
* used by all events it has written to the buffer (including headers)
|
||||
* before returning from run().
|
||||
* Any initial value should be ignored by the plugin.
|
||||
*/
|
||||
uint32_t size;
|
||||
|
||||
} LV2_Event_Buffer;
|
||||
|
||||
|
||||
/** Opaque pointer to host data. */
|
||||
typedef void* LV2_Event_Callback_Data;
|
||||
|
||||
|
||||
/** The data field of the LV2_Feature for this extension.
|
||||
*
|
||||
* To support this feature the host must pass an LV2_Feature struct to the
|
||||
* plugin's instantiate method with URI "http://lv2plug.in/ns/ext/event"
|
||||
* and data pointed to an instance of this struct.
|
||||
*/
|
||||
typedef struct {
|
||||
|
||||
/** Opaque pointer to host data.
|
||||
*
|
||||
* The plugin MUST pass this to any call to functions in this struct.
|
||||
* Otherwise, it must not be interpreted in any way.
|
||||
*/
|
||||
LV2_Event_Callback_Data callback_data;
|
||||
|
||||
/** Take a reference to a non-POD event.
|
||||
*
|
||||
* If a plugin receives an event with type 0, it means the event is a
|
||||
* pointer to some object in memory and not a flat sequence of bytes
|
||||
* in the buffer. When receiving a non-POD event, the plugin already
|
||||
* has an implicit reference to the event. If the event is stored AND
|
||||
* passed to an output, lv2_event_ref MUST be called on that event.
|
||||
* If the event is only stored OR passed through, this is not necessary
|
||||
* (as the plugin already has 1 implicit reference).
|
||||
*
|
||||
* @param event An event received at an input that will not be copied to
|
||||
* an output or stored in any way.
|
||||
* @param context The calling context. (Like event types) this is a mapped
|
||||
* URI, see lv2_context.h. Simple plugin with just a run()
|
||||
* method should pass 0 here (the ID of the 'standard' LV2
|
||||
* run context). The host guarantees that this function is
|
||||
* realtime safe iff @a context is realtime safe.
|
||||
*
|
||||
* PLUGINS THAT VIOLATE THESE RULES MAY CAUSE CRASHES AND MEMORY LEAKS.
|
||||
*/
|
||||
uint32_t (*lv2_event_ref)(LV2_Event_Callback_Data callback_data,
|
||||
LV2_Event* event);
|
||||
|
||||
/** Drop a reference to a non-POD event.
|
||||
*
|
||||
* If a plugin receives an event with type 0, it means the event is a
|
||||
* pointer to some object in memory and not a flat sequence of bytes
|
||||
* in the buffer. If the plugin does not pass the event through to
|
||||
* an output or store it internally somehow, it MUST call this function
|
||||
* on the event (more information on using non-POD events below).
|
||||
*
|
||||
* @param event An event received at an input that will not be copied to
|
||||
* an output or stored in any way.
|
||||
* @param context The calling context. (Like event types) this is a mapped
|
||||
* URI, see lv2_context.h. Simple plugin with just a run()
|
||||
* method should pass 0 here (the ID of the 'standard' LV2
|
||||
* run context). The host guarantees that this function is
|
||||
* realtime safe iff @a context is realtime safe.
|
||||
*
|
||||
* PLUGINS THAT VIOLATE THESE RULES MAY CAUSE CRASHES AND MEMORY LEAKS.
|
||||
*/
|
||||
uint32_t (*lv2_event_unref)(LV2_Event_Callback_Data callback_data,
|
||||
LV2_Event* event);
|
||||
|
||||
} LV2_Event_Feature;
|
||||
|
||||
|
||||
#endif // LV2_EVENT_H
|
||||
|
||||
243
lib-src/slv2/hosts/lv2_event_helpers.h
Normal file
243
lib-src/slv2/hosts/lv2_event_helpers.h
Normal file
@@ -0,0 +1,243 @@
|
||||
/* lv2_event_helpers.h - Helper functions for the LV2 events extension.
|
||||
*
|
||||
* Copyright (C) 2008 Dave Robillard <dave@drobilla.net>
|
||||
*
|
||||
* This header is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This header 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 Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this header; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place, Suite 330, Boston, MA 01222-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef LV2_EVENT_HELPERS_H
|
||||
#define LV2_EVENT_HELPERS_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
#include <malloc.h>
|
||||
#include <assert.h>
|
||||
#include "lv2_event.h"
|
||||
|
||||
/** @file
|
||||
* This header defines some helper functions for the the LV2 events extension
|
||||
* with URI <http://lv2plug.in/ns/ext/event> ('lv2ev').
|
||||
*
|
||||
* These functions are provided for convenience only, use of them is not
|
||||
* required for supporting lv2ev (i.e. the events extension is defined by the
|
||||
* raw buffer format described in lv2_event.h and NOT by this API).
|
||||
*
|
||||
* Note that these functions are all static inline which basically means:
|
||||
* do not take the address of these functions. */
|
||||
|
||||
|
||||
/** Pad a size to 64 bits (for event sizes) */
|
||||
static inline uint16_t
|
||||
lv2_event_pad_size(uint16_t size)
|
||||
{
|
||||
return (size + 7) & (~7);
|
||||
}
|
||||
|
||||
|
||||
/** Initialize (empty, reset..) an existing event buffer.
|
||||
* The contents of buf are ignored entirely and overwritten, except capacity
|
||||
* which is unmodified. */
|
||||
static inline void
|
||||
lv2_event_buffer_reset(LV2_Event_Buffer* buf, uint16_t stamp_type, uint8_t *data)
|
||||
{
|
||||
buf->data = data;
|
||||
buf->header_size = sizeof(LV2_Event_Buffer);
|
||||
buf->stamp_type = stamp_type;
|
||||
buf->event_count = 0;
|
||||
buf->size = 0;
|
||||
}
|
||||
|
||||
|
||||
/** Allocate a new, empty event buffer. */
|
||||
static inline LV2_Event_Buffer*
|
||||
lv2_event_buffer_new(uint32_t capacity, uint16_t stamp_type)
|
||||
{
|
||||
LV2_Event_Buffer* buf = (LV2_Event_Buffer*)malloc(sizeof(LV2_Event_Buffer) + capacity);
|
||||
if (buf != NULL) {
|
||||
buf->capacity = capacity;
|
||||
lv2_event_buffer_reset(buf, stamp_type, (uint8_t *)(buf + 1));
|
||||
return buf;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** An iterator over an LV2_Event_Buffer.
|
||||
*
|
||||
* Multiple simultaneous read iterators over a single buffer is fine,
|
||||
* but changing the buffer invalidates all iterators (e.g. RW Lock). */
|
||||
typedef struct {
|
||||
LV2_Event_Buffer* buf;
|
||||
uint32_t offset;
|
||||
} LV2_Event_Iterator;
|
||||
|
||||
|
||||
/** Reset an iterator to point to the start of @a buf.
|
||||
* @return True if @a iter is valid, otherwise false (buffer is empty) */
|
||||
static inline bool
|
||||
lv2_event_begin(LV2_Event_Iterator* iter,
|
||||
LV2_Event_Buffer* buf)
|
||||
{
|
||||
iter->buf = buf;
|
||||
iter->offset = 0;
|
||||
return (buf->size > 0);
|
||||
}
|
||||
|
||||
|
||||
/** Check if @a iter is valid..
|
||||
* @return True if @a iter is valid, otherwise false (past end of buffer) */
|
||||
static inline bool
|
||||
lv2_event_is_valid(LV2_Event_Iterator* iter)
|
||||
{
|
||||
return (iter->offset < iter->buf->size);
|
||||
}
|
||||
|
||||
|
||||
/** Advance @a iter forward one event.
|
||||
* @a iter must be valid.
|
||||
* @return True if @a iter is valid, otherwise false (reached end of buffer) */
|
||||
static inline bool
|
||||
lv2_event_increment(LV2_Event_Iterator* iter)
|
||||
{
|
||||
assert(lv2_event_is_valid(iter));
|
||||
|
||||
LV2_Event* const ev = (LV2_Event*)(
|
||||
(uint8_t*)iter->buf->data + iter->offset);
|
||||
|
||||
iter->offset += lv2_event_pad_size(sizeof(LV2_Event) + ev->size);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/** Dereference an event iterator (get the event currently pointed at).
|
||||
* @a iter must be valid.
|
||||
* @a data if non-NULL, will be set to point to the contents of the event
|
||||
* returned.
|
||||
* @return A Pointer to the event @a iter is currently pointing at, or NULL
|
||||
* if the end of the buffer is reached (in which case @a data is
|
||||
* also set to NULL). */
|
||||
static inline LV2_Event*
|
||||
lv2_event_get(LV2_Event_Iterator* iter,
|
||||
uint8_t** data)
|
||||
{
|
||||
assert(lv2_event_is_valid(iter));
|
||||
|
||||
LV2_Event* const ev = (LV2_Event*)(
|
||||
(uint8_t*)iter->buf->data + iter->offset);
|
||||
|
||||
if (data)
|
||||
*data = (uint8_t*)ev + sizeof(LV2_Event);
|
||||
|
||||
return ev;
|
||||
}
|
||||
|
||||
|
||||
/** Write an event at @a iter.
|
||||
* The event (if any) pointed to by @iter will be overwritten, and @a iter
|
||||
* incremented to point to the following event (i.e. several calls to this
|
||||
* function can be done in sequence without twiddling iter in-between).
|
||||
* @return True if event was written, otherwise false (buffer is full). */
|
||||
static inline bool
|
||||
lv2_event_write(LV2_Event_Iterator* iter,
|
||||
uint32_t frames,
|
||||
uint32_t subframes,
|
||||
uint16_t type,
|
||||
uint16_t size,
|
||||
const uint8_t* data)
|
||||
{
|
||||
if (iter->buf->capacity - iter->buf->size < sizeof(LV2_Event) + size)
|
||||
return false;
|
||||
|
||||
LV2_Event* const ev = (LV2_Event*)(
|
||||
(uint8_t*)iter->buf->data + iter->offset);
|
||||
|
||||
ev->frames = frames;
|
||||
ev->subframes = subframes;
|
||||
ev->type = type;
|
||||
ev->size = size;
|
||||
memcpy((uint8_t*)ev + sizeof(LV2_Event), data, size);
|
||||
++iter->buf->event_count;
|
||||
|
||||
size = lv2_event_pad_size(sizeof(LV2_Event) + size);
|
||||
iter->buf->size += size;
|
||||
iter->offset += size;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/** Reserve space for an event in the buffer and return a pointer to
|
||||
the memory where the caller can write the event data, or NULL if there
|
||||
is not enough room in the buffer. */
|
||||
static inline uint8_t*
|
||||
lv2_event_reserve(LV2_Event_Iterator* iter,
|
||||
uint32_t frames,
|
||||
uint32_t subframes,
|
||||
uint16_t type,
|
||||
uint16_t size)
|
||||
{
|
||||
size = lv2_event_pad_size(size);
|
||||
if (iter->buf->capacity - iter->buf->size < sizeof(LV2_Event) + size)
|
||||
return NULL;
|
||||
|
||||
LV2_Event* const ev = (LV2_Event*)((uint8_t*)iter->buf->data +
|
||||
iter->offset);
|
||||
|
||||
ev->frames = frames;
|
||||
ev->subframes = subframes;
|
||||
ev->type = type;
|
||||
ev->size = size;
|
||||
++iter->buf->event_count;
|
||||
|
||||
size = lv2_event_pad_size(sizeof(LV2_Event) + size);
|
||||
iter->buf->size += size;
|
||||
iter->offset += size;
|
||||
|
||||
return (uint8_t*)ev + sizeof(LV2_Event);
|
||||
}
|
||||
|
||||
|
||||
/** Write an event at @a iter.
|
||||
* The event (if any) pointed to by @iter will be overwritten, and @a iter
|
||||
* incremented to point to the following event (i.e. several calls to this
|
||||
* function can be done in sequence without twiddling iter in-between).
|
||||
* @return True if event was written, otherwise false (buffer is full). */
|
||||
static inline bool
|
||||
lv2_event_write_event(LV2_Event_Iterator* iter,
|
||||
const LV2_Event* ev,
|
||||
const uint8_t* data)
|
||||
{
|
||||
if (iter->buf->capacity - iter->buf->size < sizeof(LV2_Event) + ev->size)
|
||||
return false;
|
||||
|
||||
LV2_Event* const write_ev = (LV2_Event*)(
|
||||
(uint8_t*)iter->buf->data + iter->offset);
|
||||
|
||||
*write_ev = *ev;
|
||||
memcpy((uint8_t*)write_ev + sizeof(LV2_Event), data, ev->size);
|
||||
++iter->buf->event_count;
|
||||
|
||||
const uint16_t size = lv2_event_pad_size(sizeof(LV2_Event) + ev->size);
|
||||
iter->buf->size += size;
|
||||
iter->offset += size;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif // LV2_EVENT_HELPERS_H
|
||||
|
||||
412
lib-src/slv2/hosts/lv2_jack_host.c
Normal file
412
lib-src/slv2/hosts/lv2_jack_host.c
Normal file
@@ -0,0 +1,412 @@
|
||||
/* jack_host - SLV2 Jack Host
|
||||
* 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
|
||||
|
||||
#define _XOPEN_SOURCE 500
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <slv2/slv2.h>
|
||||
#include <jack/jack.h>
|
||||
#include <jack/midiport.h>
|
||||
#include "lv2_uri_map.h"
|
||||
#include "lv2_event.h"
|
||||
#include "lv2_event_helpers.h"
|
||||
#include "jack_compat.h"
|
||||
|
||||
#define MIDI_BUFFER_SIZE 1024
|
||||
|
||||
enum PortDirection {
|
||||
INPUT,
|
||||
OUTPUT
|
||||
};
|
||||
|
||||
enum PortType {
|
||||
CONTROL,
|
||||
AUDIO,
|
||||
EVENT
|
||||
};
|
||||
|
||||
struct Port {
|
||||
SLV2Port slv2_port;
|
||||
enum PortDirection direction;
|
||||
enum PortType type;
|
||||
jack_port_t* jack_port; /**< For audio and MIDI ports, otherwise NULL */
|
||||
float control; /**< For control ports, otherwise 0.0f */
|
||||
LV2_Event_Buffer* ev_buffer; /**< For midi ports, otherwise NULL */
|
||||
};
|
||||
|
||||
|
||||
/** This program's data */
|
||||
struct JackHost {
|
||||
jack_client_t* jack_client; /**< Jack client */
|
||||
SLV2Plugin plugin; /**< Plugin "class" (actually just a few strings) */
|
||||
SLV2Instance instance; /**< Plugin "instance" (loaded shared lib) */
|
||||
uint32_t num_ports; /**< Size of the two following arrays: */
|
||||
struct Port* ports; /**< Port array of size num_ports */
|
||||
SLV2Value input_class; /**< Input port class (URI) */
|
||||
SLV2Value output_class; /**< Output port class (URI) */
|
||||
SLV2Value control_class; /**< Control port class (URI) */
|
||||
SLV2Value audio_class; /**< Audio port class (URI) */
|
||||
SLV2Value event_class; /**< Event port class (URI) */
|
||||
SLV2Value midi_class; /**< MIDI event class (URI) */
|
||||
SLV2Value optional; /**< lv2:connectionOptional port property */
|
||||
};
|
||||
|
||||
/** URI map feature, for event types (we use only MIDI) */
|
||||
#define MIDI_EVENT_ID 1
|
||||
uint32_t
|
||||
uri_to_id(LV2_URI_Map_Callback_Data callback_data,
|
||||
const char* map,
|
||||
const char* uri)
|
||||
{
|
||||
if (!strcmp(map, LV2_EVENT_URI) && !strcmp(uri, SLV2_EVENT_CLASS_MIDI))
|
||||
return MIDI_EVENT_ID;
|
||||
else
|
||||
return 0; // no id for you!
|
||||
}
|
||||
|
||||
static LV2_URI_Map_Feature uri_map = { NULL, &uri_to_id };
|
||||
static const LV2_Feature uri_map_feature = { "http://lv2plug.in/ns/ext/uri-map", &uri_map };
|
||||
|
||||
/** We don't support type 0 events, so the ref and unref functions just point
|
||||
to the same empty function. */
|
||||
uint32_t event_ref_func(LV2_Event_Callback_Data callback_data,
|
||||
LV2_Event* event)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static LV2_Event_Feature event_ref = { NULL, &event_ref_func, &event_ref_func };
|
||||
static const LV2_Feature event_ref_feature = { "http://lv2plug.in/ns/ext/event",
|
||||
&event_ref };
|
||||
|
||||
const LV2_Feature* features[3] = { &uri_map_feature, &event_ref_feature, NULL };
|
||||
|
||||
void die(const char* msg);
|
||||
void create_port(struct JackHost* host, uint32_t port_index, float default_value);
|
||||
int jack_process_cb(jack_nframes_t nframes, void* data);
|
||||
void list_plugins(SLV2Plugins list);
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char** argv)
|
||||
{
|
||||
struct JackHost host;
|
||||
host.jack_client = NULL;
|
||||
host.num_ports = 0;
|
||||
host.ports = NULL;
|
||||
|
||||
/* Find all installed plugins */
|
||||
SLV2World world = slv2_world_new();
|
||||
slv2_world_load_all(world);
|
||||
SLV2Plugins plugins = slv2_world_get_all_plugins(world);
|
||||
|
||||
/* Set up the port classes this app supports */
|
||||
host.input_class = slv2_value_new_uri(world, SLV2_PORT_CLASS_INPUT);
|
||||
host.output_class = slv2_value_new_uri(world, SLV2_PORT_CLASS_OUTPUT);
|
||||
host.control_class = slv2_value_new_uri(world, SLV2_PORT_CLASS_CONTROL);
|
||||
host.audio_class = slv2_value_new_uri(world, SLV2_PORT_CLASS_AUDIO);
|
||||
host.event_class = slv2_value_new_uri(world, SLV2_PORT_CLASS_EVENT);
|
||||
host.midi_class = slv2_value_new_uri(world, SLV2_EVENT_CLASS_MIDI);
|
||||
host.optional = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "connectionOptional");
|
||||
|
||||
/* Find the plugin to run */
|
||||
const char* plugin_uri_str = (argc == 2) ? argv[1] : NULL;
|
||||
|
||||
if (!plugin_uri_str) {
|
||||
fprintf(stderr, "\nYou must specify a plugin URI to load.\n");
|
||||
fprintf(stderr, "\nKnown plugins:\n\n");
|
||||
list_plugins(plugins);
|
||||
slv2_world_free(world);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
printf("URI:\t%s\n", plugin_uri_str);
|
||||
|
||||
SLV2Value plugin_uri = slv2_value_new_uri(world, plugin_uri_str);
|
||||
host.plugin = slv2_plugins_get_by_uri(plugins, plugin_uri);
|
||||
slv2_value_free(plugin_uri);
|
||||
|
||||
if (!host.plugin) {
|
||||
fprintf(stderr, "Failed to find plugin %s.\n", plugin_uri_str);
|
||||
slv2_world_free(world);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
/* Get the plugin's name */
|
||||
SLV2Value name = slv2_plugin_get_name(host.plugin);
|
||||
const char* name_str = slv2_value_as_string(name);
|
||||
printf("Plugin Name:\t%s\n", slv2_value_as_string(name));
|
||||
|
||||
/* Truncate plugin name to suit JACK (if necessary) */
|
||||
char* jack_name = NULL;
|
||||
if (strlen(name_str) >= (unsigned)jack_client_name_size() - 1) {
|
||||
jack_name = calloc(jack_client_name_size(), sizeof(char));
|
||||
strncpy(jack_name, name_str, jack_client_name_size() - 1);
|
||||
} else {
|
||||
jack_name = strdup(name_str);
|
||||
}
|
||||
|
||||
/* Connect to JACK */
|
||||
printf("JACK Name:\t%s\n", jack_name);
|
||||
host.jack_client = jack_client_open(jack_name, JackNullOption, NULL);
|
||||
|
||||
free(jack_name);
|
||||
slv2_value_free(name);
|
||||
|
||||
if (!host.jack_client)
|
||||
die("Failed to connect to JACK.");
|
||||
else
|
||||
printf("Connected to JACK.\n");
|
||||
|
||||
/* Instantiate the plugin */
|
||||
host.instance = slv2_plugin_instantiate(
|
||||
host.plugin, jack_get_sample_rate(host.jack_client), features);
|
||||
if (!host.instance)
|
||||
die("Failed to instantiate plugin.\n");
|
||||
else
|
||||
printf("Succesfully instantiated plugin.\n");
|
||||
|
||||
jack_set_process_callback(host.jack_client, &jack_process_cb, (void*)(&host));
|
||||
|
||||
/* Create ports */
|
||||
host.num_ports = slv2_plugin_get_num_ports(host.plugin);
|
||||
host.ports = calloc((size_t)host.num_ports, sizeof(struct Port));
|
||||
float* default_values = calloc(slv2_plugin_get_num_ports(host.plugin),
|
||||
sizeof(float));
|
||||
slv2_plugin_get_port_ranges_float(host.plugin, NULL, NULL, default_values);
|
||||
|
||||
for (uint32_t i=0; i < host.num_ports; ++i)
|
||||
create_port(&host, i, default_values[i]);
|
||||
|
||||
/* Activate plugin and JACK */
|
||||
slv2_instance_activate(host.instance);
|
||||
jack_activate(host.jack_client);
|
||||
|
||||
/* Run */
|
||||
printf("Press enter to quit: ");
|
||||
getc(stdin);
|
||||
printf("\n");
|
||||
|
||||
/* Deactivate JACK */
|
||||
jack_deactivate(host.jack_client);
|
||||
|
||||
printf("Shutting down JACK.\n");
|
||||
for (unsigned long i=0; i < host.num_ports; ++i) {
|
||||
if (host.ports[i].jack_port != NULL) {
|
||||
jack_port_unregister(host.jack_client, host.ports[i].jack_port);
|
||||
host.ports[i].jack_port = NULL;
|
||||
}
|
||||
if (host.ports[i].ev_buffer != NULL) {
|
||||
free(host.ports[i].ev_buffer);
|
||||
}
|
||||
}
|
||||
jack_client_close(host.jack_client);
|
||||
|
||||
/* Deactivate plugin */
|
||||
slv2_instance_deactivate(host.instance);
|
||||
slv2_instance_free(host.instance);
|
||||
|
||||
/* Clean up */
|
||||
slv2_value_free(host.input_class);
|
||||
slv2_value_free(host.output_class);
|
||||
slv2_value_free(host.control_class);
|
||||
slv2_value_free(host.audio_class);
|
||||
slv2_value_free(host.event_class);
|
||||
slv2_value_free(host.midi_class);
|
||||
slv2_value_free(host.optional);
|
||||
slv2_plugins_free(world, plugins);
|
||||
slv2_world_free(world);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/** Abort and exit on error */
|
||||
void
|
||||
die(const char* msg)
|
||||
{
|
||||
fprintf(stderr, "%s\n", msg);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
|
||||
/** Creates a port and connects the plugin instance to it's data location.
|
||||
*
|
||||
* For audio ports, creates a jack port and connects plugin port to buffer.
|
||||
*
|
||||
* For control ports, sets controls array to default value and connects plugin
|
||||
* port to that element.
|
||||
*/
|
||||
void
|
||||
create_port(struct JackHost* host,
|
||||
uint32_t port_index,
|
||||
float default_value)
|
||||
{
|
||||
struct Port* const port = &host->ports[port_index];
|
||||
|
||||
port->slv2_port = slv2_plugin_get_port_by_index(host->plugin, port_index);
|
||||
port->jack_port = NULL;
|
||||
port->control = 0.0f;
|
||||
port->ev_buffer = NULL;
|
||||
|
||||
slv2_instance_connect_port(host->instance, port_index, NULL);
|
||||
|
||||
/* Get the port symbol for console printing */
|
||||
SLV2Value symbol = slv2_port_get_symbol(host->plugin, port->slv2_port);
|
||||
const char* symbol_str = slv2_value_as_string(symbol);
|
||||
|
||||
enum JackPortFlags jack_flags = 0;
|
||||
if (slv2_port_is_a(host->plugin, port->slv2_port, host->input_class)) {
|
||||
jack_flags = JackPortIsInput;
|
||||
port->direction = INPUT;
|
||||
} else if (slv2_port_is_a(host->plugin, port->slv2_port, host->output_class)) {
|
||||
jack_flags = JackPortIsOutput;
|
||||
port->direction = OUTPUT;
|
||||
} else if (slv2_port_has_property(host->plugin, port->slv2_port, host->optional)) {
|
||||
slv2_instance_connect_port(host->instance, port_index, NULL);
|
||||
} else {
|
||||
die("Mandatory port has unknown type (neither input or output)");
|
||||
}
|
||||
|
||||
/* Set control values */
|
||||
if (slv2_port_is_a(host->plugin, port->slv2_port, host->control_class)) {
|
||||
port->type = CONTROL;
|
||||
port->control = isnan(default_value) ? 0.0 : default_value;
|
||||
printf("Set %s to %f\n", symbol_str, host->ports[port_index].control);
|
||||
} else if (slv2_port_is_a(host->plugin, port->slv2_port, host->audio_class)) {
|
||||
port->type = AUDIO;
|
||||
} else if (slv2_port_is_a(host->plugin, port->slv2_port, host->event_class)) {
|
||||
port->type = EVENT;
|
||||
}
|
||||
|
||||
/* Connect the port based on it's type */
|
||||
switch (port->type) {
|
||||
case CONTROL:
|
||||
slv2_instance_connect_port(host->instance, port_index, &port->control);
|
||||
break;
|
||||
case AUDIO:
|
||||
port->jack_port = jack_port_register(host->jack_client,
|
||||
symbol_str, JACK_DEFAULT_AUDIO_TYPE, jack_flags, 0);
|
||||
break;
|
||||
case EVENT:
|
||||
port->jack_port = jack_port_register(host->jack_client,
|
||||
symbol_str, JACK_DEFAULT_MIDI_TYPE, jack_flags, 0);
|
||||
port->ev_buffer = lv2_event_buffer_new(MIDI_BUFFER_SIZE, LV2_EVENT_AUDIO_STAMP);
|
||||
slv2_instance_connect_port(host->instance, port_index, port->ev_buffer);
|
||||
break;
|
||||
default:
|
||||
// FIXME: check if port connection is is optional and die if not
|
||||
slv2_instance_connect_port(host->instance, port_index, NULL);
|
||||
fprintf(stderr, "WARNING: Unknown port type, port not connected.\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** Jack process callback. */
|
||||
int
|
||||
jack_process_cb(jack_nframes_t nframes, void* data)
|
||||
{
|
||||
struct JackHost* const host = (struct JackHost*)data;
|
||||
|
||||
/* Connect inputs */
|
||||
for (uint32_t p=0; p < host->num_ports; ++p) {
|
||||
if (!host->ports[p].jack_port)
|
||||
continue;
|
||||
|
||||
if (host->ports[p].type == AUDIO) {
|
||||
|
||||
slv2_instance_connect_port(host->instance, p,
|
||||
jack_port_get_buffer(host->ports[p].jack_port, nframes));
|
||||
|
||||
} else if (host->ports[p].type == EVENT) {
|
||||
|
||||
lv2_event_buffer_reset(host->ports[p].ev_buffer, LV2_EVENT_AUDIO_STAMP, (uint8_t *)(host->ports[p].ev_buffer + 1));
|
||||
|
||||
if (host->ports[p].direction == INPUT) {
|
||||
void* jack_buffer = jack_port_get_buffer(host->ports[p].jack_port, nframes);
|
||||
|
||||
LV2_Event_Iterator iter;
|
||||
lv2_event_begin(&iter, host->ports[p].ev_buffer);
|
||||
|
||||
const jack_nframes_t event_count
|
||||
= jack_midi_get_event_count(jack_buffer);
|
||||
|
||||
jack_midi_event_t ev;
|
||||
|
||||
for (jack_nframes_t e=0; e < event_count; ++e) {
|
||||
jack_midi_event_get(&ev, jack_buffer, e);
|
||||
lv2_event_write(&iter, ev.time, 0, MIDI_EVENT_ID, ev.size, ev.buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Run plugin for this cycle */
|
||||
slv2_instance_run(host->instance, nframes);
|
||||
|
||||
|
||||
/* Deliver output */
|
||||
for (uint32_t p=0; p < host->num_ports; ++p) {
|
||||
if (host->ports[p].jack_port
|
||||
&& host->ports[p].direction == INPUT
|
||||
&& host->ports[p].type == EVENT) {
|
||||
|
||||
void* jack_buffer = jack_port_get_buffer(host->ports[p].jack_port, nframes);
|
||||
|
||||
jack_midi_clear_buffer(jack_buffer);
|
||||
|
||||
LV2_Event_Iterator iter;
|
||||
lv2_event_begin(&iter, host->ports[p].ev_buffer);
|
||||
|
||||
const uint32_t event_count = iter.buf->event_count;
|
||||
|
||||
for (uint32_t i=0; i < event_count; ++i) {
|
||||
uint8_t* data;
|
||||
LV2_Event* ev = lv2_event_get(&iter, &data);
|
||||
|
||||
#if defined(JACK_MIDI_NEEDS_NFRAMES)
|
||||
jack_midi_event_write(jack_buffer,
|
||||
(jack_nframes_t)ev->frames, data, ev->size, nframes);
|
||||
#else
|
||||
jack_midi_event_write(jack_buffer,
|
||||
(jack_nframes_t)ev->frames, data, ev->size);
|
||||
#endif
|
||||
|
||||
lv2_event_increment(&iter);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
list_plugins(SLV2Plugins list)
|
||||
{
|
||||
for (unsigned i=0; i < slv2_plugins_size(list); ++i) {
|
||||
SLV2Plugin p = slv2_plugins_get_at(list, i);
|
||||
printf("%s\n", slv2_value_as_uri(slv2_plugin_get_uri(p)));
|
||||
}
|
||||
}
|
||||
258
lib-src/slv2/hosts/lv2_simple_jack_host.c
Normal file
258
lib-src/slv2/hosts/lv2_simple_jack_host.c
Normal file
@@ -0,0 +1,258 @@
|
||||
/* SLV2 Simple Jack Host Example
|
||||
* Copyright (C) 2007 Dave Robillard <http://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.
|
||||
*/
|
||||
|
||||
#define _XOPEN_SOURCE 500
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <slv2/slv2.h>
|
||||
#include <jack/jack.h>
|
||||
|
||||
|
||||
/** This program's data */
|
||||
struct JackHost {
|
||||
jack_client_t* jack_client; /**< Jack client */
|
||||
SLV2World world; /**< SLV2 "world" object */
|
||||
SLV2Plugin plugin; /**< Plugin "class" (actually just a few strings) */
|
||||
SLV2Instance instance; /**< Plugin "instance" (loaded shared lib) */
|
||||
uint32_t num_ports; /**< Size of the two following arrays: */
|
||||
jack_port_t** jack_ports; /**< For audio ports, otherwise NULL */
|
||||
float* controls; /**< For control ports, otherwise 0.0f */
|
||||
SLV2Value input_class; /**< Input port class (URI) */
|
||||
SLV2Value control_class; /**< Control port class (URI) */
|
||||
SLV2Value audio_class; /**< Audio port class (URI) */
|
||||
};
|
||||
|
||||
|
||||
void die(const char* msg);
|
||||
void create_port(struct JackHost* host, uint32_t port_index);
|
||||
int jack_process_cb(jack_nframes_t nframes, void* data);
|
||||
void list_plugins(SLV2Plugins list);
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char** argv)
|
||||
{
|
||||
struct JackHost host;
|
||||
host.jack_client = NULL;
|
||||
host.num_ports = 0;
|
||||
host.jack_ports = NULL;
|
||||
host.controls = NULL;
|
||||
|
||||
/* Find all installed plugins */
|
||||
host.world = slv2_world_new();
|
||||
slv2_world_load_all(host.world);
|
||||
SLV2Plugins plugins = slv2_world_get_all_plugins(host.world);
|
||||
|
||||
/* Set up the port classes this app supports */
|
||||
host.input_class = slv2_value_new_uri(host.world, SLV2_PORT_CLASS_INPUT);
|
||||
host.audio_class = slv2_value_new_uri(host.world, SLV2_PORT_CLASS_OUTPUT);
|
||||
/* Note that SLV2_PORT_CLASS_* are simply strings defined for convenience.
|
||||
* host.control_class = slv2_value_new(host.world, SLV2_PORT_CLASS_CONTROL);
|
||||
* is the same as: */
|
||||
host.control_class = slv2_value_new_uri(host.world,
|
||||
"http://lv2plug.in/ns/lv2core#ControlPort");
|
||||
|
||||
/* Find the plugin to run */
|
||||
const char* plugin_uri_str = (argc == 2) ? argv[1] : NULL;
|
||||
|
||||
if (!plugin_uri_str) {
|
||||
fprintf(stderr, "\nYou must specify a plugin URI to load.\n");
|
||||
fprintf(stderr, "\nKnown plugins:\n\n");
|
||||
list_plugins(plugins);
|
||||
slv2_world_free(host.world);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
printf("URI:\t%s\n", plugin_uri_str);
|
||||
SLV2Value plugin_uri = slv2_value_new_uri(host.world, plugin_uri_str);
|
||||
host.plugin = slv2_plugins_get_by_uri(plugins, plugin_uri);
|
||||
slv2_value_free(plugin_uri);
|
||||
|
||||
if (!host.plugin) {
|
||||
fprintf(stderr, "Failed to find plugin %s.\n", plugin_uri_str);
|
||||
slv2_world_free(host.world);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
/* Get the plugin's name */
|
||||
SLV2Value name = slv2_plugin_get_name(host.plugin);
|
||||
const char* name_str = slv2_value_as_string(name);
|
||||
printf("Plugin Name:\t%s\n", slv2_value_as_string(name));
|
||||
|
||||
/* Truncate plugin name to suit JACK (if necessary) */
|
||||
char* jack_name = NULL;
|
||||
if (strlen(name_str) >= (unsigned)jack_client_name_size() - 1) {
|
||||
jack_name = calloc(jack_client_name_size(), sizeof(char));
|
||||
strncpy(jack_name, name_str, jack_client_name_size() - 1);
|
||||
} else {
|
||||
jack_name = strdup(name_str);
|
||||
}
|
||||
|
||||
/* Connect to JACK */
|
||||
printf("JACK Name:\t%s\n", jack_name);
|
||||
host.jack_client = jack_client_open(jack_name, JackNullOption, NULL);
|
||||
|
||||
free(jack_name);
|
||||
slv2_value_free(name);
|
||||
|
||||
if (!host.jack_client)
|
||||
die("Failed to connect to JACK.");
|
||||
else
|
||||
printf("Connected to JACK.\n");
|
||||
|
||||
/* Instantiate the plugin */
|
||||
host.instance = slv2_plugin_instantiate(
|
||||
host.plugin, jack_get_sample_rate(host.jack_client), NULL);
|
||||
if (!host.instance)
|
||||
die("Failed to instantiate plugin.\n");
|
||||
else
|
||||
printf("Succesfully instantiated plugin.\n");
|
||||
|
||||
jack_set_process_callback(host.jack_client, &jack_process_cb, (void*)(&host));
|
||||
|
||||
/* Create ports */
|
||||
host.num_ports = slv2_plugin_get_num_ports(host.plugin);
|
||||
host.jack_ports = calloc((size_t)host.num_ports, sizeof(jack_port_t*));
|
||||
host.controls = calloc((size_t)host.num_ports, sizeof(float*));
|
||||
|
||||
for (uint32_t i=0; i < host.num_ports; ++i)
|
||||
create_port(&host, i);
|
||||
|
||||
/* Activate plugin and JACK */
|
||||
slv2_instance_activate(host.instance);
|
||||
jack_activate(host.jack_client);
|
||||
|
||||
/* Run */
|
||||
printf("Press enter to quit: ");
|
||||
getc(stdin);
|
||||
printf("\n");
|
||||
|
||||
/* Deactivate JACK */
|
||||
jack_deactivate(host.jack_client);
|
||||
|
||||
printf("Shutting down JACK.\n");
|
||||
for (unsigned long i=0; i < host.num_ports; ++i) {
|
||||
if (host.jack_ports[i] != NULL) {
|
||||
jack_port_unregister(host.jack_client, host.jack_ports[i]);
|
||||
host.jack_ports[i] = NULL;
|
||||
}
|
||||
}
|
||||
jack_client_close(host.jack_client);
|
||||
|
||||
/* Deactivate plugin */
|
||||
slv2_instance_deactivate(host.instance);
|
||||
slv2_instance_free(host.instance);
|
||||
|
||||
/* Clean up */
|
||||
slv2_value_free(host.input_class);
|
||||
slv2_value_free(host.audio_class);
|
||||
slv2_value_free(host.control_class);
|
||||
slv2_plugins_free(host.world, plugins);
|
||||
slv2_world_free(host.world);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/** Abort and exit on error */
|
||||
void
|
||||
die(const char* msg)
|
||||
{
|
||||
fprintf(stderr, "%s\n", msg);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
|
||||
/** Creates a port and connects the plugin instance to it's data location.
|
||||
*
|
||||
* For audio ports, creates a jack port and connects plugin port to buffer.
|
||||
*
|
||||
* For control ports, sets controls array to default value and connects plugin
|
||||
* port to that element.
|
||||
*/
|
||||
void
|
||||
create_port(struct JackHost* host,
|
||||
uint32_t index)
|
||||
{
|
||||
SLV2Port port = slv2_plugin_get_port_by_index(host->plugin, index);
|
||||
|
||||
/* Get the port symbol (label) for console printing */
|
||||
SLV2Value symbol = slv2_port_get_symbol(host->plugin, port);
|
||||
const char* symbol_str = slv2_value_as_string(symbol);
|
||||
|
||||
/* Initialize the port array elements */
|
||||
host->jack_ports[index] = NULL;
|
||||
host->controls[index] = 0.0f;
|
||||
|
||||
/* Connect control ports to controls array */
|
||||
if (slv2_port_is_a(host->plugin, port, host->control_class)) {
|
||||
|
||||
/* Set default control values for inputs */
|
||||
if (slv2_port_is_a(host->plugin, port, host->input_class)) {
|
||||
SLV2Value def;
|
||||
slv2_port_get_range(host->plugin, port, &def, NULL, NULL);
|
||||
host->controls[index] = slv2_value_as_float(def);
|
||||
printf("Set %s to %f\n", symbol_str, host->controls[index]);
|
||||
slv2_value_free(def);
|
||||
}
|
||||
|
||||
slv2_instance_connect_port(host->instance, index, &host->controls[index]);
|
||||
|
||||
} else if (slv2_port_is_a(host->plugin, port, host->audio_class)) {
|
||||
|
||||
host->jack_ports[index] = jack_port_register(host->jack_client,
|
||||
symbol_str, JACK_DEFAULT_AUDIO_TYPE,
|
||||
slv2_port_is_a(host->plugin, port, host->input_class)
|
||||
? JackPortIsInput : JackPortIsOutput,
|
||||
0);
|
||||
|
||||
} else {
|
||||
// Simple examples don't have to be robust :)
|
||||
die("ERROR: Unknown port type, aborting messily!\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** Jack process callback. */
|
||||
int
|
||||
jack_process_cb(jack_nframes_t nframes, void* data)
|
||||
{
|
||||
struct JackHost* host = (struct JackHost*)data;
|
||||
|
||||
/* Connect plugin ports directly to JACK buffers */
|
||||
for (uint32_t i=0; i < host->num_ports; ++i)
|
||||
if (host->jack_ports[i] != NULL)
|
||||
slv2_instance_connect_port(host->instance, i,
|
||||
jack_port_get_buffer(host->jack_ports[i], nframes));
|
||||
|
||||
/* Run plugin for this cycle */
|
||||
slv2_instance_run(host->instance, nframes);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
list_plugins(SLV2Plugins list)
|
||||
{
|
||||
for (unsigned i=0; i < slv2_plugins_size(list); ++i) {
|
||||
SLV2Plugin p = slv2_plugins_get_at(list, i);
|
||||
printf("%s\n", slv2_value_as_uri(slv2_plugin_get_uri(p)));
|
||||
}
|
||||
}
|
||||
88
lib-src/slv2/hosts/lv2_uri_map.h
Normal file
88
lib-src/slv2/hosts/lv2_uri_map.h
Normal file
@@ -0,0 +1,88 @@
|
||||
/* lv2_uri_map.h - C header file for the LV2 URI Map extension.
|
||||
*
|
||||
* Copyright (C) 2008 Dave Robillard <dave@drobilla.net>
|
||||
*
|
||||
* This header is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This header 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 Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this header; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place, Suite 330, Boston, MA 01222-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef LV2_URI_MAP_H
|
||||
#define LV2_URI_MAP_H
|
||||
|
||||
#define LV2_URI_MAP_URI "http://lv2plug.in/ns/ext/uri-map"
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/** @file
|
||||
* This header defines the LV2 URI Map extension with the URI
|
||||
* <http://lv2plug.in/ns/ext/uri-map> (preferred prefix 'lv2urimap').
|
||||
*
|
||||
* This extension defines a simple mechanism for plugins to map URIs to
|
||||
* integers, usually for performance reasons (e.g. processing events
|
||||
* typed by URIs in real time). The expected use case is for plugins to
|
||||
* map URIs to integers for things they 'understand' at instantiation time,
|
||||
* and store those values for use in the audio thread without doing any string
|
||||
* comparison. This allows the extensibility of RDF with the performance of
|
||||
* integers (or centrally defined enumerations).
|
||||
*/
|
||||
|
||||
|
||||
/** Opaque pointer to host data. */
|
||||
typedef void* LV2_URI_Map_Callback_Data;
|
||||
|
||||
|
||||
/** The data field of the LV2_Feature for this extension.
|
||||
*
|
||||
* To support this feature the host must pass an LV2_Feature struct to the
|
||||
* plugin's instantiate method with URI "http://lv2plug.in/ns/ext/uri-map"
|
||||
* and data pointed to an instance of this struct.
|
||||
*/
|
||||
typedef struct {
|
||||
|
||||
/** Opaque pointer to host data.
|
||||
*
|
||||
* The plugin MUST pass this to any call to functions in this struct.
|
||||
* Otherwise, it must not be interpreted in any way.
|
||||
*/
|
||||
LV2_URI_Map_Callback_Data callback_data;
|
||||
|
||||
/** Get the numeric ID of a URI from the host.
|
||||
*
|
||||
* @param callback_data Must be the callback_data member of this struct.
|
||||
* @param map The 'context' of this URI. Certain extensions may define a
|
||||
* URI that must be passed here with certain restrictions on the
|
||||
* return value (e.g. limited range). This value may be NULL if
|
||||
* the plugin needs an ID for a URI in general.
|
||||
* @param uri The URI to be mapped to an integer ID.
|
||||
*
|
||||
* This function is referentially transparent - any number of calls with
|
||||
* the same arguments is guaranteed to return the same value over the life
|
||||
* of a plugin instance (though the same URI may return different values
|
||||
* with a different map parameter). However, this function is not
|
||||
* necessarily very fast: plugins should cache any IDs they might need in
|
||||
* performance critical situations.
|
||||
* The return value 0 is reserved and means an ID for that URI could not
|
||||
* be created for whatever reason. Extensions may define more precisely
|
||||
* what this means, but in general plugins should gracefully handle 0
|
||||
* and consider whatever they wanted the URI for "unsupported".
|
||||
*/
|
||||
uint32_t (*uri_to_id)(LV2_URI_Map_Callback_Data callback_data,
|
||||
const char* map,
|
||||
const char* uri);
|
||||
|
||||
} LV2_URI_Map_Feature;
|
||||
|
||||
|
||||
#endif // LV2_URI_MAP_H
|
||||
|
||||
Reference in New Issue
Block a user