Merge branch 'master' of git://git.lumiera.org/LUMIERA into gui

This commit is contained in:
Joel Holdsworth 2008-11-15 23:37:21 +00:00
commit 7b52ff247e
117 changed files with 4969 additions and 927 deletions

View file

@ -19,11 +19,13 @@
ACLOCAL_AMFLAGS = -I m4
bin_PROGRAMS =
lib_LTLIBRARIES =
noinst_PROGRAMS =
check_PROGRAMS =
noinst_LIBRARIES =
lib_LTLIBRARIES =
check_LTLIBRARIES =
pkglib_LTLIBRARIES =
noinst_LTLIBRARIES =
noinst_HEADERS =
BUILT_SOURCES =
EXTRA_DIST =

View file

@ -63,6 +63,7 @@ def setupBasicEnvironment():
,toolpath = [TOOLDIR]
,tools = ["default", "BuilderGCH", "BuilderDoxygen"]
)
handleVerboseMessages(env)
env.Append ( CCCOM=' -std=gnu99') # workaround for a bug: CCCOM currently doesn't honor CFLAGS, only CCFLAGS
env.Replace( VERSION=VERSION
@ -73,16 +74,19 @@ def setupBasicEnvironment():
, CPPDEFINES=['-DLUMIERA_VERSION='+VERSION ] # note: it's a list to append further defines
, CCFLAGS='-Wall ' # -fdiagnostics-show-option
)
RegisterIcon_Builder(env,SVGRENDERER)
handleNoBugSwitches(env)
env.Append(CPPDEFINES = '_GNU_SOURCE')
appendCppDefine(env,'DEBUG','DEBUG', 'NDEBUG')
# appendCppDefine(env,'OPENGL','USE_OPENGL')
appendVal(env,'ARCHFLAGS', 'CCFLAGS') # for both C and C++
appendVal(env,'OPTIMIZE', 'CCFLAGS', val=' -O3')
appendVal(env,'DEBUG', 'CCFLAGS', val=' -ggdb')
appendVal(env,'ARCHFLAGS','CCFLAGS') # for both C and C++
appendVal(env,'OPTIMIZE', 'CCFLAGS', val=' -O3')
appendVal(env,'DEBUG', 'CCFLAGS', val=' -ggdb')
# setup search path for Lumiera plugins
appendCppDefine(env,'PKGLIBDIR','LUMIERA_PLUGIN_PATH=\\"$PKGLIBDIR\\"'
,'LUMIERA_PLUGIN_PATH=\\"$DESTDIR/lib/lumiera\\"')
prepareOptionsHelp(opts,env)
opts.Save(OPTIONSCACHEFILE, env)
@ -90,19 +94,19 @@ def setupBasicEnvironment():
def appendCppDefine(env,var,cppVar, elseVal=''):
if env[var]:
env.Append(CPPDEFINES = cppVar )
env.Append(CPPDEFINES = env.subst(cppVar) )
elif elseVal:
env.Append(CPPDEFINES = elseVal)
env.Append(CPPDEFINES = env.subst(elseVal))
def appendVal(env,var,targetVar,val=None):
if env[var]:
env.Append( **{targetVar: val or env[var]})
env.Append( **{targetVar: env.subst(val) or env[var]})
def handleNoBugSwitches(env):
""" set the build level for NoBug.
Release builds imply no DEBUG
wheras ALPHA and BETA require DEBUG
whereas ALPHA and BETA require DEBUG
"""
level = env['BUILDLEVEL']
if level in ['ALPHA', 'BETA']:
@ -113,6 +117,15 @@ def handleNoBugSwitches(env):
elif level == 'RELEASE':
env.Replace( DEBUG = 0 )
def handleVerboseMessages(env):
""" toggle verbose build output """
if not env['VERBOSE']:
# SetOption('silent', True)
env['CCCOMSTR'] = " Compiling $SOURCE"
env['CXXCOMSTR'] = " Compiling++ $SOURCE"
env['LINKCOMSTR'] = " Linking --> $TARGET"
env['LDMODULECOMSTR'] = " creating module [ $TARGET ]"
@ -128,10 +141,14 @@ def defineCmdlineOptions():
allowed_values=('ALPHA', 'BETA', 'RELEASE'))
,BoolOption('DEBUG', 'Build with debugging information and no optimizations', False)
,BoolOption('OPTIMIZE', 'Build with strong optimization (-O3)', False)
,BoolOption('VALGRIND', 'Run Testsuite under valgrind control', True)
,BoolOption('VERBOSE', 'Print full build commands', False)
,('TESTSUITES', 'Run only Testsuites matching the given pattern', '')
# ,BoolOption('OPENGL', 'Include support for OpenGL preview rendering', False)
# ,EnumOption('DIST_TARGET', 'Build target architecture', 'auto',
# allowed_values=('auto', 'i386', 'i686', 'x86_64' ), ignorecase=2)
,PathOption('DESTDIR', 'Installation dir prefix', '/usr/local')
,PathOption('PKGLIBDIR', 'Installation dir for plugins, defaults to DESTDIR/lib/lumiera', '',PathOption.PathAccept)
,PathOption('SRCTAR', 'Create source tarball prior to compiling', '..', PathOption.PathAccept)
,PathOption('DOCTAR', 'Create tarball with dev documentaionl', '..', PathOption.PathAccept)
)
@ -151,7 +168,7 @@ Special Targets:
build : just compile and link
testcode: additionally compile the Testsuite
check : build and run the Testsuite
doc : generate documetation (Doxygen)
doc : generate documentation (Doxygen)
install : install created artifacts at PREFIX
src.tar : create source tarball
doc.tar : create developer doc tarball
@ -213,7 +230,6 @@ def configurePlatform(env):
if not conf.CheckLibWithHeader('boost_regex-mt','boost/regex.hpp','C++'):
problems.append('We need the boost regular expression lib (incl. binary lib for linking).')
# if not conf.CheckLibWithHeader('gavl', ['gavlconfig.h', 'gavl/gavl.h'], 'C'):
if not conf.CheckPkgConfig('gavl', 1.0):
problems.append('Did not find Gmerlin Audio Video Lib [http://gmerlin.sourceforge.net/gavl.html].')
@ -230,13 +246,16 @@ def configurePlatform(env):
problems.append('Unable to configure Cairo--, exiting.')
if not conf.CheckPkgConfig('gdl-1.0', '0.6.1'):
problems.append('Unable to configure the GNOME DevTool Library, exiting.')
problems.append('Unable to configure the GNOME DevTool Library.')
if not conf.CheckPkgConfig('librsvg-2.0', '2.18.1'):
problems.append('Need rsvg Library for rendering icons.')
if not conf.CheckPkgConfig('xv'): problems.append('Need lib xv')
# if not conf.CheckPkgConfig('xext'): Exit(1)
if not conf.CheckCHeader(['X11/Xutil.h', 'X11/Xlib.h'],'<>'):
problems.append('Xlib.h and Xutil.h required. Please install libx11-dev.')
if not conf.CheckPkgConfig('xv') : problems.append('Need libXv...')
if not conf.CheckPkgConfig('xext'): problems.append('Need libXext.')
# if not conf.CheckPkgConfig('sm'): Exit(1)
#
# obviously not needed?
@ -298,7 +317,7 @@ def defineBuildTargets(env, artifacts):
artifacts['lumiera'] = env.Program('$BINDIR/lumiera', ['$SRCDIR/main.cpp']+ core )
artifacts['plugins'] = env.SharedLibrary('$BINDIR/lumiera-plugin', objplug)
artifacts['plugins'] = env.LoadableModule('$BINDIR/lumiera-plugin', objplug)
# the Lumiera GTK GUI
envgtk = env.Clone().mergeConf(['gtkmm-2.4','cairomm-1.0','gdl-1.0','librsvg-2.0','xv','xext','sm'])

View file

@ -24,5 +24,5 @@ vgsuppression_LDADD = liblumiera.a $(NOBUGMT_LUMIERA_LIBS) -ldl
noinst_PROGRAMS += rsvg-convert
rsvg_convert_SOURCES = $(admin_srcdir)/rsvg-convert.c
rsvg_convert_CPPFLAGS = $(AM_CPPFLAGS) $(GTK_LUMIERA_CFLAGS) -std=gnu99 -Wall -Werror
rsvg_convert_CPPFLAGS = $(AM_CPPFLAGS) $(LUMIERA_GUI_CFLAGS) -std=gnu99 -Wall -Werror
rsvg_convert_LDADD = -lcairo -lglib-2.0 -lgthread-2.0 -lrsvg-2

View file

@ -8,7 +8,7 @@ Import('env','envgtk','artifacts','core')
vgsuppr = env.Program('#$BINDIR/vgsuppression',['vgsuppression.c']+core)
rsvg = envgtk.Program('#$BINDIR/rsvg-convert','rsvg-convert.c')
artifacts['tools'] += [ vgsuppr ## for supressing false valgrind alarms
artifacts['tools'] += [ vgsuppr ## for suppressing false valgrind alarms
+ rsvg ## for rendering SVG icons (uses librsvg)
]

View file

@ -1,5 +1,5 @@
#!/usr/bin/python
#
# render-icons.py - Icon rendering utility script
#
# Copyright (C) Lumiera.org
@ -20,9 +20,10 @@
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
import sys
import os
import os.path as Path
import getopt
from xml.dom import minidom
import os
import shutil
#svgDir = "svg"
@ -32,14 +33,20 @@ rsvgPath = "./rsvg-convert"
artworkLayerPrefix = "artwork:"
def createDirectory( name ):
if os.path.exists(name) == False:
if Path.isfile(name):
print "WARNING: moving %s to %s.bak because it's in the way." % (name,name)
bak_name = name + ".bak"
if Path.isfile(bak_name):
os.remove(bak_name)
os.rename(name,bak_name)
if not Path.isdir(name):
os.mkdir(name)
def copyMergeDirectory( src, dst ):
listing = os.listdir(src)
for file_name in listing:
src_file_path = os.path.join(src, file_name)
dst_file_path = os.path.join(dst, file_name)
src_file_path = Path.join(src, file_name)
dst_file_path = Path.join(dst, file_name)
shutil.copyfile(src_file_path, dst_file_path)
def getDocumentSize( svg_element ):
@ -99,7 +106,7 @@ def renderSvgInkscape(file_path, out_dir, artwork_name, rectangle, doc_size):
"-a %g:%g:%g:%g" % (x1, y1, x2, y2),
"-w %g" % (rectangle[2]), "-h %g" % (rectangle[3]),
"--export-png=" + os.path.join(out_dir, "%gx%g/%s.png" % (rectangle[2], rectangle[3], artwork_name)))
def renderSvgRsvg(file_path, out_dir, artwork_name, rectangle, doc_size):
# Prepare a Cairo context
width = int(rectangle[2])
@ -154,19 +161,23 @@ def parseArguments(argv):
def main(argv):
in_path, out_dir = parseArguments(argv)
if in_path == None or out_dir == None:
return
if not (in_path and out_dir):
print "Missing arguments in_path and out_dir."
sys.exit(1)
if os.path.exists(out_dir) == False:
print "Directory not found: " + out_dir
return
if Path.isfile(out_dir):
print "Unable to use '%s' as output directory, because it\'s a file." % out_dir
sys.exit(1)
if not Path.isdir(out_dir):
print "Output directory '%s' not found." % out_dir
sys.exit(1)
# Create the icons folders
createDirectory(os.path.join(out_dir, "48x48"))
createDirectory(os.path.join(out_dir, "32x32"))
createDirectory(os.path.join(out_dir, "24x24"))
createDirectory(os.path.join(out_dir, "22x22"))
createDirectory(os.path.join(out_dir, "16x16"))
createDirectory(Path.join(out_dir, "48x48"))
createDirectory(Path.join(out_dir, "32x32"))
createDirectory(Path.join(out_dir, "24x24"))
createDirectory(Path.join(out_dir, "22x22"))
createDirectory(Path.join(out_dir, "16x16"))
renderSvgIcon(in_path, out_dir)

View file

