git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1803 0c269be4-1314-0410-8aa9-9f06e86f4224tags/0.70
@@ -22,6 +22,7 @@ Tim Blechmann | |||
* Remove checking thread in CoreAudio driver, better device state change recovery strategy: the driver is stopped and restarted. | |||
* jack_thread_wait implementation. | |||
* Add jack_thread_wait client example. | |||
* Add jack_mp_thread_wait client example. | |||
2008-01-30 Stephane Letz <letz@grame.fr> | |||
@@ -0,0 +1,207 @@ | |||
/** @file mp_thread_client.c | |||
* | |||
* @brief This simple client demonstrates the use of "jack_thread_wait" function in a multi-threaded context. | |||
A set of n threads (the jack process thread + (n - 1) helper threads) are used to work on a global queue of tasks. | |||
The last finishing thread gives control back to libjack using the "jack_thread_wait" function. Other threads suspend | |||
on a condition variable and are resumed next cycle by the libjack suspended thread. | |||
*/ | |||
#include <unistd.h> | |||
#include <stdio.h> | |||
#include <errno.h> | |||
#include <stdlib.h> | |||
#include <string.h> | |||
#include <math.h> | |||
#define __SMP__ 1 | |||
#include <jack/jack.h> | |||
#include <jack/thread.h> | |||
//#include "jack.h" | |||
//#include "thread.h" | |||
#include <math.h> | |||
#include "JackAtomic.h" | |||
jack_port_t *input_port; | |||
jack_port_t *output_port; | |||
jack_client_t *client; | |||
int buffer_size; | |||
#define WORK_AT_EACH_CYCLE 1000 | |||
#define WORK_AT_EACH_LOOP 15 | |||
static SInt32 cycle_work_count = 0; | |||
pthread_cond_t cond; | |||
pthread_mutex_t mutex; | |||
jack_nframes_t last_time = 0; | |||
static int print_count = 50; | |||
int result = 0; | |||
typedef struct thread_context | |||
{ | |||
pthread_t thread; | |||
int num; | |||
}; | |||
// Simulate workload | |||
static int fib(int n) | |||
{ | |||
if (n < 2) | |||
return n; | |||
else | |||
return fib(n - 2) + fib(n - 1); | |||
} | |||
static void do_some_work(void *arg) | |||
{ | |||
result = fib(WORK_AT_EACH_LOOP); | |||
} | |||
static void resume_all_threads(void *arg) | |||
{ | |||
thread_context* context = (thread_context*)arg; | |||
jack_nframes_t cur_time = jack_frame_time(client); | |||
if (--print_count == 0) { | |||
printf("resume_all_threads from thread = %ld jack_frame_time = %u jack_cpu_load = %f\n", context->num, (cur_time - last_time), jack_cpu_load(client)); | |||
print_count = 50; | |||
} | |||
pthread_mutex_lock(&mutex); // Hum... | |||
pthread_cond_broadcast(&cond); | |||
pthread_mutex_unlock(&mutex); // Hum... | |||
cycle_work_count = WORK_AT_EACH_CYCLE; | |||
last_time = cur_time; | |||
} | |||
static void suspend_jack_thread(void *arg) | |||
{ | |||
jack_thread_wait(client, 0); | |||
} | |||
static void suspend_worker_thread(void *arg) | |||
{ | |||
pthread_mutex_lock(&mutex); // Hum... | |||
pthread_cond_wait(&cond, &mutex); | |||
pthread_mutex_unlock(&mutex); // Hum... | |||
} | |||
static void * worker_aux_thread(void *arg) | |||
{ | |||
while (1) { | |||
int val = DEC_ATOMIC(&cycle_work_count); | |||
if (val == 1) { // Last thread | |||
suspend_jack_thread(arg); | |||
resume_all_threads(arg); | |||
} else if (val < 1) { | |||
suspend_worker_thread(arg); | |||
} else { | |||
do_some_work(arg); | |||
} | |||
} | |||
return 0; | |||
} | |||
static void * worker_thread(void *arg) | |||
{ | |||
suspend_worker_thread(arg); // Start in "suspended" state | |||
worker_aux_thread(arg); | |||
return 0; | |||
} | |||
// Example of audio process | |||
int process(jack_nframes_t nframes, void *arg) | |||
{ | |||
resume_all_threads(arg); | |||
worker_aux_thread(arg); | |||
return 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[]) | |||
{ | |||
thread_context* worker_threads; | |||
int n, nthreads = 0; | |||
if (argc == 2) | |||
nthreads = atoi(argv[1]); | |||
worker_threads = (thread_context *) malloc (sizeof (thread_context) * nthreads); | |||
/* open a client connection to the JACK server */ | |||
if ((client = jack_client_open("mp_thread_test", JackNoStartServer, NULL)) == NULL) { | |||
fprintf(stderr, "Cannot open client\n"); | |||
exit(1); | |||
} | |||
buffer_size = jack_get_buffer_size(client); | |||
/* tell the JACK server to call the 'callback' function | |||
*/ | |||
worker_threads[0].num = 0; | |||
jack_set_process_callback(client, process, &worker_threads[0]); | |||
/* tell the JACK server to call `jack_shutdown()' if | |||
it ever shuts down, either entirely, or if it | |||
just decides to stop calling us. | |||
*/ | |||
jack_on_shutdown(client, jack_shutdown, 0); | |||
pthread_mutex_init(&mutex, NULL); | |||
pthread_cond_init(&cond, NULL); | |||
input_port = jack_port_register(client, "input", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); | |||
output_port = jack_port_register(client, "output", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); | |||
if ((input_port == NULL) || (output_port == NULL)) { | |||
fprintf(stderr, "no more JACK ports available\n"); | |||
exit(1); | |||
} | |||
fprintf(stderr, "Creating %d threads\n", nthreads); | |||
for (n = 1; n <= nthreads; ++n) { | |||
worker_threads[n].num = n; | |||
if (jack_client_create_thread(client, &worker_threads[n].thread, 90, 1, worker_thread, &worker_threads[n]) < 0) | |||
exit(1); | |||
jack_acquire_real_time_scheduling (worker_threads[n].thread, 90); | |||
} | |||
/* 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); | |||
} | |||
while (1) { | |||
#ifdef WIN32 | |||
Sleep(1000); | |||
#else | |||
sleep(1); | |||
#endif | |||
} | |||
jack_client_close(client); | |||
pthread_mutex_destroy(&mutex); | |||
pthread_cond_destroy(&cond); | |||
exit(0); | |||
} |
@@ -0,0 +1,204 @@ | |||
/** @file simple_client.c | |||
* | |||
* @brief This simple client demonstrates the basic features of JACK | |||
* as they would be used by many applications. | |||
*/ | |||
#include <stdio.h> | |||
#include <errno.h> | |||
#include <unistd.h> | |||
#include <stdlib.h> | |||
#include <string.h> | |||
#include <jack/jack.h> | |||
jack_port_t *input_port; | |||
jack_port_t *output_port; | |||
jack_client_t *client; | |||
/* a simple state machine for this client */ | |||
volatile enum { | |||
Init, | |||
Run, | |||
Exit | |||
} client_state = Init; | |||
/** | |||
* The process callback for this JACK application is called in a | |||
* special realtime thread once for each audio cycle. | |||
* | |||
* This client follows a simple rule: when the JACK transport is | |||
* running, copy the input port to the output. When it stops, exit. | |||
*/ | |||
int | |||
_process (jack_nframes_t nframes) | |||
{ | |||
jack_default_audio_sample_t *in, *out; | |||
jack_transport_state_t ts = jack_transport_query(client, NULL); | |||
if (ts == JackTransportRolling) { | |||
if (client_state == Init) | |||
client_state = Run; | |||
in = jack_port_get_buffer (input_port, nframes); | |||
out = jack_port_get_buffer (output_port, nframes); | |||
memcpy (out, in, | |||
sizeof (jack_default_audio_sample_t) * nframes); | |||
} else if (ts == JackTransportStopped) { | |||
if (client_state == Run) | |||
client_state = Exit; | |||
} | |||
return 0; | |||
} | |||
int | |||
process (jack_nframes_t nframes, void* arg) | |||
{ | |||
jack_client_t* client = (jack_client_t*) arg; | |||
while ((nframes = jack_thread_wait (client, _process (nframes))) != 0); | |||
return 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[]) | |||
{ | |||
const char **ports; | |||
const char *client_name; | |||
const char *server_name = NULL; | |||
jack_options_t options = JackNullOption; | |||
jack_status_t status; | |||
if (argc >= 2) { /* client name specified? */ | |||
client_name = argv[1]; | |||
if (argc >= 3) { /* server name specified? */ | |||
server_name = argv[2]; | |||
options |= JackServerName; | |||
} | |||
} else { /* use basename of argv[0] */ | |||
client_name = strrchr(argv[0], '/'); | |||
if (client_name == 0) { | |||
client_name = argv[0]; | |||
} else { | |||
client_name++; | |||
} | |||
} | |||
/* open a client connection to the JACK server */ | |||
client = jack_client_open (client_name, options, &status, server_name); | |||
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); | |||
} | |||
if (status & JackServerStarted) { | |||
fprintf (stderr, "JACK server started\n"); | |||
} | |||
if (status & JackNameNotUnique) { | |||
client_name = jack_get_client_name(client); | |||
fprintf (stderr, "unique name `%s' assigned\n", client_name); | |||
} | |||
/* tell the JACK server to call `process()' whenever | |||
there is work to be done. | |||
*/ | |||
jack_set_process_callback (client, process, client); | |||
/* tell the JACK server to call `jack_shutdown()' if | |||
it ever shuts down, either entirely, or if it | |||
just decides to stop calling us. | |||
*/ | |||
jack_on_shutdown (client, jack_shutdown, 0); | |||
/* display the current sample rate. | |||
*/ | |||
printf ("engine sample rate: %" PRIu32 "\n", | |||
jack_get_sample_rate (client)); | |||
/* create two ports */ | |||
input_port = jack_port_register (client, "input", | |||
JACK_DEFAULT_AUDIO_TYPE, | |||
JackPortIsInput, 0); | |||
output_port = jack_port_register (client, "output", | |||
JACK_DEFAULT_AUDIO_TYPE, | |||
JackPortIsOutput, 0); | |||
if ((input_port == NULL) || (output_port == NULL)) { | |||
fprintf(stderr, "no more JACK ports available\n"); | |||
exit (1); | |||
} | |||
/* 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); | |||
} | |||
/* Connect the ports. You can't do this before the client is | |||
* activated, because we can't make connections to clients | |||
* that aren't running. Note the confusing (but necessary) | |||
* orientation of the driver backend ports: playback ports are | |||
* "input" to the backend, and capture ports are "output" from | |||
* it. | |||
*/ | |||
ports = jack_get_ports (client, NULL, NULL, | |||
JackPortIsPhysical|JackPortIsOutput); | |||
if (ports == NULL) { | |||
fprintf(stderr, "no physical capture ports\n"); | |||
exit (1); | |||
} | |||
if (jack_connect (client, ports[0], jack_port_name (input_port))) { | |||
fprintf (stderr, "cannot connect input ports\n"); | |||
} | |||
free (ports); | |||
ports = jack_get_ports (client, NULL, NULL, | |||
JackPortIsPhysical|JackPortIsInput); | |||
if (ports == NULL) { | |||
fprintf(stderr, "no physical playback ports\n"); | |||
exit (1); | |||
} | |||
if (jack_connect (client, jack_port_name (output_port), ports[0])) { | |||
fprintf (stderr, "cannot connect output ports\n"); | |||
} | |||
free (ports); | |||
/* keep running until the transport stops */ | |||
while (client_state != Exit) { | |||
sleep (1); | |||
} | |||
jack_client_close (client); | |||
exit (0); | |||
} |
@@ -87,6 +87,7 @@ | |||
/* Begin PBXBuildFile section */ | |||
4B0A28ED0D520852002EFF74 /* tw.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B0A28EC0D520852002EFF74 /* tw.c */; }; | |||
4B0A29260D52108E002EFF74 /* tw.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B0A28EC0D520852002EFF74 /* tw.c */; }; | |||
4B0A29830D523269002EFF74 /* mp_tw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B0A29820D523269002EFF74 /* mp_tw.cpp */; }; | |||
4B35C41E0D4731D1000DE7AE /* Jackdmp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF8D2250834F06A00C94B91 /* Jackdmp.cpp */; }; | |||
4B35C4290D4731D1000DE7AE /* JackMachPort.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B799AD707899652003F3F15 /* JackMachPort.h */; }; | |||
4B35C42A0D4731D1000DE7AE /* JackError.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF8D1770834EE4800C94B91 /* JackError.h */; }; | |||
@@ -1007,6 +1008,8 @@ | |||
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; }; | |||
4B0A292D0D52108E002EFF74 /* jack_thread_wait */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_thread_wait; sourceTree = BUILT_PRODUCTS_DIR; }; | |||
4B0A296D0D5231DC002EFF74 /* jack_mp_thread_wait */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_mp_thread_wait; sourceTree = BUILT_PRODUCTS_DIR; }; | |||
4B0A29820D523269002EFF74 /* mp_tw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mp_tw.cpp; path = "../example-clients/mp_tw.cpp"; sourceTree = SOURCE_ROOT; }; | |||
4B123D3308B3954300540632 /* JackGlobalsClient.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackGlobalsClient.cpp; path = ../common/JackGlobalsClient.cpp; sourceTree = SOURCE_ROOT; }; | |||
4B123D3608B3954A00540632 /* JackGlobalsServer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackGlobalsServer.cpp; path = ../common/JackGlobalsServer.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; }; | |||
@@ -1236,6 +1239,13 @@ | |||
); | |||
runOnlyForDeploymentPostprocessing = 0; | |||
}; | |||
4B0A29670D5231DC002EFF74 /* Frameworks */ = { | |||
isa = PBXFrameworksBuildPhase; | |||
buildActionMask = 2147483647; | |||
files = ( | |||
); | |||
runOnlyForDeploymentPostprocessing = 0; | |||
}; | |||
4B35C41F0D4731D1000DE7AE /* Frameworks */ = { | |||
isa = PBXFrameworksBuildPhase; | |||
buildActionMask = 2147483647; | |||
@@ -1717,6 +1727,7 @@ | |||
4B35C63E0D4731D3000DE7AE /* inprocess.so */, | |||
4B0A28E60D52073D002EFF74 /* jack_thread_wait */, | |||
4B0A292D0D52108E002EFF74 /* jack_thread_wait */, | |||
4B0A296D0D5231DC002EFF74 /* jack_mp_thread_wait */, | |||
); | |||
name = Products; | |||
sourceTree = "<group>"; | |||
@@ -1724,6 +1735,7 @@ | |||
4B03383E0797E19900686131 /* Simple clients */ = { | |||
isa = PBXGroup; | |||
children = ( | |||
4B0A29820D523269002EFF74 /* mp_tw.cpp */, | |||
4B0A28EC0D520852002EFF74 /* tw.c */, | |||
4B5A1BDC0CD1CD420005BF74 /* midisine.c */, | |||
4B5A1BBD0CD1CC110005BF74 /* midiseq.c */, | |||
@@ -2083,6 +2095,13 @@ | |||
); | |||
runOnlyForDeploymentPostprocessing = 0; | |||
}; | |||
4B0A29640D5231DC002EFF74 /* Headers */ = { | |||
isa = PBXHeadersBuildPhase; | |||
buildActionMask = 2147483647; | |||
files = ( | |||
); | |||
runOnlyForDeploymentPostprocessing = 0; | |||
}; | |||
4B35C41C0D4731D1000DE7AE /* Headers */ = { | |||
isa = PBXHeadersBuildPhase; | |||
buildActionMask = 2147483647; | |||
@@ -2736,6 +2755,25 @@ | |||
productReference = 4B0A292D0D52108E002EFF74 /* jack_thread_wait */; | |||
productType = "com.apple.product-type.tool"; | |||
}; | |||
4B0A29630D5231DC002EFF74 /* jack_mp_thread_wait */ = { | |||
isa = PBXNativeTarget; | |||
buildConfigurationList = 4B0A29690D5231DC002EFF74 /* Build configuration list for PBXNativeTarget "jack_mp_thread_wait" */; | |||
buildPhases = ( | |||
4B0A29640D5231DC002EFF74 /* Headers */, | |||
4B0A29650D5231DC002EFF74 /* Sources */, | |||
4B0A29670D5231DC002EFF74 /* Frameworks */, | |||
4B0A29680D5231DC002EFF74 /* Rez */, | |||
); | |||
buildRules = ( | |||
); | |||
dependencies = ( | |||
); | |||
name = jack_mp_thread_wait; | |||
productInstallPath = /usr/local/bin; | |||
productName = testSem; | |||
productReference = 4B0A296D0D5231DC002EFF74 /* jack_mp_thread_wait */; | |||
productType = "com.apple.product-type.tool"; | |||
}; | |||
4B35C41B0D4731D1000DE7AE /* jackdmp framework 64bits */ = { | |||
isa = PBXNativeTarget; | |||
buildConfigurationList = 4B35C4210D4731D1000DE7AE /* Build configuration list for PBXNativeTarget "jackdmp framework 64bits" */; | |||
@@ -3781,6 +3819,7 @@ | |||
4BA692A60CBE4BC700EAD520 /* jack_load Universal */, | |||
4BA692CA0CBE4C9000EAD520 /* jack_unload Universal */, | |||
4B0A28DC0D52073D002EFF74 /* jack_thread_wait */, | |||
4B0A29630D5231DC002EFF74 /* jack_mp_thread_wait */, | |||
4B699D4F097D421600A18468 /* synchroServer Universal */, | |||
4B699D67097D421600A18468 /* synchroClient Universal */, | |||
4B699D7F097D421700A18468 /* synchroServerClient Universal */, | |||
@@ -3880,6 +3919,13 @@ | |||
); | |||
runOnlyForDeploymentPostprocessing = 0; | |||
}; | |||
4B0A29680D5231DC002EFF74 /* Rez */ = { | |||
isa = PBXRezBuildPhase; | |||
buildActionMask = 2147483647; | |||
files = ( | |||
); | |||
runOnlyForDeploymentPostprocessing = 0; | |||
}; | |||
4B35C4200D4731D1000DE7AE /* Rez */ = { | |||
isa = PBXRezBuildPhase; | |||
buildActionMask = 2147483647; | |||
@@ -4207,6 +4253,14 @@ | |||
); | |||
runOnlyForDeploymentPostprocessing = 0; | |||
}; | |||
4B0A29650D5231DC002EFF74 /* Sources */ = { | |||
isa = PBXSourcesBuildPhase; | |||
buildActionMask = 2147483647; | |||
files = ( | |||
4B0A29830D523269002EFF74 /* mp_tw.cpp in Sources */, | |||
); | |||
runOnlyForDeploymentPostprocessing = 0; | |||
}; | |||
4B35C41D0D4731D1000DE7AE /* Sources */ = { | |||
isa = PBXSourcesBuildPhase; | |||
buildActionMask = 2147483647; | |||
@@ -5338,6 +5392,96 @@ | |||
}; | |||
name = Default; | |||
}; | |||
4B0A296A0D5231DC002EFF74 /* Development */ = { | |||
isa = XCBuildConfiguration; | |||
buildSettings = { | |||
ARCHS = ( | |||
i386, | |||
ppc, | |||
); | |||
COPY_PHASE_STRIP = NO; | |||
GCC_DYNAMIC_NO_PIC = NO; | |||
GCC_ENABLE_FIX_AND_CONTINUE = YES; | |||
GCC_GENERATE_DEBUGGING_SYMBOLS = YES; | |||
GCC_OPTIMIZATION_LEVEL = 0; | |||
HEADER_SEARCH_PATHS = ../common; | |||
OTHER_CFLAGS = ""; | |||
OTHER_LDFLAGS = ( | |||
"-framework", | |||
Jackmp, | |||
); | |||
OTHER_REZFLAGS = ""; | |||
PRODUCT_NAME = jack_mp_thread_wait; | |||
REZ_EXECUTABLE = YES; | |||
SDKROOT = ""; | |||
SECTORDER_FLAGS = ""; | |||
WARNING_CFLAGS = ( | |||
"-Wmost", | |||
"-Wno-four-char-constants", | |||
"-Wno-unknown-pragmas", | |||
); | |||
ZERO_LINK = YES; | |||
}; | |||
name = Development; | |||
}; | |||
4B0A296B0D5231DC002EFF74 /* Deployment */ = { | |||
isa = XCBuildConfiguration; | |||
buildSettings = { | |||
ARCHS = ( | |||
i386, | |||
ppc, | |||
); | |||
COPY_PHASE_STRIP = YES; | |||
GCC_ENABLE_FIX_AND_CONTINUE = NO; | |||
GCC_OPTIMIZATION_LEVEL = 3; | |||
HEADER_SEARCH_PATHS = ../common; | |||
MACOSX_DEPLOYMENT_TARGET = 10.4; | |||
OTHER_CFLAGS = ""; | |||
OTHER_LDFLAGS = ( | |||
"-framework", | |||
Jackmp, | |||
); | |||
OTHER_REZFLAGS = ""; | |||
PRODUCT_NAME = jack_mp_thread_wait; | |||
REZ_EXECUTABLE = YES; | |||
SDKROOT = ""; | |||
SECTORDER_FLAGS = ""; | |||
WARNING_CFLAGS = ( | |||
"-Wmost", | |||
"-Wno-four-char-constants", | |||
"-Wno-unknown-pragmas", | |||
); | |||
ZERO_LINK = NO; | |||
}; | |||
name = Deployment; | |||
}; | |||
4B0A296C0D5231DC002EFF74 /* Default */ = { | |||
isa = XCBuildConfiguration; | |||
buildSettings = { | |||
ARCHS = ( | |||
i386, | |||
ppc, | |||
); | |||
GCC_OPTIMIZATION_LEVEL = 3; | |||
HEADER_SEARCH_PATHS = ../common; | |||
OTHER_CFLAGS = ""; | |||
OTHER_LDFLAGS = ( | |||
"-framework", | |||
Jackmp, | |||
); | |||
OTHER_REZFLAGS = ""; | |||
PRODUCT_NAME = jack_mp_thread_wait; | |||
REZ_EXECUTABLE = YES; | |||
SDKROOT = ""; | |||
SECTORDER_FLAGS = ""; | |||
WARNING_CFLAGS = ( | |||
"-Wmost", | |||
"-Wno-four-char-constants", | |||
"-Wno-unknown-pragmas", | |||
); | |||
}; | |||
name = Default; | |||
}; | |||
4B35C4220D4731D1000DE7AE /* Development */ = { | |||
isa = XCBuildConfiguration; | |||
buildSettings = { | |||
@@ -11531,6 +11675,16 @@ | |||
defaultConfigurationIsVisible = 0; | |||
defaultConfigurationName = Default; | |||
}; | |||
4B0A29690D5231DC002EFF74 /* Build configuration list for PBXNativeTarget "jack_mp_thread_wait" */ = { | |||
isa = XCConfigurationList; | |||
buildConfigurations = ( | |||
4B0A296A0D5231DC002EFF74 /* Development */, | |||
4B0A296B0D5231DC002EFF74 /* Deployment */, | |||
4B0A296C0D5231DC002EFF74 /* Default */, | |||
); | |||
defaultConfigurationIsVisible = 0; | |||
defaultConfigurationName = Default; | |||
}; | |||
4B35C4210D4731D1000DE7AE /* Build configuration list for PBXNativeTarget "jackdmp framework 64bits" */ = { | |||
isa = XCConfigurationList; | |||
buildConfigurations = ( | |||