Browse Source

Improve JackDriver SaveConnections and RestoreConnections.

tags/v1.9.10
Stephane Letz 12 years ago
parent
commit
2e12829a04
7 changed files with 109 additions and 40 deletions
  1. +94
    -24
      common/JackDriver.cpp
  2. +3
    -2
      common/JackDriver.h
  3. +4
    -4
      common/JackNetDriver.cpp
  4. +1
    -1
      common/JackNetDriver.h
  5. +5
    -3
      macosx/coremidi/JackCoreMidiDriver.cpp
  6. +1
    -3
      macosx/coremidi/JackCoreMidiVirtualInputPort.cpp
  7. +1
    -3
      macosx/coremidi/JackCoreMidiVirtualOutputPort.cpp

+ 94
- 24
common/JackDriver.cpp View File

@@ -28,6 +28,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "JackEngineControl.h" #include "JackEngineControl.h"
#include "JackClientControl.h" #include "JackClientControl.h"
#include "JackLockedEngine.h" #include "JackLockedEngine.h"
#include "JackTime.h"
#include <math.h> #include <math.h>
#include <assert.h> #include <assert.h>


@@ -471,27 +472,45 @@ bool JackDriver::Initialize()
return true; return true;
} }


void JackDriver::SaveConnections()
static string RemoveLast(const string& name)
{
return name.substr(0, name.find_last_of(':')); // Remove end of name after last ":"
}

void JackDriver::SaveConnections(int alias)
{ {
const char** connections; const char** connections;
fConnections.clear();
char alias1[REAL_JACK_PORT_NAME_SIZE]; char alias1[REAL_JACK_PORT_NAME_SIZE];
char alias2[REAL_JACK_PORT_NAME_SIZE]; char alias2[REAL_JACK_PORT_NAME_SIZE];
char system_alias1[REAL_JACK_PORT_NAME_SIZE];
char system_alias2[REAL_JACK_PORT_NAME_SIZE];
char* aliases[2]; char* aliases[2];
char* system_aliases[2];


aliases[0] = alias1; aliases[0] = alias1;
aliases[1] = alias2; aliases[1] = alias2;

system_aliases[0] = system_alias1;
system_aliases[1] = system_alias2;
fConnections.clear();
for (int i = 0; i < fCaptureChannels; ++i) { for (int i = 0; i < fCaptureChannels; ++i) {
if (fCapturePortList[i] && (connections = fGraphManager->GetConnections(fCapturePortList[i])) != 0) { if (fCapturePortList[i] && (connections = fGraphManager->GetConnections(fCapturePortList[i])) != 0) {
for (int j = 0; connections[j]; j++) {
/*
if (alias == 0) {
for (int j = 0; connections[j]; j++) {
fConnections.push_back(make_pair(fGraphManager->GetPort(fCapturePortList[i])->GetName(), connections[j]));
jack_info("Save connection: %s %s", fGraphManager->GetPort(fCapturePortList[i])->GetName(), connections[j]);
}
} else {
fGraphManager->GetPort(fCapturePortList[i])->GetAliases(aliases); fGraphManager->GetPort(fCapturePortList[i])->GetAliases(aliases);
fConnections.push_back(make_pair(aliases[0], connections[j]));
jack_info("Save connection: %s %s", aliases[0], connections[j]);
*/
fConnections.push_back(make_pair(string(fGraphManager->GetPort(fCapturePortList[i])->GetName()), string(connections[j])));
jack_info("Save connection: %s %s", fGraphManager->GetPort(fCapturePortList[i])->GetName(), connections[j]);
string sub_name = RemoveLast(aliases[alias-1]);
for (int j = 0; connections[j]; j++) {
fGraphManager->GetPort(fGraphManager->GetPort(connections[j]))->GetAliases(system_aliases);
string sub_system_name = RemoveLast(system_aliases[alias-1]);
fConnections.push_back(make_pair(sub_name, sub_system_name));
jack_info("Save connection: %s %s", sub_name.c_str(), sub_system_name.c_str());
}
} }
free(connections); free(connections);
} }
@@ -499,28 +518,80 @@ void JackDriver::SaveConnections()


for (int i = 0; i < fPlaybackChannels; ++i) { for (int i = 0; i < fPlaybackChannels; ++i) {
if (fPlaybackPortList[i] && (connections = fGraphManager->GetConnections(fPlaybackPortList[i])) != 0) { if (fPlaybackPortList[i] && (connections = fGraphManager->GetConnections(fPlaybackPortList[i])) != 0) {
for (int j = 0; connections[j]; j++) {
/*
if (alias == 0) {
for (int j = 0; connections[j]; j++) {
fConnections.push_back(make_pair(fGraphManager->GetPort(fPlaybackPortList[i])->GetName(), connections[j]));
jack_info("Save connection: %s %s", fGraphManager->GetPort(fPlaybackPortList[i])->GetName(), connections[j]);
}
} else {
fGraphManager->GetPort(fPlaybackPortList[i])->GetAliases(aliases); fGraphManager->GetPort(fPlaybackPortList[i])->GetAliases(aliases);
fConnections.push_back(make_pair(connections[j], aliases[0]));
jack_info("Save connection: %s %s", connections[j], aliases[0]);
*/
fConnections.push_back(make_pair(string(connections[j]), string(fGraphManager->GetPort(fPlaybackPortList[i])->GetName())));
jack_info("Save connection: %s %s", connections[j], fGraphManager->GetPort(fPlaybackPortList[i])->GetName());
string sub_name = RemoveLast(aliases[alias-1]);
for (int j = 0; connections[j]; j++) {
fGraphManager->GetPort(fGraphManager->GetPort(connections[j]))->GetAliases(system_aliases);
string sub_system_name = RemoveLast(system_aliases[alias-1]);
fConnections.push_back(make_pair(sub_system_name, sub_name));
jack_info("Save connection: %s %s", sub_system_name.c_str(), sub_name.c_str());
}
} }
free(connections); free(connections);
} }
} }
} }