@ -24,7 +24,11 @@ AC_COPYRIGHT([
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
])
#
# Global configuration
#
AC_GNU_SOURCE
AC_DISABLE_STATIC
#
# Required programs
@ -83,6 +87,10 @@ AC_LANG_PUSH([C])
AC_CHECK_HEADER([execinfo.h], AC_DEFINE(HAVE_EXECINFO_H))
# there is a warning in nobug, disabled til fixed AC_CHECK_HEADER([valgrind/valgrind.h], AC_DEFINE(HAVE_VALGRIND_VALGRIND_H))
AC_CHECK_LIB(dl, dlopen, [LUMIERA_PLUGIN_LIBS="$LUMIERA_PLUGIN_LIBS -ldl"],
[AC_MSG_ERROR([Dynamic linking not supported, report a bug])]
)
AC_LANG_POP([C])
@ -124,15 +132,19 @@ AC_LANG_POP([C++])
# END Internatinalization
############## Gtk Dependancies
PKG_CHECK_MODULES(LUMIERA_GUI, [
gtkmm-2.4 >= 2.8 gdl-1.0 >= 0.6.1 cairomm-1.0 >= 0.6.0
gavl >= 0.2.5 librsvg-2.0 >= 2.18.1])
# END Gtk Dependancies
############## X11 Dependancies
AC_PATH_X
AC_PATH_XTRA
# CFLAGS="$CFLAGS $X_CFLAGS"
LIBS="$LIBS $X_PRE_LIBS $X_LIBS $X_EXTRA_LIBS"
AC_CHECK_HEADERS([X11/Xlib.h X11/Xutil.h],[],
[AC_MSG_ERROR([Xlib.h or Xutil.h not found install xdevel])])
[AC_MSG_ERROR([Xlib.h or Xutil.h not found install xdevel])])
AC_CHECK_HEADERS([sys/ipc.h sys/shm.h],,
[AC_MSG_ERROR([Required header not found. Please check that it is installed])]
@ -142,25 +154,19 @@ AC_CHECK_HEADERS([X11/extensions/Xvlib.h X11/extensions/XShm.h],,
[#include <X11/Xlib.h>]
)
AC_CHECK_LIB(Xext, XInitExtension, ,
[AC_MSG_ERROR([Could not link with libXext. Check that you have libXext installed])], -lX11
AC_CHECK_LIB(Xext, XInitExtension, [LUMIERA_GUI_LIBS="$LUMIERA_GUI_LIBS -lXext"],
[AC_MSG_ERROR([Could not link with libXext. Check that you have libXext installed])], -lX11
)
AC_CHECK_LIB(Xv, XvQueryAdaptors, ,
[AC_MSG_ERROR([Could not link with libXv. Check that you have libXv installed])]
AC_CHECK_LIB(Xv, XvQueryAdaptors, [LUMIERA_GUI_LIBS="$LUMIERA_GUI_LIBS -lXv"],
[AC_MSG_ERROR([Could not link with libXv. Check that you have libXv installed])]
)
# END X11 Dependancies
############## Gtk Dependancies
PKG_CHECK_MODULES(GTK_LUMIERA, [
gtkmm-2.4 >= 2.8 gdl-1.0 >= 0.6.1 cairomm-1.0 >= 0.6.0
gavl >= 0.2.5 librsvg-2.0 >= 2.18.1])
AC_SUBST(GTK_LUMIERA_CFLAGS)
AC_SUBST(GTK_LUMIERA_LIBS)
# END Gtk Dependancies
AC_SUBST(LUMIERA_PLUGIN_LIBS)
AC_SUBST(LUMIERA_GUI_CFLAGS)
AC_SUBST(LUMIERA_GUI_LIBS)
############## Nobug Dependancies

View file

@ -0,0 +1,80 @@
The incomplete Guide to Lumiera Configuration
==============================================
DONT EDIT THE CONFIG IF YOU DONT KNOW WHAT YOU ARE DOING!
Misconfiguration will break Lumiera and may destroy all your data!
Order is roughly alphabetically, depending on the mood of the writer.
Defaults are noted if present. Not all are implemented yet.
General Introduction
--------------------
Lumiera uses plaintext files with a INI file like syntax for
configuration. This Syntax is strictly line based. There are only a
few syntactic elements.
TODO:describe config syntax here
Config Subsystem
----------------
The path where Lumiera searches its configuration. Single components are
separated by colons as in PATH and other such environment variables.
Here it might be handy that any Lumiera configuration can be
overridden by a environment variable:
'LUMIERA_CONFIG_PATH=somewhere:else lumiera ...'
A default are initialized at installation time, this is important to
bootstrap the whole configuration system.
config.path
The config system check for a preferred format when writing config
entries. For each key 'foo.bar', these can be overridden with a key
'config.format.foo.bar' linking to the desired format.
config.formatkey ='config.format.%s'
The following are links to the default formatting when no explicit
format is set for a key. Changing these to a wrong type will break the
system!
config.formatdef.link < config.formatstr.link
config.formatdef.number < config.formatstr.number.dec
config.formatdef.real < config.formatstr.real
config.formatdef.string < config.formatstr.string
config.formatdef.word < config.formatstr.word
config.formatdef.bool < config.formatstr.bool
This are the low level formating specifications for the buildin
types, DONT TOUCH THESE!
config.formatstr.link = '< %s'
config.formatstr.number.dec = '= %lld'
config.formatstr.number.hex = '= 0x%llX'
config.formatstr.number.oct = '= 0%llo'
config.formatstr.real = '= %Lg'
config.formatstr.real.dec = '= %Lf'
config.formatstr.real.sci = '= %Le'
config.formatstr.string = '= %s'
config.formatstr.string.dquoted = '= \"%s\"'
config.formatstr.string.quoted = '= ''%s'''
config.formatstr.word = '= %s'
config.formatstr.bool = '= %d'
Plugin System
-------------
The path where Lumiera searches its plugins. Single components are
separated by colons as in PATH and other such environment variables.
Here it might be handy that any Lumiera configuration can be
overridden by a environment variable:
'LUMIERA_PLUGIN_PATH=somewhere:else lumiera ...'
Sensible defaults are initialized at installation time.
plugin.path

View file

@ -0,0 +1,363 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://web.resource.org/cc/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="800"
height="600"
id="svg2"
sodipodi:version="0.32"
inkscape:version="0.45.1"
sodipodi:docbase="/mnt/Lager/heim/devel/lumi/doc/devel/draw"
sodipodi:docname="AllocationCluster.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.0">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8284271"
inkscape:cx="311.29718"
inkscape:cy="408.68554"
inkscape:document-units="px"
inkscape:current-layer="svg2"
inkscape:window-width="1485"
inkscape:window-height="1013"
inkscape:window-x="91"
inkscape:window-y="0"
width="800px"
height="600px"
showgrid="true"
gridspacingx="2px"
gridspacingy="2px"
gridanglex="30px"
gridanglez="30px"
grid_units="px"
inkscape:grid-points="true"
inkscape:grid-bbox="false"
gridcolor="#4b4bf4"
gridopacity="0.09019608"
showguides="true"
inkscape:object-paths="false"
inkscape:object-nodes="true"
gridtolerance="10000"
inkscape:guide-points="true"
guidetolerance="5" />
<defs
id="globals">
<marker
style="overflow:visible"
orient="auto"
id="ArrowHIV1end"
refY="0"
inkscape:stockid="ArrowHIV1end"
refX="0">
<path
style="fill:#40c0ab;stroke:#01ffff;stroke-width:0.1;stroke-linecap:butt;stroke-miterlimit:6.5"
d="M -8,0 L -10,1.2 L -2,1.2 L 5,0 L -2,-1.2 L -10,-1.2 L -8,0 z "
sodipodi:nodetypes="ccccccc"
id="pathPfeil1" />
</marker>
</defs>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/2.5/" />
<dc:title>AllocationCluster</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Ichthyostega</dc:title>
</cc:Agent>
</dc:creator>
<dc:description>design sketch: Structure of the AllocationCluster mem manager</dc:description>
<dc:date>2008</dc:date>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/2.5/">
<cc:permits
rdf:resource="http://web.resource.org/cc/Reproduction" />
<cc:permits
rdf:resource="http://web.resource.org/cc/Distribution" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Notice" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Attribution" />
<cc:permits
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
<cc:requires
rdf:resource="http://web.resource.org/cc/ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Drawing"
id="lay1"
inkscape:groupmode="layer" />
<rect
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#6c6c6c;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect3207"
width="79.864258"
height="160.22624"
x="70"
y="70"
ry="0" />
<rect
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect4184"
width="80"
height="20"
x="70"
y="110" />
<rect
y="130"
x="70"
height="20"
width="80"
id="rect4186"
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect4188"
width="80"
height="20"
x="70"
y="150" />
<rect
y="170"
x="70"
height="20"
width="80"
id="rect4190"
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect4192"
width="80"
height="20"
x="70"
y="190" />
<rect
y="210"
x="70"
height="20"
width="80"
id="rect4194"
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#6c6c6c;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect4196"
width="130.09683"
height="80"
x="190.12445"
y="130" />
<rect
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect4198"
width="50"
height="60"
x="250"
y="150" />
<rect
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect4200"
width="70.193398"
height="50.126747"
x="350.00003"
y="160" />
<rect
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#6c6c6c;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect4202"
width="70"
height="150"
x="440"
y="160" />
<rect
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect4204"
width="70"
height="40"
x="440"
y="160" />
<rect
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect4206"
width="50"
height="20"
x="250"
y="150" />
<rect
y="170"
x="250"
height="20"
width="50"
id="rect4208"
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect4210"
width="50"
height="20"
x="250"
y="190" />
<rect
y="200"
x="440"
height="40"
width="70"
id="rect4212"
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect4214"
width="70"
height="40"
x="440"
y="240" />
<text
xml:space="preserve"
style="font-size:14px;font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans"
x="254"
y="160.5"
id="text4216"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan4218"
x="254"
y="160.5"
style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans">Type&lt;T1&gt;</tspan></text>
<text
sodipodi:linespacing="100%"
id="text4220"
y="180.5"
x="254"
style="font-size:14px;font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans"
xml:space="preserve"><tspan
style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans"
y="180.5"
x="254"
id="tspan4222"
sodipodi:role="line">Type&lt;T2&gt;</tspan></text>
<text
xml:space="preserve"
style="font-size:14px;font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans"
x="254"
y="200.5"
id="text4224"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan4226"
x="254"
y="200.5"
style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans">Type&lt;T3&gt;</tspan></text>
<text
xml:space="preserve"
style="font-size:14px;font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;opacity:1;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans"
x="75.5"
y="86.5"
id="text4231"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan4233"
x="75.5"
y="86.5">Segments</tspan></text>
<text
xml:space="preserve"
style="font-size:14px;font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;opacity:1;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;text-indent:0;text-decoration:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb"
x="193.62445"
y="143.5"
id="text4235"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan4237"
x="193.62445"
y="143.5">AllocationCluster</tspan></text>
<text
xml:space="preserve"
style="font-size:14px;font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;opacity:1;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;text-indent:0;text-decoration:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb"
x="354"
y="175.5"
id="text4239"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan4241"
x="354"
y="175.5">mem</tspan><tspan
sodipodi:role="line"
x="354"
y="189.5"
id="tspan4243">Manager</tspan><tspan
sodipodi:role="line"
x="354"
y="203.5"
id="tspan4253">&lt;T2&gt;</tspan></text>
<text
xml:space="preserve"
style="font-size:14px;font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans"
x="434.06497"
y="148"
id="text4245"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan4247"
x="434.06497"
y="148">raw storage</tspan></text>
<text
sodipodi:linespacing="100%"
id="text4249"
y="180"
x="449.5"
style="font-size:14px;font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans"
xml:space="preserve"><tspan
style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans"
y="180"
x="449.5"
id="tspan4251"
sodipodi:role="line">Obj1</tspan></text>
<text
xml:space="preserve"
style="font-size:14px;font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans"
x="450"
y="220"
id="text4255"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan4257"
x="450"
y="220"
style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans">Obj2</tspan></text>
<text
sodipodi:linespacing="100%"
id="text4259"
y="260"
x="450"
style="font-size:14px;font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans"
xml:space="preserve"><tspan
style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans"
y="260"
x="450"
id="tspan4261"
sodipodi:role="line">Obj3</tspan></text>
<path
style="fill:#55cbb9;fill-opacity:1;fill-rule:evenodd;stroke:#55cbb9;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#ArrowHIV1end)"
d="M 110,140 L 200,160 L 200,160"
id="path4263" />
<path
id="path5240"
d="M 290,184.5 L 350,170"
style="fill:#55cbb9;fill-opacity:1;fill-rule:evenodd;stroke:#55cbb9;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#ArrowHIV1end);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
sodipodi:nodetypes="cc" />
</svg>

After

Width:  |  Height:  |  Size: 22 KiB

View file

@ -18,7 +18,7 @@
<a name="refclass128005"></a>
<p>Declaration :</p><ul><li>C++ : class SessionImpl : public <a href="class139653.html#refclass139653"><b>Session</b></a> </li></ul><p>Implementation class for the Session interface<br /></p><p>Artifact : <a href="index.html#refartifact128517"><b>sessionimpl</b></a>, Component(s) : <a href="index.html#refcomponent128133"><b>Session</b></a></p><div class="sub">
<a name="refrelation128005"></a>
<table><tr><td><div class="element">Relation <b>edls (&lt;directional aggregation by value&gt;)</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # edls : <a href="class128133.html#refclass128133"><b>EDL</b></a>, multiplicity : 1..*</li><li>C++ : protected: &lt;<a href="class128133.html#refclass128133"><b>EDL</b></a>&gt; edls</li></ul><a name="refrelation128261"></a>
<table><tr><td><div class="element">Relation <b>edls (&lt;directional aggregation by value&gt;)</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # edls : <a href="class128133.html#refclass128133"><b>Seq</b></a>, multiplicity : 1..*</li><li>C++ : protected: &lt;<a href="class128133.html#refclass128133"><b>Seq</b></a>&gt; edls</li></ul><a name="refrelation128261"></a>
<table><tr><td><div class="element">Relation <b>theFixture (&lt;unidirectional association&gt;)</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # theFixture : <a href="class128261.html#refclass128261"><b>Fixture</b></a>, multiplicity : 1</li><li>C++ : protected: <a href="class128261.html#refclass128261"><b>Fixture</b></a> * theFixture</li></ul><a name="refrelation147717"></a>
<table><tr><td><div class="element">Relation <b>pipes (&lt;directional aggregation&gt;)</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # pipes : <a href="class138117.html#refclass138117"><b>Pipe</b></a>, multiplicity : *</li><li>C++ : protected: <a href="class138117.html#refclass138117"><b>Pipe</b></a>* pipes</li></ul><p>the global ports (busses) of the session<br /></p></div>
<p>All public operations : <a href="class139653.html#refoperation133509"><b>currEDL</b></a> , <a href="class139653.html#refoperation133637"><b>getFixture</b></a> </p>

View file

@ -4,19 +4,19 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Class EDL</title>
<title>Class Seq</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body bgcolor="#ffffff">
<div class = "title">Class EDL</div>
<div class = "title">Class Seq</div>
<p></p>
<!-- ============================================================= -->
<a name="refclass128133"></a>
<p>Declaration :</p><ul><li>C++ : class EDL </li></ul><p>Directly inherited by : <a href="class128261.html#refclass128261"><b>Fixture</b></a> </p>
<p>Declaration :</p><ul><li>C++ : class Seq </li></ul><p>Directly inherited by : <a href="class128261.html#refclass128261"><b>Fixture</b></a> </p>
<p>Artifact : <a href="index.html#refartifact128645"><b>edl</b></a>, Component(s) : <a href="index.html#refcomponent128133"><b>Session</b></a></p><div class="sub">
<a name="refrelation128901"></a>
<table><tr><td><div class="element">Relation <b>clips (&lt;directional aggregation&gt;)</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # clips : <a href="class128517.html#refclass128517"><b>MObject</b></a>, multiplicity : *</li><li>C++ : protected: list&lt;<a href="class128517.html#refclass128517"><b>MObject</b></a> *&gt; clips</li></ul><a name="refrelation147333"></a>

View file

@ -16,9 +16,9 @@
<!-- ============================================================= -->
<a name="refclass128261"></a>
<p>Declaration :</p><ul><li>C++ : class Fixture : public <a href="class128133.html#refclass128133"><b>EDL</b></a> </li></ul><p>Artifact : <a href="index.html#refartifact128773"><b>fixture</b></a>, Component(s) : <a href="index.html#refcomponent128133"><b>Session</b></a></p><div class="sub">
<p>Declaration :</p><ul><li>C++ : class Fixture : public <a href="class128133.html#refclass128133"><b>Seq</b></a> </li></ul><p>Artifact : <a href="index.html#refartifact128773"><b>fixture</b></a>, Component(s) : <a href="index.html#refcomponent128133"><b>Session</b></a></p><div class="sub">
<a name="refrelation131717"></a>
<table><tr><td><div class="element">Relation <b>theTimeline (&lt;directional aggregation by value&gt;)</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # theTimeline : <a href="class129797.html#refclass129797"><b>ExplicitPlacement</b></a>, multiplicity : *</li><li>C++ : protected: <a href="class129797.html#refclass129797"><b>ExplicitPlacement</b></a> theTimeline</li></ul><a name="refoperation128645"></a>
<table><tr><td><div class="element">Relation <b>effectiveTimeline (&lt;directional aggregation by value&gt;)</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # effectiveTimeline : <a href="class129797.html#refclass129797"><b>ExplicitPlacement</b></a>, multiplicity : *</li><li>C++ : protected: <a href="class129797.html#refclass129797"><b>ExplicitPlacement</b></a> effectiveTimeline</li></ul><a name="refoperation128645"></a>
<table><tr><td><div class="element">Operation <b>getPlaylistForRender</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : + getPlaylistForRender() : list&lt;ExplicitPlacement [ProcessingLayer::MObject]&gt;</li><li>C++ : public: list&lt;ExplicitPlacement [ProcessingLayer::MObject]&gt; getPlaylistForRender () </li></ul><a name="refoperation129157"></a>
<table><tr><td><div class="element">Operation <b>getAutomation</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : + getAutomation() : Auto [ProcessingLayer::MObject]*</li><li>C++ : public: Auto [ProcessingLayer::MObject]* getAutomation () </li></ul><a name="refrelation147589"></a>
<table><tr><td><div class="element">Relation <b>track (&lt;unidirectional association&gt;)</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # track : <a href="class128389.html#refclass128389"><b>Track</b></a></li><li>C++ : protected: <a href="class128389.html#refclass128389"><b>Track</b></a>* track</li></ul></div>

View file

@ -16,7 +16,7 @@
<!-- ============================================================= -->
<a name="refclass128389"></a>
<p>Declaration :</p><ul><li>C++ : class Track : public <a href="class129157.html#refclass129157"><b>Meta</b></a> </li></ul><p>Artifact : <a href="index.html#refartifact128901"><b>track</b></a>, Diagram : <a href="index.html#refclass diagram128133"><b>Session structure</b></a></p><div class="sub">
<p>Declaration :</p><ul><li>C++ : class Track : public <a href="class129157.html#refclass129157"><b>Meta</b></a>, public <a href="class128517.html#refclass128517"><b>MObject</b></a> </li></ul><p>Artifact : <a href="index.html#refartifact128901"><b>track</b></a>, Diagram : <a href="index.html#refclass diagram128133"><b>Session structure</b></a></p><div class="sub">
<a name="refrelation147205"></a>
<table><tr><td><div class="element">Relation <b>subTracks (&lt;directional aggregation by value&gt;)</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : + subTracks : <a href="class128389.html#refclass128389"><b>Track</b></a>, multiplicity : *</li><li>C++ : public: <a href="class128389.html#refclass128389"><b>Track</b></a> subTracks</li></ul><p>Child tracks in a tree structure<br /></p></div>
<p>All public operations : <a href="class134021.html#refoperation129669"><b>apply</b></a> , <a href="class140165.html#refoperation134789"><b>apply</b></a> , <a href="class140165.html#refoperation134917"><b>dispatchOp</b></a> </p>

View file

@ -16,7 +16,7 @@
<!-- ============================================================= -->
<a name="refclass128517"></a>
<p>Declaration :</p><ul><li>C++ : class MObject : public <a href="class134021.html#refclass134021"><b>Buildable</b></a> </li><li>Java : public interface MObject </li></ul><p>Directly inherited by : <a href="class128773.html#refclass128773"><b>AbstractMO</b></a> </p>
<p>Declaration :</p><ul><li>C++ : class MObject : public <a href="class134021.html#refclass134021"><b>Buildable</b></a> </li><li>Java : public interface MObject </li></ul><p>Directly inherited by : <a href="class128773.html#refclass128773"><b>AbstractMO</b></a> <a href="class128901.html#refclass128901"><b>Clip</b></a> <a href="class129029.html#refclass129029"><b>Effect</b></a> <a href="class129669.html#refclass129669"><b>Label</b></a> <a href="class128389.html#refclass128389"><b>Track</b></a> </p>
<p>Artifact : <a href="index.html#refartifact128261"><b>mobject</b></a>, Component(s) : <a href="index.html#refcomponent128133"><b>Session</b></a></p><div class="sub">
<a name="refattribute128517"></a>
<table><tr><td><div class="element">Attribut <b>length</b></div></td></tr></table>

View file

@ -16,11 +16,9 @@
<!-- ============================================================= -->
<a name="refclass128901"></a>
<p>Declaration :</p><ul><li>C++ : class Clip : public <a href="class128773.html#refclass128773"><b>AbstractMO</b></a> </li></ul><p>Directly inherited by : <a href="class138629.html#refclass138629"><b>CompoundClip</b></a> <a href="class138885.html#refclass138885"><b>SimpleClip</b></a> </p>
<p>Declaration :</p><ul><li>C++ : class Clip : public <a href="class128773.html#refclass128773"><b>AbstractMO</b></a>, public <a href="class128517.html#refclass128517"><b>MObject</b></a> </li></ul><p>Directly inherited by : <a href="class138629.html#refclass138629"><b>CompoundClip</b></a> <a href="class138885.html#refclass138885"><b>SimpleClip</b></a> </p>
<p>Artifact : <a href="index.html#refartifact129413"><b>clip</b></a></p><div class="sub">
<a name="refattribute128645"></a>
<table><tr><td><div class="element">Attribut <b>start</b></div></td></tr></table>
<p>Declaration :</p><ul><li>Uml : # start : <a href="class134917.html#refclass134917"><b>Time</b></a></li><li>C++ : protected: <a href="class134917.html#refclass134917"><b>Time</b></a> start</li></ul><p>startpos in source<br /></p><a name="refrelation142469"></a>
<a name="refrelation142469"></a>
<table><tr><td><div class="element">Relation <b>source (&lt;unidirectional association&gt;)</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # source : <a href="class136709.html#refclass136709"><b>Media</b></a>, multiplicity : 1</li><li>C++ : protected: <a href="class136709.html#refclass136709"><b>Media</b></a>* source</li></ul><p>the media source this clip referes to<br /></p></div>
<p>All public operations : <a href="class134021.html#refoperation129669"><b>apply</b></a> , <a href="class140165.html#refoperation134789"><b>apply</b></a> , <a href="class140165.html#refoperation134917"><b>dispatchOp</b></a> </p>
</body>

View file

@ -16,10 +16,10 @@
<!-- ============================================================= -->
<a name="refclass129029"></a>
<p>Declaration :</p><ul><li>C++ : class Effect : public <a href="class128773.html#refclass128773"><b>AbstractMO</b></a> </li></ul><p>Artifact : <a href="index.html#refartifact129541"><b>effect</b></a></p><div class="sub">
<p>Declaration :</p><ul><li>C++ : class Effect : public <a href="class128773.html#refclass128773"><b>AbstractMO</b></a>, public <a href="class128517.html#refclass128517"><b>MObject</b></a> </li></ul><p>Artifact : <a href="index.html#refartifact129541"><b>effect</b></a></p><div class="sub">
<a name="refattribute128901"></a>
<table><tr><td><div class="element">Attribut <b>plugID</b></div></td></tr></table>
<p>Declaration :</p><ul><li>Uml : # plugID : string</li><li>C++ : protected: string plugID</li></ul><p>Identifier of the Plugin to be used<br /></p></div>
<table><tr><td><div class="element">Attribut <b>plugin</b></div></td></tr></table>
<p>Declaration :</p><ul><li>Uml : # plugin : string</li><li>C++ : protected: string plugin</li></ul><p>Identifier of the Plugin to be used<br /></p></div>
<p>All public operations : <a href="class134021.html#refoperation129669"><b>apply</b></a> , <a href="class140165.html#refoperation134789"><b>apply</b></a> , <a href="class140165.html#refoperation134917"><b>dispatchOp</b></a> </p>
</body>
</html>

View file

@ -16,7 +16,7 @@
<!-- ============================================================= -->
<a name="refclass129669"></a>
<p>Declaration :</p><ul><li>C++ : class Label : public <a href="class129157.html#refclass129157"><b>Meta</b></a> </li></ul><p>Artifact : <a href="index.html#refartifact130181"><b>label</b></a></p><div class="sub">
<p>Declaration :</p><ul><li>C++ : class Label : public <a href="class129157.html#refclass129157"><b>Meta</b></a>, public <a href="class128517.html#refclass128517"><b>MObject</b></a> </li></ul><p>Artifact : <a href="index.html#refartifact130181"><b>label</b></a></p><div class="sub">
</div>
<p>All public operations : <a href="class134021.html#refoperation129669"><b>apply</b></a> , <a href="class140165.html#refoperation134789"><b>apply</b></a> , <a href="class140165.html#refoperation134917"><b>dispatchOp</b></a> </p>
</body>

View file

@ -19,7 +19,7 @@
<p>Declaration :</p><ul><li>C++ : class Session </li></ul><p>Directly inherited by : <a href="class128005.html#refclass128005"><b>SessionImpl</b></a> </p>
<p>Primary Interface for all editing tasks.<br />The session contains defaults, all the assets being edited, and a set of EDL with the individual MObjects to be manipulated and rendered.<br /></p><p>Artifact : <a href="index.html#refartifact138757"><b>session</b></a></p><div class="sub">
<a name="refoperation133509"></a>
<table><tr><td><div class="element">Operation <b>currEDL</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : + currEDL() : <a href="class128133.html#refclass128133"><b>EDL</b></a></li><li>C++ : public: <a href="class128133.html#refclass128133"><b>EDL</b></a> currEDL () </li></ul><p>The EDL currently in focus. In most cases, Session and EDL are almost the same, just EDL emphasizes the collection aspect. But generally (for larger editing projects) one Session can contain several EDLs, which may even be nested. At any given time, only one of these EDLs has focus and recieves the editing commands.<br /></p><a name="refoperation133637"></a>
<table><tr><td><div class="element">Operation <b>currEDL</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : + currEDL() : <a href="class128133.html#refclass128133"><b>Seq</b></a></li><li>C++ : public: <a href="class128133.html#refclass128133"><b>Seq</b></a> currEDL () </li></ul><p>The EDL currently in focus. In most cases, Session and EDL are almost the same, just EDL emphasizes the collection aspect. But generally (for larger editing projects) one Session can contain several EDLs, which may even be nested. At any given time, only one of these EDLs has focus and recieves the editing commands.<br /></p><a name="refoperation133637"></a>
<table><tr><td><div class="element">Operation <b>getFixture</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : + getFixture() : Fixture&amp;</li><li>C++ : public: Fixture&amp; getFixture () </li></ul><p>While the session can be comprised of several EDLs, <br />there is only one Fixture, which represents the actual<br />configuration of all Objects to be rendered<br /></p><a name="refrelation144773"></a>
<table><tr><td><div class="element">Relation <b>current (&lt;unidirectional association&gt;)</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : static, + current : <a href="class139781.html#refclass139781"><b>SessManager</b></a>, multiplicity : 1</li><li>C++ : public: static <a href="class139781.html#refclass139781"><b>SessManager</b></a>&amp; current</li></ul><p>Standard access path to get at the current session via the Session Manager, which acts as a "PImpl" smart pointer<br /></p><a name="refrelation150917"></a>
<table><tr><td><div class="element">Relation <b>defaults (&lt;unidirectional association&gt;)</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # defaults : <a href="class141445.html#refclass141445"><b>DefaultsManager</b></a></li><li>C++ : protected: <a href="class141445.html#refclass141445"><b>DefaultsManager</b></a>* defaults</li></ul></div>

View file

@ -0,0 +1,25 @@
<!-- Documentation produced by the Html generator of Bouml (http://bouml.free.fr) -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Class StreamType</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body bgcolor="#ffffff">
<div class = "title">Class StreamType</div>
<p></p>
<!-- ============================================================= -->
<a name="refclass144773"></a>
<p>Declaration :</p><ul><li>C++ : class StreamType </li></ul><p>Artifact : <a href="index.html#refartifact139653"><b>streamtype</b></a></p><div class="sub">
<a name="refrelation158469"></a>
<table><tr><td><div class="element">Relation <b>&lt;unidirectional association&gt;</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # : <a href="class145285.html#refclass145285"><b>MediaKind</b></a></li><li>C++ : protected: <a href="class145285.html#refclass145285"><b>MediaKind</b></a>* </li></ul><a name="refrelation158597"></a>
<table><tr><td><div class="element">Relation <b>&lt;unidirectional association&gt;</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # : <a href="class144901.html#refclass144901"><b>Prototype</b></a></li><li>C++ : protected: <a href="class144901.html#refclass144901"><b>Prototype</b></a>* </li></ul><a name="refrelation158725"></a>
<table><tr><td><div class="element">Relation <b>&lt;unidirectional association&gt;</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # : <a href="class145029.html#refclass145029"><b>ImplFacade</b></a></li><li>C++ : protected: <a href="class145029.html#refclass145029"><b>ImplFacade</b></a>* </li></ul></div>
</body>
</html>

View file

@ -0,0 +1,20 @@
<!-- Documentation produced by the Html generator of Bouml (http://bouml.free.fr) -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Class Prototype</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body bgcolor="#ffffff">
<div class = "title">Class Prototype</div>
<p></p>
<!-- ============================================================= -->
<a name="refclass144901"></a>
<p>Declaration :</p><ul><li>C++ : class Prototype </li></ul><p>Artifact : <a href="index.html#refartifact139653"><b>streamtype</b></a></p></body>
</html>

View file

@ -0,0 +1,20 @@
<!-- Documentation produced by the Html generator of Bouml (http://bouml.free.fr) -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Class ImplFacade</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body bgcolor="#ffffff">
<div class = "title">Class ImplFacade</div>
<p></p>
<!-- ============================================================= -->
<a name="refclass145029"></a>
<p>Declaration :</p><ul><li>C++ : class ImplFacade </li></ul><p>Artifact : <a href="index.html#refartifact139653"><b>streamtype</b></a></p></body>
</html>

View file

@ -0,0 +1,22 @@
<!-- Documentation produced by the Html generator of Bouml (http://bouml.free.fr) -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Class StreamTypeID</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body bgcolor="#ffffff">
<div class = "title">Class StreamTypeID</div>
<p></p>
<!-- ============================================================= -->
<a name="refclass145157"></a>
<p>Declaration :</p><ul><li>C++ : class StreamTypeID </li></ul><div class="sub">
</div>
</body>
</html>

View file

@ -0,0 +1,20 @@
<!-- Documentation produced by the Html generator of Bouml (http://bouml.free.fr) -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Class MediaKind</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body bgcolor="#ffffff">
<div class = "title">Class MediaKind</div>
<p></p>
<!-- ============================================================= -->
<a name="refclass145285"></a>
<p>Declaration :</p><ul><li>C++ : enum MediaKind </li><li>Java : package enum MediaKind </li></ul></body>
</html>

View file

@ -0,0 +1,20 @@
<!-- Documentation produced by the Html generator of Bouml (http://bouml.free.fr) -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Class STypeManager</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body bgcolor="#ffffff">
<div class = "title">Class STypeManager</div>
<p></p>
<!-- ============================================================= -->
<a name="refclass145413"></a>
<p>Declaration :</p><ul><li>C++ : class STypeManager </li></ul><p>Artifact : <a href="index.html#refartifact139781"><b>stypemanager</b></a></p></body>
</html>

View file

@ -0,0 +1,27 @@
<!-- Documentation produced by the Html generator of Bouml (http://bouml.free.fr) -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Class Timeline</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body bgcolor="#ffffff">
<div class = "title">Class Timeline</div>
<p></p>
<!-- ============================================================= -->
<a name="refclass145541"></a>
<p>Declaration :</p><ul><li>C++ : class Timeline </li></ul><p>Directly inherited by : <a href="class145797.html#refclass145797"><b>TimelineView</b></a> </p>
<div class="sub">
<a name="refrelation159109"></a>
<table><tr><td><div class="element">Relation <b>&lt;aggregation by value&gt;</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # : <a href="class145669.html#refclass145669"><b>Project</b></a>, multiplicity : 1</li><li>C++ : protected: <a href="class145669.html#refclass145669"><b>Project</b></a> </li></ul><a name="refrelation159237"></a>
<table><tr><td><div class="element">Relation <b>&lt;unidirectional association&gt;</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # : <a href="class145925.html#refclass145925"><b>PlayControl</b></a></li><li>C++ : protected: <a href="class145925.html#refclass145925"><b>PlayControl</b></a>* </li></ul><a name="refrelation159621"></a>
<table><tr><td><div class="element">Relation <b>&lt;unidirectional association&gt;</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # : <a href="class146309.html#refclass146309"><b>Sequence</b></a>, multiplicity : 1</li><li>C++ : protected: <a href="class146309.html#refclass146309"><b>Sequence</b></a>* </li></ul><a name="refrelation160005"></a>
<table><tr><td><div class="element">Relation <b>globalBusses (&lt;directional aggregation by value&gt;)</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # globalBusses : <a href="class138117.html#refclass138117"><b>Pipe</b></a>, multiplicity : *</li><li>C++ : protected: <a href="class138117.html#refclass138117"><b>Pipe</b></a> globalBusses</li></ul></div>
</body>
</html>

View file

@ -0,0 +1,24 @@
<!-- Documentation produced by the Html generator of Bouml (http://bouml.free.fr) -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Class Project</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body bgcolor="#ffffff">
<div class = "title">Class Project</div>
<p></p>
<!-- ============================================================= -->
<a name="refclass145669"></a>
<p>Declaration :</p><ul><li>C++ : class Project </li></ul><div class="sub">
<a name="refrelation158981"></a>
<table><tr><td><div class="element">Relation <b>&lt;aggregation by value&gt;</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # : <a href="class145541.html#refclass145541"><b>Timeline</b></a>, multiplicity : 1..*</li><li>C++ : protected: <a href="class145541.html#refclass145541"><b>Timeline</b></a> </li></ul><a name="refrelation159365"></a>
<table><tr><td><div class="element">Relation <b>&lt;aggregation by value&gt;</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # : <a href="class146309.html#refclass146309"><b>Sequence</b></a>, multiplicity : 1..*</li><li>C++ : protected: <a href="class146309.html#refclass146309"><b>Sequence</b></a> </li></ul></div>
</body>
</html>

View file

@ -0,0 +1,24 @@
<!-- Documentation produced by the Html generator of Bouml (http://bouml.free.fr) -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Class TimelineView</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body bgcolor="#ffffff">
<div class = "title">Class TimelineView</div>
<p></p>
<!-- ============================================================= -->
<a name="refclass145797"></a>
<p>Declaration :</p><ul><li>C++ : class TimelineView : public <a href="class145541.html#refclass145541"><b>Timeline</b></a> </li></ul><div class="sub">
<a name="refrelation159749"></a>
<table><tr><td><div class="element">Relation <b>&lt;unidirectional association&gt;</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # : <a href="class146309.html#refclass146309"><b>Sequence</b></a></li><li>C++ : protected: <a href="class146309.html#refclass146309"><b>Sequence</b></a>* </li></ul><a name="refrelation160773"></a>
<table><tr><td><div class="element">Relation <b>&lt;association&gt;</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # : <a href="class146437.html#refclass146437"><b>PlayheadCursor</b></a></li><li>C++ : protected: <a href="class146437.html#refclass146437"><b>PlayheadCursor</b></a>* </li></ul></div>
</body>
</html>

View file

@ -0,0 +1,23 @@
<!-- Documentation produced by the Html generator of Bouml (http://bouml.free.fr) -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Class PlayControl</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body bgcolor="#ffffff">
<div class = "title">Class PlayControl</div>
<p></p>
<!-- ============================================================= -->
<a name="refclass145925"></a>
<p>Declaration :</p><ul><li>C++ : class PlayControl </li></ul><div class="sub">
<a name="refrelation160389"></a>
<table><tr><td><div class="element">Relation <b>&lt;unidirectional association&gt;</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # : <a href="class146437.html#refclass146437"><b>PlayheadCursor</b></a>, multiplicity : *</li><li>C++ : protected: <a href="class146437.html#refclass146437"><b>PlayheadCursor</b></a>* </li></ul></div>
</body>
</html>

View file

@ -0,0 +1,24 @@
<!-- Documentation produced by the Html generator of Bouml (http://bouml.free.fr) -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Class Monitor</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body bgcolor="#ffffff">
<div class = "title">Class Monitor</div>
<p></p>
<!-- ============================================================= -->
<a name="refclass146053"></a>
<p>Declaration :</p><ul><li>C++ : class Monitor </li></ul><div class="sub">
<a name="refrelation160133"></a>
<table><tr><td><div class="element">Relation <b>&lt;unidirectional association&gt;</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # : <a href="class145541.html#refclass145541"><b>Timeline</b></a>, multiplicity : 0..1</li><li>C++ : protected: <a href="class145541.html#refclass145541"><b>Timeline</b></a>* </li></ul><a name="refrelation160517"></a>
<table><tr><td><div class="element">Relation <b>&lt;association&gt;</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # : <a href="class146437.html#refclass146437"><b>PlayheadCursor</b></a></li><li>C++ : protected: <a href="class146437.html#refclass146437"><b>PlayheadCursor</b></a>* </li></ul></div>
</body>
</html>

View file

@ -0,0 +1,23 @@
<!-- Documentation produced by the Html generator of Bouml (http://bouml.free.fr) -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Class RenderTask</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body bgcolor="#ffffff">
<div class = "title">Class RenderTask</div>
<p></p>
<!-- ============================================================= -->
<a name="refclass146181"></a>
<p>Declaration :</p><ul><li>C++ : class RenderTask </li></ul><div class="sub">
<a name="refrelation160261"></a>
<table><tr><td><div class="element">Relation <b>&lt;unidirectional association&gt;</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # : <a href="class145541.html#refclass145541"><b>Timeline</b></a></li><li>C++ : protected: <a href="class145541.html#refclass145541"><b>Timeline</b></a>* </li></ul></div>
</body>
</html>

View file

@ -0,0 +1,26 @@
<!-- Documentation produced by the Html generator of Bouml (http://bouml.free.fr) -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Class Sequence</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body bgcolor="#ffffff">
<div class = "title">Class Sequence</div>
<p></p>
<!-- ============================================================= -->
<a name="refclass146309"></a>
<p>Declaration :</p><ul><li>C++ : class Sequence </li></ul><div class="sub">
<a name="refrelation159493"></a>
<table><tr><td><div class="element">Relation <b>&lt;aggregation by value&gt;</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # : <a href="class145669.html#refclass145669"><b>Project</b></a>, multiplicity : 1</li><li>C++ : protected: <a href="class145669.html#refclass145669"><b>Project</b></a> </li></ul><a name="refrelation159877"></a>
<table><tr><td><div class="element">Relation <b>subSequences (&lt;unidirectional association&gt;)</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # subSequences : <a href="class146309.html#refclass146309"><b>Sequence</b></a>, multiplicity : *</li><li>C++ : protected: <a href="class146309.html#refclass146309"><b>Sequence</b></a>* subSequences</li></ul><a name="refrelation161541"></a>
<table><tr><td><div class="element">Relation <b>&lt;unidirectional association&gt;</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # : <a href="class128517.html#refclass128517"><b>MObject</b></a></li><li>C++ : protected: <a href="class128517.html#refclass128517"><b>MObject</b></a>* </li></ul><a name="refrelation161669"></a>
<table><tr><td><div class="element">Relation <b>trackTree (&lt;unidirectional association&gt;)</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # trackTree : <a href="class128389.html#refclass128389"><b>Track</b></a>, multiplicity : 1</li><li>C++ : protected: <a href="class128389.html#refclass128389"><b>Track</b></a>* trackTree</li></ul></div>
</body>
</html>

View file

@ -0,0 +1,24 @@
<!-- Documentation produced by the Html generator of Bouml (http://bouml.free.fr) -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Class PlayheadCursor</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body bgcolor="#ffffff">
<div class = "title">Class PlayheadCursor</div>
<p></p>
<!-- ============================================================= -->
<a name="refclass146437"></a>
<p>Declaration :</p><ul><li>C++ : class PlayheadCursor </li></ul><div class="sub">
<a name="refrelation160645"></a>
<table><tr><td><div class="element">Relation <b>&lt;association&gt;</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # : <a href="class146053.html#refclass146053"><b>Monitor</b></a></li><li>C++ : protected: <a href="class146053.html#refclass146053"><b>Monitor</b></a>* </li></ul><a name="refrelation160901"></a>
<table><tr><td><div class="element">Relation <b>&lt;association&gt;</b></div></td></tr></table><p>Declaration :</p><ul><li>Uml : # : <a href="class145797.html#refclass145797"><b>TimelineView</b></a></li><li>C++ : protected: <a href="class145797.html#refclass145797"><b>TimelineView</b></a>* </li></ul></div>
</body>
</html>

View file

@ -31,7 +31,9 @@
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass diagram131461" target = "projectFrame"><b>Rules access</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass diagram128133" target = "projectFrame"><b>Session structure</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass diagram132357" target = "projectFrame"><b>StateAdapter composition</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass diagram132485" target = "projectFrame"><b>Stream Type Framework</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass diagram131205" target = "projectFrame"><b>Struct-Asset Relations</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass diagram132741" target = "projectFrame"><b>TimelineSequences</b></a></td><td></td><td></td></tr>
</table>
</body>
</html>

View file

@ -52,7 +52,6 @@
<tr bgcolor=#f0f0f0><td><a href="class141573.html#refclass141573" target = "projectFrame"><b>DefaultsRegistry</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class139141.html#refclass139141" target = "projectFrame"><b>DoAttach</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class139269.html#refclass139269" target = "projectFrame"><b>DoRecurse</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class128133.html#refclass128133" target = "projectFrame"><b>EDL</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class137733.html#refclass137733" target = "projectFrame"><b>Effect</b></a></td><td></td><td>Effect or media processing component</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class129029.html#refclass129029" target = "projectFrame"><b>Effect</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class135557.html#refclass135557" target = "projectFrame"><b>Error</b></a></td><td></td><td></td></tr>
@ -75,6 +74,7 @@
<tr bgcolor=#f0f0f0><td><a href="class128949.html#refclass128949" target = "projectFrame"><b>FrameDescriptor</b></a></td><td>interface</td><td>A FrameDescriptor implements the higher level interfaces for frames. Further refinements are made by subclassing and policy classes</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class128225.html#refclass128225" target = "projectFrame"><b>FrameReference</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class133637.html#refclass133637" target = "projectFrame"><b>GLBuf</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class145029.html#refclass145029" target = "projectFrame"><b>ImplFacade</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class134789.html#refclass134789" target = "projectFrame"><b>Interpolator</b></a></td><td></td><td>Provides the implementation for getting the acutal value of a time varying or automated effect/plugin parameter</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class136069.html#refclass136069" target = "projectFrame"><b>Invalid</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class144261.html#refclass144261" target = "projectFrame"><b>Invocation</b></a></td><td></td><td></td></tr>
@ -88,9 +88,11 @@
<tr bgcolor=#f0f0f0><td><a href="class136709.html#refclass136709" target = "projectFrame"><b>Media</b></a></td><td></td><td>key abstraction: media-like assets</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class139525.html#refclass139525" target = "projectFrame"><b>MediaAccessFacade</b></a></td><td>boundary</td><td>provides functions for querying (opening) a media file, detecting the channels or streams found within this file, etc. Delegating to the actual backend functions</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class139397.html#refclass139397" target = "projectFrame"><b>MediaFactory</b></a></td><td></td><td>specialized Asset Factory for configuring (new) media asset instances based on existing media files on disk; can create placeholder assets as well</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class145285.html#refclass145285" target = "projectFrame"><b>MediaKind</b></a></td><td>enum</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class137093.html#refclass137093" target = "projectFrame"><b>Meta</b></a></td><td></td><td>key abstraction: metadata and organisational asset</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class129157.html#refclass129157" target = "projectFrame"><b>Meta</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class128517.html#refclass128517" target = "projectFrame"><b>MObject</b></a></td><td>interface</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class146053.html#refclass146053" target = "projectFrame"><b>Monitor</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class128394.html#refclass128394" target = "projectFrame"><b>Mutex</b></a></td><td></td><td>I provided a reworked Mutex class in my Cinelerra2 repository</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class134405.html#refclass134405" target = "projectFrame"><b>NodeCreatorTool</b></a></td><td></td><td>This Tool implementation plays the central role in the buld process: given a MObject from Session, it is able to attach ProcNodes to the render engine under construction such as to reflect the properties of the MObject in the actual render.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class143365.html#refclass143365" target = "projectFrame"><b>NodeWiring</b></a></td><td></td><td></td></tr>
@ -100,6 +102,8 @@
<tr bgcolor=#f0f0f0><td><a href="class130437.html#refclass130437" target = "projectFrame"><b>PathManager</b></a></td><td></td><td>While building a render engine, this Strategy class decides on the actual render strategy in accordance to the current controller settings (system state)</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class138117.html#refclass138117" target = "projectFrame"><b>Pipe</b></a></td><td></td><td>structural asset representing a basic building block within the high level model: a port for building a processing chain and generating media output</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class128645.html#refclass128645" target = "projectFrame"><b>Placement</b></a></td><td>interface</td><td>used to specify the position of a MObject in the EDL. This can be done in various ways (absolute, relative). <br />Placement at the same time acts as (refcounting) smart pointer for accessing the MObject.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class145925.html#refclass145925" target = "projectFrame"><b>PlayControl</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class146437.html#refclass146437" target = "projectFrame"><b>PlayheadCursor</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class140421.html#refclass140421" target = "projectFrame"><b>Plug</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class132485.html#refclass132485" target = "projectFrame"><b>PluginAdapter</b></a></td><td></td><td>Adapter used to integrage an effects processor in the render pipeline</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class129077.html#refclass129077" target = "projectFrame"><b>Prefetch</b></a></td><td></td><td></td></tr>
@ -110,7 +114,9 @@
<tr bgcolor=#f0f0f0><td><a href="class131461.html#refclass131461" target = "projectFrame"><b>Processor</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class131717.html#refclass131717" target = "projectFrame"><b>ProcNode</b></a></td><td>interface</td><td>Key abstraction of the Render Engine: A Data processing Node</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class138757.html#refclass138757" target = "projectFrame"><b>ProcPatt</b></a></td><td></td><td>special type of structural Asset representing information how to build some part of the render engine's processing nodes network.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class145669.html#refclass145669" target = "projectFrame"><b>Project</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class132229.html#refclass132229" target = "projectFrame"><b>Projector</b></a></td><td></td><td>Special video processing node used to scale and translate image data.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class144901.html#refclass144901" target = "projectFrame"><b>Prototype</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class143749.html#refclass143749" target = "projectFrame"><b>PullInput</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class143621.html#refclass143621" target = "projectFrame"><b>QueryCache</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class140677.html#refclass140677" target = "projectFrame"><b>QueryHandler</b></a></td><td>interface</td><td></td></tr>
@ -120,10 +126,13 @@
<tr bgcolor=#f0f0f0><td><a href="class133893.html#refclass133893" target = "projectFrame"><b>RelType</b></a></td><td>enum</td><td>the possible kinds of RelativePlacements</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class131333.html#refclass131333" target = "projectFrame"><b>RenderEngine</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class130949.html#refclass130949" target = "projectFrame"><b>RenderState</b></a></td><td></td><td>Encapsulates the logic used to get a "current render process" in accordance to the currentyl applicable controller settings. The provided StateProxy serves to hold any mutalbe state used in the render process, so the rest of the render engine can be stateless.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class146181.html#refclass146181" target = "projectFrame"><b>RenderTask</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class140933.html#refclass140933" target = "projectFrame"><b>ResolverBase</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class129205.html#refclass129205" target = "projectFrame"><b>Scheduler</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class135173.html#refclass135173" target = "projectFrame"><b>Segment</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class134277.html#refclass134277" target = "projectFrame"><b>SegmentationTool</b></a></td><td></td><td>Tool implementation for deriving a partitioning of the current timeline such, that each segement has a constant configuration. "Constant" means here, that any remaining changes over time can be represented by automation solely, without the need to change the node connections.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class128133.html#refclass128133" target = "projectFrame"><b>Seq</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class146309.html#refclass146309" target = "projectFrame"><b>Sequence</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class141829.html#refclass141829" target = "projectFrame"><b>Serializer</b></a></td><td>actor</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class139653.html#refclass139653" target = "projectFrame"><b>Session</b></a></td><td></td><td>Primary Interface for all editing tasks.<br />The session contains defaults, all the assets being edited, and a set of EDL with the individual MObjects to be manipulated and rendered.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class128005.html#refclass128005" target = "projectFrame"><b>SessionImpl</b></a></td><td></td><td>Implementation class for the Session interface</td></tr>
@ -137,9 +146,14 @@
<tr bgcolor=#f0f0f0><td><a href="class142469.html#refclass142469" target = "projectFrame"><b>StateProxy</b></a></td><td>implementation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class136325.html#refclass136325" target = "projectFrame"><b>std::exception</b></a></td><td>auxiliary</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class144517.html#refclass144517" target = "projectFrame"><b>Strategy</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class144773.html#refclass144773" target = "projectFrame"><b>StreamType</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class145157.html#refclass145157" target = "projectFrame"><b>StreamTypeID</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class136965.html#refclass136965" target = "projectFrame"><b>Struct</b></a></td><td></td><td>key abstraction: structural asset</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class145413.html#refclass145413" target = "projectFrame"><b>STypeManager</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class128138.html#refclass128138" target = "projectFrame"><b>Thread</b></a></td><td></td><td>We can basically reuse the Thread class design from Cinelerra2, Thread becomes a baseclass for all Threads </td></tr>
<tr bgcolor=#f0f0f0><td><a href="class134917.html#refclass134917" target = "projectFrame"><b>Time</b></a></td><td></td><td>denotes a temporal position (time point), based on timeline start.<br /><br />investigate posix.4 realtime timers, wrap these here</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class145541.html#refclass145541" target = "projectFrame"><b>Timeline</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class145797.html#refclass145797" target = "projectFrame"><b>TimelineView</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class140037.html#refclass140037" target = "projectFrame"><b>Tool</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class130693.html#refclass130693" target = "projectFrame"><b>ToolFactory</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class137989.html#refclass137989" target = "projectFrame"><b>Track</b></a></td><td></td><td>structural asset holding the configuration of a track in the EDL</td></tr>

View file

@ -53,7 +53,6 @@
<a href="class141573.html#refclass141573" target = "projectFrame"><b>DefaultsRegistry</b></a><br />
<a href="class139141.html#refclass139141" target = "projectFrame"><b>DoAttach</b></a><br />
<a href="class139269.html#refclass139269" target = "projectFrame"><b>DoRecurse</b></a><br />
<a href="class128133.html#refclass128133" target = "projectFrame"><b>EDL</b></a><br />
<a href="class137733.html#refclass137733" target = "projectFrame"><b>Effect</b></a><br />
<a href="class129029.html#refclass129029" target = "projectFrame"><b>Effect</b></a><br />
<a href="class135557.html#refclass135557" target = "projectFrame"><b>Error</b></a><br />
@ -76,6 +75,7 @@
<a href="class128949.html#refclass128949" target = "projectFrame"><b>FrameDescriptor</b></a><br />
<a href="class128225.html#refclass128225" target = "projectFrame"><b>FrameReference</b></a><br />
<a href="class133637.html#refclass133637" target = "projectFrame"><b>GLBuf</b></a><br />
<a href="class145029.html#refclass145029" target = "projectFrame"><b>ImplFacade</b></a><br />
<a href="class134789.html#refclass134789" target = "projectFrame"><b>Interpolator</b></a><br />
<a href="class136069.html#refclass136069" target = "projectFrame"><b>Invalid</b></a><br />
<a href="class144261.html#refclass144261" target = "projectFrame"><b>Invocation</b></a><br />
@ -89,9 +89,11 @@
<a href="class136709.html#refclass136709" target = "projectFrame"><b>Media</b></a><br />
<a href="class139525.html#refclass139525" target = "projectFrame"><b>MediaAccessFacade</b></a><br />
<a href="class139397.html#refclass139397" target = "projectFrame"><b>MediaFactory</b></a><br />
<a href="class145285.html#refclass145285" target = "projectFrame"><b>MediaKind</b></a><br />
<a href="class137093.html#refclass137093" target = "projectFrame"><b>Meta</b></a><br />
<a href="class129157.html#refclass129157" target = "projectFrame"><b>Meta</b></a><br />
<a href="class128517.html#refclass128517" target = "projectFrame"><b>MObject</b></a><br />
<a href="class146053.html#refclass146053" target = "projectFrame"><b>Monitor</b></a><br />
<a href="class128394.html#refclass128394" target = "projectFrame"><b>Mutex</b></a><br />
<a href="class134405.html#refclass134405" target = "projectFrame"><b>NodeCreatorTool</b></a><br />
<a href="class143365.html#refclass143365" target = "projectFrame"><b>NodeWiring</b></a><br />
@ -101,6 +103,8 @@
<a href="class130437.html#refclass130437" target = "projectFrame"><b>PathManager</b></a><br />
<a href="class138117.html#refclass138117" target = "projectFrame"><b>Pipe</b></a><br />
<a href="class128645.html#refclass128645" target = "projectFrame"><b>Placement</b></a><br />
<a href="class145925.html#refclass145925" target = "projectFrame"><b>PlayControl</b></a><br />
<a href="class146437.html#refclass146437" target = "projectFrame"><b>PlayheadCursor</b></a><br />
<a href="class140421.html#refclass140421" target = "projectFrame"><b>Plug</b></a><br />
<a href="class132485.html#refclass132485" target = "projectFrame"><b>PluginAdapter</b></a><br />
<a href="class129077.html#refclass129077" target = "projectFrame"><b>Prefetch</b></a><br />
@ -111,7 +115,9 @@
<a href="class131461.html#refclass131461" target = "projectFrame"><b>Processor</b></a><br />
<a href="class131717.html#refclass131717" target = "projectFrame"><b>ProcNode</b></a><br />
<a href="class138757.html#refclass138757" target = "projectFrame"><b>ProcPatt</b></a><br />
<a href="class145669.html#refclass145669" target = "projectFrame"><b>Project</b></a><br />
<a href="class132229.html#refclass132229" target = "projectFrame"><b>Projector</b></a><br />
<a href="class144901.html#refclass144901" target = "projectFrame"><b>Prototype</b></a><br />
<a href="class143749.html#refclass143749" target = "projectFrame"><b>PullInput</b></a><br />
<a href="class143621.html#refclass143621" target = "projectFrame"><b>QueryCache</b></a><br />
<a href="class140677.html#refclass140677" target = "projectFrame"><b>QueryHandler</b></a><br />
@ -121,10 +127,13 @@
<a href="class133893.html#refclass133893" target = "projectFrame"><b>RelType</b></a><br />
<a href="class131333.html#refclass131333" target = "projectFrame"><b>RenderEngine</b></a><br />
<a href="class130949.html#refclass130949" target = "projectFrame"><b>RenderState</b></a><br />
<a href="class146181.html#refclass146181" target = "projectFrame"><b>RenderTask</b></a><br />
<a href="class140933.html#refclass140933" target = "projectFrame"><b>ResolverBase</b></a><br />
<a href="class129205.html#refclass129205" target = "projectFrame"><b>Scheduler</b></a><br />
<a href="class135173.html#refclass135173" target = "projectFrame"><b>Segment</b></a><br />
<a href="class134277.html#refclass134277" target = "projectFrame"><b>SegmentationTool</b></a><br />
<a href="class128133.html#refclass128133" target = "projectFrame"><b>Seq</b></a><br />
<a href="class146309.html#refclass146309" target = "projectFrame"><b>Sequence</b></a><br />
<a href="class141829.html#refclass141829" target = "projectFrame"><b>Serializer</b></a><br />
<a href="class139653.html#refclass139653" target = "projectFrame"><b>Session</b></a><br />
<a href="class128005.html#refclass128005" target = "projectFrame"><b>SessionImpl</b></a><br />
@ -138,9 +147,14 @@
<a href="class142469.html#refclass142469" target = "projectFrame"><b>StateProxy</b></a><br />
<a href="class136325.html#refclass136325" target = "projectFrame"><b>std::exception</b></a><br />
<a href="class144517.html#refclass144517" target = "projectFrame"><b>Strategy</b></a><br />
<a href="class144773.html#refclass144773" target = "projectFrame"><b>StreamType</b></a><br />
<a href="class145157.html#refclass145157" target = "projectFrame"><b>StreamTypeID</b></a><br />
<a href="class136965.html#refclass136965" target = "projectFrame"><b>Struct</b></a><br />
<a href="class145413.html#refclass145413" target = "projectFrame"><b>STypeManager</b></a><br />
<a href="class128138.html#refclass128138" target = "projectFrame"><b>Thread</b></a><br />
<a href="class134917.html#refclass134917" target = "projectFrame"><b>Time</b></a><br />
<a href="class145541.html#refclass145541" target = "projectFrame"><b>Timeline</b></a><br />
<a href="class145797.html#refclass145797" target = "projectFrame"><b>TimelineView</b></a><br />
<a href="class140037.html#refclass140037" target = "projectFrame"><b>Tool</b></a><br />
<a href="class130693.html#refclass130693" target = "projectFrame"><b>ToolFactory</b></a><br />
<a href="class137989.html#refclass137989" target = "projectFrame"><b>Track</b></a><br />

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 63 KiB

BIN
doc/devel/uml/fig132485.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

BIN
doc/devel/uml/fig132741.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View file

@ -36,7 +36,7 @@ Documentation</title>
<p>required classes : <a href="class128261.html#refclass128261"><b>Fixture</b></a>, <a href="class128005.html#refclass128005"><b>SessionImpl</b></a></p>
<a name="refcomponent128133"></a>
<table><tr><td><div class="element">Component <b>Session</b></div></td></tr></table>
<p>provided classes : <a href="class128133.html#refclass128133"><b>EDL</b></a>, <a href="class128261.html#refclass128261"><b>Fixture</b></a>, <a href="class128517.html#refclass128517"><b>MObject</b></a>, <a href="class134661.html#refclass134661"><b>ParamProvider</b></a>, <a href="class128005.html#refclass128005"><b>SessionImpl</b></a></p>
<p>provided classes : <a href="class128133.html#refclass128133"><b>Seq</b></a>, <a href="class128261.html#refclass128261"><b>Fixture</b></a>, <a href="class128517.html#refclass128517"><b>MObject</b></a>, <a href="class134661.html#refclass134661"><b>ParamProvider</b></a>, <a href="class128005.html#refclass128005"><b>SessionImpl</b></a></p>
<div class="sub">
<a name="refcomponent128389"></a>
<table><tr><td><div class="element">Component <b>EDL</b></div></td></tr></table>
@ -83,8 +83,21 @@ Documentation</title>
<table><tr><td><div class="element">Component <b>client code</b></div></td></tr></table>
<p>required classes : <a href="class141957.html#refclass141957"><b>ProcDispatcher</b></a></p>
</div>
<a name="refclass view129413"></a>
<h2 class ="view">1.2 Class View Project Entities</h2>
<div class="sub">
<a name="refclass diagram132741"></a>
<p align="center"><img src="fig132741.png" alt="" /></p>
<p align="center"><b>TimelineSequences</b></p><p><br /></p><p><br /></p>
<table><tr><td><div class="element">Class <b><a href="class145669.html#refclass145669"><b>Project</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class145925.html#refclass145925"><b>PlayControl</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class146053.html#refclass146053"><b>Monitor</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class146181.html#refclass146181"><b>RenderTask</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class146309.html#refclass146309"><b>Sequence</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class146437.html#refclass146437"><b>PlayheadCursor</b></a></b></div></td></tr></table>
</div>
<a name="refcomponent view128133"></a>
<h2 class ="view">1.2 Component View interfaces</h2>
<h2 class ="view">1.3 Component View interfaces</h2>
<div class="sub">
<a name="refcomponent diagram130053"></a>
<p align="center"><img src="fig130053.png" alt="" /></p>
@ -104,10 +117,10 @@ Documentation</title>
<p>provided classes : <a href="class139525.html#refclass139525"><b>MediaAccessFacade</b></a></p>
</div>
<a name="refpackage128645"></a>
<h2 class ="package">1.3 Package codegen</h2>
<h2 class ="package">1.4 Package codegen</h2>
<p>This package is used to organize code generation by BOUML. It is considered useless after having generated the initial code skeleton.<br /></p><div class="sub">
<a name="refdeployment view128133"></a>
<h3 class ="view">1.3.1 Deployment View EXE Deployment</h3>
<h3 class ="view">1.4.1 Deployment View EXE Deployment</h3>
<p>defines and lists how the Lumiera executable has to be created<br /></p>
<div class="sub">
<a name="refdeployment diagram129797"></a>
@ -122,14 +135,14 @@ Documentation</title>
<p>Artifact <i>source</i></p>
</div>
<a name="refpackage129413"></a>
<h3 class ="package">1.3.2 Package common</h3>
<h3 class ="package">1.4.2 Package common</h3>
<p></p><ul>
<li>C++ namespace : lumiera</li>
</ul>
<p>sourcecode package<br /><br />Common library and helper classes<br /></p><p>Diagram : <a href="index.html#refdeployment diagram129797"><b>Source Overview</b></a></p>
<div class="sub">
<a name="refdeployment view128261"></a>
<h4 class ="view">1.3.2.1 Deployment View gen</h4>
<h4 class ="view">1.4.2.1 Deployment View gen</h4>
<p>defines source files to be generated by BOUML<br /></p>
<div class="sub">
<a name="refartifact139141"></a>
@ -148,26 +161,29 @@ Documentation</title>
<table><tr><td><div class="element">Artifact <b>time</b></div></td></tr></table>
<p>unified representation of a time point, including conversion functions<br /></p>
<p>Artifact <i>source</i> associated with : <a href="class134917.html#refclass134917"><b>Time</b></a></p>
<a name="refartifact139653"></a>
<table><tr><td><div class="element">Artifact <b>streamtype</b></div></td></tr></table>
<p>Artifact <i>source</i> associated with : <a href="class144773.html#refclass144773"><b>StreamType</b></a>, <a href="class144901.html#refclass144901"><b>Prototype</b></a>, <a href="class145029.html#refclass145029"><b>ImplFacade</b></a></p>
</div>
<a name="refpackage130821"></a>
<h4 class ="package">1.3.2.2 Package error</h4>
<h4 class ="package">1.4.2.2 Package error</h4>
<p></p><ul>
<li>C++ namespace : lumiera::error</li>
</ul>
<p>Namespace for Exception Kinds<br /></p><a name="refpackage130949"></a>
<h4 class ="package">1.3.2.3 Package visitor</h4>
<h4 class ="package">1.4.2.3 Package visitor</h4>
<p></p><ul>
<li>C++ namespace : lumiera::visitor</li>
</ul>
<p>sub-namespace for visitor library implementation<br /></p></div>
<a name="refpackage129541"></a>
<h3 class ="package">1.3.3 Package backend</h3>
<h3 class ="package">1.4.3 Package backend</h3>
<p></p><ul>
<li>C++ namespace : backend_interface</li>
</ul>
<p>sourcecode package<br /><br />Data backend classes here...<br /></p><div class="sub">
<a name="refdeployment view128389"></a>
<h4 class ="view">1.3.3.1 Deployment View gen</h4>
<h4 class ="view">1.4.3.1 Deployment View gen</h4>
<div class="sub">
<a name="refartifact138629"></a>
<table><tr><td><div class="element">Artifact <b>mediaaccessfacade</b></div></td></tr></table>
@ -176,13 +192,13 @@ Documentation</title>
</div>
</div>
<a name="refpackage129669"></a>
<h3 class ="package">1.3.4 Package proc</h3>
<h3 class ="package">1.4.4 Package proc</h3>
<p></p><ul>
<li>C++ namespace : proc_interface</li>
</ul>
<p>sourcecode package<br /><br />All classes belonging to the (middle) processing layer<br /></p><div class="sub">
<a name="refdeployment view128517"></a>
<h4 class ="view">1.3.4.1 Deployment View gen</h4>
<h4 class ="view">1.4.4.1 Deployment View gen</h4>
<p>defines source files to be generated by BOUML<br /></p>
<div class="sub">
<a name="refartifact136197"></a>
@ -207,13 +223,13 @@ Documentation</title>
<p>Artifact <i>source</i> associated with : <a href="class133253.html#refclass133253"><b>Frame</b></a></p>
</div>
<a name="refpackage130053"></a>
<h4 class ="package">1.3.4.2 Package asset</h4>
<h4 class ="package">1.4.4.2 Package asset</h4>
<p></p><ul>
<li>C++ namespace : asset</li>
</ul>
<p>sourcecode package<br /><br />Asset Management<br /></p><div class="sub">
<a name="refdeployment view128645"></a>
<h4 class ="view">1.3.4.2.1 Deployment View gen</h4>
<h4 class ="view">1.4.4.2.1 Deployment View gen</h4>
<p>defines source files to be generated by BOUML<br /></p>
<div class="sub">
<a name="refartifact137733"></a>
@ -286,14 +302,37 @@ Documentation</title>
<p>Artifact <i>source</i> associated with : <a href="class138373.html#refclass138373"><b>DB</b></a></p>
</div>
</div>
<a name="refpackage130693"></a>
<h4 class ="package">1.4.4.3 Package control</h4>
<p></p><ul>
<li>C++ namespace : control</li>
</ul>
<p>sourcecode package<br /><br />The Processing and Render Controller,<br />and the Proc-Layer dispatcher<br /></p><div class="sub">
<a name="refdeployment view129157"></a>
<h4 class ="view">1.4.4.3.1 Deployment View gen</h4>
<p>defines source files to be generated by BOUML<br /></p>
<div class="sub">
<a name="refartifact131717"></a>
<table><tr><td><div class="element">Artifact <b>pathmanager</b></div></td></tr></table>
<p>Manager for deciding the actual render strategy<br /></p>
<p>Artifact <i>source</i> associated with : <a href="class130437.html#refclass130437"><b>PathManager</b></a></p>
<a name="refartifact131845"></a>
<table><tr><td><div class="element">Artifact <b>renderstate</b></div></td></tr></table>
<p>renderengine state manager<br /></p>
<p>Artifact <i>source</i> associated with : <a href="class130949.html#refclass130949"><b>RenderState</b></a></p>
<a name="refartifact139781"></a>
<table><tr><td><div class="element">Artifact <b>stypemanager</b></div></td></tr></table>
<p>Artifact <i>source</i> associated with : <a href="class145413.html#refclass145413"><b>STypeManager</b></a></p>
</div>
</div>
<a name="refpackage130181"></a>
<h4 class ="package">1.3.4.3 Package mobject</h4>
<h4 class ="package">1.4.4.4 Package mobject</h4>
<p></p><ul>
<li>C++ namespace : mobject</li>
</ul>
<p>sourcecode package<br /><br />MObject Subsystem<br />including the Session (EDL), Builder and Processing Controller<br /></p><div class="sub">
<a name="refdeployment view128773"></a>
<h4 class ="view">1.3.4.3.1 Deployment View gen</h4>
<h4 class ="view">1.4.4.4.1 Deployment View gen</h4>
<p>defines source files to be generated by BOUML<br /></p>
<div class="sub">
<a name="refartifact138757"></a>
@ -334,13 +373,13 @@ Documentation</title>
<p>Artifact <i>source</i> associated with : <a href="class134789.html#refclass134789"><b>Interpolator</b></a></p>
</div>
<a name="refpackage130437"></a>
<h4 class ="package">1.3.4.3.2 Package session</h4>
<h4 class ="package">1.4.4.4.2 Package session</h4>
<p></p><ul>
<li>C++ namespace : mobject::session</li>
</ul>
<p>sourcecode package<br /><br />Everything concerning the EDL and Session, within the MObject Subsystem<br /></p><div class="sub">
<a name="refdeployment view128901"></a>
<h4 class ="view">1.3.4.3.2.1 Deployment View gen</h4>
<h4 class ="view">1.4.4.4.2.1 Deployment View gen</h4>
<p>defines source files to be generated by BOUML<br /></p>
<div class="sub">
<a name="refartifact128517"></a>
@ -354,7 +393,7 @@ Documentation</title>
<a name="refartifact128645"></a>
<table><tr><td><div class="element">Artifact <b>edl</b></div></td></tr></table>
<p>the (high level) Edit Decision List within the current Session<br /></p>
<p>Artifact <i>source</i> associated with : <a href="class128133.html#refclass128133"><b>EDL</b></a></p>
<p>Artifact <i>source</i> associated with : <a href="class128133.html#refclass128133"><b>Seq</b></a></p>
<a name="refartifact128773"></a>
<table><tr><td><div class="element">Artifact <b>fixture</b></div></td></tr></table>
<p>the (low level) representation of the EDL with concrete placement data<br /></p>
@ -428,13 +467,13 @@ Documentation</title>
</div>
</div>
<a name="refpackage130565"></a>
<h4 class ="package">1.3.4.3.3 Package builder</h4>
<h4 class ="package">1.4.4.4.3 Package builder</h4>
<p></p><ul>
<li>C++ namespace : mobject::builder</li>
</ul>
<p>sourcecode package<br /><br />The Builder creating the Render Engine,<br />located within the MObject Subsystem<br /></p><div class="sub">
<a name="refdeployment view129029"></a>
<h4 class ="view">1.3.4.3.3.1 Deployment View gen</h4>
<h4 class ="view">1.4.4.4.3.1 Deployment View gen</h4>
<p>defines source files to be generated by BOUML<br /></p>
<div class="sub">
<a name="refartifact130565"></a>
@ -463,35 +502,15 @@ Documentation</title>
<p>Artifact <i>source</i> associated with : <a href="class134405.html#refclass134405"><b>NodeCreatorTool</b></a></p>
</div>
</div>
<a name="refpackage130693"></a>
<h4 class ="package">1.3.4.3.4 Package controller</h4>
<p></p><ul>
<li>C++ namespace : mobject::controller</li>
</ul>
<p>sourcecode package<br /><br />The Processing and Render Controller,<br />located within the MObject Subsystem<br /></p><div class="sub">
<a name="refdeployment view129157"></a>
<h4 class ="view">1.3.4.3.4.1 Deployment View gen</h4>
<p>defines source files to be generated by BOUML<br /></p>
<div class="sub">
<a name="refartifact131717"></a>
<table><tr><td><div class="element">Artifact <b>pathmanager</b></div></td></tr></table>
<p>Manager for deciding the actual render strategy<br /></p>
<p>Artifact <i>source</i> associated with : <a href="class130437.html#refclass130437"><b>PathManager</b></a></p>
<a name="refartifact131845"></a>
<table><tr><td><div class="element">Artifact <b>renderstate</b></div></td></tr></table>
<p>renderengine state manager<br /></p>
<p>Artifact <i>source</i> associated with : <a href="class130949.html#refclass130949"><b>RenderState</b></a></p>
</div>
</div>
</div>
<a name="refpackage130309"></a>
<h4 class ="package">1.3.4.4 Package engine</h4>
<h4 class ="package">1.4.4.5 Package engine</h4>
<p></p><ul>
<li>C++ namespace : engine</li>
</ul>
<p>sourcecode package<br /><br />The Core Render Engine<br /></p><div class="sub">
<a name="refdeployment view129285"></a>
<h4 class ="view">1.3.4.4.1 Deployment View gen</h4>
<h4 class ="view">1.4.4.5.1 Deployment View gen</h4>
<p>defines source files to be generated by BOUML<br /></p>
<div class="sub">
<a name="refartifact131973"></a>
@ -574,20 +593,20 @@ Documentation</title>
</div>
</div>
<a name="refpackage129797"></a>
<h3 class ="package">1.3.5 Package gui</h3>
<h3 class ="package">1.4.5 Package gui</h3>
<p></p><ul>
<li>C++ namespace : gui</li>
</ul>
<p>sourcecode package<br /><br />User Interface classes go here<br /></p><div class="sub">
<a name="refdeployment view129413"></a>
<h4 class ="view">1.3.5.1 Deployment View gen</h4>
<h4 class ="view">1.4.5.1 Deployment View gen</h4>
<p>defines source files to be generated by BOUML<br /></p>
</div>
<a name="refpackage129925"></a>
<h3 class ="package">1.3.6 Package tool</h3>
<h3 class ="package">1.4.6 Package tool</h3>
<p>sourcecode package<br /><br />Tools and Utilities <br />(separate from the main cinelrra binary)<br /></p><div class="sub">
<a name="refdeployment view129541"></a>
<h4 class ="view">1.3.6.1 Deployment View gen</h4>
<h4 class ="view">1.4.6.1 Deployment View gen</h4>
<p>defines source files to be generated by BOUML<br /></p>
</div>
</div>
@ -637,11 +656,69 @@ Documentation</title>
<table><tr><td><div class="element">Class <b><a href="class139269.html#refclass139269"><b>DoRecurse</b></a></b></div></td></tr></table>
</div>
</div>
<a name="refpackage129029"></a>
<h2 class ="package">2.2 Package Control</h2>
<div class="sub">
<a name="refclass view128389"></a>
<h3 class ="view">2.2.1 Class View Controller Workings</h3>
<div class="sub">
<a name="refclass diagram128645"></a>
<p align="center"><img src="fig128645.png" alt="" /></p>
<p align="center"><b>Controller Entities</b></p><p><br /></p><p><br /></p>
<a name="refactivity128133"></a>
<h4 class ="activity">2.2.1.1 Activity configure Render</h4>
<p>Pre Condition :</p><ul></ul><p>Post Condition :</p><ul></ul><div class="sub">
<a name="refactivity diagram129541"></a>
<p align="center"><img src="fig129541.png" alt="" /></p>
<p align="center"><b>the render configuration flow</b></p><p><br /></p><p><br /></p>
<a name="refactivity parameter128005"></a>
<table><tr><td><div class="element">Activity action pin <b>Render Request</b></div></td></tr></table>
<p>Direction : input</p><p>Type : </p><p>Selection :</p><ul></ul><div class="sub">
<table><tr><td><div class="element">Flow <b>&lt;flow&gt;</div></td></tr></table><p>From <a href="index.html#refactivity parameter128005"><b>Render Request</b></a> To <a href="index.html#refopaque activity action128389"><b>determine Render Params</b></a></p><p>Weight :</p><ul></ul><p>Guard :</p><ul></ul><p>Selection :</p><ul></ul><p>Transformation :</p><ul></ul></div>
<a name="refopaque activity action128133"></a>
<table><tr><td><div class="element">Opaque activity action <b>setup StateProxy</b></div></td></tr></table>
<p>Defined in <a href="index.html#refactivity128133"><b>configure Render</b></a></p><p>Pre Condition :</p><ul></ul><p>Post Condition :</p><ul></ul><p>Behavior :</p><ul></ul><div class="sub">
<table><tr><td><div class="element">Flow <b>&lt;flow&gt;</div></td></tr></table><p>From <a href="index.html#refopaque activity action128133"><b>setup StateProxy</b></a> To <a href="index.html#refdecision activity node128389"><b>build necessary?</b></a></p><p>Weight :</p><ul></ul><p>Guard :</p><ul></ul><p>Selection :</p><ul></ul><p>Transformation :</p><ul></ul></div>
<a name="refdecision activity node128389"></a>
<a name="refdecision activity node128389"></a>
<table><tr><td><div class="element">Decision activity node <b>build necessary?</b></div></td></tr></table>
<p>Defined in <a href="index.html#refactivity128133"><b>configure Render</b></a></p><div class="sub">
<table><tr><td><div class="element">Flow <b>&lt;flow&gt;</div></td></tr></table><p>From <a href="index.html#refdecision activity node128389"><b>build necessary?</b></a> To <a href="index.html#refopaque activity action128517"><b>build Render Engine</b></a></p><p>Weight :</p><ul></ul><p>Guard :</p><ul><li>OCL : <pre>
build necessary</pre></li></ul><p>Selection :</p><ul></ul><p>Transformation :</p><ul></ul><table><tr><td><div class="element">Flow <b>&lt;flow&gt;</div></td></tr></table><p>From <a href="index.html#refdecision activity node128389"><b>build necessary?</b></a> To <a href="index.html#refmerge activity node128773"><b>merge activity node</b></a></p><p>Weight :</p><ul></ul><p>Guard :</p><ul><li>OCL : <pre>
reuse exiting Engine</pre></li></ul><p>Selection :</p><ul></ul><p>Transformation :</p><ul></ul></div>
<a name="refopaque activity action128005"></a>
<table><tr><td><div class="element">Opaque activity action <b>setup Build Params</b></div></td></tr></table>
<p>Defined in <a href="index.html#refactivity128133"><b>configure Render</b></a></p><p>Pre Condition :</p><ul></ul><p>Post Condition :</p><ul></ul><p>Behavior :</p><ul></ul><a name="refmerge activity node128773"></a>
<a name="refmerge activity node128773"></a>
<table><tr><td><div class="element">Merge activity node <b></b></div></td></tr></table>
<p>Defined in <a href="index.html#refactivity128133"><b>configure Render</b></a></p><div class="sub">
<table><tr><td><div class="element">Flow <b>&lt;flow&gt;</div></td></tr></table><p>From <a href="index.html#refmerge activity node128773"><b>merge activity node</b></a> To <a href="index.html#refactivity final128901"><b>activity final</b></a></p><p>Weight :</p><ul></ul><p>Guard :</p><ul></ul><p>Selection :</p><ul></ul><p>Transformation :</p><ul></ul></div>
<a name="refexpansion region128005"></a>
<h4 class ="expansionregion">2.2.1.1.1 Expansion region determine Render Params</h4>
<a name="refopaque activity action128389"></a>
<table><tr><td><div class="element">Opaque activity action <b>determine Render Params</b></div></td></tr></table>
<p>Diagram : <a href="index.html#refactivity diagram129541"><b>the render configuration flow</b></a></p>
<p>Defined in <a href="index.html#refactivity128133"><b>configure Render</b></a></p><p>Pre Condition :</p><ul></ul><p>Post Condition :</p><ul></ul><p>Behavior :</p><ul></ul><div class="sub">
<table><tr><td><div class="element">Flow <b>&lt;flow&gt;</div></td></tr></table><p>From <a href="index.html#refopaque activity action128389"><b>determine Render Params</b></a> To <a href="index.html#refopaque activity action128133"><b>setup StateProxy</b></a></p><p>Weight :</p><ul></ul><p>Guard :</p><ul></ul><p>Selection :</p><ul></ul><p>Transformation :</p><ul></ul></div>
<a name="refopaque activity action128517"></a>
<table><tr><td><div class="element">Opaque activity action <b>build Render Engine</b></div></td></tr></table>
<p>Defined in <a href="index.html#refactivity128133"><b>configure Render</b></a></p><p>Pre Condition :</p><ul></ul><p>Post Condition :</p><ul></ul><p>Behavior :</p><ul></ul><div class="sub">
<table><tr><td><div class="element">Flow <b>&lt;flow&gt;</div></td></tr></table><p>From <a href="index.html#refopaque activity action128517"><b>build Render Engine</b></a> To <a href="index.html#refmerge activity node128773"><b>merge activity node</b></a></p><p>Weight :</p><ul></ul><p>Guard :</p><ul></ul><p>Selection :</p><ul></ul><p>Transformation :</p><ul></ul></div>
<a name="refactivity final128901"></a>
<a name="refactivity final128901"></a>
<table><tr><td><div class="element">Activity final <b></b></div></td></tr></table>
<p>Defined in <a href="index.html#refactivity128133"><b>configure Render</b></a></p></div>
<table><tr><td><div class="element">Class <b><a href="class130309.html#refclass130309"><b>ControllerFacade</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class130437.html#refclass130437"><b>PathManager</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class130949.html#refclass130949"><b>RenderState</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class145413.html#refclass145413"><b>STypeManager</b></a></b></div></td></tr></table>
</div>
</div>
<a name="refpackage128261"></a>
<h2 class ="package">2.2 Package MObject</h2>
<h2 class ="package">2.3 Package MObject</h2>
<div class="sub">
<a name="refclass view128005"></a>
<h3 class ="view">2.2.1 Class View Session</h3>
<h3 class ="view">2.3.1 Class View Session</h3>
<div class="sub">
<a name="refclass diagram128133"></a>
<p align="center"><img src="fig128133.png" alt="" /></p>
@ -649,7 +726,9 @@ Documentation</title>
<table><tr><td><div class="element">Class <b><a href="class139653.html#refclass139653"><b>Session</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class128005.html#refclass128005"><b>SessionImpl</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class139781.html#refclass139781"><b>SessManager</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class128133.html#refclass128133"><b>EDL</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class145541.html#refclass145541"><b>Timeline</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class145797.html#refclass145797"><b>TimelineView</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class128133.html#refclass128133"><b>Seq</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class128261.html#refclass128261"><b>Fixture</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class135173.html#refclass135173"><b>Segment</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class128389.html#refclass128389"><b>Track</b></a></b></div></td></tr></table>
@ -677,16 +756,16 @@ Documentation</title>
<table><tr><td><div class="element">Class <b><a href="class141957.html#refclass141957"><b>ProcDispatcher</b></a></b></div></td></tr></table>
</div>
<a name="refpackage128901"></a>
<h3 class ="package">2.2.2 Package Builder</h3>
<h3 class ="package">2.3.2 Package Builder</h3>
<div class="sub">
<a name="refclass view128261"></a>
<h4 class ="view">2.2.2.1 Class View Builder Workings</h4>
<h4 class ="view">2.3.2.1 Class View Builder Workings</h4>
<div class="sub">
<a name="refcollaboration diagram128517"></a>
<p align="center"><img src="fig128517.png" alt="" /></p>
<p align="center"><b>build process</b></p><p><br /></p><p><br /></p>
<p>This figure shows the process of building and starting a RenderEngine<br /></p><a name="refactivity128005"></a>
<h4 class ="activity">2.2.2.1.1 Activity building the Engine</h4>
<h4 class ="activity">2.3.2.1.1 Activity building the Engine</h4>
<p>Pre Condition :</p><ul></ul><p>Post Condition :</p><ul></ul><div class="sub">
<a name="refactivity diagram129413"></a>
<p align="center"><img src="fig129413.png" alt="" /></p>
@ -700,7 +779,7 @@ Documentation</title>
<p>Defined in <a href="index.html#refactivity128005"><b>building the Engine</b></a></p><p>Pre Condition :</p><ul></ul><p>Post Condition :</p><ul></ul><p>Behavior :</p><ul></ul><div class="sub">
<table><tr><td><div class="element">Flow <b>&lt;flow&gt;</div></td></tr></table><p>From <a href="index.html#refopaque activity action128645"><b>configure Tools</b></a> To <a href="index.html#reffork activity node129029"><b>fork activity node</b></a></p><p>Weight :</p><ul></ul><p>Guard :</p><ul></ul><p>Selection :</p><ul></ul><p>Transformation :</p><ul></ul></div>
<a name="refexpansion region128133"></a>
<h4 class ="expansionregion">2.2.2.1.1.1 Expansion region establish partitioning</h4>
<h4 class ="expansionregion">2.3.2.1.1.1 Expansion region establish partitioning</h4>
<div class="sub">
<a name="refopaque activity action128773"></a>
<table><tr><td><div class="element">Opaque activity action <b>define segment</b></div></td></tr></table>
@ -727,7 +806,7 @@ Documentation</title>
<p>Defined in <a href="index.html#refactivity128005"><b>building the Engine</b></a></p><div class="sub">
<table><tr><td><div class="element">Flow <b>&lt;flow&gt;</div></td></tr></table><p>From <a href="index.html#reffork activity node129029"><b>fork activity node</b></a> To <a href="index.html#refactivity object128005"><b>segment Tool</b></a></p><p>Weight :</p><ul></ul><p>Guard :</p><ul></ul><p>Selection :</p><ul></ul><p>Transformation :</p><ul></ul><table><tr><td><div class="element">Flow <b>&lt;flow&gt;</div></td></tr></table><p>From <a href="index.html#reffork activity node129029"><b>fork activity node</b></a> To <a href="index.html#refactivity object128261"><b>build Tool</b></a></p><p>Weight :</p><ul></ul><p>Guard :</p><ul></ul><p>Selection :</p><ul></ul><p>Transformation :</p><ul></ul></div>
<a name="refexpansion region128261"></a>
<h4 class ="expansionregion">2.2.2.1.1.2 Expansion region build Processors</h4>
<h4 class ="expansionregion">2.3.2.1.1.2 Expansion region build Processors</h4>
<div class="sub">
<a name="refactivity object128261"></a>
<table><tr><td><div class="element">Activity object <b>build Tool</b></div></td></tr></table>
@ -771,65 +850,8 @@ Documentation</title>
<table><tr><td><div class="element">Class <b><a href="class134405.html#refclass134405"><b>NodeCreatorTool</b></a></b></div></td></tr></table>
</div>
</div>
<a name="refpackage129029"></a>
<h3 class ="package">2.2.3 Package Controller</h3>
<div class="sub">
<a name="refclass view128389"></a>
<h4 class ="view">2.2.3.1 Class View Controller Workings</h4>
<div class="sub">
<a name="refclass diagram128645"></a>
<p align="center"><img src="fig128645.png" alt="" /></p>
<p align="center"><b>Controller Entities</b></p><p><br /></p><p><br /></p>
<a name="refactivity128133"></a>
<h4 class ="activity">2.2.3.1.1 Activity configure Render</h4>
<p>Pre Condition :</p><ul></ul><p>Post Condition :</p><ul></ul><div class="sub">
<a name="refactivity diagram129541"></a>
<p align="center"><img src="fig129541.png" alt="" /></p>
<p align="center"><b>the render configuration flow</b></p><p><br /></p><p><br /></p>
<a name="refactivity parameter128005"></a>
<table><tr><td><div class="element">Activity action pin <b>Render Request</b></div></td></tr></table>
<p>Direction : input</p><p>Type : </p><p>Selection :</p><ul></ul><div class="sub">
<table><tr><td><div class="element">Flow <b>&lt;flow&gt;</div></td></tr></table><p>From <a href="index.html#refactivity parameter128005"><b>Render Request</b></a> To <a href="index.html#refopaque activity action128389"><b>determine Render Params</b></a></p><p>Weight :</p><ul></ul><p>Guard :</p><ul></ul><p>Selection :</p><ul></ul><p>Transformation :</p><ul></ul></div>
<a name="refopaque activity action128133"></a>
<table><tr><td><div class="element">Opaque activity action <b>setup StateProxy</b></div></td></tr></table>
<p>Defined in <a href="index.html#refactivity128133"><b>configure Render</b></a></p><p>Pre Condition :</p><ul></ul><p>Post Condition :</p><ul></ul><p>Behavior :</p><ul></ul><div class="sub">
<table><tr><td><div class="element">Flow <b>&lt;flow&gt;</div></td></tr></table><p>From <a href="index.html#refopaque activity action128133"><b>setup StateProxy</b></a> To <a href="index.html#refdecision activity node128389"><b>build necessary?</b></a></p><p>Weight :</p><ul></ul><p>Guard :</p><ul></ul><p>Selection :</p><ul></ul><p>Transformation :</p><ul></ul></div>
<a name="refdecision activity node128389"></a>
<a name="refdecision activity node128389"></a>
<table><tr><td><div class="element">Decision activity node <b>build necessary?</b></div></td></tr></table>
<p>Defined in <a href="index.html#refactivity128133"><b>configure Render</b></a></p><div class="sub">
<table><tr><td><div class="element">Flow <b>&lt;flow&gt;</div></td></tr></table><p>From <a href="index.html#refdecision activity node128389"><b>build necessary?</b></a> To <a href="index.html#refopaque activity action128517"><b>build Render Engine</b></a></p><p>Weight :</p><ul></ul><p>Guard :</p><ul><li>OCL : <pre>
build necessary</pre></li></ul><p>Selection :</p><ul></ul><p>Transformation :</p><ul></ul><table><tr><td><div class="element">Flow <b>&lt;flow&gt;</div></td></tr></table><p>From <a href="index.html#refdecision activity node128389"><b>build necessary?</b></a> To <a href="index.html#refmerge activity node128773"><b>merge activity node</b></a></p><p>Weight :</p><ul></ul><p>Guard :</p><ul><li>OCL : <pre>
reuse exiting Engine</pre></li></ul><p>Selection :</p><ul></ul><p>Transformation :</p><ul></ul></div>
<a name="refopaque activity action128005"></a>
<table><tr><td><div class="element">Opaque activity action <b>setup Build Params</b></div></td></tr></table>
<p>Defined in <a href="index.html#refactivity128133"><b>configure Render</b></a></p><p>Pre Condition :</p><ul></ul><p>Post Condition :</p><ul></ul><p>Behavior :</p><ul></ul><a name="refmerge activity node128773"></a>
<a name="refmerge activity node128773"></a>
<table><tr><td><div class="element">Merge activity node <b></b></div></td></tr></table>
<p>Defined in <a href="index.html#refactivity128133"><b>configure Render</b></a></p><div class="sub">
<table><tr><td><div class="element">Flow <b>&lt;flow&gt;</div></td></tr></table><p>From <a href="index.html#refmerge activity node128773"><b>merge activity node</b></a> To <a href="index.html#refactivity final128901"><b>activity final</b></a></p><p>Weight :</p><ul></ul><p>Guard :</p><ul></ul><p>Selection :</p><ul></ul><p>Transformation :</p><ul></ul></div>
<a name="refexpansion region128005"></a>
<h4 class ="expansionregion">2.2.3.1.1.1 Expansion region determine Render Params</h4>
<a name="refopaque activity action128389"></a>
<table><tr><td><div class="element">Opaque activity action <b>determine Render Params</b></div></td></tr></table>
<p>Diagram : <a href="index.html#refactivity diagram129541"><b>the render configuration flow</b></a></p>
<p>Defined in <a href="index.html#refactivity128133"><b>configure Render</b></a></p><p>Pre Condition :</p><ul></ul><p>Post Condition :</p><ul></ul><p>Behavior :</p><ul></ul><div class="sub">
<table><tr><td><div class="element">Flow <b>&lt;flow&gt;</div></td></tr></table><p>From <a href="index.html#refopaque activity action128389"><b>determine Render Params</b></a> To <a href="index.html#refopaque activity action128133"><b>setup StateProxy</b></a></p><p>Weight :</p><ul></ul><p>Guard :</p><ul></ul><p>Selection :</p><ul></ul><p>Transformation :</p><ul></ul></div>
<a name="refopaque activity action128517"></a>
<table><tr><td><div class="element">Opaque activity action <b>build Render Engine</b></div></td></tr></table>
<p>Defined in <a href="index.html#refactivity128133"><b>configure Render</b></a></p><p>Pre Condition :</p><ul></ul><p>Post Condition :</p><ul></ul><p>Behavior :</p><ul></ul><div class="sub">
<table><tr><td><div class="element">Flow <b>&lt;flow&gt;</div></td></tr></table><p>From <a href="index.html#refopaque activity action128517"><b>build Render Engine</b></a> To <a href="index.html#refmerge activity node128773"><b>merge activity node</b></a></p><p>Weight :</p><ul></ul><p>Guard :</p><ul></ul><p>Selection :</p><ul></ul><p>Transformation :</p><ul></ul></div>
<a name="refactivity final128901"></a>
<a name="refactivity final128901"></a>
<table><tr><td><div class="element">Activity final <b></b></div></td></tr></table>
<p>Defined in <a href="index.html#refactivity128133"><b>configure Render</b></a></p></div>
<table><tr><td><div class="element">Class <b><a href="class130309.html#refclass130309"><b>ControllerFacade</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class130437.html#refclass130437"><b>PathManager</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class130949.html#refclass130949"><b>RenderState</b></a></b></div></td></tr></table>
</div>
</div>
<a name="refuse case view128261"></a>
<h3 class ="view">2.2.4 Use Case View config examples</h3>
<h3 class ="view">2.3.3 Use Case View config examples</h3>
<div class="sub">
<a name="refobject diagram131333"></a>
<p align="center"><img src="fig131333.png" alt="" /></p>
@ -847,10 +869,10 @@ reuse exiting Engine</pre></li></ul><p>Selection :</p><ul></ul><p>Transformation
<table><tr><td><div class="element">Class instance <b></div></td></tr></table><p>type :<a href="class128645.html#refclass128645"><b>Placement</b></a></p></div>
</div>
<a name="refpackage128389"></a>
<h2 class ="package">2.3 Package RenderEngine</h2>
<h2 class ="package">2.4 Package RenderEngine</h2>
<div class="sub">
<a name="refdeployment view128005"></a>
<h3 class ="view">2.3.1 Deployment View Engine Parts</h3>
<h3 class ="view">2.4.1 Deployment View Engine Parts</h3>
<div class="sub">
<a name="refdeployment diagram128261"></a>
<p align="center"><img src="fig128261.png" alt="" /></p>
@ -869,7 +891,7 @@ reuse exiting Engine</pre></li></ul><p>Selection :</p><ul></ul><p>Transformation
<table><tr><td><div class="element">Node <b>State</b></div></td></tr></table>
</div>
<a name="refclass view128133"></a>
<h3 class ="view">2.3.2 Class View Engine Workings</h3>
<h3 class ="view">2.4.2 Class View Engine Workings</h3>
<div class="sub">
<a name="refclass diagram128389"></a>
<p align="center"><img src="fig128389.png" alt="" /></p>
@ -915,7 +937,7 @@ reuse exiting Engine</pre></li></ul><p>Selection :</p><ul></ul><p>Transformation
</div>
</div>
<a name="refuse case view128005"></a>
<h2 class ="view">2.4 Use Case View Renderengine Use</h2>
<h2 class ="view">2.5 Use Case View Renderengine Use</h2>
<div class="sub">
<a name="refobject diagram128773"></a>
<p align="center"><img src="fig128773.png" alt="" /></p>
@ -943,11 +965,9 @@ reuse exiting Engine</pre></li></ul><p>Selection :</p><ul></ul><p>Transformation
<table><tr><td><div class="element">Class instance <b>video1</div></td></tr></table><p>type :<a href="class128389.html#refclass128389"><b>Track</b></a></p><a name="refclass instance128645"></a>
<table><tr><td><div class="element">Class instance <b>vid_A</div></td></tr></table><p>type :<a href="class128901.html#refclass128901"><b>Clip</b></a></p><p>attributes :<ul>
<li><a href="class128517.html#refattribute128517"><b>length</b></a> = 5</li>
<li><a href="class128901.html#refattribute128645"><b>start</b></a> = 100</li>
</ul></p><a name="refclass instance128773"></a>
<table><tr><td><div class="element">Class instance <b>aud_A</div></td></tr></table><p>type :<a href="class128901.html#refclass128901"><b>Clip</b></a></p><p>attributes :<ul>
<li><a href="class128517.html#refattribute128517"><b>length</b></a> = 8820</li>
<li><a href="class128901.html#refattribute128645"><b>start</b></a> = 176400</li>
</ul></p><a name="refclass instance128901"></a>
<table><tr><td><div class="element">Class instance <b>audio1</div></td></tr></table><p>type :<a href="class128389.html#refclass128389"><b>Track</b></a></p><a name="refclass instance129029"></a>
<table><tr><td><div class="element">Class instance <b></div></td></tr></table><p>type :<a href="class129797.html#refclass129797"><b>ExplicitPlacement</b></a></p><p>attributes :<ul>
@ -958,9 +978,8 @@ reuse exiting Engine</pre></li></ul><p>Selection :</p><ul></ul><p>Transformation
<table><tr><td><div class="element">Class instance <b></div></td></tr></table><p>type :<a href="class128261.html#refclass128261"><b>Fixture</b></a></p><a name="refclass instance129413"></a>
<table><tr><td><div class="element">Class instance <b>vid_A</div></td></tr></table><p>type :<a href="class128901.html#refclass128901"><b>Clip</b></a></p><p>attributes :<ul>
<li><a href="class128517.html#refattribute128517"><b>length</b></a> = 5</li>
<li><a href="class128901.html#refattribute128645"><b>start</b></a> = 100</li>
</ul></p><a name="refclass instance129541"></a>
<table><tr><td><div class="element">Class instance <b></div></td></tr></table><p>type :<a href="class128133.html#refclass128133"><b>EDL</b></a></p><a name="refclass instance129669"></a>
<table><tr><td><div class="element">Class instance <b></div></td></tr></table><p>type :<a href="class128133.html#refclass128133"><b>Seq</b></a></p><a name="refclass instance129669"></a>
<table><tr><td><div class="element">Class instance <b>refPoint</div></td></tr></table><p>type :<a href="class129669.html#refclass129669"><b>Label</b></a></p><p>attributes :<ul>
<li><a href="class128517.html#refattribute128517"><b>length</b></a> = 0</li>
</ul></p><a name="refclass instance129797"></a>
@ -969,7 +988,6 @@ reuse exiting Engine</pre></li></ul><p>Selection :</p><ul></ul><p>Transformation
</ul></p><a name="refclass instance129925"></a>
<table><tr><td><div class="element">Class instance <b>vid_A</div></td></tr></table><p>type :<a href="class128901.html#refclass128901"><b>Clip</b></a></p><p>attributes :<ul>
<li><a href="class128517.html#refattribute128517"><b>length</b></a> = 5</li>
<li><a href="class128901.html#refattribute128645"><b>start</b></a> = 100</li>
</ul></p><a name="refclass instance130053"></a>
<table><tr><td><div class="element">Class instance <b></div></td></tr></table><p>type :<a href="class129413.html#refclass129413"><b>RelativeLocation</b></a></p><p>attributes :<ul>
<li><a href="class129413.html#refattribute128133"><b>relType</b></a> = SAMETIME</li>
@ -978,7 +996,7 @@ reuse exiting Engine</pre></li></ul><p>Selection :</p><ul></ul><p>Transformation
</ul></p><a name="refclass instance130181"></a>
<table><tr><td><div class="element">Class instance <b></div></td></tr></table><p>type :<a href="class129029.html#refclass129029"><b>Effect</b></a></p><p>attributes :<ul>
<li><a href="class128517.html#refattribute128517"><b>length</b></a> = 3</li>
<li><a href="class129029.html#refattribute128901"><b>plugID</b></a> = "Hue"</li>
<li><a href="class129029.html#refattribute128901"><b>plugin</b></a> = "Hue"</li>
</ul></p><a name="refclass instance130309"></a>
<table><tr><td><div class="element">Class instance <b></div></td></tr></table><p>type :<a href="class129413.html#refclass129413"><b>RelativeLocation</b></a></p><p>attributes :<ul>
<li><a href="class129413.html#refattribute129029"><b>offset</b></a> = +3</li>
@ -988,7 +1006,7 @@ reuse exiting Engine</pre></li></ul><p>Selection :</p><ul></ul><p>Transformation
</ul></p><a name="refclass instance130437"></a>
<table><tr><td><div class="element">Class instance <b></div></td></tr></table><p>type :<a href="class129029.html#refclass129029"><b>Effect</b></a></p><p>attributes :<ul>
<li><a href="class128517.html#refattribute128517"><b>length</b></a> = 3</li>
<li><a href="class129029.html#refattribute128901"><b>plugID</b></a> = "Hue"</li>
<li><a href="class129029.html#refattribute128901"><b>plugin</b></a> = "Hue"</li>
</ul></p><a name="refclass instance130565"></a>
<table><tr><td><div class="element">Class instance <b></div></td></tr></table><p>type :<a href="class129797.html#refclass129797"><b>ExplicitPlacement</b></a></p><p>attributes :<ul>
<li><a href="class129797.html#refattribute128261"><b>time</b></a> = 5</li>
@ -1162,11 +1180,23 @@ reuse exiting Engine</pre></li></ul><p>Selection :</p><ul></ul><p>Transformation
<p>GUI is here just a container to hold any entities considered to be User Interface related, which is not in focus for this Design draft<br /></p><a name="refpackage128517"></a>
<h1 class ="package">5 Package CommonLib</h1>
<div class="sub">
<a name="refclass view129285"></a>
<h2 class ="view">5.1 Class View StreamType</h2>
<div class="sub">
<a name="refclass diagram132485"></a>
<p align="center"><img src="fig132485.png" alt="" /></p>
<p align="center"><b>Stream Type Framework</b></p><p><br /></p><p><br /></p>
<table><tr><td><div class="element">Class <b><a href="class144773.html#refclass144773"><b>StreamType</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class144901.html#refclass144901"><b>Prototype</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class145029.html#refclass145029"><b>ImplFacade</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class145157.html#refclass145157"><b>StreamTypeID</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class145285.html#refclass145285"><b>MediaKind</b></a></b></div></td></tr></table>
</div>
<a name="refpackage131077"></a>
<h2 class ="package">5.1 Package ConfigQuery</h2>
<h2 class ="package">5.2 Package ConfigQuery</h2>
<div class="sub">
<a name="refcomponent view128261"></a>
<h3 class ="view">5.1.1 Component View Query System overview</h3>
<h3 class ="view">5.2.1 Component View Query System overview</h3>
<div class="sub">
<a name="refcomponent diagram131589"></a>
<p align="center"><img src="fig131589.png" alt="" /></p>
@ -1182,7 +1212,7 @@ reuse exiting Engine</pre></li></ul><p>Selection :</p><ul></ul><p>Transformation
<table><tr><td><div class="element">Component <b>DefaultsManager</b></div></td></tr></table>
</div>
<a name="refclass view129157"></a>
<h3 class ="view">5.1.2 Class View query</h3>
<h3 class ="view">5.2.2 Class View query</h3>
<div class="sub">
<a name="refclass diagram131461"></a>
<p align="center"><img src="fig131461.png" alt="" /></p>
@ -1198,27 +1228,27 @@ reuse exiting Engine</pre></li></ul><p>Selection :</p><ul></ul><p>Transformation
<table><tr><td><div class="element">Class <b><a href="class141573.html#refclass141573"><b>DefaultsRegistry</b></a></b></div></td></tr></table>
</div>
<a name="refuse case view128389"></a>
<h3 class ="view">5.1.3 Use Case View query use</h3>
<h3 class ="view">5.2.3 Use Case View query use</h3>
<div class="sub">
<a name="refuse case diagram131717"></a>
<p align="center"><img src="fig131717.png" alt="" /></p>
<p align="center"><b>when to query</b></p><p><br /></p><p><br /></p>
<a name="refuse case128517"></a>
<h4 class ="usecase">5.1.3.1 Use Case create specific object</h4>
<h4 class ="usecase">5.2.3.1 Use Case create specific object</h4>
<a name="refuse case128645"></a>
<h4 class ="usecase">5.1.3.2 Use Case use "default" object</h4>
<h4 class ="usecase">5.2.3.2 Use Case use "default" object</h4>
<div class="sub">
</div>
<a name="refuse case128773"></a>
<h4 class ="usecase">5.1.3.3 Use Case load object from session</h4>
<h4 class ="usecase">5.2.3.3 Use Case load object from session</h4>
<a name="refuse case128901"></a>
<h4 class ="usecase">5.1.3.4 Use Case add new object to session</h4>
<h4 class ="usecase">5.2.3.4 Use Case add new object to session</h4>
<table><tr><td><div class="element">Class <b><a href="class141701.html#refclass141701"><b>User</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class141829.html#refclass141829"><b>Serializer</b></a></b></div></td></tr></table>
<a name="refuse case129029"></a>
<h4 class ="usecase">5.1.3.5 Use Case ConfigQuery</h4>
<h4 class ="usecase">5.2.3.5 Use Case ConfigQuery</h4>
<a name="refuse case129157"></a>
<h4 class ="usecase">5.1.3.6 Use Case need sub object</h4>
<h4 class ="usecase">5.2.3.6 Use Case need sub object</h4>
<a name="refcollaboration diagram131845"></a>
<p align="center"><img src="fig131845.png" alt="" /></p>
<p align="center"><b>"default" object</b></p><p><br /></p><p><br /></p>
@ -1226,7 +1256,7 @@ reuse exiting Engine</pre></li></ul><p>Selection :</p><ul></ul><p>Transformation
<table><tr><td><div class="element">Class instance <b>predicate impl</div></td></tr></table><p>type :<a href="class140805.html#refclass140805"><b>TypeHandler</b></a></p></div>
</div>
<a name="refclass view128773"></a>
<h2 class ="view">5.2 Class View error</h2>
<h2 class ="view">5.3 Class View error</h2>
<div class="sub">
<a name="refclass diagram130181"></a>
<p align="center"><img src="fig130181.png" alt="" /></p>
@ -1240,7 +1270,7 @@ reuse exiting Engine</pre></li></ul><p>Selection :</p><ul></ul><p>Transformation
<table><tr><td><div class="element">Class <b><a href="class136325.html#refclass136325"><b>std::exception</b></a></b></div></td></tr></table>
</div>
<a name="refclass view128645"></a>
<h2 class ="view">5.3 Class View Service Components</h2>
<h2 class ="view">5.4 Class View Service Components</h2>
<div class="sub">
<table><tr><td><div class="element">Class <b><a href="class140293.html#refclass140293"><b>Applicable</b></a></b></div></td></tr></table>
<table><tr><td><div class="element">Class <b><a href="class140037.html#refclass140037"><b>Tool</b></a></b></div></td></tr></table>
@ -1250,7 +1280,7 @@ reuse exiting Engine</pre></li></ul><p>Selection :</p><ul></ul><p>Transformation
<table><tr><td><div class="element">Class <b><a href="class135429.html#refclass135429"><b>Appconfig</b></a></b></div></td></tr></table>
</div>
<a name="refclass view128138"></a>
<h2 class ="view">5.4 Class View Posix Threads Abstraction</h2>
<h2 class ="view">5.5 Class View Posix Threads Abstraction</h2>
<p>C++ wrapers for pthreads<br /></p>
<div class="sub">
<table><tr><td><div class="element">Class <b><a href="class128138.html#refclass128138"><b>Thread</b></a></b></div></td></tr></table>
@ -1258,7 +1288,7 @@ reuse exiting Engine</pre></li></ul><p>Selection :</p><ul></ul><p>Transformation
<table><tr><td><div class="element">Class <b><a href="class128394.html#refclass128394"><b>Mutex</b></a></b></div></td></tr></table>
</div>
<a name="refclass view128266"></a>
<h2 class ="view">5.5 Class View SmartPointers</h2>
<h2 class ="view">5.6 Class View SmartPointers</h2>
<div class="sub">
<table><tr><td><div class="element">Class <b><a href="class128906.html#refclass128906"><b>SmartPointer</b></a></b></div></td></tr></table>
</div>

View file

@ -17,8 +17,8 @@
<table>
<tr bgcolor=#f0f0f0><td align=center><b>Name</b></td><td align=center><b>Kind</b></td><td align=center><b>Description</b></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#reftransition129797" target = "projectFrame"><b>&lt;flow&gt;</b></a></td><td>transition</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#reftransition129541" target = "projectFrame"><b>&lt;flow&gt;</b></a></td><td>transition</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#reftransition129797" target = "projectFrame"><b>&lt;flow&gt;</b></a></td><td>transition</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#reftransition129669" target = "projectFrame"><b>&lt;flow&gt;</b></a></td><td>transition</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#reftransition130309" target = "projectFrame"><b>&lt;flow&gt;</b></a></td><td>transition</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#reftransition131205" target = "projectFrame"><b>&lt;flow&gt;</b></a></td><td>transition</td><td></td></tr>
@ -28,8 +28,8 @@
<tr bgcolor=#f0f0f0><td><a href="index.html#reftransition131461" target = "projectFrame"><b>&lt;flow&gt;</b></a></td><td>transition</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#reftransition130693" target = "projectFrame"><b>&lt;flow&gt;</b></a></td><td>transition</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#reftransition129029" target = "projectFrame"><b>&lt;flow&gt;</b></a></td><td>transition</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#reftransition130181" target = "projectFrame"><b>&lt;flow&gt;</b></a></td><td>transition</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#reftransition131717" target = "projectFrame"><b>&lt;flow&gt;</b></a></td><td>transition</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#reftransition130181" target = "projectFrame"><b>&lt;flow&gt;</b></a></td><td>transition</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#reftransition131077" target = "projectFrame"><b>&lt;flow&gt;</b></a></td><td>transition</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#reftransition130949" target = "projectFrame"><b>&lt;flow&gt;</b></a></td><td>transition</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#reftransition130053" target = "projectFrame"><b>&lt;flow&gt;</b></a></td><td>transition</td><td></td></tr>

View file

@ -55,12 +55,12 @@
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass view128901" target = "projectFrame"><b>Assets</b></a></td><td>class view</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refattribute129285" target = "projectFrame"><b>ATTACH</b></a></td><td>attribute</td><td>attach subject to anchor (e.g. an effect to a clip)</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance137221" target = "projectFrame"><b>au1</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance128773" target = "projectFrame"><b>aud_A</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance131845" target = "projectFrame"><b>aud_a</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance128773" target = "projectFrame"><b>aud_A</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance131205" target = "projectFrame"><b>audio</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance128389" target = "projectFrame"><b>audio1</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance128901" target = "projectFrame"><b>audio1</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance130821" target = "projectFrame"><b>audio1</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance128901" target = "projectFrame"><b>audio1</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance128389" target = "projectFrame"><b>audio1</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact130309" target = "projectFrame"><b>auto</b></a></td><td>artifact</td><td>Media Object holding automation data</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class129925.html#refclass129925" target = "projectFrame"><b>Auto</b></a></td><td>class</td><td>Automation data for some parameter (i.e. a time varying function)</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass diagram129669" target = "projectFrame"><b>Automation Entities</b></a></td><td>class diagram</td><td></td></tr>

View file

@ -26,38 +26,38 @@
<tr bgcolor=#f0f0f0><td><a href="class137221.html#refclass137221" target = "projectFrame"><b>Category</b></a></td><td>class</td><td>tree like classification of Assets</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact135941" target = "projectFrame"><b>category</b></a></td><td>artifact</td><td>tree like classification of Assets</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refattribute130309" target = "projectFrame"><b>cause</b></a></td><td>attribute</td><td>a copy of the first exception encountered in this exception chain</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation134277" target = "projectFrame"><b>chain</b></a></td><td>operation</td><td>create and add another Placement for this media object, thus increasingly constraining the (possible) position of this object.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation145413" target = "projectFrame"><b>chain</b></a></td><td>relation</td><td>Chain of additional Placements further constraining the position of this MObject</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation134277" target = "projectFrame"><b>chain</b></a></td><td>operation</td><td>create and add another Placement for this media object, thus increasingly constraining the (possible) position of this object.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation129633" target = "projectFrame"><b>checked_in</b></a></td><td>relation</td><td>checked_in objects are subject of cache aging and must be not in use</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation129290" target = "projectFrame"><b>checked_out</b></a></td><td>relation</td><td>this list keeps all mappings which are in use, and thus prevents them from Cache aging</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance135685" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance135557" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance135429" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance135301" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance135173" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance135045" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance134917" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance134789" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance134661" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance135813" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance132229" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance130053" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance132485" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance133509" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance130565" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance129797" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance130437" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance129029" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance129541" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance130309" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance129285" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance128005" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance128133" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance132357" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance131589" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance128261" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance135685" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance135173" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance134917" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance135557" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance135429" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance135045" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance130693" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance130309" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance130437" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance128261" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance129029" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance128005" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance132229" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance132357" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance133509" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance129797" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance131589" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance128133" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance130053" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance130181" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance129285" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance132485" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance130565" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance129541" target = "projectFrame"><b>class instance</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation133765" target = "projectFrame"><b>clear</b></a></td><td>operation</td><td>clear current session contents <br />without resetting overall session config.<br />Afterwards, the session will contain only one <br />empty EDL, while all Assets are retained.<br /></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refcomponent131077" target = "projectFrame"><b>client code</b></a></td><td>component</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class137349.html#refclass137349" target = "projectFrame"><b>Clip</b></a></td><td>class</td><td>bookkeeping (asset) view of a media clip.</td></tr>
@ -96,9 +96,9 @@
<tr bgcolor=#f0f0f0><td><a href="index.html#refopaque activity action129029" target = "projectFrame"><b>connect</b></a></td><td>opaque activity action</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact139397" target = "projectFrame"><b>constraint</b></a></td><td>artifact</td><td>LocatingPin representing an directive by the user that<br />must not be violated</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class130181.html#refclass130181" target = "projectFrame"><b>Constraint</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage130693" target = "projectFrame"><b>control</b></a></td><td>package</td><td>sourcecode package<br /><br />The Processing and Render Controller,<br />and the Proc-Layer dispatcher</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage129029" target = "projectFrame"><b>Control</b></a></td><td>package</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refcomponent128261" target = "projectFrame"><b>Controller</b></a></td><td>component</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage129029" target = "projectFrame"><b>Controller</b></a></td><td>package</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage130693" target = "projectFrame"><b>controller</b></a></td><td>package</td><td>sourcecode package<br /><br />The Processing and Render Controller,<br />located within the MObject Subsystem</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass diagram128645" target = "projectFrame"><b>Controller Entities</b></a></td><td>class diagram</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass view128389" target = "projectFrame"><b>Controller Workings</b></a></td><td>class view</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class130309.html#refclass130309" target = "projectFrame"><b>ControllerFacade</b></a></td><td>class</td><td>Provides unified access to the Proc-Subsystem Controller. Especially, this Facade class provides the functions to get a render engine to carry out actual renderings.</td></tr>

View file

@ -19,7 +19,6 @@
<tr bgcolor=#f0f0f0><td align=center><b>Name</b></td><td align=center><b>Kind</b></td><td align=center><b>Description</b></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact128645" target = "projectFrame"><b>edl</b></a></td><td>artifact</td><td>the (high level) Edit Decision List within the current Session</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refcomponent128389" target = "projectFrame"><b>EDL</b></a></td><td>component</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class128133.html#refclass128133" target = "projectFrame"><b>EDL</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refobject diagram128773" target = "projectFrame"><b>EDL Example1</b></a></td><td>object diagram</td><td>A simple example showing how the actual objects are placed in the Fixture (=definitive playlist). It shows a Video and Audio clip placed on two tracks</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refobject diagram128901" target = "projectFrame"><b>EDL Example2</b></a></td><td>object diagram</td><td>More complex example showing the Object graph in the EDL and how it is linked into the Fixture to yield the actual locations. In this example, an HUE Effect is applied on a part of the Clip</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation128005" target = "projectFrame"><b>edls</b></a></td><td>relation</td><td></td></tr>
@ -27,6 +26,7 @@
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact129541" target = "projectFrame"><b>effect</b></a></td><td>artifact</td><td>EDL representation of a pluggable and automatable effect.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact137221" target = "projectFrame"><b>effect</b></a></td><td>artifact</td><td>Effect or media processing component</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class129029.html#refclass129029" target = "projectFrame"><b>Effect</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation131717" target = "projectFrame"><b>effectiveTimeline</b></a></td><td>relation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation138885" target = "projectFrame"><b>elements</b></a></td><td>relation</td><td>relevant MObjects comprising this segment. TODO: actually necessary??</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation132997" target = "projectFrame"><b>enable</b></a></td><td>operation</td><td>change the enabled status of this asset. Note the corresponding #isActive predicate may depend on the enablement status of parent assets as well</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refattribute129541" target = "projectFrame"><b>end</b></a></td><td>attribute</td><td>end of the timerange (excl)</td></tr>

View file

@ -36,8 +36,8 @@
<tr bgcolor=#f0f0f0><td><a href="class129285.html#refclass129285" target = "projectFrame"><b>FixedLocation</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refactivity object128005" target = "projectFrame"><b>Fixture</b></a></td><td>activity object</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact128773" target = "projectFrame"><b>fixture</b></a></td><td>artifact</td><td>the (low level) representation of the EDL with concrete placement data</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refcomponent128517" target = "projectFrame"><b>Fixture</b></a></td><td>component</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class128261.html#refclass128261" target = "projectFrame"><b>Fixture</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refcomponent128517" target = "projectFrame"><b>Fixture</b></a></td><td>component</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#reffork activity node129029" target = "projectFrame"><b>fork activity node</b></a></td><td>fork activity node</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class128821.html#refclass128821" target = "projectFrame"><b>Frame</b></a></td><td>class</td><td>Frames are just a low level lump of continous memory, most parts are opaque. Frames are memory sensitive, they will be small constant sized structures which can be efficently managed in a pool.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refnode128645" target = "projectFrame"><b>Frame</b></a></td><td>node</td><td></td></tr>

View file

@ -46,6 +46,7 @@
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation130949" target = "projectFrame"><b>getValue</b></a></td><td>operation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class133637.html#refclass133637" target = "projectFrame"><b>GLBuf</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact134149" target = "projectFrame"><b>glbuf</b></a></td><td>artifact</td><td>a buffer and render process holding a Video frame for OpenGL rendering</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation160005" target = "projectFrame"><b>globalBusses</b></a></td><td>relation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact133253" target = "projectFrame"><b>glpipe</b></a></td><td>artifact</td><td>specialized connection element for handling OpenGL implementation details</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact133637" target = "projectFrame"><b>glrender</b></a></td><td>artifact</td><td>Representation of a OpenGL accellerated Video render process</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refattribute131077" target = "projectFrame"><b>groups</b></a></td><td>attribute</td><td>additional classification, selections or departments this asset belongs to. Groups are optional, non-exclusive and may be overlapping.</td></tr>

View file

@ -18,11 +18,12 @@
<table>
<tr bgcolor=#f0f0f0><td align=center><b>Name</b></td><td align=center><b>Kind</b></td><td align=center><b>Description</b></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refattribute130437" target = "projectFrame"><b>id</b></a></td><td>attribute</td><td>Asset primary key.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class145029.html#refclass145029" target = "projectFrame"><b>ImplFacade</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass diagram128309" target = "projectFrame"><b>In Memory Database</b></a></td><td>class diagram</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refactivity action pin128133" target = "projectFrame"><b>inFixture</b></a></td><td>activity action pin</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance132869" target = "projectFrame"><b>input</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance134149" target = "projectFrame"><b>input</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance131461" target = "projectFrame"><b>input</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance134149" target = "projectFrame"><b>input</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance132869" target = "projectFrame"><b>input</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation131461" target = "projectFrame"><b>instance</b></a></td><td>operation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation143621" target = "projectFrame"><b>instructions</b></a></td><td>relation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass view129029" target = "projectFrame"><b>Interface</b></a></td><td>class view</td><td></td></tr>

View file

@ -31,6 +31,7 @@
<tr bgcolor=#f0f0f0><td><a href="class139525.html#refclass139525" target = "projectFrame"><b>MediaAccessFacade</b></a></td><td>class</td><td>provides functions for querying (opening) a media file, detecting the channels or streams found within this file, etc. Delegating to the actual backend functions</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refcomponent130181" target = "projectFrame"><b>MediaFactory</b></a></td><td>component</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class139397.html#refclass139397" target = "projectFrame"><b>MediaFactory</b></a></td><td>class</td><td>specialized Asset Factory for configuring (new) media asset instances based on existing media files on disk; can create placeholder assets as well</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class145285.html#refclass145285" target = "projectFrame"><b>MediaKind</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refmerge activity node128773" target = "projectFrame"><b>merge activity node</b></a></td><td>merge activity node</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class137093.html#refclass137093" target = "projectFrame"><b>Meta</b></a></td><td>class</td><td>key abstraction: metadata and organisational asset</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact136837" target = "projectFrame"><b>meta</b></a></td><td>artifact</td><td>key abstraction: metadata and organisational asset</td></tr>
@ -40,6 +41,7 @@
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage130181" target = "projectFrame"><b>mobject</b></a></td><td>package</td><td>sourcecode package<br /><br />MObject Subsystem<br />including the Session (EDL), Builder and Processing Controller</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage128261" target = "projectFrame"><b>MObject</b></a></td><td>package</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class128517.html#refclass128517" target = "projectFrame"><b>MObject</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class146053.html#refclass146053" target = "projectFrame"><b>Monitor</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refobject diagram131333" target = "projectFrame"><b>multichannel clip</b></a></td><td>object diagram</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class128394.html#refclass128394" target = "projectFrame"><b>Mutex</b></a></td><td>class</td><td>I provided a reworked Mutex class in my Cinelerra2 repository</td></tr>
</table>

View file

@ -31,10 +31,12 @@
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact129029" target = "projectFrame"><b>placement</b></a></td><td>artifact</td><td>Key Abstraction: a way to place and locate a Media Object</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class128645.html#refclass128645" target = "projectFrame"><b>Placement</b></a></td><td>class</td><td>used to specify the position of a MObject in the EDL. This can be done in various ways (absolute, relative). <br />Placement at the same time acts as (refcounting) smart pointer for accessing the MObject.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation129413" target = "projectFrame"><b>play</b></a></td><td>operation</td><td>TODO: will probably be handled differently (see Cehteh)</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class145925.html#refclass145925" target = "projectFrame"><b>PlayControl</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class146437.html#refclass146437" target = "projectFrame"><b>PlayheadCursor</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refnode128261" target = "projectFrame"><b>playlist</b></a></td><td>node</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact139525" target = "projectFrame"><b>plug</b></a></td><td>artifact</td><td>LocatingPin for requesting connection to some Port</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class140421.html#refclass140421" target = "projectFrame"><b>Plug</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refattribute128901" target = "projectFrame"><b>plugID</b></a></td><td>attribute</td><td>Identifier of the Plugin to be used</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refattribute128901" target = "projectFrame"><b>plugin</b></a></td><td>attribute</td><td>Identifier of the Plugin to be used</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class132485.html#refclass132485" target = "projectFrame"><b>PluginAdapter</b></a></td><td>class</td><td>Adapter used to integrage an effects processor in the render pipeline</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact133125" target = "projectFrame"><b>pluginadapter</b></a></td><td>artifact</td><td>Adapter for integrating various Effect processors in the render pipeline</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refnode128517" target = "projectFrame"><b>pnode</b></a></td><td>node</td><td></td></tr>
@ -63,8 +65,11 @@
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact132357" target = "projectFrame"><b>procnode</b></a></td><td>artifact</td><td>Key abstraction of the Render Engine: a Processing Node</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class138757.html#refclass138757" target = "projectFrame"><b>ProcPatt</b></a></td><td>class</td><td>special type of structural Asset representing information how to build some part of the render engine's processing nodes network.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact137989" target = "projectFrame"><b>procpatt</b></a></td><td>artifact</td><td>template for building some render processing network</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class145669.html#refclass145669" target = "projectFrame"><b>Project</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass view129413" target = "projectFrame"><b>Project Entities</b></a></td><td>class view</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class132229.html#refclass132229" target = "projectFrame"><b>Projector</b></a></td><td>class</td><td>Special video processing node used to scale and translate image data.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact132869" target = "projectFrame"><b>projector</b></a></td><td>artifact</td><td>video ProcNode for scaling and translating image data</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class144901.html#refclass144901" target = "projectFrame"><b>Prototype</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation138629" target = "projectFrame"><b>provider</b></a></td><td>relation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation135685" target = "projectFrame"><b>pull</b></a></td><td>operation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class143749.html#refclass143749" target = "projectFrame"><b>PullInput</b></a></td><td>class</td><td></td></tr>

View file

@ -39,6 +39,7 @@
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation132485" target = "projectFrame"><b>renderSegments</b></a></td><td>relation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class130949.html#refclass130949" target = "projectFrame"><b>RenderState</b></a></td><td>class</td><td>Encapsulates the logic used to get a "current render process" in accordance to the currentyl applicable controller settings. The provided StateProxy serves to hold any mutalbe state used in the render process, so the rest of the render engine can be stateless.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact131845" target = "projectFrame"><b>renderstate</b></a></td><td>artifact</td><td>renderengine state manager</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class146181.html#refclass146181" target = "projectFrame"><b>RenderTask</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refattribute128773" target = "projectFrame"><b>repr</b></a></td><td>attribute</td><td>human readable representation of the condition characterizing this allocaton, e.g. "t &gt;= 10"</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation133893" target = "projectFrame"><b>reset</b></a></td><td>operation</td><td>reset all session config and <br />start with a pristine default session.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation128005" target = "projectFrame"><b>resolve</b></a></td><td>operation</td><td>create an actual (explicit) placement while trying to satisfy the network of adjacent objects and placements.</td></tr>

View file

@ -28,12 +28,14 @@
<tr bgcolor=#f0f0f0><td><a href="index.html#refactivity object128389" target = "projectFrame"><b>segments</b></a></td><td>activity object</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refactivity object128133" target = "projectFrame"><b>segments</b></a></td><td>activity object</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation139013" target = "projectFrame"><b>segments</b></a></td><td>relation</td><td>the partitioning of the Timeline to be created by this tool.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class128133.html#refclass128133" target = "projectFrame"><b>Seq</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class146309.html#refclass146309" target = "projectFrame"><b>Sequence</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class141829.html#refclass141829" target = "projectFrame"><b>Serializer</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass view128645" target = "projectFrame"><b>Service Components</b></a></td><td>class view</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refcomponent128133" target = "projectFrame"><b>Session</b></a></td><td>component</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact138757" target = "projectFrame"><b>session</b></a></td><td>artifact</td><td>Interface: the session edited by the user</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass view128005" target = "projectFrame"><b>Session</b></a></td><td>class view</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage130437" target = "projectFrame"><b>session</b></a></td><td>package</td><td>sourcecode package<br /><br />Everything concerning the EDL and Session, within the MObject Subsystem</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass view128005" target = "projectFrame"><b>Session</b></a></td><td>class view</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class139653.html#refclass139653" target = "projectFrame"><b>Session</b></a></td><td>class</td><td>Primary Interface for all editing tasks.<br />The session contains defaults, all the assets being edited, and a set of EDL with the individual MObjects to be manipulated and rendered.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass diagram128133" target = "projectFrame"><b>Session structure</b></a></td><td>class diagram</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact128517" target = "projectFrame"><b>sessionimpl</b></a></td><td>artifact</td><td>holds the complete session data to be edited by the user</td></tr>
@ -52,7 +54,6 @@
<tr bgcolor=#f0f0f0><td><a href="class133765.html#refclass133765" target = "projectFrame"><b>Source</b></a></td><td>class</td><td>Source Node: represents a media source to pull data from.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact134277" target = "projectFrame"><b>source</b></a></td><td>artifact</td><td>Representation of a Media source</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refdeployment diagram129797" target = "projectFrame"><b>Source Overview</b></a></td><td>deployment diagram</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refattribute128645" target = "projectFrame"><b>start</b></a></td><td>attribute</td><td>startpos in source</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refattribute129413" target = "projectFrame"><b>start</b></a></td><td>attribute</td><td>begin of the timerange covered by this processor</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refattribute129925" target = "projectFrame"><b>start</b></a></td><td>attribute</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class132741.html#refclass132741" target = "projectFrame"><b>State</b></a></td><td>class</td><td></td></tr>
@ -65,11 +66,19 @@
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact130949" target = "projectFrame"><b>stateproxy</b></a></td><td>artifact</td><td>Key Interface representing a render process and encapsulating state</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class136325.html#refclass136325" target = "projectFrame"><b>std::exception</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class144517.html#refclass144517" target = "projectFrame"><b>Strategy</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass diagram132485" target = "projectFrame"><b>Stream Type Framework</b></a></td><td>class diagram</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass view129285" target = "projectFrame"><b>StreamType</b></a></td><td>class view</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact139653" target = "projectFrame"><b>streamtype</b></a></td><td>artifact</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class144773.html#refclass144773" target = "projectFrame"><b>StreamType</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class145157.html#refclass145157" target = "projectFrame"><b>StreamTypeID</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class136965.html#refclass136965" target = "projectFrame"><b>Struct</b></a></td><td>class</td><td>key abstraction: structural asset</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact136709" target = "projectFrame"><b>struct</b></a></td><td>artifact</td><td>key abstraction: structural asset</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass diagram131205" target = "projectFrame"><b>Struct-Asset Relations</b></a></td><td>class diagram</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class145413.html#refclass145413" target = "projectFrame"><b>STypeManager</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact139781" target = "projectFrame"><b>stypemanager</b></a></td><td>artifact</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation144901" target = "projectFrame"><b>subject</b></a></td><td>relation</td><td>Placement acts as smart pointer</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation144005" target = "projectFrame"><b>subPattern</b></a></td><td>relation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation159877" target = "projectFrame"><b>subSequences</b></a></td><td>relation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation147205" target = "projectFrame"><b>subTracks</b></a></td><td>relation</td><td>Child tracks in a tree structure</td></tr>
</table>
</body>

View file

@ -20,35 +20,38 @@
<tr bgcolor=#f0f0f0><td><a href="index.html#refactivity diagram129541" target = "projectFrame"><b>the render configuration flow</b></a></td><td>activity diagram</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refattribute130181" target = "projectFrame"><b>theApp_</b></a></td><td>attribute</td><td>holds the single instance and triggers initialization</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation128261" target = "projectFrame"><b>theFixture</b></a></td><td>relation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation131717" target = "projectFrame"><b>theTimeline</b></a></td><td>relation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class128138.html#refclass128138" target = "projectFrame"><b>Thread</b></a></td><td>class</td><td>We can basically reuse the Thread class design from Cinelerra2, Thread becomes a baseclass for all Threads </td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refattribute128261" target = "projectFrame"><b>time</b></a></td><td>attribute</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact134789" target = "projectFrame"><b>time</b></a></td><td>artifact</td><td>unified representation of a time point, including conversion functions</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class134917.html#refclass134917" target = "projectFrame"><b>Time</b></a></td><td>class</td><td>denotes a temporal position (time point), based on timeline start.<br /><br />investigate posix.4 realtime timers, wrap these here</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refnode128005" target = "projectFrame"><b>timeline</b></a></td><td>node</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class145541.html#refclass145541" target = "projectFrame"><b>Timeline</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass diagram132741" target = "projectFrame"><b>TimelineSequences</b></a></td><td>class diagram</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class145797.html#refclass145797" target = "projectFrame"><b>TimelineView</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage129925" target = "projectFrame"><b>tool</b></a></td><td>package</td><td>sourcecode package<br /><br />Tools and Utilities <br />(separate from the main cinelrra binary)</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class140037.html#refclass140037" target = "projectFrame"><b>Tool</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class130693.html#refclass130693" target = "projectFrame"><b>ToolFactory</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact130565" target = "projectFrame"><b>toolfactory</b></a></td><td>artifact</td><td>supply of Tool implementations for the Builder</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class137989.html#refclass137989" target = "projectFrame"><b>Track</b></a></td><td>class</td><td>structural asset holding the configuration of a track in the EDL</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation147333" target = "projectFrame"><b>track</b></a></td><td>relation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refattribute128389" target = "projectFrame"><b>track</b></a></td><td>attribute</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation147589" target = "projectFrame"><b>track</b></a></td><td>relation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact128901" target = "projectFrame"><b>track</b></a></td><td>artifact</td><td>A grouping device within the EDL. The corresponding Placement<br />by which this Track object is refered defines fallback placing<br />properties to be used by all objects placed on this track in<br />case they don't specify more concrete placements.<br />Typically, tracks are used do make default Port connections,<br />define a layer or pan for sound and for for disabling groups<br />of clips. Note tracks are grouped in a tree like fashion.<br /></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact137477" target = "projectFrame"><b>track</b></a></td><td>artifact</td><td>structural asset holding the configuration of a track in the EDL</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact128901" target = "projectFrame"><b>track</b></a></td><td>artifact</td><td>A grouping device within the EDL. The corresponding Placement<br />by which this Track object is refered defines fallback placing<br />properties to be used by all objects placed on this track in<br />case they don't specify more concrete placements.<br />Typically, tracks are used do make default Port connections,<br />define a layer or pan for sound and for for disabling groups<br />of clips. Note tracks are grouped in a tree like fashion.<br /></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation147333" target = "projectFrame"><b>track</b></a></td><td>relation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class128389.html#refclass128389" target = "projectFrame"><b>Track</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation142341" target = "projectFrame"><b>tracks</b></a></td><td>relation</td><td>elementary media assets comprising this compound</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refrelation161669" target = "projectFrame"><b>trackTree</b></a></td><td>relation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class131845.html#refclass131845" target = "projectFrame"><b>Trafo</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact132485" target = "projectFrame"><b>trafo</b></a></td><td>artifact</td><td>transforming processing Node </td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation134405" target = "projectFrame"><b>treat</b></a></td><td>operation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation129797" target = "projectFrame"><b>treat</b></a></td><td>operation</td><td>This operation is to be overloaded for the specific MObject subclasses to be treated.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation130693" target = "projectFrame"><b>treat</b></a></td><td>operation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation130565" target = "projectFrame"><b>treat</b></a></td><td>operation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation130437" target = "projectFrame"><b>treat</b></a></td><td>operation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation130309" target = "projectFrame"><b>treat</b></a></td><td>operation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation130565" target = "projectFrame"><b>treat</b></a></td><td>operation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation130693" target = "projectFrame"><b>treat</b></a></td><td>operation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation130437" target = "projectFrame"><b>treat</b></a></td><td>operation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation130181" target = "projectFrame"><b>treat</b></a></td><td>operation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation130053" target = "projectFrame"><b>treat</b></a></td><td>operation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation129925" target = "projectFrame"><b>treat</b></a></td><td>operation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refoperation130053" target = "projectFrame"><b>treat</b></a></td><td>operation</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class140805.html#refclass140805" target = "projectFrame"><b>TypeHandler</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class141317.html#refclass141317" target = "projectFrame"><b>TypeHandler&lt;Pipe&gt;</b></a></td><td>class</td><td></td></tr>
</table>

View file

@ -21,21 +21,21 @@
<tr bgcolor=#f0f0f0><td><a href="class133509.html#refclass133509" target = "projectFrame"><b>VFrame</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact134021" target = "projectFrame"><b>vframe</b></a></td><td>artifact</td><td>a buffer and render process holding a Video frame</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance137093" target = "projectFrame"><b>vid1</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance128645" target = "projectFrame"><b>vid_A</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance134021" target = "projectFrame"><b>vid_a</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance131717" target = "projectFrame"><b>vid_a</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance128645" target = "projectFrame"><b>vid_A</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance129413" target = "projectFrame"><b>vid_A</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance129925" target = "projectFrame"><b>vid_A</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance131717" target = "projectFrame"><b>vid_a</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance134533" target = "projectFrame"><b>video</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance132741" target = "projectFrame"><b>video</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance131077" target = "projectFrame"><b>video</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance133765" target = "projectFrame"><b>video</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance133637" target = "projectFrame"><b>video1</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance132997" target = "projectFrame"><b>video1</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance134277" target = "projectFrame"><b>video1</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance134533" target = "projectFrame"><b>video</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance128517" target = "projectFrame"><b>video1</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance134277" target = "projectFrame"><b>video1</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance133637" target = "projectFrame"><b>video1</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance129157" target = "projectFrame"><b>video1</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance130949" target = "projectFrame"><b>video1</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refclass instance132997" target = "projectFrame"><b>video1</b></a></td><td>class instance</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class140165.html#refclass140165" target = "projectFrame"><b>Visitable</b></a></td><td>class</td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage130949" target = "projectFrame"><b>visitor</b></a></td><td>package</td><td>sub-namespace for visitor library implementation</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refartifact139141" target = "projectFrame"><b>visitor</b></a></td><td>artifact</td><td>Acyclic Visitor library</td></tr>

View file

@ -20,14 +20,14 @@
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage128133" target = "projectFrame"><b>Asset</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage129541" target = "projectFrame"><b>backend</b></a></td><td>src</td><td>sourcecode package<br /><br />Data backend classes here...</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage129157" target = "projectFrame"><b>BackendLayer</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage130565" target = "projectFrame"><b>builder</b></a></td><td>src</td><td>sourcecode package<br /><br />The Builder creating the Render Engine,<br />located within the MObject Subsystem</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage128901" target = "projectFrame"><b>Builder</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage130565" target = "projectFrame"><b>builder</b></a></td><td>src</td><td>sourcecode package<br /><br />The Builder creating the Render Engine,<br />located within the MObject Subsystem</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage128645" target = "projectFrame"><b>codegen</b></a></td><td></td><td>This package is used to organize code generation by BOUML. It is considered useless after having generated the initial code skeleton.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage129413" target = "projectFrame"><b>common</b></a></td><td>src</td><td>sourcecode package<br /><br />Common library and helper classes</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage128517" target = "projectFrame"><b>CommonLib</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage131077" target = "projectFrame"><b>ConfigQuery</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage129029" target = "projectFrame"><b>Controller</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage130693" target = "projectFrame"><b>controller</b></a></td><td>src</td><td>sourcecode package<br /><br />The Processing and Render Controller,<br />located within the MObject Subsystem</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage130693" target = "projectFrame"><b>control</b></a></td><td>src</td><td>sourcecode package<br /><br />The Processing and Render Controller,<br />and the Proc-Layer dispatcher</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage129029" target = "projectFrame"><b>Control</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage128138" target = "projectFrame"><b>design</b></a></td><td></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage128005" target = "projectFrame"><b>design</b></a></td><td></td><td>All things concering the big picture.<br />Not a real code package, rather a container for design drafts, specifications, decisions.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="index.html#refpackage130309" target = "projectFrame"><b>engine</b></a></td><td>src</td><td>sourcecode package<br /><br />The Core Render Engine</td></tr>

View file

@ -69,12 +69,12 @@
<tr bgcolor=#f0f0f0><td><a href="class139781.html#refoperation134149"><b>save</b></a></td><td><a href="class139781.html#refclass139781"><b>SessManager</b></a></td><td>create a complete, serialized representation<br />of the current session config and contents.<br />@todo how to serialize, prameters, return value?</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class140293.html#refoperation134405"><b>treat</b></a></td><td><a href="class140293.html#refclass140293"><b>Applicable</b></a></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class134149.html#refoperation129797"><b>treat</b></a></td><td><a href="class134149.html#refclass134149"><b>BuilderTool</b></a></td><td>This operation is to be overloaded for the specific MObject subclasses to be treated.</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class134405.html#refoperation130437"><b>treat</b></a></td><td><a href="class134405.html#refclass134405"><b>NodeCreatorTool</b></a></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class134405.html#refoperation130309"><b>treat</b></a></td><td><a href="class134405.html#refclass134405"><b>NodeCreatorTool</b></a></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class134405.html#refoperation130565"><b>treat</b></a></td><td><a href="class134405.html#refclass134405"><b>NodeCreatorTool</b></a></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class134405.html#refoperation130437"><b>treat</b></a></td><td><a href="class134405.html#refclass134405"><b>NodeCreatorTool</b></a></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class134405.html#refoperation130693"><b>treat</b></a></td><td><a href="class134405.html#refclass134405"><b>NodeCreatorTool</b></a></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class134277.html#refoperation130053"><b>treat</b></a></td><td><a href="class134277.html#refclass134277"><b>SegmentationTool</b></a></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class134277.html#refoperation129925"><b>treat</b></a></td><td><a href="class134277.html#refclass134277"><b>SegmentationTool</b></a></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class134277.html#refoperation130053"><b>treat</b></a></td><td><a href="class134277.html#refclass134277"><b>SegmentationTool</b></a></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class134277.html#refoperation130181"><b>treat</b></a></td><td><a href="class134277.html#refclass134277"><b>SegmentationTool</b></a></td><td></td></tr>
<tr bgcolor=#f0f0f0><td><a href="class129333.html#refoperation128010"><b>useFile</b></a></td><td><a href="class129333.html#refclass129333"><b>FileProvider</b></a></td><td>Announces that the application intends to use this file with mode (READ|WRITE|READWRITE)</td></tr>
<tr bgcolor=#f0f0f0><td><a href="class129333.html#refoperation128138"><b>useTemporaryStorage</b></a></td><td><a href="class129333.html#refclass129333"><b>FileProvider</b></a></td><td>Provides a pool for interminate frames</td></tr>

View file

@ -18,7 +18,8 @@
liblumibackend_a_srcdir = $(top_srcdir)/src/backend
noinst_LIBRARIES += liblumibackend.a
liblumibackend_a_CFLAGS = $(CFLAGS) -std=gnu99 -Wextra -Wall -Werror
liblumibackend_a_CPPFLAGS = $(AM_CPPFLAGS) -DLUMIERA_PLUGIN_PATH="\"$(pkglibdir)\""
liblumibackend_a_CFLAGS = $(AM_CFLAGS) -std=gnu99 -Wextra -Wall -Werror
liblumibackend_a_SOURCES = \
$(liblumibackend_a_srcdir)/mediaaccessfacade.cpp \
@ -29,6 +30,8 @@ liblumibackend_a_SOURCES = \
$(liblumibackend_a_srcdir)/filehandlecache.c \
$(liblumibackend_a_srcdir)/interface.c \
$(liblumibackend_a_srcdir)/interfaceregistry.c \
$(liblumibackend_a_srcdir)/plugin.c \
$(liblumibackend_a_srcdir)/plugin_dynlib.c \
$(liblumibackend_a_srcdir)/config.c \
$(liblumibackend_a_srcdir)/config_typed.c \
$(liblumibackend_a_srcdir)/config_wordlist.c \
@ -47,6 +50,7 @@ noinst_HEADERS += \
$(liblumibackend_a_srcdir)/interface.h \
$(liblumibackend_a_srcdir)/interfaceregistry.h \
$(liblumibackend_a_srcdir)/interfacedescriptor.h \
$(liblumibackend_a_srcdir)/plugin.h \
$(liblumibackend_a_srcdir)/config.h \
$(liblumibackend_a_srcdir)/configentry.h \
$(liblumibackend_a_srcdir)/configitem.h \

View file

@ -228,20 +228,22 @@ LUMIERA_CONFIG_TYPES
* Get nth word of a wordlist.
* @param key key under which this wordlist is stored
* @param nth index of the word to get, starting with 0
* @param delims a string literal listing all characters which are treated as delimiters
* @return pointer to a tempbuf holding the nth word or NULL in case of error
*/
const char*
lumiera_config_wordlist_get_nth (const char* key, unsigned nth);
lumiera_config_wordlist_get_nth (const char* key, unsigned nth, const char* delims);
/**
* Find the index of a word in a wordlist.
* @param key key under which this wordlist is stored
* @param value word to find
* @param delims a string literal listing all characters which are treated as delimiters
* @return index of the first occurence of the word or -1 in case of failure
*/
int
lumiera_config_wordlist_find (const char* key, const char* value);
lumiera_config_wordlist_find (const char* key, const char* value, const char* delims);
/**
@ -254,20 +256,22 @@ lumiera_config_wordlist_find (const char* key, const char* value);
* @param value word to be replaced
* @param subst1 first replacement word
* @param subst2 second replacement word
* @param delims a string literal listing all characters which are treated as delimiters
* @return internal representation of the wordlist in a tmpbuf or NULL in case of an error
*/
const char*
lumiera_config_wordlist_replace (const char* key, const char* value, const char* subst1, const char* subst2);
lumiera_config_wordlist_replace (const char* key, const char* value, const char* subst1, const char* subst2, const char* delims);
/**
* Add a word to the end of a wordlist if it doesnt exist already
* @param key key under which this wordlist is stored
* @param value new word to add
* @param delims a string literal listing all characters which are treated as delimiters
* @return internal representation of the wordlist in a tmpbuf or NULL in case of an error
*/
const char*
lumiera_config_wordlist_add (const char* key, const char* value);
lumiera_config_wordlist_add (const char* key, const char* value, const char* delims);
// * {{{ lumiera_config_TYPE_set (const char* key, TYPE*value, const char* fmt) }}}
// Highlevel interface for different types, fmt is a printf format specifier for the desired format, when NULL, defaults apply.

View file

@ -19,25 +19,20 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
//TODO: Support library includes//
#include "lib/error.h"
#include "lib/safeclib.h"
//TODO: Lumiera header includes//
#include "backend/config.h"
//TODO: internal/static forward declarations//
extern LumieraConfig lumiera_global_config;
//TODO: System includes//
/**
* return nth word of a wordlist
*/
const char*
lumiera_config_wordlist_get_nth (const char* key, unsigned nth)
lumiera_config_wordlist_get_nth (const char* key, unsigned nth, const char* delims)
{
const char* value;
size_t len;
@ -47,8 +42,8 @@ lumiera_config_wordlist_get_nth (const char* key, unsigned nth)
for (;;)
{
value += strspn (value, " \t,;");
len = strcspn (value, " \t,;");
value += strspn (value, delims);
len = strcspn (value, delims);
if (!nth && *value)
break;
@ -64,7 +59,7 @@ lumiera_config_wordlist_get_nth (const char* key, unsigned nth)
int
lumiera_config_wordlist_find (const char* key, const char* value)
lumiera_config_wordlist_find (const char* key, const char* value, const char* delims)
{
const char* itr;
size_t vlen = strlen (value);
@ -75,8 +70,8 @@ lumiera_config_wordlist_find (const char* key, const char* value)
for (int idx = 0; *itr; itr += len, ++idx)
{
itr += strspn (itr, " \t,;");
len = strcspn (itr, " \t,;");
itr += strspn (itr, delims);
len = strcspn (itr, delims);
if (len == vlen && !strncmp (itr, value, vlen))
return idx;
@ -87,7 +82,7 @@ lumiera_config_wordlist_find (const char* key, const char* value)
const char*
lumiera_config_wordlist_replace (const char* key, const char* value, const char* subst1, const char* subst2)
lumiera_config_wordlist_replace (const char* key, const char* value, const char* subst1, const char* subst2, const char* delims)
{
const char* wordlist;
const char* str = NULL;
@ -106,28 +101,25 @@ lumiera_config_wordlist_replace (const char* key, const char* value, const char*
for (const char* itr = start; *itr; itr += len)
{
const char* left_end = itr;
itr += strspn (itr, " \t,;");
len = strcspn (itr, " \t,;");
itr += strspn (itr, delims);
len = strcspn (itr, delims);
if (len == vlen && !strncmp (itr, value, vlen))
{
TODO ("figure delimiter from original string out");
const char* delim = " ";
/* step over the word */
itr += len;
itr += strspn (itr, " \t,;");
itr += strspn (itr, delims);
/* getting the delimiters right for the corner cases looks ugly, want to refactor it? just do it */
str = lumiera_tmpbuf_snprintf (SIZE_MAX,
"%.*s%.*s%s%s%s%s%s%s",
"%.*s%.*s%.1s%s%.1s%s%.1s%s",
start - wordlist, wordlist,
left_end - start, start,
(left_end - start && subst1 && *subst1) ? delim : "",
(left_end - start && subst1 && *subst1) ? delims : "",
(subst1 && *subst1) ? subst1 : "",
((left_end - start || (subst1 && *subst1)) && subst2 && *subst2) ? delim : "",
((left_end - start || (subst1 && *subst1)) && subst2 && *subst2) ? delims : "",
(subst2 && *subst2) ? subst2 : "",
((left_end - start || (subst1 && *subst1) || (subst2 && *subst2)) && *itr) ? delim : "",
((left_end - start || (subst1 && *subst1) || (subst2 && *subst2)) && *itr) ? delims : "",
itr
);
@ -145,7 +137,7 @@ lumiera_config_wordlist_replace (const char* key, const char* value, const char*
const char*
lumiera_config_wordlist_add (const char* key, const char* value)
lumiera_config_wordlist_add (const char* key, const char* value, const char* delims)
{
const char* wordlist = NULL;
@ -160,19 +152,16 @@ lumiera_config_wordlist_add (const char* key, const char* value)
for (const char* itr = wordlist; *itr; itr += len)
{
itr += strspn (itr, " \t,;");
len = strcspn (itr, " \t,;");
itr += strspn (itr, delims);
len = strcspn (itr, delims);
if (len == vlen && !strncmp (itr, value, vlen))
goto end;
}
TODO ("figure delimiter from original string out");
const char* delim = " ";
wordlist = lumiera_tmpbuf_snprintf (SIZE_MAX, "%s%s%s",
wordlist = lumiera_tmpbuf_snprintf (SIZE_MAX, "%s%.1s%s",
wordlist,
wordlist[strspn (wordlist, " \t,;")]?delim:"",
wordlist[strspn (wordlist, delims)] ? delims : "",
value);
if (!lumiera_config_set (key, lumiera_tmpbuf_snprintf (SIZE_MAX, "=%s", wordlist)))

View file

@ -22,6 +22,7 @@
#include "lib/mutex.h"
#include "lib/safeclib.h"
#include "backend/plugin.h"
#include "backend/interface.h"
#include "backend/interfaceregistry.h"
@ -133,8 +134,9 @@ depwalk (LumieraInterfacenode self, LumieraInterfacenode* stack)
if (!cycle)
{
if ((*dep)->plugin)
lumiera_plugin_refinc ((*dep)->plugin);
++(*dep)->refcnt;
(*dep)->lnk = *stack;
*stack = *dep;
@ -184,7 +186,10 @@ lumiera_interface_open_interfacenode (LumieraInterfacenode self)
if (!cycle)
{
if (self->plugin)
lumiera_plugin_refinc (self->plugin);
++self->refcnt;
self->lnk = stack;
stack = self;
int collect_dependencies_bak = collect_dependencies;
@ -229,6 +234,16 @@ lumiera_interface_close (LumieraInterface self)
}
unsigned
lumiera_interface_version (LumieraInterface self, const char* iname)
{
if (self && iname && !strcmp (self->interface, iname))
return self->version;
return ~0;
}
/* internal function, does no locking! */
static void
lumiera_interfacenode_close (LumieraInterfacenode self)
@ -280,6 +295,8 @@ lumiera_interfacenode_close (LumieraInterfacenode self)
stack = self->lnk;
self->lnk = NULL;
if (self->plugin)
lumiera_plugin_refdec (self->plugin);
--self->refcnt;
}
}

View file

@ -102,9 +102,18 @@
* @param iname name of the interface
* @param version major version of the interface
* @param dname name for the instance
* @return constructed identifier
*/
#define LUMIERA_INTERFACE_DNAME(iname, version, dname) PPMPL_CAT (LUMIERA_INTERFACE_INAME(iname, version), _##dname)
#define LUMIERA_INTERFACE_DNAME(iname, version, dname) PPMPL_CAT (LUMIERA_INTERFACE_INAME (iname, version), _##dname)
/**
* Construct a definition string r for an interface
* @param iname name of the interface
* @param version major version of the interface
* @param dname name for the instance
* @return constructed string
*/
#define LUMIERA_INTERFACE_DSTRING(iname, version, dname) PPMPL_STRINGIFY (LUMIERA_INTERFACE_DNAME (iname, version, dname))
/**
* Return a reference (pointer) to an interface implementation
@ -259,16 +268,16 @@ LUMIERA_INTERFACE_INSTANCE (iname, version,
/**
* Generate interface container suitable for enumerating interfaces.
* This takes a list of interface definitions, instantiates them and places pointers to them
* into a zero terminated array which address is returned by the a created function.
* For interfaces generated by he core, the user is responsible to register these at the
* plugindb dynamically
* @param queryfunc name of the function to be created.
* @param ... list of LUMIERA_INTERFACE_DEFINE() for all interfaces this plugin provides.
* into a zero terminated array which address is returned by a static function named 'lumiera_plugin_interfaces'.
* For interfaces generated by he core, the user is responsible to register these dynamically.
* When LUMIERA_PLUGIN is defined, things change and an additional 'lumieraorg__plugin' interface is generated.
* The plugin loader then uses this to register the provided interfaces automatically.
* @param ... list of LUMIERA_INTERFACE_DEFINE()/LUMIERA_INTERFACE_INLINE() for all interfaces this plugin provides.
*/
#define LUMIERA_EXPORT(queryfunc, ...) \
#define LUMIERA_EXPORT(...) \
PPMPL_FOREACH_L1(_P1_, __VA_ARGS__) \
static LumieraInterface* \
queryfunc (void) \
lumiera_plugin_interfaces (void) \
{ \
static LumieraInterface interfaces[] = \
{ \
@ -276,31 +285,41 @@ queryfunc (void) \
NULL \
}; \
return interfaces; \
}
} \
LUMIERA_PLUGININTERFACE
/**
* Generate interface container suitable for a lumiera plugin.
* This takes a list of interface definitions and places pointers to them into a zero terminated array. Further
* it instances a local 'plugin interface' which will be picked up by the plugin loader to query the array of
* provided interfaces.
* @param descriptor pointer to an interface instance which provides a description of this plugin, might be NULL
* @param acquire a function which is called whenever the plugin interface is opened for using, might be NULL
* @param release a function which is called whenever this plugin interface is closed after use, might be NULL
* @param luid unique identifier for the this plugin interfaces query, use the magic word LUIDGEN here and run the
* lumiera uuid generator tool (to be written) over the source file to generate luid's automatically
* @param ... list of LUMIERA_INTERFACE_DEFINE() for all interfaces this plugin provides.
* Create a plugin interface when being copiled as plugin
*/
#define LUMIERA_PLUGIN(descriptor, acquire, release, luid, ...) \
LUMIERA_EXPORT(plugin_interfaces, __VA_ARGS__) \
LUMIERA_INTERFACE_DEFINE (lumieraorg_plugin, 0, \
lumieraorg_plugin_0, \
NULL, \
NULL, \
NULL, \
LUMIERA_INTERFACE_MAP (plugin_interfaces, plugin_interfaces, luid) \
)
#ifdef LUMIERA_PLUGIN
#define LUMIERA_PLUGININTERFACE \
LUMIERA_INTERFACE_INSTANCE (lumieraorg__plugin, 0, \
lumieraorg_plugin, \
NULL, \
NULL, \
NULL, \
LUMIERA_INTERFACE_MAP (plugin_interfaces, \
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", \
lumiera_plugin_interfaces) \
);
#define LUMIERA_INTERFACE_REGISTEREXPORTED
#define LUMIERA_INTERFACE_UNREGISTEREXPORTED
#else
#define LUMIERA_PLUGININTERFACE
/**
* Register all exported interfaces when not a plugin
* This is a no-op when LUMIERA_PLUGIN is defined, since plugins are automatically registered
*/
#define LUMIERA_INTERFACE_REGISTEREXPORTED \
lumiera_interfaceregistry_bulkregister_interfaces (lumiera_plugin_interfaces(), NULL)
/**
* Unregister all exported interfaces when not a plugin
* This is a no-op when LUMIERA_PLUGIN is defined, since plugins are automatically registered
*/
#define LUMIERA_INTERFACE_UNREGISTEREXPORTED \
lumiera_interfaceregistry_bulkremove_interfaces (lumiera_plugin_interfaces())
#endif
/**
@ -313,6 +332,9 @@ LUMIERA_INTERFACE_DEFINE (lumieraorg_plugin, 0,
#define LUMIERA_INTERFACE_OPEN(interface, version, minminor, name) \
LUMIERA_INTERFACE_CAST(interface, version) lumiera_interface_open (#interface, version, minminor, #name)
#define LUMIERA_INTERFACE_CLOSE(handle) \
lumiera_interface_close (&(handle)->interface_header_)
typedef struct lumiera_interfaceslot_struct lumiera_interfaceslot;
typedef lumiera_interfaceslot* LumieraInterfaceslot;
@ -372,6 +394,15 @@ struct lumiera_interface_struct
#endif
};
/**
* Plugin interface
*/
LUMIERA_INTERFACE_DECLARE (lumieraorg__plugin, 0,
LUMIERA_INTERFACE_SLOT (LumieraInterface*, plugin_interfaces, (void)),
);
/*
API to handle interfaces
*/
@ -395,7 +426,16 @@ lumiera_interface_open (const char* interface, unsigned version, size_t minminor
* consider 'self' to be invalidated after this call
*/
void
lumiera_interface_close (LumieraInterface iface);
lumiera_interface_close (LumieraInterface self);
/**
* Runtime check for interface type and version
* @param self interface to check
* @param iname name of the interface
* @return version of the interface or ~0 (-1) if iname doesn't match the requested name
*/
unsigned
lumiera_interface_version (LumieraInterface self, const char* iname);
#endif /* LUMIERA_INTERFACE_H */

View file

@ -23,20 +23,113 @@
#include "backend/interface.h"
/**
* WIP: interface descriptor, needs some generic metadata interface
* Release state of an interface implementation.
* The interface subsystem must be able to categorize implementations to present possible
* upgrade paths to the user. This is done by the tagging it to a certain state in concert
* with the version and the user supplied version compare function. The respective numbers
* are choosen in a way that a higher value indicates precedence when selecting an implementation.
* Note that 'BETA' is higher than 'DEPRECATED', we make the assumption that BETA is at least
* maintained code and something gets deprecated for some reason. For common practice it is
* suggested to make a stable release before declaring its predcessor version as deprecated.
*/
enum lumiera_interface_state {
/** some known bugs exist which won't be fixed, don't use this */
LUMIERA_INTERFACE_BROKEN = -1,
/** Not finished development code */
LUMIERA_INTERFACE_EXPERIMENTAL = 0,
/** Old implementation which is now unmaintained and will be removed soon */
LUMIERA_INTERFACE_DEPRECATED = 1,
/** Finished but not finally released implementation for open testing */
LUMIERA_INTERFACE_BETA = 2,
/** Finished, released and maintained implementation */
LUMIERA_INTERFACE_STABLE = 3
};
/**
* Interface descriptor.
* This defines an interface for querying metadata common to all interface implementations
*/
LUMIERA_INTERFACE_DECLARE (lumieraorg_interfacedescriptor, 0,
/* The following slots are some human-readable descriptions of certain properties */
LUMIERA_INTERFACE_SLOT (const char*, name, (LumieraInterface)),
LUMIERA_INTERFACE_SLOT (const char*, brief, (LumieraInterface)),
LUMIERA_INTERFACE_SLOT (const char*, homepage, (LumieraInterface)),
LUMIERA_INTERFACE_SLOT (const char*, version, (LumieraInterface)),
LUMIERA_INTERFACE_SLOT (const char*, author, (LumieraInterface)),
LUMIERA_INTERFACE_SLOT (const char*, email, (LumieraInterface)),
LUMIERA_INTERFACE_SLOT (const char*, copyright, (LumieraInterface)),
LUMIERA_INTERFACE_SLOT (const char*, license, (LumieraInterface))
/* TODO add more things here, dependencies, provisions etc */
LUMIERA_INTERFACE_SLOT (const char*, license, (LumieraInterface)),
/* some flags for properties */
LUMIERA_INTERFACE_SLOT (int, state, (LumieraInterface)),
/* compare 2 version strings in a custom way */
LUMIERA_INTERFACE_SLOT (int, versioncmp, (const char*, const char*))
);
#if 0
/**
* For convinience, a copy'n'paste descriptor
*/
LUMIERA_INTERFACE_INSTANCE (lumieraorg_interfacedescriptor, 0,
/*IDENTIFIER*/,
NULL, NULL, NULL,
LUMIERA_INTERFACE_INLINE (name, LUIDGEN,
const char*, (LumieraInterface iface),
{return /*NAME*/;}
),
LUMIERA_INTERFACE_INLINE (brief, LUIDGEN,
const char*, (LumieraInterface iface),
{return /*BRIEF*/;}
),
LUMIERA_INTERFACE_INLINE (homepage, LUIDGEN,
const char*, (LumieraInterface iface),
{return /*HOMEPAGE*/;}
),
LUMIERA_INTERFACE_INLINE (version, LUIDGEN,
const char*, (LumieraInterface iface),
{return /*VERSION*/;}
),
LUMIERA_INTERFACE_INLINE (author, LUIDGEN,
const char*, (LumieraInterface iface),
{return /*AUTHOR*/;}
),
LUMIERA_INTERFACE_INLINE (email, LUIDGEN,
const char*, (LumieraInterface iface),
{return /*EMAIL*/;}
),
LUMIERA_INTERFACE_INLINE (copyright, LUIDGEN,
const char*, (LumieraInterface iface),
{
return
"Copyright (C) "/*ORGANIZATION*/"\n"
" "/*YEARS*/" "/*AUTHOR*/" <"/*EMAIL*/">";
}
),
LUMIERA_INTERFACE_INLINE (license, LUIDGEN,
const char*, (LumieraInterface iface),
{
return
/*LICENSE*/;
}
),
LUMIERA_INTERFACE_INLINE (state, LUIDGEN,
int, (LumieraInterface iface),
{return /*LUMIERA_INTERFACE_EXPERIMENTAL*/;}
),
LUMIERA_INTERFACE_INLINE (versioncmp, LUIDGEN,
int, (const char* a, const char* b),
{return /*COMPARERESULT*/;}
)
);
#endif
#endif /* LUMIERA_INTERFACEDESCRIPTORS_H */
/*

View file

@ -29,6 +29,7 @@
#include "backend/plugin.h"
#include "backend/interfaceregistry.h"
/**
@ -39,27 +40,31 @@
*/
NOBUG_DEFINE_FLAG_PARENT (interface_all, backend);
NOBUG_DEFINE_FLAG_PARENT (plugin, interface_all);
NOBUG_DEFINE_FLAG_PARENT (interfaceregistry, interface_all);
NOBUG_DEFINE_FLAG_PARENT (interface, interface_all);
PSplay lumiera_interfaceregistry;
PSplay lumiera_pluginregistry;
lumiera_mutex lumiera_interface_mutex;
static int
cmp_fn (const void* keya, const void* keyb);
lumiera_interface_cmp_fn (const void* keya, const void* keyb);
static const void*
key_fn (const PSplaynode node);
lumiera_interface_key_fn (const PSplaynode node);
static LumieraInterfacenode
lumiera_interfacenode_new (LumieraInterface iface)
lumiera_interfacenode_new (LumieraInterface iface, LumieraPlugin plugin)
{
LumieraInterfacenode self = lumiera_malloc (sizeof (*self));
psplaynode_init (&self->node);
self->interface = iface;
self->refcnt = 0;
self->plugin = plugin;
self->lnk = NULL;
self->deps_size = 0;
self->deps = NULL;
@ -89,13 +94,20 @@ lumiera_interfaceregistry_init (void)
NOBUG_INIT_FLAG (interface_all);
NOBUG_INIT_FLAG (interfaceregistry);
NOBUG_INIT_FLAG (interface);
NOBUG_INIT_FLAG (plugin);
TRACE (interfaceregistry);
REQUIRE (!lumiera_interfaceregistry);
REQUIRE (!lumiera_pluginregistry);
lumiera_interfaceregistry = psplay_new (cmp_fn, key_fn, NULL);
lumiera_interfaceregistry = psplay_new (lumiera_interface_cmp_fn, lumiera_interface_key_fn, NULL);
if (!lumiera_interfaceregistry)
LUMIERA_DIE (ERRNO);
lumiera_pluginregistry = psplay_new (lumiera_plugin_cmp_fn, lumiera_plugin_key_fn, lumiera_plugin_delete_fn);
if (!lumiera_pluginregistry)
LUMIERA_DIE (ERRNO);
lumiera_recmutex_init (&lumiera_interface_mutex, "interfaceregistry", &NOBUG_FLAG(interfaceregistry));
}
@ -104,10 +116,15 @@ void
lumiera_interfaceregistry_destroy (void)
{
TRACE (interfaceregistry);
REQUIRE (!psplay_nelements (lumiera_interfaceregistry));
if (lumiera_pluginregistry)
psplay_delete (lumiera_pluginregistry);
lumiera_pluginregistry = NULL;
lumiera_mutex_destroy (&lumiera_interface_mutex, &NOBUG_FLAG(interfaceregistry));
REQUIRE (!psplay_nelements (lumiera_interfaceregistry), "some interfaces still registered at shutdown");
if (lumiera_interfaceregistry)
psplay_destroy (lumiera_interfaceregistry);
lumiera_interfaceregistry = NULL;
@ -115,7 +132,7 @@ lumiera_interfaceregistry_destroy (void)
void
lumiera_interfaceregistry_register_interface (LumieraInterface self)
lumiera_interfaceregistry_register_interface (LumieraInterface self, LumieraPlugin plugin)
{
TRACE (interfaceregistry);
REQUIRE (self);
@ -123,13 +140,13 @@ lumiera_interfaceregistry_register_interface (LumieraInterface self)
LUMIERA_RECMUTEX_SECTION (interfaceregistry, &lumiera_interface_mutex)
{
TRACE (interfaceregistry, "interface %s, version %d, instance %s", self->interface, self->version, self->name);
psplay_insert (lumiera_interfaceregistry, &lumiera_interfacenode_new (self)->node, 100);
psplay_insert (lumiera_interfaceregistry, &lumiera_interfacenode_new (self, plugin)->node, 100);
}
}
void
lumiera_interfaceregistry_bulkregister_interfaces (LumieraInterface* self)
lumiera_interfaceregistry_bulkregister_interfaces (LumieraInterface* self, LumieraPlugin plugin)
{
TRACE (interfaceregistry);
REQUIRE (self);
@ -139,7 +156,7 @@ lumiera_interfaceregistry_bulkregister_interfaces (LumieraInterface* self)
while (*self)
{
TRACE (interfaceregistry, "interface %s, version %d, instance %s", (*self)->interface, (*self)->version, (*self)->name);
psplay_insert (lumiera_interfaceregistry, &lumiera_interfacenode_new (*self)->node, 100);
psplay_insert (lumiera_interfaceregistry, &lumiera_interfacenode_new (*self, plugin)->node, 100);
++self;
}
}
@ -213,7 +230,7 @@ lumiera_interfaceregistry_interface_find (const char* interface, unsigned versio
static int
cmp_fn (const void* keya, const void* keyb)
lumiera_interface_cmp_fn (const void* keya, const void* keyb)
{
const LumieraInterface a = (const LumieraInterface)keya;
const LumieraInterface b = (const LumieraInterface)keyb;
@ -240,12 +257,11 @@ cmp_fn (const void* keya, const void* keyb)
static const void*
key_fn (const PSplaynode node)
lumiera_interface_key_fn (const PSplaynode node)
{
return ((LumieraInterfacenode)node)->interface;
}
/*
// Local Variables:
// mode: C

View file

@ -25,6 +25,7 @@
#include "lib/psplay.h"
#include "backend/interface.h"
#include "backend/plugin.h"
#include <nobug.h>
@ -62,6 +63,10 @@ struct lumiera_interfacenode_struct
/** reference counters and link used for internal reference management */
unsigned refcnt;
/** backreference to its plugin if it comes from a plugin, else NULL */
LumieraPlugin plugin;
/** temporary used to stack interfaces when recursively opening/closing them */
LumieraInterfacenode lnk;
/** allocated size of the following deps table */
@ -84,10 +89,10 @@ lumiera_interfaceregistry_destroy (void);
void
lumiera_interfaceregistry_register_interface (LumieraInterface self);
lumiera_interfaceregistry_register_interface (LumieraInterface self, LumieraPlugin plugin);
void
lumiera_interfaceregistry_bulkregister_interfaces (LumieraInterface* self);
lumiera_interfaceregistry_bulkregister_interfaces (LumieraInterface* self, LumieraPlugin plugin);
void
lumiera_interfaceregistry_remove_interface (LumieraInterface self);

View file

@ -18,320 +18,403 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <stdio.h>
#include <unistd.h>
#include <search.h>
#include <string.h>
#include <dlfcn.h>
#include <pthread.h>
#include <time.h>
#include <limits.h>
#include "lib/safeclib.h"
#include "lib/psplay.h"
#include "lib/mutex.h"
#include "lib/error.h"
#include "backend/interfaceregistry.h"
#include "backend/config.h"
#include "backend/plugin.h"
#include <glob.h>
#include <nobug.h>
#ifndef LUMIERA_PLUGIN_PATH
#error please define the plugin search path as -DLUMIERA_PLUGIN_PATH, e.g. as $INSTALL_PREFIX/lib/lumiera
#endif
/**
* @file
* Plugin loader.
*/
/* just some declarations */
extern PSplay lumiera_pluginregistry;
static char* init_exts_globs ();
/* TODO should be set by the build system to the actual plugin path */
#define LUMIERA_PLUGIN_PATH "~/.lumiera/plugins:/usr/local/lib/lumiera/plugins:.libs"
NOBUG_DEFINE_FLAG (lumiera_plugin);
/* TODO default plugin path should be set by the build system */
/* errors */
LUMIERA_ERROR_DEFINE(PLUGIN_DLOPEN, "Could not open plugin");
LUMIERA_ERROR_DEFINE(PLUGIN_HOOK, "Hook function failed");
LUMIERA_ERROR_DEFINE(PLUGIN_NFILE, "No such plugin");
LUMIERA_ERROR_DEFINE(PLUGIN_NIFACE, "No such interface");
LUMIERA_ERROR_DEFINE(PLUGIN_REVISION, "Interface revision too old");
LUMIERA_ERROR_DEFINE(PLUGIN_INIT, "Initialization error");
LUMIERA_ERROR_DEFINE(PLUGIN_OPEN, "Could not open plugin");
LUMIERA_ERROR_DEFINE(PLUGIN_WTF, "Not a Lumiera plugin");
LUMIERA_ERROR_DEFINE(PLUGIN_REGISTER, "Could not register plugin");
LUMIERA_ERROR_DEFINE(PLUGIN_VERSION, "Plugin Version unsupported");
/*
supported (planned) plugin types and their file extensions
*/
#define LUMIERA_PLUGIN_TYPE_PLANNED(name, ext)
enum lumiera_plugin_type
{
LUMIERA_PLUGIN_NULL,
LUMIERA_PLUGIN_DYNLIB,
LUMIERA_PLUGIN_CSOURCE
};
/**
* Supported (and planned) plugin types and their file extensions
* This maps filename extensions to implementations (of the respective _load_NAME and _unload_NAME functions)
* So far we only support platform dynamic libraries, later we may add plugins implemented in lua
* and c source modules which get compiled on the fly.
*/
#define LUMIERA_PLUGIN_TYPES \
LUMIERA_PLUGIN_TYPE(DYNLIB, ".so") \
LUMIERA_PLUGIN_TYPE(DYNLIB, ".lum") \
LUMIERA_PLUGIN_TYPE_PLANNED(LUA, ".lua") \
LUMIERA_PLUGIN_TYPE_PLANNED(CSOURCE, ".c")
static const struct
/**
* record the extension and a callback function for loading the associated plugin for each plugin type
*/
struct lumiera_plugintype_struct
{
const char* const ext;
enum lumiera_plugin_type type;
} lumiera_plugin_extensions [] =
LumieraPlugin (*lumiera_plugin_load_fn)(const char*);
void (*lumiera_plugin_unload_fn)(LumieraPlugin);
const char* ext;
};
typedef struct lumiera_plugintype_struct lumiera_plugintype;
typedef lumiera_plugintype* LumieraPlugintype;
/* forward declare loader functions for all types */
#define LUMIERA_PLUGIN_TYPE(type, ext) \
LumieraPlugin lumiera_plugin_load_##type (const char*); \
void lumiera_plugin_unload_##type (LumieraPlugin);
LUMIERA_PLUGIN_TYPES
#undef LUMIERA_PLUGIN_TYPE
/* and now setup a table which will be used for dispatching loaders depending on the type of the plugin */
#define LUMIERA_PLUGIN_TYPE(type, ext) {lumiera_plugin_load_##type, lumiera_plugin_unload_##type, ext},
static lumiera_plugintype lumiera_plugin_types[] =
{
{"so", LUMIERA_PLUGIN_DYNLIB},
{"o", LUMIERA_PLUGIN_DYNLIB},
{"c", LUMIERA_PLUGIN_CSOURCE},
/* extend here */
{NULL, LUMIERA_PLUGIN_NULL}
LUMIERA_PLUGIN_TYPES
{NULL, NULL, NULL}
};
#undef LUMIERA_PLUGIN_TYPE
struct lumiera_plugin
struct lumiera_plugin_struct
{
/* short name as queried ("effects/audio/normalize") used for sorting/finding */
const char* name;
psplaynode node;
/* long names as looked up ("/usr/local/lib/lumiera/plugins/effects/audio/normalize.so") */
const char* pathname;
const char* name;
/* use count for all interfaces of this plugin */
unsigned use_count;
unsigned refcnt;
/* time when the last open or close action happened */
/* time when the refcounter dropped to 0 last time */
time_t last;
/* kind of plugin */
enum lumiera_plugin_type type;
/* when loading plugins en masse we do not want to fail completely if one doesnt cooperate, instead we record local errors here */
lumiera_err error;
/* dlopen handle */
/* the 'plugin' interface itself */
LumieraInterface plugin;
/* generic handle for the plugin, dlopen handle, etc */
void* handle;
};
/* global plugin registry */
void* lumiera_plugin_registry = NULL;
/* plugin operations are protected by one big mutex */
pthread_mutex_t lumiera_plugin_mutex = PTHREAD_MUTEX_INITIALIZER;
/**
* the compare function for the registry tree.
* Compares the names of two struct lumiera_plugin.
* @return 0 if a and b are equal, just like strcmp. */
static int
lumiera_plugin_name_cmp (const void* a, const void* b)
LumieraPlugin
lumiera_plugin_new (const char* name)
{
return strcmp (((struct lumiera_plugin*) a)->name, ((struct lumiera_plugin*) b)->name);
LumieraPlugin self = lumiera_malloc (sizeof (*self));
psplaynode_init (&self->node);
self->name = lumiera_strndup (name, SIZE_MAX);
self->refcnt = 0;
time (&self->last);
self->error = LUMIERA_ERROR_PLUGIN_INIT;
self->plugin = NULL;
self->handle = NULL;
return self;
}
LumieraPlugin
lumiera_plugin_init (LumieraPlugin self, void* handle, LumieraInterface plugin)
{
self->error = lumiera_error ();
self->plugin = plugin;
self->handle = handle;
return self;
}
lumiera_err
lumiera_plugin_error (LumieraPlugin self)
{
REQUIRE (self);
return self->error;
}
void*
lumiera_plugin_handle (LumieraPlugin self)
{
REQUIRE (self);
return self->handle;
}
const char*
lumiera_plugin_name (LumieraPlugin self)
{
return self?self->name:NULL;
}
void
lumiera_init_plugin (void)
lumiera_plugin_refinc (LumieraPlugin self)
{
NOBUG_INIT_FLAG (lumiera_plugin);
++self->refcnt;
}
/**
* Find and set pathname for the plugin.
* Searches through given path for given plugin, trying to find the file's location in the filesystem.
* If found, self->pathname will be set to the found plugin file.
* @param self The lumiera_plugin to open look for.
* @param path The path to search trough (paths seperated by ":")
* @return 0 on success. -1 on error, or if plugin not found in path.
*/
void
lumiera_plugin_refdec (LumieraPlugin self)
{
if (!--self->refcnt)
time (&self->last);
}
int
lumiera_plugin_lookup (struct lumiera_plugin* self, const char* path)
lumiera_plugin_discover (LumieraPlugin (*callback_load)(const char* plugin),
int (*callback_register) (LumieraPlugin))
{
if (!path)
return -1;
TRACE (plugin);
REQUIRE (callback_load);
REQUIRE (callback_register);
if (strlen(path) > 1023)
return -1; /*TODO error handling*/
lumiera_config_setdefault ("plugin.path ="LUMIERA_PLUGIN_PATH);
char tpath[1024];
TODO("dunno if PATH_MAX may be undefined (in case arbitary lengths are supported), I check that later");
char pathname[1024] = {0};
char* tmp;
/* construct glob trail {.so,.c,.foo} ... */
static char* exts_globs = NULL;
if (!exts_globs)
exts_globs = init_exts_globs (&exts_globs);
strcpy(tpath, path);
const char* path;
unsigned i = 0;
int flags = GLOB_PERIOD|GLOB_BRACE|GLOB_TILDE_CHECK;
glob_t globs;
/*for each in path*/
for (char* tok = strtok_r (tpath, ":", &tmp); tok; tok = strtok_r (NULL, ":", &tmp))
while ((path = lumiera_config_wordlist_get_nth ("plugin.path", i, ":")))
{
/*for each extension*/
for (int i = 0; lumiera_plugin_extensions[i].ext; ++i)
{
/* path/name.extension */
int r = snprintf(pathname, 1024, "%s/%s.%s", tok, self->name, lumiera_plugin_extensions[i].ext);
if (r >= 1024)
return -1; /*TODO error handling, name too long*/
path = lumiera_tmpbuf_snprintf (SIZE_MAX,"%s/%s", path, exts_globs);
TRACE (plugin, "globbing path '%s'", path);
int ret = glob (path, flags, NULL, &globs);
if (ret == GLOB_NOSPACE)
LUMIERA_DIE (NO_MEMORY);
TRACE (lumiera_plugin, "trying %s", pathname);
if (!access(pathname, R_OK))
{
/* got it */
TRACE (lumiera_plugin, "found %s", pathname);
self->pathname = lumiera_strndup (pathname, PATH_MAX);
self->type = lumiera_plugin_extensions[i].type;
return 0;
}
}
flags |= GLOB_APPEND;
++i;
}
return -1; /* plugin not found */
if (globs.gl_pathc)
LUMIERA_RECMUTEX_SECTION (plugin, &lumiera_interface_mutex)
{
for (char** itr = globs.gl_pathv; *itr; ++itr)
{
if (!psplay_find (lumiera_pluginregistry, *itr, 100))
{
TRACE (plugin, "found new plugin '%s'", *itr);
callback_register (callback_load (*itr));
}
}
}
globfree (&globs);
return !lumiera_error_peek ();
}
struct lumiera_interface*
lumiera_interface_open (const char* name, const char* interface, size_t min_revision)
LumieraPlugin
lumiera_plugin_load (const char* plugin)
{
//REQUIRE (min_revision > sizeof(struct lumiera_interface), "try to use an empty interface eh?");
REQUIRE (interface, "interface name must be given");
TRACE (plugin);
pthread_mutex_lock (&lumiera_plugin_mutex);
/* dispatch on ext, call the registered function */
const char* ext = strrchr (plugin, '.');
struct lumiera_plugin plugin;
struct lumiera_plugin** found;
plugin.name = name; /* for searching */
found = tsearch (&plugin, &lumiera_plugin_registry, lumiera_plugin_name_cmp);
if (!found)
LUMIERA_DIE (NO_MEMORY);
if (*found == &plugin)
LumieraPlugintype itr = lumiera_plugin_types;
while (itr->ext)
{
NOTICE (lumiera_plugin, "new plugin");
if (!strcmp (itr->ext, ext))
return itr->lumiera_plugin_load_fn (plugin);
++itr;
}
return NULL;
}
/* now really create new item */
*found = lumiera_malloc (sizeof (struct lumiera_plugin));
if (name) /* NULL is main app, no lookup needed */
int
lumiera_plugin_register (LumieraPlugin plugin)
{
TRACE (plugin);
if (!plugin)
return 1;
LUMIERA_RECMUTEX_SECTION (plugin, &lumiera_interface_mutex)
{
if (psplay_insert (lumiera_pluginregistry, &plugin->node, 100))
{
/*lookup for $LUMIERA_PLUGIN_PATH*/
(*found)->name = lumiera_strndup (name, PATH_MAX);
if (!!lumiera_plugin_lookup (*found, getenv("LUMIERA_PLUGIN_PATH"))
#ifdef LUMIERA_PLUGIN_PATH
/* else lookup for -DLUMIERA_PLUGIN_PATH */
&& !!lumiera_plugin_lookup (*found, LUMIERA_PLUGIN_PATH)
#endif
)
if (!plugin->error)
{
LUMIERA_ERROR_SET (lumiera_plugin, PLUGIN_NFILE);
goto elookup;
switch (lumiera_interface_version (plugin->plugin, "lumieraorg__plugin"))
{
case 0:
{
TRACE (plugin, "registering %s", plugin->name);
LUMIERA_INTERFACE_HANDLE(lumieraorg__plugin, 0) handle =
LUMIERA_INTERFACE_CAST(lumieraorg__plugin, 0) plugin->plugin;
lumiera_interfaceregistry_bulkregister_interfaces (handle->plugin_interfaces (), plugin);
}
break;
default:
LUMIERA_ERROR_SET (plugin, PLUGIN_VERSION);
}
}
}
else
{
(*found)->name = NULL;
(*found)->pathname = NULL;
}
(*found)->use_count = 0;
PLANNED("if .so like then dlopen; else if .c like tcc compile");
TODO("factor dlopen and dlsym out");
TRACE(lumiera_plugin, "trying to open %s", (*found)->pathname);
(*found)->handle = dlopen ((*found)->pathname, RTLD_LAZY|RTLD_LOCAL);
if (!(*found)->handle)
{
ERROR (lumiera_plugin, "dlopen failed: %s", dlerror());
LUMIERA_ERROR_SET (lumiera_plugin, PLUGIN_DLOPEN);
goto edlopen;
}
/* if the plugin defines a 'lumiera_plugin_init' function, we call it, must return 0 on success */
int (*init)(void) = dlsym((*found)->handle, "lumiera_plugin_init");
if (init && init())
{
//ERROR (lumiera_plugin, "lumiera_plugin_init failed: %s: %s", name, interface);
LUMIERA_ERROR_SET (lumiera_plugin, PLUGIN_HOOK);
goto einit;
LUMIERA_ERROR_SET (plugin, PLUGIN_REGISTER);
}
}
/* we have the plugin, now get the interface descriptor */
struct lumiera_interface* ret;
dlerror();
ret = dlsym ((*found)->handle, interface);
const char *dlerr = dlerror();
TRACE(lumiera_plugin, "%s", dlerr);
TODO ("need some way to tell 'interface not provided by plugin', maybe lumiera_plugin_error()?");
if (dlerr)
{
//ERROR (lumiera_plugin, "plugin %s doesnt provide interface %s", name, interface);
LUMIERA_ERROR_SET (lumiera_plugin, PLUGIN_NIFACE);
goto edlsym;
}
/* is the interface older than required? */
if (ret->size < min_revision)
{
ERROR (lumiera_plugin, "plugin %s provides older interface %s revision than required", name, interface);
LUMIERA_ERROR_SET (lumiera_plugin, PLUGIN_REVISION);
goto erevision;
}
ret->plugin = *found;
/* if the interface provides a 'open' function, call it now, must return 0 on success */
if (ret->open && ret->open())
{
ERROR (lumiera_plugin, "open hook indicated an error");
LUMIERA_ERROR_SET (lumiera_plugin, PLUGIN_HOOK);
goto eopen;
}
(*found)->use_count++;
(*found)->last = time (NULL);
ret->use_count++;
pthread_mutex_unlock (&lumiera_plugin_mutex);
return ret;
/* Error cleanup */
einit:
dlclose((*found)->handle);
eopen:
erevision:
edlsym:
edlopen:
elookup:
free ((char*)(*found)->name);
free (*found);
*found = &plugin;
tdelete (&plugin, &lumiera_plugin_registry, lumiera_plugin_name_cmp);
pthread_mutex_unlock (&lumiera_plugin_mutex);
return NULL;
return !!lumiera_error_peek();
}
unsigned
lumiera_plugin_unload (LumieraPlugin self)
{
TRACE (plugin);
if (!self)
return 0;
if (self->refcnt)
return self->refcnt;
/* dispatch on ext, call the registered function */
const char* ext = strrchr (self->name, '.');
LumieraPlugintype itr = lumiera_plugin_types;
while (itr->ext)
{
if (!strcmp (itr->ext, ext))
{
LUMIERA_RECMUTEX_SECTION (plugin, &lumiera_interface_mutex)
{
if (psplay_remove (lumiera_pluginregistry, &self->node))
{
if (!self->error)
{
LUMIERA_INTERFACE_HANDLE(lumieraorg__plugin, 0) handle =
LUMIERA_INTERFACE_CAST(lumieraorg__plugin, 0) self->plugin;
lumiera_interfaceregistry_bulkremove_interfaces (handle->plugin_interfaces ());
}
}
}
itr->lumiera_plugin_unload_fn (self);
break;
}
++itr;
}
return 0;
}
LumieraPlugin
lumiera_plugin_lookup (const char* name)
{
LumieraPlugin ret = NULL;
if (name)
LUMIERA_RECMUTEX_SECTION (plugin, &lumiera_interface_mutex)
ret = (LumieraPlugin) psplay_find (lumiera_pluginregistry, name, 100);
return ret;
}
static char* init_exts_globs ()
{
char* exts_globs;
size_t exts_sz = 3; /* * { } \0 less one comma */
LumieraPlugintype itr = lumiera_plugin_types;
while (itr->ext)
{
exts_sz += strlen (itr->ext) + 1;
++itr;
}
exts_globs = lumiera_malloc (exts_sz);
*exts_globs = '\0';
itr = lumiera_plugin_types;
strcat (exts_globs, "*{");
while (itr->ext)
{
strcat (exts_globs, itr->ext);
strcat (exts_globs, ",");
++itr;
}
exts_globs[exts_sz-2] = '}';
TRACE (plugin, "initialized extension glob to '%s'", exts_globs);
return exts_globs;
}
int
lumiera_plugin_cmp_fn (const void* keya, const void* keyb)
{
return strcmp ((const char*)keya, (const char*)keyb);
}
const void*
lumiera_plugin_key_fn (const PSplaynode node)
{
return ((LumieraPlugin)node)->name;
}
void
lumiera_interface_close (void* ptr)
lumiera_plugin_delete_fn (PSplaynode node)
{
TRACE (lumiera_plugin, "%p", ptr);
if(!ptr)
return;
LumieraPlugin self = (LumieraPlugin) node;
struct lumiera_interface* self = (struct lumiera_interface*) ptr;
ENSURE (!self->refcnt, "plugin %s still in use at shutdown", self->name);
pthread_mutex_lock (&lumiera_plugin_mutex);
const char* ext = strrchr (self->name, '.');
struct lumiera_plugin* plugin = self->plugin;
plugin->use_count--;
self->use_count--;
/* if the interface provides a 'close' function, call it now */
if (self->close)
self->close();
/* plugin not longer in use, unload it */
if (!plugin->use_count)
LumieraPlugintype itr = lumiera_plugin_types;
while (itr->ext)
{
TODO ("we dont want to close here, instead store time of recent use and make a expire run, already planned in my head");
/* if the plugin defines a 'lumiera_plugin_destroy' function, we call it */
int (*destroy)(void) = dlsym(plugin->handle, "lumiera_plugin_destroy");
if (destroy)
destroy();
/* and now cleanup */
tdelete (plugin, &lumiera_plugin_registry, lumiera_plugin_name_cmp);
free ((char*)plugin->name);
dlclose(plugin->handle);
free (plugin);
if (!strcmp (itr->ext, ext))
{
if (!self->error)
{
LUMIERA_INTERFACE_HANDLE(lumieraorg__plugin, 0) handle =
LUMIERA_INTERFACE_CAST(lumieraorg__plugin, 0) self->plugin;
lumiera_interfaceregistry_bulkremove_interfaces (handle->plugin_interfaces ());
}
itr->lumiera_plugin_unload_fn (self);
break;
}
++itr;
}
pthread_mutex_unlock (&lumiera_plugin_mutex);
}

View file

@ -21,137 +21,188 @@
#ifndef LUMIERA_PLUGIN_H
#define LUMIERA_PLUGIN_H
#ifdef __cplusplus
extern "C" {
#elif 0
} /*eek, fixes emacs indenting for now*/
#endif
#include "lib/psplay.h"
#include "lib/error.h"
#include "backend/interface.h"
#include <stdlib.h>
#include <nobug.h>
#include "error.h"
/**
* @file
* Plugin loader, header.
* Lumiera plugins defines 'interfaces' as shown in interface.h, the plugin system handles the loading
* of all kinds of plugins under the hood, invoked from the interface system. Most things defined here
* are called internally and should not be used by other parts of the application.
*
* Plugin discovery
* The plugin_discover() function offers a automatic way to load and register new plugins. It traverses
* all configured plugin directories. It takes to function for loading and registering plugins as
* parameter, by now this only uses the here defined plugin_load() and plugin_register() functions
* which lets it load any newly found plugin unconditionally. Later these callbacks will be replaced by
* a smarter system (plugindb) which makes it possible to load plugins on-demand and select proper
* plugins based on their version and capabilities.
*
* Plugin loading
* Plugins are loaded and initialized in a sequence of steps:
* plugin_load() dispatches to a specific loader function depending on the type (extension) of a plugin.
* This loader allocates a new plugin structure with plugin_new() and then does it work and eventually
* finalizing the plugin structure initialization with plugin_init() by providing a handle to a
* lumieraorg__plugin interface. plugin_init() also stores the current error state (which might be clean)
* into the plugin. After that the plugin can be registered which records it in the pluginregistry and if
* its error state is clean, registering all interfaces it offers in the interface registry. With that
* the plugin is ready to be used. Plugins with the error state set should still be registered to prevent
* further discovery runs to try loading them again.
*
*/
NOBUG_DECLARE_FLAG (lumiera_plugin);
LUMIERA_ERROR_DECLARE(PLUGIN_INIT);
LUMIERA_ERROR_DECLARE(PLUGIN_OPEN);
LUMIERA_ERROR_DECLARE(PLUGIN_WTF);
LUMIERA_ERROR_DECLARE(PLUGIN_REGISTER);
LUMIERA_ERROR_DECLARE(PLUGIN_VERSION);
NOBUG_DECLARE_FLAG (plugin);
/* tool macros*/
#define LUMIERA_INTERFACE_TYPE(name, version) struct lumiera_interface_##name##_##version
#define LUMIERA_INTERFACE_CAST(name, version) (LUMIERA_INTERFACE_TYPE(name, version)*)
/* Interface definition */
#define LUMIERA_INTERFACE(name, version, ...) \
LUMIERA_INTERFACE_TYPE(name, version) \
{ \
struct lumiera_interface interface_header_; \
__VA_ARGS__ \
}
#define LUMIERA_INTERFACE_PROTO(ret, name, params) ret (*name) params;
/* Interface instantiation */
#define LUMIERA_INTERFACE_IMPLEMENT(iname, version, name, open, close, ...) \
LUMIERA_INTERFACE_TYPE(iname, version) name##_##version = \
{ \
{ \
version, \
sizeof(LUMIERA_INTERFACE_TYPE(iname, version)), \
NULL, \
0, \
open, \
close \
}, \
__VA_ARGS__ \
}
/* internally used */
struct lumiera_plugin;
struct lumiera_plugin_struct;
typedef struct lumiera_plugin_struct lumiera_plugin;
typedef lumiera_plugin* LumieraPlugin;
enum lumiera_plugin_type;
/**
* This is the header for any interface exported by plugins.
* Real interfaces append their functions at the end. There are few standard functions on each Interface
* Every function is required to be implemnted.
* Allocates an preinitializes a plugin structure
* @internal
* @param name path/filename of the plugin
* @return new allocated/preinitialized plugin structure with its error state set to LUMIERA_ERROR_PLUGIN_INIT
*/
struct lumiera_interface
{
/// interface version number
unsigned version;
/// size of the full structure is used to determine the revision (adding a new function increments the size)
size_t size;
/// back reference to plugin
struct lumiera_plugin* plugin;
/// incremented for each user of this interface and decremented when closed
unsigned use_count;
/// called for each open of this interface
int (*open)(void);
/// called for each close of this interface
int (*close)(void);
};
LumieraPlugin
lumiera_plugin_new (const char* name);
/**
* Initialize the plugin system.
* always succeeds or aborts
* Complete plugin initialization
* @internal
* Stores any pending error (from loading) in self which clears out the LUMIERA_ERROR_PLUGIN_INIT error state
* which was initialized by lumiera_plugin_new(), stores the handle and plugin pointers in the plugin struct.
* @param self pointer to the plugin struct
* @param handle opaque handle refering to some plugin type specific data
* @param plugin a lumieraorg__plugin interface which will be used to initialize this plugin
*/
LumieraPlugin
lumiera_plugin_init (LumieraPlugin self, void* handle, LumieraInterface plugin);
/**
* Tries to load a plugin
* Creates a new plugin structure and tries to load and initialize the plugin.
* The plugins error state may be set on any problem which should be queried later.
* @param plugin path/filename of the plugin to load
* @return pointer to the new plugin structure (always, never NULL, check error state)
*/
LumieraPlugin
lumiera_plugin_load (const char* plugin);
/**
* Register a plugin and its interfaces.
* Registers the plugin (unconditionally) at the pluginregistry.
* When the error state of the plugin is NULL then use its lumieraorg__plugin interface
* to register all interfaces offered by the plugin at the interface registry.
* Registered plugins will be automatic unloaded at application end.
* @param self the plugin to be registered (calling with NULL is a no-op)
* @return 1 on success (including calling with NULL) and 0 when a error occured
*/
int
lumiera_plugin_register (LumieraPlugin self);
/**
* Query the error state of a plugin
* @param self plugin to query
* @return error identifier, NULL if no error was set
*/
lumiera_err
lumiera_plugin_error (LumieraPlugin self);
/**
* Query the plugin handle
* @param self plugin to query
* @return opaque handle set by the loader functions
*/
void*
lumiera_plugin_handle (LumieraPlugin self);
/**
* Query the plugin name
* The name is the path and filname under which it was loaded
* @param self plugin to query
* @return pointer to the name string
*/
const char*
lumiera_plugin_name (LumieraPlugin self);
/**
* Increment refcount
* @internal
* @param self plugin which refcount to increment
*/
void
lumiera_init_plugin (void);
lumiera_plugin_refinc (LumieraPlugin self);
/**
* Make an interface available.
* To use an interface provided by a plugin it must be opened first. It is allowed to open an interface
* more than once. Each open must be paired with a close.
* @param name name of the plugin to use.
* @param interface name of the interface to open.
* @param min_revision the size of the interface structure is used as measure of a minimal required
* revision (new functions are appended at the end)
* @return handle to the interface or NULL in case of a error. The application shall cast this handle to
* the actual interface type.
*/
struct lumiera_interface*
lumiera_interface_open (const char* plugin, const char* name, size_t min_revision);
/**
* Close an interface. Does not free associated resources
* Calling this function with self==NULL is legal. Every interface handle must be closed only once.
* @param ptr interface to be closed
* Decrement refcount
* @internal
* @param self plugin which refcount to decrement
*/
void
lumiera_interface_close (void* self);
lumiera_plugin_refdec (LumieraPlugin self);
/**
* Tries to unload a plugin.
* When the Plugin is unused, then all resources associated with it are freed and it will be removed from memory
* @param plugin name of the plugin to be unloaded.
* @return 0 on success, else the number if users which keeping the plugin loaded
* @param plugin the plugin to be unloaded.
* @return 0 on success, else the refcount of users which keeping the plugin loaded
*/
int
lumiera_plugin_unload (const char* plugin);
unsigned
lumiera_plugin_unload (LumieraPlugin self);
/**
* Tries to unload plugins which are not in use.
* Calls lumiera_plugin_unload() for each Plugin which is not used for more than age seconds.
* This function might be infrequently called by the scheduler to remove things which are not needed.
* @param age timeout in seconds when to unload plugins
* Lookup a plugin handle in the pluginregistry
* @param name name of the plugin to be looked up
* @return plugin handle on success, NULL if the plugin is not found in the registry
*/
LumieraPlugin
lumiera_plugin_lookup (const char* name);
/**
* discover new plugins
* traverses the configured plugin paths and calls the callback_load function for any plugin
* not actually loaded. If callback_load returns a plugin (and not NULL) then this is feed to
* the callback_register function.
*/
int
lumiera_plugin_discover (LumieraPlugin (*callback_load)(const char* plugin),
int (*callback_register) (LumieraPlugin));
/* psplay support functions */
int
lumiera_plugin_cmp_fn (const void* keya, const void* keyb);
const void*
lumiera_plugin_key_fn (const PSplaynode node);
void
lumiera_plugin_expire (time_t age);
lumiera_plugin_delete_fn (PSplaynode node);
LUMIERA_ERROR_DECLARE(PLUGIN_DLOPEN);
LUMIERA_ERROR_DECLARE(PLUGIN_HOOK);
LUMIERA_ERROR_DECLARE(PLUGIN_NFILE);
LUMIERA_ERROR_DECLARE(PLUGIN_NIFACE);
LUMIERA_ERROR_DECLARE(PLUGIN_REVISION);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* LUMIERA_PLUGIN_H */

View file

@ -0,0 +1,60 @@
/*
plugin_dynlib.c - Lumiera Plugin loader for dynamic libraries
Copyright (C) Lumiera.org
2008, Christian Thaeter <ct@pipapo.org>
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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "backend/plugin.h"
#include <dlfcn.h>
#include <nobug.h>
/**
* @file
* Plugin loader for dynamic libraries.
*/
LumieraPlugin
lumiera_plugin_load_DYNLIB (const char* name)
{
TRACE (plugin);
LumieraPlugin self = lumiera_plugin_new (name);
LumieraInterface plugin = NULL;
void* handle = dlopen (name, RTLD_LAZY|RTLD_LOCAL);
if (handle)
{
plugin = (LumieraInterface) dlsym (handle, LUMIERA_INTERFACE_DSTRING (lumieraorg__plugin, 0, lumieraorg_plugin));
if (!plugin)
LUMIERA_ERROR_SET (plugin, PLUGIN_WTF);
}
else
LUMIERA_ERROR_SET (plugin, PLUGIN_OPEN);
return lumiera_plugin_init (self, handle, plugin);
}
void
lumiera_plugin_unload_DYNLIB (LumieraPlugin self)
{
TRACE (plugin);
void* handle = lumiera_plugin_handle (self);
if (handle)
dlclose (handle);
}

View file

@ -24,7 +24,7 @@ noinst_LIBRARIES += liblumicommon.a
liblumicommon_a_CXXFLAGS = $(CXXFLAGS) -Wall
liblumicommon_a_SOURCES = \
$(liblumicommon_a_srcdir)/lumitime.cpp \
$(liblumicommon_a_srcdir)/lumitime.cpp \
$(liblumicommon_a_srcdir)/util.cpp \
$(liblumicommon_a_srcdir)/visitor.cpp \
$(liblumicommon_a_srcdir)/cmdline.cpp \
@ -32,6 +32,7 @@ liblumicommon_a_SOURCES = \
$(liblumicommon_a_srcdir)/error.cpp \
$(liblumicommon_a_srcdir)/query.cpp \
$(liblumicommon_a_srcdir)/query/mockconfigrules.cpp \
$(liblumicommon_a_srcdir)/streamtype.cpp \
$(liblumicommon_a_srcdir)/test/suite.cpp \
$(liblumicommon_a_srcdir)/test/testoption.cpp

View file

@ -26,6 +26,7 @@
#include <string>
#include "proc/nobugcfg.hpp"
#include "lib/appconfig.hpp"
#include "lib/error.h"

View file

@ -100,9 +100,9 @@ namespace lumiera
/**
* For each posible call entry point via some subclass of the visitable hierarchy,
* For each possible call entry point via some subclass of the visitable hierarchy,
* we maintain a dispatcher table to keep track of all concrete tool implementations
* able to recieve and process calls on objects of this subclass.
* able to receive and process calls on objects of this subclass.
*/
template<class TAR, class TOOL>
class Dispatcher

View file

@ -21,10 +21,10 @@ lumigui_srcdir = $(top_srcdir)/src/gui
#lumigui_CFLAGS = $(CFLAGS) -std=gnu99 -Wall -Werror
lumigui_CPPFLAGS = $(AM_CPPFLAGS) \
-DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \
-DPACKAGE_SRC_DIR=\""$(srcdir)"\" \
-DPACKAGE_DATA_DIR=\""$(datadir)"\" \
$(GTK_LUMIERA_CFLAGS)
-DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \
-DPACKAGE_SRC_DIR=\""$(srcdir)"\" \
-DPACKAGE_DATA_DIR=\""$(datadir)"\" \
$(LUMIERA_GUI_CFLAGS)
bin_PROGRAMS += lumigui
@ -78,15 +78,15 @@ lumigui_SOURCES = \
$(lumigui_srcdir)/output/xvdisplayer.cpp \
$(lumigui_srcdir)/output/xvdisplayer.hpp
lumigui_LDFLAGS =
lumigui_LDADD = $(GTK_LUMIERA_LIBS) liblumiproc.a liblumibackend.a \
liblumicommon.a liblumiera.a $(NOBUGMT_LUMIERA_LIBS)
lumigui_LDFLAGS =
# $(LIBS) $(X_PRE_LIBS) $(X_LIBS) $(X_EXTRA_LIBS)
lumigui_LDADD = $(LUMIERA_GUI_LIBS) liblumicommon.a liblumiera.a $(NOBUGMT_LUMIERA_LIBS)
lumigui_DEPENDENCIES = \
$(top_builddir)/lumiera_ui.rc \
$(top_builddir)/liblumicommon.a \
$(top_builddir)/liblumiera.a
lumigui_DEPENDENCIES = \
$(top_builddir)/lumiera_ui.rc \
$(top_builddir)/liblumicommon.a \
$(top_builddir)/liblumi.a
$(top_builddir)/lumiera_ui.rc:
cp $(lumigui_srcdir)/lumiera_ui.rc $(top_builddir)

View file

@ -37,7 +37,8 @@ Track::Track() :
buttonBar.append(lockButton);
buttonBar.set_toolbar_style(TOOLBAR_ICONS);
buttonBar.set_icon_size(ICON_SIZE_MENU);
// buttonBar.set_icon_size(ICON_SIZE_MENU); /////TODO: commented out because it makes compile fail on Etch based system
headerWidget.pack_start(titleBox, PACK_SHRINK);
headerWidget.pack_start(buttonBar, PACK_SHRINK);

View file

@ -31,6 +31,8 @@ liblumiera_a_SOURCES = \
$(liblumiera_a_srcdir)/psplay.c \
$(liblumiera_a_srcdir)/mrucache.c \
$(liblumiera_a_srcdir)/time.c \
$(liblumiera_a_srcdir)/allocationcluster.cpp\
$(liblumiera_a_srcdir)/external/libgavl.cpp \
$(liblumiera_a_srcdir)/appconfig.cpp
noinst_HEADERS += \
@ -46,5 +48,8 @@ noinst_HEADERS += \
$(liblumiera_a_srcdir)/time.h \
$(liblumiera_a_srcdir)/ppmpl.h \
$(liblumiera_a_srcdir)/appconfig.hpp \
$(liblumiera_a_srcdir)/allocationcluster.hpp \
$(liblumiera_a_srcdir)/scopedholdertransfer.hpp \
$(liblumiera_a_srcdir)/scopedholder.hpp \
$(liblumiera_a_srcdir)/external/libgavl.hpp \
$(liblumiera_a_srcdir)/lifecycleregistry.hpp

View file

@ -0,0 +1,243 @@
/*
AllocationCluster - allocating and owning a pile of objects
Copyright (C) Lumiera.org
2008, Hermann Vosseler <Ichthyostega@web.de>
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., 675 Mass Ave, Cambridge, MA 02139, USA.
* *****************************************************/
#include "lib/allocationcluster.hpp"
#include "common/error.hpp"
#include "common/util.hpp"
using util::isnil;
namespace lib {
/**
* "Low-level" Memory manager for allocating small objects of a fixed size.
* The usage pattern is definite: Objects will be allocated in the course of
* a build process and then live until all Objects will be purged in one sway.
* Allocations will be requested one by one and immediately committed after
* successful ctor call of the object being allocated. Allocations and commits
* can be assumed to come in pairs, thus if an allocation immediately follows
* another one (without commit), the previous allocation can be considered
* a failure and can be dropped silently. After an allocation has succeeds
* (i.e. was committed), the MemoryManager is in charge for the lifecycle
* of the object within the allocated spaces and has to guarantee calling
* it's dtor, either on shutdown or on explicit #purge() -- the type info
* structure handed in on initialisation provides a means for invoking
* the dtor without actually knowing the object's type.
*
* @todo this is a preliminary or pseudo-implementation based on
* a vector of raw pointers, i.e. actually the objects are heap
* allocated. What actually should happen is for the MemoryManager to
* allocate raw memory chunk wise, sub partition it and place the objects
* into this private memory buffer. Further, possibly we could maintain
* a pool of raw memory chunks used by all MemoryManager instances. I am
* skipping those details for now (10/2008) because they should be based
* on real-world measurements, not guessing.
*/
class AllocationCluster::MemoryManager
{
typedef std::vector<char*> MemTable;
TypeInfo type_;
MemTable mem_;
size_t top_; ///< index of the next slot available for allocation
public:
MemoryManager(TypeInfo info) : top_(0) { reset(info); }
~MemoryManager() { purge(); }
void purge();
void reset(TypeInfo info);
void* allocate();
void commit (void* pendingAlloc);
private:
void clearStorage();
};
void
AllocationCluster::MemoryManager::reset (TypeInfo info)
{
Thread::Lock<MemoryManager> guard SIDEEFFECT;
if (0 < mem_.size()) purge();
type_ = info;
ENSURE (0==top_);
ENSURE (isnil (mem_));
ENSURE (0 < type_.allocSize);
ENSURE (type_.killIt);
}
void
AllocationCluster::MemoryManager::purge()
{
Thread::Lock<MemoryManager> guard SIDEEFFECT;
REQUIRE (type_.killIt, "we need a deleter function");
REQUIRE (0 < type_.allocSize, "allocation size unknown");
REQUIRE (top_ == mem_.size() || (top_+1) == mem_.size());
while (top_)
type_.killIt (mem_[--top_]);
clearStorage();
}// note: unnecessary to kill pending allocations
inline void
AllocationCluster::MemoryManager::clearStorage()
{
for (size_t i=mem_.size(); 0 < i; )
delete[] mem_[--i];
mem_.clear();
}
inline void*
AllocationCluster::MemoryManager::allocate()
{
Thread::Lock<MemoryManager> guard SIDEEFFECT;
REQUIRE (0 < type_.allocSize);
REQUIRE (top_ <= mem_.size());
if (top_==mem_.size())
mem_.resize(top_+1);
if (!mem_[top_]) // re-use existing allocation, if any
mem_[top_] = new char[type_.allocSize];
ENSURE (top_ < mem_.size());
ENSURE (mem_[top_]);
return mem_[top_];
}
inline void
AllocationCluster::MemoryManager::commit (void* pendingAlloc)
{
Thread::Lock<MemoryManager> guard SIDEEFFECT;
REQUIRE (pendingAlloc);
ASSERT (top_ < mem_.size());
ASSERT (pendingAlloc == mem_[top_], "allocation protocol violated");
++top_;
ENSURE (top_ == mem_.size());
}
/** storage for static bookkeeping of type allocation slots */
size_t AllocationCluster::maxTypeIDs;
/** creating a new AllocationCluster prepares a table capable
* of holding the individual object families to come. Each of those
* is managed by a separate instance of the low-level memory manager.
*/
AllocationCluster::AllocationCluster()
{
TRACE (buildermem, "new AllocationCluster");
}
/** On shutdown of the AllocationCluster we need to assure a certain
* destruction order is maintained by explicitly invoking a cleanup
* operation on each of the low-level memory manager objects.
*/
AllocationCluster::~AllocationCluster() throw()
{
try
{
Thread::Lock<AllocationCluster> guard SIDEEFFECT
TRACE (buildermem, "shutting down AllocationCluster");
for (size_t i = typeHandlers_.size(); 0 < i; --i)
if (handler(i))
handler(i)->purge();
typeHandlers_.clear();
}
catch (lumiera::Error & ex)
{
WARN (oper, "Exception while closing AllocationCluster: %s",ex.what());
}
catch (...)
{
ERROR (NOBUG_ON, "Unexpected fatal Exception while closing AllocationCluster.");
lumiera::error::lumiera_unexpectedException(); // terminate
}
}
void*
AllocationCluster::initiateAlloc (size_t& slot)
{
if (!slot || slot > typeHandlers_.size() || !handler(slot) )
return 0; // Memory manager not yet initialised
else
return handler(slot)->allocate();
}
void*
AllocationCluster::initiateAlloc (TypeInfo type, size_t& slot)
{
ASSERT (0 < slot);
{
Thread::Lock<AllocationCluster> guard SIDEEFFECT; /////TODO: decide tradeoff: lock just the instance, or lock the AllocationCluster class?
if (slot > typeHandlers_.size())
typeHandlers_.resize(slot);
if (!handler(slot))
handler(slot).reset (new MemoryManager (type));
}
ASSERT (handler(slot));
return initiateAlloc(slot);
}
void
AllocationCluster::finishAlloc (size_t& slot, void* allocatedObj)
{
ASSERT (handler(slot));
ASSERT (allocatedObj);
handler(slot)->commit(allocatedObj);
}
} // namespace lib

View file

@ -0,0 +1,275 @@
/*
ALLOCATIONCLUSTER.hpp - allocating and owning a pile of objects
Copyright (C) Lumiera.org
2008, Hermann Vosseler <Ichthyostega@web.de>
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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/** @file allocationcluster.hpp
** Memory management for the low-level model (render nodes network).
** The model is organised into temporal segments, which are considered
** to be structurally constant and uniform. The objects within each
** segment are strongly interconnected, and thus each segment is
** being built in a single build process and is replaced or released
** as a whole. AllocationCluster implements memory management to
** support this usage pattern.
**
** @note this file is organised in a way which doesn't bind the
** client code to the memory manager implementation. Parts of the
** interface depending on the usage situation are implemented using
** templates, and thus need to be in the header. This way they can
** exploit the type information available in call context. This
** information is passed to generic implementation functions
** defined in allocationcluster.cpp . In a similar vein, the
** AllocationCluster::MemoryManger is just forward declared.
**
** @see allocationclustertest.cpp
** @see builder::ToolFactory
** @see frameid.hpp
*/
#ifndef LIB_ALLOCATIONCLUSTER_H
#define LIB_ALLOCATIONCLUSTER_H
#include <vector>
#include <boost/scoped_ptr.hpp>
#include <boost/noncopyable.hpp>
#include "common/multithread.hpp"
#include "common/error.hpp"
#include "lib/scopedholder.hpp"
#include "lib/scopedholdertransfer.hpp"
namespace lib {
using boost::scoped_ptr;
using lumiera::Thread;
/**
* A pile of objects sharing common allocation and lifecycle.
* AllocationCluster owns a number of object families of various types.
* Each of those contains a initially undetermined (but rather large)
* number of individual objects, which can be expected to be allocated
* within a short timespan and which are to be released cleanly on
* destruction of the AllocationCluster. We provide a service creating
* individual objects with arbitrary ctor parameters.
* @warning make sure the objects dtors aren't called and object references
* aren't used after shutting down a given AllocationCluster.
* @todo implement a facility to control the oder in which
* the object families are to be discarded. Currently
* they are just purged in reverse order defined by
* the first request for allocating a certain type.
*/
class AllocationCluster
: boost::noncopyable
{
public:
AllocationCluster ();
~AllocationCluster () throw();
template<class TY>
TY&
create ()
{
TY* obj = new(allocation<TY>()) TY();
return commit(obj);
}
template<class TY, typename P0>
TY&
create (P0& p0)
{
TY* obj = new(allocation<TY>()) TY (p0);
return commit(obj);
}
template<class TY, typename P0, typename P1>
TY&
create (P0& p0, P1& p1)
{
TY* obj = new(allocation<TY>()) TY (p0,p1);
return commit(obj);
}
template<class TY, typename P0, typename P1, typename P2>
TY&
create (P0& p0, P1& p1, P2& p2)
{
TY* obj = new(allocation<TY>()) TY (p0,p1,p2);
return commit(obj);
}
template<class TY, typename P0, typename P1, typename P2, typename P3>
TY&
create (P0& p0, P1& p1, P2& p2, P3& p3)
{
TY* obj = new(allocation<TY>()) TY (p0,p1,p2,p3);
return commit(obj);
}
private:
/** initiate an allocation for the given type */
template<class TY>
void*
allocation();
/** finish the allocation after the ctor is successful */
template<class TY>
TY&
commit (TY* obj);
/**
* The type-specific configuration information
* any low-level memory manager needs to know
*/
struct TypeInfo;
/**
* low-level memory manager responsible for
* the allocations of one specific type.
*/
class MemoryManager;
/**
* organising the association Type -> table entry
*/
template<class TY>
struct TypeSlot;
static size_t maxTypeIDs;
typedef ScopedPtrHolder<MemoryManager> HMemManager;
typedef Allocator_TransferNoncopyable<HMemManager> Allo;
typedef std::vector<HMemManager,Allo> ManagerTable;
ManagerTable typeHandlers_; ///< table of active MemoryManager instances
HMemManager&
handler (size_t slot)
{
ASSERT (0<slot && slot<=typeHandlers_.size());
return typeHandlers_[slot-1];
}
/** implementation of the actual memory allocation
* is pushed down to the MemoryManager impl. */
void* initiateAlloc (size_t& slot);
void* initiateAlloc (TypeInfo type, size_t& slot);
/** enrol the allocation after successful ctor call */
void finishAlloc (size_t& slot, void*);
};
//-----implementation-details------------------------
struct AllocationCluster::TypeInfo
{
size_t allocSize;
void (*killIt)(void*); ///< deleter function
template<class TY>
TypeInfo(TY*)
: allocSize(sizeof(TY)),
killIt(&TypeSlot<TY>::kill)
{ }
TypeInfo() ///< denotes "unknown" type
: allocSize(0),
killIt(0)
{ }
};
template<class TY>
struct AllocationCluster::TypeSlot
{
static size_t id_; ///< table pos+1 of the memory manager in charge for type TY
static size_t &
get()
{
return id_;
}
static TypeInfo
setup()
{
Thread::Lock<AllocationCluster> guard SIDEEFFECT;
if (!id_)
id_= ++maxTypeIDs;
return TypeInfo ((TY*) 0 );
}
static void
kill (void* obj)
{
TY* p = static_cast<TY*>(obj);
ASSERT (p);
ASSERT (INSTANCEOF (TY,p));
p->~TY();
}
};
/** storage for static bookkeeping of type allocation slots */
template<class TY>
size_t AllocationCluster::TypeSlot<TY>::id_;
template<class TY>
inline void*
AllocationCluster::allocation()
{
void *mem = initiateAlloc (TypeSlot<TY>::get());
if (!mem)
mem = initiateAlloc (TypeSlot<TY>::setup(),TypeSlot<TY>::get());
ENSURE (mem);
return mem;
}
template<class TY>
inline TY&
AllocationCluster::commit (TY* obj)
{
REQUIRE (obj);
finishAlloc (TypeSlot<TY>::get(), obj);
return *obj;
}
} // namespace lib
#endif

View file

@ -60,7 +60,7 @@ lumiera_error_set (lumiera_err nerr)
lumiera_err
lumiera_error ()
lumiera_error (void)
{
pthread_once (&lumiera_error_initialized, lumiera_error_tls_init);
@ -69,3 +69,12 @@ lumiera_error ()
pthread_setspecific (lumiera_error_tls, NULL);
return err;
}
lumiera_err
lumiera_error_peek (void)
{
pthread_once (&lumiera_error_initialized, lumiera_error_tls_init);
return pthread_getspecific (lumiera_error_tls);
}

View file

@ -88,7 +88,19 @@ lumiera_error_set (lumiera_err err);
* @return pointer to any pending error of this thread, NULL if no error is pending
*/
lumiera_err
lumiera_error ();
lumiera_error (void);
/**
* Check current error state without clearing it
* Please avoid this function and use lumiera_error() if possible. Errors must be cleared else certain
* parts of the application refuse to cooperate with you. This shall only be used to decide if one
* wants to barf out of a loop or subroutine to deliver the error to a higher level.
* @return pointer to any pending error of this thread, NULL if no error is pending
*/
lumiera_err
lumiera_error_peek (void);
/*
predefined errors

View file

@ -48,6 +48,27 @@ typedef lumiera_uid* LumieraUid;
#define LUMIERA_UID_INITIALIZER(l) l
#endif
#define LUMIERA_UID_FMT \
"\\%.3hho\\%.3hho\\%.3hho\\%.3hho" \
"\\%.3hho\\%.3hho\\%.3hho\\%.3hho" \
"\\%.3hho\\%.3hho\\%.3hho\\%.3hho" \
"\\%.3hho\\%.3hho\\%.3hho\\%.3hho"
#define LUMIERA_UID_CHAR(l,n) ((unsigned char*)l)[n]
#define LUMIERA_UID_ELEMENTS(l) \
LUMIERA_UID_CHAR(l,0), LUMIERA_UID_CHAR(l,1), LUMIERA_UID_CHAR(l,2), LUMIERA_UID_CHAR(l,3), \
LUMIERA_UID_CHAR(l,4), LUMIERA_UID_CHAR(l,5), LUMIERA_UID_CHAR(l,6), LUMIERA_UID_CHAR(l,7), \
LUMIERA_UID_CHAR(l,8), LUMIERA_UID_CHAR(l,9), LUMIERA_UID_CHAR(l,10), LUMIERA_UID_CHAR(l,11), \
LUMIERA_UID_CHAR(l,12), LUMIERA_UID_CHAR(l,13), LUMIERA_UID_CHAR(l,14), LUMIERA_UID_CHAR(l,15)
/**
* LUIDGEN will be replaced by the 'luidgen' tool with a random uuid
*/
#define LUIDGEN PLEASE_RUN_THE_LUIDGEN_TOOL_ON_THIS_FILE
/**
* Retrieve a generic pointer stored in a luid
*/

253
src/lib/scopedholder.hpp Normal file
View file

@ -0,0 +1,253 @@
/*
SCOPEDHOLDER.hpp - general purpose wrapper for dealing with ownership problems
Copyright (C) Lumiera.org
2008, Hermann Vosseler <Ichthyostega@web.de>
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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/** @file scopedholder.hpp
** Some wrappers for coping with ownership problems.
** Working with collections of objects, especially in conjunction with
** polymorphism, can be challenging when we are bound to care for lifecycle
** and ownership for the contained classes. There are several solutions,
** including the boost::ptr_container library, the use of shared_ptr
** or even a garbage collector. Sometimes the circumstances rather call
** for a very simple or lightweight solution though.
**
** ScopedPtrHolder is a simple extension to boost::scoped_ptr, enabling
** to use it within STL containers if we stick to a specific protocol.
** The idea is to permit copying as long as the scoped_ptr is empty.
** This can be used to allow for extension of the STL container on
** demand, i.e. to handle the typical situation of a registry which
** is initialised lazily, but only released in a controlled fashion.
**
** ScopedHolder implements a similar concept for in-place storage of
** noncopyable objects within STL containers.
**
** While the added copy operations (secured with the "empty" requirement)
** are enough to use those holders within fixed sized STL containers,
** supporting dynamic growth (like in std::vector#resize() ) additionally
** requires a facility to transfer the lifecycle management control between
** holder instances. This is the purpose of the \c transfer_control
** friend function.
**
** @see scopedholdertest.cpp
** @see scopedholdertransfer.hpp use in std::vector
** @see AllocationCluster usage example
*/
#ifndef LIB_SCOPEDHOLDER_H
#define LIB_SCOPEDHOLDER_H
#include <boost/scoped_ptr.hpp>
#include "common/error.hpp"
namespace lib {
/**
* Extension to boost::scoped_ptr, allowing copy operations
* on empty pointers (i.e. contained pointer is null).
* @throw error::Logic on attempt to copy otherwise
*/
template<class B>
class ScopedPtrHolder
: public boost::scoped_ptr<B>
{
typedef boost::scoped_ptr<B> _Parent;
static B* must_be_null (_Parent const& ptr)
{
if (ptr)
throw lumiera::error::Logic("ScopedPtrHolder protocol violation: "
"attempt to copy from non-null.");
return 0;
}
public:
ScopedPtrHolder ()
: _Parent(0)
{ }
template<class SU>
explicit ScopedPtrHolder (SU * p) // never throws
: _Parent(p)
{ }
template<class SU>
explicit ScopedPtrHolder (std::auto_ptr<SU> p) // never throws
: _Parent(p.release())
{ }
ScopedPtrHolder (ScopedPtrHolder const& ref)
: _Parent(must_be_null (ref))
{ }
ScopedPtrHolder&
operator= (ScopedPtrHolder const& ref)
{
must_be_null (*this);
must_be_null (ref);
return *this;
}
friend void
transfer_control (ScopedPtrHolder& from, ScopedPtrHolder& to)
{
if (!from) return;
TRACE (test, "transfer_control<ScopedPtrHolder>... from=%x to=%x",&from, &to);
must_be_null (to);
to.swap(from);
}
};
/**
* Inline buffer holding and owning an object similar to scoped_ptr.
* Access to the contained object is similar to a smart-pointer,
* but the object isn't heap allocated, rather placed into an
* buffer within ScopedHolder. Initially, ScopedHolder is empty
* and behaves like a null pointer. The contained object must be
* created explicitly by calling #create() (using the default ctor).
* This state change is remembered (requiring 1 char of additional
* storage). After the creation of the object, ScopedHolder is
* effectively noncopyable, which is enforced by run-time checks.
* ScopedHolder may be used to hold noncopyable objects within STL
* containers inline without extra heap allocation.
*/
template<class TY>
class ScopedHolder
{
char content_[sizeof(TY)];
char created_;
typedef ScopedHolder<TY> _ThisType;
static char must_be_empty (_ThisType const& ref)
{
if (ref)
throw lumiera::error::Logic("ScopedHolder protocol violation: "
"copy operation after having invoked create().");
return 0;
}
public:
ScopedHolder()
: created_(0)
{ }
~ScopedHolder() { clear(); }
TY&
create ()
{
ASSERT (!created_);
TY * obj = new(content_) TY();
++created_;
return *obj;
}
void
clear ()
{
if (created_)
get()->~TY();
}
ScopedHolder (ScopedHolder const& ref)
: created_(must_be_empty (ref))
{ }
ScopedHolder&
operator= (ScopedHolder const& ref)
{
must_be_empty (*this);
must_be_empty (ref);
return *this;
}
TY&
operator* () const // never throws
{
ASSERT (created_);
return (TY&) content_;
}
TY*
operator-> () const // never throws
{
ASSERT (created_);
return (TY*) &content_;
}
TY* get() const // never throws
{
return (TY*) &content_;
}
typedef char _ThisType::*unspecified_bool_type;
/** implicit conversion to "bool" */
operator unspecified_bool_type() const // never throws
{
return created_? &_ThisType::created_ : 0;
}
bool operator! () const { return !created_; }
friend void
transfer_control (ScopedHolder& from, ScopedHolder& to)
{
if (!from) return;
TRACE (test, "transfer_control<ScopedHolder>... from=%x to=%x",&from, &to);
must_be_empty (to);
to.create();
try
{
transfer_control(*from,*to); // note: assumed to have no side-effect in case it throws
from.clear();
return;
}
catch(...)
{
to.clear();
WARN (test, "transfer_control operation aborted.");
throw;
}
}
};
} // namespace lib
#endif

View file

@ -0,0 +1,137 @@
/*
SCOPEDHOLDERVECTOR.hpp - using ScopedHolder within a STL vector
Copyright (C) Lumiera.org
2008, Hermann Vosseler <Ichthyostega@web.de>
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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef LIB_SCOPEDHOLDERVECTOR_H
#define LIB_SCOPEDHOLDERVECTOR_H
#include "common/error.hpp"
#include <memory>
namespace lib {
/**
* Addendum to scopedholder.hpp for transferring the lifecycle
* management to another instance. Using these wrappers within
* STL vector and similar containers may result in the need to
* do a re-allocation in response to a request to grow.
* Obviously such a feature needs support by the objects being
* wrapped, which should provide an operation for transferring
* lifecycle management in a controlled fashion. This behaviour
* is similar to std::auto_ptr, but because we use a separate
* dedicated operation, we avoid some of the dangers pertaining
* the use of the latter: just taking the "value" can't kill
* the managed object.
* \par
* To implement this feature we need
* - a custom allocator to be used by the vector. By default
* it is built as a thin proxy round std::allocator.
* - the \em noncopyable type to be managed within the vector
* needs to provide a custom extension point: when the
* allocator detects the need to transfer control between
* two instances, it will invoke a free function named
* <tt> transfer_control(TY& from, TY& to)</tt> intended
* to be found by ADL. Note: in case this function throws,
* it <i>must not have any side effects</i>.
* - besides, the \em noncopyable type needs to provide an
* <tt>operator bool()</tt> yielding true iff currently
* containing an managed object. This is similar to
* boost::scoped_ptr or even the behaviour of a plain
* old raw pointer, which is equivalent to \c true
* when the pointer isn'T \c NULL
*
*/
template<class TY, class PAR = std::allocator<TY> >
class Allocator_TransferNoncopyable
{
typedef Allocator_TransferNoncopyable<TY,PAR> _ThisType;
PAR par_;
public:
typedef typename PAR::size_type size_type;
typedef typename PAR::difference_type difference_type;
typedef typename PAR::pointer pointer;
typedef typename PAR::const_pointer const_pointer;
typedef typename PAR::reference reference;
typedef typename PAR::const_reference const_reference;
typedef typename PAR::value_type value_type;
template<typename XX>
struct rebind
{ typedef Allocator_TransferNoncopyable<XX, PAR> other; };
Allocator_TransferNoncopyable() { }
Allocator_TransferNoncopyable(const _ThisType& allo)
: par_(allo.par_) { }
Allocator_TransferNoncopyable(const PAR& allo)
: par_(allo) { }
template<typename X>
Allocator_TransferNoncopyable(const std::allocator<X>&) { }
~Allocator_TransferNoncopyable() { }
//------------proxying-the-parent-allocator------------------------------------
size_type max_size() const { return par_.max_size(); }
pointer address(reference r) const { return par_.address(r); }
const_pointer address(const_reference cr) const { return par_.address(cr); }
pointer allocate(size_type n, const void *p=0){ return par_.allocate(n,p); }
void deallocate(pointer p, size_type n) { return par_.deallocate(p,n); }
void destroy(pointer p) { return par_.destroy(p); }
void
construct (pointer p, const TY& ref)
{
new(p) TY();
ASSERT (p);
ASSERT (!(*p), "protocol violation: target already manages another object.");
if (ref)
transfer_control (const_cast<TY&>(ref), *p);
}
};
template<typename TY1, typename TY2, class ALO>
inline bool
operator== (Allocator_TransferNoncopyable<TY1,ALO> const&, Allocator_TransferNoncopyable<TY2, ALO> const&)
{ return true; }
template<typename TY1, typename TY2, class ALO>
inline bool
operator!= (Allocator_TransferNoncopyable<TY1,ALO> const&, Allocator_TransferNoncopyable<TY2,ALO> const&)
{ return false; }
} // namespace lib
#endif

View file

@ -112,7 +112,8 @@ noinst_LIBRARIES += liblumiproccontrol.a
liblumiproccontrol_a_CXXFLAGS = $(CXXFLAGS) -Wall
liblumiproccontrol_a_SOURCES = \
$(liblumiproccontrol_a_srcdir)/pathmanager.cpp
$(liblumiproccontrol_a_srcdir)/pathmanager.cpp \
$(liblumiproccontrol_a_srcdir)/stypemanager.cpp
liblumiprocmobjectsession_a_srcdir = $(top_srcdir)/src/proc/mobject/session
@ -125,11 +126,11 @@ liblumiprocmobjectsession_a_SOURCES = \
$(liblumiprocmobjectsession_a_srcdir)/allocation.cpp \
$(liblumiprocmobjectsession_a_srcdir)/auto.cpp \
$(liblumiprocmobjectsession_a_srcdir)/clip.cpp \
$(liblumiprocmobjectsession_a_srcdir)/compoundclip.cpp \
$(liblumiprocmobjectsession_a_srcdir)/compoundclip.cpp \
$(liblumiprocmobjectsession_a_srcdir)/constraint.cpp \
$(liblumiprocmobjectsession_a_srcdir)/defsmanager.cpp \
$(liblumiprocmobjectsession_a_srcdir)/effect.cpp \
$(liblumiprocmobjectsession_a_srcdir)/fixedlocation.cpp \
$(liblumiprocmobjectsession_a_srcdir)/fixedlocation.cpp \
$(liblumiprocmobjectsession_a_srcdir)/label.cpp \
$(liblumiprocmobjectsession_a_srcdir)/meta.cpp \
$(liblumiprocmobjectsession_a_srcdir)/relativelocation.cpp \

View file

@ -56,6 +56,7 @@
NOBUG_DECLARE_FLAG(singleton);
NOBUG_DECLARE_FLAG(assetmem);
NOBUG_DECLARE_FLAG(mobjectmem);
NOBUG_DECLARE_FLAG(buildermem);
namespace lumiera {
@ -80,6 +81,7 @@ namespace lumiera {
NOBUG_CPP_DEFINE_FLAG_LIMIT(singleton, LOG_WARNING);
NOBUG_CPP_DEFINE_FLAG_LIMIT(assetmem, LOG_WARNING);
NOBUG_CPP_DEFINE_FLAG_LIMIT(mobjectmem, LOG_WARNING);
NOBUG_CPP_DEFINE_FLAG_LIMIT(buildermem, LOG_INFO);

View file

@ -24,4 +24,4 @@ luidgen_CPPFLAGS = -I$(top_srcdir)/src/
luidgen_SOURCES = \
$(lumitool_srcdir)/luidgen.c
luidgen_LDADD = liblumiera.a
luidgen_LDADD = liblumiera.a $(NOBUGMT_LUMIERA_LIBS)

View file

@ -9,6 +9,6 @@ Import('env','artifacts','core')
# build the ubiquitous Hello World application (note: C source)
artifacts['tools'] = [ env.Program('#$BINDIR/hello-world','hello.c')
+ env.Program('#$BINDIR/luidgen', ['luidgen.c']+core)
+ env.Program('#$BINDIR/try', 'try.cpp') #### to try out some feature...
+ env.Program('#$BINDIR/try', 'try.cpp') #### to try out some feature...
]

View file

@ -19,25 +19,98 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "lib/safeclib.h"
#include "lib/luid.h"
#include <unistd.h>
#include <stdint.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <nobug.h>
/**
* @file
* Generate amd print a Lumiera uid as octal escaped string
* or process a file replaceing 'LUIDGEN' with a octal escaped string
*/
int
main (int argc, char** argv)
{
NOBUG_INIT;
lumiera_uid luid;
lumiera_uid_gen (&luid);
printf ("\"");
for (int i = 0; i < 16; ++i)
printf ("\\%.3hho", *(((char*)&luid)+i));
printf ("\"\n");
if (argc == 1)
{
lumiera_uid_gen (&luid);
printf ("\"");
for (int i = 0; i < 16; ++i)
printf ("\\%.3hho", *(((char*)&luid)+i));
printf ("\"\n");
}
else
{
for (int i = 1; i < argc; ++i)
{
FILE* in = fopen (argv[i], "r");
if (!in)
{
fprintf (stderr, "Failed to open file %s for reading: %s\n", argv[i], strerror (errno));
continue;
}
char* outname = lumiera_tmpbuf_snprintf (SIZE_MAX, "%s.luidgen", argv[i]);
FILE* out = fopen (outname, "wx");
if (!out)
{
fprintf (stderr, "Failed to open file %s for writing: %s\n", outname, strerror (errno));
fclose (in);
continue;
}
char buf[4096];
char luidbuf[67];
printf ("Luidgen %s ", argv[i]); fflush (stdout);
while (fgets (buf, 4096, in))
{
char* pos;
while ((pos = strstr(buf, "LUIDGEN")))
{
memmove (pos+66, pos+7, strlen (pos+7)+1);
lumiera_uid_gen (&luid);
sprintf (luidbuf, "\""LUMIERA_UID_FMT"\"", LUMIERA_UID_ELEMENTS(luid));
memcpy (pos, luidbuf, 66);
putchar ('.'); fflush (stdout);
}
fputs (buf, out);
}
fclose (out);
fclose (in);
char* backup = lumiera_tmpbuf_snprintf (SIZE_MAX, "%s~", argv[i]);
unlink (backup);
if (!!rename (argv[i], backup))
{
fprintf (stderr, "Failed to create backupfile %s: %s\n", backup, strerror (errno));
continue;
}
if (!!rename (outname, argv[i]))
{
fprintf (stderr, "Renaming %s to %s failed: %s\n", outname, argv[i], strerror (errno));
rename (backup, argv[i]);
continue;
}
printf (" done\n");
}
}
return 0;
}

View file

@ -11,12 +11,16 @@
// 4/08 - conversions on the value_type used for boost::any
// 5/08 - how to guard a downcasting access, so it is compiled in only if the involved types are convertible
// 7/08 - combining partial specialisation and subclasses
// 10/8 - abusing the STL containers to hold noncopyable values
#include <nobug.h>
//#include "proc/nobugcfg.hpp"
#include <iostream>
#include <typeinfo>
//#include <typeinfo>
#include <boost/format.hpp>
//#include <boost/noncopyable.hpp>
using std::string;
using std::cout;
@ -24,18 +28,19 @@ using boost::format;
namespace {
boost::format fmt ("<%2i>");
long checksum = 0;
}
int
main (int argc, char* argv[])
{
NOBUG_INIT;
cout << "\ngulp\n";
cout << "\n.gulp.\n";
return 0;

View file

@ -1,24 +0,0 @@
TESTING "test plugin example code" ./test-plugin
PLANNED "C plugin example" C <<END
out: opened
out: Hallo Welt!
out: Tschuess C
out: opened
out: Hello World!
out: Bye C
out: closed
out: closed
END
PLANNED "C++ plugin example" C++ <<END
out: opened
out: Hallo Welt!
out: Tschuess C++
out: opened
out: Hello World!
out: Bye C++
out: closed
out: closed
END

38
tests/30interfaces.tests Normal file
View file

@ -0,0 +1,38 @@
TESTING "test interfaces" ./test-interfaces
TEST "Basic operations" basic <<END
return: 0
END
TEST "opening / closing interfaces" open_close <<END
return: 0
END
TEST "dependencies 1" dependencies_one <<END
return: 0
END
TEST "dependencies 2" dependencies_two <<END
return: 0
END
TEST "dependencies 3" dependencies_three <<END
return: 0
END
TEST "depedencies 4" dependencies_four <<END
return: 0
END
TEST "dependencies all" dependencies_all <<END
return: 0
END

29
tests/31plugin.tests Normal file
View file

@ -0,0 +1,29 @@
TESTING "testing plugins" ./test-interfaces
TEST "discovering plugins, missing path" plugin_discover <<END
out: found plugin: (null)
return: 0
END
export LUMIERA_PLUGIN_PATH=.libs
TEST "discovering plugins" plugin_discover <<END
out: found plugin: .libs/examplepluginc.so
return: 0
END
TEST "plugin unloading" plugin_unload <<END
out: plugin unload: (nil)
return: 0
END
TEST "C plugin test" plugin_examplepluginc <<END
out: Hallo Welt!
out: Tschuess Welt!
out: Hello World!
out: Bye World!
return: 0
END
unset LUMIERA_PLUGIN_PATH

View file

@ -10,6 +10,11 @@ return: 0
END
TEST "AllocationCluster_test" AllocationCluster_test <<END
return: 0
END
TEST "Appconfig_test" Appconfig_test <<END
return: 0
END
@ -266,6 +271,30 @@ out: TestSingletonO::doIt() call=3
END
TEST "ScopedHolder_test" ScopedHolder_test <<END
out: checking ScopedHolder<Dummy>...
out: checking ScopedPtrHolder<Dummy>...
END
TEST "ScopedHolderTransfer_test" ScopedHolderTransfer_test <<END
out: checking ScopedHolder<Dummy>...
out: .
out: ..install one element at index[0]
out: .
out: ..*** resize table to 16 elements
out: .
out: .throw some exceptions...
out: checking ScopedPtrHolder<Dummy>...
out: .
out: ..install one element at index[0]
out: .
out: ..*** resize table to 16 elements
out: .
out: .throw some exceptions...
END
TEST "Singleton_test" Singleton_test 23 <<END
out: testing TargetObj(23) as Singleton(statically allocated)
out: ctor TargetObj(23) successfull
@ -452,6 +481,11 @@ return: 0
END
TEST "VectorTransfer_test" VectorTransfer_test <<END
return: 0
END
TEST "VisitingTool_test" VisitingTool_test <<END
out: === Babbler meets Boss and BigBoss ===
out: Hello Boss, nice to meet you...

View file

@ -21,51 +21,57 @@ tests_srcdir = $(top_srcdir)/tests
check_PROGRAMS += test-error
test_error_SOURCES = $(tests_srcdir)/error/errortest.c
test_error_CPPFLAGS = $(AM_CPPFLAGS) -std=gnu99 -Wall -Werror
test_error_LDADD = liblumiera.a $(NOBUGMT_LUMIERA_LIBS) -ldl
test_error_LDADD = liblumiera.a $(NOBUGMT_LUMIERA_LIBS)
check_PROGRAMS += test-locking
test_locking_SOURCES = $(tests_srcdir)/library/test-locking.c
test_locking_CPPFLAGS = $(AM_CPPFLAGS) -std=gnu99 -Wall -Werror
test_locking_LDADD = liblumiera.a $(NOBUGMT_LUMIERA_LIBS) -ldl -lm
test_locking_LDADD = liblumiera.a $(NOBUGMT_LUMIERA_LIBS)
check_PROGRAMS += test-llist
test_llist_SOURCES = $(tests_srcdir)/library/test-llist.c
test_llist_CPPFLAGS = $(AM_CPPFLAGS) -std=gnu99 -Wall -Werror
test_llist_LDADD = liblumiera.a $(NOBUGMT_LUMIERA_LIBS) -ldl -lm
test_llist_LDADD = liblumiera.a $(NOBUGMT_LUMIERA_LIBS)
check_PROGRAMS += test-psplay
test_psplay_SOURCES = $(tests_srcdir)/library/test-psplay.c
test_psplay_CPPFLAGS = $(AM_CPPFLAGS) -std=gnu99 -Wall -Werror -I$(top_srcdir)/src/
test_psplay_LDADD = liblumiera.a $(NOBUGMT_LUMIERA_LIBS) -ldl -lm
test_psplay_LDADD = liblumiera.a $(NOBUGMT_LUMIERA_LIBS)
check_PROGRAMS += test-safeclib
test_safeclib_SOURCES = $(tests_srcdir)/library/test-safeclib.c
test_safeclib_CPPFLAGS = $(AM_CPPFLAGS) -std=gnu99 -Wall -Werror
test_safeclib_LDADD = liblumiera.a $(NOBUGMT_LUMIERA_LIBS) -ldl -lm
test_safeclib_LDADD = liblumiera.a $(NOBUGMT_LUMIERA_LIBS)
check_PROGRAMS += test-luid
test_luid_SOURCES = $(tests_srcdir)/library/test-luid.c
test_luid_CPPFLAGS = $(AM_CPPFLAGS) -std=gnu99 -Wall -Werror
test_luid_LDADD = liblumiera.a $(NOBUGMT_LUMIERA_LIBS) -ldl -lm
check_PROGRAMS += test-interfaces
test_interfaces_SOURCES = $(tests_srcdir)/backend/test-interfaces.c
test_interfaces_CPPFLAGS = $(AM_CPPFLAGS) -std=gnu99 -Wall -Werror
test_interfaces_LDADD = liblumibackend.a liblumiera.a $(NOBUGMT_LUMIERA_LIBS) -ldl -lm
test_luid_LDADD = liblumiera.a $(NOBUGMT_LUMIERA_LIBS)
check_PROGRAMS += test-filedescriptors
test_filedescriptors_SOURCES = $(tests_srcdir)/backend/test-filedescriptors.c
test_filedescriptors_CPPFLAGS = $(AM_CPPFLAGS) -std=gnu99 -Wall -Werror
test_filedescriptors_LDADD = liblumibackend.a liblumiera.a $(NOBUGMT_LUMIERA_LIBS) -ldl -lm
test_filedescriptors_LDADD = liblumibackend.a liblumiera.a $(NOBUGMT_LUMIERA_LIBS)
check_PROGRAMS += test-filehandles
test_filehandles_SOURCES = $(tests_srcdir)/backend/test-filehandles.c
test_filehandles_CPPFLAGS = $(AM_CPPFLAGS) -std=gnu99 -Wall -Werror
test_filehandles_LDADD = liblumibackend.a liblumiera.a $(NOBUGMT_LUMIERA_LIBS) -ldl -lm
test_filehandles_LDADD = liblumibackend.a liblumiera.a $(NOBUGMT_LUMIERA_LIBS)
check_PROGRAMS += test-config
test_config_SOURCES = $(tests_srcdir)/backend/test-config.c
test_config_CPPFLAGS = $(AM_CPPFLAGS) -std=gnu99 -Wall -Werror -I$(top_srcdir)/src/
test_config_LDADD = liblumibackend.a liblumiera.a $(NOBUGMT_LUMIERA_LIBS) -ldl -lm
test_config_LDADD = liblumibackend.a liblumiera.a $(NOBUGMT_LUMIERA_LIBS)
check_LTLIBRARIES += examplepluginc.la
examplepluginc_la_SOURCES = $(tests_srcdir)/backend/example_plugin.c
examplepluginc_la_CPPFLAGS = $(AM_CPPFLAGS) -std=gnu99 -Wall -Werror -DLUMIERA_PLUGIN -I$(top_srcdir)/src/
examplepluginc_la_LDFLAGS = -module -avoid-version -no-undefined -rpath /dev/null
check_PROGRAMS += test-interfaces
test_interfaces_SOURCES = $(tests_srcdir)/backend/test-interfaces.c
test_interfaces_CPPFLAGS = $(AM_CPPFLAGS) -std=gnu99 -Wall -Werror
test_interfaces_LDADD = liblumibackend.a liblumiera.a $(LUMIERA_PLUGIN_LIBS) $(NOBUGMT_LUMIERA_LIBS)
test_interfaces_DEPENDENCIES = examplepluginc.la liblumibackend.a liblumiera.a
TESTS = $(tests_srcdir)/test.sh

View file

@ -3,6 +3,7 @@
## SConscript - SCons buildscript for the Testsuite (called by SConstruct)
##
import os
from os import path
from Buildhelper import srcSubtree
from Buildhelper import scanSubtree
@ -47,19 +48,15 @@ def treatPluginTestcase(env):
"""
tree = 'backend'
env = env.Clone()
env.Append(CPPPATH=tree)
env.Append(CPPPATH=tree, CPPDEFINES='LUMIERA_PLUGIN')
prfx = path.join(tree,'example_plugin')
oC = env.SharedObject(prfx, prfx+'.c')
oCPP = env.SharedObject(prfx+'_cpp', prfx+'.cpp')
testplugin = ( env.SharedLibrary('#$BINDIR/.libs/example_plugin', oC, SHLIBPREFIX='')
+ env.SharedLibrary('#$BINDIR/.libs/example_plugin_cpp', oCPP, SHLIBPREFIX='')
testplugin = ( env.LoadableModule('#$BINDIR/.libs/examplepluginc', oC, SHLIBPREFIX='')
# + env.SharedLibrary('#$BINDIR/.libs/exampleplugincpp', oCPP, SHLIBPREFIX='')
# doesn't compile yet...
)
# testExe = env.Program('#$BINDIR/test-plugin', ['plugin/plugin_main.c'] + core)
# env.Depends(testExe, testplugin)
# return testExe
# 10/2008 example_plugin moved to backend directory.
# ...we should try to find some convention here
return testplugin
#-- it depends (at the moment) on a specific isolated test-plugin,
# which is not integrated in the "normal procedure" for building Plugins
@ -77,7 +74,7 @@ specials = ['plugin','library','backend']
artifacts['testsuite'] = ts = ( [ testExecutable(env, dir) for dir in moduledirs if not dir in specials]
# + treatPluginTestcase(env)
+ treatPluginTestcase(env)
+ testCollection(env, 'library')
+ testCollection(env, 'backend')
)
@ -92,9 +89,16 @@ artifacts['testsuite'] = ts = ( [ testExecutable(env, dir) for dir in moduledirs
#
# - the product of running the Testsuite is the ",testlog"
# - it depends on all artifacts defined as "ts" above
# - if not set via options switch, the environment variable TESTSUITES
# is explicitly propagated to test.sh
#
testEnv = env.Clone()
testEnv.Append(ENV = {'VALGRINDFLAGS' : 'DISABLE'})
if not env['VALGRIND']:
testEnv.Append(ENV = {'VALGRINDFLAGS' : 'DISABLE'})
testsuites = env['TESTSUITES'] or os.environ.get('TESTSUITES')
if testsuites:
testEnv['ENV']['TESTSUITES'] = testsuites
testDir = env.Dir('#$BINDIR')
runTest = env.File("test.sh").abspath
@ -110,5 +114,5 @@ runTs = testEnv.Command(',testlog', ts, runTest, chdir=testDir)
env.Alias('testcode', ts )
env.Alias('check', runTs )
# declare tempfiles of test.sh as cleanable
# allow tempfiles of test.sh to be cleaned
env.Clean ('check', [',testlog.pre',',expect_stdout',',stdout',',stderr',',testtmp','.libs'])

View file

@ -1,6 +1,7 @@
#include <stdio.h>
#include "hello_interface.h"
#include "backend/interfacedescriptor.h"
int myopen(void)
{
@ -34,12 +35,93 @@ void bye(const char* m)
printf("Bye %s\n", m);
}
LUMIERA_INTERFACE_IMPLEMENT(hello, 1, german, myopen, myclose,
hallo,
tschuess
LUMIERA_INTERFACE_INSTANCE (lumieraorg_interfacedescriptor, 0,
lumieraorg_exampleplugin_descriptor,
NULL, NULL, NULL,
LUMIERA_INTERFACE_INLINE (name, "\003\307\005\305\201\304\175\377\120\105\332\016\136\354\251\022",
const char*, (LumieraInterface iface),
{return "LumieraTest";}
),
LUMIERA_INTERFACE_INLINE (brief, "\303\047\265\010\242\210\365\340\024\030\350\310\067\171\170\260",
const char*, (LumieraInterface iface),
{return "Lumiera Test suite examples";}
),
LUMIERA_INTERFACE_INLINE (homepage, "\363\125\352\312\056\255\274\322\351\245\051\350\120\024\115\263",
const char*, (LumieraInterface iface),
{return "http://www.lumiera.org/develompent.html";}
),
LUMIERA_INTERFACE_INLINE (version, "\114\043\133\175\354\011\232\002\117\240\107\141\234\157\217\176",
const char*, (LumieraInterface iface),
{return "No Version";}
),
LUMIERA_INTERFACE_INLINE (author, "\313\300\055\156\126\320\144\247\140\023\261\002\270\367\017\267",
const char*, (LumieraInterface iface),
{return "Christian Thaeter";}
),
LUMIERA_INTERFACE_INLINE (email, "\163\051\312\276\137\317\267\305\237\274\133\012\276\006\255\160",
const char*, (LumieraInterface iface),
{return "ct@pipapo.org";}
),
LUMIERA_INTERFACE_INLINE (copyright, "\160\246\161\204\123\262\375\351\157\276\333\073\355\036\062\341",
const char*, (LumieraInterface iface),
{
return
"Copyright (C) Lumiera.org\n"
" 2008 Christian Thaeter <ct@pipapo.org>";
}
),
LUMIERA_INTERFACE_INLINE (license, "\007\311\044\214\064\223\201\326\331\111\233\356\055\264\211\201",
const char*, (LumieraInterface iface),
{
return
"This program is free software; you can redistribute it and/or modify\n"
"it under the terms of the GNU General Public License as published by\n"
"the Free Software Foundation; either version 2 of the License, or\n"
"(at your option) any later version.\n"
"\n"
"This program is distributed in the hope that it will be useful,\n"
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
"GNU General Public License for more details.\n"
"\n"
"You should have received a copy of the GNU General Public License\n"
"along with this program; if not, write to the Free Software\n"
"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA";
}
),
LUMIERA_INTERFACE_INLINE (state, "\331\353\126\162\067\376\340\242\232\175\167\105\122\177\306\354",
int, (LumieraInterface iface),
{return LUMIERA_INTERFACE_EXPERIMENTAL;}
),
LUMIERA_INTERFACE_INLINE (versioncmp, "\363\145\363\224\325\104\177\057\344\023\367\111\376\221\152\135",
int, (const char* a, const char* b),
{return 0;}
)
);
LUMIERA_INTERFACE_IMPLEMENT(hello, 1, english, myopen, myclose,
hello,
bye
);
LUMIERA_EXPORT(
LUMIERA_INTERFACE_DEFINE (lumieraorg_testhello, 0,
lumieraorg_hello_german,
LUMIERA_INTERFACE_REF (lumieraorg_interfacedescriptor, 0, lumieraorg_exampleplugin_descriptor),
NULL,
NULL,
LUMIERA_INTERFACE_MAP (hello, "\167\012\306\023\031\151\006\362\026\003\125\017\170\022\100\333",
hallo),
LUMIERA_INTERFACE_MAP (goodbye, "\324\267\214\166\340\213\155\053\157\125\064\264\167\235\020\223",
tschuess)
),
LUMIERA_INTERFACE_DEFINE (lumieraorg_testhello, 0,
lumieraorg_hello_english,
LUMIERA_INTERFACE_REF (lumieraorg_interfacedescriptor, 0, lumieraorg_exampleplugin_descriptor),
NULL,
NULL,
LUMIERA_INTERFACE_MAP (hello, "\326\247\370\247\032\103\223\357\262\007\356\042\051\330\073\116",
hello),
LUMIERA_INTERFACE_MAP (goodbye, "\365\141\371\047\101\230\050\106\071\231\022\235\325\112\354\241",
bye)
)
)

View file

@ -1,6 +1,6 @@
#include "lib/plugin.h"
#include "backend/interface.h"
LUMIERA_INTERFACE(hello, 1,
LUMIERA_INTERFACE_PROTO(void, hello, (void))
LUMIERA_INTERFACE_PROTO(void, goodbye, (const char*))
);
LUMIERA_INTERFACE_DECLARE (lumieraorg_testhello, 0,
LUMIERA_INTERFACE_SLOT (void, hello, (void)),
LUMIERA_INTERFACE_SLOT (void, goodbye, (const char*)),
);

View file

@ -330,7 +330,7 @@ TEST ("wordlist_get_nth")
if (!lumiera_config_wordlist_set (argv[2], &argv[3]))
printf ("failed setting word '%s=%s': %s\n", argv[2], argv[3], lumiera_error ());
const char* word = lumiera_config_wordlist_get_nth (argv[2], atoi (argv[4]));
const char* word = lumiera_config_wordlist_get_nth (argv[2], atoi (argv[4]), " \t,;");
printf ("'%s'\n", word?word:"NULL");
@ -349,7 +349,7 @@ TEST ("wordlist_find")
if (!lumiera_config_wordlist_set (argv[2], &argv[3]))
printf ("failed setting word '%s=%s': %s\n", argv[2], argv[3], lumiera_error ());
int n = lumiera_config_wordlist_find (argv[2], argv[4]);
int n = lumiera_config_wordlist_find (argv[2], argv[4], " \t,;");
printf ("'%d'\n", n);
@ -370,7 +370,7 @@ TEST ("wordlist_replace")
if (!lumiera_config_wordlist_set (argv[2], &argv[3]))
printf ("failed setting word '%s=%s': %s\n", argv[2], argv[3], lumiera_error ());
const char* wordlist = lumiera_config_wordlist_replace (argv[2], argv[4], *argv[5]?argv[5]:NULL, *argv[6]?argv[6]:NULL);
const char* wordlist = lumiera_config_wordlist_replace (argv[2], argv[4], *argv[5]?argv[5]:NULL, *argv[6]?argv[6]:NULL, " \t,;");
if (wordlist)
printf ("'%s'\n", wordlist);
@ -393,13 +393,13 @@ TEST ("wordlist_add")
if (!lumiera_config_wordlist_set (argv[2], &argv[3]))
printf ("failed setting word '%s=%s': %s\n", argv[2], argv[3], lumiera_error ());
const char* wordlist = lumiera_config_wordlist_add (argv[2], argv[4]);
const char* wordlist = lumiera_config_wordlist_add (argv[2], argv[4], " \t,;");
if (wordlist)
printf ("'%s'\n", wordlist);
else
printf ("%s\n", lumiera_error ());
wordlist = lumiera_config_wordlist_add (argv[2], argv[5]);
wordlist = lumiera_config_wordlist_add (argv[2], argv[5], " \t,;");
if (wordlist)
printf ("'%s'\n", wordlist);
else

View file

@ -22,7 +22,10 @@
#include "backend/interface.h"
#include "backend/interfaceregistry.h"
#include "backend/interfacedescriptor.h"
#include "backend/config.h"
#include "tests/test.h"
#include "tests/backend/hello_interface.h"
/*
define 2 example interfaces
@ -79,16 +82,28 @@ LUMIERA_INTERFACE_INSTANCE (lumieraorg_interfacedescriptor, 0,
testacquire,
testrelease,
LUMIERA_INTERFACE_INLINE (name, "\073\003\054\127\344\046\324\321\221\262\232\026\376\123\125\243",
const char*, (LumieraInterface iface),
{return "LumieraTest";}
),
LUMIERA_INTERFACE_INLINE (brief, "\241\337\035\172\323\377\355\036\171\326\323\163\177\242\364\172",
const char*, (LumieraInterface iface),
{return "Lumiera Test suite examples";}
),
LUMIERA_INTERFACE_INLINE (homepage, "\030\374\031\152\024\167\154\346\303\372\177\353\304\306\275\247",
const char*, (LumieraInterface iface),
{return "http://www.lumiera.org/develompent.html";}
),
LUMIERA_INTERFACE_INLINE (version, "\271\330\345\066\304\217\211\065\157\120\031\365\304\363\364\074",
const char*, (LumieraInterface iface),
{return "No Version";}
),
LUMIERA_INTERFACE_INLINE (author, "\367\160\342\065\147\007\237\371\141\335\371\131\025\030\257\232",
const char*, (LumieraInterface iface),
{return "Christian Thaeter <ct@pipapo.org>";}
{return "Christian Thaeter";}
),
LUMIERA_INTERFACE_INLINE (email, "\334\272\125\312\140\347\121\020\155\047\226\352\244\141\107\363",
const char*, (LumieraInterface iface),
{return "ct@pipapo.org";}
),
LUMIERA_INTERFACE_INLINE (copyright, "\163\106\344\014\251\125\111\252\236\322\174\120\335\225\333\245",
const char*, (LumieraInterface iface),
@ -116,33 +131,21 @@ LUMIERA_INTERFACE_INSTANCE (lumieraorg_interfacedescriptor, 0,
"along with this program; if not, write to the Free Software\n"
"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA";
}
),
LUMIERA_INTERFACE_INLINE (state, "\364\002\115\170\361\321\301\244\350\322\270\362\010\231\207\334",
int, (LumieraInterface iface),
{return LUMIERA_INTERFACE_EXPERIMENTAL;}
),
LUMIERA_INTERFACE_INLINE (versioncmp, "\136\037\234\304\100\247\244\342\324\353\072\060\161\053\077\263",
int, (const char* a, const char* b),
{return 0;}
)
);
LUMIERA_EXPORT (interfaces_defined_here,
LUMIERA_INTERFACE_DEFINE (lumieraorg_testexample_one, 0,
lumieraorg_first_test,
LUMIERA_INTERFACE_REF(lumieraorg_interfacedescriptor, 0, lumieraorg_tests_descriptor),
testacquire,
testrelease,
LUMIERA_INTERFACE_MAP (foo1, "\214\310\136\372\003\344\163\377\075\100\070\200\375\221\227\324",
testfunc),
LUMIERA_INTERFACE_MAP (bar1, "\262\253\067\211\157\052\212\140\114\334\231\250\340\075\214\030",
testfunc)
),
LUMIERA_INTERFACE_DEFINE (lumieraorg_testexample_two, 0,
lumieraorg_second_test,
LUMIERA_INTERFACE_REF(lumieraorg_interfacedescriptor, 0, lumieraorg_tests_descriptor),
testacquire,
testrelease,
LUMIERA_INTERFACE_MAP (foo2, "\110\152\002\271\363\052\324\272\373\045\132\270\277\000\271\217",
testfunc),
LUMIERA_INTERFACE_MAP (bar2, "\376\042\027\336\355\113\132\233\350\312\170\077\377\370\356\167",
testfunc)
)
);
/*
@ -242,7 +245,27 @@ testrelease_four (LumieraInterface self)
}
LUMIERA_EXPORT (dependencytests,
LUMIERA_EXPORT (
LUMIERA_INTERFACE_DEFINE (lumieraorg_testexample_one, 0,
lumieraorg_first_test,
LUMIERA_INTERFACE_REF(lumieraorg_interfacedescriptor, 0, lumieraorg_tests_descriptor),
testacquire,
testrelease,
LUMIERA_INTERFACE_MAP (foo1, "\214\310\136\372\003\344\163\377\075\100\070\200\375\221\227\324",
testfunc),
LUMIERA_INTERFACE_MAP (bar1, "\262\253\067\211\157\052\212\140\114\334\231\250\340\075\214\030",
testfunc)
),
LUMIERA_INTERFACE_DEFINE (lumieraorg_testexample_two, 0,
lumieraorg_second_test,
LUMIERA_INTERFACE_REF(lumieraorg_interfacedescriptor, 0, lumieraorg_tests_descriptor),
testacquire,
testrelease,
LUMIERA_INTERFACE_MAP (foo2, "\110\152\002\271\363\052\324\272\373\045\132\270\277\000\271\217",
testfunc),
LUMIERA_INTERFACE_MAP (bar2, "\376\042\027\336\355\113\132\233\350\312\170\077\377\370\356\167",
testfunc)
),
LUMIERA_INTERFACE_DEFINE (lumieraorg_testexample_void, 0,
lumieraorg_dependencytest_one,
LUMIERA_INTERFACE_REF(lumieraorg_interfacedescriptor, 0, lumieraorg_tests_descriptor),
@ -276,7 +299,7 @@ TEST ("basic")
{
lumiera_interfaceregistry_init ();
lumiera_interfaceregistry_bulkregister_interfaces (interfaces_defined_here());
lumiera_interfaceregistry_bulkregister_interfaces (lumiera_plugin_interfaces(), NULL);
/* some ugly lowlevel handling tests */
@ -292,14 +315,14 @@ TEST ("basic")
handle2->foo2 ("this is foo2");
lumiera_interfaceregistry_bulkremove_interfaces (interfaces_defined_here());
LUMIERA_INTERFACE_UNREGISTEREXPORTED;
lumiera_interfaceregistry_destroy ();
}
TEST ("open_close")
{
lumiera_interfaceregistry_init ();
lumiera_interfaceregistry_bulkregister_interfaces (interfaces_defined_here());
lumiera_interfaceregistry_bulkregister_interfaces (lumiera_plugin_interfaces(), NULL);
LUMIERA_INTERFACE_HANDLE(lumieraorg_testexample_one, 0) handle =
LUMIERA_INTERFACE_OPEN (lumieraorg_testexample_one, 0, 0, lumieraorg_first_test);
@ -309,14 +332,14 @@ TEST ("open_close")
lumiera_interface_close ((LumieraInterface)handle);
lumiera_interfaceregistry_bulkremove_interfaces (interfaces_defined_here());
LUMIERA_INTERFACE_UNREGISTEREXPORTED;
lumiera_interfaceregistry_destroy ();
}
TEST ("dependencies_one")
{
lumiera_interfaceregistry_init ();
lumiera_interfaceregistry_bulkregister_interfaces (dependencytests());
LUMIERA_INTERFACE_REGISTEREXPORTED;
LUMIERA_INTERFACE_HANDLE(lumieraorg_testexample_void, 0) handle =
LUMIERA_INTERFACE_OPEN (lumieraorg_testexample_void, 0, 0, lumieraorg_dependencytest_one);
@ -326,7 +349,7 @@ TEST ("dependencies_one")
lumiera_interface_close ((LumieraInterface)handle);
lumiera_interfaceregistry_bulkremove_interfaces (dependencytests());
LUMIERA_INTERFACE_UNREGISTEREXPORTED;
lumiera_interfaceregistry_destroy ();
}
@ -334,7 +357,7 @@ TEST ("dependencies_one")
TEST ("dependencies_two")
{
lumiera_interfaceregistry_init ();
lumiera_interfaceregistry_bulkregister_interfaces (dependencytests());
LUMIERA_INTERFACE_REGISTEREXPORTED;
LUMIERA_INTERFACE_HANDLE(lumieraorg_testexample_void, 0) handle =
LUMIERA_INTERFACE_OPEN (lumieraorg_testexample_void, 0, 0, lumieraorg_dependencytest_two);
@ -344,14 +367,14 @@ TEST ("dependencies_two")
lumiera_interface_close ((LumieraInterface)handle);
lumiera_interfaceregistry_bulkremove_interfaces (dependencytests());
LUMIERA_INTERFACE_UNREGISTEREXPORTED;
lumiera_interfaceregistry_destroy ();
}
TEST ("dependencies_three")
{
lumiera_interfaceregistry_init ();
lumiera_interfaceregistry_bulkregister_interfaces (dependencytests());
LUMIERA_INTERFACE_REGISTEREXPORTED;
LUMIERA_INTERFACE_HANDLE(lumieraorg_testexample_void, 0) handle =
LUMIERA_INTERFACE_OPEN (lumieraorg_testexample_void, 0, 0, lumieraorg_dependencytest_three);
@ -361,7 +384,7 @@ TEST ("dependencies_three")
lumiera_interface_close ((LumieraInterface)handle);
lumiera_interfaceregistry_bulkremove_interfaces (dependencytests());
LUMIERA_INTERFACE_UNREGISTEREXPORTED;
lumiera_interfaceregistry_destroy ();
}
@ -369,7 +392,7 @@ TEST ("dependencies_three")
TEST ("dependencies_four")
{
lumiera_interfaceregistry_init ();
lumiera_interfaceregistry_bulkregister_interfaces (dependencytests());
LUMIERA_INTERFACE_REGISTEREXPORTED;
LUMIERA_INTERFACE_HANDLE(lumieraorg_testexample_void, 0) handle =
LUMIERA_INTERFACE_OPEN (lumieraorg_testexample_void, 0, 0, lumieraorg_dependencytest_four);
@ -379,7 +402,7 @@ TEST ("dependencies_four")
lumiera_interface_close ((LumieraInterface)handle);
lumiera_interfaceregistry_bulkremove_interfaces (dependencytests());
LUMIERA_INTERFACE_UNREGISTEREXPORTED;
lumiera_interfaceregistry_destroy ();
}
@ -388,7 +411,7 @@ TEST ("dependencies_four")
TEST ("dependencies_all")
{
lumiera_interfaceregistry_init ();
lumiera_interfaceregistry_bulkregister_interfaces (dependencytests());
LUMIERA_INTERFACE_REGISTEREXPORTED;
TRACE (tests, "OPEN one");
LUMIERA_INTERFACE_HANDLE(lumieraorg_testexample_void, 0) handle_one =
@ -425,16 +448,70 @@ TEST ("dependencies_all")
lumiera_interface_close ((LumieraInterface)handle_one);
lumiera_interfaceregistry_bulkremove_interfaces (dependencytests());
LUMIERA_INTERFACE_UNREGISTEREXPORTED;
lumiera_interfaceregistry_destroy ();
}
TEST ("highlevel, plugin")
TEST ("plugin_discover")
{
lumiera_config_init ("./");
lumiera_interfaceregistry_init ();
if (lumiera_plugin_discover (lumiera_plugin_load, lumiera_plugin_register))
{
LumieraPlugin p = lumiera_plugin_lookup (".libs/examplepluginc.so");
printf ("found plugin: %s\n", lumiera_plugin_name (p));
lumiera_plugin_discover (lumiera_plugin_load, lumiera_plugin_register);
}
else
printf ("error: %s\n", lumiera_error ());
lumiera_interfaceregistry_destroy ();
lumiera_config_destroy ();
}
TEST ("plugin_unload")
{
lumiera_config_init ("./");
lumiera_interfaceregistry_init ();
lumiera_plugin_discover (lumiera_plugin_load, lumiera_plugin_register);
lumiera_plugin_unload (lumiera_plugin_lookup (".libs/examplepluginc.so"));
LumieraPlugin p = lumiera_plugin_lookup (".libs/examplepluginc.so");
printf ("plugin unload: %p\n", p);
lumiera_interfaceregistry_destroy ();
lumiera_config_destroy ();
}
TEST ("plugin_examplepluginc")
{
lumiera_config_init ("./");
lumiera_interfaceregistry_init ();
lumiera_plugin_discover (lumiera_plugin_load, lumiera_plugin_register);
TODO ("macro to derrive minminor version from a slot");
LUMIERA_INTERFACE_HANDLE(lumieraorg_testhello, 0) german =
LUMIERA_INTERFACE_OPEN (lumieraorg_testhello, 0, 0, lumieraorg_hello_german);
LUMIERA_INTERFACE_HANDLE(lumieraorg_testhello, 0) english =
LUMIERA_INTERFACE_OPEN (lumieraorg_testhello, 0, 0, lumieraorg_hello_english);
german->hello ();
german->goodbye ("Welt!");
english->hello ();
english->goodbye ("World!");
LUMIERA_INTERFACE_CLOSE (german);
LUMIERA_INTERFACE_CLOSE (english);
lumiera_interfaceregistry_destroy ();
lumiera_config_destroy ();
}
TESTS_END

Some files were not shown because too many files have changed in this diff Show more