git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1725 0c269be4-1314-0410-8aa9-9f06e86f4224tags/0.69
@@ -9,12 +9,17 @@ Thibault LeMeur | |||||
Pieter Palmers | Pieter Palmers | ||||
Tom Szilagyi | Tom Szilagyi | ||||
Andrzej Szombierski | Andrzej Szombierski | ||||
Kjetil S.Matheussen | |||||
Kjetil S.Matheussen | |||||
Pieter Palmers | |||||
--------------------------- | --------------------------- | ||||
Jackdmp changes log | Jackdmp changes log | ||||
--------------------------- | --------------------------- | ||||
2007-12-06 Stephane Letz <letz@grame.fr> | |||||
* Pieter Palmers FFADO driver and scons based build. | |||||
2007-12-05 Stephane Letz <letz@grame.fr> | 2007-12-05 Stephane Letz <letz@grame.fr> | ||||
* Correct sample_rate management in JackCoreAudioDriver::Open. Better handling in sample_rate change listener. | * Correct sample_rate management in JackCoreAudioDriver::Open. Better handling in sample_rate change listener. | ||||
@@ -0,0 +1,528 @@ | |||||
# | |||||
# Copyright (C) 2007 Arnold Krille | |||||
# Copyright (C) 2007 Pieter Palmers | |||||
# | |||||
# This file originates from FFADO (www.ffado.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 3 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, see <http://www.gnu.org/licenses/>. | |||||
# | |||||
import os | |||||
from string import Template | |||||
build_dir = ARGUMENTS.get('BUILDDIR', "") | |||||
if build_dir: | |||||
build_base=build_dir+'/' | |||||
if not os.path.isdir( build_base ): | |||||
os.makedirs( build_base ) | |||||
print "Building into: " + build_base | |||||
else: | |||||
build_base='' | |||||
if not os.path.isdir( "cache" ): | |||||
os.makedirs( "cache" ) | |||||
opts = Options( "cache/"+build_base+"options.cache" ) | |||||
# make this into a command line option and/or a detected value | |||||
build_for_linux = True | |||||
# | |||||
# If this is just to display a help-text for the variable used via ARGUMENTS, then its wrong... | |||||
opts.Add( "BUILDDIR", "Path to place the built files in", "") | |||||
opts.AddOptions( | |||||
# BoolOption( "DEBUG", """\ | |||||
#Toggle debug-build. DEBUG means \"-g -Wall\" and more, otherwise we will use | |||||
# \"-O2\" to optimise.""", True ), | |||||
PathOption( "PREFIX", "The prefix where jackdmp will be installed to.", "/usr/local", PathOption.PathAccept ), | |||||
PathOption( "BINDIR", "Overwrite the directory where apps are installed to.", "$PREFIX/bin", PathOption.PathAccept ), | |||||
PathOption( "LIBDIR", "Overwrite the directory where libs are installed to.", "$PREFIX/lib", PathOption.PathAccept ), | |||||
PathOption( "INCLUDEDIR", "Overwrite the directory where headers are installed to.", "$PREFIX/include", PathOption.PathAccept ), | |||||
PathOption( "SHAREDIR", "Overwrite the directory where misc shared files are installed to.", "$PREFIX/share/libffado", PathOption.PathAccept ), | |||||
BoolOption( "ENABLE_ALSA", "Enable/Disable the ALSA backend.", True ), | |||||
BoolOption( "ENABLE_FREEBOB", "Enable/Disable the FreeBoB backend.", True ), | |||||
BoolOption( "ENABLE_FIREWIRE", "Enable/Disable the FireWire backend.", True ), | |||||
BoolOption( "DEBUG", """Do a debug build.""", True ), | |||||
BoolOption( "BUILD_TESTS", """Build tests where applicable.""", True ), | |||||
BoolOption( "BUILD_EXAMPLES", """Build the example clients in their directory.""", True ), | |||||
BoolOption( "INSTALL_EXAMPLES", """Install the example clients in the BINDIR directory.""", True ), | |||||
BoolOption( "BUILD_DOXYGEN_DOCS", """Build doxygen documentation.""", True ), | |||||
) | |||||
## Load the builders in config | |||||
buildenv={} | |||||
if os.environ.has_key('PATH'): | |||||
buildenv['PATH']=os.environ['PATH'] | |||||
else: | |||||
buildenv['PATH']='' | |||||
if os.environ.has_key('PKG_CONFIG_PATH'): | |||||
buildenv['PKG_CONFIG_PATH']=os.environ['PKG_CONFIG_PATH'] | |||||
else: | |||||
buildenv['PKG_CONFIG_PATH']='' | |||||
if os.environ.has_key('LD_LIBRARY_PATH'): | |||||
buildenv['LD_LIBRARY_PATH']=os.environ['LD_LIBRARY_PATH'] | |||||
else: | |||||
buildenv['LD_LIBRARY_PATH']='' | |||||
env = Environment( tools=['default','scanreplace','pkgconfig', 'doxygen'], toolpath=['admin'], ENV=buildenv, options=opts ) | |||||
Help( """ | |||||
For building jackdmp you can set different options as listed below. You have to | |||||
specify them only once, scons will save the last value you used and re-use | |||||
that. | |||||
To really undo your settings and return to the factory defaults, remove the | |||||
"cache"-folder and the file ".sconsign.dblite" from this directory. | |||||
For example with: "rm -Rf .sconsign.dblite cache" | |||||
""" ) | |||||
Help( opts.GenerateHelpText( env ) ) | |||||
# make sure the necessary dirs exist | |||||
if not os.path.isdir( "cache/" + build_base ): | |||||
os.makedirs( "cache/" + build_base ) | |||||
if not os.path.isdir( 'cache/objects' ): | |||||
os.makedirs( 'cache/objects' ) | |||||
if build_base: | |||||
env['build_base']="#/"+build_base | |||||
else: | |||||
env['build_base']="#/" | |||||
CacheDir( 'cache/objects' ) | |||||
opts.Save( 'cache/' + build_base + "options.cache", env ) | |||||
tests = {} | |||||
tests.update( env['PKGCONFIG_TESTS'] ) | |||||
if not env.GetOption('clean'): | |||||
conf = Configure( env, | |||||
custom_tests = tests, | |||||
conf_dir = "cache/" + build_base, | |||||
log_file = "cache/" + build_base + 'config.log' ) | |||||
# | |||||
# Check if the environment can actually compile c-files by checking for a | |||||
# header shipped with gcc. | |||||
# | |||||
if not conf.CheckHeader( "stdio.h" ): | |||||
print "It seems as if stdio.h is missing. This probably means that your build environment is broken, please make sure you have a working c-compiler and libstdc installed and usable." | |||||
Exit( 1 ) | |||||
# | |||||
# The following checks are for headers and libs and packages we need. | |||||
# | |||||
allpresent = 1; | |||||
if build_for_linux: | |||||
allpresent &= conf.CheckForPKGConfig(); | |||||
# example on how to check for additional libs | |||||
# pkgs = { | |||||
# 'alsa' : '1.0.0', | |||||
# } | |||||
# for pkg in pkgs: | |||||
# name2 = pkg.replace("+","").replace(".","").replace("-","").upper() | |||||
# env['%s_FLAGS' % name2] = conf.GetPKGFlags( pkg, pkgs[pkg] ) | |||||
# if env['%s_FLAGS'%name2] == 0: | |||||
# allpresent &= 0 | |||||
if not allpresent: | |||||
print """ | |||||
(At least) One of the dependencies is missing. I can't go on without it, please | |||||
install the needed packages (remember to also install the *-devel packages) | |||||
""" | |||||
Exit( 1 ) | |||||
# jack doesn't have to be present, but it would be nice to know if it is | |||||
env['JACK_FLAGS'] = conf.GetPKGFlags( 'jack', '0.100.0' ) | |||||
if env['JACK_FLAGS']: | |||||
env['JACK_PREFIX'] = conf.GetPKGPrefix( 'jack' ) | |||||
env['JACK_EXEC_PREFIX'] = conf.GetPKGExecPrefix( 'jack' ) | |||||
env['JACK_LIBDIR'] = conf.GetPKGLibdir( 'jack' ) | |||||
env['JACK_INCLUDEDIR'] = conf.GetPKGIncludedir( 'jack' ) | |||||
# | |||||
# Optional checks follow: | |||||
# | |||||
if build_for_linux and env['ENABLE_ALSA']: | |||||
env['ALSA_FLAGS'] = conf.GetPKGFlags( 'ALSA', '1.0.0' ) | |||||
if env['ALSA_FLAGS'] == 0: | |||||
print " Disabling 'alsa' backend since no useful ALSA installation found." | |||||
env['ENABLE_ALSA'] = False | |||||
if build_for_linux and env['ENABLE_FREEBOB']: | |||||
env['FREEBOB_FLAGS'] = conf.GetPKGFlags( 'libfreebob', '1.0.0' ) | |||||
if env['FREEBOB_FLAGS'] == 0: | |||||
print " Disabling 'freebob' backend since no useful FreeBoB installation found." | |||||
env['ENABLE_FREEBOB'] = False | |||||
if build_for_linux and env['ENABLE_FIREWIRE']: | |||||
env['FFADO_FLAGS'] = conf.GetPKGFlags( 'libffado', '1.999.7' ) | |||||
if env['FFADO_FLAGS'] == 0: | |||||
print " Disabling 'firewire' backend since no useful FFADO installation found." | |||||
env['ENABLE_FIREWIRE'] = False | |||||
env = conf.Finish() | |||||
if env['DEBUG']: | |||||
print "Doing a DEBUG build" | |||||
# -Werror could be added to, which would force the devs to really remove all the warnings :-) | |||||
env.AppendUnique( CCFLAGS=["-DDEBUG","-Wall","-g"] ) | |||||
env.AppendUnique( CFLAGS=["-DDEBUG","-Wall","-g"] ) | |||||
else: | |||||
env.AppendUnique( CCFLAGS=["-O2","-DNDEBUG"] ) | |||||
env.AppendUnique( CFLAGS=["-O2","-DNDEBUG"] ) | |||||
env.AppendUnique( CCFLAGS=["-fPIC", "-DSOCKET_RPC_FIFO_SEMA", "-D__SMP__"] ) | |||||
env.AppendUnique( CFLAGS=["-fPIC", "-DUSE_POSIX_SHM"] ) | |||||
# | |||||
# XXX: Maybe we can even drop these lower-case variables and only use the uppercase ones? | |||||
# | |||||
env['prefix'] = Template( os.path.join( env['PREFIX'] ) ).safe_substitute( env ) | |||||
env['bindir'] = Template( os.path.join( env['BINDIR'] ) ).safe_substitute( env ) | |||||
env['libdir'] = Template( os.path.join( env['LIBDIR'] ) ).safe_substitute( env ) | |||||
env['includedir'] = Template( os.path.join( env['INCLUDEDIR'] ) ).safe_substitute( env ) | |||||
env['sharedir'] = Template( os.path.join( env['SHAREDIR'] ) ).safe_substitute( env ) | |||||
env.Alias( "install", env['libdir'] ) | |||||
env.Alias( "install", env['includedir'] ) | |||||
env.Alias( "install", env['sharedir'] ) | |||||
env.Alias( "install", env['bindir'] ) | |||||
# for config.h.in | |||||
env['ADDON_DIR']='%s' % env['prefix'] | |||||
env['LIB_DIR']='lib' | |||||
env['JACK_LOCATION']='%s' % env['bindir'] | |||||
# | |||||
# To have the top_srcdir as the doxygen-script is used from auto* | |||||
# | |||||
env['top_srcdir'] = env.Dir( "." ).abspath | |||||
#subprojects = env.Split('common common/jack tests example-clients linux/alsa linux/freebob linux/firewire') | |||||
#for subproject in subprojects: | |||||
#env.AppendUnique( CCFLAGS=["-I%s" % subproject] ) | |||||
#env.AppendUnique( CFLAGS=["-I%s" % subproject] ) | |||||
env.ScanReplace( "config.h.in" ) | |||||
# ensure that the config.h is always updated, since it | |||||
# sometimes fails to pick up the changes | |||||
# note: this still doesn't seem to cause dependent files to be rebuilt. | |||||
NoCache("config.h") | |||||
AlwaysBuild("config.h") | |||||
# | |||||
# Start building | |||||
# | |||||
if env['BUILD_DOXYGEN_DOCS']: | |||||
env.Doxygen("doxyfile") | |||||
subdirs=['common'] | |||||
if build_for_linux: | |||||
subdirs.append('linux') | |||||
if env['BUILD_EXAMPLES']: | |||||
subdirs.append('example-clients') | |||||
if env['BUILD_TESTS']: | |||||
subdirs.append('tests') | |||||
if build_base: | |||||
env.SConscript( dirs=subdirs, exports="env", build_dir=build_base+subdir ) | |||||
else: | |||||
env.SConscript( dirs=subdirs, exports="env" ) | |||||
# | |||||
# Copyright (C) 2007 Arnold Krille | |||||
# Copyright (C) 2007 Pieter Palmers | |||||
# | |||||
# This file originates from FFADO (www.ffado.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 3 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, see <http://www.gnu.org/licenses/>. | |||||
# | |||||
import os | |||||
from string import Template | |||||
build_dir = ARGUMENTS.get('BUILDDIR', "") | |||||
if build_dir: | |||||
build_base=build_dir+'/' | |||||
if not os.path.isdir( build_base ): | |||||
os.makedirs( build_base ) | |||||
print "Building into: " + build_base | |||||
else: | |||||
build_base='' | |||||
if not os.path.isdir( "cache" ): | |||||
os.makedirs( "cache" ) | |||||
opts = Options( "cache/"+build_base+"options.cache" ) | |||||
# make this into a command line option and/or a detected value | |||||
build_for_linux = True | |||||
# | |||||
# If this is just to display a help-text for the variable used via ARGUMENTS, then its wrong... | |||||
opts.Add( "BUILDDIR", "Path to place the built files in", "") | |||||
opts.AddOptions( | |||||
# BoolOption( "DEBUG", """\ | |||||
#Toggle debug-build. DEBUG means \"-g -Wall\" and more, otherwise we will use | |||||
# \"-O2\" to optimise.""", True ), | |||||
PathOption( "PREFIX", "The prefix where jackdmp will be installed to.", "/usr/local", PathOption.PathAccept ), | |||||
PathOption( "BINDIR", "Overwrite the directory where apps are installed to.", "$PREFIX/bin", PathOption.PathAccept ), | |||||
PathOption( "LIBDIR", "Overwrite the directory where libs are installed to.", "$PREFIX/lib", PathOption.PathAccept ), | |||||
PathOption( "INCLUDEDIR", "Overwrite the directory where headers are installed to.", "$PREFIX/include", PathOption.PathAccept ), | |||||
PathOption( "SHAREDIR", "Overwrite the directory where misc shared files are installed to.", "$PREFIX/share/libffado", PathOption.PathAccept ), | |||||
BoolOption( "ENABLE_ALSA", "Enable/Disable the ALSA backend.", True ), | |||||
BoolOption( "ENABLE_FREEBOB", "Enable/Disable the FreeBoB backend.", True ), | |||||
BoolOption( "ENABLE_FIREWIRE", "Enable/Disable the FireWire backend.", True ), | |||||
BoolOption( "DEBUG", """Do a debug build.""", True ), | |||||
BoolOption( "BUILD_TESTS", """Build tests where applicable.""", True ), | |||||
BoolOption( "BUILD_EXAMPLES", """Build the example clients in their directory.""", True ), | |||||
BoolOption( "INSTALL_EXAMPLES", """Install the example clients in the BINDIR directory.""", True ), | |||||
BoolOption( "BUILD_DOXYGEN_DOCS", """Build doxygen documentation.""", True ), | |||||
) | |||||
## Load the builders in config | |||||
buildenv={} | |||||
if os.environ.has_key('PATH'): | |||||
buildenv['PATH']=os.environ['PATH'] | |||||
else: | |||||
buildenv['PATH']='' | |||||
if os.environ.has_key('PKG_CONFIG_PATH'): | |||||
buildenv['PKG_CONFIG_PATH']=os.environ['PKG_CONFIG_PATH'] | |||||
else: | |||||
buildenv['PKG_CONFIG_PATH']='' | |||||
if os.environ.has_key('LD_LIBRARY_PATH'): | |||||
buildenv['LD_LIBRARY_PATH']=os.environ['LD_LIBRARY_PATH'] | |||||
else: | |||||
buildenv['LD_LIBRARY_PATH']='' | |||||
env = Environment( tools=['default','scanreplace','pkgconfig', 'doxygen'], toolpath=['admin'], ENV=buildenv, options=opts ) | |||||
Help( """ | |||||
For building jackdmp you can set different options as listed below. You have to | |||||
specify them only once, scons will save the last value you used and re-use | |||||
that. | |||||
To really undo your settings and return to the factory defaults, remove the | |||||
"cache"-folder and the file ".sconsign.dblite" from this directory. | |||||
For example with: "rm -Rf .sconsign.dblite cache" | |||||
""" ) | |||||
Help( opts.GenerateHelpText( env ) ) | |||||
# make sure the necessary dirs exist | |||||
if not os.path.isdir( "cache/" + build_base ): | |||||
os.makedirs( "cache/" + build_base ) | |||||
if not os.path.isdir( 'cache/objects' ): | |||||
os.makedirs( 'cache/objects' ) | |||||
if build_base: | |||||
env['build_base']="#/"+build_base | |||||
else: | |||||
env['build_base']="#/" | |||||
CacheDir( 'cache/objects' ) | |||||
opts.Save( 'cache/' + build_base + "options.cache", env ) | |||||
tests = {} | |||||
tests.update( env['PKGCONFIG_TESTS'] ) | |||||
if not env.GetOption('clean'): | |||||
conf = Configure( env, | |||||
custom_tests = tests, | |||||
conf_dir = "cache/" + build_base, | |||||
log_file = "cache/" + build_base + 'config.log' ) | |||||
# | |||||
# Check if the environment can actually compile c-files by checking for a | |||||
# header shipped with gcc. | |||||
# | |||||
if not conf.CheckHeader( "stdio.h" ): | |||||
print "It seems as if stdio.h is missing. This probably means that your build environment is broken, please make sure you have a working c-compiler and libstdc installed and usable." | |||||
Exit( 1 ) | |||||
# | |||||
# The following checks are for headers and libs and packages we need. | |||||
# | |||||
allpresent = 1; | |||||
if build_for_linux: | |||||
allpresent &= conf.CheckForPKGConfig(); | |||||
# example on how to check for additional libs | |||||
# pkgs = { | |||||
# 'alsa' : '1.0.0', | |||||
# } | |||||
# for pkg in pkgs: | |||||
# name2 = pkg.replace("+","").replace(".","").replace("-","").upper() | |||||
# env['%s_FLAGS' % name2] = conf.GetPKGFlags( pkg, pkgs[pkg] ) | |||||
# if env['%s_FLAGS'%name2] == 0: | |||||
# allpresent &= 0 | |||||
if not allpresent: | |||||
print """ | |||||
(At least) One of the dependencies is missing. I can't go on without it, please | |||||
install the needed packages (remember to also install the *-devel packages) | |||||
""" | |||||
Exit( 1 ) | |||||
# jack doesn't have to be present, but it would be nice to know if it is | |||||
env['JACK_FLAGS'] = conf.GetPKGFlags( 'jack', '0.100.0' ) | |||||
if env['JACK_FLAGS']: | |||||
env['JACK_PREFIX'] = conf.GetPKGPrefix( 'jack' ) | |||||
env['JACK_EXEC_PREFIX'] = conf.GetPKGExecPrefix( 'jack' ) | |||||
env['JACK_LIBDIR'] = conf.GetPKGLibdir( 'jack' ) | |||||
env['JACK_INCLUDEDIR'] = conf.GetPKGIncludedir( 'jack' ) | |||||
# | |||||
# Optional checks follow: | |||||
# | |||||
if build_for_linux and env['ENABLE_ALSA']: | |||||
env['ALSA_FLAGS'] = conf.GetPKGFlags( 'ALSA', '1.0.0' ) | |||||
if env['ALSA_FLAGS'] == 0: | |||||
print " Disabling 'alsa' backend since no useful ALSA installation found." | |||||
env['ENABLE_ALSA'] = False | |||||
if build_for_linux and env['ENABLE_FREEBOB']: | |||||
env['FREEBOB_FLAGS'] = conf.GetPKGFlags( 'libfreebob', '1.0.0' ) | |||||
if env['FREEBOB_FLAGS'] == 0: | |||||
print " Disabling 'freebob' backend since no useful FreeBoB installation found." | |||||
env['ENABLE_FREEBOB'] = False | |||||
if build_for_linux and env['ENABLE_FIREWIRE']: | |||||
env['FFADO_FLAGS'] = conf.GetPKGFlags( 'libffado', '1.999.7' ) | |||||
if env['FFADO_FLAGS'] == 0: | |||||
print " Disabling 'firewire' backend since no useful FFADO installation found." | |||||
env['ENABLE_FIREWIRE'] = False | |||||
env = conf.Finish() | |||||
if env['DEBUG']: | |||||
print "Doing a DEBUG build" | |||||
# -Werror could be added to, which would force the devs to really remove all the warnings :-) | |||||
env.AppendUnique( CCFLAGS=["-DDEBUG","-Wall","-g"] ) | |||||
env.AppendUnique( CFLAGS=["-DDEBUG","-Wall","-g"] ) | |||||
else: | |||||
env.AppendUnique( CCFLAGS=["-O2","-DNDEBUG"] ) | |||||
env.AppendUnique( CFLAGS=["-O2","-DNDEBUG"] ) | |||||
env.AppendUnique( CCFLAGS=["-fPIC", "-DSOCKET_RPC_FIFO_SEMA", "-D__SMP__"] ) | |||||
env.AppendUnique( CFLAGS=["-fPIC", "-DUSE_POSIX_SHM"] ) | |||||
# | |||||
# XXX: Maybe we can even drop these lower-case variables and only use the uppercase ones? | |||||
# | |||||
env['prefix'] = Template( os.path.join( env['PREFIX'] ) ).safe_substitute( env ) | |||||
env['bindir'] = Template( os.path.join( env['BINDIR'] ) ).safe_substitute( env ) | |||||
env['libdir'] = Template( os.path.join( env['LIBDIR'] ) ).safe_substitute( env ) | |||||
env['includedir'] = Template( os.path.join( env['INCLUDEDIR'] ) ).safe_substitute( env ) | |||||
env['sharedir'] = Template( os.path.join( env['SHAREDIR'] ) ).safe_substitute( env ) | |||||
env.Alias( "install", env['libdir'] ) | |||||
env.Alias( "install", env['includedir'] ) | |||||
env.Alias( "install", env['sharedir'] ) | |||||
env.Alias( "install", env['bindir'] ) | |||||
# for config.h.in | |||||
env['ADDON_DIR']='%s' % env['prefix'] | |||||
env['LIB_DIR']='lib' | |||||
env['JACK_LOCATION']='%s' % env['bindir'] | |||||
# | |||||
# To have the top_srcdir as the doxygen-script is used from auto* | |||||
# | |||||
env['top_srcdir'] = env.Dir( "." ).abspath | |||||
#subprojects = env.Split('common common/jack tests example-clients linux/alsa linux/freebob linux/firewire') | |||||
#for subproject in subprojects: | |||||
#env.AppendUnique( CCFLAGS=["-I%s" % subproject] ) | |||||
#env.AppendUnique( CFLAGS=["-I%s" % subproject] ) | |||||
env.ScanReplace( "config.h.in" ) | |||||
# ensure that the config.h is always updated, since it | |||||
# sometimes fails to pick up the changes | |||||
# note: this still doesn't seem to cause dependent files to be rebuilt. | |||||
NoCache("config.h") | |||||
AlwaysBuild("config.h") | |||||
# | |||||
# Start building | |||||
# | |||||
if env['BUILD_DOXYGEN_DOCS']: | |||||
env.Doxygen("doxyfile") | |||||
subdirs=['common'] | |||||
if build_for_linux: | |||||
subdirs.append('linux') | |||||
if env['BUILD_EXAMPLES']: | |||||
subdirs.append('example-clients') | |||||
if env['BUILD_TESTS']: | |||||
subdirs.append('tests') | |||||
if build_base: | |||||
env.SConscript( dirs=subdirs, exports="env", build_dir=build_base+subdir ) | |||||
else: | |||||
env.SConscript( dirs=subdirs, exports="env" ) | |||||
# -*- python -*- | |||||
import os | |||||
import sys | |||||
import re | |||||
import shutil | |||||
import glob | |||||
import errno | |||||
import time | |||||
import platform | |||||
import string | |||||
import commands | |||||
platform = ARGUMENTS.get('OS', Platform()) | |||||
env = Environment(PLATFORM = platform, | |||||
CPPPATH = ['macosx', 'common']) | |||||
Export('env') | |||||
print platform | |||||
env.SConscript(['common/SConscript']) | |||||
@@ -0,0 +1,456 @@ | |||||
#!/usr/bin/python | |||||
# | |||||
# Copyright (C) 2007 Arnold Krille | |||||
# | |||||
# This file originates from FFADO (www.ffado.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 3 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, see <http://www.gnu.org/licenses/>. | |||||
# | |||||
# | |||||
# Astxx, the Asterisk C++ API and Utility Library. | |||||
# Copyright (C) 2005, 2006 Matthew A. Nicholson | |||||
# Copyright (C) 2006 Tim Blechmann | |||||
# | |||||
# This library is free software; you can redistribute it and/or | |||||
# modify it under the terms of the GNU Lesser General Public | |||||
# License version 2.1 as published by the Free Software Foundation. | |||||
# | |||||
# This library is distributed in the hope that it will be useful, | |||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
# Lesser General Public License for more details. | |||||
# | |||||
# You should have received a copy of the GNU Lesser General Public | |||||
# License along with this library; if not, write to the Free Software | |||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||||
import os | |||||
import os.path | |||||
import glob | |||||
from fnmatch import fnmatch | |||||
def DoxyfileParse(file_contents): | |||||
""" | |||||
Parse a Doxygen source file and return a dictionary of all the values. | |||||
Values will be strings and lists of strings. | |||||
""" | |||||
data = {} | |||||
import shlex | |||||
lex = shlex.shlex(instream = file_contents, posix = True) | |||||
lex.wordchars += "*+./-:" | |||||
lex.whitespace = lex.whitespace.replace("\n", "") | |||||
lex.escape = "" | |||||
lineno = lex.lineno | |||||
token = lex.get_token() | |||||
key = token # the first token should be a key | |||||
last_token = "" | |||||
key_token = False | |||||
next_key = False | |||||
new_data = True | |||||
def append_data(data, key, new_data, token): | |||||
if new_data or len(data[key]) == 0: | |||||
data[key].append(token) | |||||
else: | |||||
data[key][-1] += token | |||||
while token: | |||||
if token in ['\n']: | |||||
if last_token not in ['\\']: | |||||
key_token = True | |||||
elif token in ['\\']: | |||||
pass | |||||
elif key_token: | |||||
key = token | |||||
key_token = False | |||||
else: | |||||
if token == "+=": | |||||
if not data.has_key(key): | |||||
data[key] = list() | |||||
elif token == "=": | |||||
data[key] = list() | |||||
else: | |||||
append_data( data, key, new_data, token ) | |||||
new_data = True | |||||
last_token = token | |||||
token = lex.get_token() | |||||
if last_token == '\\' and token != '\n': | |||||
new_data = False | |||||
append_data( data, key, new_data, '\\' ) | |||||
# compress lists of len 1 into single strings | |||||
for (k, v) in data.items(): | |||||
if len(v) == 0: | |||||
data.pop(k) | |||||
# items in the following list will be kept as lists and not converted to strings | |||||
if k in ["INPUT", "FILE_PATTERNS", "EXCLUDE_PATTERNS"]: | |||||
continue | |||||
if len(v) == 1: | |||||
data[k] = v[0] | |||||
return data | |||||
def DoxySourceScan(node, env, path): | |||||
""" | |||||
Doxygen Doxyfile source scanner. This should scan the Doxygen file and add | |||||
any files used to generate docs to the list of source files. | |||||
""" | |||||
default_file_patterns = [ | |||||
'*.c', '*.cc', '*.cxx', '*.cpp', '*.c++', '*.java', '*.ii', '*.ixx', | |||||
'*.ipp', '*.i++', '*.inl', '*.h', '*.hh ', '*.hxx', '*.hpp', '*.h++', | |||||
'*.idl', '*.odl', '*.cs', '*.php', '*.php3', '*.inc', '*.m', '*.mm', | |||||
'*.py', | |||||
] | |||||
default_exclude_patterns = [ | |||||
'*~', | |||||
] | |||||
sources = [] | |||||
data = DoxyfileParse(node.get_contents()) | |||||
if data.get("RECURSIVE", "NO") == "YES": | |||||
recursive = True | |||||
else: | |||||
recursive = False | |||||
file_patterns = data.get("FILE_PATTERNS", default_file_patterns) | |||||
exclude_patterns = data.get("EXCLUDE_PATTERNS", default_exclude_patterns) | |||||
for node in data.get("INPUT", []): | |||||
if os.path.isfile(node): | |||||
sources.append(node) | |||||
elif os.path.isdir(node): | |||||
if recursive: | |||||
for root, dirs, files in os.walk(node): | |||||
for f in files: | |||||
filename = os.path.join(root, f) | |||||
pattern_check = reduce(lambda x, y: x or bool(fnmatch(filename, y)), file_patterns, False) | |||||
exclude_check = reduce(lambda x, y: x and fnmatch(filename, y), exclude_patterns, True) | |||||
if pattern_check and not exclude_check: | |||||
sources.append(filename) | |||||
else: | |||||
for pattern in file_patterns: | |||||
sources.extend(glob.glob("/".join([node, pattern]))) | |||||
sources = map( lambda path: env.File(path), sources ) | |||||
return sources | |||||
def DoxySourceScanCheck(node, env): | |||||
"""Check if we should scan this file""" | |||||
return os.path.isfile(node.path) | |||||
def DoxyEmitter(source, target, env): | |||||
"""Doxygen Doxyfile emitter""" | |||||
# possible output formats and their default values and output locations | |||||
output_formats = { | |||||
"HTML": ("YES", "html"), | |||||
"LATEX": ("YES", "latex"), | |||||
"RTF": ("NO", "rtf"), | |||||
"MAN": ("YES", "man"), | |||||
"XML": ("NO", "xml"), | |||||
} | |||||
data = DoxyfileParse(source[0].get_contents()) | |||||
targets = [] | |||||
out_dir = data.get("OUTPUT_DIRECTORY", ".") | |||||
# add our output locations | |||||
for (k, v) in output_formats.items(): | |||||
if data.get("GENERATE_" + k, v[0]) == "YES": | |||||
targets.append(env.Dir( os.path.join(out_dir, data.get(k + "_OUTPUT", v[1]))) ) | |||||
# don't clobber targets | |||||
for node in targets: | |||||
env.Precious(node) | |||||
# set up cleaning stuff | |||||
for node in targets: | |||||
env.Clean(node, node) | |||||
return (targets, source) | |||||
def generate(env): | |||||
""" | |||||
Add builders and construction variables for the | |||||
Doxygen tool. This is currently for Doxygen 1.4.6. | |||||
""" | |||||
doxyfile_scanner = env.Scanner( | |||||
DoxySourceScan, | |||||
"DoxySourceScan", | |||||
scan_check = DoxySourceScanCheck, | |||||
) | |||||
import SCons.Builder | |||||
doxyfile_builder = SCons.Builder.Builder( | |||||
action = "cd ${SOURCE.dir} && ${DOXYGEN} ${SOURCE.file}", | |||||
emitter = DoxyEmitter, | |||||
target_factory = env.fs.Entry, | |||||
single_source = True, | |||||
source_scanner = doxyfile_scanner, | |||||
) | |||||
env.Append(BUILDERS = { | |||||
'Doxygen': doxyfile_builder, | |||||
}) | |||||
env.AppendUnique( | |||||
DOXYGEN = 'doxygen', | |||||
) | |||||
def exists(env): | |||||
""" | |||||
Make sure doxygen exists. | |||||
""" | |||||
return env.Detect("doxygen") | |||||
#!/usr/bin/python | |||||
# | |||||
# Copyright (C) 2007 Arnold Krille | |||||
# | |||||
# This file originates from FFADO (www.ffado.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 3 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, see <http://www.gnu.org/licenses/>. | |||||
# | |||||
# | |||||
# Astxx, the Asterisk C++ API and Utility Library. | |||||
# Copyright (C) 2005, 2006 Matthew A. Nicholson | |||||
# Copyright (C) 2006 Tim Blechmann | |||||
# | |||||
# This library is free software; you can redistribute it and/or | |||||
# modify it under the terms of the GNU Lesser General Public | |||||
# License version 2.1 as published by the Free Software Foundation. | |||||
# | |||||
# This library is distributed in the hope that it will be useful, | |||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
# Lesser General Public License for more details. | |||||
# | |||||
# You should have received a copy of the GNU Lesser General Public | |||||
# License along with this library; if not, write to the Free Software | |||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||||
import os | |||||
import os.path | |||||
import glob | |||||
from fnmatch import fnmatch | |||||
def DoxyfileParse(file_contents): | |||||
""" | |||||
Parse a Doxygen source file and return a dictionary of all the values. | |||||
Values will be strings and lists of strings. | |||||
""" | |||||
data = {} | |||||
import shlex | |||||
lex = shlex.shlex(instream = file_contents, posix = True) | |||||
lex.wordchars += "*+./-:" | |||||
lex.whitespace = lex.whitespace.replace("\n", "") | |||||
lex.escape = "" | |||||
lineno = lex.lineno | |||||
token = lex.get_token() | |||||
key = token # the first token should be a key | |||||
last_token = "" | |||||
key_token = False | |||||
next_key = False | |||||
new_data = True | |||||
def append_data(data, key, new_data, token): | |||||
if new_data or len(data[key]) == 0: | |||||
data[key].append(token) | |||||
else: | |||||
data[key][-1] += token | |||||
while token: | |||||
if token in ['\n']: | |||||
if last_token not in ['\\']: | |||||
key_token = True | |||||
elif token in ['\\']: | |||||
pass | |||||
elif key_token: | |||||
key = token | |||||
key_token = False | |||||
else: | |||||
if token == "+=": | |||||
if not data.has_key(key): | |||||
data[key] = list() | |||||
elif token == "=": | |||||
data[key] = list() | |||||
else: | |||||
append_data( data, key, new_data, token ) | |||||
new_data = True | |||||
last_token = token | |||||
token = lex.get_token() | |||||
if last_token == '\\' and token != '\n': | |||||
new_data = False | |||||
append_data( data, key, new_data, '\\' ) | |||||
# compress lists of len 1 into single strings | |||||
for (k, v) in data.items(): | |||||
if len(v) == 0: | |||||
data.pop(k) | |||||
# items in the following list will be kept as lists and not converted to strings | |||||
if k in ["INPUT", "FILE_PATTERNS", "EXCLUDE_PATTERNS"]: | |||||
continue | |||||
if len(v) == 1: | |||||
data[k] = v[0] | |||||
return data | |||||
def DoxySourceScan(node, env, path): | |||||
""" | |||||
Doxygen Doxyfile source scanner. This should scan the Doxygen file and add | |||||
any files used to generate docs to the list of source files. | |||||
""" | |||||
default_file_patterns = [ | |||||
'*.c', '*.cc', '*.cxx', '*.cpp', '*.c++', '*.java', '*.ii', '*.ixx', | |||||
'*.ipp', '*.i++', '*.inl', '*.h', '*.hh ', '*.hxx', '*.hpp', '*.h++', | |||||
'*.idl', '*.odl', '*.cs', '*.php', '*.php3', '*.inc', '*.m', '*.mm', | |||||
'*.py', | |||||
] | |||||
default_exclude_patterns = [ | |||||
'*~', | |||||
] | |||||
sources = [] | |||||
data = DoxyfileParse(node.get_contents()) | |||||
if data.get("RECURSIVE", "NO") == "YES": | |||||
recursive = True | |||||
else: | |||||
recursive = False | |||||
file_patterns = data.get("FILE_PATTERNS", default_file_patterns) | |||||
exclude_patterns = data.get("EXCLUDE_PATTERNS", default_exclude_patterns) | |||||
for node in data.get("INPUT", []): | |||||
if os.path.isfile(node): | |||||
sources.append(node) | |||||
elif os.path.isdir(node): | |||||
if recursive: | |||||
for root, dirs, files in os.walk(node): | |||||
for f in files: | |||||
filename = os.path.join(root, f) | |||||
pattern_check = reduce(lambda x, y: x or bool(fnmatch(filename, y)), file_patterns, False) | |||||
exclude_check = reduce(lambda x, y: x and fnmatch(filename, y), exclude_patterns, True) | |||||
if pattern_check and not exclude_check: | |||||
sources.append(filename) | |||||
else: | |||||
for pattern in file_patterns: | |||||
sources.extend(glob.glob("/".join([node, pattern]))) | |||||
sources = map( lambda path: env.File(path), sources ) | |||||
return sources | |||||
def DoxySourceScanCheck(node, env): | |||||
"""Check if we should scan this file""" | |||||
return os.path.isfile(node.path) | |||||
def DoxyEmitter(source, target, env): | |||||
"""Doxygen Doxyfile emitter""" | |||||
# possible output formats and their default values and output locations | |||||
output_formats = { | |||||
"HTML": ("YES", "html"), | |||||
"LATEX": ("YES", "latex"), | |||||
"RTF": ("NO", "rtf"), | |||||
"MAN": ("YES", "man"), | |||||
"XML": ("NO", "xml"), | |||||
} | |||||
data = DoxyfileParse(source[0].get_contents()) | |||||
targets = [] | |||||
out_dir = data.get("OUTPUT_DIRECTORY", ".") | |||||
# add our output locations | |||||
for (k, v) in output_formats.items(): | |||||
if data.get("GENERATE_" + k, v[0]) == "YES": | |||||
targets.append(env.Dir( os.path.join(out_dir, data.get(k + "_OUTPUT", v[1]))) ) | |||||
# don't clobber targets | |||||
for node in targets: | |||||
env.Precious(node) | |||||
# set up cleaning stuff | |||||
for node in targets: | |||||
env.Clean(node, node) | |||||
return (targets, source) | |||||
def generate(env): | |||||
""" | |||||
Add builders and construction variables for the | |||||
Doxygen tool. This is currently for Doxygen 1.4.6. | |||||
""" | |||||
doxyfile_scanner = env.Scanner( | |||||
DoxySourceScan, | |||||
"DoxySourceScan", | |||||
scan_check = DoxySourceScanCheck, | |||||
) | |||||
import SCons.Builder | |||||
doxyfile_builder = SCons.Builder.Builder( | |||||
action = "cd ${SOURCE.dir} && ${DOXYGEN} ${SOURCE.file}", | |||||
emitter = DoxyEmitter, | |||||
target_factory = env.fs.Entry, | |||||
single_source = True, | |||||
source_scanner = doxyfile_scanner, | |||||
) | |||||
env.Append(BUILDERS = { | |||||
'Doxygen': doxyfile_builder, | |||||
}) | |||||
env.AppendUnique( | |||||
DOXYGEN = 'doxygen', | |||||
) | |||||
def exists(env): | |||||
""" | |||||
Make sure doxygen exists. | |||||
""" | |||||
return env.Detect("doxygen") |
@@ -0,0 +1,274 @@ | |||||
#!/usr/bin/python | |||||
# | |||||
# Copyright (C) 2007 Arnold Krille | |||||
# | |||||
# This file originates from FFADO (www.ffado.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 3 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, see <http://www.gnu.org/licenses/>. | |||||
# | |||||
# | |||||
# Taken from http://www.scons.org/wiki/UsingPkgConfig | |||||
# and heavily modified | |||||
# | |||||
# | |||||
# Checks for pkg-config | |||||
# | |||||
def CheckForPKGConfig( context, version='0.0.0' ): | |||||
context.Message( "Checking for pkg-config (at least version %s)... " % version ) | |||||
ret = context.TryAction( "pkg-config --atleast-pkgconfig-version=%s" %version )[0] | |||||
context.Result( ret ) | |||||
return ret | |||||
# | |||||
# Checks for the given package with an optional version-requirement | |||||
# | |||||
# The flags (which can be imported into the environment by env.MergeFlags(...) | |||||
# are exported as env['NAME_FLAGS'] where name is built by removing all +,-,. | |||||
# and upper-casing. | |||||
# | |||||
def CheckForPKG( context, name, version="" ): | |||||
name2 = name.replace("+","").replace(".","").replace("-","") | |||||
if version == "": | |||||
context.Message( "Checking for %s... \t" % name ) | |||||
ret = context.TryAction( "pkg-config --exists '%s'" % name )[0] | |||||
else: | |||||
context.Message( "Checking for %s (%s or higher)... \t" % (name,version) ) | |||||
ret = context.TryAction( "pkg-config --atleast-version=%s '%s'" % (version,name) )[0] | |||||
if ret: | |||||
context.env['%s_FLAGS' % name2.upper()] = context.env.ParseFlags("!pkg-config --cflags --libs %s" % name) | |||||
context.Result( ret ) | |||||
return ret | |||||
# | |||||
# Checks for the existance of the package and returns the packages flags. | |||||
# | |||||
# This should allow caching of the flags so that pkg-config is called only once. | |||||
# | |||||
def GetPKGFlags( context, name, version="" ): | |||||
import os | |||||
if version == "": | |||||
context.Message( "Checking for %s... \t" % name ) | |||||
ret = context.TryAction( "pkg-config --exists '%s'" % name )[0] | |||||
else: | |||||
context.Message( "Checking for %s (%s or higher)... \t" % (name,version) ) | |||||
ret = context.TryAction( "pkg-config --atleast-version=%s '%s'" % (version,name) )[0] | |||||
if not ret: | |||||
context.Result( ret ) | |||||
return ret | |||||
out = os.popen2( "pkg-config --cflags --libs %s" % name )[1] | |||||
ret = out.read() | |||||
context.Result( True ) | |||||
return ret | |||||
def GetPKGPrefix( context, name ): | |||||
import os | |||||
out = os.popen2( "pkg-config --variable=prefix %s" % name )[1] | |||||
ret = out.read() | |||||
ret = ret.replace ( "\n", "" ) | |||||
context.Message( " getting prefix... \t" ) | |||||
context.Result( True ) | |||||
return ret | |||||
def GetPKGExecPrefix( context, name ): | |||||
import os | |||||
out = os.popen2( "pkg-config --variable=exec_prefix %s" % name )[1] | |||||
ret = out.read() | |||||
ret = ret.replace ( "\n", "" ) | |||||
context.Message( " getting exec prefix... \t" ) | |||||
context.Result( True ) | |||||
return ret | |||||
def GetPKGIncludedir( context, name ): | |||||
import os | |||||
out = os.popen2( "pkg-config --variable=includedir %s" % name )[1] | |||||
ret = out.read() | |||||
ret = ret.replace ( "\n", "" ) | |||||
context.Message( " getting include dir... \t" ) | |||||
context.Result( True ) | |||||
return ret | |||||
def GetPKGLibdir( context, name ): | |||||
import os | |||||
out = os.popen2( "pkg-config --variable=libdir %s" % name )[1] | |||||
ret = out.read() | |||||
ret = ret.replace ( "\n", "" ) | |||||
context.Message( " getting lib dir... \t" ) | |||||
context.Result( True ) | |||||
return ret | |||||
def generate( env, **kw ): | |||||
env['PKGCONFIG_TESTS' ] = { | |||||
'CheckForPKGConfig' : CheckForPKGConfig, | |||||
'CheckForPKG' : CheckForPKG, | |||||
'GetPKGFlags' : GetPKGFlags, | |||||
'GetPKGPrefix' : GetPKGPrefix, | |||||
'GetPKGExecPrefix' : GetPKGExecPrefix, | |||||
'GetPKGIncludedir' : GetPKGIncludedir, | |||||
'GetPKGLibdir' : GetPKGLibdir, | |||||
} | |||||
def exists( env ): | |||||
return 1 | |||||
#!/usr/bin/python | |||||
# | |||||
# Copyright (C) 2007 Arnold Krille | |||||
# | |||||
# This file originates from FFADO (www.ffado.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 3 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, see <http://www.gnu.org/licenses/>. | |||||
# | |||||
# | |||||
# Taken from http://www.scons.org/wiki/UsingPkgConfig | |||||
# and heavily modified | |||||
# | |||||
# | |||||
# Checks for pkg-config | |||||
# | |||||
def CheckForPKGConfig( context, version='0.0.0' ): | |||||
context.Message( "Checking for pkg-config (at least version %s)... " % version ) | |||||
ret = context.TryAction( "pkg-config --atleast-pkgconfig-version=%s" %version )[0] | |||||
context.Result( ret ) | |||||
return ret | |||||
# | |||||
# Checks for the given package with an optional version-requirement | |||||
# | |||||
# The flags (which can be imported into the environment by env.MergeFlags(...) | |||||
# are exported as env['NAME_FLAGS'] where name is built by removing all +,-,. | |||||
# and upper-casing. | |||||
# | |||||
def CheckForPKG( context, name, version="" ): | |||||
name2 = name.replace("+","").replace(".","").replace("-","") | |||||
if version == "": | |||||
context.Message( "Checking for %s... \t" % name ) | |||||
ret = context.TryAction( "pkg-config --exists '%s'" % name )[0] | |||||
else: | |||||
context.Message( "Checking for %s (%s or higher)... \t" % (name,version) ) | |||||
ret = context.TryAction( "pkg-config --atleast-version=%s '%s'" % (version,name) )[0] | |||||
if ret: | |||||
context.env['%s_FLAGS' % name2.upper()] = context.env.ParseFlags("!pkg-config --cflags --libs %s" % name) | |||||
context.Result( ret ) | |||||
return ret | |||||
# | |||||
# Checks for the existance of the package and returns the packages flags. | |||||
# | |||||
# This should allow caching of the flags so that pkg-config is called only once. | |||||
# | |||||
def GetPKGFlags( context, name, version="" ): | |||||
import os | |||||
if version == "": | |||||
context.Message( "Checking for %s... \t" % name ) | |||||
ret = context.TryAction( "pkg-config --exists '%s'" % name )[0] | |||||
else: | |||||
context.Message( "Checking for %s (%s or higher)... \t" % (name,version) ) | |||||
ret = context.TryAction( "pkg-config --atleast-version=%s '%s'" % (version,name) )[0] | |||||
if not ret: | |||||
context.Result( ret ) | |||||
return ret | |||||
out = os.popen2( "pkg-config --cflags --libs %s" % name )[1] | |||||
ret = out.read() | |||||
context.Result( True ) | |||||
return ret | |||||
def GetPKGPrefix( context, name ): | |||||
import os | |||||
out = os.popen2( "pkg-config --variable=prefix %s" % name )[1] | |||||
ret = out.read() | |||||
ret = ret.replace ( "\n", "" ) | |||||
context.Message( " getting prefix... \t" ) | |||||
context.Result( True ) | |||||
return ret | |||||
def GetPKGExecPrefix( context, name ): | |||||
import os | |||||
out = os.popen2( "pkg-config --variable=exec_prefix %s" % name )[1] | |||||
ret = out.read() | |||||
ret = ret.replace ( "\n", "" ) | |||||
context.Message( " getting exec prefix... \t" ) | |||||
context.Result( True ) | |||||
return ret | |||||
def GetPKGIncludedir( context, name ): | |||||
import os | |||||
out = os.popen2( "pkg-config --variable=includedir %s" % name )[1] | |||||
ret = out.read() | |||||
ret = ret.replace ( "\n", "" ) | |||||
context.Message( " getting include dir... \t" ) | |||||
context.Result( True ) | |||||
return ret | |||||
def GetPKGLibdir( context, name ): | |||||
import os | |||||
out = os.popen2( "pkg-config --variable=libdir %s" % name )[1] | |||||
ret = out.read() | |||||
ret = ret.replace ( "\n", "" ) | |||||
context.Message( " getting lib dir... \t" ) | |||||
context.Result( True ) | |||||
return ret | |||||
def generate( env, **kw ): | |||||
env['PKGCONFIG_TESTS' ] = { | |||||
'CheckForPKGConfig' : CheckForPKGConfig, | |||||
'CheckForPKG' : CheckForPKG, | |||||
'GetPKGFlags' : GetPKGFlags, | |||||
'GetPKGPrefix' : GetPKGPrefix, | |||||
'GetPKGExecPrefix' : GetPKGExecPrefix, | |||||
'GetPKGIncludedir' : GetPKGIncludedir, | |||||
'GetPKGLibdir' : GetPKGLibdir, | |||||
} | |||||
def exists( env ): | |||||
return 1 | |||||
@@ -0,0 +1,80 @@ | |||||
#!/usr/bin/python | |||||
# | |||||
# Copyright (C) 2007 Arnold Krille | |||||
# | |||||
# This file originates from FFADO (www.ffado.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 3 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, see <http://www.gnu.org/licenses/>. | |||||
# | |||||
# | |||||
# Taken from http://www.scons.org/wiki/ReplacementBuilder | |||||
# | |||||
from string import Template | |||||
def replace_action(target, source, env): | |||||
open( str(target[0]), 'w' ).write( Template( open( str(source[0]), 'r' ).read() ).safe_substitute( env ) ) | |||||
return 0 | |||||
def replace_string(target, source, env): | |||||
return "building '%s' from '%s'" % ( str(target[0]), str(source[0]) ) | |||||
def generate(env, **kw): | |||||
action = env.Action( replace_action, replace_string ) | |||||
env['BUILDERS']['ScanReplace'] = env.Builder( action=action, src_suffix='.in', single_source=True ) | |||||
def exists(env): | |||||
return 1 | |||||
#!/usr/bin/python | |||||
# | |||||
# Copyright (C) 2007 Arnold Krille | |||||
# | |||||
# This file originates from FFADO (www.ffado.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 3 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, see <http://www.gnu.org/licenses/>. | |||||
# | |||||
# | |||||
# Taken from http://www.scons.org/wiki/ReplacementBuilder | |||||
# | |||||
from string import Template | |||||
def replace_action(target, source, env): | |||||
open( str(target[0]), 'w' ).write( Template( open( str(source[0]), 'r' ).read() ).safe_substitute( env ) ) | |||||
return 0 | |||||
def replace_string(target, source, env): | |||||
return "building '%s' from '%s'" % ( str(target[0]), str(source[0]) ) | |||||
def generate(env, **kw): | |||||
action = env.Action( replace_action, replace_string ) | |||||
env['BUILDERS']['ScanReplace'] = env.Builder( action=action, src_suffix='.in', single_source=True ) | |||||
def exists(env): | |||||
return 1 | |||||
@@ -22,6 +22,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
#pragma warning (disable : 4786) | #pragma warning (disable : 4786) | ||||
#endif | #endif | ||||
#include "config.h" | |||||
#include "JackDriverLoader.h" | #include "JackDriverLoader.h" | ||||
#include "JackError.h" | #include "JackError.h" | ||||
#include <getopt.h> | #include <getopt.h> | ||||
@@ -42,14 +42,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
#ifdef WIN32 | #ifdef WIN32 | ||||
#include "JackWinProcessSync.h" | #include "JackWinProcessSync.h" | ||||
#include "JackWinNamedPipeClientChannel.h" | #include "JackWinNamedPipeClientChannel.h" | ||||
#include "JackWinEvent.h" | |||||
#include "JackWinEvent.h" | |||||
#include "JackWinSemaphore.h" | #include "JackWinSemaphore.h" | ||||
#include "JackWinThread.h" | #include "JackWinThread.h" | ||||
#endif | #endif | ||||
// LINUX | // LINUX | ||||
#ifdef __linux__ | #ifdef __linux__ | ||||
#include "JackAlsaDriver.h" | |||||
#include "linux/alsa/JackAlsaDriver.h" | |||||
#include "JackProcessSync.h" | #include "JackProcessSync.h" | ||||
#include "JackSocketServerNotifyChannel.h" | #include "JackSocketServerNotifyChannel.h" | ||||
#include "JackSocketNotifyChannel.h" | #include "JackSocketNotifyChannel.h" | ||||
@@ -50,14 +50,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
#include "JackWinNamedPipeNotifyChannel.h" | #include "JackWinNamedPipeNotifyChannel.h" | ||||
#include "JackWinNamedPipeServerChannel.h" | #include "JackWinNamedPipeServerChannel.h" | ||||
#include "JackWinNamedPipeClientChannel.h" | #include "JackWinNamedPipeClientChannel.h" | ||||
#include "JackWinEvent.h" | |||||
#include "JackWinEvent.h" | |||||
#include "JackWinSemaphore.h" | #include "JackWinSemaphore.h" | ||||
#include "JackWinThread.h" | #include "JackWinThread.h" | ||||
#endif | #endif | ||||
// LINUX | // LINUX | ||||
#ifdef __linux__ | #ifdef __linux__ | ||||
#include "JackAlsaDriver.h" | |||||
#include "linux/alsa/JackAlsaDriver.h" | |||||
#include "JackProcessSync.h" | #include "JackProcessSync.h" | ||||
#include "JackSocketServerNotifyChannel.h" | #include "JackSocketServerNotifyChannel.h" | ||||
#include "JackSocketNotifyChannel.h" | #include "JackSocketNotifyChannel.h" | ||||
@@ -18,6 +18,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
*/ | */ | ||||
#include "config.h" | |||||
#include "JackChannel.h" | #include "JackChannel.h" | ||||
#include "JackLibGlobals.h" | #include "JackLibGlobals.h" | ||||
#include "JackServerLaunch.h" | #include "JackServerLaunch.h" | ||||
@@ -1,11 +1,11 @@ | |||||
# Type "make" or "make all" to compile ALSA driver, and "make freebob" to compile FREEBOB driver. | # Type "make" or "make all" to compile ALSA driver, and "make freebob" to compile FREEBOB driver. | ||||
# Choose the installation location | # Choose the installation location | ||||
prefix := /usr/local | |||||
prefix := /usr | |||||
prefix := ${DESTDIR}${prefix} | prefix := ${DESTDIR}${prefix} | ||||
libdir := lib | libdir := lib | ||||
subprojects := ../common ../common/jack ../tests ../example-clients alsa freebob | |||||
subprojects := ../common ../common/jack ../tests ../example-clients alsa freebob firewire | |||||
sources := $(wildcard *.cpp) $(wildcard */*.cpp) $(wildcard ../common/*.cpp) $(wildcard ../tests/*.cpp) | sources := $(wildcard *.cpp) $(wildcard */*.cpp) $(wildcard ../common/*.cpp) $(wildcard ../tests/*.cpp) | ||||
@@ -21,6 +21,8 @@ TARGET_LINUX_ALSA := jack_alsa.so | |||||
TARGET_LINUX_FREEBOB := jack_freebob.so | TARGET_LINUX_FREEBOB := jack_freebob.so | ||||
TARGET_LINUX_FIREWIRE := jack_firewire.so | |||||
TARGET_LINUX_DUMMY := jack_dummy.so | TARGET_LINUX_DUMMY := jack_dummy.so | ||||
VPATH := $(subprojects) | VPATH := $(subprojects) | ||||
@@ -46,6 +48,8 @@ objects_linux_alsa := JackAlsaDriver.o memops.o generic_hw.o hdsp.o hammerfall.o | |||||
objects_linux_freebob := JackFreebobDriver.o | objects_linux_freebob := JackFreebobDriver.o | ||||
objects_linux_firewire := JackFFADODriver.o | |||||
objects_linux_dummy := JackDummyDriver.o | objects_linux_dummy := JackDummyDriver.o | ||||
CFLAGS := -g -fPIC -DUSE_POSIX_SHM $(addprefix -I, $(subprojects)) $(CFLAGS) | CFLAGS := -g -fPIC -DUSE_POSIX_SHM $(addprefix -I, $(subprojects)) $(CFLAGS) | ||||
@@ -65,6 +69,10 @@ freebob : $(TARGET_LINUX_SERVER_LIB) $(TARGET_LINUX_CLIENT_LIB) $(TARGET_LINUX_W | |||||
$(TARGET_LINUX_SERVER) $(TARGET_LINUX_ALSA) $(TARGET_LINUX_FREEBOB) $(TARGET_LINUX_DUMMY) \ | $(TARGET_LINUX_SERVER) $(TARGET_LINUX_ALSA) $(TARGET_LINUX_FREEBOB) $(TARGET_LINUX_DUMMY) \ | ||||
synchroClient synchroServer synchroServerClient testSem jack_test inprocess jack_load jack_unload | synchroClient synchroServer synchroServerClient testSem jack_test inprocess jack_load jack_unload | ||||
firewire : $(TARGET_LINUX_SERVER_LIB) $(TARGET_LINUX_CLIENT_LIB) $(TARGET_LINUX_WRAPPER_LIB) \ | |||||
$(TARGET_LINUX_SERVER) $(TARGET_LINUX_ALSA) $(TARGET_LINUX_FIREWIRE) $(TARGET_LINUX_DUMMY) \ | |||||
synchroClient synchroServer synchroServerClient testSem jack_test | |||||
synchroClient: JackPosixSemaphore.o testSynchroClient.o JackPosixThread.o JackError.o JackFifo.o | synchroClient: JackPosixSemaphore.o testSynchroClient.o JackPosixThread.o JackError.o JackFifo.o | ||||
$(CXX) $(CXXFLAGS) JackPosixSemaphore.o testSynchroClient.o JackPosixThread.o JackError.o JackFifo.o $(LIB_LINUX) -o synchroClient | $(CXX) $(CXXFLAGS) JackPosixSemaphore.o testSynchroClient.o JackPosixThread.o JackError.o JackFifo.o $(LIB_LINUX) -o synchroClient | ||||
@@ -107,6 +115,9 @@ $(TARGET_LINUX_ALSA) : $(objects_linux_alsa) | |||||
$(TARGET_LINUX_FREEBOB) : $(objects_linux_freebob) | $(TARGET_LINUX_FREEBOB) : $(objects_linux_freebob) | ||||
$(CXX) $(CXXFLAGS) -shared $(objects_linux_freebob) $(LIB_LINUX) -lfreebob libjackdmp.so -o $(TARGET_LINUX_FREEBOB) | $(CXX) $(CXXFLAGS) -shared $(objects_linux_freebob) $(LIB_LINUX) -lfreebob libjackdmp.so -o $(TARGET_LINUX_FREEBOB) | ||||
$(TARGET_LINUX_FIREWIRE) : $(objects_linux_firewire) | |||||
$(CXX) $(CXXFLAGS) -shared $(objects_linux_firewire) $(LIB_LINUX) -lffado libjackdmp.so -o $(TARGET_LINUX_FIREWIRE) | |||||
$(TARGET_LINUX_DUMMY) : $(objects_linux_dummy) | $(TARGET_LINUX_DUMMY) : $(objects_linux_dummy) | ||||
$(CXX) $(CXXFLAGS) -shared $(objects_linux_dummy) $(LIB_LINUX) libjackdmp.so -o $(TARGET_LINUX_DUMMY) | $(CXX) $(CXXFLAGS) -shared $(objects_linux_dummy) $(LIB_LINUX) libjackdmp.so -o $(TARGET_LINUX_DUMMY) | ||||
@@ -120,6 +131,7 @@ install: | |||||
cp jack_alsa.so $(prefix)/$(libdir)/jackmp | cp jack_alsa.so $(prefix)/$(libdir)/jackmp | ||||
cp jack_dummy.so $(prefix)/$(libdir)/jackmp | cp jack_dummy.so $(prefix)/$(libdir)/jackmp | ||||
[ -f jack_freebob.so ] && cp jack_freebob.so $(prefix)/$(libdir)/jackmp || echo "freebob driver not installed" | [ -f jack_freebob.so ] && cp jack_freebob.so $(prefix)/$(libdir)/jackmp || echo "freebob driver not installed" | ||||
[ -f jack_firewire.so ] && cp jack_firewire.so $(prefix)/$(libdir)/jackmp || echo "firewire driver not installed" | |||||
cd $(prefix)/bin && [ -f jackd ] && mv -f jackd tmp_jackd || echo "jackd server not found, continue..." | cd $(prefix)/bin && [ -f jackd ] && mv -f jackd tmp_jackd || echo "jackd server not found, continue..." | ||||
cd $(prefix)/$(libdir) && [ -f libjack.so.0.0.23 ] && mv -f libjack.so.0.0.23 tmp_libjack.so.0.0.23 || echo "libjack not found, continue..." | cd $(prefix)/$(libdir) && [ -f libjack.so.0.0.23 ] && mv -f libjack.so.0.0.23 tmp_libjack.so.0.0.23 || echo "libjack not found, continue..." | ||||
cd $(prefix)/include && [ -d jack ] && mv -f jack tmp_jack || echo "jack headers not found, continue..." | cd $(prefix)/include && [ -d jack ] && mv -f jack tmp_jack || echo "jack headers not found, continue..." | ||||
@@ -149,7 +161,7 @@ remove: | |||||
clean : | clean : | ||||
rm -f *.o | rm -f *.o | ||||
rm -f $(TARGET_LINUX_SERVER) $(TARGET_LINUX_SERVER_LIB) $(TARGET_LINUX_CLIENT_LIB) $(TARGET_LINUX_WRAPPER_LIB) $(TARGET_LINUX_ALSA) $(TARGET_LINUX_FREEBOB) $(TARGET_LINUX_DUMMY) \ | |||||
rm -f $(TARGET_LINUX_SERVER) $(TARGET_LINUX_SERVER_LIB) $(TARGET_LINUX_CLIENT_LIB) $(TARGET_LINUX_WRAPPER_LIB) $(TARGET_LINUX_ALSA) $(TARGET_LINUX_FREEBOB) $(TARGET_LINUX_FIREWIRE) $(TARGET_LINUX_DUMMY) \ | |||||
synchroClient synchroServer synchroServerClient testSem jack_test jack_load jack_unload inprocess.so | synchroClient synchroServer synchroServerClient testSem jack_test jack_load jack_unload inprocess.so | ||||
depend : | depend : | ||||
#makedepend -w120 -Y -- $(CXXFLAGS) -- $(sources) | #makedepend -w120 -Y -- $(CXXFLAGS) -- $(sources) | ||||
@@ -61,7 +61,7 @@ JackFreebobDriver::freebob_driver_read (freebob_driver_t * driver, jack_nframes_ | |||||
printEnter(); | printEnter(); | ||||
// make sure all buffers have a valid buffer if not connected | // make sure all buffers have a valid buffer if not connected | ||||
for (int i = 0; i < driver->capture_nchannels; i++) { | |||||
for (unsigned int i = 0; i < driver->capture_nchannels; i++) { | |||||
stream_type = freebob_streaming_get_playback_stream_type(driver->dev, i); | stream_type = freebob_streaming_get_playback_stream_type(driver->dev, i); | ||||
if (stream_type == freebob_stream_type_audio) { | if (stream_type == freebob_stream_type_audio) { | ||||
freebob_streaming_set_playback_stream_buffer(driver->dev, i, | freebob_streaming_set_playback_stream_buffer(driver->dev, i, | ||||
@@ -104,10 +104,7 @@ JackFreebobDriver::freebob_driver_read (freebob_driver_t * driver, jack_nframes_ | |||||
int | int | ||||
JackFreebobDriver::freebob_driver_write (freebob_driver_t * driver, jack_nframes_t nframes) | JackFreebobDriver::freebob_driver_write (freebob_driver_t * driver, jack_nframes_t nframes) | ||||
{ | { | ||||
channel_t chn; | |||||
JSList *node; | |||||
jack_default_audio_sample_t* buf = NULL; | jack_default_audio_sample_t* buf = NULL; | ||||
jack_port_t *port; | |||||
freebob_streaming_stream_type stream_type; | freebob_streaming_stream_type stream_type; | ||||
@@ -121,7 +118,7 @@ JackFreebobDriver::freebob_driver_write (freebob_driver_t * driver, jack_nframes | |||||
assert(driver->dev); | assert(driver->dev); | ||||
// make sure all buffers output silence if not connected | // make sure all buffers output silence if not connected | ||||
for (int i = 0; i < driver->playback_nchannels; i++) { | |||||
for (unsigned int i = 0; i < driver->playback_nchannels; i++) { | |||||
stream_type = freebob_streaming_get_playback_stream_type(driver->dev, i); | stream_type = freebob_streaming_get_playback_stream_type(driver->dev, i); | ||||
if (stream_type == freebob_stream_type_audio) { | if (stream_type == freebob_stream_type_audio) { | ||||
freebob_streaming_set_playback_stream_buffer(driver->dev, i, | freebob_streaming_set_playback_stream_buffer(driver->dev, i, | ||||
@@ -736,7 +733,9 @@ int JackFreebobDriver::Attach() | |||||
} else { | } else { | ||||
printMessage ("Registering capture port %s", buf); | printMessage ("Registering capture port %s", buf); | ||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, (JackPortFlags)port_flags)) == NO_PORT) { | |||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, | |||||
JACK_DEFAULT_AUDIO_TYPE, | |||||
(JackPortFlags)port_flags)) == NO_PORT) { | |||||
jack_error("driver: cannot register port for %s", buf); | jack_error("driver: cannot register port for %s", buf); | ||||
return -1; | return -1; | ||||
} | } | ||||
@@ -754,7 +753,7 @@ int JackFreebobDriver::Attach() | |||||
driver->playback_nchannels = freebob_streaming_get_nb_playback_streams(driver->dev); | driver->playback_nchannels = freebob_streaming_get_nb_playback_streams(driver->dev); | ||||
driver->playback_nchannels_audio = 0; | driver->playback_nchannels_audio = 0; | ||||
for (int i = 0; i < driver->playback_nchannels; i++) { | |||||
for (unsigned int i = 0; i < driver->playback_nchannels; i++) { | |||||
freebob_streaming_get_playback_stream_name(driver->dev, i, portname, sizeof(portname) - 1); | freebob_streaming_get_playback_stream_name(driver->dev, i, portname, sizeof(portname) - 1); | ||||
snprintf(buf, sizeof(buf) - 1, "%s:%s", fClientControl->fName, portname); | snprintf(buf, sizeof(buf) - 1, "%s:%s", fClientControl->fName, portname); | ||||
@@ -763,7 +762,9 @@ int JackFreebobDriver::Attach() | |||||
printMessage ("Don't register playback port %s", buf); | printMessage ("Don't register playback port %s", buf); | ||||
} else { | } else { | ||||
printMessage ("Registering playback port %s", buf); | printMessage ("Registering playback port %s", buf); | ||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, (JackPortFlags)port_flags)) == NO_PORT) { | |||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, | |||||
JACK_DEFAULT_AUDIO_TYPE, | |||||
(JackPortFlags)port_flags)) == NO_PORT) { | |||||
jack_error("driver: cannot register port for %s", buf); | jack_error("driver: cannot register port for %s", buf); | ||||
return -1; | return -1; | ||||
} | } | ||||
@@ -888,17 +889,7 @@ int JackFreebobDriver::Read() | |||||
int JackFreebobDriver::Write() | int JackFreebobDriver::Write() | ||||
{ | { | ||||
printEnter(); | printEnter(); | ||||
//JackLog("write\n"); | |||||
int res = freebob_driver_write((freebob_driver_t *)fDriver, fEngineControl->fBufferSize); | int res = freebob_driver_write((freebob_driver_t *)fDriver, fEngineControl->fBufferSize); | ||||
jack_time_t write_time = GetMicroSeconds(); | |||||
/* | |||||
if (write_time > (fLastWaitUst - fDelayedUst) + fEngineControl->fPeriodUsecs) { | |||||
JackLog("FreeBoB write XRun \n"); | |||||
NotifyXRun(write_time); | |||||
} | |||||
*/ | |||||
printExit(); | printExit(); | ||||
return res; | return res; | ||||
} | } | ||||
@@ -1052,8 +1043,6 @@ extern "C" | |||||
} | } | ||||
Jack::JackDriverClientInterface* driver_initialize(Jack::JackEngine* engine, Jack::JackSynchro** table, const JSList* params) { | Jack::JackDriverClientInterface* driver_initialize(Jack::JackEngine* engine, Jack::JackSynchro** table, const JSList* params) { | ||||
jack_driver_t *driver; | |||||
unsigned int port = 0; | unsigned int port = 0; | ||||
unsigned int node_id = -1; | unsigned int node_id = -1; | ||||
int nbitems; | int nbitems; | ||||