git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2285 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.90
| @@ -20,6 +20,11 @@ Fernando Lopez-Lezcano | |||
| Jackdmp changes log | |||
| --------------------------- | |||
| 2008-05-19 Stephane Letz <letz@grame.fr> | |||
| * Use of placement new for dynamic port allocation is possibly not safe... so avoid that until a definitive answer is found. | |||
| * Cleanup. | |||
| 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. | |||
| @@ -40,9 +40,9 @@ class EXPORT JackAudioDriver : public JackDriver | |||
| // static tables since the actual number of ports may be changed by the real driver | |||
| // thus dynamic allocation is more difficult to handle | |||
| jack_port_id_t fCapturePortList[PORT_NUM]; | |||
| jack_port_id_t fPlaybackPortList[PORT_NUM]; | |||
| jack_port_id_t fMonitorPortList[PORT_NUM]; | |||
| jack_port_id_t fCapturePortList[DRIVER_PORT_NUM]; | |||
| jack_port_id_t fPlaybackPortList[DRIVER_PORT_NUM]; | |||
| jack_port_id_t fMonitorPortList[DRIVER_PORT_NUM]; | |||
| bool fWithMonitorPorts; | |||
| @@ -136,7 +136,7 @@ jack_int_t JackConnectionManager::Connections(jack_port_id_t port_index) const | |||
| jack_port_id_t JackConnectionManager::GetPort(jack_port_id_t port_index, int connection) const | |||
| { | |||
| assert(connection < CONNECTION_NUM); | |||
| assert(connection < CONNECTION_NUM_FOR_PORT); | |||
| return (jack_port_id_t)fConnection[port_index].GetItem(connection); | |||
| } | |||
| @@ -385,12 +385,12 @@ class JackConnectionManager | |||
| private: | |||
| JackFixedArray<CONNECTION_NUM> fConnection[PORT_NUM]; /*! Connection matrix: list of connected ports for a given port: needed to compute Mix buffer */ | |||
| JackFixedArray<CONNECTION_NUM_FOR_PORT> fConnection[PORT_NUM]; /*! Connection matrix: list of connected ports for a given port: needed to compute Mix buffer */ | |||
| JackFixedArray1<PORT_NUM_FOR_CLIENT> fInputPort[CLIENT_NUM]; /*! Table of input port per refnum : to find a refnum for a given port */ | |||
| JackFixedArray<PORT_NUM_FOR_CLIENT> fOutputPort[CLIENT_NUM]; /*! Table of output port per refnum : to find a refnum for a given port */ | |||
| JackFixedMatrix<CLIENT_NUM> fConnectionRef; /*! Table of port connections by (refnum , refnum) */ | |||
| JackActivationCount fInputCounter[CLIENT_NUM]; /*! Activation counter per refnum */ | |||
| JackLoopFeedback<CONNECTION_NUM> fLoopFeedback; /*! Loop feedback connections */ | |||
| JackLoopFeedback<CONNECTION_NUM_FOR_PORT> fLoopFeedback; /*! Loop feedback connections */ | |||
| bool IsLoopPathAux(int ref1, int ref2) const; | |||
| @@ -36,9 +36,10 @@ namespace Jack | |||
| #define FIRST_AVAILABLE_PORT 1 | |||
| #define PORT_NUM 512 | |||
| #define DRIVER_PORT_NUM 256 | |||
| #define PORT_NUM_FOR_CLIENT 256 | |||
| #define CONNECTION_NUM 256 | |||
| #define CONNECTION_NUM_FOR_PORT 256 | |||
| #define CLIENT_NUM 64 | |||
| @@ -738,18 +738,18 @@ int JackEngine::PortDisconnect(int refnum, jack_port_id_t src, jack_port_id_t ds | |||
| if (dst == ALL_PORTS) { | |||
| jack_int_t connections[CONNECTION_NUM]; | |||
| jack_int_t connections[CONNECTION_NUM_FOR_PORT]; | |||
| fGraphManager->GetConnections(src, connections); | |||
| // Notifications | |||
| JackPort* port = fGraphManager->GetPort(src); | |||
| if (port->GetFlags() & JackPortIsOutput) { | |||
| for (int i = 0; (i < CONNECTION_NUM) && (connections[i] != EMPTY); i++) { | |||
| for (int i = 0; (i < CONNECTION_NUM_FOR_PORT) && (connections[i] != EMPTY); i++) { | |||
| jack_log("NotifyPortConnect src = %ld dst = %ld false", src, connections[i]); | |||
| NotifyPortConnect(src, connections[i], false); | |||
| } | |||
| } else { | |||
| for (int i = 0; (i < CONNECTION_NUM) && (connections[i] != EMPTY); i++) { | |||
| for (int i = 0; (i < CONNECTION_NUM_FOR_PORT) && (connections[i] != EMPTY); i++) { | |||
| jack_log("NotifyPortConnect src = %ld dst = %ld false", connections[i], src); | |||
| NotifyPortConnect(connections[i], src, false); | |||
| } | |||
| @@ -174,11 +174,11 @@ void* JackGraphManager::GetBuffer(jack_port_id_t port_index, jack_nframes_t buff | |||
| } else { // Multiple connections | |||
| const jack_int_t* connections = manager->GetConnections(port_index); | |||
| void* buffers[CONNECTION_NUM]; | |||
| void* buffers[CONNECTION_NUM_FOR_PORT]; | |||
| jack_port_id_t src_index; | |||
| int i; | |||
| for (i = 0; (i < CONNECTION_NUM) && ((src_index = connections[i]) != EMPTY); i++) { | |||
| for (i = 0; (i < CONNECTION_NUM_FOR_PORT) && ((src_index = connections[i]) != EMPTY); i++) { | |||
| AssertPort(src_index); | |||
| buffers[i] = GetBuffer(src_index, buffer_size); | |||
| } | |||
| @@ -209,7 +209,7 @@ int JackGraphManager::RequestMonitor(jack_port_id_t port_index, bool onoff) // C | |||
| const jack_int_t* connections = ReadCurrentState()->GetConnections(port_index); | |||
| if ((port->fFlags & JackPortIsOutput) == 0) { // ?? Taken from jack, why not (port->fFlags & JackPortIsInput) ? | |||
| jack_port_id_t src_index; | |||
| for (int i = 0; (i < CONNECTION_NUM) && ((src_index = connections[i]) != EMPTY); i++) { | |||
| for (int i = 0; (i < CONNECTION_NUM_FOR_PORT) && ((src_index = connections[i]) != EMPTY); i++) { | |||
| // XXX much worse things will happen if there is a feedback loop !!! | |||
| RequestMonitor(src_index, onoff); | |||
| } | |||
| @@ -228,7 +228,7 @@ jack_nframes_t JackGraphManager::ComputeTotalLatencyAux(jack_port_id_t port_inde | |||
| if (hop_count > 8) | |||
| return GetPort(port_index)->GetLatency(); | |||
| for (int i = 0; (i < CONNECTION_NUM) && ((dst_index = connections[i]) != EMPTY); i++) { | |||
| for (int i = 0; (i < CONNECTION_NUM_FOR_PORT) && ((dst_index = connections[i]) != EMPTY); i++) { | |||
| if (src_port_index != dst_index) { | |||
| AssertPort(dst_index); | |||
| JackPort* dst_port = GetPort(dst_index); | |||
| @@ -457,7 +457,7 @@ void JackGraphManager::GetConnections(jack_port_id_t port_index, jack_int_t* res | |||
| { | |||
| JackConnectionManager* manager = WriteNextStateStart(); | |||
| const jack_int_t* connections = manager->GetConnections(port_index); | |||
| memcpy(res, connections, sizeof(jack_int_t) * CONNECTION_NUM); | |||
| memcpy(res, connections, sizeof(jack_int_t) * CONNECTION_NUM_FOR_PORT); | |||
| WriteNextStateStop(); | |||
| } | |||
| @@ -675,9 +675,9 @@ void JackGraphManager::GetConnectionsAux(JackConnectionManager* manager, const c | |||
| int i; | |||
| // Cleanup connection array | |||
| memset(res, 0, sizeof(char*) * CONNECTION_NUM); | |||
| memset(res, 0, sizeof(char*) * CONNECTION_NUM_FOR_PORT); | |||
| for (i = 0; (i < CONNECTION_NUM) && ((index = connections[i]) != EMPTY); i++) { | |||
| for (i = 0; (i < PORT_NUM) && ((index = connections[i]) != EMPTY); i++) { | |||
| JackPort* port = GetPort(index); | |||
| res[i] = port->fName; | |||
| } | |||
| @@ -694,7 +694,7 @@ void JackGraphManager::GetConnectionsAux(JackConnectionManager* manager, const c | |||
| // Client | |||
| const char** JackGraphManager::GetConnections(jack_port_id_t port_index) | |||
| { | |||
| const char** res = (const char**)malloc(sizeof(char*) * CONNECTION_NUM); | |||
| const char** res = (const char**)malloc(sizeof(char*) * CONNECTION_NUM_FOR_PORT); | |||
| UInt16 cur_index, next_index; | |||
| do { | |||
| @@ -39,8 +39,8 @@ class JackGraphManager : public JackShmMem, public JackAtomicState<JackConnectio | |||
| private: | |||
| JackPort fPortArray[]; | |||
| JackClientTiming fClientTiming[CLIENT_NUM]; | |||
| JackPort fPortArray[PORT_NUM]; | |||
| jack_port_id_t AllocatePortAux(int refnum, const char* port_name, const char* port_type, JackPortFlags flags); | |||
| void GetConnectionsAux(JackConnectionManager* manager, const char** res, jack_port_id_t port_index); | |||
| @@ -29,7 +29,14 @@ namespace Jack | |||
| { | |||
| JackPort::JackPort() | |||
| : fFlags(JackPortIsInput), fRefNum( -1), fLatency(0), fTotalLatency(0), fMonitorRequests(0), fInUse(false), fTied(NO_PORT) | |||
| : fTypeId(0), | |||
| fFlags(JackPortIsInput), | |||
| fRefNum( -1), | |||
| fLatency(0), | |||
| fTotalLatency(0), | |||
| fMonitorRequests(0), | |||
| fInUse(false), | |||
| fTied(NO_PORT) | |||
| {} | |||
| JackPort::~JackPort() | |||
| @@ -47,11 +47,7 @@ JackServer::JackServer(bool sync, bool temporary, long timeout, bool rt, long pr | |||
| JackGlobals::InitServer(); | |||
| for (int i = 0; i < CLIENT_NUM; i++) | |||
| fSynchroTable[i] = JackGlobals::MakeSynchro(); | |||
| // Use "placement" new for graph manager | |||
| void* shared_mem = JackShmMem::operator new(PORT_NUM * 1*sizeof(JackPort) + sizeof(JackGraphManager)); | |||
| fGraphManager = new(shared_mem) JackGraphManager(); | |||
| 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)); | |||
| @@ -46,7 +46,6 @@ static JackServer* fServer; | |||
| static char* server_name = NULL; | |||
| static int realtime_priority = 10; | |||
| static int do_mlock = 1; | |||
| static unsigned int port_max = 128; | |||
| static int realtime = 0; | |||
| static int loopback = 0; | |||
| static int temporary = 0; | |||
| @@ -74,11 +73,8 @@ static void usage(FILE* file) | |||
| fprintf(file, "\n" | |||
| "usage: jackdmp [ --realtime OR -R [ --realtime-priority OR -P priority ] ]\n" | |||
| " [ --name OR -n server-name ]\n" | |||
| // " [ --no-mlock OR -m ]\n" | |||
| // " [ --unlock OR -u ]\n" | |||
| " [ --timeout OR -t client-timeout-in-msecs ]\n" | |||
| " [ --loopback OR -L loopback-port-number ]\n" | |||
| // " [ --port-max OR -p maximum-number-of-ports]\n" | |||
| " [ --verbose OR -v ]\n" | |||
| " [ --replace-registry OR -r ]\n" | |||
| " [ --silent OR -s ]\n" | |||
| @@ -145,10 +141,9 @@ int main(int argc, char* argv[]) | |||
| int waiting; | |||
| jack_driver_desc_t* driver_desc; | |||
| const char *options = "-ad:P:uvrshVRL:STFl:t:mn:p:"; | |||
| const char *options = "-ad:P:uvrshVRL:STFl:t:mn:"; | |||
| struct option long_options[] = { | |||
| { "driver", 1, 0, 'd' | |||
| }, | |||
| { "driver", 1, 0, 'd'}, | |||
| { "verbose", 0, 0, 'v' }, | |||
| { "help", 0, 0, 'h' }, | |||
| { "port-max", 1, 0, 'p' }, | |||
| @@ -209,10 +204,6 @@ int main(int argc, char* argv[]) | |||
| do_mlock = 0; | |||
| break; | |||
| case 'p': | |||
| port_max = (unsigned int)atol(optarg); | |||
| break; | |||
| case 'P': | |||
| realtime_priority = atoi(optarg); | |||
| break; | |||