Commit 7b5eafc3 authored by sletz's avatar sletz
Browse files

Activate now connect to FW driver and start the realtime thread only if...

Activate now connect to FW driver and start the realtime thread only if clients are actually realtime, that is have setup any of the RT callback.

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2279 0c269be4-1314-0410-8aa9-9f06e86f4224
parent 5993705f
......@@ -20,7 +20,11 @@ Fernando Lopez-Lezcano
Jackdmp changes log
---------------------------
2008-05-13 Stephane Letz <letz@grame.fr>
2008-05-16 Stephane Letz <letz@grame.fr>
* Activate now connect to FW driver and start the realtime thread only if clients are actually realtime, that is have setup any of the RT callback.
2008-05-14 Stephane Letz <letz@grame.fr>
* Fix JackEngine::Close to only delete "loadable" clients.
......
......@@ -80,7 +80,7 @@ class JackClientChannelInterface
virtual void ClientClose(int refnum, int* result)
{}
virtual void ClientActivate(int refnum, int* result)
virtual void ClientActivate(int refnum, int state, int* result)
{}
virtual void ClientDeactivate(int refnum, int* result)
{}
......
......@@ -35,6 +35,8 @@ using namespace std;
namespace Jack
{
#define IsRealTime() ((fProcess != NULL) | (fThreadFun != NULL) | (fSync != NULL) | (fTimebase != NULL))
JackClient::JackClient()
{}
......@@ -52,7 +54,9 @@ JackClient::JackClient(JackSynchro** table)
fFreewheel = NULL;
fPortRegistration = NULL;
fPortConnect = NULL;
fTimebase = NULL;
fSync = NULL;
fThreadFun = NULL;
fProcessArg = NULL;
fGraphOrderArg = NULL;
fXrunArg = NULL;
......@@ -64,7 +68,7 @@ JackClient::JackClient(JackSynchro** table)
fPortRegistrationArg = NULL;
fPortConnectArg = NULL;
fSyncArg = NULL;
fThreadFun = NULL;
fTimebaseArg = NULL;
fThreadFunArg = NULL;
}
......@@ -232,25 +236,17 @@ int JackClient::ClientNotify(int refnum, const char* name, int notify, int sync,
\brief We need to start thread before activating in the server, otherwise the FW driver
connected to the client may not be activated.
*/
int JackClient::Activate()
{
jack_log("JackClient::Activate");
if (IsActive())
return 0;
/* TODO : solve WIN32 thread Kill issue
#ifdef WIN32
// Done first so that the RT thread then access an allocated synchro
if (!fSynchroTable[GetClientControl()->fRefNum]->Connect(GetClientControl()->fName)) {
jack_error("Cannot ConnectSemaphore %s client", GetClientControl()->fName);
// RT thread is started only when needed...
if (IsRealTime()) {
if (StartThread() < 0)
return -1;
}
#endif
*/
if (StartThread() < 0)
return -1;
}
/*
Insertion of client in the graph will cause a kGraphOrderCallback notification
......@@ -263,7 +259,8 @@ int JackClient::Activate()
GetClientControl()->fTransportTimebase = true;
int result = -1;
fChannel->ClientActivate(GetClientControl()->fRefNum, &result);
GetClientControl()->fCallback[kRealTimeCallback] = IsRealTime();
fChannel->ClientActivate(GetClientControl()->fRefNum, IsRealTime(), &result);
return result;
}
......@@ -288,15 +285,10 @@ int JackClient::Deactivate()
jack_log("JackClient::Deactivate res = %ld ", result);
// We need to wait for the new engine cycle before stopping the RT thread, but this is done by ClientDeactivate
/* TODO : solve WIN32 thread Kill issue
#ifdef WIN32
fSynchroTable[GetClientControl()->fRefNum]->Disconnect();
fThread->Stop();
#else
fThread->Kill();
#endif
*/
fThread->Kill();
// RT thread is stopped only when needed...
if (IsRealTime()) {
fThread->Kill();
}
return result;
}
......
......@@ -67,9 +67,9 @@ namespace Jack
#define ALL_CLIENTS -1 // for notification
#if defined(__ppc64__) || defined(__x86_64__)
#define JACK_PROTOCOL_VERSION 4
#define JACK_PROTOCOL_VERSION 5
#else
#define JACK_PROTOCOL_VERSION 3
#define JACK_PROTOCOL_VERSION 4
#endif
#define SOCKET_TIME_OUT 5 // in sec
......
......@@ -596,14 +596,15 @@ int JackEngine::ClientCloseAux(int refnum, JackClientInterface* client, bool wai
return 0;
}
int JackEngine::ClientActivate(int refnum)
int JackEngine::ClientActivate(int refnum, bool state)
{
JackClientInterface* client = fClientTable[refnum];
assert(fClientTable[refnum]);
jack_log("JackEngine::ClientActivate ref = %ld name = %s", refnum, client->GetClientControl()->fName);
fGraphManager->Activate(refnum);
if (state)
fGraphManager->Activate(refnum);
// Wait for graph state change to be effective
if (!fSignal->TimedWait(fEngineControl->fTimeOutUsecs * 10)) {
jack_error("JackEngine::ClientActivate wait error ref = %ld name = %s", refnum, client->GetClientControl()->fName);
......
......@@ -86,7 +86,7 @@ class JackEngine
virtual int ClientExternalClose(int refnum);
virtual int ClientInternalClose(int refnum, bool wait);
virtual int ClientActivate(int refnum);
virtual int ClientActivate(int refnum, bool state);
virtual int ClientDeactivate(int refnum);
// Internal client management
......
......@@ -63,9 +63,9 @@ class JackInternalClientChannel : public JackClientChannelInterface
*result = fEngine->ClientInternalClose(refnum, true);
}
void ClientActivate(int refnum, int* result)
void ClientActivate(int refnum, int state, int* result)
{
*result = fEngine->ClientActivate(refnum);
*result = fEngine->ClientActivate(refnum, state);
}
void ClientDeactivate(int refnum, int* result)
{
......
......@@ -107,15 +107,6 @@ int JackLibClient::Open(const char* server_name, const char* name, jack_options_
SetupDriverSync(false);
/* TODO : solve WIN32 thread Kill issue
#ifndef WIN32
// Connect shared synchro : the synchro must be usable in I/O mode when several clients live in the same process
if (!fSynchroTable[fClientControl->fRefNum]->Connect(name)) {
jack_error("Cannot ConnectSemaphore %s client", name);
goto error;
}
#endif
*/
// Connect shared synchro : the synchro must be usable in I/O mode when several clients live in the same process
if (!fSynchroTable[GetClientControl()->fRefNum]->Connect(name_res, fServerName)) {
jack_error("Cannot ConnectSemaphore %s client", name_res);
......
......@@ -84,10 +84,10 @@ class JackLockedEngine : public JackEngine, public JackLockAble
return fEngine->ClientInternalClose(refnum, wait);
}
int ClientActivate(int refnum)
int ClientActivate(int refnum, bool state)
{
JackLock lock(this);
return fEngine->ClientActivate(refnum);
return fEngine->ClientActivate(refnum, state);
}
int ClientDeactivate(int refnum)
{
......
......@@ -35,7 +35,8 @@ enum NotificationType {
kPortRegistrationOffCallback = 9,
kPortConnectCallback = 10,
kPortDisconnectCallback = 11,
kDeadClient = 12,
kRealTimeCallback = 12,
kDeadClient = 13,
kMaxNotification
};
......
......@@ -287,21 +287,24 @@ struct JackActivateRequest : public JackRequest
{
int fRefNum;
int fState;
JackActivateRequest()
{}
JackActivateRequest(int refnum): JackRequest(JackRequest::kActivateClient), fRefNum(refnum)
JackActivateRequest(int refnum, int state): JackRequest(JackRequest::kActivateClient), fRefNum(refnum), fState(state)
{}
int Read(JackChannelTransaction* trans)
{
return trans->Read(&fRefNum, sizeof(int));
CheckRes(trans->Read(&fRefNum, sizeof(int)));
return trans->Read(&fState, sizeof(int));
}
int Write(JackChannelTransaction* trans)
{
CheckRes(JackRequest::Write(trans));
return trans->Write(&fRefNum, sizeof(int));
CheckRes(trans->Write(&fRefNum, sizeof(int)));
return trans->Write(&fState, sizeof(int));
}
};
......
......@@ -165,9 +165,9 @@ void JackSocketClientChannel::ClientClose(int refnum, int* result)
ServerSyncCall(&req, &res, result);
}
void JackSocketClientChannel::ClientActivate(int refnum, int* result)
void JackSocketClientChannel::ClientActivate(int refnum, int state, int* result)
{
JackActivateRequest req(refnum);
JackActivateRequest req(refnum, state);
JackResult res;
ServerSyncCall(&req, &res, result);
}
......
......@@ -63,7 +63,7 @@ class JackSocketClientChannel : public JackClientChannelInterface, public JackRu
void ClientOpen(const char* name, int* shared_engine, int* shared_client, int* shared_graph, int* result);
void ClientClose(int refnum, int* result);
void ClientActivate(int refnum, int* result);
void ClientActivate(int refnum, int state, int* result);
void ClientDeactivate(int refnum, int* result);
void PortRegister(int refnum, const char* name, const char* type, unsigned int flags, unsigned int buffer_size, unsigned int* port_index, int* result);
......
......@@ -190,7 +190,7 @@ int JackSocketServerChannel::HandleRequest(int fd)
JackResult res;
jack_log("JackRequest::ActivateClient");
if (req.Read(socket) == 0)
res.fResult = fServer->GetEngine()->ClientActivate(req.fRefNum);
res.fResult = fServer->GetEngine()->ClientActivate(req.fRefNum, ref.fState);
if (res.Write(socket) < 0)
jack_error("JackRequest::ActivateClient write error ref = %d", req.fRefNum);
break;
......
......@@ -101,10 +101,11 @@ void JackTransportEngine::MakeAllStartingLocating(JackClientInterface** table)
for (int i = REAL_REFNUM; i < CLIENT_NUM; i++) {
JackClientInterface* client = table[i];
if (client) {
// Inactive clients don't have their process function called at all, so they must appear as already "rolling" for the transport....
client->GetClientControl()->fTransportState = (client->GetClientControl()->fActive) ? JackTransportStarting : JackTransportRolling;
client->GetClientControl()->fTransportSync = true;
client->GetClientControl()->fTransportTimebase = true;
JackClientControl* control = client->GetClientControl();
// Inactive clients don't have their process function called at all, so they must appear as already "rolling" for the transport....
control->fTransportState = (control->fActive && control->fCallback[kRealTimeCallback]) ? JackTransportStarting : JackTransportRolling;
control->fTransportSync = true;
control->fTransportTimebase = true;
jack_log("MakeAllStartingLocating ref = %ld", i);
}
}
......@@ -116,9 +117,10 @@ void JackTransportEngine::MakeAllStopping(JackClientInterface** table)
for (int i = REAL_REFNUM; i < CLIENT_NUM; i++) {
JackClientInterface* client = table[i];
if (client) {
client->GetClientControl()->fTransportState = JackTransportStopped;
client->GetClientControl()->fTransportSync = false;
client->GetClientControl()->fTransportTimebase = false;
JackClientControl* control = client->GetClientControl();
control->fTransportState = JackTransportStopped;
control->fTransportSync = false;
control->fTransportTimebase = false;
jack_log("MakeAllStopping ref = %ld", i);
}
}
......@@ -130,8 +132,9 @@ void JackTransportEngine::MakeAllLocating(JackClientInterface** table)
for (int i = REAL_REFNUM; i < CLIENT_NUM; i++) {
JackClientInterface* client = table[i];
if (client) {
client->GetClientControl()->fTransportState = JackTransportStopped;
client->GetClientControl()->fTransportTimebase = true;
JackClientControl* control = client->GetClientControl();
control->fTransportState = JackTransportStopped;
control->fTransportTimebase = true;
jack_log("MakeAllLocating ref = %ld", i);
}
}
......@@ -155,7 +158,7 @@ void JackTransportEngine::CycleEnd(JackClientInterface** table, jack_nframes_t f
transport_command_t cmd = fTransportCmd;
if (cmd != fPreviousCmd) {
fPreviousCmd = cmd;
jack_log("transport command: %s", (cmd == TransportCommandStart ? "START" : "STOP"));
jack_log("transport command: %s", (cmd == TransportCommandStart ? "Transport start" : "Transport stop"));
} else {
cmd = TransportCommandNone;
}
......
......@@ -59,12 +59,12 @@ rpc_type server_rpc_jack_client_close(mach_port_t private_port, int refnum, int*
return KERN_SUCCESS;
}
rpc_type server_rpc_jack_client_activate(mach_port_t private_port, int refnum, int* result)
rpc_type server_rpc_jack_client_activate(mach_port_t private_port, int refnum, int state, int* result)
{
jack_log("rpc_jack_client_activate");
JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
assert(channel);
*result = channel->GetEngine()->ClientActivate(refnum);
*result = channel->GetEngine()->ClientActivate(refnum, state);
return KERN_SUCCESS;
}
......
......@@ -152,9 +152,9 @@ void JackMachClientChannel::ClientClose(int refnum, int* result)
}
}
void JackMachClientChannel::ClientActivate(int refnum, int* result)
void JackMachClientChannel::ClientActivate(int refnum, int state, int* result)
{
kern_return_t res = rpc_jack_client_activate(fPrivatePort, refnum, result);
kern_return_t res = rpc_jack_client_activate(fPrivatePort, refnum, state, result);
if (res != KERN_SUCCESS) {
*result = -1;
jack_error("JackMachClientChannel::ClientActivate err = %s", mach_error_string(res));
......
......@@ -60,7 +60,7 @@ class JackMachClientChannel : public JackClientChannelInterface, public JackRunn
void ClientOpen(const char* name, int* shared_engine, int* shared_client, int* shared_graph, int* result);
void ClientClose(int refnum, int* result);
void ClientActivate(int refnum, int* result);
void ClientActivate(int refnum, int state, int* result);
void ClientDeactivate(int refnum, int* result);
void PortRegister(int refnum, const char* name, const char* type, unsigned int flags, unsigned int buffer_size, unsigned int* port_index, int* result);
......
......@@ -1000,7 +1000,7 @@
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; };
4B35C4830D4731D1000DE7AE /* Jackmp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Jackmp.framework; sourceTree = BUILT_PRODUCTS_DIR; };
4B35C4FC0D4731D1000DE7AE /* Jackdmp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Jackdmp.framework; sourceTree = BUILT_PRODUCTS_DIR; };
4B35C4FC0D4731D1000DE7AE /* Jackservermp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Jackservermp.framework; sourceTree = BUILT_PRODUCTS_DIR; };
4B35C5080D4731D1000DE7AE /* Jackwrapper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Jackwrapper.framework; 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; };
......@@ -1034,10 +1034,10 @@
4B4259E5076B635E00C1ECE1 /* JackMacEngineRPC.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JackMacEngineRPC.cpp; sourceTree = SOURCE_ROOT; };
4B44FAE50C7598370033A72C /* JackServerLaunch.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackServerLaunch.cpp; path = ../common/JackServerLaunch.cpp; sourceTree = SOURCE_ROOT; };
4B464301076CAC7700E5077C /* Jack-Info.plist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xml; path = "Jack-Info.plist"; sourceTree = SOURCE_ROOT; };
4B51752F0D8FE69300961F37 /* jack_thread_wait */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_thread_wait; sourceTree = BUILT_PRODUCTS_DIR; };
4B51752F0D8FE69300961F37 /* jack_thread_wait1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_thread_wait1; sourceTree = BUILT_PRODUCTS_DIR; };
4B56880F08B5C8620022B32D /* JackFifo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackFifo.cpp; path = ../common/JackFifo.cpp; sourceTree = SOURCE_ROOT; };
4B56881008B5C8620022B32D /* JackFifo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackFifo.h; path = ../common/JackFifo.h; sourceTree = SOURCE_ROOT; };
4B57F5950D72C27900B4E719 /* jack_thread_wait */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_thread_wait; sourceTree = BUILT_PRODUCTS_DIR; };
4B57F5950D72C27900B4E719 /* jack_thread_wait1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_thread_wait1; sourceTree = BUILT_PRODUCTS_DIR; };
4B57F5BA0D72C2B000B4E719 /* tw1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tw1.c; path = "../example-clients/tw1.c"; sourceTree = SOURCE_ROOT; };
4B5A1BBB0CD1CB9E0005BF74 /* jack_midiseq */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midiseq; sourceTree = BUILT_PRODUCTS_DIR; };
4B5A1BBD0CD1CC110005BF74 /* midiseq.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = midiseq.c; path = "../example-clients/midiseq.c"; sourceTree = SOURCE_ROOT; };
......@@ -1105,7 +1105,7 @@
4BA692B20CBE4C2D00EAD520 /* ipload.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = ipload.c; path = "../example-clients/ipload.c"; sourceTree = SOURCE_ROOT; };
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; };
4BA7FEC30D8E76270017FF73 /* jack_lsp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_lsp; sourceTree = BUILT_PRODUCTS_DIR; };
4BA7FEC30D8E76270017FF73 /* jack_server_control */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_server_control; 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; };
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; };
......@@ -1723,7 +1723,7 @@
4B5A1BDA0CD1CCE10005BF74 /* jack_midisine */,
4B35C4250D4731D1000DE7AE /* jackdmp */,
4B35C4830D4731D1000DE7AE /* Jackmp.framework */,
4B35C4FC0D4731D1000DE7AE /* Jackdmp.framework */,
4B35C4FC0D4731D1000DE7AE /* Jackservermp.framework */,
4B35C5080D4731D1000DE7AE /* Jackwrapper.framework */,
4B35C5140D4731D1000DE7AE /* jack_midiseq */,
4B35C5200D4731D1000DE7AE /* jack_midisine */,
......@@ -1752,9 +1752,9 @@
4B0A292D0D52108E002EFF74 /* jack_thread_wait */,
4B0A296D0D5231DC002EFF74 /* jack_mp_thread_wait */,
4B0A2A650D524AB2002EFF74 /* jack_mp_thread_wait */,
4B57F5950D72C27900B4E719 /* jack_thread_wait */,
4BA7FEC30D8E76270017FF73 /* jack_lsp */,
4B51752F0D8FE69300961F37 /* jack_thread_wait */,
4B57F5950D72C27900B4E719 /* jack_thread_wait1 */,
4BA7FEC30D8E76270017FF73 /* jack_server_control */,
4B51752F0D8FE69300961F37 /* jack_thread_wait1 */,
);
name = Products;
sourceTree = "<group>";
......@@ -2875,7 +2875,7 @@
);
name = "Jackservermp.framework 64 bits";
productName = Jack;
productReference = 4B35C4FC0D4731D1000DE7AE /* Jackdmp.framework */;
productReference = 4B35C4FC0D4731D1000DE7AE /* Jackservermp.framework */;
productType = "com.apple.product-type.framework";
};
4B35C4FE0D4731D1000DE7AE /* Jackwrapper.framework 64 bits */ = {
......@@ -3342,7 +3342,7 @@
name = "jack_thread_wait1 64 bits";
productInstallPath = /usr/local/bin;
productName = testSem;
productReference = 4B51752F0D8FE69300961F37 /* jack_thread_wait */;
productReference = 4B51752F0D8FE69300961F37 /* jack_thread_wait1 */;
productType = "com.apple.product-type.tool";
};
4B57F58B0D72C27900B4E719 /* jack_thread_wait1 */ = {
......@@ -3361,7 +3361,7 @@
name = jack_thread_wait1;
productInstallPath = /usr/local/bin;
productName = testSem;
productReference = 4B57F5950D72C27900B4E719 /* jack_thread_wait */;
productReference = 4B57F5950D72C27900B4E719 /* jack_thread_wait1 */;
productType = "com.apple.product-type.tool";
};
4B5A1BB10CD1CB9E0005BF74 /* jack_midiseq Universal */ = {
......@@ -3793,7 +3793,7 @@
name = "jack_server_control Universal";
productInstallPath = /usr/local/bin;
productName = jack_lsp;
productReference = 4BA7FEC30D8E76270017FF73 /* jack_lsp */;
productReference = 4BA7FEC30D8E76270017FF73 /* jack_server_control */;
productType = "com.apple.product-type.tool";
};
4BD623ED0CBCF0F000DE782F /* inprocess */ = {
......
/*
* IDENTIFICATION:
* stub generated Mon Jan 28 15:04:07 2008
* with a MiG generated Sun Sep 23 15:44:06 PDT 2007 by root@hoosier.apple.com
* stub generated Fri May 16 09:21:55 2008
* with a MiG generated Tue Feb 19 02:01:43 PST 2008 by root@b75.local
* OPTIONS:
*/
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment