1
0
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:
ra
2010-01-24 09:19:39 +00:00
parent e74978ba77
commit 58caf78a86
6020 changed files with 2790154 additions and 0 deletions

View 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

View 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:

View 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 */

View 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

View 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

View 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)));
}
}

View 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)));
}
}

View 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