void JackDriver::RestoreConnections()
string JackDriver::MatchPortName(const char* name, const char** ports, int alias)
{ {
list<pair<string, string> >::const_iterator it;
char alias1[REAL_JACK_PORT_NAME_SIZE];
char alias2[REAL_JACK_PORT_NAME_SIZE];
char* aliases[2];
aliases[0] = alias1;
aliases[1] = alias2;
for (int i = 0; ports && ports[i]; ++i) {
fGraphManager->GetPort(fGraphManager->GetPort(ports[i]))->GetAliases(aliases);
if (string(aliases[alias-1]).find(name) != string::npos) {
return string(aliases[alias-1]);
}
}
return "";
}


for (it = fConnections.begin(); it != fConnections.end(); it++) {
pair<string, string> connection = *it;
jack_info("Restore connection: %s %s", connection.first.c_str(), connection.second.c_str());
fEngine->PortConnect(fClientControl.fRefNum, connection.first.c_str(), connection.second.c_str());
void JackDriver::RestoreConnections(int alias, bool full_name)
{
list<pair<string, string> >::const_iterator it;
if (full_name) {
for (it = fConnections.begin(); it != fConnections.end(); it++) {
pair<string, string> connection = *it;
jack_info("Restore connection: %s %s", connection.first.c_str(), connection.second.c_str());
fEngine->PortConnect(fClientControl.fRefNum, connection.first.c_str(), connection.second.c_str());
}
} else {
const char** inputs = fGraphManager->GetPorts(NULL, NULL, JackPortIsInput);
const char** outputs = fGraphManager->GetPorts(NULL, NULL, JackPortIsOutput);
for (it = fConnections.begin(); it != fConnections.end(); it++) {
pair<string, string> connection = *it;
string real_input = MatchPortName(connection.first.c_str(), outputs, alias);
string real_output = MatchPortName(connection.second.c_str(), inputs, alias);
if ((real_input != "") && (real_output != "")) {
jack_info("Restore connection: %s %s", real_input.c_str(), real_output.c_str());
fEngine->PortConnect(fClientControl.fRefNum, real_input.c_str(), real_output.c_str());
}
}
// Wait for connection change
if (fGraphManager->IsPendingChange()) {
JackSleep(int(fEngineControl->fPeriodUsecs * 1.1f));
}
if (inputs) {
free(inputs);
}
if (outputs) {
free(outputs);
}
} }
} }


@@ -534,5 +605,4 @@ int JackDriver::SuspendRefNum()
return fGraphManager->SuspendRefNum(&fClientControl, fSynchroTable, DRIVER_TIMEOUT_FACTOR * fEngineControl->fTimeOutUsecs); return fGraphManager->SuspendRefNum(&fClientControl, fSynchroTable, DRIVER_TIMEOUT_FACTOR * fEngineControl->fTimeOutUsecs);
} }



} // end of namespace } // end of namespace

+ 3
- 2
common/JackDriver.h View File

@@ -182,8 +182,9 @@ class SERVER_EXPORT JackDriver : public JackDriverClientInterface
void NotifySampleRate(jack_nframes_t sample_rate); // SampleRate notification sent by the driver void NotifySampleRate(jack_nframes_t sample_rate); // SampleRate notification sent by the driver
void NotifyFailure(int code, const char* reason); // Failure notification sent by the driver void NotifyFailure(int code, const char* reason); // Failure notification sent by the driver


virtual void SaveConnections();
virtual void RestoreConnections();
virtual void SaveConnections(int alias);
virtual void RestoreConnections(int alias, bool full_name = true);
std::string MatchPortName(const char* name, const char** ports, int alias);


