git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@3306 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.9.2
@@ -25,6 +25,10 @@ Michael Voigt | |||||
2009-02-11 Stephane Letz <letz@grame.fr> | 2009-02-11 Stephane Letz <letz@grame.fr> | ||||
* Merge Solaris branch back on trunk. | |||||
2009-02-10 Stephane Letz <letz@grame.fr> | |||||
* Add a resample quality parameter in netadapter. | * Add a resample quality parameter in netadapter. | ||||
2009-02-09 Stephane Letz <letz@grame.fr> | 2009-02-09 Stephane Letz <letz@grame.fr> | ||||
@@ -76,6 +80,14 @@ Michael Voigt | |||||
* Cleanup server starting code for clients directly linked with libjackserver.so. | * Cleanup server starting code for clients directly linked with libjackserver.so. | ||||
2009-01-09 Stephane Letz <letz@grame.fr> | |||||
* JackProfiler scan already running clients (so can now be added anytime in the graph). | |||||
2009-01-09 Stephane Letz <letz@grame.fr> | |||||
* New JackProfiler class for real-time server monitoring. | |||||
2009-01-07 Stephane Letz <letz@grame.fr> | 2009-01-07 Stephane Letz <letz@grame.fr> | ||||
* Use up to BUFFER_SIZE_MAX frames in midi ports, fix for ticket #117. | * Use up to BUFFER_SIZE_MAX frames in midi ports, fix for ticket #117. | ||||
@@ -88,6 +100,8 @@ Michael Voigt | |||||
2008-12-18 Stephane Letz <letz@grame.fr> | 2008-12-18 Stephane Letz <letz@grame.fr> | ||||
* For ALSA driver, synchronize with latest jack1 memops functions. | * For ALSA driver, synchronize with latest jack1 memops functions. | ||||
* Use memops functions in JackOSSDriver. | |||||
* Use memops functions in JackOSSAdapter. | |||||
2008-12-17 Stephane Letz <letz@grame.fr> | 2008-12-17 Stephane Letz <letz@grame.fr> | ||||
@@ -95,15 +109,37 @@ Michael Voigt | |||||
2008-12-16 Stephane Letz <letz@grame.fr> | 2008-12-16 Stephane Letz <letz@grame.fr> | ||||
* Fix JackOSSDriver::SetBufferSize (was crashing when restoring old size), fix ticket #111. | |||||
* Force memory page in of profiling array in JackOSSDriver::Open. | |||||
* Cleanup profiling code. | |||||
* Client and library global context cleanup in case of incorrect shutdown handling (that is applications not correctly closing client after server has shutdown). | * Client and library global context cleanup in case of incorrect shutdown handling (that is applications not correctly closing client after server has shutdown). | ||||
2008-12-08 Stephane Letz <letz@grame.fr> | |||||
* Forbid JackOSSDriver to run in "aynchronous" mode, correct DSP CPU computation. | |||||
2008-12-04 Stephane Letz <letz@grame.fr> | |||||
* More profiling in JackOSSDriver: sample conversion duration is measured. | |||||
2008-12-02 Stephane Letz <letz@grame.fr> | |||||
* Optimize JackOSSDriver: no samples conversion if ports are not connected. | |||||
2008-12-01 Stephane Letz <letz@grame.fr> | |||||
* Force preload of memory table in JackEngineProfiling. | |||||
2008-11-27 Stephane Letz <letz@grame.fr> | 2008-11-27 Stephane Letz <letz@grame.fr> | ||||
* Add timing profiling code in JackOSSDriver. | |||||
* Report ringbuffer.c fixes from jack1. | * Report ringbuffer.c fixes from jack1. | ||||
2008-11-21 Stephane Letz <letz@grame.fr> | 2008-11-21 Stephane Letz <letz@grame.fr> | ||||
* Report ringbuffer.c fixes from jack1. | |||||
* Better isolation of server and clients system resources to allow starting the server in several user account at the same time. | * Better isolation of server and clients system resources to allow starting the server in several user account at the same time. | ||||
* Correct ressource cleanup in case of driver open failure. | |||||
2008-11-19 Stephane Letz <letz@grame.fr> | 2008-11-19 Stephane Letz <letz@grame.fr> | ||||
@@ -119,12 +155,13 @@ Michael Voigt | |||||
* Fix jackctl_server_unload_internal. | * Fix jackctl_server_unload_internal. | ||||
2008-10-30 Stephane Letz <letz@grame.fr> | 2008-10-30 Stephane Letz <letz@grame.fr> | ||||
* Fix Midi port initialization in JackNetDriver. | |||||
* Correct JackClient::ShutDown. | |||||
* Correct JackClient::ShutDown. | |||||
* TimeOut management in JackNetUnixSocket on Solaris. | |||||
2008-10-23 Stephane Letz <letz@grame.fr> | 2008-10-23 Stephane Letz <letz@grame.fr> | ||||
* In JackOSSDriver, vmix mode is used by default, exclusif (O_EXCL) mode can be selected with -e option. | |||||
* Fix a crash in JackEngine::Close when backend cannot be loaded. | * Fix a crash in JackEngine::Close when backend cannot be loaded. | ||||
* Tim Blechmann optimization patch. | * Tim Blechmann optimization patch. | ||||
* Backport of latest Paul alsa_seqmidi changes. | * Backport of latest Paul alsa_seqmidi changes. | ||||
@@ -147,6 +184,38 @@ Michael Voigt | |||||
* Checking for libsamplerate in waf, fix ticket #89." | * Checking for libsamplerate in waf, fix ticket #89." | ||||
* Header cleanup, add --clients and --ports options in configure. | * Header cleanup, add --clients and --ports options in configure. | ||||
2008-09-22 Stephane Letz <letz@grame.fr> | |||||
* Socket time out implementation on Solaris. | |||||
* Fix a conflict with Audio Hijack in JackCoreAudioDriver. | |||||
2008-10-10 Stephane Letz <letz@grame.fr> | |||||
* Improve OSS backend : SNDCTL_DSP_SETFRAGMENT must be done before, use of AFMT_S16_LE kind of values. | |||||
2008-10-09 Stephane Letz <letz@grame.fr> | |||||
* First version of OSS backend. | |||||
* Use a mutex to make jack_client_open/jack_client_close thread safe, remove use of jack_init/jack_uninit. | |||||
2008-10-08 Stephane Letz <letz@grame.fr> | |||||
* Fix a SMP related bug introduced in rev 2957 : remove the __SMP__ flag and define LOCK for SMP in all cases. | |||||
2008-10-03 Stephane Letz <letz@grame.fr> | |||||
* Add engine profiling tools. | |||||
2008-10-02 Stephane Letz <letz@grame.fr> | |||||
* Correct file permission for jack-shm-registry POSIX shared memory segment. | |||||
* Checking for libsamplerate in waf, fix ticket #89." | |||||
* Header cleanup, add --clients and --ports options in configure. | |||||
2008-10-01 Stephane Letz <letz@grame.fr> | |||||
* First Solaris version. | |||||
2008-09-22 Stephane Letz <letz@grame.fr> | 2008-09-22 Stephane Letz <letz@grame.fr> | ||||
* Cleanup jack_port_id_t/jack_port_t mess, should work again on 64 bits machines." | * Cleanup jack_port_id_t/jack_port_t mess, should work again on 64 bits machines." | ||||
@@ -1098,7 +1098,11 @@ EXPORT jack_port_t* jack_port_register(jack_client_t* ext_client, const char* po | |||||
jack_error("jack_port_register called with a NULL port name or a NULL port_type"); | jack_error("jack_port_register called with a NULL port name or a NULL port_type"); | ||||
return NULL; | return NULL; | ||||
} else { | } else { | ||||
#if defined(__x86_64__) || defined(__ppc64__) | |||||
return (jack_port_t *)((uint64_t)client->PortRegister(port_name, port_type, flags, buffer_size)); | |||||
#else | |||||
return (jack_port_t *)client->PortRegister(port_name, port_type, flags, buffer_size); | return (jack_port_t *)client->PortRegister(port_name, port_type, flags, buffer_size); | ||||
#endif | |||||
} | } | ||||
} | } | ||||
@@ -1349,7 +1353,11 @@ EXPORT jack_port_t* jack_port_by_name(jack_client_t* ext_client, const char* por | |||||
if (!manager) | if (!manager) | ||||
return NULL; | return NULL; | ||||
int res = manager->GetPort(portname); // returns a port index at least > 1 | int res = manager->GetPort(portname); // returns a port index at least > 1 | ||||
#if defined(__x86_64__) || defined(__ppc64__) | |||||
return (res == NO_PORT) ? NULL : (jack_port_t*)((uint64_t)res); | |||||
#else | |||||
return (res == NO_PORT) ? NULL : (jack_port_t*)res; | return (res == NO_PORT) ? NULL : (jack_port_t*)res; | ||||
#endif | |||||
} | } | ||||
} | } | ||||
@@ -1359,7 +1367,11 @@ EXPORT jack_port_t* jack_port_by_id(jack_client_t* ext_client, jack_port_id_t id | |||||
JackLibGlobals::CheckContext(); | JackLibGlobals::CheckContext(); | ||||
#endif | #endif | ||||
/* jack_port_t* type is actually the port index */ | /* jack_port_t* type is actually the port index */ | ||||
#if defined(__x86_64__) || defined(__ppc64__) | |||||
return (jack_port_t*)((uint64_t)id); | |||||
#else | |||||
return (jack_port_t*)id; | return (jack_port_t*)id; | ||||
#endif | |||||
} | } | ||||
EXPORT int jack_engine_takeover_timebase(jack_client_t* ext_client) | EXPORT int jack_engine_takeover_timebase(jack_client_t* ext_client) | ||||
@@ -23,8 +23,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <assert.h> | #include <assert.h> | ||||
#include "driver_interface.h" | |||||
#ifdef __linux__ | #ifdef __linux__ | ||||
#include "JackAlsaAdapter.h" | #include "JackAlsaAdapter.h" | ||||
#endif | #endif | ||||
@@ -37,6 +35,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
#include "JackPortAudioAdapter.h" | #include "JackPortAudioAdapter.h" | ||||
#endif | #endif | ||||
#if defined(__sun__) || defined(sun) | |||||
#include "JackOSSAdapter.h" | |||||
#endif | |||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
extern "C" | extern "C" | ||||
{ | { | ||||
@@ -65,6 +67,11 @@ extern "C" | |||||
#ifdef __APPLE__ | #ifdef __APPLE__ | ||||
adapter = new Jack::JackAudioAdapter(jack_client, new Jack::JackCoreAudioAdapter(buffer_size, sample_rate, params)); | adapter = new Jack::JackAudioAdapter(jack_client, new Jack::JackCoreAudioAdapter(buffer_size, sample_rate, params)); | ||||
#endif | #endif | ||||
#if defined(__sun__) || defined(sun) | |||||
adapter = new Jack::JackAudioAdapter(jack_client, new Jack::JackOSSAdapter(buffer_size, sample_rate, params)); | |||||
#endif | |||||
assert(adapter); | assert(adapter); | ||||
if (adapter->Open() == 0) | if (adapter->Open() == 0) | ||||
@@ -33,16 +33,15 @@ namespace Jack | |||||
class SERVER_EXPORT JackAudioDriver : public JackDriver | class SERVER_EXPORT JackAudioDriver : public JackDriver | ||||
{ | { | ||||
private: | |||||
protected: | |||||
int ProcessAsync(); | |||||
int ProcessSync(); | |||||
void ProcessGraphAsync(); | void ProcessGraphAsync(); | ||||
void ProcessGraphSync(); | void ProcessGraphSync(); | ||||
void WaitUntilNextCycle(); | void WaitUntilNextCycle(); | ||||
protected: | |||||
virtual int ProcessAsync(); | |||||
virtual int ProcessSync(); | |||||
int fCaptureChannels; | int fCaptureChannels; | ||||
int fPlaybackChannels; | int fPlaybackChannels; | ||||
@@ -23,7 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
#if defined (__APPLE__) | #if defined (__APPLE__) | ||||
#include <Accelerate/Accelerate.h> | #include <Accelerate/Accelerate.h> | ||||
#elif defined (__SSE__) | |||||
#elif defined (__SSE__) && !defined (__sun__) | |||||
#include <xmmintrin.h> | #include <xmmintrin.h> | ||||
#endif | #endif | ||||
@@ -46,7 +46,7 @@ static inline void MixAudioBuffer(float* mixbuffer, float* buffer, jack_nframes_ | |||||
frames = frames % 4; | frames = frames % 4; | ||||
while (frames_group > 0) { | while (frames_group > 0) { | ||||
#ifdef __SSE__ | |||||
#if defined (__SSE__) && !defined (__sun__) | |||||
__m128 vec = _mm_add_ps(_mm_load_ps(mixbuffer), _mm_load_ps(buffer)); | __m128 vec = _mm_add_ps(_mm_load_ps(mixbuffer), _mm_load_ps(buffer)); | ||||
_mm_store_ps(mixbuffer, vec); | _mm_store_ps(mixbuffer, vec); | ||||
@@ -97,7 +97,7 @@ static void AudioBufferMixdown(void* mixbuffer, void** src_buffers, int src_coun | |||||
void* buffer; | void* buffer; | ||||
// Copy first buffer | // Copy first buffer | ||||
#ifdef __SSE__ | |||||
#if defined (__SSE__) && !defined (__sun__) | |||||
jack_nframes_t frames_group = nframes / 4; | jack_nframes_t frames_group = nframes / 4; | ||||
jack_nframes_t remaining_frames = nframes % 4; | jack_nframes_t remaining_frames = nframes % 4; | ||||
@@ -362,7 +362,7 @@ bool JackClient::Execute() | |||||
if (GetEngineControl()->fRealTime) | if (GetEngineControl()->fRealTime) | ||||
set_threaded_log_function(); | set_threaded_log_function(); | ||||
if (fThreadFun) { | if (fThreadFun) { | ||||
// Execute a dummy cycle to be sure thread has the correct properties (ensure thread creation is finished) | // Execute a dummy cycle to be sure thread has the correct properties (ensure thread creation is finished) | ||||
WaitSync(); | WaitSync(); | ||||
@@ -57,17 +57,27 @@ | |||||
#ifdef WIN32 | #ifdef WIN32 | ||||
#define jack_server_dir "server" | #define jack_server_dir "server" | ||||
#define jack_client_dir "client" | #define jack_client_dir "client" | ||||
#define ADDON_DIR "jack" | |||||
#elif __APPLE__ | |||||
#define ADDON_DIR "jackmp" | |||||
#endif | |||||
#ifdef __APPLE__ | |||||
#define jack_server_dir "/tmp" | #define jack_server_dir "/tmp" | ||||
#define jack_client_dir "/tmp" | #define jack_client_dir "/tmp" | ||||
#define JACK_DEFAULT_DRIVER "coreaudio" | #define JACK_DEFAULT_DRIVER "coreaudio" | ||||
#else | |||||
#endif | |||||
#ifdef __linux__ | |||||
#define jack_server_dir "/dev/shm" | #define jack_server_dir "/dev/shm" | ||||
#define jack_client_dir "/dev/shm" | #define jack_client_dir "/dev/shm" | ||||
#define JACK_DEFAULT_DRIVER "alsa" | #define JACK_DEFAULT_DRIVER "alsa" | ||||
#endif | #endif | ||||
#if defined(__sun__) || defined(sun) | |||||
#define jack_server_dir "/tmp" | |||||
#define jack_client_dir "/tmp" | |||||
#define JACK_DEFAULT_DRIVER "oss" | |||||
#endif | |||||
#define jack_server_entry "jackdmp_entry" | #define jack_server_entry "jackdmp_entry" | ||||
#define jack_client_entry "jack_client" | #define jack_client_entry "jack_client" | ||||
@@ -21,7 +21,6 @@ | |||||
*/ | */ | ||||
#ifndef WIN32 | #ifndef WIN32 | ||||
#include <stdbool.h> | |||||
#include <stdint.h> | #include <stdint.h> | ||||
#include <dirent.h> | #include <dirent.h> | ||||
#include <pthread.h> | #include <pthread.h> | ||||
@@ -42,6 +41,7 @@ | |||||
#include "JackTools.h" | #include "JackTools.h" | ||||
#include "JackControlAPI.h" | #include "JackControlAPI.h" | ||||
#include "JackLockedEngine.h" | #include "JackLockedEngine.h" | ||||
#include "JackConstants.h" | |||||
using namespace Jack; | using namespace Jack; | ||||
@@ -561,7 +561,11 @@ jackctl_wait_signals(sigset_t signals) | |||||
bool waiting = true; | bool waiting = true; | ||||
while (waiting) { | while (waiting) { | ||||
#if defined(sun) && !defined(__sun__) // SUN compiler only, to check | |||||
sigwait(&signals); | |||||
#else | |||||
sigwait(&signals, &sig); | sigwait(&signals, &sig); | ||||
#endif | |||||
fprintf(stderr, "jack main caught signal %d\n", sig); | fprintf(stderr, "jack main caught signal %d\n", sig); | ||||
switch (sig) { | switch (sig) { | ||||
@@ -467,6 +467,17 @@ int JackEngine::GetClientPID(const char* name) | |||||
return 0; | return 0; | ||||
} | } | ||||
int JackEngine::GetClientRefNum(const char* name) | |||||
{ | |||||
for (int i = 0; i < CLIENT_NUM; i++) { | |||||
JackClientInterface* client = fClientTable[i]; | |||||
if (client && (strcmp(client->GetClientControl()->fName, name) == 0)) | |||||
return client->GetClientControl()->fRefNum; | |||||
} | |||||
return -1; | |||||
} | |||||
// Used for external clients | // Used for external clients | ||||
int JackEngine::ClientExternalOpen(const char* name, int pid, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager) | int JackEngine::ClientExternalOpen(const char* name, int pid, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager) | ||||
{ | { | ||||
@@ -91,6 +91,7 @@ class SERVER_EXPORT JackEngine | |||||
int ClientDeactivate(int refnum); | int ClientDeactivate(int refnum); | ||||
int GetClientPID(const char* name); | int GetClientPID(const char* name); | ||||
int GetClientRefNum(const char* name); | |||||
// Internal client management | // Internal client management | ||||
int GetInternalClientName(int int_ref, char* name_res); | int GetInternalClientName(int int_ref, char* name_res); | ||||
@@ -28,7 +28,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
namespace Jack | namespace Jack | ||||
{ | { | ||||
static inline _jack_time_t JACK_MAX(_jack_time_t a, _jack_time_t b) | |||||
static inline jack_time_t JACK_MAX(jack_time_t a, jack_time_t b) | |||||
{ | { | ||||
return (a < b) ? b : a; | return (a < b) ? b : a; | ||||
} | } | ||||
@@ -46,6 +46,9 @@ void JackEngineControl::CycleBegin(JackClientInterface** table, | |||||
{ | { | ||||
fTransport.CycleBegin(fSampleRate, cur_cycle_begin); | fTransport.CycleBegin(fSampleRate, cur_cycle_begin); | ||||
CalcCPULoad(table, manager, cur_cycle_begin, prev_cycle_end); | CalcCPULoad(table, manager, cur_cycle_begin, prev_cycle_end); | ||||
#ifdef JACK_MONITOR | |||||
fProfiler.Profile(table, manager, fPeriodUsecs, cur_cycle_begin, prev_cycle_end); | |||||
#endif | |||||
} | } | ||||
void JackEngineControl::CycleEnd(JackClientInterface** table) | void JackEngineControl::CycleEnd(JackClientInterface** table) | ||||
@@ -24,9 +24,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
#include "JackShmMem.h" | #include "JackShmMem.h" | ||||
#include "JackFrameTimer.h" | #include "JackFrameTimer.h" | ||||
#include "JackTransportEngine.h" | #include "JackTransportEngine.h" | ||||
#include "JackConstants.h" | |||||
#include "types.h" | #include "types.h" | ||||
#include <stdio.h> | #include <stdio.h> | ||||
#ifdef JACK_MONITOR | |||||
#include "JackEngineProfiling.h" | |||||
#endif | |||||
namespace Jack | namespace Jack | ||||
{ | { | ||||
@@ -78,6 +83,10 @@ struct SERVER_EXPORT JackEngineControl : public JackShmMem | |||||
// Timer | // Timer | ||||
JackFrameTimer fFrameTimer; | JackFrameTimer fFrameTimer; | ||||
#ifdef JACK_MONITOR | |||||
JackEngineProfiling fProfiler; | |||||
#endif | |||||
JackEngineControl(bool sync, bool temporary, long timeout, bool rt, long priority, bool verbose, const char* server_name) | JackEngineControl(bool sync, bool temporary, long timeout, bool rt, long priority, bool verbose, const char* server_name) | ||||
{ | { | ||||
@@ -105,6 +114,7 @@ struct SERVER_EXPORT JackEngineControl : public JackShmMem | |||||
fMaxDelayedUsecs = 0.f; | fMaxDelayedUsecs = 0.f; | ||||
fXrunDelayedUsecs = 0.f; | fXrunDelayedUsecs = 0.f; | ||||
} | } | ||||
~JackEngineControl() | ~JackEngineControl() | ||||
{} | {} | ||||
@@ -0,0 +1,330 @@ | |||||
/* | |||||
Copyright (C) 2008 Grame & RTL | |||||
This program is free software; you can redistribute it and/or modify | |||||
it under the terms of the GNU Lesser General Public License as published by | |||||
the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. | |||||
You should have received a copy of the GNU Lesser General Public License | |||||
along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
*/ | |||||
#include "JackEngineProfiling.h" | |||||
#include "JackGraphManager.h" | |||||
#include "JackClientControl.h" | |||||
#include "JackClientInterface.h" | |||||
#include "JackTime.h" | |||||
namespace Jack | |||||
{ | |||||
JackEngineProfiling::JackEngineProfiling():fAudioCycle(0) | |||||
{ | |||||
jack_info("Engine profiling activated, beware %ld MBytes are needed to record profiling points...", sizeof(fProfileTable) / (1024 * 1024)); | |||||
// Force memory page in | |||||
memset(fProfileTable, 0, sizeof(fProfileTable)); | |||||
} | |||||
JackEngineProfiling::~JackEngineProfiling() | |||||
{ | |||||
// Window monitoring | |||||
int max_client = 0; | |||||
char buffer[1024]; | |||||
char* nameTable[CLIENT_NUM]; | |||||
FILE* file = fopen("JackEngineProfiling.log", "w"); | |||||
jack_info("Write server and clients timing data..."); | |||||
if (file == NULL) { | |||||
jack_error("JackEngineProfiling::Save cannot open JackEngineProfiling.log file"); | |||||
} else { | |||||
for (int i = 2; i < TIME_POINTS; i++) { | |||||
bool header = true; | |||||
bool printed = false; | |||||
int count = 0; | |||||
for (int j = REAL_REFNUM; j < CLIENT_NUM; j++) { | |||||
if (fProfileTable[i].fClientTable[j].fRefNum > 0) { | |||||
long d1 = long(fProfileTable[i - 1].fCurCycleBegin - fProfileTable[i - 2].fCurCycleBegin); | |||||
long d2 = long(fProfileTable[i].fPrevCycleEnd - fProfileTable[i - 1].fCurCycleBegin); | |||||
if (d1 > 0 && fProfileTable[i].fClientTable[j].fStatus != NotTriggered) { // Valid cycle | |||||
count++; | |||||
nameTable[count] = fNameTable[fProfileTable[i].fClientTable[j].fRefNum]; | |||||
// driver delta and end cycle | |||||
if (header) { | |||||
fprintf(file, "%ld \t %ld \t", d1, d2); | |||||
header = false; | |||||
} | |||||
long d5 = long(fProfileTable[i].fClientTable[j].fSignaledAt - fProfileTable[i - 1].fCurCycleBegin); | |||||
long d6 = long(fProfileTable[i].fClientTable[j].fAwakeAt - fProfileTable[i - 1].fCurCycleBegin); | |||||
long d7 = long(fProfileTable[i].fClientTable[j].fFinishedAt - fProfileTable[i - 1].fCurCycleBegin); | |||||
// ref, signal, start, end, scheduling, duration, status | |||||
fprintf(file, "%d \t %ld \t %ld \t %ld \t %ld \t %ld \t %d \t", | |||||
fProfileTable[i].fClientTable[j].fRefNum, | |||||
((d5 > 0) ? d5 : 0), | |||||
((d6 > 0) ? d6 : 0), | |||||
((d7 > 0) ? d7 : 0), | |||||
((d6 > 0 && d5 > 0) ? (d6 - d5) : 0), | |||||
((d7 > 0 && d6 > 0) ? (d7 - d6) : 0), | |||||
fProfileTable[i].fClientTable[j].fStatus); | |||||
printed = true; | |||||
} | |||||
} | |||||
max_client = (count > max_client) ? count : max_client; | |||||
} | |||||
if (printed) { | |||||
fprintf(file, "\n"); | |||||
} else if (fProfileTable[i].fAudioCycle > 0) { // Driver timing only | |||||
long d1 = long(fProfileTable[i].fCurCycleBegin - fProfileTable[i - 1].fCurCycleBegin); | |||||
long d2 = long(fProfileTable[i].fPrevCycleEnd - fProfileTable[i - 1].fCurCycleBegin); | |||||
if (d1 > 0) { // Valid cycle | |||||
fprintf(file, "%ld \t %ld \n", d1, d2); | |||||
} | |||||
} | |||||
} | |||||
fclose(file); | |||||
} | |||||
// Driver period | |||||
file = fopen("Timing1.plot", "w"); | |||||
if (file == NULL) { | |||||
jack_error("JackEngineProfiling::Save cannot open Timing1.log file"); | |||||
} else { | |||||
fprintf(file, "set grid\n"); | |||||
fprintf(file, "set title \"Audio driver timing\"\n"); | |||||
fprintf(file, "set xlabel \"audio cycles\"\n"); | |||||
fprintf(file, "set ylabel \"usec\"\n"); | |||||
fprintf(file, "plot \"JackEngineProfiling.log\" using 1 title \"Audio period\" with lines \n"); | |||||
fprintf(file, "set output 'Timing1.pdf\n"); | |||||
fprintf(file, "set terminal pdf\n"); | |||||
fprintf(file, "set grid\n"); | |||||
fprintf(file, "set title \"Audio driver timing\"\n"); | |||||
fprintf(file, "set xlabel \"audio cycles\"\n"); | |||||
fprintf(file, "set ylabel \"usec\"\n"); | |||||
fprintf(file, "plot \"JackEngineProfiling.log\" using 1 title \"Audio period\" with lines \n"); | |||||
fclose(file); | |||||
} | |||||
// Driver end date | |||||
file = fopen("Timing2.plot", "w"); | |||||
if (file == NULL) { | |||||
jack_error("JackEngineProfiling::Save cannot open Timing2.log file"); | |||||
} else { | |||||
fprintf(file, "set grid\n"); | |||||
fprintf(file, "set title \"Driver end date\"\n"); | |||||
fprintf(file, "set xlabel \"audio cycles\"\n"); | |||||
fprintf(file, "set ylabel \"usec\"\n"); | |||||
fprintf(file, "plot \"JackEngineProfiling.log\" using 2 title \"Driver end date\" with lines \n"); | |||||
fprintf(file, "set output 'Timing2.pdf\n"); | |||||
fprintf(file, "set terminal pdf\n"); | |||||
fprintf(file, "set grid\n"); | |||||
fprintf(file, "set title \"Driver end date\"\n"); | |||||
fprintf(file, "set xlabel \"audio cycles\"\n"); | |||||
fprintf(file, "set ylabel \"usec\"\n"); | |||||
fprintf(file, "plot \"JackEngineProfiling.log\" using 2 title \"Driver end date\" with lines \n"); | |||||
fclose(file); | |||||
} | |||||
// Clients end date | |||||
if (max_client > 0) { | |||||
file = fopen("Timing3.plot", "w"); | |||||
if (file == NULL) { | |||||
jack_error("JackEngineProfiling::Save cannot open Timing3.log file"); | |||||
} else { | |||||
fprintf(file, "set multiplot\n"); | |||||
fprintf(file, "set grid\n"); | |||||
fprintf(file, "set title \"Clients end date\"\n"); | |||||
fprintf(file, "set xlabel \"audio cycles\"\n"); | |||||
fprintf(file, "set ylabel \"usec\"\n"); | |||||
fprintf(file, "plot "); | |||||
for (int i = 0; i < max_client; i++) { | |||||
if (i == 0) { | |||||
if ((i + 1) == max_client) { | |||||
sprintf(buffer, "\"JackEngineProfiling.log\" using 1 title \"Audio period\" with lines,\"JackEngineProfiling.log\" using %d title \"%s\" with lines", | |||||
((i + 1) * 7) - 1 , nameTable[(i + 1)]); | |||||
} else { | |||||
sprintf(buffer, "\"JackEngineProfiling.log\" using 1 title \"Audio period\" with lines,\"JackEngineProfiling.log\" using %d title \"%s\" with lines,", | |||||
((i + 1) * 7) - 1 , nameTable[(i + 1)]); | |||||
} | |||||
} else if ((i + 1) == max_client) { // Last client | |||||
sprintf(buffer, "\"JackEngineProfiling.log\" using %d title \"%s\" with lines", ((i + 1) * 7) - 1 , nameTable[(i + 1)]); | |||||
} else { | |||||
sprintf(buffer, "\"JackEngineProfiling.log\" using %d title \"%s\" with lines,", ((i + 1) * 7) - 1, nameTable[(i + 1)]); | |||||
} | |||||
fprintf(file, buffer); | |||||
} | |||||
fprintf(file, "\n unset multiplot\n"); | |||||
fprintf(file, "set output 'Timing3.pdf\n"); | |||||
fprintf(file, "set terminal pdf\n"); | |||||
fprintf(file, "set multiplot\n"); | |||||
fprintf(file, "set grid\n"); | |||||
fprintf(file, "set title \"Clients end date\"\n"); | |||||
fprintf(file, "set xlabel \"audio cycles\"\n"); | |||||
fprintf(file, "set ylabel \"usec\"\n"); | |||||
fprintf(file, "plot "); | |||||
for (int i = 0; i < max_client; i++) { | |||||
if (i == 0) { | |||||
if ((i + 1) == max_client) { | |||||
sprintf(buffer, "\"JackEngineProfiling.log\" using 1 title \"Audio period\" with lines,\"JackEngineProfiling.log\" using %d title \"%s\" with lines", | |||||
((i + 1) * 7) - 1 , nameTable[(i + 1)]); | |||||
} else { | |||||
sprintf(buffer, "\"JackEngineProfiling.log\" using 1 title \"Audio period\" with lines,\"JackEngineProfiling.log\" using %d title \"%s\" with lines,", | |||||
((i + 1) * 7) - 1 , nameTable[(i + 1)]); | |||||
} | |||||
} else if ((i + 1) == max_client) { // Last client | |||||
sprintf(buffer, "\"JackEngineProfiling.log\" using %d title \"%s\" with lines", ((i + 1) * 7) - 1 , nameTable[(i + 1)]); | |||||
} else { | |||||
sprintf(buffer, "\"JackEngineProfiling.log\" using %d title \"%s\" with lines,", ((i + 1) * 7) - 1, nameTable[(i + 1)]); | |||||
} | |||||
fprintf(file, buffer); | |||||
} | |||||
fclose(file); | |||||
} | |||||
} | |||||
// Clients scheduling | |||||
if (max_client > 0) { | |||||
file = fopen("Timing4.plot", "w"); | |||||
if (file == NULL) { | |||||
jack_error("JackEngineProfiling::Save cannot open Timing4.log file"); | |||||
} else { | |||||
fprintf(file, "set multiplot\n"); | |||||
fprintf(file, "set grid\n"); | |||||
fprintf(file, "set title \"Clients scheduling latency\"\n"); | |||||
fprintf(file, "set xlabel \"audio cycles\"\n"); | |||||
fprintf(file, "set ylabel \"usec\"\n"); | |||||
fprintf(file, "plot "); | |||||
for (int i = 0; i < max_client; i++) { | |||||
if ((i + 1) == max_client) // Last client | |||||
sprintf(buffer, "\"JackEngineProfiling.log\" using %d title \"%s\" with lines", ((i + 1) * 7), nameTable[(i + 1)]); | |||||
else | |||||
sprintf(buffer, "\"JackEngineProfiling.log\" using %d title \"%s\" with lines,", ((i + 1) * 7), nameTable[(i + 1)]); | |||||
fprintf(file, buffer); | |||||
} | |||||
fprintf(file, "\n unset multiplot\n"); | |||||
fprintf(file, "set output 'Timing4.pdf\n"); | |||||
fprintf(file, "set terminal pdf\n"); | |||||
fprintf(file, "set multiplot\n"); | |||||
fprintf(file, "set grid\n"); | |||||
fprintf(file, "set title \"Clients scheduling latency\"\n"); | |||||
fprintf(file, "set xlabel \"audio cycles\"\n"); | |||||
fprintf(file, "set ylabel \"usec\"\n"); | |||||
fprintf(file, "plot "); | |||||
for (int i = 0; i < max_client; i++) { | |||||
if ((i + 1) == max_client) // Last client | |||||
sprintf(buffer, "\"JackEngineProfiling.log\" using %d title \"%s\" with lines", ((i + 1) * 7), nameTable[(i + 1)]); | |||||
else | |||||
sprintf(buffer, "\"JackEngineProfiling.log\" using %d title \"%s\" with lines,", ((i + 1) * 7), nameTable[(i + 1)]); | |||||
fprintf(file, buffer); | |||||
} | |||||
fclose(file); | |||||
} | |||||
} | |||||
// Clients duration | |||||
if (max_client > 0) { | |||||
file = fopen("Timing5.plot", "w"); | |||||
if (file == NULL) { | |||||
jack_error("JackEngineProfiling::Save cannot open Timing5.log file"); | |||||
} else { | |||||
fprintf(file, "set multiplot\n"); | |||||
fprintf(file, "set grid\n"); | |||||
fprintf(file, "set title \"Clients duration\"\n"); | |||||
fprintf(file, "set xlabel \"audio cycles\"\n"); | |||||
fprintf(file, "set ylabel \"usec\"\n"); | |||||
fprintf(file, "plot "); | |||||
for (int i = 0; i < max_client; i++) { | |||||
if ((i + 1) == max_client) // Last client | |||||
sprintf(buffer, "\"JackEngineProfiling.log\" using %d title \"%s\" with lines", ((i + 1) * 7) + 1, nameTable[(i + 1)]); | |||||
else | |||||
sprintf(buffer, "\"JackEngineProfiling.log\" using %d title \"%s\" with lines,", ((i + 1) * 7) + 1, nameTable[(i + 1)]); | |||||
fprintf(file, buffer); | |||||
} | |||||
fprintf(file, "\n unset multiplot\n"); | |||||
fprintf(file, "set output 'Timing5.pdf\n"); | |||||
fprintf(file, "set terminal pdf\n"); | |||||
fprintf(file, "set multiplot\n"); | |||||
fprintf(file, "set grid\n"); | |||||
fprintf(file, "set title \"Clients duration\"\n"); | |||||
fprintf(file, "set xlabel \"audio cycles\"\n"); | |||||
fprintf(file, "set ylabel \"usec\"\n"); | |||||
fprintf(file, "plot "); | |||||
for (int i = 0; i < max_client; i++) { | |||||
if ((i + 1) == max_client) // Last client | |||||
sprintf(buffer, "\"JackEngineProfiling.log\" using %d title \"%s\" with lines", ((i + 1) * 7) + 1, nameTable[(i + 1)]); | |||||
else | |||||
sprintf(buffer, "\"JackEngineProfiling.log\" using %d title \"%s\" with lines,", ((i + 1) * 7) + 1, nameTable[(i + 1)]); | |||||
fprintf(file, buffer); | |||||
} | |||||
fclose(file); | |||||
} | |||||
} | |||||
} | |||||
void JackEngineProfiling::Profile(JackClientInterface** table, | |||||
JackGraphManager* manager, | |||||
jack_time_t period_usecs, | |||||
jack_time_t cur_cycle_begin, | |||||
jack_time_t prev_cycle_end) | |||||
{ | |||||
fAudioCycle = (fAudioCycle + 1) % TIME_POINTS; | |||||
// Keeps cycle data | |||||
fProfileTable[fAudioCycle].fPeriodUsecs = period_usecs; | |||||
fProfileTable[fAudioCycle].fCurCycleBegin = cur_cycle_begin; | |||||
fProfileTable[fAudioCycle].fPrevCycleEnd = prev_cycle_end; | |||||
fProfileTable[fAudioCycle].fAudioCycle = fAudioCycle; | |||||
for (int i = REAL_REFNUM; i < CLIENT_NUM; i++) { | |||||
JackClientInterface* client = table[i]; | |||||
JackClientTiming* timing = manager->GetClientTiming(i); | |||||
if (client && client->GetClientControl()->fActive) { | |||||
strcpy(fNameTable[i], client->GetClientControl()->fName); | |||||
fProfileTable[fAudioCycle].fClientTable[i].fRefNum = i; | |||||
fProfileTable[fAudioCycle].fClientTable[i].fSignaledAt = timing->fSignaledAt; | |||||
fProfileTable[fAudioCycle].fClientTable[i].fAwakeAt = timing->fAwakeAt; | |||||
fProfileTable[fAudioCycle].fClientTable[i].fFinishedAt = timing->fFinishedAt; | |||||
fProfileTable[fAudioCycle].fClientTable[i].fStatus = timing->fStatus; | |||||
} | |||||
} | |||||
} | |||||
JackTimingMeasure* JackEngineProfiling::GetCurMeasure() | |||||
{ | |||||
return &fProfileTable[fAudioCycle]; | |||||
} | |||||
} // end of namespace |
@@ -1,6 +1,5 @@ | |||||
/* | /* | ||||
Copyright (C) 2003 Paul Davis | |||||
Copyright (C) 2004-2008 Grame | |||||
Copyright (C) 2008 Grame & RTL | |||||
This program is free software; you can redistribute it and/or modify | This program is free software; you can redistribute it and/or modify | ||||
it under the terms of the GNU Lesser General Public License as published by | it under the terms of the GNU Lesser General Public License as published by | ||||
@@ -18,17 +17,20 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
*/ | */ | ||||
#ifndef __JackEngineTiming__ | |||||
#define __JackEngineTiming__ | |||||
#ifndef __JackEngineProfiling__ | |||||
#define __JackEngineProfiling__ | |||||
#include "types.h" | #include "types.h" | ||||
#include "JackTypes.h" | #include "JackTypes.h" | ||||
#include "JackConstants.h" | #include "JackConstants.h" | ||||
#include "JackShmMem.h" | |||||
namespace Jack | namespace Jack | ||||
{ | { | ||||
#define TIME_POINTS 1000 | |||||
#define TIME_POINTS 250000 | |||||
#define FAILURE_TIME_POINTS 10000 | |||||
#define FAILURE_WINDOW 10 | |||||
/*! | /*! | ||||
\brief Timing stucture for a client. | \brief Timing stucture for a client. | ||||
@@ -50,36 +52,41 @@ struct JackTimingMeasureClient | |||||
struct JackTimingMeasure | struct JackTimingMeasure | ||||
{ | { | ||||
unsigned int fAudioCycle; | unsigned int fAudioCycle; | ||||
jack_time_t fEngineTime; | |||||
jack_time_t fPeriodUsecs; | |||||
jack_time_t fCurCycleBegin; | |||||
jack_time_t fPrevCycleEnd; | |||||
JackTimingMeasureClient fClientTable[CLIENT_NUM]; | JackTimingMeasureClient fClientTable[CLIENT_NUM]; | ||||
}; | }; | ||||
/*! | /*! | ||||
\brief Client timing. | |||||
\brief Client timing monitoring. | |||||
*/ | */ | ||||
class JackClientInterface; | class JackClientInterface; | ||||
class JackGraphManager; | class JackGraphManager; | ||||
class JackEngineTiming | |||||
class SERVER_EXPORT JackEngineProfiling | |||||
{ | { | ||||
private: | private: | ||||
JackTimingMeasure fMeasure[TIME_POINTS]; | |||||
JackTimingMeasure fProfileTable[TIME_POINTS]; | |||||
char fNameTable[CLIENT_NUM][JACK_CLIENT_NAME_SIZE + 1]; | |||||
unsigned int fAudioCycle; | unsigned int fAudioCycle; | ||||
jack_time_t fPrevCycleTime; | |||||
jack_time_t fCurCycleTime; | |||||
public: | public: | ||||
JackEngineTiming():fAudioCycle(0),fPrevCycleTime(0),fCurCycleTime(0) | |||||
{} | |||||
~JackEngineTiming() | |||||
{} | |||||
JackEngineProfiling(); | |||||
~JackEngineProfiling(); | |||||
void Profile(JackClientInterface** table, | |||||
JackGraphManager* manager, | |||||
jack_time_t period_usecs, | |||||
jack_time_t cur_cycle_begin, | |||||
jack_time_t prev_cycle_end); | |||||
JackTimingMeasure* GetCurMeasure(); | |||||
void GetTimeMeasure(JackClientInterface** table, JackGraphManager* manager, jack_time_t cur_cycle_begin, jack_time_t prev_cycle_end); | |||||
void ClearTimeMeasures(); | |||||
}; | }; | ||||
} // end of namespace | } // end of namespace |
@@ -1,71 +0,0 @@ | |||||
/* | |||||
Copyright (C) 2003 Paul Davis | |||||
Copyright (C) 2004-2008 Grame | |||||
This program is free software; you can redistribute it and/or modify | |||||
it under the terms of the GNU Lesser General Public License as published by | |||||
the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. | |||||
You should have received a copy of the GNU Lesser General Public License | |||||
along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
*/ | |||||
#include "JackEngineTiming.h" | |||||
#include "JackGraphManager.h" | |||||
#include "JackClientControl.h" | |||||
#include "JackClientInterface.h" | |||||
#include "JackTime.h" | |||||
namespace Jack | |||||
{ | |||||
void JackEngineTiming::GetTimeMeasure(JackClientInterface** table, | |||||
JackGraphManager* manager, | |||||
jack_time_t cur_cycle_begin, | |||||
jack_time_t prev_cycle_end) | |||||
{ | |||||
int pos = (++fAudioCycle) % TIME_POINTS; | |||||
fPrevCycleTime = fCurCycleTime; | |||||
fCurCycleTime = cur_cycle_begin; | |||||
if (fPrevCycleTime > 0) { | |||||
fMeasure[pos].fEngineTime = fPrevCycleTime; | |||||
fMeasure[pos].fAudioCycle = fAudioCycle; | |||||
for (int i = 0; i < CLIENT_NUM; i++) { | |||||
JackClientInterface* client = table[i]; | |||||
JackClientTiming* timing = manager->GetClientTiming(i); | |||||
if (client && client->GetClientControl()->fActive) { | |||||
fMeasure[pos].fClientTable[i].fRefNum = i; | |||||
fMeasure[pos].fClientTable[i].fSignaledAt = timing->fSignaledAt; | |||||
fMeasure[pos].fClientTable[i].fAwakeAt = timing->fAwakeAt; | |||||
fMeasure[pos].fClientTable[i].fFinishedAt = timing->fFinishedAt; | |||||
fMeasure[pos].fClientTable[i].fStatus = timing->fStatus; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
void JackEngineTiming::ClearTimeMeasures() | |||||
{ | |||||
for (int i = 0; i < TIME_POINTS; i++) { | |||||
for (int j = 0; j < CLIENT_NUM; j++) { | |||||
fMeasure[i].fClientTable[j].fRefNum = 0; | |||||
fMeasure[i].fClientTable[j].fSignaledAt = 0; | |||||
fMeasure[i].fClientTable[j].fAwakeAt = 0; | |||||
fMeasure[i].fClientTable[j].fFinishedAt = 0; | |||||
} | |||||
} | |||||
fPrevCycleTime = fCurCycleTime = 0; | |||||
} | |||||
} // end of namespace |
@@ -196,7 +196,13 @@ class SERVER_EXPORT JackLockedEngine : public JackLockAble | |||||
JackLock lock(this); | JackLock lock(this); | ||||
return fEngine.GetClientPID(name); | return fEngine.GetClientPID(name); | ||||
} | } | ||||
int GetClientRefNum(const char* name) | |||||
{ | |||||
JackLock lock(this); | |||||
return fEngine.GetClientRefNum(name); | |||||
} | |||||
}; | }; | ||||
} // end of namespace | } // end of namespace | ||||
@@ -508,10 +508,9 @@ namespace Jack | |||||
JackNetMasterManager::~JackNetMasterManager() | JackNetMasterManager::~JackNetMasterManager() | ||||
{ | { | ||||
jack_log ( "JackNetMasterManager::~JackNetMasterManager" ); | jack_log ( "JackNetMasterManager::~JackNetMasterManager" ); | ||||
jack_info ( "Exiting net manager..." ); | jack_info ( "Exiting net manager..." ); | ||||
fRunning = false; | fRunning = false; | ||||
jack_client_stop_thread ( fManagerClient, fManagerThread ); | |||||
jack_client_kill_thread ( fManagerClient, fManagerThread ); | |||||
master_list_t::iterator it; | master_list_t::iterator it; | ||||
for ( it = fMasterList.begin(); it != fMasterList.end(); it++ ) | for ( it = fMasterList.begin(); it != fMasterList.end(); it++ ) | ||||
delete ( *it ); | delete ( *it ); | ||||
@@ -0,0 +1,291 @@ | |||||
/* | |||||
Copyright (C) 2009 Grame | |||||
This program is free software; you can redistribute it and/or modify | |||||
it under the terms of the GNU General Public License as published by | |||||
the Free Software Foundation; either version 2 of the License, or | |||||
(at your option) any later version. | |||||
This program is distributed in the hope that it will be useful, | |||||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
GNU General Public License for more details. | |||||
You should have received a copy of the GNU General Public License | |||||
along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
*/ | |||||
#include "JackProfiler.h" | |||||
#include "JackServerGlobals.h" | |||||
#include "JackEngineControl.h" | |||||
#include "JackLockedEngine.h" | |||||
#include "JackArgParser.h" | |||||
#include <assert.h> | |||||
#include <string> | |||||
namespace Jack | |||||
{ | |||||
JackProfilerClient::JackProfilerClient(jack_client_t* client, const char* name) | |||||
:fClient(client) | |||||
{ | |||||
char port_name[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; | |||||
fRefNum = JackServerGlobals::fInstance->GetEngine()->GetClientRefNum(name); | |||||
snprintf(port_name, sizeof(port_name) - 1, "%s:scheduling", name); | |||||
fSchedulingPort = jack_port_register(client, port_name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); | |||||
snprintf(port_name, sizeof(port_name) - 1, "%s:duration", name); | |||||
fDurationPort = jack_port_register(client, port_name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); | |||||
} | |||||
JackProfilerClient::~JackProfilerClient() | |||||
{ | |||||
jack_port_unregister(fClient, fSchedulingPort); | |||||
jack_port_unregister(fClient, fDurationPort); | |||||
} | |||||
#ifdef JACK_MONITOR | |||||
JackProfiler::JackProfiler(jack_client_t* client, const JSList* params) | |||||
:fClient(client), fLastMeasure(NULL) | |||||
#else | |||||
JackProfiler::JackProfiler(jack_client_t* client, const JSList* params) | |||||
:fClient(client) | |||||
#endif | |||||
{ | |||||
jack_log("JackProfiler::JackProfiler"); | |||||
fCPULoadPort = fDriverPeriodPort = fDriverEndPort = NULL; | |||||
const JSList* node; | |||||
const jack_driver_param_t* param; | |||||
for (node = params; node; node = jack_slist_next(node)) { | |||||
param = (const jack_driver_param_t*)node->data; | |||||
switch (param->character) { | |||||
case 'c': | |||||
fCPULoadPort = jack_port_register(client, "cpu_load", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); | |||||
break; | |||||
case 'p': | |||||
fDriverPeriodPort = jack_port_register(client, "driver_period", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); | |||||
break; | |||||
case 'e': | |||||
fDriverEndPort = jack_port_register(client, "driver_end_time", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); | |||||
break; | |||||
} | |||||
} | |||||
// Resigster all running clients | |||||
const char **ports = jack_get_ports(client, NULL, NULL, 0); | |||||
if (ports) { | |||||
for (int i = 0; ports[i]; ++i) { | |||||
std::string str = std::string(ports[i]); | |||||
ClientRegistration(str.substr(0, str.find_first_of(':')).c_str(), 1, this); | |||||
} | |||||
free(ports); | |||||
} | |||||
jack_set_process_callback(client, Process, this); | |||||
jack_set_client_registration_callback(client, ClientRegistration, this); | |||||
jack_activate(client); | |||||
} | |||||
JackProfiler::~JackProfiler() | |||||
{ | |||||
jack_log("JackProfiler::~JackProfiler"); | |||||
} | |||||
void JackProfiler::ClientRegistration(const char* name, int val, void *arg) | |||||
{ | |||||
#ifdef JACK_MONITOR | |||||
JackProfiler* profiler = static_cast<JackProfiler*>(arg); | |||||
// Filter client or "system" name | |||||
if (strcmp(name, jack_get_client_name(profiler->fClient)) == 0 || strcmp(name, "system") == 0) | |||||
return; | |||||
profiler->fMutex.Lock(); | |||||
if (val) { | |||||
std::map<std::string, JackProfilerClient*>::iterator it = profiler->fClientTable.find(name); | |||||
if (it == profiler->fClientTable.end()) { | |||||
jack_log("Client %s added", name); | |||||
profiler->fClientTable[name] = new JackProfilerClient(profiler->fClient, name); | |||||
} | |||||
} else { | |||||
std::map<std::string, JackProfilerClient*>::iterator it = profiler->fClientTable.find(name); | |||||
if (it != profiler->fClientTable.end()) { | |||||
jack_log("Client %s removed", name); | |||||
profiler->fClientTable.erase(it); | |||||
delete((*it).second); | |||||
} | |||||
} | |||||
profiler->fMutex.Unlock(); | |||||
#endif | |||||
} | |||||
int JackProfiler::Process(jack_nframes_t nframes, void* arg) | |||||
{ | |||||
JackProfiler* profiler = static_cast<JackProfiler*>(arg); | |||||
if (profiler->fCPULoadPort) { | |||||
float* buffer_cpu_load = (float*)jack_port_get_buffer(profiler->fCPULoadPort, nframes); | |||||
float cpu_load = jack_cpu_load(profiler->fClient); | |||||
for (unsigned int i = 0; i < nframes; i++) { | |||||
buffer_cpu_load[i] = cpu_load / 100.f; | |||||
} | |||||
} | |||||
#ifdef JACK_MONITOR | |||||
JackEngineControl* control = JackServerGlobals::fInstance->GetEngineControl(); | |||||
JackEngineProfiling* engine_profiler = &control->fProfiler; | |||||
JackTimingMeasure* measure = engine_profiler->GetCurMeasure(); | |||||
if (profiler->fLastMeasure && profiler->fMutex.Trylock()) { | |||||
if (profiler->fDriverPeriodPort) { | |||||
float* buffer_driver_period = (float*)jack_port_get_buffer(profiler->fDriverPeriodPort, nframes); | |||||
float value1 = (float(measure->fPeriodUsecs) - float(measure->fCurCycleBegin - profiler->fLastMeasure->fCurCycleBegin)) / float(measure->fPeriodUsecs); | |||||
for (unsigned int i = 0; i < nframes; i++) { | |||||
buffer_driver_period[i] = value1; | |||||
} | |||||
} | |||||
if (profiler->fDriverEndPort) { | |||||
float* buffer_driver_end_time = (float*)jack_port_get_buffer(profiler->fDriverEndPort, nframes); | |||||
float value2 = (float(measure->fPrevCycleEnd - profiler->fLastMeasure->fCurCycleBegin)) / float(measure->fPeriodUsecs); | |||||
for (unsigned int i = 0; i < nframes; i++) { | |||||
buffer_driver_end_time[i] = value2; | |||||
} | |||||
} | |||||
std::map<std::string, JackProfilerClient*>::iterator it; | |||||
for (it = profiler->fClientTable.begin(); it != profiler->fClientTable.end(); it++) { | |||||
int ref = (*it).second->fRefNum; | |||||
long d5 = long(measure->fClientTable[ref].fSignaledAt - profiler->fLastMeasure->fCurCycleBegin); | |||||
long d6 = long(measure->fClientTable[ref].fAwakeAt - profiler->fLastMeasure->fCurCycleBegin); | |||||
long d7 = long(measure->fClientTable[ref].fFinishedAt - profiler->fLastMeasure->fCurCycleBegin); | |||||
float* buffer_scheduling = (float*)jack_port_get_buffer((*it).second->fSchedulingPort, nframes); | |||||
float value3 = float(d6 - d5) / float(measure->fPeriodUsecs); | |||||
jack_log("Scheduling %f", value3); | |||||
for (unsigned int i = 0; i < nframes; i++) { | |||||
buffer_scheduling[i] = value3; | |||||
} | |||||
float* buffer_duration = (float*)jack_port_get_buffer((*it).second->fDurationPort, nframes); | |||||
float value4 = float(d7 - d6) / float(measure->fPeriodUsecs); | |||||
jack_log("Duration %f", value4); | |||||
for (unsigned int i = 0; i < nframes; i++) { | |||||
buffer_duration[i] = value4; | |||||
} | |||||
} | |||||
profiler->fMutex.Unlock(); | |||||
} | |||||
profiler->fLastMeasure = measure; | |||||
#endif | |||||
return 0; | |||||
} | |||||
} // namespace Jack | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
{ | |||||
#endif | |||||
#include "driver_interface.h" | |||||
using namespace Jack; | |||||
static Jack::JackProfiler* profiler = NULL; | |||||
SERVER_EXPORT jack_driver_desc_t* jack_get_descriptor() | |||||
{ | |||||
jack_driver_desc_t* desc = (jack_driver_desc_t*)calloc(1, sizeof(jack_driver_desc_t)); | |||||
strcpy(desc->name, "profiler"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 | |||||
strcpy(desc->desc, "real-time server profiling"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 | |||||
desc->nparams = 3; | |||||
desc->params = (jack_driver_param_desc_t*)calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); | |||||
int i = 0; | |||||
strcpy(desc->params[i].name, "cpu-load"); | |||||
desc->params[i].character = 'c'; | |||||
desc->params[i].type = JackDriverParamBool; | |||||
desc->params[i].value.i = TRUE; | |||||
strcpy(desc->params[i].short_desc, "Show DSP CPU load"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | |||||
strcpy(desc->params[i].name, "driver-period"); | |||||
desc->params[i].character = 'p'; | |||||
desc->params[i].type = JackDriverParamBool; | |||||
desc->params[i].value.i = TRUE; | |||||
strcpy(desc->params[i].short_desc, "Show driver period"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | |||||
strcpy(desc->params[i].name, "driver-end-time"); | |||||
desc->params[i].character = 'e'; | |||||
desc->params[i].type = JackDriverParamBool; | |||||
desc->params[i].value.i = TRUE; | |||||
strcpy(desc->params[i].short_desc, "Show driver end time"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
return desc; | |||||
} | |||||
SERVER_EXPORT int jack_internal_initialize(jack_client_t* jack_client, const JSList* params) | |||||
{ | |||||
if (profiler) { | |||||
jack_info("profiler already loaded"); | |||||
return 1; | |||||
} | |||||
jack_log("Loading profiler"); | |||||
try { | |||||
profiler = new Jack::JackProfiler(jack_client, params); | |||||
assert(profiler); | |||||
return 0; | |||||
} catch (...) { | |||||
return 1; | |||||
} | |||||
} | |||||
SERVER_EXPORT int jack_initialize(jack_client_t* jack_client, const char* load_init) | |||||
{ | |||||
JSList* params = NULL; | |||||
bool parse_params = true; | |||||
int res = 1; | |||||
jack_driver_desc_t* desc = jack_get_descriptor(); | |||||
Jack::JackArgParser parser ( load_init ); | |||||
if ( parser.GetArgc() > 0 ) | |||||
parse_params = parser.ParseParams ( desc, ¶ms ); | |||||
if (parse_params) { | |||||
res = jack_internal_initialize ( jack_client, params ); | |||||
parser.FreeParams ( params ); | |||||
} | |||||
return res; | |||||
} | |||||
SERVER_EXPORT void jack_finish(void* arg) | |||||
{ | |||||
Jack::JackProfiler* profiler = static_cast<Jack::JackProfiler*>(arg); | |||||
if (profiler) { | |||||
jack_log("Unloading profiler"); | |||||
delete profiler; | |||||
} | |||||
} | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif |
@@ -0,0 +1,80 @@ | |||||
/* | |||||
Copyright (C) 2009 Grame | |||||
This program is free software; you can redistribute it and/or modify | |||||
it under the terms of the GNU General Public License as published by | |||||
the Free Software Foundation; either version 2 of the License, or | |||||
(at your option) any later version. | |||||
This program is distributed in the hope that it will be useful, | |||||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
GNU General Public License for more details. | |||||
You should have received a copy of the GNU General Public License | |||||
along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
*/ | |||||
#ifndef __JackProfiler__ | |||||
#define __JackProfiler__ | |||||
#include "JackConstants.h" | |||||
#include "JackPlatformPlug.h" | |||||
#include "jack.h" | |||||
#include "jslist.h" | |||||
#include <map> | |||||
#include <string> | |||||
#ifdef JACK_MONITOR | |||||
#include "JackEngineProfiling.h" | |||||
#endif | |||||
namespace Jack | |||||
{ | |||||
struct JackProfilerClient { | |||||
int fRefNum; | |||||
jack_client_t* fClient; | |||||
jack_port_t* fSchedulingPort; | |||||
jack_port_t* fDurationPort; | |||||
JackProfilerClient(jack_client_t* client, const char* name); | |||||
~JackProfilerClient(); | |||||
}; | |||||
/*! | |||||
\brief Server real-time monitoring | |||||
*/ | |||||
class JackProfiler | |||||
{ | |||||
private: | |||||
jack_client_t* fClient; | |||||
jack_port_t* fCPULoadPort; | |||||
jack_port_t* fDriverPeriodPort; | |||||
jack_port_t* fDriverEndPort; | |||||
#ifdef JACK_MONITOR | |||||
JackTimingMeasure* fLastMeasure; | |||||
std::map<std::string, JackProfilerClient*> fClientTable; | |||||
JackMutex fMutex; | |||||
#endif | |||||
public: | |||||
JackProfiler(jack_client_t* jack_client, const JSList* params); | |||||
~JackProfiler(); | |||||
static int Process(jack_nframes_t nframes, void* arg); | |||||
static void ClientRegistration(const char* name, int val, void *arg); | |||||
}; | |||||
} | |||||
#endif |
@@ -226,6 +226,7 @@ int JackServer::SetBufferSize(jack_nframes_t buffer_size) | |||||
return fAudioDriver->Start(); | return fAudioDriver->Start(); | ||||
} else { // Failure: try to restore current value | } else { // Failure: try to restore current value | ||||
jack_error("Cannot SetBufferSize for audio driver, restore current value %ld", current_buffer_size); | jack_error("Cannot SetBufferSize for audio driver, restore current value %ld", current_buffer_size); | ||||
fAudioDriver->SetBufferSize(current_buffer_size); | |||||
fFreewheelDriver->SetBufferSize(current_buffer_size); | fFreewheelDriver->SetBufferSize(current_buffer_size); | ||||
fEngineControl->InitFrameTime(); | fEngineControl->InitFrameTime(); | ||||
fAudioDriver->Start(); | fAudioDriver->Start(); | ||||
@@ -102,7 +102,17 @@ void JackShmMem::operator delete(void* obj) | |||||
void LockMemoryImp(void* ptr, size_t size) | void LockMemoryImp(void* ptr, size_t size) | ||||
{ | { | ||||
if (CHECK_MLOCK(ptr, size)) { | |||||
if (CHECK_MLOCK((char*)ptr, size)) { | |||||
jack_log("Succeeded in locking %u byte memory area", size); | |||||
} else { | |||||
jack_error("Cannot lock down memory area (%s)", strerror(errno)); | |||||
} | |||||
} | |||||
void InitLockMemoryImp(void* ptr, size_t size) | |||||
{ | |||||
if (CHECK_MLOCK((char*)ptr, size)) { | |||||
memset(ptr, 0, size); | |||||
jack_log("Succeeded in locking %u byte memory area", size); | jack_log("Succeeded in locking %u byte memory area", size); | ||||
} else { | } else { | ||||
jack_error("Cannot lock down memory area (%s)", strerror(errno)); | jack_error("Cannot lock down memory area (%s)", strerror(errno)); | ||||
@@ -111,7 +121,7 @@ void LockMemoryImp(void* ptr, size_t size) | |||||
void UnlockMemoryImp(void* ptr, size_t size) | void UnlockMemoryImp(void* ptr, size_t size) | ||||
{ | { | ||||
if (CHECK_MUNLOCK(ptr, size)) { | |||||
if (CHECK_MUNLOCK((char*)ptr, size)) { | |||||
jack_log("Succeeded in unlocking %u byte memory area", size); | jack_log("Succeeded in unlocking %u byte memory area", size); | ||||
} else { | } else { | ||||
jack_error("Cannot unlock down memory area (%s)", strerror(errno)); | jack_error("Cannot unlock down memory area (%s)", strerror(errno)); | ||||
@@ -35,7 +35,10 @@ namespace Jack | |||||
{ | { | ||||
SERVER_EXPORT void LockMemoryImp(void* ptr, size_t size); | SERVER_EXPORT void LockMemoryImp(void* ptr, size_t size); | ||||
SERVER_EXPORT void InitLockMemoryImp(void* ptr, size_t size); | |||||
SERVER_EXPORT void UnlockMemoryImp(void* ptr, size_t size); | SERVER_EXPORT void UnlockMemoryImp(void* ptr, size_t size); | ||||
SERVER_EXPORT void LockAllMemory(); | |||||
SERVER_EXPORT void UnlockAllMemory(); | |||||
class JackMem | class JackMem | ||||
{ | { | ||||
@@ -28,6 +28,7 @@ | |||||
#include <process.h> | #include <process.h> | ||||
#endif | #endif | ||||
using namespace std; | using namespace std; | ||||
namespace Jack { | namespace Jack { | ||||
@@ -38,7 +39,7 @@ namespace Jack { | |||||
int JackTools::GetPID() | int JackTools::GetPID() | ||||
{ | { | ||||
#ifdef WIN32 | #ifdef WIN32 | ||||
return _getpid(); | |||||
return _getpid(); | |||||
#else | #else | ||||
return getpid(); | return getpid(); | ||||
#endif | #endif | ||||
@@ -26,9 +26,12 @@ | |||||
#define __jack_jslist_h__ | #define __jack_jslist_h__ | ||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <jack/systemdeps.h> | #include <jack/systemdeps.h> | ||||
#ifdef sun | |||||
#define __inline__ | |||||
#endif | |||||
typedef struct _JSList JSList; | typedef struct _JSList JSList; | ||||
typedef int (*JCompareFunc) (void* a, void* b); | typedef int (*JCompareFunc) (void* a, void* b); | ||||
@@ -29,8 +29,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
#include <sys/types.h> | #include <sys/types.h> | ||||
#else | #else | ||||
#define __inline__ inline | #define __inline__ inline | ||||
//#define vsnprintf _vsnprintf | |||||
//#define snprintf _snprintf | |||||
typedef char int8_t; | typedef char int8_t; | ||||
typedef unsigned char uint8_t; | typedef unsigned char uint8_t; | ||||
typedef short int16_t; | typedef short int16_t; | ||||
@@ -44,7 +42,7 @@ typedef HANDLE pthread_t; | |||||
typedef int64_t _jack_time_t; | typedef int64_t _jack_time_t; | ||||
#endif // WIN32 */ | #endif // WIN32 */ | ||||
#if defined(__APPLE__) || defined(__linux__) | |||||
#if defined(__APPLE__) || defined(__linux__) || defined(__sun__) || defined(sun) | |||||
#include <inttypes.h> | #include <inttypes.h> | ||||
#include <pthread.h> | #include <pthread.h> | ||||
@@ -30,10 +30,15 @@ | |||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <stdint.h> | #include <stdint.h> | ||||
#include <limits.h> | #include <limits.h> | ||||
#ifdef __linux__ | |||||
#include <endian.h> | #include <endian.h> | ||||
#endif | |||||
#include "memops.h" | #include "memops.h" | ||||
#if defined (__SSE2__) && !defined (__sun__) | |||||
#include <emmintrin.h> | |||||
#endif | |||||
/* Notes about these *_SCALING values. | /* Notes about these *_SCALING values. | ||||
the MAX_<N>BIT values are floating point. when multiplied by | the MAX_<N>BIT values are floating point. when multiplied by | ||||
@@ -162,15 +167,13 @@ | |||||
/* Linear Congruential noise generator. From the music-dsp list | /* Linear Congruential noise generator. From the music-dsp list | ||||
* less random than rand(), but good enough and 10x faster | * less random than rand(), but good enough and 10x faster | ||||
*/ | */ | ||||
static unsigned int seed = 22222; | |||||
inline unsigned int fast_rand() { | inline unsigned int fast_rand() { | ||||
static unsigned int seed = 22222; | |||||
seed = (seed * 96314165) + 907633515; | seed = (seed * 96314165) + 907633515; | ||||
return seed; | return seed; | ||||
} | } | ||||
/* functions for native float sample data */ | /* functions for native float sample data */ | ||||
void sample_move_floatLE_sSs (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip) { | void sample_move_floatLE_sSs (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip) { | ||||
@@ -222,7 +225,6 @@ void sample_move_d32u24_sSs (char *dst, jack_default_audio_sample_t *src, unsign | |||||
float_24u32 (*src, z); | float_24u32 (*src, z); | ||||
#if __BYTE_ORDER == __LITTLE_ENDIAN | #if __BYTE_ORDER == __LITTLE_ENDIAN | ||||
dst[0]=(char)(z>>24); | dst[0]=(char)(z>>24); | ||||
dst[1]=(char)(z>>16); | dst[1]=(char)(z>>16); | ||||
@@ -241,11 +243,57 @@ void sample_move_d32u24_sSs (char *dst, jack_default_audio_sample_t *src, unsign | |||||
void sample_move_d32u24_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) | void sample_move_d32u24_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) | ||||
{ | { | ||||
#if defined (__SSE2__) && !defined (__sun__) | |||||
__m128 int_max = _mm_set1_ps(SAMPLE_24BIT_MAX_F); | |||||
__m128 int_min = _mm_sub_ps(_mm_setzero_ps(), int_max); | |||||
__m128 factor = int_max; | |||||
unsigned long unrolled = nsamples / 4; | |||||
nsamples = nsamples & 3; | |||||
while (unrolled--) { | |||||
__m128 in = _mm_load_ps(src); | |||||
__m128 scaled = _mm_mul_ps(in, factor); | |||||
__m128 clipped = _mm_min_ps(int_max, _mm_max_ps(scaled, int_min)); | |||||
__m128i y = _mm_cvttps_epi32(clipped); | |||||
__m128i shifted = _mm_slli_epi32(y, 8); | |||||
__m128i shuffled1 = _mm_shuffle_epi32(shifted, _MM_SHUFFLE(0, 3, 2, 1)); | |||||
__m128i shuffled2 = _mm_shuffle_epi32(shifted, _MM_SHUFFLE(1, 0, 3, 2)); | |||||
__m128i shuffled3 = _mm_shuffle_epi32(shifted, _MM_SHUFFLE(2, 1, 0, 3)); | |||||
_mm_store_ss((float*)dst, (__m128)shifted); | |||||
dst += dst_skip; | |||||
_mm_store_ss((float*)dst, (__m128)shuffled1); | |||||
dst += dst_skip; | |||||
_mm_store_ss((float*)dst, (__m128)shuffled2); | |||||
dst += dst_skip; | |||||
_mm_store_ss((float*)dst, (__m128)shuffled3); | |||||
dst += dst_skip; | |||||
src+= 4; | |||||
} | |||||
while (nsamples--) { | |||||
__m128 in = _mm_load_ss(src); | |||||
__m128 scaled = _mm_mul_ss(in, factor); | |||||
__m128 clipped = _mm_min_ss(int_max, _mm_max_ss(scaled, int_min)); | |||||
int y = _mm_cvttss_si32(clipped); | |||||
*((int *) dst) = y<<8; | |||||
dst += dst_skip; | |||||
src++; | |||||
} | |||||
#else | |||||
while (nsamples--) { | while (nsamples--) { | ||||
float_24u32 (*src, *((int32_t*) dst)); | float_24u32 (*src, *((int32_t*) dst)); | ||||
dst += dst_skip; | dst += dst_skip; | ||||
src++; | src++; | ||||
} | } | ||||
#endif | |||||
} | } | ||||
void sample_move_dS_s32u24s (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip) | void sample_move_dS_s32u24s (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip) | ||||
@@ -279,6 +327,34 @@ void sample_move_dS_s32u24s (jack_default_audio_sample_t *dst, char *src, unsign | |||||
void sample_move_dS_s32u24 (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip) | void sample_move_dS_s32u24 (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip) | ||||
{ | { | ||||
#if defined (__SSE2__) && !defined (__sun__) | |||||
unsigned long unrolled = nsamples / 4; | |||||
static float inv_sample_max_24bit = 1.0 / SAMPLE_24BIT_SCALING; | |||||
__m128 factor = _mm_set1_ps(inv_sample_max_24bit); | |||||
while (unrolled--) | |||||
{ | |||||
int i1 = *((int *) src); | |||||
src+= src_skip; | |||||
int i2 = *((int *) src); | |||||
src+= src_skip; | |||||
int i3 = *((int *) src); | |||||
src+= src_skip; | |||||
int i4 = *((int *) src); | |||||
src+= src_skip; | |||||
__m128i src = _mm_set_epi32(i1, i2, i3, i4); | |||||
__m128i shifted = _mm_srai_epi32(src, 8); | |||||
__m128 as_float = _mm_cvtepi32_ps(shifted); | |||||
__m128 divided = _mm_mul_ps(as_float, factor); | |||||
_mm_storeu_ps(dst, divided); | |||||
dst += 4; | |||||
} | |||||
nsamples = nsamples & 3; | |||||
#endif | |||||
/* ALERT: signed sign-extension portability !!! */ | /* ALERT: signed sign-extension portability !!! */ | ||||
while (nsamples--) { | while (nsamples--) { | ||||
@@ -579,7 +655,6 @@ void sample_move_dS_s16s (jack_default_audio_sample_t *dst, char *src, unsigned | |||||
} | } | ||||
void sample_move_dS_s16 (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip) | void sample_move_dS_s16 (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip) | ||||
{ | { | ||||
/* ALERT: signed sign-extension portability !!! */ | /* ALERT: signed sign-extension portability !!! */ | ||||
while (nsamples--) { | while (nsamples--) { | ||||
@@ -652,7 +727,6 @@ memcpy_interleave_d16_s16 (char *dst, char *src, unsigned long src_bytes, | |||||
void | void | ||||
memcpy_interleave_d24_s24 (char *dst, char *src, unsigned long src_bytes, | memcpy_interleave_d24_s24 (char *dst, char *src, unsigned long src_bytes, | ||||
unsigned long dst_skip_bytes, unsigned long src_skip_bytes) | unsigned long dst_skip_bytes, unsigned long src_skip_bytes) | ||||
{ | { | ||||
while (src_bytes) { | while (src_bytes) { | ||||
memcpy(dst, src, 3); | memcpy(dst, src, 3); | ||||
@@ -665,7 +739,6 @@ memcpy_interleave_d24_s24 (char *dst, char *src, unsigned long src_bytes, | |||||
void | void | ||||
memcpy_interleave_d32_s32 (char *dst, char *src, unsigned long src_bytes, | memcpy_interleave_d32_s32 (char *dst, char *src, unsigned long src_bytes, | ||||
unsigned long dst_skip_bytes, unsigned long src_skip_bytes) | unsigned long dst_skip_bytes, unsigned long src_skip_bytes) | ||||
{ | { | ||||
while (src_bytes) { | while (src_bytes) { | ||||
*((int *) dst) = *((int *) src); | *((int *) dst) = *((int *) src); |
@@ -27,6 +27,10 @@ extern "C" | |||||
{ | { | ||||
#endif | #endif | ||||
#ifdef sun | |||||
#define __inline__ | |||||
#endif | |||||
typedef enum { | typedef enum { | ||||
None, | None, | ||||
Rectangular, | Rectangular, | ||||
@@ -87,7 +91,6 @@ void sample_merge_d32u24_sS (char *dst, jack_default_audio_sample_t *sr | |||||
static __inline__ void | static __inline__ void | ||||
sample_merge (jack_default_audio_sample_t *dst, jack_default_audio_sample_t *src, unsigned long cnt) | sample_merge (jack_default_audio_sample_t *dst, jack_default_audio_sample_t *src, unsigned long cnt) | ||||
{ | { | ||||
while (cnt--) { | while (cnt--) { | ||||
*dst += *src; | *dst += *src; | ||||
@@ -98,7 +101,6 @@ sample_merge (jack_default_audio_sample_t *dst, jack_default_audio_sample_t *src | |||||
static __inline__ void | static __inline__ void | ||||
sample_memcpy (jack_default_audio_sample_t *dst, jack_default_audio_sample_t *src, unsigned long cnt) | sample_memcpy (jack_default_audio_sample_t *dst, jack_default_audio_sample_t *src, unsigned long cnt) | ||||
{ | { | ||||
memcpy (dst, src, cnt * sizeof (jack_default_audio_sample_t)); | memcpy (dst, src, cnt * sizeof (jack_default_audio_sample_t)); | ||||
} | } |
@@ -28,6 +28,10 @@ extern "C" | |||||
*/ | */ | ||||
#ifdef USE_POSIX_SHM | #ifdef USE_POSIX_SHM | ||||
#ifndef NAME_MAX | |||||
#define NAME_MAX 255 | |||||
#endif | |||||
#ifndef SHM_NAME_MAX | #ifndef SHM_NAME_MAX | ||||
#define SHM_NAME_MAX NAME_MAX | #define SHM_NAME_MAX NAME_MAX | ||||
#endif | #endif | ||||
@@ -21,15 +21,18 @@ def create_jack_process_obj(bld, target, sources, uselib = None): | |||||
env_includes = ['../macosx', '../posix', '../macosx/coreaudio'] | env_includes = ['../macosx', '../posix', '../macosx/coreaudio'] | ||||
if bld.env['IS_LINUX']: | if bld.env['IS_LINUX']: | ||||
env_includes = ['../linux', '../posix', '../linux/alsa'] | env_includes = ['../linux', '../posix', '../linux/alsa'] | ||||
if bld.env['IS_SUN']: | |||||
env_includes = ['../solaris', '../posix', '../solaris/oss'] | |||||
process.includes = ['.'] + env_includes + ['jack', '..'] | process.includes = ['.'] + env_includes + ['jack', '..'] | ||||
process.name = target | process.name = target | ||||
process.target = target | process.target = target | ||||
process.source = sources | process.source = sources | ||||
process.env.append_value("CPPFLAGS", "-fvisibility=hidden") | |||||
if bld.env['IS_LINUX']: | |||||
process.env.append_value("CPPFLAGS", "-fvisibility=hidden") | |||||
if bld.env['IS_MACOSX']: | if bld.env['IS_MACOSX']: | ||||
process.env.append_value("CPPFLAGS", "-mmacosx-version-min=10.4 -arch i386 -arch ppc") | process.env.append_value("CPPFLAGS", "-mmacosx-version-min=10.4 -arch i386 -arch ppc") | ||||
#process.env.append_value("LINKFLAGS", "-arch i386 -arch ppc") | #process.env.append_value("LINKFLAGS", "-arch i386 -arch ppc") | ||||
process.env.append_value("LINKFLAGS", "") | |||||
process.env.append_value("CPPFLAGS", "-fvisibility=hidden") | |||||
process.install_path = '${ADDON_DIR}/' | process.install_path = '${ADDON_DIR}/' | ||||
process.uselib_local = uselib.name | process.uselib_local = uselib.name | ||||
return process | return process | ||||
@@ -58,6 +61,7 @@ def build(bld): | |||||
'timestamps.c', | 'timestamps.c', | ||||
'JackTools.cpp', | 'JackTools.cpp', | ||||
'JackMessageBuffer.cpp', | 'JackMessageBuffer.cpp', | ||||
'JackEngineProfiling.cpp', | |||||
] | ] | ||||
includes = ['.', './jack', '..'] | includes = ['.', './jack', '..'] | ||||
@@ -70,12 +74,23 @@ def build(bld): | |||||
'../posix/JackFifo.cpp', | '../posix/JackFifo.cpp', | ||||
'../posix/JackProcessSync.cpp', | '../posix/JackProcessSync.cpp', | ||||
'../posix/JackSocket.cpp', | '../posix/JackSocket.cpp', | ||||
'../linux/JackLinuxTime.c', | |||||
'../linux/JackLinuxTime.c', | |||||
] | ] | ||||
includes = ['../linux', '../posix'] + includes | includes = ['../linux', '../posix'] + includes | ||||
uselib.append('RT') | uselib.append('RT') | ||||
uselib.append('DL') | uselib.append('DL') | ||||
if bld.env['IS_SUN']: | |||||
common_libsources += [ | |||||
'../posix/JackPosixThread.cpp', | |||||
'../posix/JackFifo.cpp', | |||||
'../posix/JackProcessSync.cpp', | |||||
'../posix/JackSocket.cpp', | |||||
'../solaris/JackSolarisTime.c', | |||||
] | |||||
includes = ['../solaris', '../posix'] + includes | |||||
uselib.append('RT') | |||||
if bld.env['IS_MACOSX']: | if bld.env['IS_MACOSX']: | ||||
common_libsources += [ | common_libsources += [ | ||||
'../posix/JackProcessSync.cpp', | '../posix/JackProcessSync.cpp', | ||||
@@ -83,7 +98,7 @@ def build(bld): | |||||
'../macosx/JackMachThread.cpp', | '../macosx/JackMachThread.cpp', | ||||
'../macosx/JackMachSemaphore.cpp', | '../macosx/JackMachSemaphore.cpp', | ||||
'../macosx/JackMachPort.cpp', | '../macosx/JackMachPort.cpp', | ||||
'../macosx/JackMachTime.c', | |||||
'../macosx/JackMachTime.c', | |||||
] | ] | ||||
includes = ['../macosx', '../macosx/RPC', '../posix'] + includes | includes = ['../macosx', '../macosx/RPC', '../posix'] + includes | ||||
@@ -125,6 +140,14 @@ def build(bld): | |||||
'../posix/JackNetUnixSocket.cpp', | '../posix/JackNetUnixSocket.cpp', | ||||
] | ] | ||||
if bld.env['IS_SUN']: | |||||
serverlib.source += [ | |||||
'../posix/JackSocketServerChannel.cpp', | |||||
'../posix/JackSocketNotifyChannel.cpp', | |||||
'../posix/JackSocketServerNotifyChannel.cpp', | |||||
'../posix/JackNetUnixSocket.cpp', | |||||
] | |||||
if bld.env['IS_MACOSX']: | if bld.env['IS_MACOSX']: | ||||
serverlib.source += [ | serverlib.source += [ | ||||
'../macosx/JackMachServerChannel.cpp', | '../macosx/JackMachServerChannel.cpp', | ||||
@@ -136,12 +159,19 @@ def build(bld): | |||||
] | ] | ||||
serverlib.vnum = bld.env['JACK_API_VERSION'] | serverlib.vnum = bld.env['JACK_API_VERSION'] | ||||
serverlib.env.append_value("CPPFLAGS", "-fvisibility=hidden") | |||||
if bld.env['IS_LINUX']: | |||||
serverlib.env.append_value("CPPFLAGS", "-fvisibility=hidden") | |||||
if bld.env['IS_MACOSX']: | if bld.env['IS_MACOSX']: | ||||
serverlib.env.append_value("CPPFLAGS", "-fvisibility=hidden") | |||||
serverlib.env.append_value("CPPFLAGS", "-mmacosx-version-min=10.4 -arch i386 -arch ppc") | serverlib.env.append_value("CPPFLAGS", "-mmacosx-version-min=10.4 -arch i386 -arch ppc") | ||||
#serverlib.env.append_value("LINKFLAGS", "-framework CoreAudio -framework vecLib -single_module -arch i386 -arch ppc") | #serverlib.env.append_value("LINKFLAGS", "-framework CoreAudio -framework vecLib -single_module -arch i386 -arch ppc") | ||||
serverlib.env.append_value("LINKFLAGS", "-framework CoreAudio -framework vecLib -single_module") | serverlib.env.append_value("LINKFLAGS", "-framework CoreAudio -framework vecLib -single_module") | ||||
serverlib.env.append_value("LINKFLAGS", "-compatibility_version 1 -current_version 1") | |||||
serverlib.env.append_value("LINKFLAGS", "-compatibility_version 1 -current_version 1") | |||||
if bld.env['IS_SUN']: | |||||
serverlib.env.append_value("LINKFLAGS", "-lnsl -lsocket") | |||||
clientlib = bld.new_task_gen('cxx', 'shlib') | clientlib = bld.new_task_gen('cxx', 'shlib') | ||||
clientlib.features.append('cc') | clientlib.features.append('cc') | ||||
@@ -165,6 +195,12 @@ def build(bld): | |||||
'../posix/JackPosixServerLaunch.cpp', | '../posix/JackPosixServerLaunch.cpp', | ||||
] | ] | ||||
if bld.env['IS_SUN']: | |||||
clientlib.source += [ | |||||
'../posix/JackSocketClientChannel.cpp', | |||||
'../posix/JackPosixServerLaunch.cpp', | |||||
] | |||||
if bld.env['IS_MACOSX']: | if bld.env['IS_MACOSX']: | ||||
clientlib.source += [ | clientlib.source += [ | ||||
'../macosx/JackMachClientChannel.cpp', | '../macosx/JackMachClientChannel.cpp', | ||||
@@ -174,15 +210,24 @@ def build(bld): | |||||
] | ] | ||||
clientlib.vnum = bld.env['JACK_API_VERSION'] | clientlib.vnum = bld.env['JACK_API_VERSION'] | ||||
clientlib.env.append_value("CPPFLAGS", "-fvisibility=hidden") | |||||
if bld.env['IS_LINUX']: | |||||
clientlib.env.append_value("CPPFLAGS", "-fvisibility=hidden") | |||||
if bld.env['IS_MACOSX']: | if bld.env['IS_MACOSX']: | ||||
clientlib.env.append_value("CPPFLAGS", "-fvisibility=hidden") | |||||
clientlib.env.append_value("CPPFLAGS", "-mmacosx-version-min=10.4 -arch i386 -arch ppc") | clientlib.env.append_value("CPPFLAGS", "-mmacosx-version-min=10.4 -arch i386 -arch ppc") | ||||
#clientlib.env.append_value("LINKFLAGS", "-framework CoreAudio -framework vecLib -single_module -arch i386 -arch ppc") | |||||
clientlib.env.append_value("LINKFLAGS", "-framework CoreAudio -framework vecLib -single_module") | |||||
#clientlib.env.append_value("LINKFLAGS", "-framework CoreAudio -framework vecLib -single_module -arch i386 -arch ppc" | |||||
clientlib.env.append_value("LINKFLAGS", "-framework CoreAudio -framework vecLib -single_module") | |||||
clientlib.env.append_value("LINKFLAGS", "-compatibility_version 1 -current_version 1") | clientlib.env.append_value("LINKFLAGS", "-compatibility_version 1 -current_version 1") | ||||
if bld.env['IS_SUN']: | |||||
clientlib.env.append_value("LINKFLAGS", "-lnsl -lsocket") | |||||
create_jack_process_obj(bld, 'netmanager', 'JackNetManager.cpp', serverlib) | create_jack_process_obj(bld, 'netmanager', 'JackNetManager.cpp', serverlib) | ||||
create_jack_process_obj(bld, 'profiler', 'JackProfiler.cpp', serverlib) | |||||
net_adapter_sources = [ | net_adapter_sources = [ | ||||
'JackResampler.cpp', | 'JackResampler.cpp', | ||||
'JackLibSampleRateResampler.cpp', | 'JackLibSampleRateResampler.cpp', | ||||
@@ -201,7 +246,7 @@ def build(bld): | |||||
'JackAudioAdapter.cpp', | 'JackAudioAdapter.cpp', | ||||
'JackAudioAdapterInterface.cpp', | 'JackAudioAdapterInterface.cpp', | ||||
'JackAudioAdapterFactory.cpp', | 'JackAudioAdapterFactory.cpp', | ||||
] | |||||
] | |||||
if bld.env['BUILD_ADAPTER'] and bld.env['IS_MACOSX']: | if bld.env['BUILD_ADAPTER'] and bld.env['IS_MACOSX']: | ||||
audio_adapter_sources += ['../macosx/coreaudio/JackCoreAudioAdapter.cpp'] | audio_adapter_sources += ['../macosx/coreaudio/JackCoreAudioAdapter.cpp'] | ||||
@@ -214,6 +259,11 @@ def build(bld): | |||||
process = create_jack_process_obj(bld, 'audioadapter', audio_adapter_sources, serverlib) | process = create_jack_process_obj(bld, 'audioadapter', audio_adapter_sources, serverlib) | ||||
process.uselib = ['ALSA', 'SAMPLERATE'] | process.uselib = ['ALSA', 'SAMPLERATE'] | ||||
if bld.env['BUILD_ADAPTER'] and bld.env['IS_SUN']: | |||||
audio_adapter_sources += ['../solaris/oss/JackOSSAdapter.cpp', 'memops.c'] | |||||
process = create_jack_process_obj(bld, 'audioadapter', audio_adapter_sources, serverlib) | |||||
process.uselib = 'SAMPLERATE' | |||||
#audio_adapter_sources += ['../windows/JackPortAudioAdapter.cpp'] | #audio_adapter_sources += ['../windows/JackPortAudioAdapter.cpp'] | ||||
#process = create_jack_process_obj(bld, 'audioadapter', audio_adapter_sources, serverlib) | #process = create_jack_process_obj(bld, 'audioadapter', audio_adapter_sources, serverlib) | ||||
@@ -0,0 +1,92 @@ | |||||
/** @file cpu_load.c | |||||
* | |||||
*/ | |||||
#include <stdio.h> | |||||
#include <errno.h> | |||||
#include <stdlib.h> | |||||
#include <string.h> | |||||
#include <math.h> | |||||
#include <signal.h> | |||||
#ifndef WIN32 | |||||
#include <unistd.h> | |||||
#endif | |||||
#include <jack/jack.h> | |||||
jack_client_t *client; | |||||
static void signal_handler ( int sig ) | |||||
{ | |||||
jack_client_close ( client ); | |||||
fprintf ( stderr, "signal received, exiting ...\n" ); | |||||
exit ( 0 ); | |||||
} | |||||
/** | |||||
* JACK calls this shutdown_callback if the server ever shuts down or | |||||
* decides to disconnect the client. | |||||
*/ | |||||
void | |||||
jack_shutdown ( void *arg ) | |||||
{ | |||||
exit ( 1 ); | |||||
} | |||||
int | |||||
main ( int argc, char *argv[] ) | |||||
{ | |||||
jack_options_t options = JackNullOption; | |||||
jack_status_t status; | |||||
/* open a client connection to the JACK server */ | |||||
client = jack_client_open ("jack_cpu_load", options, &status); | |||||
if ( client == NULL ) | |||||
{ | |||||
fprintf ( stderr, "jack_client_open() failed, " | |||||
"status = 0x%2.0x\n", status ); | |||||
if ( status & JackServerFailed ) | |||||
{ | |||||
fprintf ( stderr, "Unable to connect to JACK server\n" ); | |||||
} | |||||
exit ( 1 ); | |||||
} | |||||
jack_on_shutdown ( client, jack_shutdown, 0 ); | |||||
/* Tell the JACK server that we are ready to roll. Our | |||||
* process() callback will start running now. */ | |||||
if ( jack_activate ( client ) ) | |||||
{ | |||||
fprintf ( stderr, "cannot activate client" ); | |||||
exit ( 1 ); | |||||
} | |||||
/* install a signal handler to properly quits jack client */ | |||||
#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) | |||||
{ | |||||
printf("jack DSP load %f\n", jack_cpu_load(client)); | |||||
#ifdef WIN32 | |||||
Sleep ( 1000 ); | |||||
#else | |||||
sleep ( 1 ); | |||||
#endif | |||||
} | |||||
jack_client_close ( client ); | |||||
exit ( 0 ); | |||||
} |
@@ -53,8 +53,8 @@ process (jack_nframes_t nframes, void *arg) | |||||
paTestData *data = (paTestData*)arg; | paTestData *data = (paTestData*)arg; | ||||
int i; | int i; | ||||
out1 = jack_port_get_buffer (output_port1, nframes); | |||||
out2 = jack_port_get_buffer (output_port2, nframes); | |||||
out1 = (jack_default_audio_sample_t*)jack_port_get_buffer (output_port1, nframes); | |||||
out2 = (jack_default_audio_sample_t*)jack_port_get_buffer (output_port2, nframes); | |||||
for( i=0; i<nframes; i++ ) | for( i=0; i<nframes; i++ ) | ||||
{ | { | ||||
@@ -94,7 +94,8 @@ main (int argc, char *argv[]) | |||||
client_name = argv[1]; | client_name = argv[1]; | ||||
if (argc >= 3) { /* server name specified? */ | if (argc >= 3) { /* server name specified? */ | ||||
server_name = argv[2]; | server_name = argv[2]; | ||||
options |= JackServerName; | |||||
int my_option = JackNullOption | JackServerName; | |||||
options = (jack_options_t)my_option; | |||||
} | } | ||||
} else { /* use basename of argv[0] */ | } else { /* use basename of argv[0] */ | ||||
client_name = strrchr(argv[0], '/'); | client_name = strrchr(argv[0], '/'); | ||||
@@ -19,6 +19,7 @@ example_programs = { | |||||
'jack_evmon' : 'evmon.c', | 'jack_evmon' : 'evmon.c', | ||||
'jack_monitor_client' : 'monitor_client.c', | 'jack_monitor_client' : 'monitor_client.c', | ||||
'jack_thru' : 'thru_client.c', | 'jack_thru' : 'thru_client.c', | ||||
'jack_cpu_load' : 'cpu_load.c', | |||||
'jack_server_control' : 'server_control.cpp', | 'jack_server_control' : 'server_control.cpp', | ||||
} | } | ||||
@@ -51,6 +52,8 @@ def build(bld): | |||||
os_incdir = ['../linux', '../posix'] | os_incdir = ['../linux', '../posix'] | ||||
if bld.env['IS_MACOSX']: | if bld.env['IS_MACOSX']: | ||||
os_incdir = ['../macosx', '../posix'] | os_incdir = ['../macosx', '../posix'] | ||||
if bld.env['IS_SUN']: | |||||
os_incdir = ['../solaris', '../posix'] | |||||
for example_program, example_program_source in example_programs.items(): | for example_program, example_program_source in example_programs.items(): | ||||
prog = bld.new_task_gen('cxx', 'program') | prog = bld.new_task_gen('cxx', 'program') | ||||
prog.features.append('cc') | prog.features.append('cc') | ||||
@@ -62,6 +65,8 @@ def build(bld): | |||||
prog.env.append_value("LINKFLAGS", "") | prog.env.append_value("LINKFLAGS", "") | ||||
if bld.env['IS_LINUX']: | if bld.env['IS_LINUX']: | ||||
prog.uselib = 'RT' | prog.uselib = 'RT' | ||||
if bld.env['IS_SUN']: | |||||
prog.env.append_value("LINKFLAGS", "-lm") | |||||
if example_program == 'jack_server_control': | if example_program == 'jack_server_control': | ||||
prog.uselib_local = 'serverlib' | prog.uselib_local = 'serverlib' | ||||
else: | else: | ||||
@@ -92,10 +97,9 @@ def build(bld): | |||||
prog.env.append_value("CPPFLAGS", "-mmacosx-version-min=10.4 -arch i386 -arch ppc") | prog.env.append_value("CPPFLAGS", "-mmacosx-version-min=10.4 -arch i386 -arch ppc") | ||||
#prog.env.append_value("LINKFLAGS", "-arch i386 -arch ppc") | #prog.env.append_value("LINKFLAGS", "-arch i386 -arch ppc") | ||||
prog.env.append_value("LINKFLAGS", "") | prog.env.append_value("LINKFLAGS", "") | ||||
prog.uselib = 'SNDFILE' | |||||
if bld.env['IS_LINUX']: | if bld.env['IS_LINUX']: | ||||
prog.uselib = 'RT SNDFILE' | prog.uselib = 'RT SNDFILE' | ||||
if bld.env['IS_MACOSX']: | |||||
prog.uselib = 'SNDFILE' | |||||
prog.uselib_local = 'clientlib' | prog.uselib_local = 'clientlib' | ||||
prog.target = 'jack_rec' | prog.target = 'jack_rec' | ||||
@@ -109,6 +113,8 @@ def build(bld): | |||||
lib.env.append_value("CPPFLAGS", "-mmacosx-version-min=10.4 -arch i386 -arch ppc") | lib.env.append_value("CPPFLAGS", "-mmacosx-version-min=10.4 -arch i386 -arch ppc") | ||||
#lib.env.append_value("LINKFLAGS", "-arch i386 -arch ppc") | #lib.env.append_value("LINKFLAGS", "-arch i386 -arch ppc") | ||||
lib.env.append_value("LINKFLAGS", "") | lib.env.append_value("LINKFLAGS", "") | ||||
if bld.env['IS_SUN']: | |||||
lib.env.append_value("LINKFLAGS", "-lm") | |||||
lib.uselib_local = 'serverlib' | lib.uselib_local = 'serverlib' | ||||
lib.install_path = '${ADDON_DIR}/' | lib.install_path = '${ADDON_DIR}/' | ||||
@@ -40,7 +40,7 @@ def build(bld): | |||||
'alsa/alsa_rawmidi.c', | 'alsa/alsa_rawmidi.c', | ||||
'alsa/alsa_seqmidi.c', | 'alsa/alsa_seqmidi.c', | ||||
'alsa/alsa_midi_jackmp.cpp', | 'alsa/alsa_midi_jackmp.cpp', | ||||
'alsa/memops.c', | |||||
'../common/memops.c', | |||||
'alsa/generic_hw.c', | 'alsa/generic_hw.c', | ||||
'alsa/hdsp.c', | 'alsa/hdsp.c', | ||||
'alsa/hammerfall.c', | 'alsa/hammerfall.c', | ||||
@@ -23,7 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
#include <mach/mach_time.h> | #include <mach/mach_time.h> | ||||
#include <unistd.h> | #include <unistd.h> | ||||
double __jack_time_ratio; | |||||
static double __jack_time_ratio; | |||||
SERVER_EXPORT void JackSleep(long usec) | SERVER_EXPORT void JackSleep(long usec) | ||||
{ | { | ||||
@@ -481,8 +481,6 @@ | |||||
4B80D7EB0BA0D17400F035BB /* JackMidiPort.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B80D7E50BA0D17400F035BB /* JackMidiPort.h */; }; | 4B80D7EB0BA0D17400F035BB /* JackMidiPort.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B80D7E50BA0D17400F035BB /* JackMidiPort.h */; }; | ||||
4B80D7EC0BA0D17400F035BB /* JackMidiPort.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B80D7E60BA0D17400F035BB /* JackMidiPort.cpp */; }; | 4B80D7EC0BA0D17400F035BB /* JackMidiPort.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B80D7E60BA0D17400F035BB /* JackMidiPort.cpp */; }; | ||||
4B80D7ED0BA0D17400F035BB /* JackMidiAPI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B80D7E70BA0D17400F035BB /* JackMidiAPI.cpp */; }; | 4B80D7ED0BA0D17400F035BB /* JackMidiAPI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B80D7E70BA0D17400F035BB /* JackMidiAPI.cpp */; }; | ||||
4B8F3D4B0E06C4A10096D19C /* JackEngineTiming.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B8F3D490E06C4A10096D19C /* JackEngineTiming.cpp */; }; | |||||
4B8F3D4C0E06C4A10096D19C /* JackEngineTiming.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B8F3D4A0E06C4A10096D19C /* JackEngineTiming.h */; }; | |||||
4B93F1990E87992100E4ECCD /* JackPosixThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6A20E703B2E0066E42F /* JackPosixThread.cpp */; }; | 4B93F1990E87992100E4ECCD /* JackPosixThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6A20E703B2E0066E42F /* JackPosixThread.cpp */; }; | ||||
4B93F19A0E87992200E4ECCD /* JackPosixThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6A30E703B2E0066E42F /* JackPosixThread.h */; }; | 4B93F19A0E87992200E4ECCD /* JackPosixThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6A30E703B2E0066E42F /* JackPosixThread.h */; }; | ||||
4B93F19B0E87992300E4ECCD /* JackProcessSync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6AA0E703B690066E42F /* JackProcessSync.cpp */; }; | 4B93F19B0E87992300E4ECCD /* JackProcessSync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6AA0E703B690066E42F /* JackProcessSync.cpp */; }; | ||||
@@ -512,11 +510,11 @@ | |||||
4BA7BDD00DC22F4500AA3457 /* Jackservermp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BA7BDCB0DC22F4500AA3457 /* Jackservermp.framework */; }; | 4BA7BDD00DC22F4500AA3457 /* Jackservermp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BA7BDCB0DC22F4500AA3457 /* Jackservermp.framework */; }; | ||||
4BA7BDD10DC22F4500AA3457 /* Jackservermp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BA7BDCB0DC22F4500AA3457 /* Jackservermp.framework */; }; | 4BA7BDD10DC22F4500AA3457 /* Jackservermp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BA7BDCB0DC22F4500AA3457 /* Jackservermp.framework */; }; | ||||
4BA7BDD20DC22F4500AA3457 /* Jackservermp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BA7BDCB0DC22F4500AA3457 /* Jackservermp.framework */; }; | 4BA7BDD20DC22F4500AA3457 /* Jackservermp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BA7BDCB0DC22F4500AA3457 /* Jackservermp.framework */; }; | ||||
4BA7BE0F0DC232A400AA3457 /* Jackservermp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B35C4FC0D4731D1000DE7AE /* Jackservermp.framework */; }; | |||||
4BA7BE1A0DC2347500AA3457 /* Jackservermp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B35C4FC0D4731D1000DE7AE /* Jackservermp.framework */; }; | |||||
4BA7BE200DC234FB00AA3457 /* Jackservermp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B35C4FC0D4731D1000DE7AE /* Jackservermp.framework */; }; | |||||
4BA7BE240DC2350D00AA3457 /* Jackservermp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B35C4FC0D4731D1000DE7AE /* Jackservermp.framework */; }; | |||||
4BA7BE270DC2352A00AA3457 /* Jackservermp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B35C4FC0D4731D1000DE7AE /* Jackservermp.framework */; }; | |||||
4BA7BE0F0DC232A400AA3457 /* Jackdmp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B35C4FC0D4731D1000DE7AE /* Jackdmp.framework */; }; | |||||
4BA7BE1A0DC2347500AA3457 /* Jackdmp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B35C4FC0D4731D1000DE7AE /* Jackdmp.framework */; }; | |||||
4BA7BE200DC234FB00AA3457 /* Jackdmp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B35C4FC0D4731D1000DE7AE /* Jackdmp.framework */; }; | |||||
4BA7BE240DC2350D00AA3457 /* Jackdmp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B35C4FC0D4731D1000DE7AE /* Jackdmp.framework */; }; | |||||
4BA7BE270DC2352A00AA3457 /* Jackdmp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B35C4FC0D4731D1000DE7AE /* Jackdmp.framework */; }; | |||||
4BA7FECA0D8E76650017FF73 /* control.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BA7FEC80D8E76650017FF73 /* control.c */; }; | 4BA7FECA0D8E76650017FF73 /* control.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BA7FEC80D8E76650017FF73 /* control.c */; }; | ||||
4BAB95B80B9E20B800A0C723 /* JackPortType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BAB95B60B9E20B800A0C723 /* JackPortType.cpp */; }; | 4BAB95B80B9E20B800A0C723 /* JackPortType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BAB95B60B9E20B800A0C723 /* JackPortType.cpp */; }; | ||||
4BAB95B90B9E20B800A0C723 /* JackPortType.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BAB95B70B9E20B800A0C723 /* JackPortType.h */; }; | 4BAB95B90B9E20B800A0C723 /* JackPortType.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BAB95B70B9E20B800A0C723 /* JackPortType.h */; }; | ||||
@@ -527,6 +525,10 @@ | |||||
4BB9D4B30E2610B300351653 /* JackTransportEngine.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BD4B4D409BACD9600750C0F /* JackTransportEngine.h */; }; | 4BB9D4B30E2610B300351653 /* JackTransportEngine.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BD4B4D409BACD9600750C0F /* JackTransportEngine.h */; }; | ||||
4BB9D4B40E2610B400351653 /* JackTransportEngine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BD4B4D509BACD9600750C0F /* JackTransportEngine.cpp */; }; | 4BB9D4B40E2610B400351653 /* JackTransportEngine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BD4B4D509BACD9600750C0F /* JackTransportEngine.cpp */; }; | ||||
4BB9D4E40E26112900351653 /* JackEngineControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B6F7AEC0CD0CDBD00F48A9D /* JackEngineControl.cpp */; }; | 4BB9D4E40E26112900351653 /* JackEngineControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B6F7AEC0CD0CDBD00F48A9D /* JackEngineControl.cpp */; }; | ||||
4BBAE4100F42FA6100B8BD3F /* JackEngineProfiling.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BBAE40E0F42FA6100B8BD3F /* JackEngineProfiling.h */; }; | |||||
4BBAE4110F42FA6100B8BD3F /* JackEngineProfiling.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BBAE40F0F42FA6100B8BD3F /* JackEngineProfiling.cpp */; }; | |||||
4BBAE4120F42FA6100B8BD3F /* JackEngineProfiling.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BBAE40E0F42FA6100B8BD3F /* JackEngineProfiling.h */; }; | |||||
4BBAE4130F42FA6100B8BD3F /* JackEngineProfiling.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BBAE40F0F42FA6100B8BD3F /* JackEngineProfiling.cpp */; }; | |||||
4BBB00D30E72614F0018AB1B /* JackPortAudioDevices.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BBB00CF0E72614F0018AB1B /* JackPortAudioDevices.cpp */; }; | 4BBB00D30E72614F0018AB1B /* JackPortAudioDevices.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BBB00CF0E72614F0018AB1B /* JackPortAudioDevices.cpp */; }; | ||||
4BBB00D40E72614F0018AB1B /* JackPortAudioDevices.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BBB00D00E72614F0018AB1B /* JackPortAudioDevices.h */; }; | 4BBB00D40E72614F0018AB1B /* JackPortAudioDevices.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BBB00D00E72614F0018AB1B /* JackPortAudioDevices.h */; }; | ||||
4BBB00D50E72614F0018AB1B /* JackPortAudioDriver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BBB00D10E72614F0018AB1B /* JackPortAudioDriver.cpp */; }; | 4BBB00D50E72614F0018AB1B /* JackPortAudioDriver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BBB00D10E72614F0018AB1B /* JackPortAudioDriver.cpp */; }; | ||||
@@ -1127,8 +1129,6 @@ | |||||
4B05A05D0DF72BC000840F4C /* JackAlsaDriver.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackAlsaDriver.cpp; path = ../linux/alsa/JackAlsaDriver.cpp; sourceTree = SOURCE_ROOT; }; | 4B05A05D0DF72BC000840F4C /* JackAlsaDriver.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackAlsaDriver.cpp; path = ../linux/alsa/JackAlsaDriver.cpp; sourceTree = SOURCE_ROOT; }; | ||||
4B05A05E0DF72BC000840F4C /* JackAlsaDriver.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackAlsaDriver.h; path = ../linux/alsa/JackAlsaDriver.h; sourceTree = SOURCE_ROOT; }; | 4B05A05E0DF72BC000840F4C /* JackAlsaDriver.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackAlsaDriver.h; path = ../linux/alsa/JackAlsaDriver.h; sourceTree = SOURCE_ROOT; }; | ||||
4B05A05F0DF72BC000840F4C /* jslist.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = jslist.h; path = ../linux/alsa/jslist.h; sourceTree = SOURCE_ROOT; }; | 4B05A05F0DF72BC000840F4C /* jslist.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = jslist.h; path = ../linux/alsa/jslist.h; sourceTree = SOURCE_ROOT; }; | ||||
4B05A0600DF72BC000840F4C /* memops.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = memops.c; path = ../linux/alsa/memops.c; sourceTree = SOURCE_ROOT; }; | |||||
4B05A0610DF72BC000840F4C /* memops.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = memops.h; path = ../linux/alsa/memops.h; sourceTree = SOURCE_ROOT; }; | |||||
4B05A0620DF72BC000840F4C /* midi_pack.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = midi_pack.h; path = ../linux/alsa/midi_pack.h; sourceTree = SOURCE_ROOT; }; | 4B05A0620DF72BC000840F4C /* midi_pack.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = midi_pack.h; path = ../linux/alsa/midi_pack.h; sourceTree = SOURCE_ROOT; }; | ||||
4B05A0630DF72BC000840F4C /* midi_unpack.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = midi_unpack.h; path = ../linux/alsa/midi_unpack.h; sourceTree = SOURCE_ROOT; }; | 4B05A0630DF72BC000840F4C /* midi_unpack.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = midi_unpack.h; path = ../linux/alsa/midi_unpack.h; sourceTree = SOURCE_ROOT; }; | ||||
4B05A0640DF72BC000840F4C /* usx2y.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = usx2y.c; path = ../linux/alsa/usx2y.c; sourceTree = SOURCE_ROOT; }; | 4B05A0640DF72BC000840F4C /* usx2y.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = usx2y.c; path = ../linux/alsa/usx2y.c; sourceTree = SOURCE_ROOT; }; | ||||
@@ -1161,7 +1161,7 @@ | |||||
4B0A28E60D52073D002EFF74 /* jack_thread_wait */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_thread_wait; sourceTree = BUILT_PRODUCTS_DIR; }; | 4B0A28E60D52073D002EFF74 /* jack_thread_wait */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_thread_wait; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
4B0A28EC0D520852002EFF74 /* tw.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tw.c; path = "../example-clients/tw.c"; sourceTree = SOURCE_ROOT; }; | 4B0A28EC0D520852002EFF74 /* tw.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tw.c; path = "../example-clients/tw.c"; sourceTree = SOURCE_ROOT; }; | ||||
4B0A292D0D52108E002EFF74 /* jack_thread_wait */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_thread_wait; sourceTree = BUILT_PRODUCTS_DIR; }; | 4B0A292D0D52108E002EFF74 /* jack_thread_wait */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_thread_wait; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
4B19B3000E23620F00DD4A82 /* audioadapter.so */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = audioadapter.so; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4B19B3000E23620F00DD4A82 /* netmanager.so */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = netmanager.so; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4B19B3060E2362E700DD4A82 /* JackAudioAdapter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackAudioAdapter.cpp; path = ../common/JackAudioAdapter.cpp; sourceTree = SOURCE_ROOT; }; | 4B19B3060E2362E700DD4A82 /* JackAudioAdapter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackAudioAdapter.cpp; path = ../common/JackAudioAdapter.cpp; sourceTree = SOURCE_ROOT; }; | ||||
4B19B3070E2362E700DD4A82 /* JackAudioAdapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackAudioAdapter.h; path = ../common/JackAudioAdapter.h; sourceTree = SOURCE_ROOT; }; | 4B19B3070E2362E700DD4A82 /* JackAudioAdapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackAudioAdapter.h; path = ../common/JackAudioAdapter.h; sourceTree = SOURCE_ROOT; }; | ||||
4B19B3080E2362E700DD4A82 /* JackAudioAdapterInterface.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackAudioAdapterInterface.cpp; path = ../common/JackAudioAdapterInterface.cpp; sourceTree = SOURCE_ROOT; }; | 4B19B3080E2362E700DD4A82 /* JackAudioAdapterInterface.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackAudioAdapterInterface.cpp; path = ../common/JackAudioAdapterInterface.cpp; sourceTree = SOURCE_ROOT; }; | ||||
@@ -1173,7 +1173,7 @@ | |||||
4B2C28F908DAD01E00249230 /* JackGlobals.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackGlobals.cpp; path = ../common/JackGlobals.cpp; sourceTree = SOURCE_ROOT; }; | 4B2C28F908DAD01E00249230 /* JackGlobals.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackGlobals.cpp; path = ../common/JackGlobals.cpp; sourceTree = SOURCE_ROOT; }; | ||||
4B35C4250D4731D1000DE7AE /* jackdmp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jackdmp; sourceTree = BUILT_PRODUCTS_DIR; }; | 4B35C4250D4731D1000DE7AE /* jackdmp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jackdmp; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
4B35C4830D4731D1000DE7AE /* Jackmp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Jackmp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; | 4B35C4830D4731D1000DE7AE /* Jackmp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Jackmp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
4B35C4FC0D4731D1000DE7AE /* Jackservermp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Jackservermp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4B35C4FC0D4731D1000DE7AE /* Jackdmp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Jackdmp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4B35C5140D4731D1000DE7AE /* jack_midiseq */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midiseq; sourceTree = BUILT_PRODUCTS_DIR; }; | 4B35C5140D4731D1000DE7AE /* jack_midiseq */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midiseq; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
4B35C5200D4731D1000DE7AE /* jack_midisine */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midisine; sourceTree = BUILT_PRODUCTS_DIR; }; | 4B35C5200D4731D1000DE7AE /* jack_midisine */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midisine; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
4B35C52C0D4731D1000DE7AE /* jack_metro */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_metro; sourceTree = BUILT_PRODUCTS_DIR; }; | 4B35C52C0D4731D1000DE7AE /* jack_metro */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_metro; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
@@ -1197,19 +1197,19 @@ | |||||
4B35C6290D4731D2000DE7AE /* jack_portaudio.so */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = jack_portaudio.so; sourceTree = BUILT_PRODUCTS_DIR; }; | 4B35C6290D4731D2000DE7AE /* jack_portaudio.so */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = jack_portaudio.so; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
4B35C6340D4731D2000DE7AE /* jack_dummy.so */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = jack_dummy.so; sourceTree = BUILT_PRODUCTS_DIR; }; | 4B35C6340D4731D2000DE7AE /* jack_dummy.so */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = jack_dummy.so; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
4B35C63E0D4731D3000DE7AE /* inprocess.so */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = inprocess.so; sourceTree = BUILT_PRODUCTS_DIR; }; | 4B35C63E0D4731D3000DE7AE /* inprocess.so */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = inprocess.so; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
4B363DD80DEB02F6001F72D9 /* jack_alias */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_alias; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4B363DD80DEB02F6001F72D9 /* jack_midiseq */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midiseq; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4B363DDE0DEB034E001F72D9 /* alias.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = alias.c; path = "../example-clients/alias.c"; sourceTree = SOURCE_ROOT; }; | 4B363DDE0DEB034E001F72D9 /* alias.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = alias.c; path = "../example-clients/alias.c"; sourceTree = SOURCE_ROOT; }; | ||||
4B363E1A0DEB03C5001F72D9 /* jack_evmon */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_evmon; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4B363E1A0DEB03C5001F72D9 /* jack_midiseq */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midiseq; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4B363E200DEB0401001F72D9 /* evmon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = evmon.c; path = "../example-clients/evmon.c"; sourceTree = SOURCE_ROOT; }; | 4B363E200DEB0401001F72D9 /* evmon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = evmon.c; path = "../example-clients/evmon.c"; sourceTree = SOURCE_ROOT; }; | ||||
4B363E4E0DEB0775001F72D9 /* jack_bufsize */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_bufsize; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4B363E4E0DEB0775001F72D9 /* jack_midiseq */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midiseq; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4B363E710DEB0808001F72D9 /* bufsize.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = bufsize.c; path = "../example-clients/bufsize.c"; sourceTree = SOURCE_ROOT; }; | 4B363E710DEB0808001F72D9 /* bufsize.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = bufsize.c; path = "../example-clients/bufsize.c"; sourceTree = SOURCE_ROOT; }; | ||||
4B363EE90DEB091C001F72D9 /* jack_rec */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_rec; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4B363EE90DEB091C001F72D9 /* jack_midiseq */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midiseq; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4B363EED0DEB094B001F72D9 /* capture_client.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = capture_client.c; path = "../example-clients/capture_client.c"; sourceTree = SOURCE_ROOT; }; | 4B363EED0DEB094B001F72D9 /* capture_client.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = capture_client.c; path = "../example-clients/capture_client.c"; sourceTree = SOURCE_ROOT; }; | ||||
4B363F1E0DEB0A6A001F72D9 /* jack_monitor_client */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_monitor_client; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4B363F1E0DEB0A6A001F72D9 /* jack_midiseq */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midiseq; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4B363F220DEB0AB0001F72D9 /* monitor_client.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = monitor_client.c; path = "../example-clients/monitor_client.c"; sourceTree = SOURCE_ROOT; }; | 4B363F220DEB0AB0001F72D9 /* monitor_client.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = monitor_client.c; path = "../example-clients/monitor_client.c"; sourceTree = SOURCE_ROOT; }; | ||||
4B363F350DEB0BD1001F72D9 /* jack_showtime */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_showtime; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4B363F350DEB0BD1001F72D9 /* jack_midiseq */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midiseq; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4B363F3D0DEB0C31001F72D9 /* showtime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = showtime.c; path = "../example-clients/showtime.c"; sourceTree = SOURCE_ROOT; }; | 4B363F3D0DEB0C31001F72D9 /* showtime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = showtime.c; path = "../example-clients/showtime.c"; sourceTree = SOURCE_ROOT; }; | ||||
4B363F720DEB0D4E001F72D9 /* jack_impulse_grabber */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_impulse_grabber; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4B363F720DEB0D4E001F72D9 /* jack_midiseq */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midiseq; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4B363F750DEB0D7D001F72D9 /* impulse_grabber.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = impulse_grabber.c; path = "../example-clients/impulse_grabber.c"; sourceTree = SOURCE_ROOT; }; | 4B363F750DEB0D7D001F72D9 /* impulse_grabber.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = impulse_grabber.c; path = "../example-clients/impulse_grabber.c"; sourceTree = SOURCE_ROOT; }; | ||||
4B37C20306DF1FBE0016E567 /* CALatencyLog.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = CALatencyLog.cpp; path = /Developer/Examples/CoreAudio/PublicUtility/CALatencyLog.cpp; sourceTree = "<absolute>"; }; | 4B37C20306DF1FBE0016E567 /* CALatencyLog.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = CALatencyLog.cpp; path = /Developer/Examples/CoreAudio/PublicUtility/CALatencyLog.cpp; sourceTree = "<absolute>"; }; | ||||
4B37C20406DF1FBE0016E567 /* CALatencyLog.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = CALatencyLog.h; path = /Developer/Examples/CoreAudio/PublicUtility/CALatencyLog.h; sourceTree = "<absolute>"; }; | 4B37C20406DF1FBE0016E567 /* CALatencyLog.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = CALatencyLog.h; path = /Developer/Examples/CoreAudio/PublicUtility/CALatencyLog.h; sourceTree = "<absolute>"; }; | ||||
@@ -1228,7 +1228,7 @@ | |||||
4B5A1BBD0CD1CC110005BF74 /* midiseq.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = midiseq.c; path = "../example-clients/midiseq.c"; sourceTree = SOURCE_ROOT; }; | 4B5A1BBD0CD1CC110005BF74 /* midiseq.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = midiseq.c; path = "../example-clients/midiseq.c"; sourceTree = SOURCE_ROOT; }; | ||||
4B5A1BDA0CD1CCE10005BF74 /* jack_midisine */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midisine; sourceTree = BUILT_PRODUCTS_DIR; }; | 4B5A1BDA0CD1CCE10005BF74 /* jack_midisine */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midisine; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
4B5A1BDC0CD1CD420005BF74 /* midisine.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = midisine.c; path = "../example-clients/midisine.c"; sourceTree = SOURCE_ROOT; }; | 4B5A1BDC0CD1CD420005BF74 /* midisine.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = midisine.c; path = "../example-clients/midisine.c"; sourceTree = SOURCE_ROOT; }; | ||||
4B5E08D50E5B66EE00BEE4E0 /* netadapter.so */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = netadapter.so; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4B5E08D50E5B66EE00BEE4E0 /* netmanager.so */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = netmanager.so; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4B5E08DF0E5B676C00BEE4E0 /* JackNetAdapter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackNetAdapter.cpp; path = ../common/JackNetAdapter.cpp; sourceTree = SOURCE_ROOT; }; | 4B5E08DF0E5B676C00BEE4E0 /* JackNetAdapter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackNetAdapter.cpp; path = ../common/JackNetAdapter.cpp; sourceTree = SOURCE_ROOT; }; | ||||
4B5E08E00E5B676C00BEE4E0 /* JackNetAdapter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackNetAdapter.h; path = ../common/JackNetAdapter.h; sourceTree = SOURCE_ROOT; }; | 4B5E08E00E5B676C00BEE4E0 /* JackNetAdapter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackNetAdapter.h; path = ../common/JackNetAdapter.h; sourceTree = SOURCE_ROOT; }; | ||||
4B5F253D0DEE9B8F0041E486 /* JackLockedEngine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackLockedEngine.h; path = ../common/JackLockedEngine.h; sourceTree = SOURCE_ROOT; }; | 4B5F253D0DEE9B8F0041E486 /* JackLockedEngine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackLockedEngine.h; path = ../common/JackLockedEngine.h; sourceTree = SOURCE_ROOT; }; | ||||
@@ -1272,8 +1272,6 @@ | |||||
4B869D7F08C9CB00001CF041 /* JackDriverLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackDriverLoader.cpp; path = ../common/JackDriverLoader.cpp; sourceTree = SOURCE_ROOT; }; | 4B869D7F08C9CB00001CF041 /* JackDriverLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackDriverLoader.cpp; path = ../common/JackDriverLoader.cpp; sourceTree = SOURCE_ROOT; }; | ||||
4B89B759076B731100D170DE /* JackRPCClientUser.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = JackRPCClientUser.c; path = RPC/JackRPCClientUser.c; sourceTree = SOURCE_ROOT; }; | 4B89B759076B731100D170DE /* JackRPCClientUser.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = JackRPCClientUser.c; path = RPC/JackRPCClientUser.c; sourceTree = SOURCE_ROOT; }; | ||||
4B89B769076B74D200D170DE /* JackRPCEngineUser.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = JackRPCEngineUser.c; path = RPC/JackRPCEngineUser.c; sourceTree = SOURCE_ROOT; }; | 4B89B769076B74D200D170DE /* JackRPCEngineUser.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = JackRPCEngineUser.c; path = RPC/JackRPCEngineUser.c; sourceTree = SOURCE_ROOT; }; | ||||
4B8F3D490E06C4A10096D19C /* JackEngineTiming.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackEngineTiming.cpp; path = ../common/JackEngineTiming.cpp; sourceTree = SOURCE_ROOT; }; | |||||
4B8F3D4A0E06C4A10096D19C /* JackEngineTiming.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackEngineTiming.h; path = ../common/JackEngineTiming.h; sourceTree = SOURCE_ROOT; }; | |||||
4B940B9B06DDDE5B00D77F60 /* AudioHardware.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = AudioHardware.h; path = /System/Library/Frameworks/CoreAudio.framework/Versions/A/Headers/AudioHardware.h; sourceTree = "<absolute>"; }; | 4B940B9B06DDDE5B00D77F60 /* AudioHardware.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = AudioHardware.h; path = /System/Library/Frameworks/CoreAudio.framework/Versions/A/Headers/AudioHardware.h; sourceTree = "<absolute>"; }; | ||||
4B95BCAD0D913073000F7695 /* control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = control.h; path = ../common/jack/control.h; sourceTree = SOURCE_ROOT; }; | 4B95BCAD0D913073000F7695 /* control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = control.h; path = ../common/jack/control.h; sourceTree = SOURCE_ROOT; }; | ||||
4B978DBB0A31CF4A009E2DD1 /* jack_portaudio.so */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = jack_portaudio.so; sourceTree = BUILT_PRODUCTS_DIR; }; | 4B978DBB0A31CF4A009E2DD1 /* jack_portaudio.so */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = jack_portaudio.so; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
@@ -1288,12 +1286,14 @@ | |||||
4BA692D40CBE4C9000EAD520 /* jack_unload */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_unload; sourceTree = BUILT_PRODUCTS_DIR; }; | 4BA692D40CBE4C9000EAD520 /* jack_unload */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_unload; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
4BA692D60CBE4CC600EAD520 /* ipunload.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = ipunload.c; path = "../example-clients/ipunload.c"; sourceTree = SOURCE_ROOT; }; | 4BA692D60CBE4CC600EAD520 /* ipunload.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = ipunload.c; path = "../example-clients/ipunload.c"; sourceTree = SOURCE_ROOT; }; | ||||
4BA7BDCB0DC22F4500AA3457 /* Jackservermp.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Jackservermp.framework; path = build/Development/Jackservermp.framework; sourceTree = SOURCE_ROOT; }; | 4BA7BDCB0DC22F4500AA3457 /* Jackservermp.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Jackservermp.framework; path = build/Development/Jackservermp.framework; sourceTree = SOURCE_ROOT; }; | ||||
4BA7FEC30D8E76270017FF73 /* jack_server_control */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_server_control; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4BA7FEC30D8E76270017FF73 /* jack_lsp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_lsp; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4BA7FEC80D8E76650017FF73 /* control.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = control.c; path = "../example-clients/control.c"; sourceTree = SOURCE_ROOT; }; | 4BA7FEC80D8E76650017FF73 /* control.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = control.c; path = "../example-clients/control.c"; sourceTree = SOURCE_ROOT; }; | ||||
4BAB95B60B9E20B800A0C723 /* JackPortType.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackPortType.cpp; path = ../common/JackPortType.cpp; sourceTree = SOURCE_ROOT; }; | 4BAB95B60B9E20B800A0C723 /* JackPortType.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackPortType.cpp; path = ../common/JackPortType.cpp; sourceTree = SOURCE_ROOT; }; | ||||
4BAB95B70B9E20B800A0C723 /* JackPortType.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackPortType.h; path = ../common/JackPortType.h; sourceTree = SOURCE_ROOT; }; | 4BAB95B70B9E20B800A0C723 /* JackPortType.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackPortType.h; path = ../common/JackPortType.h; sourceTree = SOURCE_ROOT; }; | ||||
4BAB95EC0B9E21A500A0C723 /* JackAudioPort.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackAudioPort.cpp; path = ../common/JackAudioPort.cpp; sourceTree = SOURCE_ROOT; }; | 4BAB95EC0B9E21A500A0C723 /* JackAudioPort.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackAudioPort.cpp; path = ../common/JackAudioPort.cpp; sourceTree = SOURCE_ROOT; }; | ||||
4BB371D40C1AD85A0050C1E4 /* JackNotification.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackNotification.h; path = ../common/JackNotification.h; sourceTree = SOURCE_ROOT; }; | 4BB371D40C1AD85A0050C1E4 /* JackNotification.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackNotification.h; path = ../common/JackNotification.h; sourceTree = SOURCE_ROOT; }; | ||||
4BBAE40E0F42FA6100B8BD3F /* JackEngineProfiling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackEngineProfiling.h; path = ../common/JackEngineProfiling.h; sourceTree = SOURCE_ROOT; }; | |||||
4BBAE40F0F42FA6100B8BD3F /* JackEngineProfiling.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackEngineProfiling.cpp; path = ../common/JackEngineProfiling.cpp; sourceTree = SOURCE_ROOT; }; | |||||
4BBB00CF0E72614F0018AB1B /* JackPortAudioDevices.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackPortAudioDevices.cpp; path = ../windows/portaudio/JackPortAudioDevices.cpp; sourceTree = SOURCE_ROOT; }; | 4BBB00CF0E72614F0018AB1B /* JackPortAudioDevices.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackPortAudioDevices.cpp; path = ../windows/portaudio/JackPortAudioDevices.cpp; sourceTree = SOURCE_ROOT; }; | ||||
4BBB00D00E72614F0018AB1B /* JackPortAudioDevices.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackPortAudioDevices.h; path = ../windows/portaudio/JackPortAudioDevices.h; sourceTree = SOURCE_ROOT; }; | 4BBB00D00E72614F0018AB1B /* JackPortAudioDevices.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackPortAudioDevices.h; path = ../windows/portaudio/JackPortAudioDevices.h; sourceTree = SOURCE_ROOT; }; | ||||
4BBB00D10E72614F0018AB1B /* JackPortAudioDriver.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackPortAudioDriver.cpp; path = ../windows/portaudio/JackPortAudioDriver.cpp; sourceTree = SOURCE_ROOT; }; | 4BBB00D10E72614F0018AB1B /* JackPortAudioDriver.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackPortAudioDriver.cpp; path = ../windows/portaudio/JackPortAudioDriver.cpp; sourceTree = SOURCE_ROOT; }; | ||||
@@ -1405,14 +1405,14 @@ | |||||
4BF8D2470834F20600C94B91 /* testSem.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = testSem.cpp; path = ../tests/testSem.cpp; sourceTree = SOURCE_ROOT; }; | 4BF8D2470834F20600C94B91 /* testSem.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = testSem.cpp; path = ../tests/testSem.cpp; sourceTree = SOURCE_ROOT; }; | ||||
4BF8FB0D08AC88EF00D1A344 /* JackFrameTimer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackFrameTimer.cpp; path = ../common/JackFrameTimer.cpp; sourceTree = SOURCE_ROOT; }; | 4BF8FB0D08AC88EF00D1A344 /* JackFrameTimer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackFrameTimer.cpp; path = ../common/JackFrameTimer.cpp; sourceTree = SOURCE_ROOT; }; | ||||
4BF8FB0E08AC88EF00D1A344 /* JackFrameTimer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackFrameTimer.h; path = ../common/JackFrameTimer.h; sourceTree = SOURCE_ROOT; }; | 4BF8FB0E08AC88EF00D1A344 /* JackFrameTimer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackFrameTimer.h; path = ../common/JackFrameTimer.h; sourceTree = SOURCE_ROOT; }; | ||||
4BFA5E980DEC4D9C00FA4CDB /* testMutex */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testMutex; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4BFA5E980DEC4D9C00FA4CDB /* testSem */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testSem; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4BFA5E9E0DEC4DD900FA4CDB /* testMutex.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = testMutex.cpp; path = ../tests/testMutex.cpp; sourceTree = SOURCE_ROOT; }; | 4BFA5E9E0DEC4DD900FA4CDB /* testMutex.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = testMutex.cpp; path = ../tests/testMutex.cpp; sourceTree = SOURCE_ROOT; }; | ||||
4BFA828C0DF6A9E40087B4E1 /* jack_evmon */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_evmon; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4BFA829F0DF6A9E40087B4E1 /* jack_bufsize */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_bufsize; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4BFA82AB0DF6A9E40087B4E1 /* jack_rec */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_rec; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4BFA82B70DF6A9E40087B4E1 /* jack_monitor_client */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_monitor_client; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4BFA82C30DF6A9E40087B4E1 /* jack_showtime */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_showtime; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4BFA82CF0DF6A9E40087B4E1 /* jack_impulse_grabber */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_impulse_grabber; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4BFA828C0DF6A9E40087B4E1 /* jack_midiseq */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midiseq; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4BFA829F0DF6A9E40087B4E1 /* jack_midiseq */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midiseq; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4BFA82AB0DF6A9E40087B4E1 /* jack_midiseq */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midiseq; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4BFA82B70DF6A9E40087B4E1 /* jack_midiseq */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midiseq; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4BFA82C30DF6A9E40087B4E1 /* jack_midiseq */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midiseq; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4BFA82CF0DF6A9E40087B4E1 /* jack_midiseq */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midiseq; sourceTree = BUILT_PRODUCTS_DIR; }; | |||||
4BFA99A20AAAF3B0009E916C /* jdelay */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jdelay; sourceTree = BUILT_PRODUCTS_DIR; }; | 4BFA99A20AAAF3B0009E916C /* jdelay */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jdelay; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
4BFA99A90AAAF40C009E916C /* jdelay.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = jdelay.cpp; path = ../tests/jdelay.cpp; sourceTree = SOURCE_ROOT; }; | 4BFA99A90AAAF40C009E916C /* jdelay.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = jdelay.cpp; path = ../tests/jdelay.cpp; sourceTree = SOURCE_ROOT; }; | ||||
4BFB297708AF44ED00D450D4 /* JackMachServerNotifyChannel.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JackMachServerNotifyChannel.cpp; sourceTree = "<group>"; }; | 4BFB297708AF44ED00D450D4 /* JackMachServerNotifyChannel.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JackMachServerNotifyChannel.cpp; sourceTree = "<group>"; }; | ||||
@@ -1550,7 +1550,7 @@ | |||||
isa = PBXFrameworksBuildPhase; | isa = PBXFrameworksBuildPhase; | ||||
buildActionMask = 2147483647; | buildActionMask = 2147483647; | ||||
files = ( | files = ( | ||||
4BA7BE0F0DC232A400AA3457 /* Jackservermp.framework in Frameworks */, | |||||
4BA7BE0F0DC232A400AA3457 /* Jackdmp.framework in Frameworks */, | |||||
); | ); | ||||
runOnlyForDeploymentPostprocessing = 0; | runOnlyForDeploymentPostprocessing = 0; | ||||
}; | }; | ||||
@@ -1558,7 +1558,7 @@ | |||||
isa = PBXFrameworksBuildPhase; | isa = PBXFrameworksBuildPhase; | ||||
buildActionMask = 2147483647; | buildActionMask = 2147483647; | ||||
files = ( | files = ( | ||||
4BA7BE1A0DC2347500AA3457 /* Jackservermp.framework in Frameworks */, | |||||
4BA7BE1A0DC2347500AA3457 /* Jackdmp.framework in Frameworks */, | |||||
); | ); | ||||
runOnlyForDeploymentPostprocessing = 0; | runOnlyForDeploymentPostprocessing = 0; | ||||
}; | }; | ||||
@@ -1601,7 +1601,7 @@ | |||||
isa = PBXFrameworksBuildPhase; | isa = PBXFrameworksBuildPhase; | ||||
buildActionMask = 2147483647; | buildActionMask = 2147483647; | ||||
files = ( | files = ( | ||||
4BA7BE200DC234FB00AA3457 /* Jackservermp.framework in Frameworks */, | |||||
4BA7BE200DC234FB00AA3457 /* Jackdmp.framework in Frameworks */, | |||||
); | ); | ||||
runOnlyForDeploymentPostprocessing = 0; | runOnlyForDeploymentPostprocessing = 0; | ||||
}; | }; | ||||
@@ -1609,7 +1609,7 @@ | |||||
isa = PBXFrameworksBuildPhase; | isa = PBXFrameworksBuildPhase; | ||||
buildActionMask = 2147483647; | buildActionMask = 2147483647; | ||||
files = ( | files = ( | ||||
4BA7BE240DC2350D00AA3457 /* Jackservermp.framework in Frameworks */, | |||||
4BA7BE240DC2350D00AA3457 /* Jackdmp.framework in Frameworks */, | |||||
); | ); | ||||
runOnlyForDeploymentPostprocessing = 0; | runOnlyForDeploymentPostprocessing = 0; | ||||
}; | }; | ||||
@@ -1617,7 +1617,7 @@ | |||||
isa = PBXFrameworksBuildPhase; | isa = PBXFrameworksBuildPhase; | ||||
buildActionMask = 2147483647; | buildActionMask = 2147483647; | ||||
files = ( | files = ( | ||||
4BA7BE270DC2352A00AA3457 /* Jackservermp.framework in Frameworks */, | |||||
4BA7BE270DC2352A00AA3457 /* Jackdmp.framework in Frameworks */, | |||||
); | ); | ||||
runOnlyForDeploymentPostprocessing = 0; | runOnlyForDeploymentPostprocessing = 0; | ||||
}; | }; | ||||
@@ -2042,7 +2042,7 @@ | |||||
4B5A1BDA0CD1CCE10005BF74 /* jack_midisine */, | 4B5A1BDA0CD1CCE10005BF74 /* jack_midisine */, | ||||
4B35C4250D4731D1000DE7AE /* jackdmp */, | 4B35C4250D4731D1000DE7AE /* jackdmp */, | ||||
4B35C4830D4731D1000DE7AE /* Jackmp.framework */, | 4B35C4830D4731D1000DE7AE /* Jackmp.framework */, | ||||
4B35C4FC0D4731D1000DE7AE /* Jackservermp.framework */, | |||||
4B35C4FC0D4731D1000DE7AE /* Jackdmp.framework */, | |||||
4B35C5140D4731D1000DE7AE /* jack_midiseq */, | 4B35C5140D4731D1000DE7AE /* jack_midiseq */, | ||||
4B35C5200D4731D1000DE7AE /* jack_midisine */, | 4B35C5200D4731D1000DE7AE /* jack_midisine */, | ||||
4B35C52C0D4731D1000DE7AE /* jack_metro */, | 4B35C52C0D4731D1000DE7AE /* jack_metro */, | ||||
@@ -2069,26 +2069,26 @@ | |||||
4B0A28E60D52073D002EFF74 /* jack_thread_wait */, | 4B0A28E60D52073D002EFF74 /* jack_thread_wait */, | ||||
4B0A292D0D52108E002EFF74 /* jack_thread_wait */, | 4B0A292D0D52108E002EFF74 /* jack_thread_wait */, | ||||
4B57F5950D72C27900B4E719 /* jack_thread_wait */, | 4B57F5950D72C27900B4E719 /* jack_thread_wait */, | ||||
4BA7FEC30D8E76270017FF73 /* jack_server_control */, | |||||
4BA7FEC30D8E76270017FF73 /* jack_lsp */, | |||||
BA222ACF0DC88132001A17F4 /* jack_net.so */, | BA222ACF0DC88132001A17F4 /* jack_net.so */, | ||||
BA222AE90DC882DB001A17F4 /* netmanager.so */, | BA222AE90DC882DB001A17F4 /* netmanager.so */, | ||||
4BA7FEC30D8E76270017FF73 /* jack_server_control */, | |||||
4B363DD80DEB02F6001F72D9 /* jack_alias */, | |||||
4B363E1A0DEB03C5001F72D9 /* jack_evmon */, | |||||
4B363E4E0DEB0775001F72D9 /* jack_bufsize */, | |||||
4B363EE90DEB091C001F72D9 /* jack_rec */, | |||||
4B363F1E0DEB0A6A001F72D9 /* jack_monitor_client */, | |||||
4B363F350DEB0BD1001F72D9 /* jack_showtime */, | |||||
4B363F720DEB0D4E001F72D9 /* jack_impulse_grabber */, | |||||
4BFA5E980DEC4D9C00FA4CDB /* testMutex */, | |||||
4BFA828C0DF6A9E40087B4E1 /* jack_evmon */, | |||||
4BFA829F0DF6A9E40087B4E1 /* jack_bufsize */, | |||||
4BFA82AB0DF6A9E40087B4E1 /* jack_rec */, | |||||
4BFA82B70DF6A9E40087B4E1 /* jack_monitor_client */, | |||||
4BFA82C30DF6A9E40087B4E1 /* jack_showtime */, | |||||
4BFA82CF0DF6A9E40087B4E1 /* jack_impulse_grabber */, | |||||
4B19B3000E23620F00DD4A82 /* audioadapter.so */, | |||||
4B5E08D50E5B66EE00BEE4E0 /* netadapter.so */, | |||||
4BA7FEC30D8E76270017FF73 /* jack_lsp */, | |||||
4B363DD80DEB02F6001F72D9 /* jack_midiseq */, | |||||
4B363E1A0DEB03C5001F72D9 /* jack_midiseq */, | |||||
4B363E4E0DEB0775001F72D9 /* jack_midiseq */, | |||||
4B363EE90DEB091C001F72D9 /* jack_midiseq */, | |||||
4B363F1E0DEB0A6A001F72D9 /* jack_midiseq */, | |||||
4B363F350DEB0BD1001F72D9 /* jack_midiseq */, | |||||
4B363F720DEB0D4E001F72D9 /* jack_midiseq */, | |||||
4BFA5E980DEC4D9C00FA4CDB /* testSem */, | |||||
4BFA828C0DF6A9E40087B4E1 /* jack_midiseq */, | |||||
4BFA829F0DF6A9E40087B4E1 /* jack_midiseq */, | |||||
4BFA82AB0DF6A9E40087B4E1 /* jack_midiseq */, | |||||
4BFA82B70DF6A9E40087B4E1 /* jack_midiseq */, | |||||
4BFA82C30DF6A9E40087B4E1 /* jack_midiseq */, | |||||
4BFA82CF0DF6A9E40087B4E1 /* jack_midiseq */, | |||||
4B19B3000E23620F00DD4A82 /* netmanager.so */, | |||||
4B5E08D50E5B66EE00BEE4E0 /* netmanager.so */, | |||||
); | ); | ||||
name = Products; | name = Products; | ||||
sourceTree = "<group>"; | sourceTree = "<group>"; | ||||
@@ -2152,8 +2152,6 @@ | |||||
4B05A05D0DF72BC000840F4C /* JackAlsaDriver.cpp */, | 4B05A05D0DF72BC000840F4C /* JackAlsaDriver.cpp */, | ||||
4B05A05E0DF72BC000840F4C /* JackAlsaDriver.h */, | 4B05A05E0DF72BC000840F4C /* JackAlsaDriver.h */, | ||||
4B05A05F0DF72BC000840F4C /* jslist.h */, | 4B05A05F0DF72BC000840F4C /* jslist.h */, | ||||
4B05A0600DF72BC000840F4C /* memops.c */, | |||||
4B05A0610DF72BC000840F4C /* memops.h */, | |||||
4B05A0620DF72BC000840F4C /* midi_pack.h */, | 4B05A0620DF72BC000840F4C /* midi_pack.h */, | ||||
4B05A0630DF72BC000840F4C /* midi_unpack.h */, | 4B05A0630DF72BC000840F4C /* midi_unpack.h */, | ||||
4B05A0640DF72BC000840F4C /* usx2y.c */, | 4B05A0640DF72BC000840F4C /* usx2y.c */, | ||||
@@ -2328,8 +2326,8 @@ | |||||
4B2C28F908DAD01E00249230 /* JackGlobals.cpp */, | 4B2C28F908DAD01E00249230 /* JackGlobals.cpp */, | ||||
4BF8D2190834F03D00C94B91 /* JackEngineControl.h */, | 4BF8D2190834F03D00C94B91 /* JackEngineControl.h */, | ||||
4B6F7AEC0CD0CDBD00F48A9D /* JackEngineControl.cpp */, | 4B6F7AEC0CD0CDBD00F48A9D /* JackEngineControl.cpp */, | ||||
4B8F3D4A0E06C4A10096D19C /* JackEngineTiming.h */, | |||||
4B8F3D490E06C4A10096D19C /* JackEngineTiming.cpp */, | |||||
4BBAE40E0F42FA6100B8BD3F /* JackEngineProfiling.h */, | |||||
4BBAE40F0F42FA6100B8BD3F /* JackEngineProfiling.cpp */, | |||||
4BD4B4D409BACD9600750C0F /* JackTransportEngine.h */, | 4BD4B4D409BACD9600750C0F /* JackTransportEngine.h */, | ||||
4BD4B4D509BACD9600750C0F /* JackTransportEngine.cpp */, | 4BD4B4D509BACD9600750C0F /* JackTransportEngine.cpp */, | ||||
4BF8D2220834F05C00C94B91 /* JackServer.h */, | 4BF8D2220834F05C00C94B91 /* JackServer.h */, | ||||
@@ -2741,6 +2739,7 @@ | |||||
4B4CA9770E02CF9600F4BFDA /* JackRestartThreadedDriver.h in Headers */, | 4B4CA9770E02CF9600F4BFDA /* JackRestartThreadedDriver.h in Headers */, | ||||
4B4E9AFD0E5F1090000A3278 /* JackControlAPI.h in Headers */, | 4B4E9AFD0E5F1090000A3278 /* JackControlAPI.h in Headers */, | ||||
4B93F19A0E87992200E4ECCD /* JackPosixThread.h in Headers */, | 4B93F19A0E87992200E4ECCD /* JackPosixThread.h in Headers */, | ||||
4BBAE4120F42FA6100B8BD3F /* JackEngineProfiling.h in Headers */, | |||||
); | ); | ||||
runOnlyForDeploymentPostprocessing = 0; | runOnlyForDeploymentPostprocessing = 0; | ||||
}; | }; | ||||
@@ -3103,10 +3102,10 @@ | |||||
4B5F253E0DEE9B8F0041E486 /* JackLockedEngine.h in Headers */, | 4B5F253E0DEE9B8F0041E486 /* JackLockedEngine.h in Headers */, | ||||
4BBC93BB0DF9736C002DF220 /* JackWaitThreadedDriver.h in Headers */, | 4BBC93BB0DF9736C002DF220 /* JackWaitThreadedDriver.h in Headers */, | ||||
4B4CA9750E02CF9600F4BFDA /* JackRestartThreadedDriver.h in Headers */, | 4B4CA9750E02CF9600F4BFDA /* JackRestartThreadedDriver.h in Headers */, | ||||
4B8F3D4C0E06C4A10096D19C /* JackEngineTiming.h in Headers */, | |||||
4B4E9AFB0E5F1090000A3278 /* JackControlAPI.h in Headers */, | 4B4E9AFB0E5F1090000A3278 /* JackControlAPI.h in Headers */, | ||||
4BC3B6A70E703B2E0066E42F /* JackPosixThread.h in Headers */, | 4BC3B6A70E703B2E0066E42F /* JackPosixThread.h in Headers */, | ||||
4BF2841B0F31B4BC00B05BE3 /* JackArgParser.h in Headers */, | 4BF2841B0F31B4BC00B05BE3 /* JackArgParser.h in Headers */, | ||||
4BBAE4100F42FA6100B8BD3F /* JackEngineProfiling.h in Headers */, | |||||
); | ); | ||||
runOnlyForDeploymentPostprocessing = 0; | runOnlyForDeploymentPostprocessing = 0; | ||||
}; | }; | ||||
@@ -3393,7 +3392,7 @@ | |||||
); | ); | ||||
name = audioadapter; | name = audioadapter; | ||||
productName = jack_coreaudio; | productName = jack_coreaudio; | ||||
productReference = 4B19B3000E23620F00DD4A82 /* audioadapter.so */; | |||||
productReference = 4B19B3000E23620F00DD4A82 /* netmanager.so */; | |||||
productType = "com.apple.product-type.library.dynamic"; | productType = "com.apple.product-type.library.dynamic"; | ||||
}; | }; | ||||
4B35C41B0D4731D1000DE7AE /* jackdmp framework 64bits */ = { | 4B35C41B0D4731D1000DE7AE /* jackdmp framework 64bits */ = { | ||||
@@ -3450,7 +3449,7 @@ | |||||
); | ); | ||||
name = "Jackservermp.framework 64 bits"; | name = "Jackservermp.framework 64 bits"; | ||||
productName = Jack; | productName = Jack; | ||||
productReference = 4B35C4FC0D4731D1000DE7AE /* Jackservermp.framework */; | |||||
productReference = 4B35C4FC0D4731D1000DE7AE /* Jackdmp.framework */; | |||||
productType = "com.apple.product-type.framework"; | productType = "com.apple.product-type.framework"; | ||||
}; | }; | ||||
4B35C50A0D4731D1000DE7AE /* jack_midiseq 64 bits */ = { | 4B35C50A0D4731D1000DE7AE /* jack_midiseq 64 bits */ = { | ||||
@@ -3899,7 +3898,7 @@ | |||||
name = "jack_alias Universal"; | name = "jack_alias Universal"; | ||||
productInstallPath = /usr/local/bin; | productInstallPath = /usr/local/bin; | ||||
productName = jack_metro; | productName = jack_metro; | ||||
productReference = 4B363DD80DEB02F6001F72D9 /* jack_alias */; | |||||
productReference = 4B363DD80DEB02F6001F72D9 /* jack_midiseq */; | |||||
productType = "com.apple.product-type.tool"; | productType = "com.apple.product-type.tool"; | ||||
}; | }; | ||||
4B363E100DEB03C5001F72D9 /* jack_evmon Universal */ = { | 4B363E100DEB03C5001F72D9 /* jack_evmon Universal */ = { | ||||
@@ -3918,7 +3917,7 @@ | |||||
name = "jack_evmon Universal"; | name = "jack_evmon Universal"; | ||||
productInstallPath = /usr/local/bin; | productInstallPath = /usr/local/bin; | ||||
productName = jack_metro; | productName = jack_metro; | ||||
productReference = 4B363E1A0DEB03C5001F72D9 /* jack_evmon */; | |||||
productReference = 4B363E1A0DEB03C5001F72D9 /* jack_midiseq */; | |||||
productType = "com.apple.product-type.tool"; | productType = "com.apple.product-type.tool"; | ||||
}; | }; | ||||
4B363E440DEB0775001F72D9 /* jack_bufsize Universal */ = { | 4B363E440DEB0775001F72D9 /* jack_bufsize Universal */ = { | ||||
@@ -3937,7 +3936,7 @@ | |||||
name = "jack_bufsize Universal"; | name = "jack_bufsize Universal"; | ||||
productInstallPath = /usr/local/bin; | productInstallPath = /usr/local/bin; | ||||
productName = jack_metro; | productName = jack_metro; | ||||
productReference = 4B363E4E0DEB0775001F72D9 /* jack_bufsize */; | |||||
productReference = 4B363E4E0DEB0775001F72D9 /* jack_midiseq */; | |||||
productType = "com.apple.product-type.tool"; | productType = "com.apple.product-type.tool"; | ||||
}; | }; | ||||
4B363EDF0DEB091C001F72D9 /* jack_rec Universal */ = { | 4B363EDF0DEB091C001F72D9 /* jack_rec Universal */ = { | ||||
@@ -3956,7 +3955,7 @@ | |||||
name = "jack_rec Universal"; | name = "jack_rec Universal"; | ||||
productInstallPath = /usr/local/bin; | productInstallPath = /usr/local/bin; | ||||
productName = jack_metro; | productName = jack_metro; | ||||
productReference = 4B363EE90DEB091C001F72D9 /* jack_rec */; | |||||
productReference = 4B363EE90DEB091C001F72D9 /* jack_midiseq */; | |||||
productType = "com.apple.product-type.tool"; | productType = "com.apple.product-type.tool"; | ||||
}; | }; | ||||
4B363F140DEB0A6A001F72D9 /* jack_monitor_client Universal */ = { | 4B363F140DEB0A6A001F72D9 /* jack_monitor_client Universal */ = { | ||||
@@ -3975,7 +3974,7 @@ | |||||
name = "jack_monitor_client Universal"; | name = "jack_monitor_client Universal"; | ||||
productInstallPath = /usr/local/bin; | productInstallPath = /usr/local/bin; | ||||
productName = jack_metro; | productName = jack_metro; | ||||
productReference = 4B363F1E0DEB0A6A001F72D9 /* jack_monitor_client */; | |||||
productReference = 4B363F1E0DEB0A6A001F72D9 /* jack_midiseq */; | |||||
productType = "com.apple.product-type.tool"; | productType = "com.apple.product-type.tool"; | ||||
}; | }; | ||||
4B363F2B0DEB0BD1001F72D9 /* jack_showtime Universal */ = { | 4B363F2B0DEB0BD1001F72D9 /* jack_showtime Universal */ = { | ||||
@@ -3994,7 +3993,7 @@ | |||||
name = "jack_showtime Universal"; | name = "jack_showtime Universal"; | ||||
productInstallPath = /usr/local/bin; | productInstallPath = /usr/local/bin; | ||||
productName = jack_metro; | productName = jack_metro; | ||||
productReference = 4B363F350DEB0BD1001F72D9 /* jack_showtime */; | |||||
productReference = 4B363F350DEB0BD1001F72D9 /* jack_midiseq */; | |||||
productType = "com.apple.product-type.tool"; | productType = "com.apple.product-type.tool"; | ||||
}; | }; | ||||
4B363F680DEB0D4E001F72D9 /* jack_impulse_grabber Universal */ = { | 4B363F680DEB0D4E001F72D9 /* jack_impulse_grabber Universal */ = { | ||||
@@ -4013,7 +4012,7 @@ | |||||
name = "jack_impulse_grabber Universal"; | name = "jack_impulse_grabber Universal"; | ||||
productInstallPath = /usr/local/bin; | productInstallPath = /usr/local/bin; | ||||
productName = jack_metro; | productName = jack_metro; | ||||
productReference = 4B363F720DEB0D4E001F72D9 /* jack_impulse_grabber */; | |||||
productReference = 4B363F720DEB0D4E001F72D9 /* jack_midiseq */; | |||||
productType = "com.apple.product-type.tool"; | productType = "com.apple.product-type.tool"; | ||||
}; | }; | ||||
4B5A1BB10CD1CB9E0005BF74 /* jack_midiseq Universal */ = { | 4B5A1BB10CD1CB9E0005BF74 /* jack_midiseq Universal */ = { | ||||
@@ -4068,7 +4067,7 @@ | |||||
); | ); | ||||
name = netadapter; | name = netadapter; | ||||
productName = jack_coreaudio; | productName = jack_coreaudio; | ||||
productReference = 4B5E08D50E5B66EE00BEE4E0 /* netadapter.so */; | |||||
productReference = 4B5E08D50E5B66EE00BEE4E0 /* netmanager.so */; | |||||
productType = "com.apple.product-type.library.dynamic"; | productType = "com.apple.product-type.library.dynamic"; | ||||
}; | }; | ||||
4B699BA7097D421600A18468 /* jackdmp framework Universal */ = { | 4B699BA7097D421600A18468 /* jackdmp framework Universal */ = { | ||||
@@ -4462,7 +4461,7 @@ | |||||
name = "jack_server_control Universal"; | name = "jack_server_control Universal"; | ||||
productInstallPath = /usr/local/bin; | productInstallPath = /usr/local/bin; | ||||
productName = jack_lsp; | productName = jack_lsp; | ||||
productReference = 4BA7FEC30D8E76270017FF73 /* jack_server_control */; | |||||
productReference = 4BA7FEC30D8E76270017FF73 /* jack_lsp */; | |||||
productType = "com.apple.product-type.tool"; | productType = "com.apple.product-type.tool"; | ||||
}; | }; | ||||
4BD623ED0CBCF0F000DE782F /* inprocess */ = { | 4BD623ED0CBCF0F000DE782F /* inprocess */ = { | ||||
@@ -4536,7 +4535,7 @@ | |||||
name = "testMutex Universal"; | name = "testMutex Universal"; | ||||
productInstallPath = /usr/local/bin; | productInstallPath = /usr/local/bin; | ||||
productName = testSem; | productName = testSem; | ||||
productReference = 4BFA5E980DEC4D9C00FA4CDB /* testMutex */; | |||||
productReference = 4BFA5E980DEC4D9C00FA4CDB /* testSem */; | |||||
productType = "com.apple.product-type.tool"; | productType = "com.apple.product-type.tool"; | ||||
}; | }; | ||||
4BFA82820DF6A9E40087B4E1 /* jack_evmon 64 bits */ = { | 4BFA82820DF6A9E40087B4E1 /* jack_evmon 64 bits */ = { | ||||
@@ -4555,7 +4554,7 @@ | |||||
name = "jack_evmon 64 bits"; | name = "jack_evmon 64 bits"; | ||||
productInstallPath = /usr/local/bin; | productInstallPath = /usr/local/bin; | ||||
productName = jack_metro; | productName = jack_metro; | ||||
productReference = 4BFA828C0DF6A9E40087B4E1 /* jack_evmon */; | |||||
productReference = 4BFA828C0DF6A9E40087B4E1 /* jack_midiseq */; | |||||
productType = "com.apple.product-type.tool"; | productType = "com.apple.product-type.tool"; | ||||
}; | }; | ||||
4BFA82950DF6A9E40087B4E1 /* jack_bufsize 64 bits */ = { | 4BFA82950DF6A9E40087B4E1 /* jack_bufsize 64 bits */ = { | ||||
@@ -4574,7 +4573,7 @@ | |||||
name = "jack_bufsize 64 bits"; | name = "jack_bufsize 64 bits"; | ||||
productInstallPath = /usr/local/bin; | productInstallPath = /usr/local/bin; | ||||
productName = jack_metro; | productName = jack_metro; | ||||
productReference = 4BFA829F0DF6A9E40087B4E1 /* jack_bufsize */; | |||||
productReference = 4BFA829F0DF6A9E40087B4E1 /* jack_midiseq */; | |||||
productType = "com.apple.product-type.tool"; | productType = "com.apple.product-type.tool"; | ||||
}; | }; | ||||
4BFA82A10DF6A9E40087B4E1 /* jack_rec 64 bits */ = { | 4BFA82A10DF6A9E40087B4E1 /* jack_rec 64 bits */ = { | ||||
@@ -4593,7 +4592,7 @@ | |||||
name = "jack_rec 64 bits"; | name = "jack_rec 64 bits"; | ||||
productInstallPath = /usr/local/bin; | productInstallPath = /usr/local/bin; | ||||
productName = jack_metro; | productName = jack_metro; | ||||
productReference = 4BFA82AB0DF6A9E40087B4E1 /* jack_rec */; | |||||
productReference = 4BFA82AB0DF6A9E40087B4E1 /* jack_midiseq */; | |||||
productType = "com.apple.product-type.tool"; | productType = "com.apple.product-type.tool"; | ||||
}; | }; | ||||
4BFA82AD0DF6A9E40087B4E1 /* jack_monitor_client 64 bits */ = { | 4BFA82AD0DF6A9E40087B4E1 /* jack_monitor_client 64 bits */ = { | ||||
@@ -4612,7 +4611,7 @@ | |||||
name = "jack_monitor_client 64 bits"; | name = "jack_monitor_client 64 bits"; | ||||
productInstallPath = /usr/local/bin; | productInstallPath = /usr/local/bin; | ||||
productName = jack_metro; | productName = jack_metro; | ||||
productReference = 4BFA82B70DF6A9E40087B4E1 /* jack_monitor_client */; | |||||
productReference = 4BFA82B70DF6A9E40087B4E1 /* jack_midiseq */; | |||||
productType = "com.apple.product-type.tool"; | productType = "com.apple.product-type.tool"; | ||||
}; | }; | ||||
4BFA82B90DF6A9E40087B4E1 /* jack_showtime 64 bits */ = { | 4BFA82B90DF6A9E40087B4E1 /* jack_showtime 64 bits */ = { | ||||
@@ -4631,7 +4630,7 @@ | |||||
name = "jack_showtime 64 bits"; | name = "jack_showtime 64 bits"; | ||||
productInstallPath = /usr/local/bin; | productInstallPath = /usr/local/bin; | ||||
productName = jack_metro; | productName = jack_metro; | ||||
productReference = 4BFA82C30DF6A9E40087B4E1 /* jack_showtime */; | |||||
productReference = 4BFA82C30DF6A9E40087B4E1 /* jack_midiseq */; | |||||
productType = "com.apple.product-type.tool"; | productType = "com.apple.product-type.tool"; | ||||
}; | }; | ||||
4BFA82C50DF6A9E40087B4E1 /* jack_impulse_grabber 64 bits */ = { | 4BFA82C50DF6A9E40087B4E1 /* jack_impulse_grabber 64 bits */ = { | ||||
@@ -4650,7 +4649,7 @@ | |||||
name = "jack_impulse_grabber 64 bits"; | name = "jack_impulse_grabber 64 bits"; | ||||
productInstallPath = /usr/local/bin; | productInstallPath = /usr/local/bin; | ||||
productName = jack_metro; | productName = jack_metro; | ||||
productReference = 4BFA82CF0DF6A9E40087B4E1 /* jack_impulse_grabber */; | |||||
productReference = 4BFA82CF0DF6A9E40087B4E1 /* jack_midiseq */; | |||||
productType = "com.apple.product-type.tool"; | productType = "com.apple.product-type.tool"; | ||||
}; | }; | ||||
4BFA99980AAAF3B0009E916C /* jdelay Universal */ = { | 4BFA99980AAAF3B0009E916C /* jdelay Universal */ = { | ||||
@@ -5389,6 +5388,7 @@ | |||||
4B93F1990E87992100E4ECCD /* JackPosixThread.cpp in Sources */, | 4B93F1990E87992100E4ECCD /* JackPosixThread.cpp in Sources */, | ||||
4B93F19B0E87992300E4ECCD /* JackProcessSync.cpp in Sources */, | 4B93F19B0E87992300E4ECCD /* JackProcessSync.cpp in Sources */, | ||||
4B93F22B0E87A72500E4ECCD /* JackMachTime.c in Sources */, | 4B93F22B0E87A72500E4ECCD /* JackMachTime.c in Sources */, | ||||
4BBAE4130F42FA6100B8BD3F /* JackEngineProfiling.cpp in Sources */, | |||||
); | ); | ||||
runOnlyForDeploymentPostprocessing = 0; | runOnlyForDeploymentPostprocessing = 0; | ||||
}; | }; | ||||
@@ -5762,12 +5762,12 @@ | |||||
4B4F9C8C0DC20C0400706CB0 /* JackMessageBuffer.cpp in Sources */, | 4B4F9C8C0DC20C0400706CB0 /* JackMessageBuffer.cpp in Sources */, | ||||
4BBC93BA0DF9736C002DF220 /* JackWaitThreadedDriver.cpp in Sources */, | 4BBC93BA0DF9736C002DF220 /* JackWaitThreadedDriver.cpp in Sources */, | ||||
4B4CA9760E02CF9600F4BFDA /* JackRestartThreadedDriver.cpp in Sources */, | 4B4CA9760E02CF9600F4BFDA /* JackRestartThreadedDriver.cpp in Sources */, | ||||
4B8F3D4B0E06C4A10096D19C /* JackEngineTiming.cpp in Sources */, | |||||
4B4E9AFA0E5F1090000A3278 /* JackControlAPI.cpp in Sources */, | 4B4E9AFA0E5F1090000A3278 /* JackControlAPI.cpp in Sources */, | ||||
4BC3B6A60E703B2E0066E42F /* JackPosixThread.cpp in Sources */, | 4BC3B6A60E703B2E0066E42F /* JackPosixThread.cpp in Sources */, | ||||
4BC3B6AC0E703B690066E42F /* JackProcessSync.cpp in Sources */, | 4BC3B6AC0E703B690066E42F /* JackProcessSync.cpp in Sources */, | ||||
4BF5FBCA0E878D24003D2374 /* JackMachTime.c in Sources */, | 4BF5FBCA0E878D24003D2374 /* JackMachTime.c in Sources */, | ||||
4BF2841A0F31B4BC00B05BE3 /* JackArgParser.cpp in Sources */, | 4BF2841A0F31B4BC00B05BE3 /* JackArgParser.cpp in Sources */, | ||||
4BBAE4110F42FA6100B8BD3F /* JackEngineProfiling.cpp in Sources */, | |||||
); | ); | ||||
runOnlyForDeploymentPostprocessing = 0; | runOnlyForDeploymentPostprocessing = 0; | ||||
}; | }; | ||||
@@ -21,17 +21,21 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
#define __JackCompilerDeps_POSIX__ | #define __JackCompilerDeps_POSIX__ | ||||
#if __GNUC__ | #if __GNUC__ | ||||
#define MEM_ALIGN(x,y) x __attribute__((aligned(y))) | |||||
#define EXPORT __attribute__((visibility("default"))) | |||||
#define MEM_ALIGN(x,y) x __attribute__((aligned(y))) | |||||
#define EXPORT __attribute__((visibility("default"))) | |||||
#ifdef SERVER_SIDE | #ifdef SERVER_SIDE | ||||
#define SERVER_EXPORT __attribute__((visibility("default"))) | |||||
#if (__GNUC__< 4) | |||||
#define SERVER_EXPORT | |||||
#else | |||||
#define SERVER_EXPORT __attribute__((visibility("default"))) | |||||
#endif | |||||
#else | #else | ||||
#define SERVER_EXPORT | #define SERVER_EXPORT | ||||
#endif | #endif | ||||
#else | #else | ||||
#define MEM_ALIGN(x,y) x | |||||
#define EXPORT | |||||
#define SERVER_EXPORT | |||||
#define MEM_ALIGN(x,y) x | |||||
#define EXPORT | |||||
#define SERVER_EXPORT | |||||
#endif | #endif | ||||
#endif | #endif | ||||
@@ -121,28 +121,27 @@ bool JackFifo::Allocate(const char* name, const char* server_name, int value) | |||||
{ | { | ||||
struct stat statbuf; | struct stat statbuf; | ||||
BuildName(name, server_name, fName); | BuildName(name, server_name, fName); | ||||
jack_log("JackFifo::Allocate name = %s", fName); | jack_log("JackFifo::Allocate name = %s", fName); | ||||
if (stat(fName, &statbuf)) { | |||||
if (errno == ENOENT) { | |||||
if (stat(fName, &statbuf) < 0) { | |||||
if (errno == ENOENT || errno == EPERM) { | |||||
if (mkfifo(fName, 0666) < 0) { | if (mkfifo(fName, 0666) < 0) { | ||||
jack_error("Cannot create inter-client FIFO [%s] (%s)\n", name, strerror(errno)); | |||||
jack_error("Cannot create inter-client FIFO name = %s err = %s", name, strerror(errno)); | |||||
return false; | return false; | ||||
} | } | ||||
} else { | } else { | ||||
jack_error("Cannot check on FIFO %s\n", name); | |||||
jack_error("Cannot check on FIFO %s", name); | |||||
return false; | return false; | ||||
} | } | ||||
} else { | } else { | ||||
if (!S_ISFIFO(statbuf.st_mode)) { | if (!S_ISFIFO(statbuf.st_mode)) { | ||||
jack_error("FIFO (%s) already exists, but is not a FIFO!\n", name); | |||||
jack_error("FIFO name = %s already exists, but is not a FIFO", name); | |||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
if ((fFifo = open(fName, O_RDWR | O_CREAT, 0666)) < 0) { | if ((fFifo = open(fName, O_RDWR | O_CREAT, 0666)) < 0) { | ||||
jack_error("Cannot open fifo [%s] (%s)", name, strerror(errno)); | |||||
jack_error("Cannot open FIFO name = %s err = %s", name, strerror(errno)); | |||||
return false; | return false; | ||||
} else { | } else { | ||||
fPoll.fd = fFifo; | fPoll.fd = fFifo; | ||||
@@ -18,6 +18,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
*/ | */ | ||||
#include "JackNetUnixSocket.h" | #include "JackNetUnixSocket.h" | ||||
#include <unistd.h> | |||||
#include <fcntl.h> | |||||
namespace Jack | namespace Jack | ||||
{ | { | ||||
@@ -38,6 +40,7 @@ namespace Jack | |||||
{ | { | ||||
fSockfd = 0; | fSockfd = 0; | ||||
fPort = 0; | fPort = 0; | ||||
fTimeOut = 0; | |||||
fSendAddr.sin_family = AF_INET; | fSendAddr.sin_family = AF_INET; | ||||
fSendAddr.sin_addr.s_addr = htonl ( INADDR_ANY ); | fSendAddr.sin_addr.s_addr = htonl ( INADDR_ANY ); | ||||
memset ( &fSendAddr.sin_zero, 0, 8 ); | memset ( &fSendAddr.sin_zero, 0, 8 ); | ||||
@@ -50,6 +53,7 @@ namespace Jack | |||||
{ | { | ||||
fSockfd = 0; | fSockfd = 0; | ||||
fPort = port; | fPort = port; | ||||
fTimeOut = 0; | |||||
fSendAddr.sin_family = AF_INET; | fSendAddr.sin_family = AF_INET; | ||||
fSendAddr.sin_port = htons ( port ); | fSendAddr.sin_port = htons ( port ); | ||||
inet_aton ( ip, &fSendAddr.sin_addr ); | inet_aton ( ip, &fSendAddr.sin_addr ); | ||||
@@ -63,6 +67,7 @@ namespace Jack | |||||
JackNetUnixSocket::JackNetUnixSocket ( const JackNetUnixSocket& socket ) | JackNetUnixSocket::JackNetUnixSocket ( const JackNetUnixSocket& socket ) | ||||
{ | { | ||||
fSockfd = 0; | fSockfd = 0; | ||||
fTimeOut = 0; | |||||
fPort = socket.fPort; | fPort = socket.fPort; | ||||
fSendAddr = socket.fSendAddr; | fSendAddr = socket.fSendAddr; | ||||
fRecvAddr = socket.fRecvAddr; | fRecvAddr = socket.fRecvAddr; | ||||
@@ -212,6 +217,86 @@ namespace Jack | |||||
} | } | ||||
//timeout************************************************************************************************************ | //timeout************************************************************************************************************ | ||||
#if defined(__sun__) || defined(sun) | |||||
int JackNetUnixSocket::SetTimeOut ( int us ) | |||||
{ | |||||
int flags; | |||||
fTimeOut = us; | |||||
if ((flags = fcntl(fSockfd, F_GETFL, 0)) < 0) { | |||||
jack_error("JackNetUnixSocket::SetTimeOut error in fcntl F_GETFL"); | |||||
return -1; | |||||
} | |||||
flags |= O_NONBLOCK; | |||||
if (fcntl(fSockfd, F_SETFL, flags) < 0) { | |||||
jack_error("JackNetUnixSocket::SetTimeOut error in fcntl F_SETFL"); | |||||
return 1; | |||||
} | |||||
return 0; | |||||
} | |||||
int JackNetUnixSocket::WaitRead() | |||||
{ | |||||
if (fTimeOut > 0) { | |||||
struct timeval tv; | |||||
fd_set fdset; | |||||
ssize_t res; | |||||
tv.tv_sec = fTimeOut / 1000000; | |||||
tv.tv_usec = fTimeOut % 1000000; | |||||
FD_ZERO(&fdset); | |||||
FD_SET(fSockfd, &fdset); | |||||
do { | |||||
res = select(fSockfd + 1, &fdset, NULL, NULL, &tv); | |||||
} while (res < 0 && errno == EINTR); | |||||
if (res < 0) { | |||||
return res; | |||||
} else if (res == 0) { | |||||
errno = ETIMEDOUT; | |||||
return -1; | |||||
} | |||||
} | |||||
return 0; | |||||
} | |||||
int JackNetUnixSocket::WaitWrite() | |||||
{ | |||||
if (fTimeOut > 0) { | |||||
struct timeval tv; | |||||
fd_set fdset; | |||||
ssize_t res; | |||||
tv.tv_sec = fTimeOut / 1000000; | |||||
tv.tv_usec = fTimeOut % 1000000; | |||||
FD_ZERO(&fdset); | |||||
FD_SET(fSockfd, &fdset); | |||||
do { | |||||
res = select(fSockfd + 1, NULL, &fdset, NULL, &tv); | |||||
} while (res < 0 && errno == EINTR); | |||||
if (res < 0) { | |||||
return res; | |||||
} else if (res == 0) { | |||||
errno = ETIMEDOUT; | |||||
return -1; | |||||
} | |||||
} | |||||
return 0; | |||||
} | |||||
#else | |||||
int JackNetUnixSocket::SetTimeOut ( int us ) | int JackNetUnixSocket::SetTimeOut ( int us ) | ||||
{ | { | ||||
jack_log ( "JackNetUnixSocket::SetTimeout %d usecs", us ); | jack_log ( "JackNetUnixSocket::SetTimeout %d usecs", us ); | ||||
@@ -237,6 +322,7 @@ namespace Jack | |||||
} | } | ||||
return SetOption ( SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof ( timeout ) ); | return SetOption ( SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof ( timeout ) ); | ||||
} | } | ||||
#endif | |||||
//local loop********************************************************************************************************** | //local loop********************************************************************************************************** | ||||
int JackNetUnixSocket::SetLocalLoop() | int JackNetUnixSocket::SetLocalLoop() | ||||
@@ -248,6 +334,10 @@ namespace Jack | |||||
//network operations************************************************************************************************** | //network operations************************************************************************************************** | ||||
int JackNetUnixSocket::SendTo ( const void* buffer, size_t nbytes, int flags ) | int JackNetUnixSocket::SendTo ( const void* buffer, size_t nbytes, int flags ) | ||||
{ | { | ||||
#if defined(__sun__) || defined(sun) | |||||
if (WaitWrite() < 0) | |||||
return -1; | |||||
#endif | |||||
return sendto ( fSockfd, buffer, nbytes, flags, reinterpret_cast<socket_address_t*> ( &fSendAddr ), sizeof ( socket_address_t ) ); | return sendto ( fSockfd, buffer, nbytes, flags, reinterpret_cast<socket_address_t*> ( &fSendAddr ), sizeof ( socket_address_t ) ); | ||||
} | } | ||||
@@ -256,28 +346,48 @@ namespace Jack | |||||
int addr_conv = inet_aton ( ip, &fSendAddr.sin_addr ); | int addr_conv = inet_aton ( ip, &fSendAddr.sin_addr ); | ||||
if ( addr_conv < 1 ) | if ( addr_conv < 1 ) | ||||
return addr_conv; | return addr_conv; | ||||
#if defined(__sun__) || defined(sun) | |||||
if (WaitWrite() < 0) | |||||
return -1; | |||||
#endif | |||||
return SendTo ( buffer, nbytes, flags ); | return SendTo ( buffer, nbytes, flags ); | ||||
} | } | ||||
int JackNetUnixSocket::Send ( const void* buffer, size_t nbytes, int flags ) | int JackNetUnixSocket::Send ( const void* buffer, size_t nbytes, int flags ) | ||||
{ | { | ||||
#if defined(__sun__) || defined(sun) | |||||
if (WaitWrite() < 0) | |||||
return -1; | |||||
#endif | |||||
return send ( fSockfd, buffer, nbytes, flags ); | return send ( fSockfd, buffer, nbytes, flags ); | ||||
} | } | ||||
int JackNetUnixSocket::RecvFrom ( void* buffer, size_t nbytes, int flags ) | int JackNetUnixSocket::RecvFrom ( void* buffer, size_t nbytes, int flags ) | ||||
{ | { | ||||
socklen_t addr_len = sizeof ( socket_address_t ); | socklen_t addr_len = sizeof ( socket_address_t ); | ||||
#if defined(__sun__) || defined(sun) | |||||
if (WaitRead() < 0) | |||||
return -1; | |||||
#endif | |||||
return recvfrom ( fSockfd, buffer, nbytes, flags, reinterpret_cast<socket_address_t*> ( &fRecvAddr ), &addr_len ); | return recvfrom ( fSockfd, buffer, nbytes, flags, reinterpret_cast<socket_address_t*> ( &fRecvAddr ), &addr_len ); | ||||
} | } | ||||
int JackNetUnixSocket::Recv ( void* buffer, size_t nbytes, int flags ) | int JackNetUnixSocket::Recv ( void* buffer, size_t nbytes, int flags ) | ||||
{ | { | ||||
#if defined(__sun__) || defined(sun) | |||||
if (WaitRead() < 0) | |||||
return -1; | |||||
#endif | |||||
return recv ( fSockfd, buffer, nbytes, flags ); | return recv ( fSockfd, buffer, nbytes, flags ); | ||||
} | } | ||||
int JackNetUnixSocket::CatchHost ( void* buffer, size_t nbytes, int flags ) | int JackNetUnixSocket::CatchHost ( void* buffer, size_t nbytes, int flags ) | ||||
{ | { | ||||
socklen_t addr_len = sizeof ( socket_address_t ); | socklen_t addr_len = sizeof ( socket_address_t ); | ||||
#if defined(__sun__) || defined(sun) | |||||
if (WaitRead() < 0) | |||||
return -1; | |||||
#endif | |||||
return recvfrom ( fSockfd, buffer, nbytes, flags, reinterpret_cast<socket_address_t*> ( &fSendAddr ), &addr_len ); | return recvfrom ( fSockfd, buffer, nbytes, flags, reinterpret_cast<socket_address_t*> ( &fSendAddr ), &addr_len ); | ||||
} | } | ||||
@@ -286,6 +396,7 @@ namespace Jack | |||||
switch ( errno ) | switch ( errno ) | ||||
{ | { | ||||
case EAGAIN: | case EAGAIN: | ||||
case ETIMEDOUT: | |||||
return NET_NO_DATA; | return NET_NO_DATA; | ||||
case ECONNABORTED: | case ECONNABORTED: | ||||
@@ -42,9 +42,14 @@ namespace Jack | |||||
private: | private: | ||||
int fSockfd; | int fSockfd; | ||||
int fPort; | int fPort; | ||||
int fTimeOut; | |||||
struct sockaddr_in fSendAddr; | struct sockaddr_in fSendAddr; | ||||
struct sockaddr_in fRecvAddr; | struct sockaddr_in fRecvAddr; | ||||
#if defined(__sun__) || defined(sun) | |||||
int WaitRead(); | |||||
int WaitWrite(); | |||||
#endif | |||||
public: | public: | ||||
JackNetUnixSocket(); | JackNetUnixSocket(); | ||||
JackNetUnixSocket ( const char* ip, int port ); | JackNetUnixSocket ( const char* ip, int port ); | ||||
@@ -18,18 +18,58 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
*/ | */ | ||||
#include "JackSocket.h" | #include "JackSocket.h" | ||||
#include "JackConstants.h" | |||||
#include "JackTools.h" | #include "JackTools.h" | ||||
#include "JackError.h" | #include "JackError.h" | ||||
#include <string.h> | #include <string.h> | ||||
#include <stdio.h> | #include <stdio.h> | ||||
#include <pthread.h> | #include <pthread.h> | ||||
#include <fcntl.h> | |||||
namespace Jack | namespace Jack | ||||
{ | { | ||||
JackClientSocket::JackClientSocket(int socket): fSocket(socket) | |||||
JackClientSocket::JackClientSocket(int socket): fSocket(socket),fTimeOut(0) | |||||
{} | {} | ||||
#if defined(__sun__) || defined(sun) | |||||
void JackClientSocket::SetReadTimeOut(long sec) | |||||
{ | |||||
int flags; | |||||
fTimeOut = sec; | |||||
if ((flags = fcntl(fSocket, F_GETFL, 0)) < 0) { | |||||
jack_error("JackClientSocket::SetReadTimeOut error in fcntl F_GETFL"); | |||||
return; | |||||
} | |||||
flags |= O_NONBLOCK; | |||||
if (fcntl(fSocket, F_SETFL, flags) < 0) { | |||||
jack_error("JackClientSocket::SetReadTimeOut error in fcntl F_SETFL"); | |||||
return; | |||||
} | |||||
} | |||||
void JackClientSocket::SetWriteTimeOut(long sec) | |||||
{ | |||||
int flags; | |||||
fTimeOut = sec; | |||||
if ((flags = fcntl(fSocket, F_GETFL, 0)) < 0) { | |||||
jack_error("JackClientSocket::SetWriteTimeOut error in fcntl F_GETFL"); | |||||
return; | |||||
} | |||||
flags |= O_NONBLOCK; | |||||
if (fcntl(fSocket, F_SETFL, flags) < 0) { | |||||
jack_error("JackClientSocket::SetWriteTimeOut error in fcntl F_SETFL"); | |||||
return; | |||||
} | |||||
} | |||||
#else | |||||
void JackClientSocket::SetReadTimeOut(long sec) | void JackClientSocket::SetReadTimeOut(long sec) | ||||
{ | { | ||||
struct timeval timout; | struct timeval timout; | ||||
@@ -50,11 +90,15 @@ void JackClientSocket::SetWriteTimeOut(long sec) | |||||
} | } | ||||
} | } | ||||
#endif | |||||
void JackClientSocket::SetNonBlocking(bool onoff) | void JackClientSocket::SetNonBlocking(bool onoff) | ||||
{ | { | ||||
int flag = (onoff) ? 1 : 0; | |||||
if (ioctl(fSocket, FIONBIO, &flag) < 0) { | |||||
jack_error("SetNonBlocking fd = %ld err = %s", fSocket, strerror(errno)); | |||||
if (onoff) { | |||||
long flags = 0; | |||||
if (fcntl(fSocket, F_SETFL, flags | O_NONBLOCK) < 0) { | |||||
jack_error("SetNonBlocking fd = %ld err = %s", fSocket, strerror(errno)); | |||||
} | |||||
} | } | ||||
} | } | ||||
@@ -131,11 +175,40 @@ int JackClientSocket::Close() | |||||
int JackClientSocket::Read(void* data, int len) | int JackClientSocket::Read(void* data, int len) | ||||
{ | { | ||||
if (read(fSocket, data, len) != len) { | |||||
jack_error("Cannot read socket fd = %d err = %s", fSocket, strerror(errno)); | |||||
int res; | |||||
#if defined(__sun__) || defined(sun) | |||||
if (fTimeOut > 0) { | |||||
struct timeval tv; | |||||
fd_set fdset; | |||||
ssize_t res; | |||||
tv.tv_sec = fTimeOut; | |||||
tv.tv_usec = 0; | |||||
FD_ZERO(&fdset); | |||||
FD_SET(fSocket, &fdset); | |||||
do { | |||||
res = select(fSocket + 1, &fdset, NULL, NULL, &tv); | |||||
} while (res < 0 && errno == EINTR); | |||||
if (res < 0) { | |||||
return res; | |||||
} else if (res == 0) { | |||||
return -1; | |||||
} | |||||
} | |||||
#endif | |||||
if ((res = read(fSocket, data, len)) != len) { | |||||
if (errno == EWOULDBLOCK) { | if (errno == EWOULDBLOCK) { | ||||
jack_error("JackClientSocket::Read time out"); | jack_error("JackClientSocket::Read time out"); | ||||
return 0; // For a non blocking socket, a read failure is not considered as an error | return 0; // For a non blocking socket, a read failure is not considered as an error | ||||
} else if (res != 0) { | |||||
jack_error("Cannot read socket fd = %d err = %s", fSocket, strerror(errno)); | |||||
return 0; | |||||
} else { | } else { | ||||
return -1; | return -1; | ||||
} | } | ||||
@@ -146,11 +219,40 @@ int JackClientSocket::Read(void* data, int len) | |||||
int JackClientSocket::Write(void* data, int len) | int JackClientSocket::Write(void* data, int len) | ||||
{ | { | ||||
if (write(fSocket, data, len) != len) { | |||||
jack_error("Cannot write socket fd = %ld err = %s", fSocket, strerror(errno)); | |||||
int res; | |||||
#if defined(__sun__) || defined(sun) | |||||
if (fTimeOut > 0) { | |||||
struct timeval tv; | |||||
fd_set fdset; | |||||
ssize_t res; | |||||
tv.tv_sec = fTimeOut; | |||||
tv.tv_usec = 0; | |||||
FD_ZERO(&fdset); | |||||
FD_SET(fSocket, &fdset); | |||||
do { | |||||
res = select(fSocket + 1, NULL, &fdset, NULL, &tv); | |||||
} while (res < 0 && errno == EINTR); | |||||
if (res < 0) { | |||||
return res; | |||||
} else if (res == 0) { | |||||
return -1; | |||||
} | |||||
} | |||||
#endif | |||||
if ((res = write(fSocket, data, len)) != len) { | |||||
if (errno == EWOULDBLOCK) { | if (errno == EWOULDBLOCK) { | ||||
jack_log("JackClientSocket::Write time out"); | jack_log("JackClientSocket::Write time out"); | ||||
return 0; // For a non blocking socket, a write failure is not considered as an error | return 0; // For a non blocking socket, a write failure is not considered as an error | ||||
} else if (res != 0) { | |||||
jack_error("Cannot write socket fd = %ld err = %s", fSocket, strerror(errno)); | |||||
return 0; | |||||
} else { | } else { | ||||
return -1; | return -1; | ||||
} | } | ||||
@@ -42,10 +42,11 @@ class JackClientSocket | |||||
private: | private: | ||||
int fSocket; | int fSocket; | ||||
int fTimeOut; | |||||
public: | public: | ||||
JackClientSocket(): fSocket( -1) | |||||
JackClientSocket(): fSocket( -1),fTimeOut(0) | |||||
{} | {} | ||||
JackClientSocket(int socket); | JackClientSocket(int socket); | ||||
@@ -154,7 +154,8 @@ bool JackSocketServerChannel::HandleRequest(int fd) | |||||
// Read header | // Read header | ||||
JackRequest header; | JackRequest header; | ||||
if (header.Read(socket) < 0) { | if (header.Read(socket) < 0) { | ||||
jack_error("HandleRequest: cannot read header"); | |||||
jack_log("HandleRequest: cannot read header"); | |||||
ClientKill(fd); // TO CHECK SOLARIS | |||||
return false; | return false; | ||||
} | } | ||||
@@ -391,7 +392,7 @@ bool JackSocketServerChannel::HandleRequest(int fd) | |||||
} | } | ||||
default: | default: | ||||
jack_log("Unknown request %ld", header.fType); | |||||
jack_error("Unknown request %ld", header.fType); | |||||
break; | break; | ||||
} | } | ||||
@@ -449,7 +450,7 @@ bool JackSocketServerChannel::Execute() | |||||
ClientKill(fd); | ClientKill(fd); | ||||
} else if (fPollTable[i].revents & POLLIN) { | } else if (fPollTable[i].revents & POLLIN) { | ||||
if (!HandleRequest(fd)) | if (!HandleRequest(fd)) | ||||
jack_error("Could not handle external client request"); | |||||
jack_log("Could not handle external client request"); | |||||
} | } | ||||
} | } | ||||
@@ -0,0 +1,32 @@ | |||||
/* | |||||
Copyright (C) 2004-2008 Grame | |||||
This program is free software; you can redistribute it and/or modify | |||||
it under the terms of the GNU Lesser General Public License as published by | |||||
the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. | |||||
You should have received a copy of the GNU Lesser General Public License | |||||
along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
*/ | |||||
#ifndef __JackAtomic_sun__ | |||||
#define __JackAtomic_sun__ | |||||
#include "JackTypes.h" | |||||
#include <atomic.h> | |||||
static inline char CAS(volatile UInt32 value, UInt32 newvalue, volatile void* addr) | |||||
{ | |||||
return (atomic_cas_32((uint32_t*)addr, value, newvalue) == value); | |||||
} | |||||
#endif | |||||
@@ -0,0 +1,80 @@ | |||||
/* | |||||
Copyright (C) 2004-2008 Grame | |||||
This program is free software; you can redistribute it and/or modify | |||||
it under the terms of the GNU Lesser General Public License as published by | |||||
the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. | |||||
You should have received a copy of the GNU Lesser General Public License | |||||
along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
*/ | |||||
#ifndef __JackPlatformPlug_sun__ | |||||
#define __JackPlatformPlug_sun__ | |||||
namespace Jack | |||||
{ | |||||
struct JackRequest; | |||||
struct JackResult; | |||||
class JackPosixMutex; | |||||
class JackPosixThread; | |||||
class JackFifo; | |||||
class JackSocketServerChannel; | |||||
class JackSocketClientChannel; | |||||
class JackSocketServerNotifyChannel; | |||||
class JackSocketNotifyChannel; | |||||
class JackClientSocket; | |||||
class JackNetUnixSocket; | |||||
} | |||||
/* __JackPlatformMutex__ */ | |||||
#include "JackPosixMutex.h" | |||||
namespace Jack {typedef JackPosixMutex JackMutex; } | |||||
/* __JackPlatformThread__ */ | |||||
#include "JackPosixThread.h" | |||||
namespace Jack { typedef JackPosixThread JackThread; } | |||||
/* __JackPlatformSynchro__ client activation */ | |||||
#include "JackFifo.h" | |||||
namespace Jack { typedef JackFifo JackSynchro; } | |||||
/* __JackPlatformChannelTransaction__ */ | |||||
#include "JackSocket.h" | |||||
namespace Jack { typedef JackClientSocket JackChannelTransaction; } | |||||
#include "JackProcessSync.h" | |||||
/* __JackPlatformProcessSync__ */ | |||||
/* Only on windows a special JackProcessSync is used. It is directly defined by including JackProcessSync.h here */ | |||||
/* __JackPlatformServerChannel__ */ | |||||
#include "JackSocketServerChannel.h" | |||||
namespace Jack { typedef JackSocketServerChannel JackServerChannel; } | |||||
/* __JackPlatformClientChannel__ */ | |||||
#include "JackSocketClientChannel.h" | |||||
namespace Jack { typedef JackSocketClientChannel JackClientChannel; } | |||||
/* __JackPlatformServerNotifyChannel__ */ | |||||
#include "JackSocketServerNotifyChannel.h" | |||||
namespace Jack { typedef JackSocketServerNotifyChannel JackServerNotifyChannel; } | |||||
/* __JackPlatformNotifyChannel__ */ | |||||
#include "JackSocketNotifyChannel.h" | |||||
namespace Jack { typedef JackSocketNotifyChannel JackNotifyChannel; } | |||||
/* __JackPlatformNetSocket__ */ | |||||
#include "JackNetUnixSocket.h" | |||||
namespace Jack { typedef JackNetUnixSocket JackNetSocket; } | |||||
#endif |
@@ -0,0 +1,37 @@ | |||||
/* | |||||
Copyright (C) 2001-2003 Paul Davis | |||||
Copyright (C) 2004-2008 Grame | |||||
This program is free software; you can redistribute it and/or modify | |||||
it under the terms of the GNU Lesser General Public License as published by | |||||
the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. | |||||
You should have received a copy of the GNU Lesser General Public License | |||||
along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
*/ | |||||
#include "JackTime.h" | |||||
#include <unistd.h> | |||||
#include <time.h> | |||||
SERVER_EXPORT void JackSleep(long usec) | |||||
{ | |||||
usleep(usec); | |||||
} | |||||
SERVER_EXPORT void InitTime() | |||||
{} | |||||
SERVER_EXPORT jack_time_t GetMicroSeconds(void) | |||||
{ | |||||
return (jack_time_t)(gethrtime() / 1000); | |||||
} | |||||
@@ -0,0 +1,766 @@ | |||||
/* | |||||
Copyright (C) 2008 Grame & RTL 2008 | |||||
This program is free software; you can redistribute it and/or modify | |||||
it under the terms of the GNU General Public License as published by | |||||
the Free Software Foundation; either version 2 of the License, or | |||||
(at your option) any later version. | |||||
This program is distributed in the hope that it will be useful, | |||||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
GNU General Public License for more details. | |||||
You should have received a copy of the GNU General Public License | |||||
along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
*/ | |||||
#include "JackOSSAdapter.h" | |||||
#include "JackServerGlobals.h" | |||||
#include "JackEngineControl.h" | |||||
#include "memops.h" | |||||
#include <sys/ioctl.h> | |||||
#include <sys/soundcard.h> | |||||
#include <fcntl.h> | |||||
#include <iostream> | |||||
#include <assert.h> | |||||
namespace Jack | |||||
{ | |||||
inline int int2pow2(int x) { int r = 0; while ((1 << r) < x) r++; return r; } | |||||
static inline void CopyAndConvertIn(jack_sample_t *dst, void *src, size_t nframes, int channel, int chcount, int bits) | |||||
{ | |||||
switch (bits) { | |||||
case 16: { | |||||
signed short *s16src = (signed short*)src; | |||||
s16src += channel; | |||||
sample_move_dS_s16(dst, (char*)s16src, nframes, chcount<<1); | |||||
break; | |||||
} | |||||
case 24: { | |||||
signed short *s32src = (signed short*)src; | |||||
s32src += channel; | |||||
sample_move_dS_s24(dst, (char*)s32src, nframes, chcount<<2); | |||||
break; | |||||
} | |||||
case 32: { | |||||
signed short *s32src = (signed short*)src; | |||||
s32src += channel; | |||||
sample_move_dS_s32u24(dst, (char*)s32src, nframes, chcount<<2); | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
static inline void CopyAndConvertOut(void *dst, jack_sample_t *src, size_t nframes, int channel, int chcount, int bits) | |||||
{ | |||||
switch (bits) { | |||||
case 16: { | |||||
signed short *s16dst = (signed short*)dst; | |||||
s16dst += channel; | |||||
sample_move_d16_sS((char*)s16dst, src, nframes, chcount<<1, NULL); // No dithering for now... | |||||
break; | |||||
} | |||||
case 24: { | |||||
signed int *s32dst = (signed int*)dst; | |||||
s32dst += channel; | |||||
sample_move_d24_sS((char*)s32dst, src, nframes, chcount<<2, NULL); // No dithering for now... | |||||
break; | |||||
} | |||||
case 32: { | |||||
signed int *s32dst = (signed int*)dst; | |||||
s32dst += channel; | |||||
sample_move_d32u24_sS((char*)s32dst, src, nframes, chcount<<2, NULL); | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
void JackOSSAdapter::SetSampleFormat() | |||||
{ | |||||
switch (fBits) { | |||||
case 24: /* native-endian LSB aligned 24-bits in 32-bits integer */ | |||||
fSampleFormat = AFMT_S24_NE; | |||||
fSampleSize = sizeof(int); | |||||
break; | |||||
case 32: /* native-endian 32-bit integer */ | |||||
fSampleFormat = AFMT_S32_NE; | |||||
fSampleSize = sizeof(int); | |||||
break; | |||||
case 16: /* native-endian 16-bit integer */ | |||||
default: | |||||
fSampleFormat = AFMT_S16_NE; | |||||
fSampleSize = sizeof(short); | |||||
break; | |||||
} | |||||
} | |||||
JackOSSAdapter::JackOSSAdapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params) | |||||
:JackAudioAdapterInterface(buffer_size, sample_rate) | |||||
,fThread(this), | |||||
fInFD(-1), fOutFD(-1), fBits(OSS_DRIVER_DEF_BITS), | |||||
fSampleFormat(0), fNperiods(OSS_DRIVER_DEF_NPERIODS), fRWMode(0), fIgnoreHW(true), fExcl(false), | |||||
fInputBufferSize(0), fOutputBufferSize(0), | |||||
fInputBuffer(NULL), fOutputBuffer(NULL), fFirstCycle(true) | |||||
{ | |||||
const JSList* node; | |||||
const jack_driver_param_t* param; | |||||
fCaptureChannels = 2; | |||||
fPlaybackChannels = 2; | |||||
strcpy(fCaptureDriverName, OSS_DRIVER_DEF_DEV); | |||||
strcpy(fPlaybackDriverName, OSS_DRIVER_DEF_DEV); | |||||
for (node = params; node; node = jack_slist_next(node)) { | |||||
param = (const jack_driver_param_t*) node->data; | |||||
switch (param->character) { | |||||
case 'r': | |||||
SetAdaptedSampleRate(param->value.ui); | |||||
break; | |||||
case 'p': | |||||
SetAdaptedBufferSize(param->value.ui); | |||||
break; | |||||
case 'n': | |||||
fNperiods = param->value.ui; | |||||
break; | |||||
case 'w': | |||||
fBits = param->value.i; | |||||
break; | |||||
case 'i': | |||||
fCaptureChannels = param->value.ui; | |||||
break; | |||||
case 'o': | |||||
fPlaybackChannels = param->value.ui; | |||||
break; | |||||
case 'e': | |||||
fExcl = true; | |||||
break; | |||||
case 'C': | |||||
fRWMode |= kRead; | |||||
if (strcmp(param->value.str, "none") != 0) { | |||||
strcpy(fCaptureDriverName, param->value.str); | |||||
} | |||||
break; | |||||
case 'P': | |||||
fRWMode |= kWrite; | |||||
if (strcmp(param->value.str, "none") != 0) { | |||||
strcpy(fPlaybackDriverName, param->value.str); | |||||
} | |||||
break; | |||||
case 'd': | |||||
fRWMode |= kRead; | |||||
fRWMode |= kWrite; | |||||
strcpy(fCaptureDriverName, param->value.str); | |||||
strcpy(fPlaybackDriverName, param->value.str); | |||||
break; | |||||
case 'b': | |||||
fIgnoreHW = true; | |||||
break; | |||||
case 'q': | |||||
fQuality = param->value.ui; | |||||
break; | |||||
} | |||||
} | |||||
fRWMode |= kRead; | |||||
fRWMode |= kWrite; | |||||
} | |||||
void JackOSSAdapter::DisplayDeviceInfo() | |||||
{ | |||||
audio_buf_info info; | |||||
oss_audioinfo ai_in, ai_out; | |||||
memset(&info, 0, sizeof(audio_buf_info)); | |||||
int cap = 0; | |||||
// Duplex cards : http://manuals.opensound.com/developer/full_duplex.html | |||||
jack_info("Audio Interface Description :"); | |||||
jack_info("Sampling Frequency : %d, Sample Format : %d, Mode : %d", fAdaptedSampleRate, fSampleFormat, fRWMode); | |||||
if (fRWMode & kWrite) { | |||||
oss_sysinfo si; | |||||
if (ioctl(fOutFD, OSS_SYSINFO, &si) == -1) { | |||||
jack_error("JackOSSAdapter::DisplayDeviceInfo OSS_SYSINFO failed : %s@%i, errno = %d", __FILE__, __LINE__, errno); | |||||
} else { | |||||
jack_info("OSS product %s", si.product); | |||||
jack_info("OSS version %s", si.version); | |||||
jack_info("OSS version num %d", si.versionnum); | |||||
jack_info("OSS numaudios %d", si.numaudios); | |||||
jack_info("OSS numaudioengines %d", si.numaudioengines); | |||||
jack_info("OSS numcards %d", si.numcards); | |||||
} | |||||
jack_info("Output capabilities - %d channels : ", fPlaybackChannels); | |||||
jack_info("Output block size = %d", fOutputBufferSize); | |||||
if (ioctl(fOutFD, SNDCTL_DSP_GETOSPACE, &info) == -1) { | |||||
jack_error("JackOSSAdapter::DisplayDeviceInfo SNDCTL_DSP_GETOSPACE failed : %s@%i, errno = %d", __FILE__, __LINE__, errno); | |||||
} else { | |||||
jack_info("output space info: fragments = %d, fragstotal = %d, fragsize = %d, bytes = %d", | |||||
info.fragments, info.fragstotal, info.fragsize, info.bytes); | |||||
} | |||||
if (ioctl(fOutFD, SNDCTL_DSP_GETCAPS, &cap) == -1) { | |||||
jack_error("JackOSSAdapter::DisplayDeviceInfo SNDCTL_DSP_GETCAPS failed : %s@%i, errno = %d", __FILE__, __LINE__, errno); | |||||
} else { | |||||
if (cap & DSP_CAP_DUPLEX) jack_info(" DSP_CAP_DUPLEX"); | |||||
if (cap & DSP_CAP_REALTIME) jack_info(" DSP_CAP_REALTIME"); | |||||
if (cap & DSP_CAP_BATCH) jack_info(" DSP_CAP_BATCH"); | |||||
if (cap & DSP_CAP_COPROC) jack_info(" DSP_CAP_COPROC"); | |||||
if (cap & DSP_CAP_TRIGGER) jack_info(" DSP_CAP_TRIGGER"); | |||||
if (cap & DSP_CAP_MMAP) jack_info(" DSP_CAP_MMAP"); | |||||
if (cap & DSP_CAP_MULTI) jack_info(" DSP_CAP_MULTI"); | |||||
if (cap & DSP_CAP_BIND) jack_info(" DSP_CAP_BIND"); | |||||
} | |||||
} | |||||
if (fRWMode & kRead) { | |||||
oss_sysinfo si; | |||||
if (ioctl(fInFD, OSS_SYSINFO, &si) == -1) { | |||||
jack_error("JackOSSAdapter::DisplayDeviceInfo OSS_SYSINFO failed : %s@%i, errno = %d", __FILE__, __LINE__, errno); | |||||
} else { | |||||
jack_info("OSS product %s", si.product); | |||||
jack_info("OSS version %s", si.version); | |||||
jack_info("OSS version num %d", si.versionnum); | |||||
jack_info("OSS numaudios %d", si.numaudios); | |||||
jack_info("OSS numaudioengines %d", si.numaudioengines); | |||||
jack_info("OSS numcards %d", si.numcards); | |||||
} | |||||
jack_info("Input capabilities - %d channels : ", fCaptureChannels); | |||||
jack_info("Input block size = %d", fInputBufferSize); | |||||
if (ioctl(fInFD, SNDCTL_DSP_GETOSPACE, &info) == -1) { | |||||
jack_error("JackOSSAdapter::DisplayDeviceInfo SNDCTL_DSP_GETOSPACE failed : %s@%i, errno = %d", __FILE__, __LINE__, errno); | |||||
} else { | |||||
jack_info("input space info: fragments = %d, fragstotal = %d, fragsize = %d, bytes = %d", | |||||
info.fragments, info.fragstotal, info.fragsize, info.bytes); | |||||
} | |||||
if (ioctl(fInFD, SNDCTL_DSP_GETCAPS, &cap) == -1) { | |||||
jack_error("JackOSSAdapter::DisplayDeviceInfo SNDCTL_DSP_GETCAPS failed : %s@%i, errno = %d", __FILE__, __LINE__, errno); | |||||
} else { | |||||
if (cap & DSP_CAP_DUPLEX) jack_info(" DSP_CAP_DUPLEX"); | |||||
if (cap & DSP_CAP_REALTIME) jack_info(" DSP_CAP_REALTIME"); | |||||
if (cap & DSP_CAP_BATCH) jack_info(" DSP_CAP_BATCH"); | |||||
if (cap & DSP_CAP_COPROC) jack_info(" DSP_CAP_COPROC"); | |||||
if (cap & DSP_CAP_TRIGGER) jack_info(" DSP_CAP_TRIGGER"); | |||||
if (cap & DSP_CAP_MMAP) jack_info(" DSP_CAP_MMAP"); | |||||
if (cap & DSP_CAP_MULTI) jack_info(" DSP_CAP_MULTI"); | |||||
if (cap & DSP_CAP_BIND) jack_info(" DSP_CAP_BIND"); | |||||
} | |||||
} | |||||
if (ioctl(fInFD, SNDCTL_AUDIOINFO, &ai_in) != -1) { | |||||
jack_info("Using audio engine %d = %s for input", ai_in.dev, ai_in.name); | |||||
} | |||||
if (ioctl(fOutFD, SNDCTL_AUDIOINFO, &ai_out) != -1) { | |||||
jack_info("Using audio engine %d = %s for output", ai_out.dev, ai_out.name); | |||||
} | |||||
if (ai_in.rate_source != ai_out.rate_source) { | |||||
jack_info("Warning : input and output are not necessarily driven by the same clock!"); | |||||
} | |||||
} | |||||
int JackOSSAdapter::OpenInput() | |||||
{ | |||||
int flags = 0; | |||||
int gFragFormat; | |||||
int cur_sample_format, cur_capture_channels; | |||||
jack_nframes_t cur_sample_rate; | |||||
if (fCaptureChannels == 0) fCaptureChannels = 2; | |||||
if ((fInFD = open(fCaptureDriverName, O_RDONLY | ((fExcl) ? O_EXCL : 0))) < 0) { | |||||
jack_error("JackOSSAdapter::OpenInput failed to open device : %s@%i, errno = %d", __FILE__, __LINE__, errno); | |||||
return -1; | |||||
} | |||||
jack_log("JackOSSAdapter::OpenInput input fInFD = %d", fInFD); | |||||
if (fExcl) { | |||||
if (ioctl(fInFD, SNDCTL_DSP_COOKEDMODE, &flags) == -1) { | |||||
jack_error("JackOSSAdapter::OpenInput failed to set cooked mode : %s@%i, errno = %d", __FILE__, __LINE__, errno); | |||||
goto error; | |||||
} | |||||
} | |||||
printf("fAdaptedBufferSize %d %d %d %d %s\n", fExcl, fAdaptedBufferSize, fSampleSize, fCaptureChannels, fCaptureDriverName); | |||||
gFragFormat = (2 << 16) + int2pow2(fAdaptedBufferSize * fSampleSize * fCaptureChannels); | |||||
if (ioctl(fInFD, SNDCTL_DSP_SETFRAGMENT, &gFragFormat) == -1) { | |||||
jack_error("JackOSSAdapter::OpenInput failed to set fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno); | |||||
goto error; | |||||
} | |||||
cur_sample_format = fSampleFormat; | |||||
if (ioctl(fInFD, SNDCTL_DSP_SETFMT, &fSampleFormat) == -1) { | |||||
jack_error("JackOSSAdapter::OpenInput failed to set format : %s@%i, errno = %d", __FILE__, __LINE__, errno); | |||||
goto error; | |||||
} | |||||
if (cur_sample_format != fSampleFormat) { | |||||
jack_info("JackOSSAdapter::OpenInput driver forced the sample format %ld", fSampleFormat); | |||||
} | |||||
cur_capture_channels = fCaptureChannels; | |||||
if (ioctl(fInFD, SNDCTL_DSP_CHANNELS, &fCaptureChannels) == -1) { | |||||
jack_error("JackOSSAdapter::OpenInput failed to set channels : %s@%i, errno = %d", __FILE__, __LINE__, errno); | |||||
goto error; | |||||
} | |||||
if (cur_capture_channels != fCaptureChannels) { | |||||
jack_info("JackOSSAdapter::OpenInput driver forced the number of capture channels %ld", fCaptureChannels); | |||||
} | |||||
cur_sample_rate = fAdaptedSampleRate; | |||||
if (ioctl(fInFD, SNDCTL_DSP_SPEED, &fAdaptedSampleRate) == -1) { | |||||
jack_error("JackOSSAdapter::OpenInput failed to set sample rate : %s@%i, errno = %d", __FILE__, __LINE__, errno); | |||||
goto error; | |||||
} | |||||
if (cur_sample_rate != fAdaptedSampleRate) { | |||||
jack_info("JackOSSAdapter::OpenInput driver forced the sample rate %ld", fAdaptedSampleRate); | |||||
} | |||||
fInputBufferSize = 0; | |||||
if (ioctl(fInFD, SNDCTL_DSP_GETBLKSIZE, &fInputBufferSize) == -1) { | |||||
jack_error("JackOSSAdapter::OpenInput failed to get fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno); | |||||
goto error; | |||||
} | |||||
if (fInputBufferSize != fAdaptedBufferSize * fSampleSize * fCaptureChannels) { | |||||
if (fIgnoreHW) { | |||||
jack_info("JackOSSAdapter::OpenInput driver forced buffer size %ld", fOutputBufferSize); | |||||
} else { | |||||
jack_error("JackOSSAdapter::OpenInput wanted buffer size cannot be obtained"); | |||||
goto error; | |||||
} | |||||
} | |||||
fInputBuffer = (void*)calloc(fInputBufferSize, 1); | |||||
assert(fInputBuffer); | |||||
fInputSampleBuffer = (float**)malloc(fCaptureChannels * sizeof(float*)); | |||||
assert(fInputSampleBuffer); | |||||
for (int i = 0; i < fCaptureChannels; i++) { | |||||
fInputSampleBuffer[i] = (float*)malloc(fAdaptedBufferSize * sizeof(float)); | |||||
assert(fInputSampleBuffer[i]); | |||||
} | |||||
return 0; | |||||
error: | |||||
::close(fInFD); | |||||
return -1; | |||||
} | |||||
int JackOSSAdapter::OpenOutput() | |||||
{ | |||||
int flags = 0; | |||||
int gFragFormat; | |||||
int cur_sample_format, cur_playback_channels; | |||||
jack_nframes_t cur_sample_rate; | |||||
if (fPlaybackChannels == 0) fPlaybackChannels = 2; | |||||
if ((fOutFD = open(fPlaybackDriverName, O_WRONLY | ((fExcl) ? O_EXCL : 0))) < 0) { | |||||
jack_error("JackOSSAdapter::OpenOutput failed to open device : %s@%i, errno = %d", __FILE__, __LINE__, errno); | |||||
return -1; | |||||
} | |||||
if (fExcl) { | |||||
if (ioctl(fOutFD, SNDCTL_DSP_COOKEDMODE, &flags) == -1) { | |||||
jack_error("JackOSSAdapter::OpenOutput failed to set cooked mode : %s@%i, errno = %d", __FILE__, __LINE__, errno); | |||||
goto error; | |||||
} | |||||
} | |||||
printf("fAdaptedBufferSize %d %d %d %d %s\n", fExcl, fAdaptedBufferSize, fSampleSize, fPlaybackChannels, fPlaybackDriverName); | |||||
gFragFormat = (2 << 16) + int2pow2(fAdaptedBufferSize * fSampleSize * fPlaybackChannels); | |||||
if (ioctl(fOutFD, SNDCTL_DSP_SETFRAGMENT, &gFragFormat) == -1) { | |||||
jack_error("JackOSSAdapter::OpenOutput failed to set fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno); | |||||
goto error; | |||||
} | |||||
cur_sample_format = fSampleFormat; | |||||
if (ioctl(fOutFD, SNDCTL_DSP_SETFMT, &fSampleFormat) == -1) { | |||||
jack_error("JackOSSAdapter::OpenOutput failed to set format : %s@%i, errno = %d", __FILE__, __LINE__, errno); | |||||
goto error; | |||||
} | |||||
if (cur_sample_format != fSampleFormat) { | |||||
jack_info("JackOSSAdapter::OpenOutput driver forced the sample format %ld", fSampleFormat); | |||||
} | |||||
cur_playback_channels = fPlaybackChannels; | |||||
if (ioctl(fOutFD, SNDCTL_DSP_CHANNELS, &fPlaybackChannels) == -1) { | |||||
jack_error("JackOSSAdapter::OpenOutput failed to set channels : %s@%i, errno = %d", __FILE__, __LINE__, errno); | |||||
goto error; | |||||
} | |||||
if (cur_playback_channels != fPlaybackChannels) { | |||||
jack_info("JackOSSAdapter::OpenOutput driver forced the number of playback channels %ld", fPlaybackChannels); | |||||
} | |||||
cur_sample_rate = fAdaptedSampleRate; | |||||
if (ioctl(fOutFD, SNDCTL_DSP_SPEED, &fAdaptedSampleRate) == -1) { | |||||
jack_error("JackOSSAdapter::OpenOutput failed to set sample rate : %s@%i, errno = %d", __FILE__, __LINE__, errno); | |||||
goto error; | |||||
} | |||||
if (cur_sample_rate != fAdaptedSampleRate) { | |||||
jack_info("JackOSSAdapter::OpenInput driver forced the sample rate %ld", fAdaptedSampleRate); | |||||
} | |||||
fOutputBufferSize = 0; | |||||
if (ioctl(fOutFD, SNDCTL_DSP_GETBLKSIZE, &fOutputBufferSize) == -1) { | |||||
jack_error("JackOSSAdapter::OpenOutput failed to get fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno); | |||||
goto error; | |||||
} | |||||
if (fOutputBufferSize != fAdaptedBufferSize * fSampleSize * fPlaybackChannels) { | |||||
if (fIgnoreHW) { | |||||
jack_info("JackOSSAdapter::OpenOutput driver forced buffer size %ld", fOutputBufferSize); | |||||
} else { | |||||
jack_error("JackOSSAdapter::OpenInput wanted buffer size cannot be obtained"); | |||||
goto error; | |||||
} | |||||
} | |||||
fOutputBuffer = (void*)calloc(fOutputBufferSize, 1); | |||||
assert(fOutputBuffer); | |||||
fOutputSampleBuffer = (float**)malloc(fPlaybackChannels * sizeof(float*)); | |||||
assert(fOutputSampleBuffer); | |||||
for (int i = 0; i < fPlaybackChannels; i++) { | |||||
fOutputSampleBuffer[i] = (float*)malloc(fAdaptedBufferSize * sizeof(float)); | |||||
assert(fOutputSampleBuffer[i]); | |||||
} | |||||
fFirstCycle = true; | |||||
return 0; | |||||
error: | |||||
::close(fOutFD); | |||||
return -1; | |||||
} | |||||
int JackOSSAdapter::Open() | |||||
{ | |||||
SetSampleFormat(); | |||||
if ((fRWMode & kRead) && (OpenInput() < 0)) { | |||||
return -1; | |||||
} | |||||
if ((fRWMode & kWrite) && (OpenOutput() < 0)) { | |||||
return -1; | |||||
} | |||||
// In duplex mode, check that input and output use the same buffer size | |||||
if ((fRWMode & kRead) && (fRWMode & kWrite) && (fInputBufferSize != fOutputBufferSize)) { | |||||
jack_error("JackOSSAdapter::OpenAux input and output buffer size are not the same!!"); | |||||
goto error; | |||||
} | |||||
DisplayDeviceInfo(); | |||||
fThread.AcquireRealTime(JackServerGlobals::fInstance->GetEngineControl()->fClientPriority); | |||||
return fThread.StartSync(); | |||||
error: | |||||
CloseAux(); | |||||
return -1; | |||||
} | |||||
int JackOSSAdapter::Close() | |||||
{ | |||||
#ifdef DEBUG | |||||
fTable.Save(); | |||||
#endif | |||||
fThread.Stop(); | |||||
CloseAux(); | |||||
return 0; | |||||
} | |||||
void JackOSSAdapter::CloseAux() | |||||
{ | |||||
if (fRWMode & kRead) { | |||||
close(fInFD); | |||||
fInFD = -1; | |||||
} | |||||
if (fRWMode & kWrite) { | |||||
close(fOutFD); | |||||
fOutFD = -1; | |||||
} | |||||
free(fInputBuffer); | |||||
fInputBuffer = NULL; | |||||
free(fOutputBuffer); | |||||
fOutputBuffer = NULL; | |||||
for (int i = 0; i < fCaptureChannels; i++) { | |||||
free(fInputSampleBuffer[i]); | |||||
} | |||||
free(fInputSampleBuffer); | |||||
for (int i = 0; i < fPlaybackChannels; i++) { | |||||
free(fOutputSampleBuffer[i]); | |||||
} | |||||
free(fOutputSampleBuffer); | |||||
} | |||||
int JackOSSAdapter::Read() | |||||
{ | |||||
ssize_t count = ::read(fInFD, fInputBuffer, fInputBufferSize); | |||||
if (count < fInputBufferSize) { | |||||
jack_error("JackOSSAdapter::Read error bytes read = %ld", count); | |||||
return -1; | |||||
} else { | |||||
for (int i = 0; i < fCaptureChannels; i++) { | |||||
CopyAndConvertIn(fInputSampleBuffer[i], fInputBuffer, fAdaptedBufferSize, i, fCaptureChannels, fBits); | |||||
} | |||||
return 0; | |||||
} | |||||
} | |||||
int JackOSSAdapter::Write() | |||||
{ | |||||
ssize_t count; | |||||
// Maybe necessay to write an empty output buffer first time : see http://manuals.opensound.com/developer/fulldup.c.html | |||||
if (fFirstCycle) { | |||||
fFirstCycle = false; | |||||
memset(fOutputBuffer, 0, fOutputBufferSize); | |||||
// Prefill ouput buffer | |||||
for (int i = 0; i < fNperiods; i++) { | |||||
count = ::write(fOutFD, fOutputBuffer, fOutputBufferSize); | |||||
if (count < fOutputBufferSize) { | |||||
jack_error("JackOSSDriver::Write error bytes written = %ld", count); | |||||
return -1; | |||||
} | |||||
} | |||||
int delay; | |||||
if (ioctl(fOutFD, SNDCTL_DSP_GETODELAY, &delay) == -1) { | |||||
jack_error("JackOSSDriver::Write error get out delay : %s@%i, errno = %d", __FILE__, __LINE__, errno); | |||||
return -1; | |||||
} | |||||
delay /= fSampleSize * fPlaybackChannels; | |||||
jack_info("JackOSSDriver::Write output latency frames = %ld", delay); | |||||
} | |||||
for (int i = 0; i < fPlaybackChannels; i++) { | |||||
CopyAndConvertOut(fOutputBuffer, fOutputSampleBuffer[i], fAdaptedBufferSize, i, fCaptureChannels, fBits); | |||||
} | |||||
count = ::write(fOutFD, fOutputBuffer, fOutputBufferSize); | |||||
if (count < fOutputBufferSize) { | |||||
jack_error("JackOSSAdapter::Write error bytes written = %ld", count); | |||||
return -1; | |||||
} else { | |||||
return 0; | |||||
} | |||||
} | |||||
bool JackOSSAdapter::Execute() | |||||
{ | |||||
if (Read() < 0) | |||||
return false; | |||||
bool failure = false; | |||||
jack_nframes_t time1, time2; | |||||
ResampleFactor(time1, time2); | |||||
for (int i = 0; i < fCaptureChannels; i++) { | |||||
fCaptureRingBuffer[i]->SetRatio(time1, time2); | |||||
if (fCaptureRingBuffer[i]->WriteResample(fInputSampleBuffer[i], fAdaptedBufferSize) < fAdaptedBufferSize) | |||||
failure = true; | |||||
} | |||||
for (int i = 0; i < fPlaybackChannels; i++) { | |||||
fPlaybackRingBuffer[i]->SetRatio(time2, time1); | |||||
if (fPlaybackRingBuffer[i]->ReadResample(fOutputSampleBuffer[i], fAdaptedBufferSize) < fAdaptedBufferSize) | |||||
failure = true; | |||||
} | |||||
#ifdef DEBUG | |||||
fTable.Write(time1, time2, double(time1) / double(time2), double(time2) / double(time1), | |||||
fCaptureRingBuffer[0]->ReadSpace(), fPlaybackRingBuffer[0]->WriteSpace()); | |||||
#endif | |||||
if (Write() < 0) | |||||
return false; | |||||
// Reset all ringbuffers in case of failure | |||||
if (failure) { | |||||
jack_error("JackOSSAdapter::Execute ringbuffer failure... reset"); | |||||
ResetRingBuffers(); | |||||
} | |||||
return true; | |||||
} | |||||
int JackOSSAdapter::SetBufferSize(jack_nframes_t buffer_size) | |||||
{ | |||||
JackAudioAdapterInterface::SetBufferSize(buffer_size); | |||||
Close(); | |||||
return Open(); | |||||
} | |||||
} // namespace | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
{ | |||||
#endif | |||||
SERVER_EXPORT jack_driver_desc_t* jack_get_descriptor() | |||||
{ | |||||
jack_driver_desc_t *desc; | |||||
unsigned int i; | |||||
desc = (jack_driver_desc_t*)calloc(1, sizeof(jack_driver_desc_t)); | |||||
strcpy(desc->name, "audioadapter"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 | |||||
strcpy(desc->desc, "netjack audio <==> net backend adapter"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 | |||||
desc->nparams = OSS_DRIVER_N_PARAMS; | |||||
desc->params = (jack_driver_param_desc_t*)calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); | |||||
i = 0; | |||||
strcpy(desc->params[i].name, "rate"); | |||||
desc->params[i].character = 'r'; | |||||
desc->params[i].type = JackDriverParamUInt; | |||||
desc->params[i].value.ui = OSS_DRIVER_DEF_FS; | |||||
strcpy(desc->params[i].short_desc, "Sample rate"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | |||||
strcpy(desc->params[i].name, "period"); | |||||
desc->params[i].character = 'p'; | |||||
desc->params[i].type = JackDriverParamUInt; | |||||
desc->params[i].value.ui = OSS_DRIVER_DEF_BLKSIZE; | |||||
strcpy(desc->params[i].short_desc, "Frames per period"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | |||||
strcpy(desc->params[i].name, "nperiods"); | |||||
desc->params[i].character = 'n'; | |||||
desc->params[i].type = JackDriverParamUInt; | |||||
desc->params[i].value.ui = OSS_DRIVER_DEF_NPERIODS; | |||||
strcpy(desc->params[i].short_desc, "Number of periods to prefill output buffer"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | |||||
strcpy(desc->params[i].name, "wordlength"); | |||||
desc->params[i].character = 'w'; | |||||
desc->params[i].type = JackDriverParamInt; | |||||
desc->params[i].value.i = OSS_DRIVER_DEF_BITS; | |||||
strcpy(desc->params[i].short_desc, "Word length"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | |||||
strcpy(desc->params[i].name, "inchannels"); | |||||
desc->params[i].character = 'i'; | |||||
desc->params[i].type = JackDriverParamUInt; | |||||
desc->params[i].value.ui = OSS_DRIVER_DEF_INS; | |||||
strcpy(desc->params[i].short_desc, "Capture channels"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | |||||
strcpy(desc->params[i].name, "outchannels"); | |||||
desc->params[i].character = 'o'; | |||||
desc->params[i].type = JackDriverParamUInt; | |||||
desc->params[i].value.ui = OSS_DRIVER_DEF_OUTS; | |||||
strcpy(desc->params[i].short_desc, "Playback channels"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | |||||
strcpy(desc->params[i].name, "excl"); | |||||
desc->params[i].character = 'e'; | |||||
desc->params[i].type = JackDriverParamBool; | |||||
desc->params[i].value.i = false; | |||||
strcpy(desc->params[i].short_desc, "Exclusif (O_EXCL) access mode"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | |||||
strcpy(desc->params[i].name, "capture"); | |||||
desc->params[i].character = 'C'; | |||||
desc->params[i].type = JackDriverParamString; | |||||
strcpy(desc->params[i].value.str, OSS_DRIVER_DEF_DEV); | |||||
strcpy(desc->params[i].short_desc, "Input device"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | |||||
strcpy(desc->params[i].name, "playback"); | |||||
desc->params[i].character = 'P'; | |||||
desc->params[i].type = JackDriverParamString; | |||||
strcpy(desc->params[i].value.str, OSS_DRIVER_DEF_DEV); | |||||
strcpy(desc->params[i].short_desc, "Output device"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | |||||
strcpy (desc->params[i].name, "device"); | |||||
desc->params[i].character = 'd'; | |||||
desc->params[i].type = JackDriverParamString; | |||||
strcpy(desc->params[i].value.str, OSS_DRIVER_DEF_DEV); | |||||
strcpy(desc->params[i].short_desc, "OSS device name"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | |||||
strcpy(desc->params[i].name, "ignorehwbuf"); | |||||
desc->params[i].character = 'b'; | |||||
desc->params[i].type = JackDriverParamBool; | |||||
desc->params[i].value.i = true; | |||||
strcpy(desc->params[i].short_desc, "Ignore hardware period size"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
i++; | |||||
strcpy(desc->params[i].name, "quality"); | |||||
desc->params[i].character = 'q'; | |||||
desc->params[i].type = JackDriverParamInt; | |||||
desc->params[i].value.ui = 0; | |||||
strcpy(desc->params[i].short_desc, "Resample algorithm quality (0 - 4)"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
return desc; | |||||
} | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
@@ -0,0 +1,123 @@ | |||||
/* | |||||
Copyright (C) 2008 Grame & RTL 2008 | |||||
This program is free software; you can redistribute it and/or modify | |||||
it under the terms of the GNU General Public License as published by | |||||
the Free Software Foundation; either version 2 of the License, or | |||||
(at your option) any later version. | |||||
This program is distributed in the hope that it will be useful, | |||||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
GNU General Public License for more details. | |||||
You should have received a copy of the GNU General Public License | |||||
along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
*/ | |||||
#ifndef __JackOSSAdapter__ | |||||
#define __JackOSSAdapter__ | |||||
#include <math.h> | |||||
#include <limits.h> | |||||
#include <assert.h> | |||||
#include "JackAudioAdapterInterface.h" | |||||
#include "JackPlatformPlug.h" | |||||
#include "JackError.h" | |||||
#include "jack.h" | |||||
#include "jslist.h" | |||||
namespace Jack | |||||
{ | |||||
typedef jack_default_audio_sample_t jack_sample_t; | |||||
#define OSS_DRIVER_N_PARAMS 12 | |||||
#define OSS_DRIVER_DEF_DEV "/dev/dsp" | |||||
#define OSS_DRIVER_DEF_FS 48000 | |||||
#define OSS_DRIVER_DEF_BLKSIZE 1024 | |||||
#define OSS_DRIVER_DEF_NPERIODS 2 | |||||
#define OSS_DRIVER_DEF_BITS 16 | |||||
#define OSS_DRIVER_DEF_INS 2 | |||||
#define OSS_DRIVER_DEF_OUTS 2 | |||||
/*! | |||||
\brief The OSS adapter. | |||||
*/ | |||||
class JackOSSAdapter : public JackAudioAdapterInterface, public JackRunnableInterface | |||||
{ | |||||
enum { kRead = 1, kWrite = 2, kReadWrite = 3 }; | |||||
private: | |||||
JackThread fThread; | |||||
char fCaptureDriverName[JACK_CLIENT_NAME_SIZE + 1]; | |||||
char fPlaybackDriverName[JACK_CLIENT_NAME_SIZE + 1]; | |||||
int fInFD; | |||||
int fOutFD; | |||||
int fBits; | |||||
int fSampleFormat; | |||||
int fNperiods; | |||||
unsigned int fSampleSize; | |||||
int fRWMode; | |||||
bool fIgnoreHW; | |||||
bool fExcl; | |||||
unsigned int fInputBufferSize; | |||||
unsigned int fOutputBufferSize; | |||||
void* fInputBuffer; | |||||
void* fOutputBuffer; | |||||
float** fInputSampleBuffer; | |||||
float** fOutputSampleBuffer; | |||||
bool fFirstCycle; | |||||
int OpenInput(); | |||||
int OpenOutput(); | |||||
void CloseAux(); | |||||
void SetSampleFormat(); | |||||
void DisplayDeviceInfo(); | |||||
public: | |||||
JackOSSAdapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params); | |||||
~JackOSSAdapter() | |||||
{} | |||||
int Open(); | |||||
int Close(); | |||||
int Read(); | |||||
int Write(); | |||||
int SetBufferSize(jack_nframes_t buffer_size); | |||||
bool Execute(); | |||||
}; | |||||
} | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
{ | |||||
#endif | |||||
#include "JackCompilerDeps.h" | |||||
#include "driver_interface.h" | |||||
EXPORT jack_driver_desc_t* jack_get_descriptor(); | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif |
@@ -0,0 +1,126 @@ | |||||
/* | |||||
Copyright (C) 2003-2007 Jussi Laako <jussi@sonarnerd.net> | |||||
Copyright (C) 2008 Grame & RTL 2008 | |||||
This program is free software; you can redistribute it and/or modify | |||||
it under the terms of the GNU General Public License as published by | |||||
the Free Software Foundation; either version 2 of the License, or | |||||
(at your option) any later version. | |||||
This program is distributed in the hope that it will be useful, | |||||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
GNU General Public License for more details. | |||||
You should have received a copy of the GNU General Public License | |||||
along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
*/ | |||||
#ifndef __JackOSSDriver__ | |||||
#define __JackOSSDriver__ | |||||
#include "JackAudioDriver.h" | |||||
namespace Jack | |||||
{ | |||||
typedef jack_default_audio_sample_t jack_sample_t; | |||||
#define OSS_DRIVER_N_PARAMS 13 | |||||
#define OSS_DRIVER_DEF_DEV "/dev/dsp" | |||||
#define OSS_DRIVER_DEF_FS 48000 | |||||
#define OSS_DRIVER_DEF_BLKSIZE 1024 | |||||
#define OSS_DRIVER_DEF_NPERIODS 1 | |||||
#define OSS_DRIVER_DEF_BITS 16 | |||||
#define OSS_DRIVER_DEF_INS 2 | |||||
#define OSS_DRIVER_DEF_OUTS 2 | |||||
/*! | |||||
\brief The OSS driver. | |||||
*/ | |||||
class JackOSSDriver : public JackAudioDriver | |||||
{ | |||||
enum { kRead = 1, kWrite = 2, kReadWrite = 3 }; | |||||
private: | |||||
int fInFD; | |||||
int fOutFD; | |||||
int fBits; | |||||
int fSampleFormat; | |||||
int fNperiods; | |||||
unsigned int fSampleSize; | |||||
int fRWMode; | |||||
bool fExcl; | |||||
bool fIgnoreHW; | |||||
unsigned int fInputBufferSize; | |||||
unsigned int fOutputBufferSize; | |||||
void* fInputBuffer; | |||||
void* fOutputBuffer; | |||||
bool fFirstCycle; | |||||
int OpenInput(); | |||||
int OpenOutput(); | |||||
int OpenAux(); | |||||
void CloseAux(); | |||||
void SetSampleFormat(); | |||||
void DisplayDeviceInfo(); | |||||
// Redefining since timing for CPU load is specific | |||||
int ProcessSync(); | |||||
public: | |||||
JackOSSDriver(const char* name, const char* alias, JackLockedEngine* engine, JackSynchro* table) | |||||
: JackAudioDriver(name, alias, engine, table), | |||||
fInFD(-1), fOutFD(-1), fBits(0), | |||||
fSampleFormat(0), fNperiods(0), fRWMode(0), fExcl(false), fIgnoreHW(true), | |||||
fInputBufferSize(0), fOutputBufferSize(0), | |||||
fInputBuffer(NULL), fOutputBuffer(NULL), fFirstCycle(true) | |||||
{} | |||||
virtual ~JackOSSDriver() | |||||
{} | |||||
int Open(jack_nframes_t frames_per_cycle, | |||||
int user_nperiods, | |||||
jack_nframes_t rate, | |||||
bool capturing, | |||||
bool playing, | |||||
int chan_in, | |||||
int chan_out, | |||||
bool vmix, | |||||
bool monitor, | |||||
const char* capture_driver_name, | |||||
const char* playback_driver_name, | |||||
jack_nframes_t capture_latency, | |||||
jack_nframes_t playback_latency, | |||||
int bits, | |||||
bool ignorehwbuf); | |||||
int Close(); | |||||
int Read(); | |||||
int Write(); | |||||
// BufferSize can be changed | |||||
bool IsFixedBufferSize() | |||||
{ | |||||
return false; | |||||
} | |||||
int SetBufferSize(jack_nframes_t buffer_size); | |||||
}; | |||||
} // end of namespace | |||||
#endif |
@@ -0,0 +1,34 @@ | |||||
#! /usr/bin/env python | |||||
# encoding: utf-8 | |||||
def create_jack_driver_obj(bld, target, sources, uselib = None): | |||||
driver = bld.new_task_gen('cxx', 'shlib') | |||||
driver.features.append('cc') | |||||
driver.env['shlib_PATTERN'] = 'jack_%s.so' | |||||
#driver.env.append_unique('CXXFLAGS', '-march=i686 -msse3 -ffast-math') | |||||
#driver.env.append_unique('CCFLAGS', '-march=i686 -msse3 -ffast-math') | |||||
driver.defines = 'HAVE_CONFIG_H' | |||||
driver.includes = ['.', '..','../posix', '../common', '../common/jack'] | |||||
driver.target = target | |||||
driver.source = sources | |||||
driver.install_path = '${ADDON_DIR}/' | |||||
driver.uselib_local = 'serverlib' | |||||
if uselib: | |||||
driver.uselib = uselib | |||||
return driver | |||||
def build(bld): | |||||
jackd = bld.new_task_gen('cxx', 'program') | |||||
jackd.includes = ['.','..', '../posix', '../common/jack', '../common'] | |||||
jackd.defines = 'HAVE_CONFIG_H' | |||||
jackd.source = ['../common/Jackdmp.cpp'] | |||||
jackd.uselib = 'PTHREAD DL' | |||||
jackd.uselib_local = 'serverlib' | |||||
jackd.target = 'jackd' | |||||
create_jack_driver_obj(bld, 'oss', ['oss/JackOSSDriver.cpp', '../common/memops.c']) | |||||
create_jack_driver_obj(bld, 'dummy', '../common/JackDummyDriver.cpp') | |||||
create_jack_driver_obj(bld, 'net', '../common/JackNetDriver.cpp') | |||||
@@ -1,4 +1,4 @@ | |||||
#!/bin/sh | |||||
#!/bin/bash | |||||
#set -x | #set -x | ||||
@@ -17,10 +17,12 @@ def build(bld): | |||||
for test_program, test_program_sources in test_programs.items(): | for test_program, test_program_sources in test_programs.items(): | ||||
prog = bld.new_task_gen('cxx', 'program') | prog = bld.new_task_gen('cxx', 'program') | ||||
prog.features.append('cc') | prog.features.append('cc') | ||||
if bld.env['IS_MACOSX']: | |||||
prog.includes = ['../macosx', '../posix', '../common/jack', '../common'] | |||||
if bld.env['IS_LINUX']: | |||||
prog.includes = ['../linux', '../posix', '../common/jack', '../common'] | |||||
if bld.env['IS_MACOSX']: | |||||
prog.includes = ['..','../macosx', '../posix', '../common/jack', '../common'] | |||||
if bld.env['IS_LINUX']: | |||||
prog.includes = ['..','../linux', '../posix', '../common/jack', '../common'] | |||||
if bld.env['IS_SUN']: | |||||
prog.includes = ['..','../solaris', '../posix', '../common/jack', '../common'] | |||||
prog.source = test_program_sources | prog.source = test_program_sources | ||||
if bld.env['IS_LINUX']: | if bld.env['IS_LINUX']: | ||||
prog.uselib = 'RT' | prog.uselib = 'RT' | ||||
@@ -180,10 +180,10 @@ error: | |||||
int JackPortAudioDriver::Close() | int JackPortAudioDriver::Close() | ||||
{ | { | ||||
JackAudioDriver::Close(); | |||||
int res = JackAudioDriver::Close(); | |||||
jack_log("JackPortAudioDriver::Close"); | jack_log("JackPortAudioDriver::Close"); | ||||
Pa_CloseStream(fStream); | Pa_CloseStream(fStream); | ||||
return 0; | |||||
return res; | |||||
} | } | ||||
int JackPortAudioDriver::Start() | int JackPortAudioDriver::Start() | ||||
@@ -348,7 +348,6 @@ extern "C" | |||||
strcpy(desc->params[i].name, "device"); | strcpy(desc->params[i].name, "device"); | ||||
desc->params[i].character = 'd'; | desc->params[i].character = 'd'; | ||||
desc->params[i].type = JackDriverParamString; | desc->params[i].type = JackDriverParamString; | ||||
desc->params[i].value.ui = 128U; | |||||
strcpy(desc->params[i].value.str, "will take default PortAudio device name"); | strcpy(desc->params[i].value.str, "will take default PortAudio device name"); | ||||
strcpy(desc->params[i].short_desc, "PortAudio device name"); | strcpy(desc->params[i].short_desc, "PortAudio device name"); | ||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | ||||
@@ -386,8 +385,8 @@ extern "C" | |||||
jack_nframes_t frames_per_interrupt = 512; | jack_nframes_t frames_per_interrupt = 512; | ||||
const char* capture_pcm_name = ""; | const char* capture_pcm_name = ""; | ||||
const char* playback_pcm_name = ""; | const char* playback_pcm_name = ""; | ||||
int capture = FALSE; | |||||
int playback = FALSE; | |||||
bool capture = false; | |||||
bool playback = false; | |||||
int chan_in = 0; | int chan_in = 0; | ||||
int chan_out = 0; | int chan_out = 0; | ||||
bool monitor = false; | bool monitor = false; | ||||
@@ -410,26 +409,25 @@ extern "C" | |||||
break; | break; | ||||
case 'D': | case 'D': | ||||
capture = TRUE; | |||||
playback = TRUE; | |||||
capture = true; | |||||
playback = true; | |||||
break; | break; | ||||
case 'c': | case 'c': | ||||
chan_in = chan_out = (int) param->value.ui; | |||||
chan_in = chan_out = (int)param->value.ui; | |||||
break; | break; | ||||
case 'i': | case 'i': | ||||
chan_in = (int) param->value.ui; | |||||
chan_in = (int)param->value.ui; | |||||
break; | break; | ||||
case 'o': | case 'o': | ||||
chan_out = (int) param->value.ui; | |||||
chan_out = (int)param->value.ui; | |||||
break; | break; | ||||
case 'C': | case 'C': | ||||
capture = TRUE; | |||||
if (strcmp(param->value.str, "none") != 0) | |||||
{ | |||||
capture = true; | |||||
if (strcmp(param->value.str, "none") != 0) { | |||||
capture_pcm_name = strdup(param->value.str); | capture_pcm_name = strdup(param->value.str); | ||||
} | } | ||||
break; | break; | ||||
@@ -450,7 +448,7 @@ extern "C" | |||||
break; | break; | ||||
case 'p': | case 'p': | ||||
frames_per_interrupt = (unsigned int) param->value.ui; | |||||
frames_per_interrupt = (unsigned int)param->value.ui; | |||||
break; | break; | ||||
case 'I': | case 'I': | ||||
@@ -469,8 +467,8 @@ extern "C" | |||||
// duplex is the default | // duplex is the default | ||||
if (!capture && !playback) { | if (!capture && !playback) { | ||||
capture = TRUE; | |||||
playback = TRUE; | |||||
capture = true; | |||||
playback = true; | |||||
} | } | ||||
Jack::JackDriverClientInterface* driver = new Jack::JackPortAudioDriver("system", "portaudio", engine, table, pa_devices); | Jack::JackDriverClientInterface* driver = new Jack::JackPortAudioDriver("system", "portaudio", engine, table, pa_devices); | ||||
@@ -63,7 +63,9 @@ def set_options(opt): | |||||
opt.add_option('--libdir', type='string', help="Library directory [Default: <prefix>/lib]") | opt.add_option('--libdir', type='string', help="Library directory [Default: <prefix>/lib]") | ||||
opt.add_option('--dbus', action='store_true', default=False, help='Enable D-Bus JACK (jackdbus)') | opt.add_option('--dbus', action='store_true', default=False, help='Enable D-Bus JACK (jackdbus)') | ||||
opt.add_option('--doxygen', action='store_true', default=False, help='Enable build of doxygen documentation') | opt.add_option('--doxygen', action='store_true', default=False, help='Enable build of doxygen documentation') | ||||
opt.add_option('--monitor', action='store_true', default=False, help='Build with monitoring records') | |||||
opt.add_option('--profile', action='store_true', default=False, help='Build with engine profiling') | |||||
opt.add_option('--clients', default=64, type="int", dest="clients", help='Maximum number of JACK clients') | |||||
opt.add_option('--ports', default=512, type="int", dest="ports", help='Maximum number of ports') | |||||
opt.add_option('--clients', default=64, type="int", dest="clients", help='Maximum number of JACK clients') | opt.add_option('--clients', default=64, type="int", dest="clients", help='Maximum number of JACK clients') | ||||
opt.add_option('--ports', default=512, type="int", dest="ports", help='Maximum number of ports') | opt.add_option('--ports', default=512, type="int", dest="ports", help='Maximum number of ports') | ||||
opt.sub_options('dbus') | opt.sub_options('dbus') | ||||
@@ -72,6 +74,7 @@ def configure(conf): | |||||
platform = Utils.detect_platform() | platform = Utils.detect_platform() | ||||
conf.env['IS_MACOSX'] = platform == 'darwin' | conf.env['IS_MACOSX'] = platform == 'darwin' | ||||
conf.env['IS_LINUX'] = platform == 'linux' | conf.env['IS_LINUX'] = platform == 'linux' | ||||
conf.env['IS_SUN'] = platform == 'sunos' | |||||
if conf.env['IS_LINUX']: | if conf.env['IS_LINUX']: | ||||
Utils.pprint('CYAN', "Linux detected") | Utils.pprint('CYAN', "Linux detected") | ||||
@@ -79,9 +82,26 @@ def configure(conf): | |||||
if conf.env['IS_MACOSX']: | if conf.env['IS_MACOSX']: | ||||
Utils.pprint('CYAN', "MacOS X detected") | Utils.pprint('CYAN', "MacOS X detected") | ||||
conf.check_tool('compiler_cxx') | |||||
conf.check_tool('compiler_cc') | |||||
if conf.env['IS_SUN']: | |||||
Utils.pprint('CYAN', "SunOS detected") | |||||
if conf.env['IS_LINUX']: | |||||
conf.check_tool('compiler_cxx') | |||||
conf.check_tool('compiler_cc') | |||||
if conf.env['IS_MACOSX']: | |||||
conf.check_tool('compiler_cxx') | |||||
conf.check_tool('compiler_cc') | |||||
# waf 1.5 : check_tool('compiler_cxx') and check_tool('compiler_cc') do not work correctly, so explicit use of gcc and g++ | |||||
if conf.env['IS_SUN']: | |||||
conf.check_tool('g++') | |||||
conf.check_tool('gcc') | |||||
#if conf.env['IS_SUN']: | |||||
# conf.check_tool('compiler_cxx') | |||||
# conf.check_tool('compiler_cc') | |||||
conf.env.append_unique('CXXFLAGS', '-O3 -Wall') | conf.env.append_unique('CXXFLAGS', '-O3 -Wall') | ||||
conf.env.append_unique('CCFLAGS', '-O3 -Wall') | conf.env.append_unique('CCFLAGS', '-O3 -Wall') | ||||
@@ -99,7 +119,7 @@ def configure(conf): | |||||
conf.env['JACK_VERSION'] = VERSION | conf.env['JACK_VERSION'] = VERSION | ||||
conf.env['BUILD_DOXYGEN_DOCS'] = Options.options.doxygen | conf.env['BUILD_DOXYGEN_DOCS'] = Options.options.doxygen | ||||
conf.env['BUILD_WITH_MONITOR'] = Options.options.monitor | |||||
conf.env['BUILD_WITH_PROFILE'] = Options.options.profile | |||||
if Options.options.libdir: | if Options.options.libdir: | ||||
conf.env['LIBDIR'] = Options.options.libdir | conf.env['LIBDIR'] = Options.options.libdir | ||||
@@ -115,7 +135,7 @@ def configure(conf): | |||||
conf.define('JACKMP', 1) | conf.define('JACKMP', 1) | ||||
if conf.env['BUILD_JACKDBUS'] == True: | if conf.env['BUILD_JACKDBUS'] == True: | ||||
conf.define('JACK_DBUS', 1) | conf.define('JACK_DBUS', 1) | ||||
if conf.env['BUILD_WITH_MONITOR'] == True: | |||||
if conf.env['BUILD_WITH_PROFILE'] == True: | |||||
conf.define('JACK_MONITOR', 1) | conf.define('JACK_MONITOR', 1) | ||||
conf.write_config_header('config.h') | conf.write_config_header('config.h') | ||||
@@ -142,7 +162,8 @@ def configure(conf): | |||||
display_msg("Library directory", conf.env['LIBDIR'], 'CYAN') | display_msg("Library directory", conf.env['LIBDIR'], 'CYAN') | ||||
display_msg("Drivers directory", conf.env['ADDON_DIR'], 'CYAN') | display_msg("Drivers directory", conf.env['ADDON_DIR'], 'CYAN') | ||||
display_feature('Build doxygen documentation', conf.env['BUILD_DOXYGEN_DOCS']) | display_feature('Build doxygen documentation', conf.env['BUILD_DOXYGEN_DOCS']) | ||||
display_feature('Build with monitoring records', conf.env['BUILD_WITH_MONITOR']) | |||||
display_feature('Build with engine profiling', conf.env['BUILD_WITH_PROFILE']) | |||||
if conf.env['IS_LINUX']: | if conf.env['IS_LINUX']: | ||||
display_feature('Build with ALSA support', conf.env['BUILD_DRIVER_ALSA'] == True) | display_feature('Build with ALSA support', conf.env['BUILD_DRIVER_ALSA'] == True) | ||||
@@ -171,14 +192,15 @@ def build(bld): | |||||
if not os.access('svnversion.h', os.R_OK): | if not os.access('svnversion.h', os.R_OK): | ||||
create_svnversion_task(bld) | create_svnversion_task(bld) | ||||
# process subfolders from here | |||||
# process subfolders from here | |||||
bld.add_subdirs('common') | bld.add_subdirs('common') | ||||
if bld.env['IS_LINUX']: | if bld.env['IS_LINUX']: | ||||
bld.add_subdirs('linux') | bld.add_subdirs('linux') | ||||
if bld.env['BUILD_JACKDBUS'] == True: | |||||
bld.add_subdirs('dbus') | |||||
bld.add_subdirs('example-clients') | bld.add_subdirs('example-clients') | ||||
bld.add_subdirs('tests') | bld.add_subdirs('tests') | ||||
if bld.env['BUILD_JACKDBUS'] == True: | |||||
bld.add_subdirs('dbus') | |||||
if bld.env['IS_MACOSX']: | if bld.env['IS_MACOSX']: | ||||
bld.add_subdirs('macosx') | bld.add_subdirs('macosx') | ||||
bld.add_subdirs('example-clients') | bld.add_subdirs('example-clients') | ||||
@@ -186,6 +208,13 @@ def build(bld): | |||||
if bld.env['BUILD_JACKDBUS'] == True: | if bld.env['BUILD_JACKDBUS'] == True: | ||||
bld.add_subdirs('dbus') | bld.add_subdirs('dbus') | ||||
if bld.env['IS_SUN']: | |||||
bld.add_subdirs('solaris') | |||||
bld.add_subdirs('example-clients') | |||||
bld.add_subdirs('tests') | |||||
if bld.env['BUILD_JACKDBUS'] == True: | |||||
bld.add_subdirs('dbus') | |||||
if bld.env['BUILD_DOXYGEN_DOCS'] == True: | if bld.env['BUILD_DOXYGEN_DOCS'] == True: | ||||
share_dir = bld.env.get_destdir() + bld.env['PREFIX'] + '/share/jack-audio-connection-kit' | share_dir = bld.env.get_destdir() + bld.env['PREFIX'] + '/share/jack-audio-connection-kit' | ||||
html_docs_source_dir = "build/default/html" | html_docs_source_dir = "build/default/html" | ||||