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 | import os | ||||
| from string import Template | from string import Template | ||||
| platform = ARGUMENTS.get('OS', Platform()) | |||||
| build_dir = ARGUMENTS.get('BUILDDIR', "") | build_dir = ARGUMENTS.get('BUILDDIR', "") | ||||
| if build_dir: | if build_dir: | ||||
| build_base=build_dir+'/' | build_base=build_dir+'/' | ||||
| @@ -79,7 +81,8 @@ else: | |||||
| buildenv['LD_LIBRARY_PATH']='' | 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( """ | Help( """ | ||||
| For building jackdmp you can set different options as listed below. You have to | 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( CCFLAGS=["-DDEBUG","-Wall","-g"] ) | ||||
| env.AppendUnique( CFLAGS=["-DDEBUG","-Wall","-g"] ) | env.AppendUnique( CFLAGS=["-DDEBUG","-Wall","-g"] ) | ||||
| else: | 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( CCFLAGS=["-fPIC", "-DSOCKET_RPC_FIFO_SEMA", "-D__SMP__"] ) | ||||
| env.AppendUnique( CFLAGS=["-fPIC", "-DUSE_POSIX_SHM"] ) | env.AppendUnique( CFLAGS=["-fPIC", "-DUSE_POSIX_SHM"] ) | ||||
| @@ -236,260 +239,14 @@ if env['BUILD_DOXYGEN_DOCS']: | |||||
| env.Doxygen("doxyfile") | env.Doxygen("doxyfile") | ||||
| subdirs=['common'] | subdirs=['common'] | ||||
| if build_for_linux: | |||||
| if env['PLATFORM'] == 'posix': | |||||
| subdirs.append('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") | |||||
| 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']: | if env['BUILD_EXAMPLES']: | ||||
| subdirs.append('example-clients') | subdirs.append('example-clients') | ||||
| @@ -502,27 +259,3 @@ if build_base: | |||||
| else: | else: | ||||
| env.SConscript( dirs=subdirs, exports="env" ) | 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 | #endif | ||||
| #ifdef __linux__ | #ifdef __linux__ | ||||
| #ifndef ADDON_DIR | |||||
| #include "config.h" | #include "config.h" | ||||
| #endif | #endif | ||||
| #endif | |||||
| #include "JackDriverLoader.h" | #include "JackDriverLoader.h" | ||||
| #include "JackError.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" | #include "config.h" | ||||
| #endif | #endif | ||||
| #endif | |||||
| #include "JackChannel.h" | #include "JackChannel.h" | ||||
| #include "JackLibGlobals.h" | #include "JackLibGlobals.h" | ||||
| @@ -27,123 +27,8 @@ Import( 'env' ) | |||||
| # paths where include files can be found | # paths where include files can be found | ||||
| env.AppendUnique( CPPPATH=["#/", "#/common", "#/common/jack"] ) | 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 | # 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")) | #env.Command(new_name, old_name, Move("$TARGET", "$SOURCE")) | ||||
| #print " linking to %s..." % (libjackdmp_location) | #print " linking to %s..." % (libjackdmp_location) | ||||
| #env.Command(old_name, libjackdmp_location, "ln -s $TARGET $SOURCE") | #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 | # 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 | # build the example clients | ||||
| if env['BUILD_EXAMPLES']: | if env['BUILD_EXAMPLES']: | ||||
| clientenv = env.Copy() | clientenv = env.Copy() | ||||
| @@ -5,7 +5,7 @@ prefix := /usr | |||||
| prefix := ${DESTDIR}${prefix} | prefix := ${DESTDIR}${prefix} | ||||
| libdir := lib | 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) | 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) | $(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) | ||||
| # Install jackdmp and overwrite jack installation | # Install jackdmp and overwrite jack installation | ||||
| install: | install: | ||||
| cp jackdmp $(prefix)/bin | cp jackdmp $(prefix)/bin | ||||
| @@ -59,84 +59,6 @@ serverenv.Install( env['bindir'], server ) | |||||
| drv = serverenv.SharedLibrary( "jack_dummy", srcfiles_linux_dummy ) | drv = serverenv.SharedLibrary( "jack_dummy", srcfiles_linux_dummy ) | ||||
| serverenv.InstallAs( env['libdir']+ "/jackmp/jack_dummy.so", drv ) | 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 env['ENABLE_ALSA']: | ||||
| if not env.GetOption('clean'): | if not env.GetOption('clean'): | ||||
| serverenv.MergeFlags( env['ALSA_FLAGS'] ) | 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; | break; | ||||
| case kAudioDevicePropertyNominalSampleRate: { | case kAudioDevicePropertyNominalSampleRate: { | ||||
| OSStatus err; | |||||
| /* | |||||
| err = AudioOutputUnitStop(driver->fAUHAL); | |||||
| if (err != noErr) | |||||
| jack_error("Error calling AudioOutputUnitStop"); | |||||
| */ | |||||
| UInt32 outSize = sizeof(Float64); | UInt32 outSize = sizeof(Float64); | ||||
| Float64 sampleRate; | Float64 sampleRate; | ||||
| AudioStreamBasicDescription srcFormat, dstFormat; | 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) { | if (err != noErr) { | ||||
| jack_error("Cannot get current sample rate"); | jack_error("Cannot get current sample rate"); | ||||
| printError(err); | printError(err); | ||||
| @@ -319,6 +326,11 @@ OSStatus JackCoreAudioDriver::DeviceNotificationCallback(AudioDeviceID inDevice, | |||||
| jack_error("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Output"); | jack_error("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Output"); | ||||
| printError(err); | printError(err); | ||||
| } | } | ||||
| /* | |||||
| err = AudioOutputUnitStart(driver->fAUHAL); | |||||
| if (err != noErr) | |||||
| jack_error("Error calling AudioOutputUnitStart"); | |||||
| */ | |||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| @@ -47,58 +47,6 @@ testenv = env.Copy() | |||||
| testenv.PrependUnique( LIBPATH=env['build_base'] ) | testenv.PrependUnique( LIBPATH=env['build_base'] ) | ||||
| testenv.PrependUnique( LIBS="jackmp" ) | 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(): | for test_program in test_programs.keys(): | ||||
| testenv.Program(target=test_program, | testenv.Program(target=test_program, | ||||
| source=env.Split( test_programs[test_program] ) ) | source=env.Split( test_programs[test_program] ) ) | ||||