git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1728 0c269be4-1314-0410-8aa9-9f06e86f4224tags/0.69
@@ -21,6 +21,8 @@ | |||
import os | |||
from string import Template | |||
platform = ARGUMENTS.get('OS', Platform()) | |||
build_dir = ARGUMENTS.get('BUILDDIR', "") | |||
if build_dir: | |||
build_base=build_dir+'/' | |||
@@ -79,7 +81,8 @@ else: | |||
buildenv['LD_LIBRARY_PATH']='' | |||
env = Environment( tools=['default','scanreplace','pkgconfig', 'doxygen'], toolpath=['admin'], ENV=buildenv, options=opts ) | |||
env = Environment( tools=['default','scanreplace','pkgconfig', 'doxygen'], toolpath=['admin'], | |||
ENV=buildenv, PLATFORM = platform, options=opts ) | |||
Help( """ | |||
For building jackdmp you can set different options as listed below. You have to | |||
@@ -186,8 +189,8 @@ if env['DEBUG']: | |||
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=["-O3","-DNDEBUG"] ) | |||
env.AppendUnique( CFLAGS=["-O3","-DNDEBUG"] ) | |||
env.AppendUnique( CCFLAGS=["-fPIC", "-DSOCKET_RPC_FIFO_SEMA", "-D__SMP__"] ) | |||
env.AppendUnique( CFLAGS=["-fPIC", "-DUSE_POSIX_SHM"] ) | |||
@@ -236,260 +239,14 @@ if env['BUILD_DOXYGEN_DOCS']: | |||
env.Doxygen("doxyfile") | |||
subdirs=['common'] | |||
if build_for_linux: | |||
if env['PLATFORM'] == 'posix': | |||
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") | |||
if env['PLATFORM'] == 'macosx': # FIXME FOR SLETZ: check macosx/SConscript | |||
subdirs.append('macosx') | |||
# | |||
# Start building | |||
# | |||
if env['BUILD_DOXYGEN_DOCS']: | |||
env.Doxygen("doxyfile") | |||
subdirs=['common'] | |||
if build_for_linux: | |||
subdirs.append('linux') | |||
if env['PLATFORM'] == 'windows': # FIXME FOR SLETZ: create/check macosx/SConscript | |||
subdirs.append('windows') | |||
if env['BUILD_EXAMPLES']: | |||
subdirs.append('example-clients') | |||
@@ -502,27 +259,3 @@ if build_base: | |||
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']) | |||
@@ -23,8 +23,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
#endif | |||
#ifdef __linux__ | |||
#ifndef ADDON_DIR | |||
#include "config.h" | |||
#endif | |||
#endif | |||
#include "JackDriverLoader.h" | |||
#include "JackError.h" | |||
@@ -18,9 +18,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
*/ | |||
#ifdef __linux__ | |||
#ifdef __linux__ | |||
#ifndef ADDON_DIR | |||
#include "config.h" | |||
#endif | |||
#endif | |||
#include "JackChannel.h" | |||
#include "JackLibGlobals.h" | |||
@@ -27,123 +27,8 @@ Import( 'env' ) | |||
# paths where include files can be found | |||
env.AppendUnique( CPPPATH=["#/", "#/common", "#/common/jack"] ) | |||
# | |||
# Define the source files | |||
# | |||
srcfiles_common_serverlib = env.Split( '\ | |||
JackActivationCount.cpp JackAPI.cpp JackAudioDriver.cpp JackClient.cpp JackConnectionManager.cpp \ | |||
JackDriver.cpp JackEngine.cpp JackEngineControl.cpp JackError.c JackExternalClient.cpp JackFrameTimer.cpp \ | |||
JackFreewheelDriver.cpp JackGlobalsServer.cpp JackGraphManager.cpp JackInternalClient.cpp JackPort.cpp JackPosixSemaphore.cpp \ | |||
JackPosixThread.cpp JackFifo.cpp JackLoopbackDriver.cpp JackPortType.cpp JackAudioPort.cpp JackMidiPort.cpp \ | |||
JackServer.cpp JackShmMem.cpp JackThreadedDriver.cpp shm.c JackSocket.cpp JackSocketServerChannel.cpp JackSocketNotifyChannel.cpp \ | |||
JackSocketServerNotifyChannel.cpp JackTime.c JackServerAPI.cpp JackGlobals.cpp JackDriverLoader.cpp JackDebugClient.cpp \ | |||
JackTransportEngine.cpp JackServerGlobals.cpp JackServerLaunch.cpp timestamps.c JackTools.cpp \ | |||
') | |||
# FIXME: this is not pretty | |||
srcfiles_common_serverlib.append('#/example-clients/internal_metro.cpp') | |||
srcfiles_common_clientlib = env.Split( '\ | |||
JackActivationCount.cpp JackAPI.cpp JackClient.cpp JackConnectionManager.cpp ringbuffer.c JackServerLaunch.cpp\ | |||
JackError.c JackFrameTimer.cpp JackGlobalsClient.cpp JackGraphManager.cpp JackLibClient.cpp JackLibAPI.cpp JackPort.cpp JackPosixSemaphore.cpp \ | |||
JackFifo.cpp JackPortType.cpp JackAudioPort.cpp JackMidiPort.cpp JackMidiAPI.cpp JackEngineControl.cpp JackPosixThread.cpp JackShmMem.cpp \ | |||
shm.c JackSocket.cpp JackSocketClientChannel.cpp JackTime.c JackGlobals.cpp JackDebugClient.cpp JackTransportEngine.cpp timestamps.c JackTools.cpp \ | |||
') | |||
srcfiles_common_wrapperlib = ['JackAPIWrapper.cpp', 'ringbuffer.c'] | |||
jack_headers = env.Split( 'intclient.h jack.h midiport.h ringbuffer.h \ | |||
statistics.h thread.h transport.h types.h') | |||
# | |||
# Start building | |||
# | |||
#pkgconfig = env.ScanReplace( "libjackmp.pc.in" ) | |||
#env.Install( env['libdir'] + '/pkgconfig', pkgconfig ) | |||
env.AppendUnique( LIBS=["rt", "pthread"] ) | |||
# build the common stuff | |||
clientlib = env.SharedLibrary( "jackmp", srcfiles_common_clientlib ) | |||
env.Install( "$libdir", clientlib ) | |||
serverlib = env.SharedLibrary( "jackdmp", srcfiles_common_serverlib ) | |||
env.Install( "$libdir", serverlib ) | |||
wrapperlib = env.SharedLibrary( "jackwrapper", srcfiles_common_wrapperlib ) | |||
env.Install( "$libdir", wrapperlib ) | |||
# install the headers | |||
#if env['JACK_FLAGS']: | |||
#jack_include_dir = env['JACK_INCLUDEDIR'] | |||
#if 'install' in COMMAND_LINE_TARGETS and os.path.isdir( jack_include_dir ): | |||
#if env.GetOption('clean'): | |||
#pass | |||
#else: | |||
#jack_old_includes_dir = env['includedir'] + '/jack_up' | |||
#print "moving old jack includes to %s..." % jack_old_includes_dir | |||
#env.Command(jack_old_includes_dir, jack_include_dir, Move("$TARGET", "$SOURCE")) | |||
for header in jack_headers: | |||
env.Alias("install", env.Install( env['includedir'] + '/jack', 'jack/' + header )) | |||
# install the libs | |||
env.Alias("install", env.Install(env['libdir'], serverlib)) | |||
env.Alias("install", env.Install(env['libdir'], clientlib)) | |||
env.Alias("install", env.Install(env['libdir'], wrapperlib)) | |||
#jack_libdir = env['JACK_LIBDIR'] | |||
#libjackdmp_location = env['libdir'] + '/libjackmp.so' | |||
#if 'install' in COMMAND_LINE_TARGETS and os.path.isdir( jack_libdir ): | |||
#if env.GetOption('clean'): | |||
##note: is this executed before the actual uninstall? | |||
#lib_files = glob.glob(jack_libdir + '/libjack.so.*.up') | |||
#for old_name in lib_files: | |||
#new_name = old_name[:-3] | |||
#print "restoring old jack lib %s to %s..." % (old_name, new_name) | |||
#env.Command(Delete(new_name)) | |||
#env.Command(new_name, old_name, Move("$TARGET", "$SOURCE")) | |||
#else: | |||
#lib_files = glob.glob(jack_libdir + '/libjack.so.*') | |||
#env.Alias("install", env.Install(env['libdir'], serverlib)) | |||
#env.Alias("install", env.Install(env['libdir'], clientlib)) | |||
#for old_name in lib_files: | |||
#new_name = old_name + '.up' | |||
#print "moving old jack lib %s to %s..." % (old_name, new_name) | |||
#env.Command(new_name, old_name, Move("$TARGET", "$SOURCE")) | |||
#print " linking to %s..." % (libjackdmp_location) | |||
#env.Command(old_name, libjackdmp_location, "ln -s $TARGET $SOURCE") | |||
# | |||
# Copyright (C) 2007 Arnold Krille | |||
# Copyright (C) 2007 Pieter Palmers | |||
# | |||
# This file originally was part of FFADO | |||
# | |||
# 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 | |||
import glob | |||
from string import Template | |||
Import( 'env' ) | |||
# paths where include files can be found | |||
env.AppendUnique( CPPPATH=["#/", "#/common", "#/common/jack"] ) | |||
#HACK: this should not be here ideally | |||
env.AppendUnique( CPPPATH=["#/linux","#/macosx"] ) | |||
# | |||
# Define the source files | |||
@@ -234,80 +119,3 @@ env.Alias("install", env.Install(env['libdir'], wrapperlib)) | |||
#env.Command(new_name, old_name, Move("$TARGET", "$SOURCE")) | |||
#print " linking to %s..." % (libjackdmp_location) | |||
#env.Command(old_name, libjackdmp_location, "ln -s $TARGET $SOURCE") | |||
# -*- python -*- | |||
import os | |||
import os.path | |||
import glob | |||
#Import('env') | |||
#CPPPATH = ['macosx', 'common'] | |||
objects_common_server_lib=Split(""" | |||
JackActivationCount.cpp | |||
JackAPI.cpp | |||
JackAudioDriver.cpp | |||
JackClient.cpp | |||
JackConnectionManager.cpp | |||
JackDriver.cpp | |||
JackEngine.cpp | |||
JackEngineTiming.cpp | |||
JackError.cpp | |||
JackExternalClient.cpp | |||
JackFrameTimer.cpp | |||
JackFreewheelDriver.o | |||
JackGlobalsServer.cpp | |||
JackGraphManager.cpp | |||
JackInternalClient.cpp | |||
JackPort.cpp | |||
JackPosixSemaphore.cpp | |||
JackPosixThread.cpp | |||
JackFifo.cpp | |||
JackLoopbackDriver.cpp | |||
JackServer.cpp | |||
JackShmMem.cpp | |||
JackThreadedDriver.cpp | |||
shm.c | |||
JackSocket.cpp | |||
JackSocketServerChannel.cpp | |||
JackSocketNotifyChannel.cpp | |||
JackSocketServerNotifyChannel.cpp | |||
JackTime.cpp | |||
JackServerAPI.cpp | |||
JackGlobals.cpp | |||
JackDriverLoader.cpp | |||
internal_metro.cpp | |||
JackDebugClient.cpp | |||
JackTransportEngine.cpp | |||
JackServerGlobals.o | |||
""") | |||
objects_common_client_lib =Split(""" | |||
JackActivationCount.cpp | |||
JackAPI.cpp | |||
JackClient.cpp | |||
JackConnectionManager.cpp | |||
ringbuffer.cpp | |||
JackError.cpp | |||
JackFrameTimer.cpp | |||
JackGlobalsClient.cpp | |||
JackGraphManager.cpp | |||
JackLibClient.cpp | |||
JackLibAPI.cpp | |||
JackPort.cpp | |||
JackPosixSemaphore.cpp | |||
JackFifo.cpp | |||
JackPosixThread.cpp | |||
JackShmMem.cpp | |||
shm.c | |||
JackSocket.cpp | |||
JackSocketClientChannel.cpp | |||
JackTime.cpp | |||
JackGlobals.cpp | |||
JackDebugClient.cpp | |||
JackTransportEngine.cpp | |||
""") | |||
SharedLibrary('libjackdmp', objects_common_server_lib, CPPPATH = ['.','../macosx','jack'], CXXFLAGS=["-O3"]) | |||
SharedLibrary('libjackmp', objects_common_client_lib, CPPPATH = ['.','../macosx','jack'], CXXFLAGS=["-O3"]) |
@@ -66,92 +66,6 @@ if env['HAS_READLINE']: | |||
# Start building | |||
# | |||
# build the example clients | |||
if env['BUILD_EXAMPLES']: | |||
clientenv = env.Copy() | |||
clientenv.PrependUnique( LIBPATH=env['build_base'] ) | |||
for example_client_program in example_client_programs.keys(): | |||
clientenv.Program(target=example_client_program, | |||
source=env.Split( example_client_programs[example_client_program]), | |||
LIBS=extra_libs[example_client_program] ) | |||
if env['INSTALL_EXAMPLES']: | |||
clientenv.Install( "$bindir", example_client_program ) | |||
for example_client_lib in example_client_libs.keys(): | |||
clientenv.SharedLibrary(target=example_client_lib, | |||
source=env.Split( example_client_libs[example_client_lib] ) ) | |||
if env['INSTALL_EXAMPLES']: | |||
#clientenv.Install( "$libdir", example_client_lib ) | |||
pass | |||
# | |||
# 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 | |||
Import( 'env' ) | |||
# paths where include files can be found | |||
env.AppendUnique( CPPPATH=["#/", "#/common"] ) | |||
# | |||
# Define the source files | |||
# | |||
example_client_programs = { | |||
"jack_freewheel" : "freewheel.c", | |||
"jack_connect" : "connect.c", | |||
"jack_lsp" : "lsp.c", | |||
"jack_metro" : "metro.c", | |||
#"jack_midiseq" : "midiseq.c", | |||
#"jack_midisine" : "midisine.c", | |||
"jack_showtime" : "showtime.c", | |||
"jack_simple_client" : "simple_client.c", | |||
"jack_zombie" : "zombie.c", | |||
"jack_load" : "ipload.c", | |||
"jack_unload" : "ipunload.c", | |||
} | |||
example_client_libs = { | |||
"inprocess" : "inprocess.c", | |||
} | |||
# link extra libs? | |||
extra_libs = {} | |||
for example_client_program in example_client_programs.keys(): | |||
extra_libs[example_client_program] = ["jackdmp", "dl"] | |||
# special cases | |||
extra_libs["jack_load"] = ["jackmp"] | |||
extra_libs["jack_unload"] = ["jackmp"] | |||
env['HAS_READLINE']=True | |||
if env['HAS_READLINE']: | |||
extra_libs["jack_transport"] = ["readline", "jackdmp", "dl"] | |||
example_client_programs["jack_transport"] = "transport.c" | |||
# | |||
# Start building | |||
# | |||
# build the example clients | |||
if env['BUILD_EXAMPLES']: | |||
clientenv = env.Copy() | |||
@@ -5,7 +5,7 @@ prefix := /usr | |||
prefix := ${DESTDIR}${prefix} | |||
libdir := lib | |||
subprojects := ../common ../common/jack ../tests ../example-clients alsa freebob firewire | |||
subprojects := ../common ../common/jack ../tests ../example-clients alsa freebob firewire ../linux .. | |||
sources := $(wildcard *.cpp) $(wildcard */*.cpp) $(wildcard ../common/*.cpp) $(wildcard ../tests/*.cpp) | |||
@@ -121,7 +121,6 @@ $(TARGET_LINUX_FIREWIRE) : $(objects_linux_firewire) | |||
$(TARGET_LINUX_DUMMY) : $(objects_linux_dummy) | |||
$(CXX) $(CXXFLAGS) -shared $(objects_linux_dummy) $(LIB_LINUX) libjackdmp.so -o $(TARGET_LINUX_DUMMY) | |||
# Install jackdmp and overwrite jack installation | |||
install: | |||
cp jackdmp $(prefix)/bin | |||
@@ -59,84 +59,6 @@ serverenv.Install( env['bindir'], server ) | |||
drv = serverenv.SharedLibrary( "jack_dummy", srcfiles_linux_dummy ) | |||
serverenv.InstallAs( env['libdir']+ "/jackmp/jack_dummy.so", drv ) | |||
if env['ENABLE_ALSA']: | |||
if not env.GetOption('clean'): | |||
serverenv.MergeFlags( env['ALSA_FLAGS'] ) | |||
drv = serverenv.SharedLibrary( "jack_alsa", srcfiles_linux_alsa ) | |||
serverenv.InstallAs( env['libdir']+ "/jackmp/jack_alsa.so", drv ) | |||
if env['ENABLE_FREEBOB']: | |||
if not env.GetOption('clean'): | |||
serverenv.MergeFlags( env['FREEBOB_FLAGS'] ) | |||
drv = serverenv.SharedLibrary( "jack_freebob", srcfiles_linux_freebob ) | |||
serverenv.InstallAs( env['libdir']+ "/jackmp/jack_freebob.so", drv ) | |||
if env['ENABLE_FIREWIRE']: | |||
if not env.GetOption('clean'): | |||
serverenv.MergeFlags( env['FFADO_FLAGS'] ) | |||
drv = serverenv.SharedLibrary( "jack_firewire", srcfiles_linux_ffado ) | |||
serverenv.InstallAs( env['libdir']+ "/jackmp/jack_firewire.so", drv ) | |||
# | |||
# 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 | |||
Import( 'env' ) | |||
# paths where include files can be found | |||
env.AppendUnique( CPPPATH=["#/", "#/common", "#/common/jack", "#/linux"] ) | |||
# | |||
# Define the source files | |||
# | |||
srcfiles_linux_server = ['#/common/Jackdmp.cpp'] | |||
srcfiles_linux_alsa = env.Split( '\ | |||
JackAlsaDriver.cpp memops.c generic_hw.c hdsp.c hammerfall.c ice1712.c') | |||
for i in range(len(srcfiles_linux_alsa)): | |||
srcfiles_linux_alsa[i] = 'alsa/%s' % srcfiles_linux_alsa[i] | |||
srcfiles_linux_freebob = ['freebob/JackFreebobDriver.cpp'] | |||
srcfiles_linux_ffado = ['firewire/JackFFADODriver.cpp'] | |||
srcfiles_linux_dummy = ['#/common/JackDummyDriver.cpp'] | |||
# | |||
# Start building | |||
# | |||
#pkgconfig = env.ScanReplace( "libjackmp.pc.in" ) | |||
#env.Install( env['libdir'] + '/pkgconfig', pkgconfig ) | |||
# build the server and its backends | |||
serverenv = env.Copy() | |||
serverenv.PrependUnique( LIBPATH=env['build_base'] ) | |||
serverenv.PrependUnique( LIBS=["jackdmp", "dl"] ) | |||
server = serverenv.Program("jackdmp", srcfiles_linux_server) | |||
serverenv.Install( env['bindir'], server ) | |||
drv = serverenv.SharedLibrary( "jack_dummy", srcfiles_linux_dummy ) | |||
serverenv.InstallAs( env['libdir']+ "/jackmp/jack_dummy.so", drv ) | |||
if env['ENABLE_ALSA']: | |||
if not env.GetOption('clean'): | |||
serverenv.MergeFlags( env['ALSA_FLAGS'] ) | |||
@@ -1,311 +0,0 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
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. | |||
$Id: driver.h,v 1.2 2005/11/23 11:24:29 letz Exp $ | |||
*/ | |||
#ifndef __jack_driver_h__ | |||
#define __jack_driver_h__ | |||
#include <pthread.h> | |||
#include "types.h" | |||
#include "jslist.h" | |||
#include "driver_interface.h" | |||
typedef float gain_t; | |||
typedef long channel_t; | |||
typedef enum { | |||
Lock = 0x1, | |||
NoLock = 0x2, | |||
Sync = 0x4, | |||
NoSync = 0x8 | |||
} ClockSyncStatus; | |||
typedef void (*ClockSyncListenerFunction)(channel_t, ClockSyncStatus, void*); | |||
typedef struct | |||
{ | |||
unsigned long id; | |||
ClockSyncListenerFunction function; | |||
void *arg; | |||
} | |||
ClockSyncListener; | |||
struct _jack_engine; | |||
struct _jack_driver; | |||
typedef int (*JackDriverAttachFunction)(struct _jack_driver *, | |||
struct _jack_engine *); | |||
typedef int (*JackDriverDetachFunction)(struct _jack_driver *, | |||
struct _jack_engine *); | |||
typedef int (*JackDriverReadFunction)(struct _jack_driver *, | |||
jack_nframes_t nframes); | |||
typedef int (*JackDriverWriteFunction)(struct _jack_driver *, | |||
jack_nframes_t nframes); | |||
typedef int (*JackDriverNullCycleFunction)(struct _jack_driver *, | |||
jack_nframes_t nframes); | |||
typedef int (*JackDriverStopFunction)(struct _jack_driver *); | |||
typedef int (*JackDriverStartFunction)(struct _jack_driver *); | |||
typedef int (*JackDriverBufSizeFunction)(struct _jack_driver *, | |||
jack_nframes_t nframes); | |||
/* | |||
Call sequence summary: | |||
1) engine loads driver via runtime dynamic linking | |||
- calls jack_driver_load | |||
- we call dlsym for "driver_initialize" and execute it | |||
2) engine attaches to driver | |||
3) engine starts driver | |||
4) driver runs its own thread, calling | |||
while () { | |||
driver->wait (); | |||
driver->engine->run_cycle () | |||
} | |||
5) engine stops driver | |||
6) engine detaches from driver | |||
7) engine calls driver `finish' routine | |||
Note that stop/start may be called multiple times in the event of an | |||
error return from the `wait' function. | |||
*/ | |||
typedef struct _jack_driver | |||
{ | |||
/* The _jack_driver structure fields are included at the beginning of | |||
each driver-specific structure using the JACK_DRIVER_DECL macro, | |||
which is defined below. The comments that follow describe each | |||
common field. | |||
The driver should set this to be the interval it expects to elapse | |||
between returning from the `wait' function. if set to zero, it | |||
implies that the driver does not expect regular periodic wakeups. | |||
jack_time_t period_usecs; | |||
The driver should set this within its "wait" function to indicate | |||
the UST of the most recent determination that the engine cycle | |||
should run. it should not be set if the "extra_fd" argument of | |||
the wait function is set to a non-zero value. | |||
jack_time_t last_wait_ust; | |||
These are not used by the driver. They should not be written to or | |||
modified in any way | |||
void *handle; | |||
struct _jack_internal_client *internal_client; | |||
This should perform any cleanup associated with the driver. it will | |||
be called when jack server process decides to get rid of the | |||
driver. in some systems, it may not be called at all, so the driver | |||
should never rely on a call to this. it can set it to NULL if | |||
it has nothing do do. | |||
void (*finish)(struct _jack_driver *); | |||
The JACK engine will call this when it wishes to attach itself to | |||
the driver. the engine will pass a pointer to itself, which the driver | |||
may use in anyway it wishes to. the driver may assume that this | |||
is the same engine object that will make `wait' calls until a | |||
`detach' call is made. | |||
JackDriverAttachFunction attach; | |||
The JACK engine will call this when it is finished using a driver. | |||
JackDriverDetachFunction detach; | |||
The JACK engine will call this when it wants to wait until the | |||
driver decides that its time to process some data. the driver returns | |||
a count of the number of audioframes that can be processed. | |||
it should set the variable pointed to by `status' as follows: | |||
zero: the wait completed normally, processing may begin | |||
negative: the wait failed, and recovery is not possible | |||
positive: the wait failed, and the driver stopped itself. | |||
a call to `start' will return the driver to | |||
a correct and known state. | |||
the driver should also fill out the `delayed_usecs' variable to | |||
indicate any delay in its expected periodic execution. for example, | |||
if it discovers that its return from poll(2) is later than it | |||
expects it to be, it would place an estimate of the delay | |||
in this variable. the engine will use this to decide if it | |||
plans to continue execution. | |||
JackDriverWaitFunction wait; | |||
The JACK engine will call this to ask the driver to move | |||
data from its inputs to its output port buffers. it should | |||
return 0 to indicate successful completion, negative otherwise. | |||
This function will always be called after the wait function (above). | |||
JackDriverReadFunction read; | |||
The JACK engine will call this to ask the driver to move | |||
data from its input port buffers to its outputs. it should | |||
return 0 to indicate successful completion, negative otherwise. | |||
this function will always be called after the read function (above). | |||
JackDriverWriteFunction write; | |||
The JACK engine will call this after the wait function (above) has | |||
been called, but for some reason the engine is unable to execute | |||
a full "cycle". the driver should do whatever is necessary to | |||
keep itself running correctly, but cannot reference ports | |||
or other JACK data structures in any way. | |||
JackDriverNullCycleFunction null_cycle; | |||
The engine will call this when it plans to stop calling the `wait' | |||
function for some period of time. the driver should take | |||
appropriate steps to handle this (possibly no steps at all). | |||
NOTE: the driver must silence its capture buffers (if any) | |||
from within this function or the function that actually | |||
implements the change in state. | |||
JackDriverStopFunction stop; | |||
The engine will call this to let the driver know that it plans | |||
to start calling the `wait' function on a regular basis. the driver | |||
should take any appropriate steps to handle this (possibly no steps | |||
at all). NOTE: The driver may wish to silence its playback buffers | |||
(if any) from within this function or the function that actually | |||
implements the change in state. | |||
JackDriverStartFunction start; | |||
The engine will call this to let the driver know that some client | |||
has requested a new buffer size. The stop function will be called | |||
prior to this, and the start function after this one has returned. | |||
JackDriverBufSizeFunction bufsize; | |||
*/ | |||
/* define the fields here... */ | |||
#define JACK_DRIVER_DECL \ | |||
jack_time_t period_usecs; \ | |||
jack_time_t last_wait_ust; \ | |||
void *handle; \ | |||
struct _jack_client_internal * internal_client; \ | |||
void (*finish)(struct _jack_driver *);\ | |||
JackDriverAttachFunction attach; \ | |||
JackDriverDetachFunction detach; \ | |||
JackDriverReadFunction read; \ | |||
JackDriverWriteFunction write; \ | |||
JackDriverNullCycleFunction null_cycle; \ | |||
JackDriverStopFunction stop; \ | |||
JackDriverStartFunction start; \ | |||
JackDriverBufSizeFunction bufsize; | |||
JACK_DRIVER_DECL /* expand the macro */ | |||
} | |||
jack_driver_t; | |||
typedef jack_driver_desc_t * (*JackDriverDescFunction) (); | |||
void jack_driver_init (jack_driver_t *); | |||
void jack_driver_release (jack_driver_t *); | |||
jack_driver_t *jack_driver_load (int argc, char **argv); | |||
void jack_driver_unload (jack_driver_t *); | |||
/**************************** | |||
*** Non-Threaded Drivers *** | |||
****************************/ | |||
/* | |||
Call sequence summary: | |||
1) engine loads driver via runtime dynamic linking | |||
- calls jack_driver_load | |||
- we call dlsym for "driver_initialize" and execute it | |||
- driver_initialize calls jack_driver_nt_init | |||
2) nt layer attaches to driver | |||
3) nt layer starts driver | |||
4) nt layer runs a thread, calling | |||
while () { | |||
driver->nt_run_ctcle(); | |||
} | |||
5) nt layer stops driver | |||
6) nt layer detaches driver | |||
7) engine calls driver `finish' routine which calls jack_driver_nt_finish | |||
Note that stop/start may be called multiple times in the event of an | |||
error return from the `wait' function. | |||
*/ | |||
struct _jack_driver_nt; | |||
typedef int (*JackDriverNTAttachFunction)(struct _jack_driver_nt *); | |||
typedef int (*JackDriverNTDetachFunction)(struct _jack_driver_nt *); | |||
typedef int (*JackDriverNTStopFunction)(struct _jack_driver_nt *); | |||
typedef int (*JackDriverNTStartFunction)(struct _jack_driver_nt *); | |||
typedef int (*JackDriverNTBufSizeFunction)(struct _jack_driver_nt *, | |||
jack_nframes_t nframes); | |||
typedef int (*JackDriverNTRunCycleFunction)(struct _jack_driver_nt *); | |||
typedef struct _jack_driver_nt | |||
{ | |||
#define JACK_DRIVER_NT_DECL \ | |||
JACK_DRIVER_DECL \ | |||
struct _jack_engine * engine; \ | |||
volatile int nt_run; \ | |||
pthread_t nt_thread; \ | |||
pthread_mutex_t nt_run_lock; \ | |||
JackDriverNTAttachFunction nt_attach; \ | |||
JackDriverNTDetachFunction nt_detach; \ | |||
JackDriverNTStopFunction nt_stop; \ | |||
JackDriverNTStartFunction nt_start; \ | |||
JackDriverNTBufSizeFunction nt_bufsize; \ | |||
JackDriverNTRunCycleFunction nt_run_cycle; | |||
#define nt_read read | |||
#define nt_write write | |||
#define nt_null_cycle null_cycle | |||
JACK_DRIVER_NT_DECL | |||
} | |||
jack_driver_nt_t; | |||
void jack_driver_nt_init (jack_driver_nt_t * driver); | |||
void jack_driver_nt_finish (jack_driver_nt_t * driver); | |||
#endif /* __jack_driver_h__ */ |
@@ -282,10 +282,17 @@ OSStatus JackCoreAudioDriver::DeviceNotificationCallback(AudioDeviceID inDevice, | |||
break; | |||
case kAudioDevicePropertyNominalSampleRate: { | |||
OSStatus err; | |||
/* | |||
err = AudioOutputUnitStop(driver->fAUHAL); | |||
if (err != noErr) | |||
jack_error("Error calling AudioOutputUnitStop"); | |||
*/ | |||
UInt32 outSize = sizeof(Float64); | |||
Float64 sampleRate; | |||
AudioStreamBasicDescription srcFormat, dstFormat; | |||
OSStatus err = AudioDeviceGetProperty(driver->fDeviceID, 0, kAudioDeviceSectionGlobal, kAudioDevicePropertyNominalSampleRate, &outSize, &sampleRate); | |||
err = AudioDeviceGetProperty(driver->fDeviceID, 0, kAudioDeviceSectionGlobal, kAudioDevicePropertyNominalSampleRate, &outSize, &sampleRate); | |||
if (err != noErr) { | |||
jack_error("Cannot get current sample rate"); | |||
printError(err); | |||
@@ -319,6 +326,11 @@ OSStatus JackCoreAudioDriver::DeviceNotificationCallback(AudioDeviceID inDevice, | |||
jack_error("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Output"); | |||
printError(err); | |||
} | |||
/* | |||
err = AudioOutputUnitStart(driver->fAUHAL); | |||
if (err != noErr) | |||
jack_error("Error calling AudioOutputUnitStart"); | |||
*/ | |||
break; | |||
} | |||
} | |||
@@ -47,58 +47,6 @@ testenv = env.Copy() | |||
testenv.PrependUnique( LIBPATH=env['build_base'] ) | |||
testenv.PrependUnique( LIBS="jackmp" ) | |||
for test_program in test_programs.keys(): | |||
testenv.Program(target=test_program, | |||
source=env.Split( test_programs[test_program] ) ) | |||
# | |||
# 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 | |||
Import( 'env' ) | |||
# paths where include files can be found | |||
env.AppendUnique( CPPPATH=["#/", "#/common"] ) | |||
# | |||
# Define the source files | |||
# | |||
test_programs = { | |||
"synchroClient" : "testSynchroClient.cpp #/common/JackPosixSemaphore.cpp #/common/JackPosixThread.cpp #/common/JackError.c #/common/JackFifo.cpp", | |||
"synchroServer" : "testSynchroServer.cpp #/common/JackPosixSemaphore.cpp #/common/JackPosixThread.cpp #/common/JackError.c #/common/JackFifo.cpp", | |||
"synchroServerClient" : "testSynchroServerClient.cpp #/common/JackPosixSemaphore.cpp #/common/JackPosixThread.cpp #/common/JackError.c #/common/JackFifo.cpp #/common/JackPthreadCond.cpp", | |||
"testSem" : "testSem.cpp #/common/JackPosixSemaphore.cpp #/common/JackPosixThread.cpp #/common/JackError.c #/common/JackFifo.cpp", | |||
"jack_test" : "jack_test.cpp", | |||
} | |||
# | |||
# Start building | |||
# | |||
# build the tests | |||
testenv = env.Copy() | |||
testenv.PrependUnique( LIBPATH=env['build_base'] ) | |||
testenv.PrependUnique( LIBS="jackmp" ) | |||
for test_program in test_programs.keys(): | |||
testenv.Program(target=test_program, | |||
source=env.Split( test_programs[test_program] ) ) |