Index: linux/alsa/JackAlsaDriver.cpp =================================================================== --- linux/alsa/JackAlsaDriver.cpp (revision 2272) +++ linux/alsa/JackAlsaDriver.cpp (working copy) @@ -2131,8 +2131,8 @@ jack_log("JackAudioDriver::Attach fBufferSize %ld fSampleRate %ld", fEngineControl->fBufferSize, fEngineControl->fSampleRate); for (int i = 0; i < fCaptureChannels; i++) { - snprintf(alias, sizeof(alias) - 1, "%s:capture_%u", fClientControl->fName, i + 1); - snprintf(name, sizeof(name) - 1, "system:capture_%d", i + 1); + snprintf(alias, sizeof(alias) - 1, "%s:capture_%u", fAliasName, i + 1); + snprintf(name, sizeof(name) - 1, "%s:capture_%d", fClientControl->fName, i + 1); if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags, fEngineControl->fBufferSize)) == NO_PORT) { jack_error("driver: cannot register port for %s", name); return -1; @@ -2147,8 +2147,8 @@ port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal; for (int i = 0; i < fPlaybackChannels; i++) { - snprintf(alias, sizeof(alias) - 1, "%s:playback_%u", fClientControl->fName, i + 1); - snprintf(name, sizeof(name) - 1, "system:playback_%d", i + 1); + snprintf(alias, sizeof(alias) - 1, "%s:playback_%u", fAliasName, i + 1); + snprintf(name, sizeof(name) - 1, "%s:playback_%d", fClientControl->fName, i + 1); if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags, fEngineControl->fBufferSize)) == NO_PORT) { jack_error("driver: cannot register port for %s", name); return -1; @@ -2164,7 +2164,7 @@ // Monitor ports if (fWithMonitorPorts) { jack_log("Create monitor port "); - snprintf(name, sizeof(name) - 1, "%s:monitor_%d", fClientControl->fName, i + 1); + snprintf(name, sizeof(name) - 1, "%s:monitor_%d", fAliasName, i + 1); if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, fEngineControl->fBufferSize)) == NO_PORT) { jack_error ("ALSA: cannot register monitor port for %s", name); } else { @@ -2748,7 +2748,7 @@ playback = TRUE; } - Jack::JackAlsaDriver* alsa_driver = new Jack::JackAlsaDriver("alsa_pcm", engine, table); + Jack::JackAlsaDriver* alsa_driver = new Jack::JackAlsaDriver("system", "alsa_pcm", engine, table); Jack::JackDriverClientInterface* threaded_driver = new Jack::JackThreadedDriver(alsa_driver); // Special open for ALSA driver... if (alsa_driver->Open(frames_per_interrupt, user_nperiods, srate, hw_monitoring, hw_metering, capture, playback, dither, soft_mode, monitor, Index: linux/alsa/JackAlsaDriver.h =================================================================== --- linux/alsa/JackAlsaDriver.h (revision 2272) +++ linux/alsa/JackAlsaDriver.h (working copy) @@ -117,7 +117,7 @@ public: - JackAlsaDriver(const char* name, JackEngine* engine, JackSynchro** table): JackAudioDriver(name, engine, table) + JackAlsaDriver(const char* name, const char* alias, JackEngine* engine, JackSynchro** table): JackAudioDriver(name, alias, engine, table) {} virtual ~JackAlsaDriver() {} Index: linux/freebob/JackFreebobDriver.h =================================================================== --- linux/freebob/JackFreebobDriver.h (revision 2272) +++ linux/freebob/JackFreebobDriver.h (working copy) @@ -70,7 +70,8 @@ public: - JackFreebobDriver(const char* name, JackEngine* engine, JackSynchro** table): JackAudioDriver(name, engine, table) + JackFreebobDriver(const char* name, const char* alias, JackEngine* engine, JackSynchro** table) + :JackAudioDriver(name, alias, engine, table) {} virtual ~JackFreebobDriver() {} Index: linux/freebob/JackFreebobDriver.cpp =================================================================== --- linux/freebob/JackFreebobDriver.cpp (revision 2272) +++ linux/freebob/JackFreebobDriver.cpp (working copy) @@ -1147,7 +1147,7 @@ jack_error("Freebob using Firewire port %d, node %d", cmlparams.port, cmlparams.node_id); - Jack::JackFreebobDriver* freebob_driver = new Jack::JackFreebobDriver("freebob_pcm", engine, table); + Jack::JackFreebobDriver* freebob_driver = new Jack::JackFreebobDriver("system", "freebob_pcm", engine, table); Jack::JackDriverClientInterface* threaded_driver = new Jack::JackThreadedDriver(freebob_driver); // Special open for FreeBoB driver... if (freebob_driver->Open(&cmlparams) == 0) { Index: linux/firewire/JackFFADODriver.cpp =================================================================== --- linux/firewire/JackFFADODriver.cpp (revision 2272) +++ linux/firewire/JackFFADODriver.cpp (working copy) @@ -1000,7 +1000,7 @@ cmlparams.capture_ports = TRUE; } - Jack::JackFFADODriver* ffado_driver = new Jack::JackFFADODriver("firewire_pcm", engine, table); + Jack::JackFFADODriver* ffado_driver = new Jack::JackFFADODriver("system", "firewire_pcm", engine, table); Jack::JackDriverClientInterface* threaded_driver = new Jack::JackThreadedDriver(ffado_driver); // Special open for FFADO driver... if (ffado_driver->Open(&cmlparams) == 0) { Index: linux/firewire/JackFFADODriver.h =================================================================== --- linux/firewire/JackFFADODriver.h (revision 2272) +++ linux/firewire/JackFFADODriver.h (working copy) @@ -63,7 +63,8 @@ public: - JackFFADODriver(const char* name, JackEngine* engine, JackSynchro** table): JackAudioDriver(name, engine, table) + JackFFADODriver(const char* name, const char* alias, JackEngine* engine, JackSynchro** table) + : JackAudioDriver(name, alias,engine, table) {} virtual ~JackFFADODriver() {} Index: common/JackLibClient.cpp =================================================================== --- common/JackLibClient.cpp (revision 2272) +++ common/JackLibClient.cpp (working copy) @@ -22,11 +22,11 @@ #include "JackLibGlobals.h" #include "JackGlobals.h" #include "JackChannel.h" +#include "JackTools.h" namespace Jack { - // Used for external C API (JackAPI.cpp) JackGraphManager* GetGraphManager() { @@ -100,6 +100,7 @@ JackLibGlobals::fGlobals->fGraphManager.SetShmIndex(shared_graph, fServerName); fClientControl.SetShmIndex(shared_client, fServerName); jack_verbose = GetEngineControl()->fVerbose; + GetClientControl()->fPID = JackTools::GetPID(); } catch (int n) { jack_error("Map shared memory segments exception %d", n); goto error; Index: common/JackDummyDriver.h =================================================================== --- common/JackDummyDriver.h (revision 2272) +++ common/JackDummyDriver.h (working copy) @@ -38,8 +38,8 @@ public: - JackDummyDriver(const char* name, JackEngine* engine, JackSynchro** table, unsigned long wait_time) - : JackAudioDriver(name, engine, table), fWaitTime(wait_time) + JackDummyDriver(const char* name, const char* alias, JackEngine* engine, JackSynchro** table, unsigned long wait_time) + : JackAudioDriver(name, alias, engine, table), fWaitTime(wait_time) {} virtual ~JackDummyDriver() {} Index: common/JackAudioDriver.cpp =================================================================== --- common/JackAudioDriver.cpp (revision 2272) +++ common/JackAudioDriver.cpp (working copy) @@ -36,8 +36,8 @@ namespace Jack { -JackAudioDriver::JackAudioDriver(const char* name, JackEngine* engine, JackSynchro** table) - : JackDriver(name, engine, table), +JackAudioDriver::JackAudioDriver(const char* name, const char* alias, JackEngine* engine, JackSynchro** table) + : JackDriver(name, alias, engine, table), fCaptureChannels(0), fPlaybackChannels(0), fWithMonitorPorts(false) @@ -95,8 +95,8 @@ jack_log("JackAudioDriver::Attach fBufferSize = %ld fSampleRate = %ld", fEngineControl->fBufferSize, fEngineControl->fSampleRate); for (i = 0; i < fCaptureChannels; i++) { - snprintf(alias, sizeof(alias) - 1, "%s:%s:out%d", fClientControl->fName, fCaptureDriverName, i + 1); - snprintf(name, sizeof(name) - 1, "system:capture_%d", i + 1); + snprintf(alias, sizeof(alias) - 1, "%s:%s:out%d", fAliasName, fCaptureDriverName, i + 1); + snprintf(name, sizeof(name) - 1, "%s:capture_%d", fClientControl->fName, i + 1); if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags, fEngineControl->fBufferSize)) == NO_PORT) { jack_error("driver: cannot register port for %s", name); return -1; @@ -111,8 +111,8 @@ port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal; for (i = 0; i < fPlaybackChannels; i++) { - snprintf(alias, sizeof(alias) - 1, "%s:%s:in%d", fClientControl->fName, fPlaybackDriverName, i + 1); - snprintf(name, sizeof(name) - 1, "system:playback_%d", i + 1); + snprintf(alias, sizeof(alias) - 1, "%s:%s:in%d", fAliasName, fPlaybackDriverName, i + 1); + snprintf(name, sizeof(name) - 1, "%s:playback_%d", fClientControl->fName, i + 1); if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags, fEngineControl->fBufferSize)) == NO_PORT) { jack_error("driver: cannot register port for %s", name); return -1; @@ -127,7 +127,7 @@ // Monitor ports if (fWithMonitorPorts) { jack_log("Create monitor port "); - snprintf(name, sizeof(name) - 1, "%s:%s:monitor_%u", fClientControl->fName, fPlaybackDriverName, i + 1); + snprintf(name, sizeof(name) - 1, "%s:%s:monitor_%u", fAliasName, fPlaybackDriverName, i + 1); if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, fEngineControl->fBufferSize)) == NO_PORT) { jack_error("Cannot register monitor port for %s", name); return -1; Index: common/JackDriver.h =================================================================== --- common/JackDriver.h (revision 2272) +++ common/JackDriver.h (working copy) @@ -145,6 +145,7 @@ char fCaptureDriverName[JACK_CLIENT_NAME_SIZE]; char fPlaybackDriverName[JACK_CLIENT_NAME_SIZE]; + char fAliasName[JACK_CLIENT_NAME_SIZE]; jack_nframes_t fCaptureLatency; jack_nframes_t fPlaybackLatency; jack_time_t fLastWaitUst; @@ -158,7 +159,7 @@ public: - JackDriver(const char* name, JackEngine* engine, JackSynchro** table); + JackDriver(const char* name, const char* alias, JackEngine* engine, JackSynchro** table); JackDriver(); virtual ~JackDriver(); Index: common/JackEngine.cpp =================================================================== --- common/JackEngine.cpp (revision 2272) +++ common/JackEngine.cpp (working copy) @@ -33,7 +33,7 @@ #include "JackClientControl.h" #include "JackGlobals.h" #include "JackChannel.h" -#include "JackSyncInterface.h" +#include "JackSyncInterface.h" #include "JackError.h" namespace Jack @@ -446,7 +446,18 @@ return false; } - + +int JackEngine::GetClientPID(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()->fPID; + } + + return 0; +} + // Used for external clients int JackEngine::ClientExternalOpen(const char* name, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager) { @@ -459,7 +470,7 @@ } JackExternalClient* client = new JackExternalClient(); - + if (!fSynchroTable[refnum]->Allocate(name, fEngineControl->fServerName, 0)) { jack_error("Cannot allocate synchro"); goto error; @@ -475,13 +486,14 @@ jack_error("Driver is not running"); goto error; } + + fClientTable[refnum] = client; if (NotifyAddClient(client, name, refnum) < 0) { jack_error("Cannot notify add client"); goto error; } - fClientTable[refnum] = client; fGraphManager->InitRefNum(refnum); fEngineControl->ResetRollingUsecs(); *shared_engine = fEngineControl->GetShmIndex(); @@ -490,9 +502,11 @@ return 0; error: - ClientCloseAux(refnum, client, false); + // Cleanup... + fSynchroTable[refnum]->Destroy(); client->Close(); delete client; + fClientTable[refnum] = 0; return -1; } @@ -504,32 +518,39 @@ int refnum = AllocateRefnum(); if (refnum < 0) { jack_error("No more refnum available"); - return -1; + goto error; } - + if (!fSynchroTable[refnum]->Allocate(name, fEngineControl->fServerName, 0)) { jack_error("Cannot allocate synchro"); - return -1; + goto error; } if (wait && !fSignal->TimedWait(DRIVER_OPEN_TIMEOUT * 1000000)) { // Failure if RT thread is not running (problem with the driver...) jack_error("Driver is not running"); - return -1; + goto error; } + + fClientTable[refnum] = client; if (NotifyAddClient(client, name, refnum) < 0) { jack_error("Cannot notify add client"); - return -1; + goto error; } - fClientTable[refnum] = client; fGraphManager->InitRefNum(refnum); fEngineControl->ResetRollingUsecs(); *shared_engine = fEngineControl; *shared_manager = fGraphManager; *ref = refnum; return 0; + +error: + // Cleanup... + fSynchroTable[refnum]->Destroy(); + fClientTable[refnum] = 0; + return -1; } // Used for external clients @@ -556,9 +577,7 @@ int JackEngine::ClientCloseAux(int refnum, JackClientInterface* client, bool wait) { - jack_log("JackEngine::ClientCloseAux ref = %ld name = %s", - refnum, - (client->GetClientControl()) ? client->GetClientControl()->fName : "No name"); + jack_log("JackEngine::ClientCloseAux ref = %ld", refnum); // Remove the client from the table ReleaseRefnum(refnum); @@ -588,8 +607,7 @@ } // Notify running clients - if (client->GetClientControl()) // When called in error cases, client may not be completely allocated - NotifyRemoveClient(client->GetClientControl()->fName, client->GetClientControl()->fRefNum); + NotifyRemoveClient(client->GetClientControl()->fName, client->GetClientControl()->fRefNum); // Cleanup... fSynchroTable[refnum]->Destroy(); Index: common/JackAudioDriver.h =================================================================== --- common/JackAudioDriver.h (revision 2272) +++ common/JackAudioDriver.h (working copy) @@ -57,7 +57,7 @@ public: - JackAudioDriver(const char* name, JackEngine* engine, JackSynchro** table); + JackAudioDriver(const char* name, const char* alias, JackEngine* engine, JackSynchro** table); virtual ~JackAudioDriver(); virtual int Process(); Index: common/JackClientControl.h =================================================================== --- common/JackClientControl.h (revision 2272) +++ common/JackClientControl.h (working copy) @@ -42,6 +42,7 @@ volatile bool fTransportSync; /* Will be true when slow-sync cb has to be called */ volatile bool fTransportTimebase; /* Will be true when timebase cb is called with new_pos on */ int fRefNum; + int fPID; bool fActive; JackClientControl(const char* name, int refnum) @@ -72,6 +73,7 @@ fCallback[kStartFreewheelCallback] = true; fCallback[kStopFreewheelCallback] = true; fRefNum = refnum; + fPID = -1; fTransportState = JackTransportStopped; fTransportSync = false; fTransportTimebase = false; Index: common/JackServer.cpp =================================================================== --- common/JackServer.cpp (revision 2272) +++ common/JackServer.cpp (working copy) @@ -52,8 +52,8 @@ fGraphManager = new JackGraphManager(); fEngineControl = new JackEngineControl(sync, temporary, timeout, rt, priority, verbose, server_name); fEngine = new JackLockedEngine(new JackEngine(fGraphManager, fSynchroTable, fEngineControl)); - fFreewheelDriver = new JackThreadedDriver(new JackFreewheelDriver("freewheel", fEngine, fSynchroTable)); - fLoopbackDriver = new JackLoopbackDriver("loopback", fEngine, fSynchroTable); + fFreewheelDriver = new JackThreadedDriver(new JackFreewheelDriver(fEngine, fSynchroTable)); + fLoopbackDriver = new JackLoopbackDriver(fEngine, fSynchroTable); fChannel = JackGlobals::MakeServerChannel(); fFreewheel = false; fLoopback = loopback; @@ -310,6 +310,7 @@ { return fGraphManager; } + } // end of namespace Index: common/JackEngine.h =================================================================== --- common/JackEngine.h (revision 2272) +++ common/JackEngine.h (working copy) @@ -88,7 +88,9 @@ virtual int ClientActivate(int refnum); virtual int ClientDeactivate(int refnum); - + + virtual int GetClientPID(const char* name); + // Internal client management virtual int GetInternalClientName(int int_ref, char* name_res); virtual int InternalClientHandle(const char* client_name, int* status, int* int_ref); Index: common/JackLoopbackDriver.h =================================================================== --- common/JackLoopbackDriver.h (revision 2272) +++ common/JackLoopbackDriver.h (working copy) @@ -35,8 +35,8 @@ public: - JackLoopbackDriver(const char* name, JackEngine* engine, JackSynchro** table) - : JackAudioDriver(name, engine, table) + JackLoopbackDriver(JackEngine* engine, JackSynchro** table) + : JackAudioDriver("loopback", "", engine, table) {} virtual ~JackLoopbackDriver() {} Index: common/JackFreewheelDriver.h =================================================================== --- common/JackFreewheelDriver.h (revision 2272) +++ common/JackFreewheelDriver.h (working copy) @@ -35,7 +35,7 @@ public: - JackFreewheelDriver(const char* name, JackEngine* engine, JackSynchro** table): JackDriver(name, engine, table) + JackFreewheelDriver(JackEngine* engine, JackSynchro** table): JackDriver("freewheel", "", engine, table) {} virtual ~JackFreewheelDriver() {} Index: common/JackLockedEngine.h =================================================================== --- common/JackLockedEngine.h (revision 2272) +++ common/JackLockedEngine.h (working copy) @@ -195,6 +195,13 @@ JackLock lock(this); fEngine->NotifyActivate(refnum); } + + int GetClientPID(const char* name) + { + JackLock lock(this); + return fEngine->GetClientPID(name); + } + }; Index: common/JackServerAPI.cpp =================================================================== --- common/JackServerAPI.cpp (revision 2272) +++ common/JackServerAPI.cpp (working copy) @@ -28,8 +28,9 @@ #include "JackDebugClient.h" #include "JackServerGlobals.h" #include "JackServerLaunch.h" -#include "JackTools.h" -#include "JackExports.h" +#include "JackTools.h" +#include "JackExports.h" +#include "JackEngine.h" #ifdef __cplusplus extern "C" @@ -43,6 +44,7 @@ jack_options_t options, jack_status_t *status, ...); EXPORT int jack_client_close (jack_client_t *client); + EXPORT int jack_get_client_pid (const char *name); #ifdef __cplusplus } @@ -145,3 +147,12 @@ } } +EXPORT int jack_get_client_pid (const char *name) +{ + if (JackServer::fInstance != NULL) { + return JackServer::fInstance->GetEngine()->GetClientPID(name); + } else { + return 0; + } +} + Index: common/JackDummyDriver.cpp =================================================================== --- common/JackDummyDriver.cpp (revision 2272) +++ common/JackDummyDriver.cpp (working copy) @@ -178,7 +178,7 @@ if (wait_time == 0) // Not set wait_time = (unsigned long)((((float)period_size) / ((float)sample_rate)) * 1000000.0f); - Jack::JackDriverClientInterface* driver = new Jack::JackThreadedDriver(new Jack::JackDummyDriver("dummy_pcm", engine, table, wait_time)); + Jack::JackDriverClientInterface* driver = new Jack::JackThreadedDriver(new Jack::JackDummyDriver("system", "dummy_pcm", engine, table, wait_time)); if (driver->Open(period_size, sample_rate, 1, 1, capture_ports, playback_ports, monitor, "dummy", "dummy", 0, 0) == 0) { return driver; } else { Index: common/JackMutex.h =================================================================== --- common/JackMutex.h (revision 2272) +++ common/JackMutex.h (working copy) @@ -78,14 +78,17 @@ JackMutex() { - // Use recursive mutex (fails on LINUX..) -/* + // Use recursive mutex pthread_mutexattr_t mutex_attr; - assert(pthread_mutexattr_init(&mutex_attr) == 0); - assert(pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE) == 0); - assert(pthread_mutex_init(&fMutex, &mutex_attr) == 0); -*/ - pthread_mutex_init(&fMutex, NULL); + int res; + res = pthread_mutexattr_init(&mutex_attr); + assert(res == 0); + res = pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE); + assert(res == 0); + res = pthread_mutex_init(&fMutex, &mutex_attr); + assert(res == 0); + pthread_mutexattr_destroy(&mutex_attr); + assert(res == 0); } virtual ~JackMutex() { Index: common/JackInternalClient.cpp =================================================================== --- common/JackInternalClient.cpp (revision 2272) +++ common/JackInternalClient.cpp (working copy) @@ -35,6 +35,7 @@ #include "JackEngineControl.h" #include "JackClientControl.h" #include "JackInternalClientChannel.h" +#include "JackTools.h" #include namespace Jack @@ -97,7 +98,7 @@ jack_error("Cannot open client name = %s", name_res); goto error; } - + SetupDriverSync(false); return 0; Index: common/JackExternalClient.cpp =================================================================== --- common/JackExternalClient.cpp (revision 2272) +++ common/JackExternalClient.cpp (working copy) @@ -21,7 +21,7 @@ #include "JackExternalClient.h" #include "JackClientControl.h" #include "JackGlobals.h" -#include "JackChannel.h" +#include "JackChannel.h" #include "JackError.h" namespace Jack Index: common/JackShmMem.cpp =================================================================== --- common/JackShmMem.cpp (revision 2272) +++ common/JackShmMem.cpp (working copy) @@ -17,7 +17,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - + #include "JackError.h" #include "JackShmMem.h" #include @@ -60,7 +60,7 @@ error: jack_error("JackShmMem::new bad alloc", size); - throw new std::bad_alloc; + throw std::bad_alloc(); } void JackShmMem::operator delete(void* p, size_t size) @@ -74,13 +74,13 @@ jack_release_shm(&info); jack_destroy_shm(&info); -} - -void JackShmMem::operator delete(void* p) -{ - JackShmMem::operator delete(p, 0); } +void JackShmMem::operator delete(void* p) +{ + JackShmMem::operator delete(p, 0); +} + void LockMemoryImp(void* ptr, size_t size) { if (CHECK_MLOCK(ptr, size)) { Index: common/JackDriver.cpp =================================================================== --- common/JackDriver.cpp (revision 2272) +++ common/JackDriver.cpp (working copy) @@ -39,11 +39,12 @@ namespace Jack { -JackDriver::JackDriver(const char* name, JackEngine* engine, JackSynchro** table) +JackDriver::JackDriver(const char* name, const char* alias, JackEngine* engine, JackSynchro** table) { assert(strlen(name) < JACK_CLIENT_NAME_SIZE); fSynchroTable = table; fClientControl = new JackClientControl(name); + strcpy(fAliasName, alias); fEngine = engine; fGraphManager = NULL; fLastWaitUst = 0; Index: common/jack/jack.h =================================================================== --- common/jack/jack.h (revision 2272) +++ common/jack/jack.h (working copy) @@ -133,6 +133,11 @@ * name will differ from the @a client_name requested. */ char * jack_get_client_name (jack_client_t *client); + + /** + * @return pid of client. If not available, 0 will be returned. + */ + int jack_get_client_pid (const char *name); /** * Load an internal client into the Jack server. Index: common/JackLibAPI.cpp =================================================================== --- common/JackLibAPI.cpp (revision 2272) +++ common/JackLibAPI.cpp (working copy) @@ -46,6 +46,7 @@ jack_options_t options, jack_status_t *status, ...); EXPORT int jack_client_close (jack_client_t *client); + EXPORT int jack_get_client_pid (const char *name); #ifdef __cplusplus } @@ -143,4 +144,9 @@ } } +EXPORT int jack_get_client_pid (const char *name) +{ + jack_error("jack_get_client_pid : not implemented on library side"); + return 0; +} Index: macosx/JackCoreAudioDriver.cpp =================================================================== --- macosx/JackCoreAudioDriver.cpp (revision 2272) +++ macosx/JackCoreAudioDriver.cpp (working copy) @@ -420,8 +420,8 @@ return err; } -JackCoreAudioDriver::JackCoreAudioDriver(const char* name, JackEngine* engine, JackSynchro** table) - : JackAudioDriver(name, engine, table), fJackInputData(NULL), fDriverOutputData(NULL), fState(false), fIOUsage(1.f) +JackCoreAudioDriver::JackCoreAudioDriver(const char* name, const char* alias, JackEngine* engine, JackSynchro** table) + : JackAudioDriver(name, alias, engine, table), fJackInputData(NULL), fDriverOutputData(NULL), fState(false), fIOUsage(1.f) {} JackCoreAudioDriver::~JackCoreAudioDriver() @@ -968,12 +968,12 @@ err = AudioDeviceGetProperty(fDeviceID, i + 1, true, kAudioDevicePropertyChannelName, &size, channel_name); if (err != noErr) jack_log("AudioDeviceGetProperty kAudioDevicePropertyChannelName error "); - snprintf(alias, sizeof(alias) - 1, "%s:%s:out_%s%u", fClientControl->fName, fCaptureDriverName, channel_name, i + 1); + snprintf(alias, sizeof(alias) - 1, "%s:%s:out_%s%u", fAliasName, fCaptureDriverName, channel_name, i + 1); } else { - snprintf(alias, sizeof(alias) - 1, "%s:%s:out%u", fClientControl->fName, fCaptureDriverName, i + 1); + snprintf(alias, sizeof(alias) - 1, "%s:%s:out%u", fAliasName, fCaptureDriverName, i + 1); } - snprintf(name, sizeof(name) - 1, "system:capture_%d", i + 1); + snprintf(name, sizeof(name) - 1, "%s:capture_%d", fClientControl->fName, i + 1); if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags, fEngineControl->fBufferSize)) == NO_PORT) { jack_error("Cannot register port for %s", name); @@ -1007,12 +1007,12 @@ err = AudioDeviceGetProperty(fDeviceID, i + 1, false, kAudioDevicePropertyChannelName, &size, channel_name); if (err != noErr) jack_log("AudioDeviceGetProperty kAudioDevicePropertyChannelName error "); - snprintf(alias, sizeof(alias) - 1, "%s:%s:in_%s%u", fClientControl->fName, fPlaybackDriverName, channel_name, i + 1); + snprintf(alias, sizeof(alias) - 1, "%s:%s:in_%s%u", fAliasName, fPlaybackDriverName, channel_name, i + 1); } else { - snprintf(alias, sizeof(alias) - 1, "%s:%s:in%u", fClientControl->fName, fPlaybackDriverName, i + 1); + snprintf(alias, sizeof(alias) - 1, "%s:%s:in%u", fAliasName, fPlaybackDriverName, i + 1); } - snprintf(name, sizeof(name) - 1, "system:playback_%d", i + 1); + snprintf(name, sizeof(name) - 1, "%s:playback_%d", fClientControl->fName, i + 1); if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags, fEngineControl->fBufferSize)) == NO_PORT) { jack_error("Cannot register port for %s", name); @@ -1038,7 +1038,7 @@ // Monitor ports if (fWithMonitorPorts) { jack_log("Create monitor port "); - snprintf(name, sizeof(name) - 1, "%s:%s:monitor_%u", fClientControl->fName, fPlaybackDriverName, i + 1); + snprintf(name, sizeof(name) - 1, "%s:%s:monitor_%u", fAliasName, fPlaybackDriverName, i + 1); if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, fEngineControl->fBufferSize)) == NO_PORT) { jack_error("Cannot register monitor port for %s", name); return -1; @@ -1337,7 +1337,7 @@ playback = TRUE; } - Jack::JackCoreAudioDriver* driver = new Jack::JackCoreAudioDriver("coreaudio", engine, table); + Jack::JackCoreAudioDriver* driver = new Jack::JackCoreAudioDriver("system", "coreaudio", engine, table); if (driver->Open(frames_per_interrupt, srate, capture, playback, chan_in, chan_out, monitor, capture_pcm_name, playback_pcm_name, systemic_input_latency, systemic_output_latency, async_output_latency) == 0) { return driver; Index: macosx/JackCoreAudioDriver.h =================================================================== --- macosx/JackCoreAudioDriver.h (revision 2272) +++ macosx/JackCoreAudioDriver.h (working copy) @@ -143,7 +143,7 @@ public: - JackCoreAudioDriver(const char* name, JackEngine* engine, JackSynchro** table); + JackCoreAudioDriver(const char* name, const char* alias, JackEngine* engine, JackSynchro** table); virtual ~JackCoreAudioDriver(); int Open(jack_nframes_t frames_per_cycle, Index: windows/JackPortAudioDriver.cpp =================================================================== --- windows/JackPortAudioDriver.cpp (revision 2272) +++ windows/JackPortAudioDriver.cpp (working copy) @@ -658,7 +658,7 @@ playback = TRUE; } - Jack::JackDriverClientInterface* driver = new Jack::JackPortAudioDriver("portaudio", engine, table); + Jack::JackDriverClientInterface* driver = new Jack::JackPortAudioDriver("system", "portaudio", engine, table); if (driver->Open(frames_per_interrupt, srate, capture, playback, chan_in, chan_out, monitor, capture_pcm_name, playback_pcm_name, systemic_input_latency, systemic_output_latency) == 0) { return driver; } else { Index: windows/JackPortAudioDriver.h =================================================================== --- windows/JackPortAudioDriver.h (revision 2272) +++ windows/JackPortAudioDriver.h (working copy) @@ -53,8 +53,8 @@ public: - JackPortAudioDriver(const char* name, JackEngine* engine, JackSynchro** table) - : JackAudioDriver(name, engine, table), fStream(NULL), fInputBuffer(NULL), fOutputBuffer(NULL), + JackPortAudioDriver(const char* name, const char* alias, JackEngine* engine, JackSynchro** table) + : JackAudioDriver(name, alias, engine, table), fStream(NULL), fInputBuffer(NULL), fOutputBuffer(NULL), fInputDevice(paNoDevice), fOutputDevice(paNoDevice) {}