aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Christoph Steiner <eighthave@users.sourceforge.net>2010-11-21 04:53:44 +0000
committerHans-Christoph Steiner <eighthave@users.sourceforge.net>2010-11-21 04:53:44 +0000
commitd94369cd874ac65309d8e4f9de8b81125c66e27a (patch)
treef6b8d2b4636bb35efbe1db4d185f264d6c19cdd6
parentbc60633962d91501bca7d556eca0b639f825a2ef (diff)
ported to library template and updated version to 1.0.3.1 to reflect bugfixes and doc updates
svn path=/trunk/externals/vbap/; revision=14453
-rw-r--r--LICENSE.txt (renamed from COPYRIGHT)0
-rw-r--r--Makefile331
-rw-r--r--README.txt32
-rw-r--r--debian/changelog5
-rw-r--r--debian/compat1
-rw-r--r--debian/control45
-rw-r--r--debian/copyright23
-rw-r--r--debian/gbp.conf7
-rw-r--r--debian/links3
-rw-r--r--debian/patches/add_required_internal_pd_headers968
-rw-r--r--debian/patches/series1
-rwxr-xr-xdebian/rules17
-rw-r--r--debian/source/format1
-rw-r--r--debian/watch2
-rw-r--r--define_loudspeakers.c2
-rw-r--r--define_loudspeakers.h2
-rw-r--r--examples/graph-to-aziele.pd (renamed from graph-to-aziele.pd)0
-rw-r--r--examples/high.pd (renamed from high.pd)0
-rw-r--r--examples/playsample~.pd (renamed from playsample~.pd)0
-rw-r--r--examples/recent.pd (renamed from recent.pd)0
-rw-r--r--examples/vbap-demo.pd (renamed from vbap-demo.pd)0
-rw-r--r--examples/vbap-level-config.pd23
-rw-r--r--examples/vbapmodule.pd (renamed from vbapmodule.pd)0
-rw-r--r--rvbap.c2
-rw-r--r--vbap-help.pd1
-rw-r--r--vbap-meta.pd7
-rw-r--r--vbap.c4
-rw-r--r--vbap.h4
28 files changed, 1473 insertions, 8 deletions
diff --git a/COPYRIGHT b/LICENSE.txt
index 331a78f..331a78f 100644
--- a/COPYRIGHT
+++ b/LICENSE.txt
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..80a6e72
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,331 @@
+## Pd library template version 1.0.6
+# For instructions on how to use this template, see:
+# http://puredata.info/docs/developer/MakefileTemplate
+LIBRARY_NAME = vbap
+
+# add your .c source files, one object per file, to the SOURCES
+# variable, help files will be included automatically
+SOURCES = vbap.c rvbap.c define_loudspeakers.c
+
+# list all pd objects (i.e. myobject.pd) files here, and their helpfiles will
+# be included automatically
+PDOBJECTS =
+
+# example patches and related files, in the 'examples' subfolder
+EXAMPLES = graph-to-aziele.pd high.pd playsample~.pd recent.pd vbap-demo.pd vbap-level-config.pd vbapmodule.pd
+
+# manuals and related files, in the 'manual' subfolder
+MANUAL =
+
+# if you want to include any other files in the source and binary tarballs,
+# list them here. This can be anything from header files, test patches,
+# documentation, etc. README.txt and LICENSE.txt are required and therefore
+# automatically included
+EXTRA_DIST = makefile.irix define_loudspeakers.h max2pd.h vbap.h
+
+
+
+#------------------------------------------------------------------------------#
+#
+# things you might need to edit if you are using other C libraries
+#
+#------------------------------------------------------------------------------#
+
+CFLAGS = -DPD -I"$(PD_INCLUDE)/pd" -Wall -W -g
+LDFLAGS =
+LIBS =
+
+#------------------------------------------------------------------------------#
+#
+# you shouldn't need to edit anything below here, if we did it right :)
+#
+#------------------------------------------------------------------------------#
+
+# get library version from meta file
+LIBRARY_VERSION = $(shell sed -n 's|^\#X text [0-9][0-9]* [0-9][0-9]* VERSION \(.*\);|\1|p' $(LIBRARY_NAME)-meta.pd)
+
+CFLAGS += -DVERSION='"$(LIBRARY_VERSION)"'
+
+PD_INCLUDE = $(PD_PATH)/include
+# where to install the library, overridden below depending on platform
+prefix = /usr/local
+libdir = $(prefix)/lib
+pkglibdir = $(libdir)/pd-externals
+objectsdir = $(pkglibdir)
+
+INSTALL = install
+INSTALL_PROGRAM = $(INSTALL) -p -m 644
+INSTALL_DATA = $(INSTALL) -p -m 644
+INSTALL_DIR = $(INSTALL) -p -m 755 -d
+
+ALLSOURCES := $(SOURCES) $(SOURCES_android) $(SOURCES_cygwin) $(SOURCES_macosx) \
+ $(SOURCES_iphoneos) $(SOURCES_linux) $(SOURCES_windows)
+
+DISTDIR=$(LIBRARY_NAME)-$(LIBRARY_VERSION)
+ORIGDIR=pd-$(LIBRARY_NAME:~=)_$(LIBRARY_VERSION)
+
+UNAME := $(shell uname -s)
+ifeq ($(UNAME),Darwin)
+ CPU := $(shell uname -p)
+ ifeq ($(CPU),arm) # iPhone/iPod Touch
+ SOURCES += $(SOURCES_iphoneos)
+ EXTENSION = pd_darwin
+ OS = iphoneos
+ PD_PATH = /Applications/Pd-extended.app/Contents/Resources
+ IPHONE_BASE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin
+ CC=$(IPHONE_BASE)/gcc
+ CPP=$(IPHONE_BASE)/cpp
+ CXX=$(IPHONE_BASE)/g++
+ ISYSROOT = -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk
+ IPHONE_CFLAGS = -miphoneos-version-min=3.0 $(ISYSROOT) -arch armv6
+ OPT_CFLAGS = -fast -funroll-loops -fomit-frame-pointer
+ CFLAGS := $(IPHONE_CFLAGS) $(OPT_CFLAGS) $(CFLAGS)
+ LDFLAGS += -arch armv6 -bundle -undefined dynamic_lookup $(ISYSROOT)
+ LIBS += -lc
+ STRIP = strip -x
+ DISTBINDIR=$(DISTDIR)-$(OS)
+ else # Mac OS X
+ SOURCES += $(SOURCES_macosx)
+ EXTENSION = pd_darwin
+ OS = macosx
+ PD_PATH = /Applications/Pd-extended.app/Contents/Resources
+ OPT_CFLAGS = -ftree-vectorize -ftree-vectorizer-verbose=2 -fast
+# build universal 32-bit on 10.4 and 32/64 on newer
+ ifeq ($(shell uname -r | sed 's|\([0-9][0-9]*\)\.[0-9][0-9]*\.[0-9][0-9]*|\1|'), 8)
+ FAT_FLAGS = -arch ppc -arch i386 -mmacosx-version-min=10.4
+ else
+ FAT_FLAGS = -arch ppc -arch i386 -arch x86_64 -mmacosx-version-min=10.4
+ SOURCES += $(SOURCES_iphoneos)
+ endif
+ CFLAGS += $(FAT_FLAGS) -fPIC -I/sw/include
+ LDFLAGS += $(FAT_FLAGS) -bundle -undefined dynamic_lookup -L/sw/lib
+ # if the 'pd' binary exists, check the linking against it to aid with stripping
+ LDFLAGS += $(shell test -e $(PD_PATH)/bin/pd && echo -bundle_loader $(PD_PATH)/bin/pd)
+ LIBS += -lc
+ STRIP = strip -x
+ DISTBINDIR=$(DISTDIR)-$(OS)
+# install into ~/Library/Pd on Mac OS X since /usr/local isn't used much
+ pkglibdir=$(HOME)/Library/Pd
+ endif
+endif
+ifeq ($(UNAME),Linux)
+ CPU := $(shell uname -m)
+ SOURCES += $(SOURCES_linux)
+ EXTENSION = pd_linux
+ OS = linux
+ PD_PATH = /usr
+ OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer
+ CFLAGS += -fPIC
+ LDFLAGS += -Wl,--export-dynamic -shared -fPIC
+ LIBS += -lc
+ STRIP = strip --strip-unneeded -R .note -R .comment
+ DISTBINDIR=$(DISTDIR)-$(OS)-$(shell uname -m)
+endif
+ifeq ($(UNAME),GNU)
+ # GNU/Hurd, should work like GNU/Linux for basically all externals
+ CPU := $(shell uname -m)
+ SOURCES += $(SOURCES_linux)
+ EXTENSION = pd_linux
+ OS = linux
+ PD_PATH = /usr
+ OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer
+ CFLAGS += -fPIC
+ LDFLAGS += -Wl,--export-dynamic -shared -fPIC
+ LIBS += -lc
+ STRIP = strip --strip-unneeded -R .note -R .comment
+ DISTBINDIR=$(DISTDIR)-$(OS)-$(shell uname -m)
+endif
+ifeq ($(UNAME),GNU/kFreeBSD)
+ # Debian GNU/kFreeBSD, should work like GNU/Linux for basically all externals
+ CPU := $(shell uname -m)
+ SOURCES += $(SOURCES_linux)
+ EXTENSION = pd_linux
+ OS = linux
+ PD_PATH = /usr
+ OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer
+ CFLAGS += -fPIC
+ LDFLAGS += -Wl,--export-dynamic -shared -fPIC
+ LIBS += -lc
+ STRIP = strip --strip-unneeded -R .note -R .comment
+ DISTBINDIR=$(DISTDIR)-$(OS)-$(shell uname -m)
+endif
+ifeq (CYGWIN,$(findstring CYGWIN,$(UNAME)))
+ CPU := $(shell uname -m)
+ SOURCES += $(SOURCES_cygwin)
+ EXTENSION = dll
+ OS = cygwin
+ PD_PATH = $(cygpath $(PROGRAMFILES))/pd
+ OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer
+ CFLAGS +=
+ LDFLAGS += -Wl,--export-dynamic -shared -L"$(PD_PATH)/src" -L"$(PD_PATH)/bin"
+ LIBS += -lc -lpd
+ STRIP = strip --strip-unneeded -R .note -R .comment
+ DISTBINDIR=$(DISTDIR)-$(OS)
+endif
+ifeq (MINGW,$(findstring MINGW,$(UNAME)))
+ CPU := $(shell uname -m)
+ SOURCES += $(SOURCES_windows)
+ EXTENSION = dll
+ OS = windows
+ PD_PATH = $(shell cd "$(PROGRAMFILES)"/pd && pwd)
+ OPT_CFLAGS = -O3 -funroll-loops -fomit-frame-pointer
+ CFLAGS += -mms-bitfields
+ LDFLAGS += -s -shared -Wl,--enable-auto-import
+ LIBS += -L"$(PD_PATH)/src" -L"$(PD_PATH)/bin" -L"$(PD_PATH)/obj" -lpd -lwsock32 -lkernel32 -luser32 -lgdi32
+ STRIP = strip --strip-unneeded -R .note -R .comment
+ DISTBINDIR=$(DISTDIR)-$(OS)
+endif
+
+# in case somebody manually set the HELPPATCHES above
+HELPPATCHES ?= $(SOURCES:.c=-help.pd) $(PDOBJECTS:.pd=-help.pd)
+
+CFLAGS += $(OPT_CFLAGS)
+
+
+.PHONY = install libdir_install single_install install-doc install-exec install-examples install-manual clean dist etags $(LIBRARY_NAME)
+
+all: $(SOURCES:.c=.$(EXTENSION))
+
+%.o: %.c
+ $(CC) $(CFLAGS) -o "$*.o" -c "$*.c"
+
+%.$(EXTENSION): %.o
+ $(CC) $(LDFLAGS) -o "$*.$(EXTENSION)" "$*.o" $(LIBS)
+ chmod a-x "$*.$(EXTENSION)"
+
+# this links everything into a single binary file
+$(LIBRARY_NAME): $(SOURCES:.c=.o) $(LIBRARY_NAME).o
+ $(CC) $(LDFLAGS) -o $(LIBRARY_NAME).$(EXTENSION) $(SOURCES:.c=.o) $(LIBRARY_NAME).o $(LIBS)
+ chmod a-x $(LIBRARY_NAME).$(EXTENSION)
+
+install: libdir_install
+
+# The meta and help files are explicitly installed to make sure they are
+# actually there. Those files are not optional, then need to be there.
+libdir_install: $(SOURCES:.c=.$(EXTENSION)) install-doc install-examples install-manual
+ $(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+ $(INSTALL_DATA) $(LIBRARY_NAME)-meta.pd \
+ $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+ test -z "$(strip $(SOURCES))" || (\
+ $(INSTALL_PROGRAM) $(SOURCES:.c=.$(EXTENSION)) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME) && \
+ $(STRIP) $(addprefix $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/,$(SOURCES:.c=.$(EXTENSION))))
+ test -z "$(strip $(PDOBJECTS))" || \
+ $(INSTALL_DATA) $(PDOBJECTS) \
+ $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+
+# install library linked as single binary
+single_install: $(LIBRARY_NAME) install-doc install-exec
+ $(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+ $(INSTALL_PROGRAM) $(LIBRARY_NAME).$(EXTENSION) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+ $(STRIP) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/$(LIBRARY_NAME).$(EXTENSION)
+
+install-doc:
+ $(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+ test -z "$(strip $(SOURCES) $(PDOBJECTS))" || \
+ $(INSTALL_DATA) $(HELPPATCHES) \
+ $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+ $(INSTALL_DATA) README.txt $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/README.txt
+ $(INSTALL_DATA) LICENSE.txt $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/LICENSE.txt
+
+install-examples:
+ test -z "$(strip $(EXAMPLES))" || \
+ $(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/examples && \
+ for file in $(EXAMPLES); do \
+ $(INSTALL_DATA) examples/$$file $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/examples; \
+ done
+
+install-manual:
+ test -z "$(strip $(MANUAL))" || \
+ $(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/manual && \
+ for file in $(MANUAL); do \
+ $(INSTALL_DATA) manual/$$file $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/manual; \
+ done
+
+
+clean:
+ -rm -f -- $(SOURCES:.c=.o) $(SOURCES_LIB:.c=.o)
+ -rm -f -- $(SOURCES:.c=.$(EXTENSION))
+ -rm -f -- $(LIBRARY_NAME).o
+ -rm -f -- $(LIBRARY_NAME).$(EXTENSION)
+
+distclean: clean
+ -rm -f -- $(DISTBINDIR).tar.gz
+ -rm -rf -- $(DISTBINDIR)
+ -rm -f -- $(DISTDIR).tar.gz
+ -rm -rf -- $(DISTDIR)
+ -rm -f -- $(ORIGDIR).tar.gz
+ -rm -rf -- $(ORIGDIR)
+
+
+$(DISTBINDIR):
+ $(INSTALL_DIR) $(DISTBINDIR)
+
+libdir: all $(DISTBINDIR)
+ $(INSTALL_DATA) $(LIBRARY_NAME)-meta.pd $(DISTBINDIR)
+ $(INSTALL_DATA) $(SOURCES) $(DISTBINDIR)
+ $(INSTALL_DATA) $(HELPPATCHES) $(DISTBINDIR)
+ test -z "$(strip $(EXTRA_DIST))" || \
+ $(INSTALL_DATA) $(EXTRA_DIST) $(DISTBINDIR)
+# tar --exclude-vcs -czpf $(DISTBINDIR).tar.gz $(DISTBINDIR)
+
+$(DISTDIR):
+ $(INSTALL_DIR) $(DISTDIR)
+
+$(ORIGDIR):
+ $(INSTALL_DIR) $(ORIGDIR)
+
+dist: $(DISTDIR)
+ $(INSTALL_DATA) Makefile $(DISTDIR)
+ $(INSTALL_DATA) README.txt $(DISTDIR)
+ $(INSTALL_DATA) LICENSE.txt $(DISTDIR)
+ $(INSTALL_DATA) $(LIBRARY_NAME)-meta.pd $(DISTDIR)
+ test -z "$(strip $(ALLSOURCES))" || \
+ $(INSTALL_DATA) $(ALLSOURCES) $(DISTDIR)
+ test -z "$(strip $(PDOBJECTS))" || \
+ $(INSTALL_DATA) $(PDOBJECTS) $(DISTDIR)
+ test -z "$(strip $(HELPPATCHES))" || \
+ $(INSTALL_DATA) $(HELPPATCHES) $(DISTDIR)
+ test -z "$(strip $(EXTRA_DIST))" || \
+ $(INSTALL_DATA) $(EXTRA_DIST) $(DISTDIR)
+ test -z "$(strip $(EXAMPLES))" || \
+ $(INSTALL_DIR) $(DISTDIR)/examples && \
+ for file in $(EXAMPLES); do \
+ $(INSTALL_DATA) examples/$$file $(DISTDIR)/examples; \
+ done
+ test -z "$(strip $(MANUAL))" || \
+ $(INSTALL_DIR) $(DISTDIR)/manual && \
+ for file in $(MANUAL); do \
+ $(INSTALL_DATA) manual/$$file $(DISTDIR)/manual; \
+ done
+ tar --exclude-vcs -czpf $(DISTDIR).tar.gz $(DISTDIR)
+
+# make a Debian source package
+dpkg-source:
+ debclean
+ make distclean dist
+ mv $(DISTDIR) $(ORIGDIR)
+ tar --exclude-vcs -czpf ../$(ORIGDIR).orig.tar.gz $(ORIGDIR)
+ rm -f -- $(DISTDIR).tar.gz
+ rm -rf -- $(DISTDIR) $(ORIGDIR)
+ cd .. && dpkg-source -b $(LIBRARY_NAME)
+
+etags:
+ etags *.h $(SOURCES) ../../pd/src/*.[ch] /usr/include/*.h /usr/include/*/*.h
+
+showsetup:
+ @echo "CFLAGS: $(CFLAGS)"
+ @echo "LDFLAGS: $(LDFLAGS)"
+ @echo "LIBS: $(LIBS)"
+ @echo "PD_INCLUDE: $(PD_INCLUDE)"
+ @echo "PD_PATH: $(PD_PATH)"
+ @echo "objectsdir: $(objectsdir)"
+ @echo "LIBRARY_NAME: $(LIBRARY_NAME)"
+ @echo "LIBRARY_VERSION: $(LIBRARY_VERSION)"
+ @echo "SOURCES: $(SOURCES)"
+ @echo "PDOBJECTS: $(PDOBJECTS)"
+ @echo "ALLSOURCES: $(ALLSOURCES)"
+ @echo "UNAME: $(UNAME)"
+ @echo "CPU: $(CPU)"
+ @echo "pkglibdir: $(pkglibdir)"
+ @echo "DISTDIR: $(DISTDIR)"
+ @echo "ORIGDIR: $(ORIGDIR)"
diff --git a/README.txt b/README.txt
new file mode 100644
index 0000000..e42cbbc
--- /dev/null
+++ b/README.txt
@@ -0,0 +1,32 @@
+
+A Pd port of the VBAP object for Max/MSP by Ville Pulkki
+
+http://www.acoustics.hut.fi/research/cat/vbap/
+
+ This is a library for Pure Data for sound spatialization using the
+ vector base amplitude panning (VBAP) method. VBAP is an amplitude
+ panning method to position virtual sources in arbitrary 2-D or 3-D
+ loudspeaker setups. In amplitude panning the same sound signal is
+ applied to a number of loudspeakers with appropriate non-zero
+ amplitudes. With 2-D setups VBAP is a reformulation of the existing
+ pair-wise panning method. However, differing from earlier solutions
+ it can be generalized for 3-D loudspeaker setups as a triplet-wise
+ panning method. A sound signal is then applied to one, two, or three
+ loudspeakers simultaneously. VBAP has certain advantages compared to
+ earlier virtual source positioning methods in arbitrary
+ layouts. Previous methods either used all loudspeakers to produce
+ virtual sources, which results in some artefacts, or they used
+ loudspeaker triplets with a non-generalizable 2-D user interface.
+
+ The directional qualities of virtual sources generated with VBAP can
+ be stated as follows. Directional coordinates used for this purpose
+ are the angle between a position vector and the median plane (θcc),
+ and the angle between a projection of a position vector to the median
+ plane and frontal direction (Φcc). The perceived θcc direction of a
+ virtual source coincides well with the VBAP panning direction when a
+ loudspeaker set is near the median plane. When the loudspeaker set is
+ moved towards a side of a listener, the perceived θcc direction is
+ biased towards the median plane. The perceived Φcc direction of an
+ amplitude-panned virtual source is individual and cannot be predicted
+ with any panning law.
+
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..2f433cc
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,5 @@
+pd-vbap (1.0.3.1-1) unstable; urgency=low
+
+ * Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP>
+
+ -- Hans-Christoph Steiner <hans@eds.org> Thu, 21 Jan 2010 23:27:04 -0500
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..7f8f011
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+7
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..2a2e061
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,45 @@
+Source: pd-vbap
+Section: sound
+Priority: optional
+Maintainer: Debian Multimedia Maintainers <pkg-multimedia-maintainers@lists.alioth.debian.org>
+Uploaders: Hans-Christoph Steiner <hans@eds.org>
+Build-Depends: debhelper (>= 7.0.50~),
+ puredata,
+ quilt (>= 0.46-7~)
+Standards-Version: 3.9.1
+Homepage: http://www.acoustics.hut.fi/research/cat/vbap/
+
+Package: pd-vbap
+Architecture: any
+Depends: ${shlibs:Depends},
+ pd,
+ ${misc:Depends}
+Recommends: pd-cyclone,
+ pd-import
+Description: Pd library for Vector Base Amplitude Panning spatialization
+ This is a library for Pure Data for sound spatialization using the
+ vector base amplitude panning (VBAP) method. VBAP is an amplitude
+ panning method to position virtual sources in arbitrary 2-D or 3-D
+ loudspeaker setups. In amplitude panning the same sound signal is
+ applied to a number of loudspeakers with appropriate non-zero
+ amplitudes. With 2-D setups VBAP is a reformulation of the existing
+ pair-wise panning method. However, differing from earlier solutions
+ it can be generalized for 3-D loudspeaker setups as a triplet-wise
+ panning method. A sound signal is then applied to one, two, or three
+ loudspeakers simultaneously. VBAP has certain advantages compared to
+ earlier virtual source positioning methods in arbitrary
+ layouts. Previous methods either used all loudspeakers to produce
+ virtual sources, which results in some artefacts, or they used
+ loudspeaker triplets with a non-generalizable 2-D user interface.
+ .
+ The directional qualities of virtual sources generated with VBAP can
+ be stated as follows. Directional coordinates used for this purpose
+ are the angle between a position vector and the median plane (θcc),
+ and the angle between a projection of a position vector to the median
+ plane and frontal direction (Φcc). The perceived θcc direction of a
+ virtual source coincides well with the VBAP panning direction when a
+ loudspeaker set is near the median plane. When the loudspeaker set is
+ moved towards a side of a listener, the perceived θcc direction is
+ biased towards the median plane. The perceived Φcc direction of an
+ amplitude-panned virtual source is individual and cannot be predicted
+ with any panning law.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..c5b67df
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,23 @@
+Format-Specification: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?rev=135
+Name: vbap
+Maintainer:
+Source: http://sourceforge.net/projects/pure-data/files/libraries/vbap/
+
+Files: *
+Copyright: 2001-2003, Free Software Foundation
+License: GPL-2+
+ This package 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 package 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 package; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+X-Comment: On Debian systems, the complete text of the GNU General
+ Public License can be found in `/usr/share/common-licenses/GPL-2'.
diff --git a/debian/gbp.conf b/debian/gbp.conf
new file mode 100644
index 0000000..ae1dc36
--- /dev/null
+++ b/debian/gbp.conf
@@ -0,0 +1,7 @@
+[DEFAULT]
+upstream-branch = upstream
+debian-branch = master
+upstream-tag = upstream/%(version)s
+debian-tag = debian/%(version)s
+pristine-tar = True
+sign-tags = True
diff --git a/debian/links b/debian/links
new file mode 100644
index 0000000..b348ed9
--- /dev/null
+++ b/debian/links
@@ -0,0 +1,3 @@
+usr/lib/pd/extra/vbap/README.txt usr/share/doc/pd-vbap/README
+usr/lib/pd/extra/vbap/examples usr/share/doc/pd-vbap/examples
+usr/share/common-licenses/GPL-2 usr/lib/pd/extra/vbap/LICENSE.txt
diff --git a/debian/patches/add_required_internal_pd_headers b/debian/patches/add_required_internal_pd_headers
new file mode 100644
index 0000000..b68508c
--- /dev/null
+++ b/debian/patches/add_required_internal_pd_headers
@@ -0,0 +1,968 @@
+Description: workaround for headers missing from 'puredata'
+ Currently the 'puredata' package only includes the header m_pd.h, but other
+ headers are need to build this package, specifically s_stuff.h and
+ g_canvas.h. This patch adds the two headers from 'puredata' version 0.42.6
+ until the other headers are included in Debian.
+Author: Hans-Christoph Steiner <hans@eds.org>
+Bug-Debian: http://bugs.debian.org/568770
+Forwarded: not-needed
+Reviewed-By: Hans-Christoph Steiner <hans@eds.org>
+Last-Update: <2010-09-13>
+
+--- /dev/null
++++ pd-hcs-0.1/s_stuff.h
+@@ -0,0 +1,333 @@
++/* Copyright (c) 1997-1999 Miller Puckette.
++* For information on usage and redistribution, and for a DISCLAIMER OF ALL
++* WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
++
++/* Audio and MIDI I/O, and other scheduling and system stuff. */
++
++/* NOTE: this file describes Pd implementation details which may change
++in future releases. The public (stable) API is in m_pd.h. */
++
++/* in s_path.c */
++
++typedef struct _namelist /* element in a linked list of stored strings */
++{
++ struct _namelist *nl_next; /* next in list */
++ char *nl_string; /* the string */
++} t_namelist;
++
++t_namelist *namelist_append(t_namelist *listwas, const char *s, int allowdup);
++t_namelist *namelist_append_files(t_namelist *listwas, const char *s);
++void namelist_free(t_namelist *listwas);
++char *namelist_get(t_namelist *namelist, int n);
++void sys_setextrapath(const char *p);
++extern int sys_usestdpath;
++extern t_namelist *sys_externlist;
++extern t_namelist *sys_searchpath;
++extern t_namelist *sys_helppath;
++int sys_open_absolute(const char *name, const char* ext,
++ char *dirresult, char **nameresult, unsigned int size, int bin, int *fdp);
++int sys_trytoopenone(const char *dir, const char *name, const char* ext,
++ char *dirresult, char **nameresult, unsigned int size, int bin);
++t_symbol *sys_decodedialog(t_symbol *s);
++
++/* s_file.c */
++
++void sys_loadpreferences( void);
++void sys_savepreferences( void);
++extern int sys_defeatrt;
++extern t_symbol *sys_flags;
++
++/* s_main.c */
++extern int sys_debuglevel;
++extern int sys_verbose;
++extern int sys_noloadbang;
++extern int sys_nogui;
++extern char *sys_guicmd;
++
++EXTERN int sys_nearestfontsize(int fontsize);
++EXTERN int sys_hostfontsize(int fontsize);
++
++extern int sys_defaultfont;
++extern t_symbol *sys_libdir; /* library directory for auxilliary files */
++extern t_symbol *sys_guidir; /* directory holding pd_gui, u_pdsend, etc */
++
++/* s_loader.c */
++
++typedef int (*loader_t)(t_canvas *canvas, char *classname); /* callback type */
++EXTERN int sys_load_lib(t_canvas *canvas, char *filename);
++EXTERN void sys_register_loader(loader_t loader);
++
++/* s_audio.c */
++
++#define SENDDACS_NO 0 /* return values for sys_send_dacs() */
++#define SENDDACS_YES 1
++#define SENDDACS_SLEPT 2
++
++#define DEFDACBLKSIZE 64
++extern int sys_schedblocksize; /* audio block size for scheduler */
++extern int sys_hipriority; /* real-time flag, true if priority boosted */
++extern t_sample *sys_soundout;
++extern t_sample *sys_soundin;
++extern int sys_inchannels;
++extern int sys_outchannels;
++extern int sys_advance_samples; /* scheduler advance in samples */
++extern int sys_blocksize; /* audio I/O block size in sample frames */
++extern t_float sys_dacsr;
++extern int sys_schedadvance;
++extern int sys_sleepgrain;
++void sys_set_audio_settings(int naudioindev, int *audioindev,
++ int nchindev, int *chindev,
++ int naudiooutdev, int *audiooutdev, int nchoutdev, int *choutdev,
++ int srate, int advance, int callback);
++void sys_reopen_audio( void);
++void sys_close_audio(void);
++
++
++int sys_send_dacs(void);
++void sys_reportidle(void);
++void sys_set_priority(int higher);
++void sys_audiobuf(int nbufs);
++void sys_getmeters(t_sample *inmax, t_sample *outmax);
++void sys_listdevs(void);
++void sys_setblocksize(int n);
++
++/* s_midi.c */
++#define MAXMIDIINDEV 16 /* max. number of input ports */
++#define MAXMIDIOUTDEV 16 /* max. number of output ports */
++extern int sys_nmidiin;
++extern int sys_nmidiout;
++extern int sys_midiindevlist[];
++extern int sys_midioutdevlist[];
++
++void sys_open_midi(int nmidiin, int *midiinvec,
++ int nmidiout, int *midioutvec, int enable);
++void sys_get_midi_params(int *pnmidiindev, int *pmidiindev,
++ int *pnmidioutdev, int *pmidioutdev);
++
++void sys_get_midi_apis(char *buf);
++
++void sys_reopen_midi( void);
++void sys_close_midi( void);
++EXTERN void sys_putmidimess(int portno, int a, int b, int c);
++EXTERN void sys_putmidibyte(int portno, int a);
++EXTERN void sys_poll_midi(void);
++EXTERN void sys_setmiditimediff(double inbuftime, double outbuftime);
++EXTERN void sys_midibytein(int portno, int byte);
++
++ /* implemented in the system dependent MIDI code (s_midi_pm.c, etc. ) */
++void midi_getdevs(char *indevlist, int *nindevs,
++ char *outdevlist, int *noutdevs, int maxndev, int devdescsize);
++void sys_do_open_midi(int nmidiindev, int *midiindev,
++ int nmidioutdev, int *midioutdev);
++
++#ifdef USEAPI_ALSA
++EXTERN void sys_alsa_putmidimess(int portno, int a, int b, int c);
++EXTERN void sys_alsa_putmidibyte(int portno, int a);
++EXTERN void sys_alsa_poll_midi(void);
++EXTERN void sys_alsa_setmiditimediff(double inbuftime, double outbuftime);
++EXTERN void sys_alsa_midibytein(int portno, int byte);
++EXTERN void sys_alsa_close_midi( void);
++
++
++ /* implemented in the system dependent MIDI code (s_midi_pm.c, etc. ) */
++void midi_alsa_getdevs(char *indevlist, int *nindevs,
++ char *outdevlist, int *noutdevs, int maxndev, int devdescsize);
++void sys_alsa_do_open_midi(int nmidiindev, int *midiindev,
++ int nmidioutdev, int *midioutdev);
++#endif
++
++/* m_sched.c */
++EXTERN void sys_log_error(int type);
++#define ERR_NOTHING 0
++#define ERR_ADCSLEPT 1
++#define ERR_DACSLEPT 2
++#define ERR_RESYNC 3
++#define ERR_DATALATE 4
++
++#define SCHED_AUDIO_NONE 0
++#define SCHED_AUDIO_POLL 1
++#define SCHED_AUDIO_CALLBACK 2
++void sched_set_using_audio(int flag);
++
++/* s_inter.c */
++
++EXTERN void sys_microsleep(int microsec);
++
++EXTERN void sys_bail(int exitcode);
++EXTERN int sys_pollgui(void);
++
++EXTERN_STRUCT _socketreceiver;
++#define t_socketreceiver struct _socketreceiver
++
++typedef void (*t_socketnotifier)(void *x);
++typedef void (*t_socketreceivefn)(void *x, t_binbuf *b);
++
++EXTERN t_socketreceiver *socketreceiver_new(void *owner,
++ t_socketnotifier notifier, t_socketreceivefn socketreceivefn, int udp);
++EXTERN void socketreceiver_read(t_socketreceiver *x, int fd);
++EXTERN void sys_sockerror(char *s);
++EXTERN void sys_closesocket(int fd);
++
++typedef void (*t_fdpollfn)(void *ptr, int fd);
++EXTERN void sys_addpollfn(int fd, t_fdpollfn fn, void *ptr);
++EXTERN void sys_rmpollfn(int fd);
++#ifdef UNIX
++void sys_setalarm(int microsec);
++void sys_setvirtualalarm( void);
++#endif
++
++#define API_NONE 0
++#define API_ALSA 1
++#define API_OSS 2
++#define API_MMIO 3
++#define API_PORTAUDIO 4
++#define API_JACK 5
++#define API_SGI 6
++
++#ifdef __linux__
++#define API_DEFAULT API_OSS
++#define API_DEFSTRING "OSS"
++#endif
++#ifdef MSW
++#define API_DEFAULT API_MMIO
++#define API_DEFSTRING "MMIO"
++#endif
++#ifdef __APPLE__
++#define API_DEFAULT API_PORTAUDIO
++#define API_DEFSTRING "portaudio"
++#endif
++#ifdef IRIX
++#define API_DEFAULT API_SGI
++#define API_DEFSTRING "SGI Digital Media"
++#endif
++#define DEFAULTAUDIODEV 0
++
++#define MAXAUDIOINDEV 4
++#define MAXAUDIOOUTDEV 4
++
++#define DEFMIDIDEV 0
++
++#define DEFAULTSRATE 44100
++#ifdef MSW
++#define DEFAULTADVANCE 70
++#else
++#define DEFAULTADVANCE 50
++#endif
++
++typedef void (*t_audiocallback)(void);
++
++int pa_open_audio(int inchans, int outchans, int rate, t_sample *soundin,
++ t_sample *soundout, int framesperbuf, int nbuffers,
++ int indeviceno, int outdeviceno, t_audiocallback callback);
++void pa_close_audio(void);
++int pa_send_dacs(void);
++void sys_reportidle(void);
++void pa_listdevs(void);
++void pa_getdevs(char *indevlist, int *nindevs,
++ char *outdevlist, int *noutdevs, int *canmulti,
++ int maxndev, int devdescsize);
++
++int oss_open_audio(int naudioindev, int *audioindev, int nchindev,
++ int *chindev, int naudiooutdev, int *audiooutdev, int nchoutdev,
++ int *choutdev, int rate);
++void oss_close_audio(void);
++int oss_send_dacs(void);
++void oss_reportidle(void);
++void oss_getdevs(char *indevlist, int *nindevs,
++ char *outdevlist, int *noutdevs, int *canmulti,
++ int maxndev, int devdescsize);
++
++int alsa_open_audio(int naudioindev, int *audioindev, int nchindev,
++ int *chindev, int naudiooutdev, int *audiooutdev, int nchoutdev,
++ int *choutdev, int rate);
++void alsa_close_audio(void);
++int alsa_send_dacs(void);
++void alsa_reportidle(void);
++void alsa_getdevs(char *indevlist, int *nindevs,
++ char *outdevlist, int *noutdevs, int *canmulti,
++ int maxndev, int devdescsize);
++
++int jack_open_audio(int wantinchans, int wantoutchans, int srate);
++void jack_close_audio(void);
++int jack_send_dacs(void);
++void jack_reportidle(void);
++void jack_getdevs(char *indevlist, int *nindevs,
++ char *outdevlist, int *noutdevs, int *canmulti,
++ int maxndev, int devdescsize);
++void jack_listdevs(void);
++
++int mmio_open_audio(int naudioindev, int *audioindev,
++ int nchindev, int *chindev, int naudiooutdev, int *audiooutdev,
++ int nchoutdev, int *choutdev, int rate);
++void mmio_close_audio( void);
++void mmio_reportidle(void);
++int mmio_send_dacs(void);
++void mmio_getdevs(char *indevlist, int *nindevs,
++ char *outdevlist, int *noutdevs, int *canmulti,
++ int maxndev, int devdescsize);
++
++void sys_listmididevs(void);
++void sys_set_midi_api(int whichapi);
++void sys_set_audio_api(int whichapi);
++void sys_get_audio_apis(char *buf);
++extern int sys_audioapi;
++void sys_set_audio_state(int onoff);
++
++/* API dependent audio flags and settings */
++void oss_set32bit( void);
++void linux_alsa_devname(char *devname);
++
++void sys_get_audio_params(
++ int *pnaudioindev, int *paudioindev, int *chindev,
++ int *pnaudiooutdev, int *paudiooutdev, int *choutdev,
++ int *prate, int *padvance, int *callback);
++void sys_save_audio_params(
++ int naudioindev, int *audioindev, int *chindev,
++ int naudiooutdev, int *audiooutdev, int *choutdev,
++ int rate, int advance, int callback);
++
++/* s_file.c */
++
++typedef void (*t_printhook)(const char *s);
++extern t_printhook sys_printhook; /* set this to override printing */
++extern int sys_printtostderr;
++
++/* jsarlo { */
++
++EXTERN double sys_time;
++EXTERN double sys_time_per_dsp_tick;
++EXTERN int sys_externalschedlib;
++
++EXTERN t_sample* get_sys_soundout(void ) ;
++EXTERN t_sample* get_sys_soundin(void ) ;
++EXTERN int* get_sys_main_advance(void ) ;
++EXTERN double* get_sys_time_per_dsp_tick(void ) ;
++EXTERN int* get_sys_schedblocksize(void ) ;
++EXTERN double* get_sys_time(void ) ;
++EXTERN t_float* get_sys_dacsr(void ) ;
++EXTERN int* get_sys_sleepgrain(void ) ;
++EXTERN int* get_sys_schedadvance(void ) ;
++
++EXTERN void sys_clearhist(void );
++EXTERN void sys_initmidiqueue(void );
++EXTERN int sys_addhist(int phase);
++EXTERN void sys_setmiditimediff(double inbuftime, double outbuftime);
++EXTERN void sched_tick(double next_sys_time);
++EXTERN void sys_pollmidiqueue(void );
++EXTERN int sys_pollgui(void );
++EXTERN void sys_setchsr(int chin, int chout, int sr);
++
++EXTERN void inmidi_noteon(int portno, int channel, int pitch, int velo);
++EXTERN void inmidi_controlchange(int portno,
++ int channel,
++ int ctlnumber,
++ int value);
++EXTERN void inmidi_programchange(int portno, int channel, int value);
++EXTERN void inmidi_pitchbend(int portno, int channel, int value);
++EXTERN void inmidi_aftertouch(int portno, int channel, int value);
++EXTERN void inmidi_polyaftertouch(int portno,
++ int channel,
++ int pitch,
++ int value);
++/* } jsarlo */
++extern t_widgetbehavior text_widgetbehavior;
+--- /dev/null
++++ pd-hcs-0.1/g_canvas.h
+@@ -0,0 +1,618 @@
++/* Copyright (c) 1997-1999 Miller Puckette.
++* For information on usage and redistribution, and for a DISCLAIMER OF ALL
++* WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
++
++/* this file defines the structure for "glists" and related structures and
++functions. "Glists" and "canvases" and "graphs" used to be different
++structures until being unified in version 0.35.
++
++A glist occupies its own window if the "gl_havewindow" flag is set. Its
++appearance on its "parent", also called "owner", (if it has one) is as a graph
++if "gl_isgraph" is set, and otherwise as a text box.
++
++A glist is "root" if it has no owner, i.e., a document window. In this
++case "gl_havewindow" is always set.
++
++We maintain a list of root windows, so that we can traverse the whole
++collection of everything in a Pd process.
++
++If a glist has a window it may still not be "mapped." Miniaturized
++windows aren't mapped, for example, but a window is also not mapped
++immediately upon creation. In either case gl_havewindow is true but
++gl_mapped is false.
++
++Closing a non-root window makes it invisible; closing a root destroys it.
++
++A glist that's just a text object on its parent is always "toplevel." An
++embedded glist can switch back and forth to appear as a toplevel by double-
++clicking on it. Single-clicking a text box makes the toplevel become visible
++and raises the window it's in.
++
++If a glist shows up as a graph on its parent, the graph is blanked while the
++glist has its own window, even if miniaturized.
++
++*/
++
++/* NOTE: this file describes Pd implementation details which may change
++in future releases. The public (stable) API is in m_pd.h. */
++
++#if defined(_LANGUAGE_C_PLUS_PLUS) || defined(__cplusplus)
++extern "C" {
++#endif
++
++/* --------------------- geometry ---------------------------- */
++#define IOWIDTH 7 /* width of an inlet/outlet in pixels */
++#define IOMIDDLE ((IOWIDTH-1)/2)
++#define GLIST_DEFGRAPHWIDTH 200
++#define GLIST_DEFGRAPHHEIGHT 140
++/* ----------------------- data ------------------------------- */
++
++typedef struct _updateheader
++{
++ struct _updateheader *upd_next;
++ unsigned int upd_array:1; /* true if array, false if glist */
++ unsigned int upd_queued:1; /* true if we're queued */
++} t_updateheader;
++
++ /* types to support glists grabbing mouse motion or keys from parent */
++typedef void (*t_glistmotionfn)(void *z, t_floatarg dx, t_floatarg dy);
++typedef void (*t_glistkeyfn)(void *z, t_floatarg key);
++
++EXTERN_STRUCT _rtext;
++#define t_rtext struct _rtext
++
++EXTERN_STRUCT _gtemplate;
++#define t_gtemplate struct _gtemplate
++
++EXTERN_STRUCT _guiconnect;
++#define t_guiconnect struct _guiconnect
++
++EXTERN_STRUCT _tscalar;
++#define t_tscalar struct _tscalar
++
++EXTERN_STRUCT _canvasenvironment;
++#define t_canvasenvironment struct _canvasenvironment
++
++EXTERN_STRUCT _fielddesc;
++#define t_fielddesc struct _fielddesc
++
++typedef struct _selection
++{
++ t_gobj *sel_what;
++ struct _selection *sel_next;
++} t_selection;
++
++ /* this structure is instantiated whenever a glist becomes visible. */
++typedef struct _editor
++{
++ t_updateheader e_upd; /* update header structure */
++ t_selection *e_updlist; /* list of objects to update */
++ t_rtext *e_rtext; /* text responder linked list */
++ t_selection *e_selection; /* head of the selection list */
++ t_rtext *e_textedfor; /* the rtext if any that we are editing */
++ t_gobj *e_grab; /* object being "dragged" */
++ t_glistmotionfn e_motionfn; /* ... motion callback */
++ t_glistkeyfn e_keyfn; /* ... keypress callback */
++ t_binbuf *e_connectbuf; /* connections to deleted objects */
++ t_binbuf *e_deleted; /* last stuff we deleted */
++ t_guiconnect *e_guiconnect; /* GUI connection for filtering messages */
++ struct _glist *e_glist; /* glist which owns this */
++ int e_xwas; /* xpos on last mousedown or motion event */
++ int e_ywas; /* ypos, similarly */
++ int e_selectline_index1; /* indices for the selected line if any */
++ int e_selectline_outno; /* (only valid if e_selectedline is set) */
++ int e_selectline_index2;
++ int e_selectline_inno;
++ t_outconnect *e_selectline_tag;
++ unsigned int e_onmotion: 3; /* action to take on motion */
++ unsigned int e_lastmoved: 1; /* one if mouse has moved since click */
++ unsigned int e_textdirty: 1; /* one if e_textedfor has changed */
++ unsigned int e_selectedline: 1; /* one if a line is selected */
++} t_editor;
++
++#define MA_NONE 0 /* e_onmotion: do nothing on mouse motion */
++#define MA_MOVE 1 /* drag the selection around */
++#define MA_CONNECT 2 /* make a connection */
++#define MA_REGION 3 /* selection region */
++#define MA_PASSOUT 4 /* send on to e_grab */
++#define MA_DRAGTEXT 5 /* drag in text editor to alter selection */
++
++/* editor structure for "garrays". We don't bother to delete and regenerate
++this structure when the "garray" becomes invisible or visible, although we
++could do so if the structure gets big (like the "editor" above.) */
++
++typedef struct _arrayvis
++{
++ t_updateheader av_upd; /* update header structure */
++ t_garray *av_garray; /* owning structure */
++} t_arrayvis;
++
++/* the t_tick structure describes where to draw x and y "ticks" for a glist */
++
++typedef struct _tick /* where to put ticks on x or y axes */
++{
++ t_float k_point; /* one point to draw a big tick at */
++ t_float k_inc; /* x or y increment per little tick */
++ int k_lperb; /* little ticks per big; 0 if no ticks to draw */
++} t_tick;
++
++/* the t_glist structure, which describes a list of elements that live on an
++area of a window.
++
++*/
++
++struct _glist
++{
++ t_object gl_obj; /* header in case we're a glist */
++ t_gobj *gl_list; /* the actual data */
++ struct _gstub *gl_stub; /* safe pointer handler */
++ int gl_valid; /* incremented when pointers might be stale */
++ struct _glist *gl_owner; /* parent glist, supercanvas, or 0 if none */
++ int gl_pixwidth; /* width in pixels (on parent, if a graph) */
++ int gl_pixheight;
++ t_float gl_x1; /* bounding rectangle in our own coordinates */
++ t_float gl_y1;
++ t_float gl_x2;
++ t_float gl_y2;
++ int gl_screenx1; /* screen coordinates when toplevel */
++ int gl_screeny1;
++ int gl_screenx2;
++ int gl_screeny2;
++ int gl_xmargin; /* origin for GOP rectangle */
++ int gl_ymargin;
++ t_tick gl_xtick; /* ticks marking X values */
++ int gl_nxlabels; /* number of X coordinate labels */
++ t_symbol **gl_xlabel; /* ... an array to hold them */
++ t_float gl_xlabely; /* ... and their Y coordinates */
++ t_tick gl_ytick; /* same as above for Y ticks and labels */
++ int gl_nylabels;
++ t_symbol **gl_ylabel;
++ t_float gl_ylabelx;
++ t_editor *gl_editor; /* editor structure when visible */
++ t_symbol *gl_name; /* symbol bound here */
++ int gl_font; /* nominal font size in points, e.g., 10 */
++ struct _glist *gl_next; /* link in list of toplevels */
++ t_canvasenvironment *gl_env; /* root canvases and abstractions only */
++ unsigned int gl_havewindow:1; /* true if we own a window */
++ unsigned int gl_mapped:1; /* true if, moreover, it's "mapped" */
++ unsigned int gl_dirty:1; /* (root canvas only:) patch has changed */
++ unsigned int gl_loading:1; /* am now loading from file */
++ unsigned int gl_willvis:1; /* make me visible after loading */
++ unsigned int gl_edit:1; /* edit mode */
++ unsigned int gl_isdeleting:1; /* we're inside glist_delete -- hack! */
++ unsigned int gl_goprect:1; /* draw rectangle for graph-on-parent */
++ unsigned int gl_isgraph:1; /* show as graph on parent */
++ unsigned int gl_hidetext:1; /* hide object-name + args when doing graph on parent */
++};
++
++#define gl_gobj gl_obj.te_g
++#define gl_pd gl_gobj.g_pd
++
++/* a data structure to describe a field in a pure datum */
++
++#define DT_FLOAT 0
++#define DT_SYMBOL 1
++#define DT_LIST 2
++#define DT_ARRAY 3
++
++typedef struct _dataslot
++{
++ int ds_type;
++ t_symbol *ds_name;
++ t_symbol *ds_arraytemplate; /* filled in for arrays only */
++} t_dataslot;
++
++typedef struct _template
++{
++ t_pd t_pdobj; /* header */
++ struct _gtemplate *t_list; /* list of "struct"/gtemplate objects */
++ t_symbol *t_sym; /* name */
++ int t_n; /* number of dataslots (fields) */
++ t_dataslot *t_vec; /* array of dataslots */
++} t_template;
++
++struct _array
++{
++ int a_n; /* number of elements */
++ int a_elemsize; /* size in bytes; LATER get this from template */
++ char *a_vec; /* array of elements */
++ t_symbol *a_templatesym; /* template for elements */
++ int a_valid; /* protection against stale pointers into array */
++ t_gpointer a_gp; /* pointer to scalar or array element we're in */
++ t_gstub *a_stub; /* stub for pointing into this array */
++};
++
++ /* structure for traversing all the connections in a glist */
++typedef struct _linetraverser
++{
++ t_canvas *tr_x;
++ t_object *tr_ob;
++ int tr_nout;
++ int tr_outno;
++ t_object *tr_ob2;
++ t_outlet *tr_outlet;
++ t_inlet *tr_inlet;
++ int tr_nin;
++ int tr_inno;
++ int tr_x11, tr_y11, tr_x12, tr_y12;
++ int tr_x21, tr_y21, tr_x22, tr_y22;
++ int tr_lx1, tr_ly1, tr_lx2, tr_ly2;
++ t_outconnect *tr_nextoc;
++ int tr_nextoutno;
++} t_linetraverser;
++
++/* function types used to define graphical behavior for gobjs, a bit like X
++widgets. We don't use Pd methods because Pd's typechecking can't specify the
++types of pointer arguments. Also it's more convenient this way, since
++every "patchable" object can just get the "text" behaviors. */
++
++ /* Call this to get a gobj's bounding rectangle in pixels */
++typedef void (*t_getrectfn)(t_gobj *x, struct _glist *glist,
++ int *x1, int *y1, int *x2, int *y2);
++ /* and this to displace a gobj: */
++typedef void (*t_displacefn)(t_gobj *x, struct _glist *glist, int dx, int dy);
++ /* change color to show selection: */
++typedef void (*t_selectfn)(t_gobj *x, struct _glist *glist, int state);
++ /* change appearance to show activation/deactivation: */
++typedef void (*t_activatefn)(t_gobj *x, struct _glist *glist, int state);
++ /* warn a gobj it's about to be deleted */
++typedef void (*t_deletefn)(t_gobj *x, struct _glist *glist);
++ /* making visible or invisible */
++typedef void (*t_visfn)(t_gobj *x, struct _glist *glist, int flag);
++ /* field a mouse click (when not in "edit" mode) */
++typedef int (*t_clickfn)(t_gobj *x, struct _glist *glist,
++ int xpix, int ypix, int shift, int alt, int dbl, int doit);
++ /* ... and later, resizing; getting/setting font or color... */
++
++struct _widgetbehavior
++{
++ t_getrectfn w_getrectfn;
++ t_displacefn w_displacefn;
++ t_selectfn w_selectfn;
++ t_activatefn w_activatefn;
++ t_deletefn w_deletefn;
++ t_visfn w_visfn;
++ t_clickfn w_clickfn;
++};
++
++/* -------- behaviors for scalars defined by objects in template --------- */
++/* these are set by "drawing commands" in g_template.c which add appearance to
++scalars, which live in some other window. If the scalar is just included
++in a canvas the "parent" is a misnomer. There is also a text scalar object
++which really does draw the scalar on the parent window; see g_scalar.c. */
++
++/* note how the click function wants the whole scalar, not the "data", so
++doesn't work on array elements... LATER reconsider this */
++
++ /* bounding rectangle: */
++typedef void (*t_parentgetrectfn)(t_gobj *x, struct _glist *glist,
++ t_word *data, t_template *tmpl, t_float basex, t_float basey,
++ int *x1, int *y1, int *x2, int *y2);
++ /* displace it */
++typedef void (*t_parentdisplacefn)(t_gobj *x, struct _glist *glist,
++ t_word *data, t_template *tmpl, t_float basex, t_float basey,
++ int dx, int dy);
++ /* change color to show selection */
++typedef void (*t_parentselectfn)(t_gobj *x, struct _glist *glist,
++ t_word *data, t_template *tmpl, t_float basex, t_float basey,
++ int state);
++ /* change appearance to show activation/deactivation: */
++typedef void (*t_parentactivatefn)(t_gobj *x, struct _glist *glist,
++ t_word *data, t_template *tmpl, t_float basex, t_float basey,
++ int state);
++ /* making visible or invisible */
++typedef void (*t_parentvisfn)(t_gobj *x, struct _glist *glist,
++ t_word *data, t_template *tmpl, t_float basex, t_float basey,
++ int flag);
++ /* field a mouse click */
++typedef int (*t_parentclickfn)(t_gobj *x, struct _glist *glist,
++ t_word *data, t_template *tmpl, t_scalar *sc, t_array *ap,
++ t_float basex, t_float basey,
++ int xpix, int ypix, int shift, int alt, int dbl, int doit);
++
++struct _parentwidgetbehavior
++{
++ t_parentgetrectfn w_parentgetrectfn;
++ t_parentdisplacefn w_parentdisplacefn;
++ t_parentselectfn w_parentselectfn;
++ t_parentactivatefn w_parentactivatefn;
++ t_parentvisfn w_parentvisfn;
++ t_parentclickfn w_parentclickfn;
++};
++
++ /* cursor definitions; used as return value for t_parentclickfn */
++#define CURSOR_RUNMODE_NOTHING 0
++#define CURSOR_RUNMODE_CLICKME 1
++#define CURSOR_RUNMODE_THICKEN 2
++#define CURSOR_RUNMODE_ADDPOINT 3
++#define CURSOR_EDITMODE_NOTHING 4
++#define CURSOR_EDITMODE_CONNECT 5
++#define CURSOR_EDITMODE_DISCONNECT 6
++EXTERN void canvas_setcursor(t_glist *x, unsigned int cursornum);
++
++extern t_canvas *canvas_editing; /* last canvas to start text edting */
++extern t_canvas *canvas_whichfind; /* last canvas we did a find in */
++extern t_canvas *canvas_list; /* list of all root canvases */
++extern t_class *vinlet_class, *voutlet_class;
++extern int glist_valid; /* incremented when pointers might be stale */
++
++#define PLOTSTYLE_POINTS 0 /* plotting styles for arrays */
++#define PLOTSTYLE_POLY 1
++#define PLOTSTYLE_BEZ 2
++
++/* ------------------- functions on any gobj ----------------------------- */
++EXTERN void gobj_getrect(t_gobj *x, t_glist *owner, int *x1, int *y1,
++ int *x2, int *y2);
++EXTERN void gobj_displace(t_gobj *x, t_glist *owner, int dx, int dy);
++EXTERN void gobj_select(t_gobj *x, t_glist *owner, int state);
++EXTERN void gobj_activate(t_gobj *x, t_glist *owner, int state);
++EXTERN void gobj_delete(t_gobj *x, t_glist *owner);
++EXTERN void gobj_vis(t_gobj *x, t_glist *glist, int flag);
++EXTERN int gobj_click(t_gobj *x, struct _glist *glist,
++ int xpix, int ypix, int shift, int alt, int dbl, int doit);
++EXTERN void gobj_save(t_gobj *x, t_binbuf *b);
++EXTERN void gobj_properties(t_gobj *x, struct _glist *glist);
++EXTERN void gobj_save(t_gobj *x, t_binbuf *b);
++EXTERN int gobj_shouldvis(t_gobj *x, struct _glist *glist);
++
++/* -------------------- functions on glists --------------------- */
++EXTERN t_glist *glist_new( void);
++EXTERN void glist_init(t_glist *x);
++EXTERN void glist_add(t_glist *x, t_gobj *g);
++EXTERN void glist_cleanup(t_glist *x);
++EXTERN void glist_free(t_glist *x);
++
++EXTERN void glist_clear(t_glist *x);
++EXTERN t_canvas *glist_getcanvas(t_glist *x);
++EXTERN int glist_isselected(t_glist *x, t_gobj *y);
++EXTERN void glist_select(t_glist *x, t_gobj *y);
++EXTERN void glist_deselect(t_glist *x, t_gobj *y);
++EXTERN void glist_noselect(t_glist *x);
++EXTERN void glist_selectall(t_glist *x);
++EXTERN void glist_delete(t_glist *x, t_gobj *y);
++EXTERN void glist_retext(t_glist *x, t_text *y);
++EXTERN void glist_grab(t_glist *x, t_gobj *y, t_glistmotionfn motionfn,
++ t_glistkeyfn keyfn, int xpos, int ypos);
++EXTERN int glist_isvisible(t_glist *x);
++EXTERN int glist_istoplevel(t_glist *x);
++EXTERN t_glist *glist_findgraph(t_glist *x);
++EXTERN int glist_getfont(t_glist *x);
++EXTERN void glist_sort(t_glist *canvas);
++EXTERN void glist_read(t_glist *x, t_symbol *filename, t_symbol *format);
++EXTERN void glist_mergefile(t_glist *x, t_symbol *filename, t_symbol *format);
++
++EXTERN t_float glist_pixelstox(t_glist *x, t_float xpix);
++EXTERN t_float glist_pixelstoy(t_glist *x, t_float ypix);
++EXTERN t_float glist_xtopixels(t_glist *x, t_float xval);
++EXTERN t_float glist_ytopixels(t_glist *x, t_float yval);
++EXTERN t_float glist_dpixtodx(t_glist *x, t_float dxpix);
++EXTERN t_float glist_dpixtody(t_glist *x, t_float dypix);
++
++EXTERN void glist_getnextxy(t_glist *gl, int *xval, int *yval);
++EXTERN void glist_glist(t_glist *g, t_symbol *s, int argc, t_atom *argv);
++EXTERN t_glist *glist_addglist(t_glist *g, t_symbol *sym,
++ t_float x1, t_float y1, t_float x2, t_float y2,
++ t_float px1, t_float py1, t_float px2, t_float py2);
++EXTERN void glist_arraydialog(t_glist *parent, t_symbol *name,
++ t_floatarg size, t_floatarg saveit, t_floatarg newgraph);
++EXTERN t_binbuf *glist_writetobinbuf(t_glist *x, int wholething);
++EXTERN int glist_isgraph(t_glist *x);
++EXTERN void glist_redraw(t_glist *x);
++EXTERN void glist_drawiofor(t_glist *glist, t_object *ob, int firsttime,
++ char *tag, int x1, int y1, int x2, int y2);
++EXTERN void glist_eraseiofor(t_glist *glist, t_object *ob, char *tag);
++EXTERN void canvas_create_editor(t_glist *x);
++EXTERN void canvas_destroy_editor(t_glist *x);
++void canvas_deletelinesforio(t_canvas *x, t_text *text,
++ t_inlet *inp, t_outlet *outp);
++extern int glist_amreloadingabstractions; /* stop GUI changes while reloading */
++
++/* -------------------- functions on texts ------------------------- */
++EXTERN void text_setto(t_text *x, t_glist *glist, char *buf, int bufsize);
++EXTERN void text_drawborder(t_text *x, t_glist *glist, char *tag,
++ int width, int height, int firsttime);
++EXTERN void text_eraseborder(t_text *x, t_glist *glist, char *tag);
++EXTERN int text_xcoord(t_text *x, t_glist *glist);
++EXTERN int text_ycoord(t_text *x, t_glist *glist);
++EXTERN int text_xpix(t_text *x, t_glist *glist);
++EXTERN int text_ypix(t_text *x, t_glist *glist);
++
++/* -------------------- functions on rtexts ------------------------- */
++#define RTEXT_DOWN 1
++#define RTEXT_DRAG 2
++#define RTEXT_DBL 3
++#define RTEXT_SHIFT 4
++
++EXTERN t_rtext *rtext_new(t_glist *glist, t_text *who);
++EXTERN t_rtext *glist_findrtext(t_glist *gl, t_text *who);
++EXTERN void rtext_draw(t_rtext *x);
++EXTERN void rtext_erase(t_rtext *x);
++EXTERN t_rtext *rtext_remove(t_rtext *first, t_rtext *x);
++EXTERN int rtext_height(t_rtext *x);
++EXTERN void rtext_displace(t_rtext *x, int dx, int dy);
++EXTERN void rtext_select(t_rtext *x, int state);
++EXTERN void rtext_activate(t_rtext *x, int state);
++EXTERN void rtext_free(t_rtext *x);
++EXTERN void rtext_key(t_rtext *x, int n, t_symbol *s);
++EXTERN void rtext_mouse(t_rtext *x, int xval, int yval, int flag);
++EXTERN void rtext_retext(t_rtext *x);
++EXTERN int rtext_width(t_rtext *x);
++EXTERN int rtext_height(t_rtext *x);
++EXTERN char *rtext_gettag(t_rtext *x);
++EXTERN void rtext_gettext(t_rtext *x, char **buf, int *bufsize);
++EXTERN void rtext_getseltext(t_rtext *x, char **buf, int *bufsize);
++
++/* -------------------- functions on canvases ------------------------ */
++EXTERN t_class *canvas_class;
++
++EXTERN t_canvas *canvas_new(void *dummy, t_symbol *sel, int argc, t_atom *argv);
++EXTERN t_symbol *canvas_makebindsym(t_symbol *s);
++EXTERN void canvas_vistext(t_canvas *x, t_text *y);
++EXTERN void canvas_fixlinesfor(t_canvas *x, t_text *text);
++EXTERN void canvas_deletelinesfor(t_canvas *x, t_text *text);
++EXTERN void canvas_stowconnections(t_canvas *x);
++EXTERN void canvas_restoreconnections(t_canvas *x);
++EXTERN void canvas_redraw(t_canvas *x);
++
++EXTERN t_inlet *canvas_addinlet(t_canvas *x, t_pd *who, t_symbol *sym);
++EXTERN void canvas_rminlet(t_canvas *x, t_inlet *ip);
++EXTERN t_outlet *canvas_addoutlet(t_canvas *x, t_pd *who, t_symbol *sym);
++EXTERN void canvas_rmoutlet(t_canvas *x, t_outlet *op);
++EXTERN void canvas_redrawallfortemplate(t_template *tmpl, int action);
++EXTERN void canvas_redrawallfortemplatecanvas(t_canvas *x, int action);
++EXTERN void canvas_zapallfortemplate(t_canvas *tmpl);
++EXTERN void canvas_setusedastemplate(t_canvas *x);
++EXTERN t_canvas *canvas_getcurrent(void);
++EXTERN void canvas_setcurrent(t_canvas *x);
++EXTERN void canvas_unsetcurrent(t_canvas *x);
++EXTERN t_symbol *canvas_realizedollar(t_canvas *x, t_symbol *s);
++EXTERN t_canvas *canvas_getrootfor(t_canvas *x);
++EXTERN void canvas_dirty(t_canvas *x, t_floatarg n);
++EXTERN int canvas_getfont(t_canvas *x);
++typedef int (*t_canvasapply)(t_canvas *x, t_int x1, t_int x2, t_int x3);
++
++EXTERN t_int *canvas_recurapply(t_canvas *x, t_canvasapply *fn,
++ t_int x1, t_int x2, t_int x3);
++
++EXTERN void canvas_resortinlets(t_canvas *x);
++EXTERN void canvas_resortoutlets(t_canvas *x);
++EXTERN void canvas_free(t_canvas *x);
++EXTERN void canvas_updatewindowlist( void);
++EXTERN void canvas_editmode(t_canvas *x, t_floatarg yesplease);
++EXTERN int canvas_isabstraction(t_canvas *x);
++EXTERN int canvas_istable(t_canvas *x);
++EXTERN int canvas_showtext(t_canvas *x);
++EXTERN void canvas_vis(t_canvas *x, t_floatarg f);
++EXTERN t_canvasenvironment *canvas_getenv(t_canvas *x);
++EXTERN void canvas_rename(t_canvas *x, t_symbol *s, t_symbol *dir);
++EXTERN void canvas_loadbang(t_canvas *x);
++EXTERN int canvas_hitbox(t_canvas *x, t_gobj *y, int xpos, int ypos,
++ int *x1p, int *y1p, int *x2p, int *y2p);
++EXTERN int canvas_setdeleting(t_canvas *x, int flag);
++
++typedef void (*t_undofn)(t_canvas *canvas, void *buf,
++ int action); /* a function that does UNDO/REDO */
++#define UNDO_FREE 0 /* free current undo/redo buffer */
++#define UNDO_UNDO 1 /* undo */
++#define UNDO_REDO 2 /* redo */
++EXTERN void canvas_setundo(t_canvas *x, t_undofn undofn, void *buf,
++ const char *name);
++EXTERN void canvas_noundo(t_canvas *x);
++EXTERN int canvas_getindex(t_canvas *x, t_gobj *y);
++
++EXTERN void canvas_connect(t_canvas *x,
++ t_floatarg fwhoout, t_floatarg foutno,t_floatarg fwhoin, t_floatarg finno);
++EXTERN void canvas_disconnect(t_canvas *x,
++ t_float index1, t_float outno, t_float index2, t_float inno);
++EXTERN int canvas_isconnected (t_canvas *x,
++ t_text *ob1, int n1, t_text *ob2, int n2);
++EXTERN void canvas_selectinrect(t_canvas *x, int lox, int loy, int hix, int hiy);
++
++
++/* ---- functions on canvasses as objects --------------------- */
++
++EXTERN void canvas_fattenforscalars(t_canvas *x,
++ int *x1, int *y1, int *x2, int *y2);
++EXTERN void canvas_visforscalars(t_canvas *x, t_glist *glist, int vis);
++EXTERN int canvas_clicksub(t_canvas *x, int xpix, int ypix, int shift,
++ int alt, int dbl, int doit);
++EXTERN t_glist *canvas_getglistonsuper(void);
++
++EXTERN void linetraverser_start(t_linetraverser *t, t_canvas *x);
++EXTERN t_outconnect *linetraverser_next(t_linetraverser *t);
++EXTERN void linetraverser_skipobject(t_linetraverser *t);
++
++/* --------- functions on garrays (graphical arrays) -------------------- */
++
++EXTERN t_template *garray_template(t_garray *x);
++
++/* -------------------- arrays --------------------- */
++EXTERN t_garray *graph_array(t_glist *gl, t_symbol *s, t_symbol *tmpl,
++ t_floatarg f, t_floatarg saveit);
++EXTERN t_array *array_new(t_symbol *templatesym, t_gpointer *parent);
++EXTERN void array_resize(t_array *x, int n);
++EXTERN void array_free(t_array *x);
++
++/* --------------------- gpointers and stubs ---------------- */
++EXTERN t_gstub *gstub_new(t_glist *gl, t_array *a);
++EXTERN void gstub_cutoff(t_gstub *gs);
++EXTERN void gpointer_setglist(t_gpointer *gp, t_glist *glist, t_scalar *x);
++EXTERN void gpointer_setarray(t_gpointer *gp, t_array *array, t_word *w);
++
++/* --------------------- scalars ------------------------- */
++EXTERN void word_init(t_word *wp, t_template *tmpl, t_gpointer *gp);
++EXTERN void word_restore(t_word *wp, t_template *tmpl,
++ int argc, t_atom *argv);
++EXTERN t_scalar *scalar_new(t_glist *owner,
++ t_symbol *templatesym);
++EXTERN void word_free(t_word *wp, t_template *tmpl);
++EXTERN void scalar_getbasexy(t_scalar *x, t_float *basex, t_float *basey);
++EXTERN void scalar_redraw(t_scalar *x, t_glist *glist);
++
++/* ------helper routines for "garrays" and "plots" -------------- */
++EXTERN int array_doclick(t_array *array, t_glist *glist, t_scalar *sc, t_array *ap,
++ t_symbol *elemtemplatesym,
++ t_float linewidth, t_float xloc, t_float xinc, t_float yloc, t_float scalarvis,
++ t_fielddesc *xfield, t_fielddesc *yfield, t_fielddesc *wfield,
++ int xpix, int ypix, int shift, int alt, int dbl, int doit);
++
++EXTERN void array_getcoordinate(t_glist *glist,
++ char *elem, int xonset, int yonset, int wonset, int indx,
++ t_float basex, t_float basey, t_float xinc,
++ t_fielddesc *xfielddesc, t_fielddesc *yfielddesc, t_fielddesc *wfielddesc,
++ t_float *xp, t_float *yp, t_float *wp);
++
++EXTERN int array_getfields(t_symbol *elemtemplatesym,
++ t_canvas **elemtemplatecanvasp,
++ t_template **elemtemplatep, int *elemsizep,
++ t_fielddesc *xfielddesc, t_fielddesc *yfielddesc, t_fielddesc *wfielddesc,
++ int *xonsetp, int *yonsetp, int *wonsetp);
++
++/* --------------------- templates ------------------------- */
++EXTERN t_template *template_new(t_symbol *sym, int argc, t_atom *argv);
++EXTERN void template_free(t_template *x);
++EXTERN int template_match(t_template *x1, t_template *x2);
++EXTERN int template_find_field(t_template *x, t_symbol *name, int *p_onset,
++ int *p_type, t_symbol **p_arraytype);
++EXTERN t_float template_getfloat(t_template *x, t_symbol *fieldname, t_word *wp,
++ int loud);
++EXTERN void template_setfloat(t_template *x, t_symbol *fieldname, t_word *wp,
++ t_float f, int loud);
++EXTERN t_symbol *template_getsymbol(t_template *x, t_symbol *fieldname,
++ t_word *wp, int loud);
++EXTERN void template_setsymbol(t_template *x, t_symbol *fieldname,
++ t_word *wp, t_symbol *s, int loud);
++
++EXTERN t_template *gtemplate_get(t_gtemplate *x);
++EXTERN t_template *template_findbyname(t_symbol *s);
++EXTERN t_canvas *template_findcanvas(t_template *tmpl);
++EXTERN void template_notify(t_template *tmpl,
++ t_symbol *s, int argc, t_atom *argv);
++
++EXTERN t_float template_getfloat(t_template *x, t_symbol *fieldname,
++ t_word *wp, int loud);
++EXTERN void template_setfloat(t_template *x, t_symbol *fieldname,
++ t_word *wp, t_float f, int loud);
++EXTERN t_symbol *template_getsymbol(t_template *x, t_symbol *fieldname,
++ t_word *wp, int loud);
++EXTERN void template_setsymbol(t_template *x, t_symbol *fieldname,
++ t_word *wp, t_symbol *s, int loud);
++EXTERN t_float fielddesc_getcoord(t_fielddesc *f, t_template *tmpl,
++ t_word *wp, int loud);
++EXTERN void fielddesc_setcoord(t_fielddesc *f, t_template *tmpl,
++ t_word *wp, t_float pix, int loud);
++EXTERN t_float fielddesc_cvttocoord(t_fielddesc *f, t_float val);
++EXTERN t_float fielddesc_cvtfromcoord(t_fielddesc *f, t_float coord);
++
++
++/* ----------------------- guiconnects, g_guiconnect.c --------- */
++EXTERN t_guiconnect *guiconnect_new(t_pd *who, t_symbol *sym);
++EXTERN void guiconnect_notarget(t_guiconnect *x, double timedelay);
++
++/* ------------- IEMGUI routines used in other g_ files ---------------- */
++EXTERN t_symbol *iemgui_raute2dollar(t_symbol *s);
++EXTERN t_symbol *iemgui_dollar2raute(t_symbol *s);
++
++#if defined(_LANGUAGE_C_PLUS_PLUS) || defined(__cplusplus)
++}
++#endif
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..4985374
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1 @@
+add_required_internal_pd_headers
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..119936d
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,17 @@
+#!/usr/bin/make -f
+
+LIBRARY_NAME = vbap
+PACKAGE = pd-$(LIBRARY_NAME)
+pkglibdir = /usr/lib/pd/extra
+
+%:
+ dh --with quilt $@ --buildsystem=makefile
+
+override_dh_auto_install:
+ dh_auto_install -- prefix=/usr pkglibdir=$(pkglibdir)
+# replace license file with link to the Debian license file
+ rm -f -- $(CURDIR)/debian/$(PACKAGE)/$(pkglibdir)/$(LIBRARY_NAME)/LICENSE.txt
+
+override_dh_shlibdeps:
+ dpkg-shlibdeps $(CURDIR)/debian/$(PACKAGE)$(pkglibdir)/$(LIBRARY_NAME)/*.pd_linux \
+ -T$(CURDIR)/debian/$(PACKAGE).substvars
diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 0000000..163aaf8
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/debian/watch b/debian/watch
new file mode 100644
index 0000000..82c0d1a
--- /dev/null
+++ b/debian/watch
@@ -0,0 +1,2 @@
+version=3
+http://sf.net/pure-data/template-(.*)\.tar\.gz
diff --git a/define_loudspeakers.c b/define_loudspeakers.c
index 2ce8457..b2fd351 100644
--- a/define_loudspeakers.c
+++ b/define_loudspeakers.c
@@ -5,7 +5,7 @@ Helsinki University of Technology
and
Unversity of California at Berkeley
-See copyright in file with name COPYRIGHT */
+See copyright in file with name LICENSE.txt */
#include "define_loudspeakers.h"
diff --git a/define_loudspeakers.h b/define_loudspeakers.h
index 2b124cc..de5d0a9 100644
--- a/define_loudspeakers.h
+++ b/define_loudspeakers.h
@@ -5,7 +5,7 @@ Helsinki University of Technology
and
Unversity of California at Berkeley
-See copyright in file with name COPYRIGHT */
+See copyright in file with name LICENSE.txt */
#include "vbap.h"
diff --git a/graph-to-aziele.pd b/examples/graph-to-aziele.pd
index 0597f8a..0597f8a 100644
--- a/graph-to-aziele.pd
+++ b/examples/graph-to-aziele.pd
diff --git a/high.pd b/examples/high.pd
index f6bbfba..f6bbfba 100644
--- a/high.pd
+++ b/examples/high.pd
diff --git a/playsample~.pd b/examples/playsample~.pd
index bf2b06e..bf2b06e 100644
--- a/playsample~.pd
+++ b/examples/playsample~.pd
diff --git a/recent.pd b/examples/recent.pd
index add6c7d..add6c7d 100644
--- a/recent.pd
+++ b/examples/recent.pd
diff --git a/vbap-demo.pd b/examples/vbap-demo.pd
index 27095db..27095db 100644
--- a/vbap-demo.pd
+++ b/examples/vbap-demo.pd
diff --git a/examples/vbap-level-config.pd b/examples/vbap-level-config.pd
new file mode 100644
index 0000000..3448c19
--- /dev/null
+++ b/examples/vbap-level-config.pd
@@ -0,0 +1,23 @@
+#N canvas 334 22 636 372 10;
+#X obj 19 100 noise~;
+#X obj 19 153 *~ 0.01;
+#X obj 61 128 hsl 128 15 0.01 1 1 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X floatatom 71 149 5 0 0 0 - - -;
+#X obj 19 183 cyclone/reson~ 1 1000 20;
+#X obj 18 269 dac~ 1 2 3 4 5 6 7 8;
+#X text 217 131 B. Measure loudspeaker distances. Delay all loudspeakers
+to mimic the distance between listener and farthest loudspeaker. The
+amount of delay can be calculated as t = ((d - x) / 330) * 1000 \,
+where d is the distance in metres between listener and one particular
+loudspeaker \, and t is the amount of delay in milliseconds. Apply
+the delay to function function ls-delays to corresponding channel.
+;
+#X text 217 80 A. Adjust gain each speaker's channel same level sweet
+spot using this file. You use a sound pressure meter or your ears.
+;
+#X text 265 287 based on an example by Ville Pulkki 1999-2006;
+#X connect 0 0 1 0;
+#X connect 1 0 4 0;
+#X connect 2 0 1 1;
+#X connect 2 0 3 0;
diff --git a/vbapmodule.pd b/examples/vbapmodule.pd
index 01484a8..01484a8 100644
--- a/vbapmodule.pd
+++ b/examples/vbapmodule.pd
diff --git a/rvbap.c b/rvbap.c
index 9b023c3..75604b9 100644
--- a/rvbap.c
+++ b/rvbap.c
@@ -7,7 +7,7 @@ Unversity of California at Berkeley
and written by Olaf Matthes 2003, 2007
Pd port by Frank Barknecht
-See copyright in file with name COPYRIGHT */
+See copyright in file with name LICENSE.txt */
#include <math.h>
diff --git a/vbap-help.pd b/vbap-help.pd
index deefca7..18aa9d5 100644
--- a/vbap-help.pd
+++ b/vbap-help.pd
@@ -124,7 +124,6 @@ front). This is a classic 5.1 setup.;
#X text 257 199 (0-360);
#X text 21 490 Vector Base Amplitude Panning;
#X text 241 489 (C) 1998-2003 \, 2006 Ville Pulkki;
-#X text 476 487 1.0.3 - 11 Mar 2006;
#X connect 0 0 25 1;
#X connect 1 0 25 2;
#X connect 2 0 25 0;
diff --git a/vbap-meta.pd b/vbap-meta.pd
new file mode 100644
index 0000000..59b255b
--- /dev/null
+++ b/vbap-meta.pd
@@ -0,0 +1,7 @@
+#N canvas 10 10 200 200 10;
+#N canvas 20 20 420 300 META 0;
+#X text 10 30 NAME vbap;
+#X text 10 50 AUTHOR Ville Pulkki;
+#X text 10 70 DESCRIPTION spatialization using Vector Based Amplitude Panning;
+#X text 10 90 VERSION 1.0.3.1;
+#X restore 10 10 pd META;
diff --git a/vbap.c b/vbap.c
index 7cf4a64..3bf09fd 100644
--- a/vbap.c
+++ b/vbap.c
@@ -1,11 +1,11 @@
-/* vbap.c vers 1.00b1 for ------ > xmax4.2
+/* vbap.c
written by Ville Pulkki 1999-2003
Helsinki University of Technology
and
University of California at Berkeley
-See copyright in file with name COPYRIGHT */
+See copyright in file with name LICENSE.txt */
// Indicate that we are within VBAP object (specific to include define_loudspeakers content within vbap)
#define VBAP_OBJECT
diff --git a/vbap.h b/vbap.h
index 3da2157..dd588ac 100644
--- a/vbap.h
+++ b/vbap.h
@@ -14,8 +14,8 @@
#define MAX_LS_AMOUNT 55 // maximum amount of loudspeakers, can be increased
#define MIN_VOL_P_SIDE_LGTH 0.01
-#define VBAP_VERSION "vbap - v1.0.3 - 12 Aug 2006 - (c) Ville Pulkki 1999-2006 (Pd port by HCS)"
-#define DFLS_VERSION "define_loudspeakers - v1.0.3 - 12 Aug 2006 - (c) Ville Pulkki 1999-2006"
+#define VBAP_VERSION "vbap - v1.0.3.1 - 20 Nov 2010 - (c) Ville Pulkki 1999-2006 (Pd port by HCS)"
+#define DFLS_VERSION "define_loudspeakers - v1.0.3.1 - 20 Nov 2010 - (c) Ville Pulkki 1999-2006"
static float rad2ang = 360.0 / ( 2.0f * M_PI );
static float atorad = (2.0f * M_PI) / 360.0f ;