diff --git a/ChangeLog b/ChangeLog index 0b5b074e..f54ae963 100644 --- a/ChangeLog +++ b/ChangeLog @@ -24,20 +24,60 @@ Peter L Jones Devin Anderson Josh Green Mario Lang -Arnold Krille +Arnold Krille +Jan Engelhardt +Adrian Knoth --------------------------- Jackdmp changes log --------------------------- -2010-04-016 Stephane Letz +2010-08-23 Stephane Letz - * Make jack_connect/jack_disconnect wait for effective port connection/disconnection. + * Adrian Knoth fix for linux cycle.h (ticket 188). + +2010-07-07 Stephane Letz + + * Jan Engelhardt patch for get_cycles on SPARC. + * Adrian Knoth hurd.patch, kfreebsd-fix.patch and alpha_ia64-sigsegv.patch from ticket 177. + +2010-06-29 Stephane Letz + + * Arnold Krille firewire snooping patch. + +2010-06-16 Stephane Letz + + * David Garcia Garzon unused_pkt_buf_field_jack2 netone patch. + +2010-06-13 Stephane Letz + + * Fix JackPosixSemaphore::TimedWait : same behavior as JackPosixSemaphore::Wait regarding EINTR. + +2010-05-31 Stephane Letz + + * Fix from Fernando Lopez-Lezcano for compilation on fc13. + +2010-05-30 Stephane Letz + + * David Garcia Garzon netone patch. +2010-05-27 Stephane Letz + + * In JackCoreAudioDriver, move code called in MeasureCallback to be called once in IO thread. + +2010-05-07 Stephane Letz + + * Add tests to validate intclient.h API. + * On Linux, inter-process synchronization primitive switched to POSIX semaphore. + +2010-04-16 Stephane Letz + + * Make jack_connect/jack_disconnect wait for effective port connection/disconnection. + 2010-04-07 Stephane Letz * Remove call to exit in library code. - + 2010-03-26 Stephane Letz * ffado-portname-sync.patch from ticket #163 applied. @@ -45,7 +85,7 @@ Arnold Krille 2010-03-24 Stephane Letz * On Windows, now use TRE library for regexp (BSD license instead of GPL license). - + 2010-03-19 Stephane Letz * Fix some file header to have library side code use LGPL. @@ -234,7 +274,7 @@ Arnold Krille 2009-10-20 Stephane Letz * Add a string parameter to server ==> client notification, add a new JackInfoShutdownCallback type. - * CoreAudio backend now issue a JackInfoShutdownCallback when an unrecoverable error is detected (sampling rate change, stream configuration changeÉ) + * CoreAudio backend now issue a JackInfoShutdownCallback when an unrecoverable error is detected (sampling rate change, stream configuration changed) 2009-10-17 Stephane Letz diff --git a/common/JackClient.cpp b/common/JackClient.cpp index 889a24a8..800c70f6 100644 --- a/common/JackClient.cpp +++ b/common/JackClient.cpp @@ -1012,7 +1012,7 @@ int JackClient::InternalClientLoad(const char* client_name, jack_options_t optio if (va->load_name && (strlen(va->load_name) >= JACK_PATH_MAX)) { jack_error("\"%s\" is too long for a shared object name.\n" "Please use %lu characters or less.", - va->load_name, PATH_MAX); + va->load_name, JACK_PATH_MAX); int my_status1 = *status | (JackFailure | JackInvalidOption); *status = (jack_status_t)my_status1; return 0; @@ -1027,7 +1027,8 @@ int JackClient::InternalClientLoad(const char* client_name, jack_options_t optio return 0; } - int int_ref, result = -1; + int int_ref = 0; + int result = -1; fChannel->InternalClientLoad(GetClientControl()->fRefNum, client_name, va->load_name, va->load_init, options, (int*)status, &int_ref, &result); return int_ref; } diff --git a/common/JackError.cpp b/common/JackError.cpp index 905bbef8..d78f95e5 100644 --- a/common/JackError.cpp +++ b/common/JackError.cpp @@ -27,17 +27,15 @@ using namespace Jack; -void change_thread_log_function(jack_log_function_t log_function) +static bool change_thread_log_function(jack_log_function_t log_function) { - if (!jack_tls_set(JackGlobals::fKeyLogFunction, (void*)log_function)) - { - jack_error("failed to set thread log function"); - } + return (jack_tls_get(JackGlobals::fKeyLogFunction) == NULL + && jack_tls_set(JackGlobals::fKeyLogFunction, (void*)log_function)); } -SERVER_EXPORT void set_threaded_log_function() +SERVER_EXPORT int set_threaded_log_function() { - change_thread_log_function(JackMessageBufferAdd); + return change_thread_log_function(JackMessageBufferAdd); } void jack_log_function(int level, const char *message) diff --git a/common/JackError.h b/common/JackError.h index e16a65b2..03b4eada 100644 --- a/common/JackError.h +++ b/common/JackError.h @@ -53,10 +53,9 @@ extern "C" typedef void (* jack_log_function_t)(int level, const char *message); - void change_thread_log_function(jack_log_function_t log_function); void jack_log_function(int level, const char *message); - SERVER_EXPORT void set_threaded_log_function(); + SERVER_EXPORT int set_threaded_log_function(); #ifdef __cplusplus } diff --git a/common/JackPhysicalMidiInput.h b/common/JackPhysicalMidiInput.h index 6ba3b471..a05de6d0 100644 --- a/common/JackPhysicalMidiInput.h +++ b/common/JackPhysicalMidiInput.h @@ -120,7 +120,7 @@ namespace Jack { public: JackPhysicalMidiInput(size_t buffer_size=1024); - ~JackPhysicalMidiInput(); + virtual ~JackPhysicalMidiInput(); /** * Called to process MIDI data during a period. diff --git a/common/JackPhysicalMidiOutput.h b/common/JackPhysicalMidiOutput.h index f76a233a..9b4804b7 100644 --- a/common/JackPhysicalMidiOutput.h +++ b/common/JackPhysicalMidiOutput.h @@ -92,7 +92,7 @@ namespace Jack { JackPhysicalMidiOutput(size_t non_rt_buffer_size=1024, size_t rt_buffer_size=64); - ~JackPhysicalMidiOutput(); + virtual ~JackPhysicalMidiOutput(); /** * Called to process MIDI data during a period. diff --git a/common/Jackdmp.cpp b/common/Jackdmp.cpp index 89ed0845..fcf83a16 100644 --- a/common/Jackdmp.cpp +++ b/common/Jackdmp.cpp @@ -85,7 +85,7 @@ static void copyright(FILE* file) { fprintf(file, "jackdmp " VERSION "\n" "Copyright 2001-2005 Paul Davis and others.\n" - "Copyright 2004-2009 Grame.\n" + "Copyright 2004-2010 Grame.\n" "jackdmp comes with ABSOLUTELY NO WARRANTY\n" "This is free software, and you are welcome to redistribute it\n" "under certain conditions; see the file COPYING for details\n"); diff --git a/common/jack/systemdeps.h b/common/jack/systemdeps.h index 939e3c35..eadecd40 100644 --- a/common/jack/systemdeps.h +++ b/common/jack/systemdeps.h @@ -53,7 +53,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #endif /* WIN32 */ -#if defined(__APPLE__) || defined(__linux__) || defined(__sun__) || defined(sun) +#if defined(__APPLE__) || defined(__linux__) || defined(__sun__) || defined(sun) || defined(__unix__) #include #include #include diff --git a/common/netjack.c b/common/netjack.c index a073c2cf..077fad8c 100644 --- a/common/netjack.c +++ b/common/netjack.c @@ -564,6 +564,7 @@ netjack_driver_state_t *netjack_init (netjack_driver_state_t *netj, netj->resample_factor = resample_factor; netj->resample_factor_up = resample_factor_up; + netj->jitter_val = jitter_val; return netj; } @@ -734,7 +735,6 @@ netjack_startup( netjack_driver_state_t *netj ) } netj->rx_bufsize = sizeof (jacknet_packet_header) + netj->net_period_down * netj->capture_channels * get_sample_size (netj->bitdepth); - netj->pkt_buf = malloc (netj->rx_bufsize); global_packcache = packet_cache_new (netj->latency + 50, netj->rx_bufsize, netj->mtu); netj->expected_framecnt_valid = 0; diff --git a/common/netjack.h b/common/netjack.h index 91c81be5..edac28a0 100644 --- a/common/netjack.h +++ b/common/netjack.h @@ -85,7 +85,6 @@ struct _netjack_driver_state { unsigned int handle_transport_sync; unsigned int *rx_buf; - unsigned int *pkt_buf; unsigned int rx_bufsize; //unsigned int tx_bufsize; unsigned int mtu; diff --git a/common/shm.c b/common/shm.c index d0e62de9..2cb1d40e 100644 --- a/common/shm.c +++ b/common/shm.c @@ -512,7 +512,7 @@ jack_register_server (const char *server_name, int new_registry) unlock: jack_shm_unlock_registry (); - return 0; + return res; } /* release server_name registration */ diff --git a/dbus/audio_reserve.c b/dbus/audio_reserve.c index 049826a5..da811c83 100644 --- a/dbus/audio_reserve.c +++ b/dbus/audio_reserve.c @@ -60,7 +60,7 @@ SERVER_EXPORT int audio_reservation_finish() if (gConnection) { dbus_connection_unref(gConnection); gConnection = NULL; - jack_info("audio_reservation_finish"); + jack_info("audio_reservation_finish"); } return 0; } diff --git a/dbus/controller.c b/dbus/controller.c index 17b51fdf..9c2bf3a5 100644 --- a/dbus/controller.c +++ b/dbus/controller.c @@ -1,6 +1,6 @@ /* -*- Mode: C ; c-basic-offset: 4 -*- */ /* - Copyright (C) 2007,2008 Nedko Arnaudov + Copyright (C) 2007,2008,2010 Nedko Arnaudov Copyright (C) 2007-2008 Juuso Alasuutari This program is free software; you can redistribute it and/or modify @@ -25,6 +25,7 @@ #include #include #include +#include #include "controller.h" #include "controller_internal.h" @@ -142,11 +143,7 @@ jack_controller_start_server( jack_info("Starting jack server..."); - if (controller_ptr->started) - { - jack_info("Already started."); - return TRUE; - } + assert(!controller_ptr->started); /* should be ensured by caller */ if (controller_ptr->driver == NULL) { @@ -171,7 +168,6 @@ jack_controller_start_server( if (controller_ptr->client == NULL) { jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "failed to create dbusapi jack client"); - goto fail_stop_server; } @@ -179,13 +175,12 @@ jack_controller_start_server( if (ret != 0) { jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "failed to set xrun callback. error is %d", ret); - goto fail_close_client; } if (!jack_controller_patchbay_init(controller_ptr)) { - jack_error("Failed to initialize patchbay district"); + jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "Failed to initialize patchbay district"); goto fail_close_client; } @@ -193,7 +188,6 @@ jack_controller_start_server( if (ret != 0) { jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "failed to activate dbusapi jack client. error is %d", ret); - goto fail_patchbay_uninit; } @@ -232,16 +226,12 @@ jack_controller_stop_server( jack_info("Stopping jack server..."); - if (!controller_ptr->started) - { - jack_info("Already stopped."); - return TRUE; - } + assert(controller_ptr->started); /* should be ensured by caller */ ret = jack_deactivate(controller_ptr->client); if (ret != 0) { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "failed to deactivate dbusapi jack client. error is %d", ret); + jack_error("failed to deactivate dbusapi jack client. error is %d", ret); } jack_controller_patchbay_uninit(controller_ptr); @@ -256,6 +246,7 @@ jack_controller_stop_server( if (!jackctl_server_stop(controller_ptr->server)) { + jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "Failed to stop server"); return FALSE; } diff --git a/dbus/controller_iface_control.c b/dbus/controller_iface_control.c index 967cde19..cd0187da 100644 --- a/dbus/controller_iface_control.c +++ b/dbus/controller_iface_control.c @@ -1,6 +1,6 @@ /* -*- Mode: C ; c-basic-offset: 4 -*- */ /* - Copyright (C) 2007,2008 Nedko Arnaudov + Copyright (C) 2007,2008,2010 Nedko Arnaudov Copyright (C) 2007-2008 Juuso Alasuutari This program is free software; you can redistribute it and/or modify @@ -85,29 +85,46 @@ jack_control_run_method( } else if (strcmp (call->method_name, "StartServer") == 0) { - if (!jack_controller_start_server(controller_ptr, call)) + if (controller_ptr->started) { - jack_dbus_error(call, JACK_DBUS_ERROR_GENERIC, "Failed to start server"); - return true; + jack_info("Ignoring JACK server start request because server is already started."); + } + else + { + if (!jack_controller_start_server(controller_ptr, call)) + { + /* the reply is set by the failed function */ + assert(call->reply != NULL); + return true; + } + + jack_controller_control_send_signal_server_started(); } - - jack_controller_control_send_signal_server_started(); } else if (strcmp (call->method_name, "StopServer") == 0) { - if (!jack_controller_stop_server(controller_ptr, call)) + if (!controller_ptr->started) { - jack_dbus_error(call, JACK_DBUS_ERROR_GENERIC, "Failed to stop server"); - return true; + jack_info("Ignoring JACK server stop request because server is already stopped."); + } + else + { + if (!jack_controller_stop_server(controller_ptr, call)) + { + /* the reply is set by the failed function */ + assert(call->reply != NULL); + return true; + } + + jack_controller_control_send_signal_server_stopped(); } - - jack_controller_control_send_signal_server_stopped(); } else if (strcmp (call->method_name, "SwitchMaster") == 0) { if (!jack_controller_switch_master(controller_ptr, call)) { - jack_dbus_error(call, JACK_DBUS_ERROR_GENERIC, "Failed to switch master"); + /* the reply is set by the failed function */ + assert(call->reply != NULL); return true; } diff --git a/dbus/sigsegv.c b/dbus/sigsegv.c index ab535bc2..ea309547 100644 --- a/dbus/sigsegv.c +++ b/dbus/sigsegv.c @@ -98,14 +98,18 @@ static void signal_segv(int signum, siginfo_t* info, void*ptr) { jack_error("info.si_errno = %d", info->si_errno); jack_error("info.si_code = %d (%s)", info->si_code, si_codes[info->si_code]); jack_error("info.si_addr = %p", info->si_addr); +#if !defined(__alpha__) && !defined(__ia64__) && !defined(__FreeBSD_kernel__) && !defined(__arm__) && !defined(__hppa__) && !defined(__sh__) for(i = 0; i < NGREG; i++) jack_error("reg[%02d] = 0x" REGFORMAT, i, #if defined(__powerpc__) ucontext->uc_mcontext.uc_regs[i] +#elif defined(__sparc__) && defined(__arch64__) + ucontext->uc_mcontext.mc_gregs[i] #else ucontext->uc_mcontext.gregs[i] #endif ); +#endif /* alpha, ia64, kFreeBSD, arm, hppa */ #if defined(SIGSEGV_STACK_X86) || defined(SIGSEGV_STACK_IA64) # if defined(SIGSEGV_STACK_IA64) diff --git a/example-clients/ipload.c b/example-clients/ipload.c index 49810a46..4868de3b 100644 --- a/example-clients/ipload.c +++ b/example-clients/ipload.c @@ -17,9 +17,9 @@ #include #include #include -#include +#include #ifndef WIN32 -#include +#include #endif #include #include @@ -126,7 +126,7 @@ parse_args (int argc, char *argv[]) int main (int argc, char *argv[]) { - jack_status_t status; + jack_status_t status; char* name; /* parse and validate command arguments */ @@ -157,8 +157,8 @@ main (int argc, char *argv[]) (JackLoadName|JackLoadInit), &status, load_name, load_init); if (status & JackFailure) { - fprintf (stderr, "could not load %s, status = 0x%2.0x\n", - load_name, status); + fprintf (stderr, "could not load %s, intclient = %d status = 0x%2.0x\n", + load_name, (int)intclient, status); return 2; } if (status & JackNameNotUnique) { @@ -178,23 +178,23 @@ main (int argc, char *argv[]) if (wait_opt) { /* define a signal handler to unload the client, then - * wait for it to exit */ - #ifdef WIN32 - signal(SIGINT, signal_handler); - signal(SIGABRT, signal_handler); - signal(SIGTERM, signal_handler); - #else - signal(SIGQUIT, signal_handler); - signal(SIGTERM, signal_handler); - signal(SIGHUP, signal_handler); - signal(SIGINT, signal_handler); - #endif - - while (1) { - #ifdef WIN32 - Sleep(1000); + * wait for it to exit */ + #ifdef WIN32 + signal(SIGINT, signal_handler); + signal(SIGABRT, signal_handler); + signal(SIGTERM, signal_handler); + #else + signal(SIGQUIT, signal_handler); + signal(SIGTERM, signal_handler); + signal(SIGHUP, signal_handler); + signal(SIGINT, signal_handler); + #endif + + while (1) { + #ifdef WIN32 + Sleep(1000); #else - sleep (1); + sleep (1); #endif } } diff --git a/linux/JackPlatformPlug_os.h b/linux/JackPlatformPlug_os.h index 22750dcc..5cabe8b5 100644 --- a/linux/JackPlatformPlug_os.h +++ b/linux/JackPlatformPlug_os.h @@ -49,8 +49,13 @@ namespace Jack {typedef JackPosixMutex JackMutex; } namespace Jack { typedef JackPosixThread JackThread; } /* __JackPlatformSynchro__ client activation */ +/* #include "JackFifo.h" namespace Jack { typedef JackFifo JackSynchro; } +*/ + +#include "JackPosixSemaphore.h" +namespace Jack { typedef JackPosixSemaphore JackSynchro; } /* __JackPlatformChannelTransaction__ */ #include "JackSocket.h" diff --git a/linux/cycles.h b/linux/cycles.h index eff99e02..20477a2e 100644 --- a/linux/cycles.h +++ b/linux/cycles.h @@ -51,7 +51,17 @@ static inline unsigned long get_cycles(void) return (((unsigned long)hi)<<32) | ((unsigned long)lo); } -#endif +#endif /* __x86_64__ */ + +#ifdef __sparc_v9__ +/* rd is V9 only */ +static inline unsigned long long get_cycles(void) +{ + unsigned long long res; + __asm__ __volatile__("rd %%tick, %0" : "=r"(res)); + return res; +} +#endif /* __sparc_v9__ */ #ifdef __PPC__ @@ -82,7 +92,7 @@ static inline cycles_t get_cycles(void) return ret; } -#endif +#endif /* __PPC__ */ #ifdef __i386__ @@ -101,10 +111,26 @@ static inline cycles_t get_cycles (void) return ret; } -#endif +#endif /* __i386__ */ + +/* everything else but x86, amd64, sparcv9 or ppc */ +#if !defined (__PPC__) && !defined (__x86_64__) && !defined (__i386__) && !defined (__sparc_v9__) + +#warning No suitable get_cycles() implementation. Returning 0 instead + +typedef unsigned long long cycles_t; + +static inline cycles_t get_cycles(void) +{ + return 0; +} + +#endif /* everything else but x86, amd64, sparcv9 or ppc */ + +#endif /* __linux__ */ + -/* everything else but x86, amd64 or ppc */ -#if !defined (__PPC__) && !defined (__x86_64__) && !defined (__i386__) +#if defined(__FreeBSD_kernel__) #warning No suitable get_cycles() implementation. Returning 0 instead @@ -115,8 +141,7 @@ static inline cycles_t get_cycles(void) return 0; } -#endif +#endif /* __FreeBSD_kernel__ */ -#endif #endif /* __jack_cycles_h__ */ diff --git a/linux/firewire/JackFFADODriver.cpp b/linux/firewire/JackFFADODriver.cpp index 17df4663..9cb554e4 100644 --- a/linux/firewire/JackFFADODriver.cpp +++ b/linux/firewire/JackFFADODriver.cpp @@ -338,6 +338,7 @@ JackFFADODriver::ffado_driver_new (const char *name, driver->device_options.verbose = params->verbose_level; driver->capture_frame_latency = params->capture_frame_latency; driver->playback_frame_latency = params->playback_frame_latency; + driver->device_options.snoop_mode = params->snoop_mode; debugPrint(DEBUG_LEVEL_STARTUP, " Driver compiled on %s %s", __DATE__, __TIME__); debugPrint(DEBUG_LEVEL_STARTUP, " Created driver %s", name); @@ -753,7 +754,7 @@ extern "C" strcpy (desc->name, "firewire"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 strcpy(desc->desc, "Linux FFADO API based audio backend"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 - desc->nparams = 12; + desc->nparams = 13; params = (jack_driver_param_desc_t *)calloc (desc->nparams, sizeof (jack_driver_param_desc_t)); desc->params = params; @@ -854,6 +855,14 @@ extern "C" strcpy (params[i].short_desc, "libffado verbose level"); strcpy (params[i].long_desc, params[i].short_desc); + i++; + strcpy (params[i].name, "snoop"); + params[i].character = 'X'; + params[i].type = JackDriverParamBool; + params[i].value.i = 0; + strcpy (params[i].short_desc, "Snoop firewire traffic"); + strcpy (params[i].long_desc, params[i].short_desc); + return desc; } @@ -863,7 +872,7 @@ extern "C" ffado_jack_settings_t cmlparams; - char *device_name="hw:0"; + char *device_name=(char*)"hw:0"; cmlparams.period_size_set = 0; cmlparams.sample_rate_set = 0; @@ -919,7 +928,7 @@ extern "C" cmlparams.slave_mode = param->value.ui; break; case 'X': - cmlparams.snoop_mode = param->value.ui; + cmlparams.snoop_mode = param->value.i; break; case 'v': cmlparams.verbose_level = param->value.ui; diff --git a/macosx/coreaudio/JackCoreAudioDriver.cpp b/macosx/coreaudio/JackCoreAudioDriver.cpp index 406fddbe..a1403df3 100644 --- a/macosx/coreaudio/JackCoreAudioDriver.cpp +++ b/macosx/coreaudio/JackCoreAudioDriver.cpp @@ -194,6 +194,22 @@ OSStatus JackCoreAudioDriver::Render(void *inRefCon, driver->fActionFags = ioActionFlags; driver->fCurrentTime = (AudioTimeStamp *)inTimeStamp; driver->fDriverOutputData = ioData; + + // Setup threadded based log function once... + if (set_threaded_log_function()) { + + jack_log("set_threaded_log_function"); + JackMachThread::GetParams(pthread_self(), &driver->fEngineControl->fPeriod, &driver->fEngineControl->fComputation, &driver->fEngineControl->fConstraint); + + if (driver->fComputationGrain > 0) { + jack_log("JackCoreAudioDriver::Render : RT thread computation setup to %d percent of period", int(driver->fComputationGrain * 100)); + driver->fEngineControl->fComputation = driver->fEngineControl->fPeriod * driver->fComputationGrain; + } + + // Signal waiting start function... + driver->fState = true; + } + driver->CycleTakeBeginTime(); return driver->Process(); } @@ -221,33 +237,6 @@ int JackCoreAudioDriver::Write() return 0; } -// Will run only once -OSStatus JackCoreAudioDriver::MeasureCallback(AudioDeviceID inDevice, - const AudioTimeStamp* inNow, - const AudioBufferList* inInputData, - const AudioTimeStamp* inInputTime, - AudioBufferList* outOutputData, - const AudioTimeStamp* inOutputTime, - void* inClientData) -{ - JackCoreAudioDriver* driver = (JackCoreAudioDriver*)inClientData; - AudioDeviceStop(driver->fDeviceID, MeasureCallback); - - jack_log("JackCoreAudioDriver::MeasureCallback called"); - JackMachThread::GetParams(pthread_self(), &driver->fEngineControl->fPeriod, &driver->fEngineControl->fComputation, &driver->fEngineControl->fConstraint); - - if (driver->fComputationGrain > 0) { - jack_log("JackCoreAudioDriver::MeasureCallback : RT thread computation setup to %d percent of period", int(driver->fComputationGrain * 100)); - driver->fEngineControl->fComputation = driver->fEngineControl->fPeriod * driver->fComputationGrain; - } - - // Signal waiting start function... - driver->fState = true; - - // Setup threadded based log function - set_threaded_log_function(); - return noErr; -} OSStatus JackCoreAudioDriver::SRNotificationCallback(AudioDeviceID inDevice, UInt32 inChannel, @@ -1682,27 +1671,10 @@ int JackCoreAudioDriver::Start() { jack_log("JackCoreAudioDriver::Start"); JackAudioDriver::Start(); -/* -#ifdef MAC_OS_X_VERSION_10_5 - OSStatus err = AudioDeviceCreateIOProcID(fDeviceID, MeasureCallback, this, &fMesureCallbackID); -#else - OSStatus err = AudioDeviceAddIOProc(fDeviceID, MeasureCallback, this); -#endif -*/ - OSStatus err = AudioDeviceAddIOProc(fDeviceID, MeasureCallback, this); - - if (err != noErr) - return -1; - err = AudioOutputUnitStart(fAUHAL); + OSStatus err = AudioOutputUnitStart(fAUHAL); if (err != noErr) return -1; - - if ((err = AudioDeviceStart(fDeviceID, MeasureCallback)) != noErr) { - jack_error("Cannot start MeasureCallback"); - printError(err); - return -1; - } // Waiting for Measure callback to be called (= driver has started) fState = false; @@ -1724,15 +1696,6 @@ int JackCoreAudioDriver::Start() int JackCoreAudioDriver::Stop() { jack_log("JackCoreAudioDriver::Stop"); - AudioDeviceStop(fDeviceID, MeasureCallback); -/* -#ifdef MAC_OS_X_VERSION_10_5 - AudioDeviceDestroyIOProcID(fDeviceID, fMesureCallbackID); -#else - AudioDeviceRemoveIOProc(fDeviceID, MeasureCallback); -#endif -*/ - AudioDeviceRemoveIOProc(fDeviceID, MeasureCallback); return (AudioOutputUnitStop(fAUHAL) == noErr) ? 0 : -1; } diff --git a/macosx/coreaudio/JackCoreAudioDriver.h b/macosx/coreaudio/JackCoreAudioDriver.h index f17bbf19..9f827dfc 100644 --- a/macosx/coreaudio/JackCoreAudioDriver.h +++ b/macosx/coreaudio/JackCoreAudioDriver.h @@ -96,14 +96,6 @@ class JackCoreAudioDriver : public JackAudioDriver UInt32 inNumberFrames, AudioBufferList *ioData); - static OSStatus MeasureCallback(AudioDeviceID inDevice, - const AudioTimeStamp* inNow, - const AudioBufferList* inInputData, - const AudioTimeStamp* inInputTime, - AudioBufferList* outOutputData, - const AudioTimeStamp* inOutputTime, - void* inClientData); - static OSStatus DeviceNotificationCallback(AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, diff --git a/macosx/libcelt.a b/macosx/libcelt.a new file mode 100644 index 00000000..d64e6b88 Binary files /dev/null and b/macosx/libcelt.a differ diff --git a/man/alsa_in.0 b/man/alsa_in.0 new file mode 100644 index 00000000..91956a01 --- /dev/null +++ b/man/alsa_in.0 @@ -0,0 +1,97 @@ +.TH ALSA_IO "1" "!DATE!" "!VERSION!" +.SH NAME +\fBalsa_in\fR, \fBalsa_out\fR \- Jack clients that perform I/O with an alternate audio interface +.SH SYNOPSIS +\fBalsa_in\fR [\fIoptions\fR] +.br +\fBalsa_out\fR [\fIoptions\fR] + +.SH DESCRIPTION +A JACK client that opens a specified audio interface (different to the +one used by the JACK server, if any) and moves audio data between its +JACK ports and the interface. alsa_in will provide data from the +interface (potentially for capture); alsa_out will deliver data to it +(for playback). + +The audio interface used by alsa_in/alsa_out does not need to be +synchronized with JACK backend (or the hardware it might be using). +alsa_in/alsa_out tries to resample the output stream in an attempt to +compensate for drift between the two clocks. + +As of jack-0.116.3 this works almost perfectly. It takes some time, to reach +absolute resample-rate stability. So give it some minutes (its intended to be +running permanently anyways) + +.SH OPTIONS +.TP +\fB\-j \fI jack_client_name\fR +.br +Set Client Name. +.TP +\fB\-d \fI alsa_device\fR +.br +Use this Soundcard. +.TP +\fB\-v\fR +.br +Verbose, prints out resample coefficient and other parameters useful for debugging, every 500ms. +also reports soft xruns. +.TP +\fB\-i\fR +.br +Instrumentation. This logs the 4 important parameters of the samplerate control algorithm every 1ms. +You can pipe this into a file, and plot it. Should only be necessary, if it does not work as +expected, and we need to adjust some of the obscure parameters, to make it work. +Find me on irc.freenode.org #jack in order to set this up correctly. +.TP +\fB\-c \fI channels\fR +.br +Set Number of channels. +.TP +\fB\-r \fI sample_rate\fR +.br +Set sample_rate. The program resamples as necessary. +So you can connect a 44k1 jackd to a soundcard only supporting +48k. (default is jack sample_rate) +.TP +\fB\-p \fI period_size\fR +.br +Set the period size. It is not related to the jackd period_size. +Sometimes it affects the quality of the delay measurements. +Setting this lower than the jackd period_size will only work, if you +use a higher number of periods. +.TP +\fB\-n \fI num_period\fR +.br +Set number of periods. See note for period_size. +.TP +\fB\-q \fI quality\fR +.br +Set the quality of the resampler from 0 to 4. can significanly reduce cpu usage. +.TP +\fB\-m \fI max_diff\fR +.br +The value when a soft xrun occurs. Basically the window, in which +the dma pointer may jitter. I don't think its necessary to play with this anymore. +.TP +\fB\-t \fI target_delay\fR +.br +The delay alsa_io should try to approach. Same as for max_diff. It will be setup based on \-p and \-n +which is generally sufficient. +.TP +\fB\-s \fI smooth_array_size\fR +.br +This parameter controls the size of the array used for smoothing the delay measurement. Its default is 256. +If you use a pretty low period size, you can lower the CPU usage a bit by decreasing this parameter. +However most CPU time is spent in the resampling so this will not be much. +.TP +\fB\-C \fI P Control Clamp\fR +.br +If you have a PCI card, then the default value (15) of this parameter is too high for \-p64 \-n2... Setting it to 5 should fix that. +Be aware that setting this parameter too low, lets the hf noise on the delay measurement come through onto the resamplerate, so this +might degrade the quality of the output. (but its a threshold value, and it has been chosen, to mask the noise of a USB card, +which has an amplitude which is 50 times higher than that of a PCI card, so 5 wont loose you any quality on a PCI card) + +.SH AUTHOR +Torben Hohn + diff --git a/man/alsa_out.0 b/man/alsa_out.0 new file mode 100644 index 00000000..7b63b855 --- /dev/null +++ b/man/alsa_out.0 @@ -0,0 +1 @@ +.so man1/alsa_in.1 diff --git a/man/fill_template b/man/fill_template new file mode 100644 index 00000000..3ebf9ab4 --- /dev/null +++ b/man/fill_template @@ -0,0 +1,5 @@ +#!/bin/sh + +for i in *.0 ; do + sed -e "s/!VERSION!/${1}/g" -e "s/!DATE!/`date '+%B %Y'`/g" < ${i} > ${i%%0}1 +done diff --git a/man/jack_bufsize.0 b/man/jack_bufsize.0 new file mode 100644 index 00000000..f9d0dd61 --- /dev/null +++ b/man/jack_bufsize.0 @@ -0,0 +1,14 @@ +.TH JACK_BUFSIZE "1" "!DATE!" "!VERSION!" +.SH NAME +jack_bufsize \- JACK toolkit client to change the JACK buffer size +.SH SYNOPSIS +.B jack_bufsize bufsize +.SH DESCRIPTION +.B jack_bufsize +jack_bufsize sets the size of the buffer (frames per period) used in JACK. +This change happens on-line (the JACK server and its clients do not need to be +restarted). +.br +When invoked without arguments, it prints the current bufsize, and exits. + + diff --git a/man/jack_connect.0 b/man/jack_connect.0 new file mode 100644 index 00000000..602ac39b --- /dev/null +++ b/man/jack_connect.0 @@ -0,0 +1,11 @@ +.TH JACK_CONNECT "1" "!DATE!" "!VERSION!" +.SH NAME +\fBjack_connect\fR, \fBjack_disconnect\fR \- JACK toolkit clients for connecting & disconnecting ports +.SH SYNOPSIS +\fB jack_connect\fR [ \fI-s\fR | \fI--server servername\fR ] [\fI-h\fR | \fI--help\fR ] port1 port2 +\fB jack_disconnect\fR [ \fI-s\fR | \fI--server servername\fR ] [\fI-h\fR | \fI--help\fR ] port1 port2 +.SH DESCRIPTION +\fBjack_connect\fR connects the two named ports. \fBjack_connect\fR disconnects the two named ports. +.SH RETURNS +The exit status is zero if successful, 1 otherwise + diff --git a/man/jack_disconnect.0 b/man/jack_disconnect.0 new file mode 100644 index 00000000..90300cc1 --- /dev/null +++ b/man/jack_disconnect.0 @@ -0,0 +1 @@ +.so man1/jack_connect.1 diff --git a/man/jack_freewheel.0 b/man/jack_freewheel.0 new file mode 100644 index 00000000..0941ffd7 --- /dev/null +++ b/man/jack_freewheel.0 @@ -0,0 +1,16 @@ +.TH JACK_FREEWHEEL "1" "!DATE!" "!VERSION!" +.SH NAME +jack_freewheel \- JACK toolkit client to control freewheeling mode +.SH SYNOPSIS +.B jack_freewheel [y|n] +.SH DESCRIPTION +.B jack_freewheel +Turns freewheeling mode on (y) or off (n). While in freewheeling mode, +the JACK server does not wait in between process() calls, and does not +read or write data from/to any audio interface. That results in the JACK graph +processing data as fast as possible. Freewheeling makes fast exports to +files possible. +.PP +There is no useful reason to use this tool other than testing. JACK +clients that use freewheeling will turn it on and off themselves. + diff --git a/man/jack_impulse_grabber.0 b/man/jack_impulse_grabber.0 new file mode 100644 index 00000000..544716b4 --- /dev/null +++ b/man/jack_impulse_grabber.0 @@ -0,0 +1,11 @@ +.TH JACK_IMPULSE_GRABBER "1" "!DATE!" "!VERSION!" +.SH NAME +jack_impulse_grabber \- JACK toolkit client to grab an impulse (response) +.SH SYNOPSIS +\fBjack_impulse_grabber\fR \fB-d\fR \fIduration\fR [\fI-f\fR (C|gnuplot)] +.SH DESCRIPTION +\fBjack_impulse_grabber\fR is a JACK example client for collecting +impulses recordings from JACK ports. + + + diff --git a/man/jack_load.0 b/man/jack_load.0 new file mode 100644 index 00000000..599116e0 --- /dev/null +++ b/man/jack_load.0 @@ -0,0 +1,28 @@ +.TH JACK_LOAD "1" "!DATE!" "!VERSION!" +.SH NAME +jack_load \- JACK toolkit client for loading in-process clients +.SH SYNOPSIS +\fBjack_load\fR [ \fI-i\fR initstring ] [ \fI-s\fR servername ] [\fI-w\fR ] client-name so-name [ initstring ] +.SH DESCRIPTION +\fBjack_load\fR is a JACK toolkit client. It loads the specified plugin and creates an in-process client. +.SH ARGUMENTS +.PP +The client-name must be a currently unused client name. +.PP +The so-name is the name of file that client code is stored in (typically, \fIclientname.so\fR) +.SH OPTIONS +.TP +\fB-i\fR, \fB--init\fR init-string +.br +initialization string passed to the in-process client. Note that this can also be specified as the last argument on the command line. +.TP +\fB-s\fR, \fB--server\fR servername +.br +Name of JACK server to connect to +.TP +\fB-w\fR, \fB--wait\fR +Wait for a signal (eg. from Ctrl-c) and then unload the client. +.SH AUTHOR +Jeremy Hall + + diff --git a/man/jack_lsp.0 b/man/jack_lsp.0 new file mode 100644 index 00000000..a54ba5eb --- /dev/null +++ b/man/jack_lsp.0 @@ -0,0 +1,47 @@ +.TH JACK_LSP "1" "!DATE!" "!VERSION!" +.SH NAME +jack_lsp \- JACK toolkit client to list informtion on ports +.SH SYNOPSIS +\fBjack_lsp\fR [ \fI-s\fR | \fI--server\fR servername ] [ \fI-AclLptvh\fR ] +.SH DESCRIPTION +\fBjack_lsp\fR lists all known ports associated with a JACK +server. It can also optionally list various kinds of information about each port. +.SH OPTIONS +.TP +\fB-s\fR, \fB--server\fR \fIservername\fR +.br +Connect to the jack server named \fIservername\fR +.TP +\fB-A\fR, \fB--aliases\fR +.br +List aliases for each port +.TP +\fB-c\fR, \fB--connections\fR +.br +List connections to/from each port +.TP +\fB-l\fR, \fB--latency\fR +.br +Display per-port latency in frames at each port +.TP +\fB-L\fR, \fI--latency\fR +.br +Display total latency in frames at each port +.TP +\fB-p\fR, \fB--properties\fR +.br +Display port properties. Output may include input|output, can-monitor, physical, terminal +.TP +\fB-t\fR, \fB--type\fR +.br +Display port type +.TP +\fB-h\fR, \fB--help\fR +.br +Display help/usage message +.TP +\fB-v\fR, \fB--version\fR +.br +Output version information and exit + + diff --git a/man/jack_metro.0 b/man/jack_metro.0 new file mode 100644 index 00000000..e38a9542 --- /dev/null +++ b/man/jack_metro.0 @@ -0,0 +1,40 @@ +.TH JACK_METRO "1" "!DATE!" "!VERSION!" +.SH NAME +jack_metro \- JACK toolkit metronome +.SH SYNOPSIS +\fBjack_metro\fR [ \fI-n\fR name ] [ \fI-f\fR hz ] [ \fI-D\fR msecs ] [\fI-a\fR % ] [ \fI-d\fR % ] \fI-b\fR bpm +.SH DESCRIPTION +\fBjack_metro\fR is a simple metronome for JACK. It generates a +synthetic "tick" sound for every beat. Note that is does \fBnot\fR +connect its output port by default - to hear the sound it makes you must +connect them using some other tool. +.SH OPTIONS +.TP +\fB-n\fR, \fB--name\fR +.br +Specify a name for this instance of the metronome. +.TP +\fB-f\fR, \fB--frequency\fR Hz +.br +Define the frequency of the "tick" in Hz. +.TP +\fB-D\fR, \fB--duration\fR msecs +.br +Define the duration of the "tick" in milliseconds. +.TP +\fB-a\fR, \fB--attack\fR %-age +.br +Define the duration of the attack phase of the "tick" as a percentage +of the duration. +.TP +\fB-d\fR, \fB--decay\fR %-age +.br +Define the duration of the decay phase of the "tick" as a percentage +of the duration. +.TP +\fB--b\fR, \fB--bpm\fR bpm +.br +Define the number of beats per minute. +.SH AUTHOR +Anthony Van Groningen + diff --git a/man/jack_monitor_client.0 b/man/jack_monitor_client.0 new file mode 100644 index 00000000..09911070 --- /dev/null +++ b/man/jack_monitor_client.0 @@ -0,0 +1,18 @@ +.TH JACK_CONNECT "1" "!DATE!" "!VERSION!" +.SH NAME +jack_monitor_client \- The JACK Audio Connection Kit example client +.SH SYNOPSIS +.B jack_monitor_client +client-name +.PP +The client-name must be the name of a existing client that monitoring is +to be enabled for. +.SH DESCRIPTION +.B jack_monitor_client +is an example client for the JACK Audio Connection Kit. It enables +monitoring for the specified client. +.SH AUTHOR +Jeremy Hall +.PP +This manpage was written by Robert Jordens for Debian. + diff --git a/man/jack_netsource.0 b/man/jack_netsource.0 new file mode 100644 index 00000000..5de4af7f --- /dev/null +++ b/man/jack_netsource.0 @@ -0,0 +1,109 @@ +.TH JACK_NETSOURCE "1" "!DATE!" "!VERSION!" +.SH NAME +jack_netsource \- Netjack Master client for one slave +.SH SYNOPSIS +\fBjack_netsource\fR [ \fI-H\fR hostname ] [ \fIoptions\fR ] + +.SH DESCRIPTION +\fBjack_netsource\fR The Master side of a netjack connection. Represents the slave jackd -dnet in the master jack graph. +Most connection parameters are configured via the netsource, and the slave will set itself up according to the commandline +option given to jack_netsource. +.br +Netjack allows low latency audio connections over general IP networks. When using celt for compression, it is even possible +to establish transatlantic links, with latencies not much over the actual ping time. +.br +But the main usecase is of course a LAN, where it can achieve one jack period of latency. + +.SH OPTIONS +.TP +\fB-h\fR this help text +.TP +\fB-H\fR \fIslave host\fR +.br +Host name of the slave JACK +.TP +\fB-o\fR \fInum channels\fR +.br +Number of audio playback channels +.TP +\fB-i\fR \fInum channels\fR +.br +Number of audio capture channels +.TP +\fB-O\fR \fInum channels\fR +.br +Number of midi playback channels +.TP +\fB-I\fR \fInum channels\fR +.br +Number of midi capture channels +.TP +\fB-n\fR \fIperiods\fR +.br +Network latency in JACK periods +.TP +\fB-p\fR \fIport\fR +.br +UDP port that the slave is listening on +.TP +\fB-r\fR \fIreply port\fR +.br +UDP port that we are listening on +.TP +\fB-B\fR \fIbind port\fR +.br +reply port, for use in NAT environments +.TP +\fB-b\fR \fIbitdepth\fR +.br +Set transport to use 16bit or 8bit +.TP +\fB-c\fR \fIbytes\fR +.br +Use CELT encoding with per period and channel +.TP +\fB-m\fR \fImtu\fR +.br +Assume this mtu for the link +.TP +\fB-R\fR \fIN\fR +.br +Redundancy: send out packets N times. +.TP +\fB-e\fR +.br +skip host-to-network endianness conversion +.TP +\fB-N\fR \fIjack name\fR +.br +Reports a different client name to jack +.TP +.TP +\fB-s\fR, \fB--server\fR \fIservername\fR +.br +Connect to the jack server named \fIservername\fR +.TP +\fB-h\fR, \fB--help\fR +.br +Display help/usage message +.TP +\fB-v\fR, \fB--version\fR +.br +Output version information and exit + + +.SH EXAMPLES + +.PP +run a 4 audio channel bidirectional link with one period of latency and no midi channels. Audio data is flowing uncompressed over the wire: +.br +On \fIhostA\fR: +.IP +\fBjackd \-d alsa \fR +.br +\fBjack_netsource \-H hostB -n1 -i4 -o4 -I0 -O0 \fR +.PP +On \fIhostB\fR: +.IP +\fBjackd \-d net \fR + diff --git a/man/jack_samplerate.0 b/man/jack_samplerate.0 new file mode 100644 index 00000000..ef11ed06 --- /dev/null +++ b/man/jack_samplerate.0 @@ -0,0 +1,9 @@ +.TH JACK_SAMPLERATE "1" "!DATE!" "!VERSION!" +.SH NAME +jack_samplerate \- JACK toolkit client to print current samplerate +.SH SYNOPSIS +.B jack_samplerate +.SH DESCRIPTION +.B jack_samplerate prints the current samplerate, and exits. + + diff --git a/man/jack_showtime.0 b/man/jack_showtime.0 new file mode 100644 index 00000000..210caa7d --- /dev/null +++ b/man/jack_showtime.0 @@ -0,0 +1,13 @@ +.TH JACK_SHOWTIME "1" "!DATE!" "!VERSION!" +.SH NAME +jack_showtime \- The JACK Audio Connection Kit example client +.SH SYNOPSIS +.B jack_showtime +.SH DESCRIPTION +.B jack_showtime +prints the current timebase information to stdout +.SH AUTHOR +Paul Davis +.PP +This manpage was written by Stefan Schwandter + diff --git a/man/jack_simple_client.0 b/man/jack_simple_client.0 new file mode 100644 index 00000000..a3cf16e0 --- /dev/null +++ b/man/jack_simple_client.0 @@ -0,0 +1,20 @@ +.TH JACK_CONNECT "1" "!DATE!" "!VERSION!" +.SH NAME +jack_simple_client \- The JACK Audio Connection Kit example client +.SH SYNOPSYS +.B jack_simple_client +client-name +.PP +The client-name must be a yet unused client name. +.SH DESCRIPTION +.B jack_simple_client +is an example client for the JACK Audio Connection Kit. It creates two +ports (client-name:input and client-name:output) that pass the data +unmodified. +.SH EXAMPLE +jack_simple_client in_process_test +.SH AUTHOR +Jeremy Hall +.PP +This manpage was written by Robert Jordens for Debian. + diff --git a/man/jack_transport.0 b/man/jack_transport.0 new file mode 100644 index 00000000..6aa8ddd7 --- /dev/null +++ b/man/jack_transport.0 @@ -0,0 +1,13 @@ +.TH JACK_TRANSPORT "1" "!DATE!" "!VERSION!" +.SH NAME +jack_transport \- JACK toolkit client for transport control +.SH SYNOPSIS +.B jack_transport +.SH DESCRIPTION +.B jack_transport +is a toolkit client for the JACK Audio Connection Kit. It provides command-line +control over the JACK transport system. Type help at jack_transport's +command prompt to see the available commands. +.SH AUTHOR +Jeremy Hall + diff --git a/man/jack_unload.0 b/man/jack_unload.0 new file mode 100644 index 00000000..79b1e33d --- /dev/null +++ b/man/jack_unload.0 @@ -0,0 +1,19 @@ +.TH JACK_UNLOAD "1" "!DATE!" "!VERSION!" +.SH NAME +jack_unload \- The JACK Audio Connection Kit example client +.SH SYNOPSIS +.B jack_unload +client-name +.PP +The client-name must be the name of a loaded client that can be unloaded. +.SH DESCRIPTION +.B jack_unload +is the counterpart to +.B jack_load +and unloads the specified client. +.SH EXAMPLE +.B jack_unload in_process_test +.SH AUTHOR +Jeremy Hall +.PP +This manpage was written by Robert Jordens for Debian. diff --git a/man/jack_wait.0 b/man/jack_wait.0 new file mode 100644 index 00000000..239e8c22 --- /dev/null +++ b/man/jack_wait.0 @@ -0,0 +1,41 @@ +.TH JACK_WAIT "1" "!DATE!" "!VERSION!" +.SH NAME +jack_wait \- JACK toolkit client to check and wait for existence/exit of jackd. +.SH SYNOPSIS +\fBjack_wait\fR [ \fI-s\fR | \fI--server\fR servername ] [ \fI-t\fR | \fI--timeout\fR timeout_seconds [ \fI-cqwhv\fR ] +.SH DESCRIPTION +\fBjack_wait\fR When invoked with \fI-c\fR it only checks for the existence of a jack server. When invoked with \fI-w\fR the +program will wait for a jackd to be available. +The \fI-q\fR makes it wait for the jackd to exit. + +.SH OPTIONS +.TP +\fB-w\fR, \fB--wait\fR +.br +Wait for jackd to be available. +.TP +\fB-q\fR, \fB--quit\fR +.br +Wait for jackd quit. +.TP +\fB-c\fR, \fB--check\fR +.br +Only check for existence of jackd, and exit. +.TP +\fB-s\fR, \fB--server\fR \fIservername\fR +.br +Connect to the jack server named \fIservername\fR +.TP +\fB-t\fR, \fB--timeout\fR \fItimeout_seconds\fR +.br +Only wait \fItimeout_seconds\fR. +.TP +\fB-h\fR, \fB--help\fR +.br +Display help/usage message +.TP +\fB-v\fR, \fB--version\fR +.br +Output version information and exit + + diff --git a/man/jackd.0 b/man/jackd.0 new file mode 100644 index 00000000..5700aabe --- /dev/null +++ b/man/jackd.0 @@ -0,0 +1,547 @@ +.TH "JACKD" "1" "!VERSION!" "!DATE!" "" +.SH "NAME" +jackd \- JACK Audio Connection Kit sound server +.SH "SYNOPSIS" +\fBjackd\fR [\fIoptions\fR] \fB\-d\fI backend \fR +[\fIbackend\-parameters\fR] +.br +\fBjackd \-\-help\fR +.SH "DESCRIPTION" +\fBjackd\fR is the JACK audio server daemon, a low\-latency audio +server. Originally written for the +GNU/Linux operating system, it also supports Mac OS X and various Unix +platforms. JACK can connect a number of different client applications +to an audio device and also to each other. Most clients are external, +running in their own processes as normal applications. JACK also +supports internal clients, which run within the \fBjackd\fR process +using a loadable "plugin" interface. + +JACK differs from other audio servers in being designed from the +ground up for professional audio work. It focuses on two key areas: +synchronous execution of all clients, and low latency operation. + +For the latest JACK information, please consult the web site, +<\fBhttp://www.jackaudio.org\fR>. +.SH "OPTIONS" +.TP +\fB\-d, \-\-driver \fIbackend\fR [\fIbackend\-parameters\fR ] +.br +Select the audio interface backend. The current list of supported +backends is: \fBalsa\fR, \fBcoreaudio\fR, \fBdummy\fR, \fBfreebob\fR, +\fBoss\fR \fBsun\fR and \fBportaudio\fR. They are not all available +on all platforms. All \fIbackend\-parameters\fR are optional. + +.TP +\fB\-h, \-\-help\fR +.br +Print a brief usage message describing the main \fBjackd\fR options. +These do not include \fIbackend\-parameters\fR, which are listed using +the \fB\-\-help\fR option for each specific backend. Examples below +show how to list them. +.TP +\fB\-m, \-\-no\-mlock\fR +Do not attempt to lock memory, even if \fB\-\-realtime\fR. +.TP +\fB\-n, \-\-name\fR \fIserver\-name\fR +Name this \fBjackd\fR instance \fIserver\-name\fR. If unspecified, +this name comes from the \fB$JACK_DEFAULT_SERVER\fR environment +variable. It will be "default" if that is not defined. +.TP +\fB\-p, \-\-port\-max \fI n\fR +Set the maximum number of ports the JACK server can manage. +The default value is 256. +.TP +\fB\-\-replace-registry\fR +.br +Remove the shared memory registry used by all JACK server instances +before startup. This should rarely be used, and is intended only +for occasions when the structure of this registry changes in ways +that are incompatible across JACK versions (which is rare). +.TP +\fB\-R, \-\-realtime\fR +.br +Use realtime scheduling (default = true). This is needed for reliable low\-latency +performance. On many systems, it requires \fBjackd\fR to run with +special scheduler and memory allocation privileges, which may be +obtained in several ways. +.TP +\fB\-r, \-\-no-realtime\fR +.br +Do not use realtime scheduling. +.TP +\fB\-P, \-\-realtime\-priority \fIint\fR +When running \fB\-\-realtime\fR, set the scheduler priority to +\fIint\fR. +.TP +\fB\-\-silent\fR +Silence any output during operation. +.TP +\fB\-T, \-\-temporary\fR +Exit once all clients have closed their connections. +.TP +\fB\-t, \-\-timeout \fIint\fR +.br +Set client timeout limit in milliseconds. The default is 500 msec. +In realtime mode the client timeout must be smaller than the watchdog timeout (5000 msec). +.TP +\fB\-Z, \-\-nozombies\fR +.br +Prevent JACK from ever kicking out clients because they were too slow. +This cancels the effect any specified timeout value, but JACK and its clients are +still subject to the supervision of the watchdog thread or its equivalent. +.TP +\fB\-u, \-\-unlock\fR +.br +Unlock libraries GTK+, QT, FLTK, Wine. +.TP +\fB\-v, \-\-verbose\fR +Give verbose output. +.TP +\fB\-c, \-\-clocksource\fR (\fI c(ycle)\fR | \fI h(pet) \fR | \fI s(ystem) \fR) +Select a specific wall clock (Cycle Counter, HPET timer, System timer). +.TP +\fB\-V, \-\-version\fR +Print the current JACK version number and exit. +.SS ALSA BACKEND OPTIONS +.TP +\fB\-C, \-\-capture\fR [ \fIname\fR ] +Provide only capture ports, unless combined with \-D or \-P. Parameterally set +capture device name. +.TP +\fB\-d, \-\-device \fIname\fR +.br +The ALSA pcm device \fIname\fR to use. If none is specified, JACK will +use "hw:0", the first hardware card defined in \fB/etc/modules.conf\fR. +.TP +\fB\-z, \-\-dither [rectangular,triangular,shaped,none] +Set dithering mode. If \fBnone\fR or unspecified, dithering is off. +Only the first letter of the mode name is required. +.TP +\fB\-D, \-\-duplex\fR +Provide both capture and playback ports. Defaults to on unless only one +of \-P or \-C is specified. +.TP +\fB\-h, \-\-help\fR Print a brief usage message describing only the +\fBalsa\fR backend parameters. +.TP +\fB\-M, \-\-hwmeter\fR +.br +Enable hardware metering for devices that support it. Otherwise, use +software metering. +.TP +\fB\-H, \-\-hwmon\fR +.br +Enable hardware monitoring of capture ports. This is a method for +obtaining "zero latency" monitoring of audio input. It requires +support in hardware and from the underlying ALSA device driver. + +When enabled, requests to monitor capture ports will be satisfied by +creating a direct signal path between audio interface input and output +connectors, with no processing by the host computer at all. This +offers the lowest possible latency for the monitored signal. + +Presently (March 2003), only the RME Hammerfall series and cards based +on the ICE1712 chipset (M\-Audio Delta series, Terratec, and others) +support \fB\-\-hwmon\fR. In the future, some consumer cards may also +be supported by modifying their mixer settings. + +Without \fB\-\-hwmon\fR, port monitoring requires JACK to read audio +into system memory, then copy it back out to the hardware again, +imposing the basic JACK system latency determined by the +\fB\-\-period\fR and \fB\-\-nperiods\fR parameters. +.TP +\fB\-i, \-\-inchannels \fIint\fR +.br +Number of capture channels. Default is maximum supported by hardware. +.TP +\fB\-n, \-\-nperiods \fIint\fR +.br +Specify the number of periods of playback latency. In seconds, this +corresponds to \fB\-\-nperiods\fR times \fB\-\-period\fR divided by +\fB\-\-rate\fR. The default is 2, the minimum allowable. For most +devices, there is no need for any other value with the +\fB\-\-realtime\fR option. Without realtime privileges or with boards +providing unreliable interrupts (like ymfpci), a larger value may +yield fewer xruns. This can also help if the system is not tuned for +reliable realtime scheduling. + +For most ALSA devices, the hardware buffer has exactly +\fB\-\-period\fR times \fB\-\-nperiods\fR frames. Some devices demand +a larger buffer. If so, JACK will use the smallest possible buffer +containing at least \fB\-\-nperiods\fR, but the playback latency does +not increase. + +For USB audio devices it is recommended to use \fB\-n 3\fR. Firewire +devices supported by FFADO (formerly Freebob) are configured with +\fB\-n 3\fR by default. +.TP +\fB\-o, \-\-outchannels \fIint\fR +.br +Number of playback channels. Default is maximum supported by hardware. +.TP +\fB\-P, \-\-playback\fR [ \fIname\fR ] +Provide only playback ports, unless combined with \-D or \-C. Optionally set +playback device name. +.TP +\fB\-p, \-\-period \fIint\fR +.br +Specify the number of frames between JACK \fBprocess()\fR calls. This +value must be a power of 2, and the default is 1024. If you need low +latency, set \fB\-p\fR as low as you can go without seeing xruns. A larger +period size yields higher latency, but makes xruns less likely. The JACK +capture latency in seconds is \fB\-\-period\fR divided by \fB\-\-rate\fR. +.TP +\fB\-r, \-\-rate \fIint\fR +Specify the sample rate. The default is 48000. +.TP +\fB\-S, \-\-shorts +.br +Try to configure card for 16\-bit samples first, only trying 32\-bits if +unsuccessful. Default is to prefer 32\-bit samples. +.TP +\fB\-s, \-\-softmode\fR +.br +Ignore xruns reported by the ALSA driver. This makes JACK less likely +to disconnect unresponsive ports when running without \fB\-\-realtime\fR. +.TP +\fB\-X, \-\-midi \fR[\fIseq\fR|\fIraw\fR] +.br +Specify which ALSA MIDI system to provide access to. Using \fBraw\fR +will provide a set of JACK MIDI ports that correspond to each raw ALSA +device on the machine. Using \fBseq\fR will provide a set of JACK MIDI +ports that correspond to each ALSA "sequencer" client (which includes +each hardware MIDI port on the machine). \fBraw\fR provides slightly +better performance but does not permit JACK MIDI communication with +software written to use the ALSA "sequencer" API. +.SS COREAUDIO BACKEND PARAMETERS +.TP +\fB\-c \-\-channel\fR +Maximum number of channels (default: 2) +.TP +\fB\-i \-\-channelin\fR +Maximum number of input channels (default: 2) +.TP +\fB\-o \-\-channelout\fR +Maximum number of output channels (default: 2) +.TP +\fB\-C \-\-capture\fR +Whether or not to capture (default: true) +.TP +\fB\-P \-\-playback\fR +Whether or not to playback (default: true) +.TP +\fB\-D \-\-duplex\fR +Capture and playback (default: true) +.TP +\fB\-r \-\-rate\fR +Sample rate (default: 44100) +.TP +\fB\-p \-\-period\fR +Frames per period (default: 128). Must be a power of 2. +.TP +\fB\-n \-\-name\fR +Driver name (default: none) +.TP +\fB\-I \-\-id\fR +Audio Device ID (default: 0) +.SS DUMMY BACKEND PARAMETERS +.TP +\fB\-C, \-\-capture \fIint\fR +Specify number of capture ports. The default value is 2. +.TP +\fB\-P, \-\-playback \fIint\fR +Specify number of playback ports. The default value is 2. +.TP +\fB\-r, \-\-rate \fIint\fR +Specify sample rate. The default value is 48000. +.TP +\fB\-p, \-\-period \fIint\fR +Specify the number of frames between JACK \fBprocess()\fR calls. This +value must be a power of 2, and the default is 1024. If you need low +latency, set \fB\-p\fR as low as you can go without seeing xruns. A larger +period size yields higher latency, but makes xruns less likely. The JACK +capture latency in seconds is \fB\-\-period\fR divided by \fB\-\-rate\fR. +.TP +\fB\-w, \-\-wait \fIint\fR +Specify number of usecs to wait between engine processes. +The default value is 21333. + + +.SS NET BACKEND PARAMETERS + +.TP + \fB\-i, \-\-audio\-ins \fIint\fR +Number of capture channels (default: 2) +.TP + \fB\-o, \-\-audio\-outs \fIint\fR +Number of playback channels (default: 2) +.TP + \fB\-I, \-\-midi\-ins \fIint\fR +Number of midi capture channels (default: 1) +.TP +\fB\-O, \-\-midi\-outs \fIint\fR +Number of midi playback channels (default: 1) +.TP + \fB\-r, \-\-rate \fIint\fR +Sample rate (default: 48000) +.TP +\fB\-p, \-\-period \fIint\fR +Frames per period (default: 1024) +.TP +\fB\-n, \-\-num\-periods \fIint\fR +Network latency setting in no. of periods (default: 5) +.TP +\fB\-l, \-\-listen\-port \fIint\fR +The socket port we are listening on for sync packets (default: 3000) +.TP +\fB\-f, \-\-factor \fIint\fR +Factor for sample rate reduction (default: 1) +.TP +\fB\-u, \-\-upstream\-factor \fIint\fR +Factor for sample rate reduction on the upstream (default: 0) +.TP +\fB\-c, \-\-celt \fIint\fR +sets celt encoding and number of kbits per channel (default: 0) +.TP +\fB\-b, \-\-bit\-depth \fIint\fR +Sample bit\-depth (0 for float, 8 for 8bit and 16 for 16bit) (default: 0) +.TP +\fB\-t, \-\-transport\-sync \fIint\fR +Whether to slave the transport to the master transport (default: true) +.TP +\fB\-a, \-\-autoconf \fIint\fR +Whether to use Autoconfig, or just start. (default: true) +.TP +\fB\-R, \-\-redundancy \fIint\fR +Send packets N times (default: 1) +.TP +\fB\-e, \-\-native\-endian \fIint\fR +Dont convert samples to network byte order. (default: false) +.TP +\fB\-J, \-\-jitterval \fIint\fR +attempted jitterbuffer microseconds on master (default: 0) +.TP +\fB\-D, \-\-always\-deadline \fIint\fR +always use deadline (default: false) + + +.SS OSS BACKEND PARAMETERS +.TP +\fB\-r, \-\-rate \fIint\fR +Specify the sample rate. The default is 48000. +.TP +\fB\-p, \-\-period \fIint\fR +Specify the number of frames between JACK \fBprocess()\fR calls. This +value must be a power of 2, and the default is 1024. If you need low +latency, set \fB\-p\fR as low as you can go without seeing xruns. A larger +period size yields higher latency, but makes xruns less likely. The JACK +capture latency in seconds is \fB\-\-period\fR divided by \fB\-\-rate\fR. +.TP +\fB\-n, \-\-nperiods \fIint\fR +Specify the number of periods in the hardware buffer. The default is +2. The period size (\fB\-p\fR) times \fB\-\-nperiods\fR times four is +the JACK buffer size in bytes. The JACK output latency in seconds is +\fB\-\-nperiods\fR times \fB\-\-period\fR divided by \fB\-\-rate\fR. +.TP +\fB\-w, \-\-wordlength \fIint\fR +Specify the sample size in bits. The default is 16. +.TP +\fB\-i, \-\-inchannels \fIint\fR +Specify how many channels to capture (default: 2) +.TP +\fB\-o, \-\-outchannels \fIint\fR +Specify number of playback channels (default: 2) +.TP +\fB\-C, \-\-capture \fIdevice_file\fR +Specify input device for capture (default: /dev/dsp) +.TP +\fB\-P, \-\-playback \fIdevice_file\fR +Specify output device for playback (default: /dev/dsp) +.TP +\fB\-b, \-\-ignorehwbuf \fIboolean\fR +Specify, whether to ignore hardware period size (default: false) +.SS SUN BACKEND PARAMETERS +.TP +\fB\-r, \-\-rate \fIint\fR +Specify the sample rate. The default is 48000. +.TP +\fB\-p, \-\-period \fIint\fR +Specify the number of frames between JACK \fBprocess()\fR calls. This +value must be a power of 2, and the default is 1024. If you need low +latency, set \fB\-p\fR as low as you can go without seeing xruns. A larger +period size yields higher latency, but makes xruns less likely. The JACK +capture latency in seconds is \fB\-\-period\fR divided by \fB\-\-rate\fR. +.TP +\fB\-n, \-\-nperiods \fIint\fR +Specify the number of periods in the hardware buffer. The default is +2. The period size (\fB\-p\fR) times \fB\-\-nperiods\fR times four +(assuming 2 channels 16-bit samples) is the JACK buffer size in bytes. +The JACK output latency in seconds is \fB\-\-nperiods\fR times +\fB\-\-period\fR divided by \fB\-\-rate\fR. +.TP +\fB\-w, \-\-wordlength \fIint\fR +Specify the sample size in bits. The default is 16. +.TP +\fB\-i, \-\-inchannels \fIint\fR +Specify how many channels to capture (default: 2) +.TP +\fB\-o, \-\-outchannels \fIint\fR +Specify number of playback channels (default: 2) +.TP +\fB\-C, \-\-capture \fIdevice_file\fR +Specify input device for capture (default: /dev/audio) +.TP +\fB\-P, \-\-playback \fIdevice_file\fR +Specify output device for playback (default: /dev/audio) +.TP +\fB\-b, \-\-ignorehwbuf \fIboolean\fR +Specify, whether to ignore hardware period size (default: false) +.SS PORTAUDIO BACKEND PARAMETERS +.TP +\fB\-c \-\-channel\fR +Maximum number of channels (default: all available hardware channels) +.TP +\fB\-i \-\-channelin\fR +Maximum number of input channels (default: all available hardware channels) +.TP +\fB\-o \-\-channelout\fR +Maximum number of output channels (default: all available hardware channels) +.TP +\fB\-C \-\-capture\fR +Whether or not to capture (default: true) +.TP +\fB\-P \-\-playback\fR +Whether or not to playback (default: true) +.TP +\fB\-D \-\-duplex\fR +Capture and playback (default: true) +.TP +\fB\-r \-\-rate\fR +Sample rate (default: 48000) +.TP +\fB\-p \-\-period\fR +Frames per period (default: 1024). Must be a power of 2. +.TP +\fB\-n \-\-name\fR +Driver name (default: none) +.TP +\fB\-z \-\-dither\fR +Dithering mode (default: none) +.SH "EXAMPLES" +.PP +Print usage message for the parameters specific to each backend. +.IP +\fBjackd \-d alsa \-\-help\fR +.br +\fBjackd \-d coreaudio \-\-help\fR +.br +\fBjackd \-d net \-\-help\fR +.br +\fBjackd \-d dummy \-\-help\fR +.br +\fBjackd \-d firewire \-\-help\fR +.br +\fBjackd \-d freebob \-\-help\fR +.br +\fBjackd \-d oss \-\-help\fR +.br +\fBjackd \-d sun \-\-help\fR +.br +\fBjackd \-d portaudio \-\-help\fR +.PP +Run the JACK daemon with realtime priority using the first ALSA +hardware card defined in \fB/etc/modules.conf\fR. +.IP +\fBjackstart \-\-realtime \-\-driver=alsa\fR +.PP +Run the JACK daemon with low latency giving verbose output, which can +be helpful for trouble\-shooting system latency problems. A +reasonably well\-tuned system with a good sound card and a +low\-latency kernel can handle these values reliably. Some can do +better. If you get xrun messages, try a larger buffer. Tuning a +system for low latency can be challenging. The JACK FAQ, +.I http://jackit.sourceforge.net/docs/faq.php\fR +has some useful suggestions. +.IP +\fBjackstart \-Rv \-d alsa \-p 128 \-n 2 \-r 44100\fR +.PP +Run \fBjackd\fR with realtime priority using the "sblive" ALSA device +defined in ~/.asoundrc. Apply shaped dithering to playback audio. +.IP +\fBjackd \-R \-d alsa \-d sblive \-\-dither=shaped\fR +.PP +Run \fBjackd\fR with no special privileges using the second ALSA +hardware card defined in \fB/etc/modules.conf\fR. Any xruns reported +by the ALSA backend will be ignored. The larger buffer helps reduce +data loss. Rectangular dithering will be used for playback. +.IP +\fBjackd \-d alsa \-d hw:1 \-p2048 \-n3 \-\-softmode \-zr\fR +.PP +Run \fBjackd\fR in full\-duplex mode using the ALSA hw:0,0 device for +playback and the hw:0,2 device for capture. +.IP +\fBjackd \-d alsa \-P hw:0,0 \-C hw:0,2\fR +.PP +Run \fBjackd\fR in playback\-only mode using the ALSA hw:0,0 device. +.IP +\fBjackd \-d alsa \-P hw:0,0\fR +.SH "ENVIRONMENT" +.br +JACK is evolving a mechanism for automatically starting the server +when needed. Any client started without a running JACK server will +attempt to start one itself using the command line found in the first +line of \fB$HOME/.jackdrc\fR if it exists, or \fB/etc/jackdrc\fR if it +does not. If neither file exists, a built\-in default command will be +used, including the \fB\-T\fR flag, which causes the server to shut +down when all clients have exited. + +As a transition, this only happens when \fB$JACK_START_SERVER\fR is +defined in the environment of the calling process. In the future this +will become normal behavior. In either case, defining +\fB$JACK_NO_START_SERVER\fR disables this feature. + +To change where JACK looks for the backend drivers, set +\fB$JACK_DRIVER_DIR\fR. + +\fB$JACK_DEFAULT_SERVER\fR specifies the default server name. If not +defined, the string "default" is used. If set in their respective +environments, this affects \fBjackd\fR unless its \fB\-\-name\fR +parameter is set, and all JACK clients unless they pass an explicit +name to \fBjack_client_open()\fR. + +.SH "SEE ALSO:" +.PP +.I http://www.jackaudio.org +.br +The official JACK website with news, docs and a list of JACK clients. +.PP +.I http://jackaudio.org/email +.br +The JACK developers' mailing list. Subscribe, to take part in +development of JACK or JACK clients. User questions are also welcome, +there is no user-specific mailing list. +.PP +.I http://www.jackosx.com/ +.br +Tools specific to the Mac OS X version of JACK. +.PP +.I http://www.alsa\-project.org +.br +The Advanced Linux Sound Architecture. +.SH "BUGS" +Please report bugs to +.br +.I http://trac.jackaudio.org/ +.SH "AUTHORS" +Architect and original implementor: Paul Davis +.PP +Original design Group: Paul Davis, David Olofson, Kai Vehmanen, Benno Sennoner, +Richard Guenther, and other members of the Linux Audio Developers group. +.PP +Programming: Paul Davis, Jack O'Quin, Taybin Rutkin, Stephane Letz, Fernando +Pablo Lopez-Lezcano, Steve Harris, Jeremy Hall, Andy Wingo, Kai +Vehmanen, Melanie Thielker, Jussi Laako, Tilman Linneweh, Johnny +Petrantoni, Torben Hohn. +.PP +Manpage written by Stefan Schwandter, Jack O'Quin and Alexandre +Prokoudine. diff --git a/man/jackrec.0 b/man/jackrec.0 new file mode 100644 index 00000000..1ea2a6fb --- /dev/null +++ b/man/jackrec.0 @@ -0,0 +1,23 @@ +.TH JACKREC "1" "!DATE!" "!VERSION!" +.SH NAME +jackrec \- JACK toolkit client for recording audio +.SH SYNOPSIS +.B jackrec +\-f filename \-d seconds [ \-b bitdepth ] port1 [ port2 ... ] +.SH DESCRIPTION +.B jackrec is a basic, but useful, audio recorder that will record +audio from 1 or more JACK ports to a file on disk. The file format is +always RIFF/WAV, with samples stored as signed integers. The sample +bit depth can be selected using the \fI-b\fR option. The file will +have as many channels as there are ports specified on the command line +- each channel will contain the data recorded from one port. The user +should generally specify the duration (in seconds) using the \fI-d\fR +option. If not specified, jackrec will record until terminated by a +signal (eg. from Ctrl-c). +.PP +This application is not intended to be a heavy duty audio recorder, +and originated as an example client to show how to handle threading +and disk I/O in a JACK client. However, it is a useful, simple +recorder and is included in the JACK toolkit as a result. + + diff --git a/man/wscript b/man/wscript new file mode 100644 index 00000000..31bd60f3 --- /dev/null +++ b/man/wscript @@ -0,0 +1,13 @@ +#! /usr/bin/env python +# encoding: utf-8 + +import Build +import re +import os +import misc + + +def build(bld): + bld.exec_command("cd man ; sh fill_template %s" % bld.env['JACK_VERSION']) + bld.install_files(bld.env['MANDIR'], '*.1') + diff --git a/posix/JackPosixSemaphore.cpp b/posix/JackPosixSemaphore.cpp index 30530e1c..d151c5a4 100644 --- a/posix/JackPosixSemaphore.cpp +++ b/posix/JackPosixSemaphore.cpp @@ -118,10 +118,12 @@ bool JackPosixSemaphore::TimedWait(long usec) time.tv_sec += tv_usec / 1000000; time.tv_nsec = (tv_usec % 1000000) * 1000; - if ((res = sem_timedwait(fSemaphore, &time)) != 0) { + while ((res = sem_timedwait(fSemaphore, &time)) < 0) { jack_error("JackPosixSemaphore::TimedWait err = %s", strerror(errno)); jack_log("now %ld %ld ", now.tv_sec, now.tv_usec); jack_log("next %ld %ld ", time.tv_sec, time.tv_nsec/1000); + if (errno != EINTR) + break; } return (res == 0); } @@ -184,9 +186,8 @@ bool JackPosixSemaphore::ConnectOutput(const char* name, const char* server_name bool JackPosixSemaphore::Disconnect() { - jack_log("JackPosixSemaphore::Disconnect %s", fName); - if (fSemaphore) { + jack_log("JackPosixSemaphore::Disconnect %s", fName); if (sem_close(fSemaphore) != 0) { jack_error("Disconnect: can't disconnect named semaphore name = %s err = %s", fName, strerror(errno)); return false; diff --git a/tests/test.cpp b/tests/test.cpp index 4e025c01..4e181f65 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include @@ -632,7 +633,57 @@ int main (int argc, char *argv[]) if (status & JackServerStarted) { fprintf(stderr, "JACK server started\n"); } - + + /** + * Internal client tests... + * + */ + jack_intclient_t intclient; + + Log("trying to load the \"inprocess\" server internal client \n"); + + intclient = jack_internal_client_load (client1, "inprocess", + (jack_options_t)(JackLoadName|JackLoadInit), + &status, "inprocess", ""); + + if (intclient == 0 || status & JackFailure) { + printf("!!! ERROR !!! cannot load internal client \"inprocess\" intclient %d status 0x%2.0x !\n", intclient, status); + } else { + + Log("\"inprocess\" server internal client loaded\n"); + + char* internal_name = jack_get_internal_client_name(client1, intclient); + if (strcmp(internal_name, "inprocess") == 0) { + Log("jack_get_internal_client_name returns %s\n", internal_name); + } else { + printf("!!! ERROR !!! jack_get_internal_client_name returns incorrect name %s\n", internal_name); + } + + jack_intclient_t intclient1 = jack_internal_client_handle(client1, "inprocess", &status); + if (intclient1 == intclient) { + Log("jack_internal_client_handle returns correct handle\n"); + } else { + printf("!!! ERROR !!! jack_internal_client_handle returns incorrect handle %d\n", intclient1); + } + + // Unload internal client + status = jack_internal_client_unload (client1, intclient); + if (status == 0) { + Log("jack_internal_client_unload done first time returns correct value\n"); + } else { + printf("!!! ERROR !!! jack_internal_client_unload returns incorrect value 0x%2.0x\n", status); + } + + // Unload internal client second time + status = jack_internal_client_unload (client1, intclient); + if (status & JackFailure && status & JackNoSuchClient) { + Log("jack_internal_client_unload done second time returns correct value\n"); + } else { + printf("!!! ERROR !!! jack_internal_client_unload returns incorrect value 0x%2.0x\n", status); + } + } + + /** * try to register another one with the same name... * diff --git a/wscript b/wscript index bc88c490..52f01f63 100644 --- a/wscript +++ b/wscript @@ -62,6 +62,7 @@ def set_options(opt): opt.add_option('--libdir', type='string', help="Library directory [Default: /lib]") opt.add_option('--libdir32', type='string', help="32bit Library directory [Default: /lib32]") + opt.add_option('--mandir', type='string', help="Manpage directory [Default: /share/man/man1]") opt.add_option('--dbus', action='store_true', default=False, help='Enable D-Bus JACK (jackdbus)') opt.add_option('--classic', action='store_true', default=False, help='Force enable standard JACK (jackd) even if D-Bus JACK (jackdbus) is enabled too') opt.add_option('--doxygen', action='store_true', default=False, help='Enable build of doxygen documentation') @@ -78,7 +79,7 @@ def set_options(opt): def configure(conf): platform = Utils.detect_platform() conf.env['IS_MACOSX'] = platform == 'darwin' - conf.env['IS_LINUX'] = platform == 'linux' + conf.env['IS_LINUX'] = platform == 'linux' or platform == 'posix' conf.env['IS_SUN'] = platform == 'sunos' if conf.env['IS_LINUX']: @@ -163,6 +164,11 @@ def configure(conf): else: conf.env['LIBDIR'] = conf.env['PREFIX'] + '/lib' + if Options.options.libdir: + conf.env['MANDIR'] = conf.env['PREFIX'] + Options.options.mandir + else: + conf.env['MANDIR'] = conf.env['PREFIX'] + '/share/man/man1' + if conf.env['BUILD_DEBUG']: conf.env.append_unique('CXXFLAGS', '-g') conf.env.append_unique('CCFLAGS', '-g') @@ -242,6 +248,8 @@ def configure(conf): print Logs.colors.NORMAL, print + conf.env.append_unique('LINKFLAGS', '-lm -lstdc++') + if Options.options.mixed == True: env_variant2 = conf.env.copy() conf.set_env_name('lib32', env_variant2) @@ -267,6 +275,7 @@ def build(bld): bld.add_subdirs('linux') bld.add_subdirs('example-clients') bld.add_subdirs('tests') + bld.add_subdirs('man') if bld.env['BUILD_JACKDBUS'] == True: bld.add_subdirs('dbus')