virtual int StartSlaves(); virtual int StartSlaves();
virtual int StopSlaves(); virtual int StopSlaves();


+ 4
- 4
common/JackNetDriver.cpp View File

@@ -110,7 +110,7 @@ namespace Jack
bool JackNetDriver::Initialize() bool JackNetDriver::Initialize()
{ {
jack_log("JackNetDriver::Initialize"); jack_log("JackNetDriver::Initialize");
SaveConnections();
SaveConnections(0);
FreePorts(); FreePorts();


// New loading, but existing socket, restart the driver // New loading, but existing socket, restart the driver
@@ -201,7 +201,7 @@ namespace Jack
// Transport engine parametering // Transport engine parametering
fEngineControl->fTransport.SetNetworkSync(fParams.fTransportSync); fEngineControl->fTransport.SetNetworkSync(fParams.fTransportSync);


RestoreConnections();
RestoreConnections(0);
return true; return true;
} }


@@ -372,9 +372,9 @@ namespace Jack
return 0; return 0;
} }


void JackNetDriver::SaveConnections()
void JackNetDriver::SaveConnections(int alias)
{ {
JackDriver::SaveConnections();
JackDriver::SaveConnections(alias);
const char** connections; const char** connections;


for (int i = 0; i < fParams.fSendMidiChannels; ++i) { for (int i = 0; i < fParams.fSendMidiChannels; ++i) {


+ 1
- 1
common/JackNetDriver.h View File

@@ -63,7 +63,7 @@ namespace Jack
JackMidiBuffer* GetMidiInputBuffer(int port_index); JackMidiBuffer* GetMidiInputBuffer(int port_index);
JackMidiBuffer* GetMidiOutputBuffer(int port_index); JackMidiBuffer* GetMidiOutputBuffer(int port_index);


void SaveConnections();
void SaveConnections(int alias);
void UpdateLatencies(); void UpdateLatencies();




+ 5
- 3
macosx/coremidi/JackCoreMidiDriver.cpp View File

@@ -355,7 +355,7 @@ JackCoreMidiDriver::Attach()
JackCoreMidiPort *port_obj; JackCoreMidiPort *port_obj;
latency_range.max = latency; latency_range.max = latency;
latency_range.min = latency; latency_range.min = latency;
// Physical inputs // Physical inputs
for (int i = 0; i < num_physical_inputs; i++) { for (int i = 0; i < num_physical_inputs; i++) {
port_obj = physical_input_ports[i]; port_obj = physical_input_ports[i];
@@ -520,14 +520,16 @@ void
JackCoreMidiDriver::Restart() JackCoreMidiDriver::Restart()
{ {
JackLock lock(this); JackLock lock(this);
SaveConnections();
// Use first alias
SaveConnections(1);
Stop(); Stop();
Detach(); Detach();
CloseAux(); CloseAux();
OpenAux(); OpenAux();
Attach(); Attach();
Start(); Start();
RestoreConnections();
// Use first alias and partial port naming
RestoreConnections(1, false);
} }


void void


+ 1
- 3
macosx/coremidi/JackCoreMidiVirtualInputPort.cpp View File

@@ -49,9 +49,7 @@ JackCoreMidiVirtualInputPort(const char *alias_name, const char *client_name,
size_t max_bytes, size_t max_messages): size_t max_bytes, size_t max_messages):
JackCoreMidiInputPort(time_ratio, max_bytes, max_messages) JackCoreMidiInputPort(time_ratio, max_bytes, max_messages)
{ {
std::stringstream stream;
stream << "virtual" << (index + 1);
CFStringRef name = CFStringCreateWithCString(0, stream.str().c_str(),
CFStringRef name = CFStringCreateWithCString(0, "virtual",
CFStringGetSystemEncoding()); CFStringGetSystemEncoding());
if (! name) { if (! name) {
throw std::bad_alloc(); throw std::bad_alloc();


+ 1
- 3
macosx/coremidi/JackCoreMidiVirtualOutputPort.cpp View File

@@ -35,9 +35,7 @@ JackCoreMidiVirtualOutputPort(const char *alias_name, const char *client_name,
JackCoreMidiOutputPort(time_ratio, max_bytes, JackCoreMidiOutputPort(time_ratio, max_bytes,
max_messages) max_messages)
{ {
std::stringstream stream;
stream << "virtual" << (index + 1);
CFStringRef name = CFStringCreateWithCString(0, stream.str().c_str(),
CFStringRef name = CFStringCreateWithCString(0, "virtual",
CFStringGetSystemEncoding()); CFStringGetSystemEncoding());
if (! name) { if (! name) {
throw std::bad_alloc(); throw std::bad_alloc();


Loading…
Cancel
Save