diff --git a/ChangeLog b/ChangeLog index 6b227b05..362a5330 100644 --- a/ChangeLog +++ b/ChangeLog @@ -36,6 +36,10 @@ John Emmas Jackdmp changes log --------------------------- +2012-01-20 Stephane Letz + + * Experimental system port alias use in WIndows JackRouter. + 2012-01-19 Stephane Letz * Implement shutdown for in server clients. diff --git a/macosx/Jackdmp.xcodeproj/project.pbxproj b/macosx/Jackdmp.xcodeproj/project.pbxproj index 42d9c196..461e1c12 100644 --- a/macosx/Jackdmp.xcodeproj/project.pbxproj +++ b/macosx/Jackdmp.xcodeproj/project.pbxproj @@ -1395,6 +1395,13 @@ remoteGlobalIDString = 4BA7FEB90D8E76270017FF73; remoteInfo = "jack_control Universal"; }; + 4BAA1A7514CA08FE003269AD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4B35C61F0D4731D2000DE7AE /* jack_portaudio 64 bits */; + remoteInfo = "jack_portaudio 64 bits"; + }; 4BB492A61372A393005F2601 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; @@ -5161,6 +5168,7 @@ buildRules = ( ); dependencies = ( + 4BAA1A7614CA08FE003269AD /* PBXTargetDependency */, ); name = "jack_coreaudio 64 bits"; productName = jack_coreaudio; @@ -8382,6 +8390,11 @@ target = 4BA7FEB90D8E76270017FF73 /* jack_server_control Universal */; targetProxy = 4BA7FECC0D8E76810017FF73 /* PBXContainerItemProxy */; }; + 4BAA1A7614CA08FE003269AD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4B35C61F0D4731D2000DE7AE /* jack_portaudio 64 bits */; + targetProxy = 4BAA1A7514CA08FE003269AD /* PBXContainerItemProxy */; + }; 4BB492A71372A393005F2601 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 4B8692821371DB4700D2D11B /* Jacknet.framework 64 bits */; diff --git a/windows/JackRouter/JackRouter.cpp b/windows/JackRouter/JackRouter.cpp index 3afe6482..c9c42c94 100644 --- a/windows/JackRouter/JackRouter.cpp +++ b/windows/JackRouter/JackRouter.cpp @@ -199,6 +199,8 @@ JackRouter::JackRouter() : AsioDriver() fAutoConnectOut = get_private_profile_int("AUTO_CONNECT", "output", 1, confPath.c_str()); fFloatSample = get_private_profile_int("IO", "float-sample", 1, confPath.c_str()); + + fAliasSystem = get_private_profile_int("AUTO_CONNECT", "alias", 1, confPath.c_str()); FreeLibrary(handle); @@ -300,7 +302,13 @@ static inline jack_default_audio_sample_t ClipFloat(jack_default_audio_sample_t } //------------------------------------------------------------------------------------------ -void JackRouter::shutdown(void* arg) +void JackRouter::connectCallback(jack_port_id_t a, jack_port_id_t b, int connect, void* arg) +{ + JackRouter* driver = (JackRouter*)arg; +} + +//------------------------------------------------------------------------------------------ +void JackRouter::shutdownCallback(void* arg) { JackRouter* driver = (JackRouter*)arg; /* @@ -312,7 +320,7 @@ void JackRouter::shutdown(void* arg) } //------------------------------------------------------------------------------------------ -int JackRouter::process(jack_nframes_t nframes, void* arg) +int JackRouter::processCallback(jack_nframes_t nframes, void* arg) { JackRouter* driver = (JackRouter*)arg; int i,j; @@ -400,8 +408,10 @@ ASIOBool JackRouter::init(void* sysRef) fBufferSize = jack_get_buffer_size(fClient); fSampleRate = jack_get_sample_rate(fClient); - jack_set_process_callback(fClient, process, this); - jack_on_shutdown(fClient, shutdown, this); + + jack_set_process_callback(fClient, processCallback, this); + jack_on_shutdown(fClient, shutdownCallback, this); + jack_set_port_connect_callback(fClient, connectCallback, this); fInputLatency = fBufferSize; // typically fOutputLatency = fBufferSize * 2; @@ -566,8 +576,18 @@ ASIOError JackRouter::getChannelInfo(ASIOChannelInfo *info) break; } } - _snprintf(buf, sizeof(buf) - 1, "In%d ", info->channel); - strcpy(info->name, buf); + + jack_port_t* port = fInputPorts[i]; + char* aliases[2]; + + // A alias on system is wanted + if (fAliasSystem && jack_port_get_aliases(port, aliases) == 2) { + strncpy(info->name, aliases[1], 32); + } else { + _snprintf(buf, sizeof(buf) - 1, "In%d ", info->channel); + strcpy(info->name, buf); + } + } else { for (i = 0; i < fActiveOutputs; i++) { if (fOutMap[i] == info->channel) { @@ -575,9 +595,19 @@ ASIOError JackRouter::getChannelInfo(ASIOChannelInfo *info) break; } } - _snprintf(buf, sizeof(buf) - 1, "Out%d ", info->channel); - strcpy(info->name, buf); - } + + jack_port_t* port = fOutputPorts[i]; + char* aliases[2]; + + // A alias on system is wanted + if (fAliasSystem && jack_port_get_aliases(port, aliases) == 2) { + strncpy(info->name, aliases[1], 32); + } else { + _snprintf(buf, sizeof(buf) - 1, "Out%d ", info->channel); + strcpy(info->name, buf); + } + + } return ASE_OK; } @@ -746,7 +776,7 @@ void JackRouter::bufferSwitch() //--------------------------------------------------------------------------------------------- // asio2 buffer switch -void JackRouter::bufferSwitchX () +void JackRouter::bufferSwitchX() { getSamplePosition (&fAsioTime.timeInfo.samplePosition, &fAsioTime.timeInfo.systemTime); long offset = fToggle ? fBufferSize : 0; @@ -846,7 +876,15 @@ void JackRouter::AutoConnect() break; } else if (jack_connect(fClient, ports[ASIO_channel], jack_port_name(fInputPorts[i])) != 0) { printf("Cannot connect input ports\n"); - } + } else if (fAliasSystem) { + jack_port_t* input_port = jack_port_by_name(fClient, ports[ASIO_channel]); + if (input_port) { + char* aliases[2]; + if (jack_port_get_aliases(input_port, aliases) == 2) { + jack_port_set_alias(fInputPorts[i], aliases[1]); + } + } + } } } jack_free(ports); @@ -871,7 +909,15 @@ void JackRouter::AutoConnect() break; } else if (jack_connect(fClient, jack_port_name(fOutputPorts[i]), ports[ASIO_channel]) != 0) { printf("Cannot connect output ports\n"); - } + } else if (fAliasSystem) { + jack_port_t* output_port = jack_port_by_name(fClient, ports[ASIO_channel]); + if (output_port) { + char* aliases[2]; + if (jack_port_get_aliases(output_port, aliases) == 2) { + jack_port_set_alias(fOutputPorts[i], aliases[1]); + } + } + } } } jack_free(ports); diff --git a/windows/JackRouter/JackRouter.h b/windows/JackRouter/JackRouter.h index 3473613c..19d34883 100644 --- a/windows/JackRouter/JackRouter.h +++ b/windows/JackRouter/JackRouter.h @@ -84,8 +84,9 @@ public: ~JackRouter(); #endif - static int process(jack_nframes_t nframes, void* arg); - static void shutdown(void* arg); + static int processCallback(jack_nframes_t nframes, void* arg); + static void connectCallback(jack_port_id_t a, jack_port_id_t b, int connect, void* arg); + static void shutdownCallback(void* arg); ASIOBool init(void* sysRef); void getDriverName(char *name); // max 32 bytes incl. terminating zero @@ -146,6 +147,7 @@ private: long fMilliSeconds; bool fActive, fStarted; bool fFloatSample; + bool fAliasSystem; bool fTimeInfoMode, fTcRead; char fErrorMessage[128]; diff --git a/windows/Setup/JackRouter.ini b/windows/Setup/JackRouter.ini index 2be31aea..b5f26570 100644 --- a/windows/Setup/JackRouter.ini +++ b/windows/Setup/JackRouter.ini @@ -5,4 +5,5 @@ float-sample=1 [AUTO_CONNECT] input=1 -output=1 +output=1 +alias=1 diff --git a/windows/portaudio/JackPortAudioDriver.cpp b/windows/portaudio/JackPortAudioDriver.cpp index a1742966..c850430c 100644 --- a/windows/portaudio/JackPortAudioDriver.cpp +++ b/windows/portaudio/JackPortAudioDriver.cpp @@ -248,30 +248,36 @@ int JackPortAudioDriver::Close() return res; } -/* int JackPortAudioDriver::Attach() { if (JackAudioDriver::Attach() == 0) { - char alias[REAL_JACK_PORT_NAME_SIZE]; + char* alias; - for (int i = 0; i < fCaptureChannels; i++) { - snprintf(alias, sizeof(alias), "%s:out%d", fPaDevices->GetDeviceName(fInputDevice).c_str(), i + 1); - JackPort* port = fGraphManager->GetPort(fCapturePortList[i]); - port->SetAlias(alias); + if (fPaDevices->GetHostFromDevice(fInputDevice) == "ASIO") + for (int i = 0; i < fCaptureChannels; i++) { + PaError err = PaAsio_GetInputChannelName(fInputDevice, i, &alias); + if (err == paNoError) { + JackPort* port = fGraphManager->GetPort(fCapturePortList[i]); + port->SetAlias(alias); + } + } } - for (int i = 0; i < fPlaybackChannels; i++) { - snprintf(alias, sizeof(alias), "%s:in%d", fPaDevices->GetDeviceName(fOutputDevice).c_str(), i + 1); - JackPort* port = fGraphManager->GetPort(fPlaybackPortList[i]); - port->SetAlias(alias); + if (fPaDevices->GetHostFromDevice(fOutputDevice) == "ASIO") + for (int i = 0; i < fPlaybackChannels; i++) { + PaError err = PaAsio_GetInputChannelName(fOutputDevice, i, &alias); + if (err == paNoError) { + JackPort* port = fGraphManager->GetPort(fPlaybackPortList[i]); + port->SetAlias(alias); + } + } } } else { return -1; } } -*/ int JackPortAudioDriver::Start() { diff --git a/windows/portaudio/JackPortAudioDriver.h b/windows/portaudio/JackPortAudioDriver.h index a3599d01..82168790 100644 --- a/windows/portaudio/JackPortAudioDriver.h +++ b/windows/portaudio/JackPortAudioDriver.h @@ -80,7 +80,7 @@ class JackPortAudioDriver : public JackMMCSS, public JackAudioDriver int Close(); - //int Attach(); + int Attach(); int Start(); int Stop();