Browse Source

Remove JackEngineTiming class: code moved in JackEngineControl.

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1653 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/0.68
sletz 18 years ago
parent
commit
1ae88ba0f7
12 changed files with 171 additions and 235 deletions
  1. +3
    -1
      ChangeLog
  2. +0
    -14
      common/JackConnectionManager.h
  3. +23
    -1
      common/JackConstants.h
  4. +7
    -16
      common/JackEngine.cpp
  5. +0
    -2
      common/JackEngine.h
  6. +45
    -38
      common/JackEngineControl.cpp
  7. +85
    -42
      common/JackEngineControl.h
  8. +0
    -104
      common/JackEngineTiming.h
  9. +1
    -3
      common/JackError.c
  10. +0
    -3
      common/JackError.h
  11. +1
    -3
      linux/Makefile
  12. +6
    -8
      macosx/Jackdmp.xcodeproj/project.pbxproj

+ 3
- 1
ChangeLog View File

@@ -15,7 +15,9 @@ Tom Szilagyi


2007-10-25 Stephane Letz <letz@grame.fr> 2007-10-25 Stephane Letz <letz@grame.fr>


* Merge of Dmitry Baikov MIDI branch. Correct JackGraphManager::GetPortsAux to use port type.
* Merge of Dmitry Baikov MIDI branch.
* Correct JackGraphManager::GetPortsAux to use port type.
* Remove JackEngineTiming class: code moved in JackEngineControl.


2007-10-24 Stephane Letz <letz@grame.fr> 2007-10-24 Stephane Letz <letz@grame.fr>




+ 0
- 14
common/JackConnectionManager.h View File

@@ -27,22 +27,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
namespace Jack namespace Jack
{ {


#define NO_PORT 0xFFFE

#define EMPTY 0xFFFD
#define FREE 0xFFFC

typedef uint16_t jack_int_t; // Internal type for ports and refnum

struct JackClientControl; struct JackClientControl;


typedef enum {
NotTriggered,
Triggered,
Running,
Finished,
} jack_client_state_t;

/*! /*!
\brief Utility class. \brief Utility class.
*/ */


+ 23
- 1
common/JackConstants.h View File

@@ -17,7 +17,11 @@


*/ */


#define PRINTDEBUG
#ifndef __JackConstants__
#define __JackConstants__

namespace Jack
{


#define VERSION "0.68" #define VERSION "0.68"


@@ -68,3 +72,21 @@
#define JACK_PROTOCOL_VERSION 1 #define JACK_PROTOCOL_VERSION 1


#define DRIVER_OPEN_TIMEOUT 5 // in sec #define DRIVER_OPEN_TIMEOUT 5 // in sec

#define NO_PORT 0xFFFE

#define EMPTY 0xFFFD
#define FREE 0xFFFC

typedef uint16_t jack_int_t; // Internal type for ports and refnum

typedef enum {
NotTriggered,
Triggered,
Running,
Finished,
} jack_client_state_t;

} // end of namespace

#endif

+ 7
- 16
common/JackEngine.cpp View File

@@ -31,7 +31,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "JackInternalClient.h" #include "JackInternalClient.h"
#include "JackEngineControl.h" #include "JackEngineControl.h"
#include "JackClientControl.h" #include "JackClientControl.h"
#include "JackEngineTiming.h"
#include "JackGlobals.h" #include "JackGlobals.h"
#include "JackChannel.h" #include "JackChannel.h"
#include "JackSyncInterface.h" #include "JackSyncInterface.h"
@@ -48,17 +47,13 @@ JackEngine::JackEngine(JackGraphManager* manager,
fEngineControl = control; fEngineControl = control;
fChannel = JackGlobals::MakeServerNotifyChannel(); fChannel = JackGlobals::MakeServerNotifyChannel();
fSignal = JackGlobals::MakeInterProcessSync(); fSignal = JackGlobals::MakeInterProcessSync();
fEngineTiming = new JackEngineTiming(fClientTable, fGraphManager, fEngineControl);
for (int i = 0; i < CLIENT_NUM; i++) for (int i = 0; i < CLIENT_NUM; i++)
fClientTable[i] = NULL; fClientTable[i] = NULL;
fEngineTiming->ClearTimeMeasures();
fEngineTiming->ResetRollingUsecs();
} }


JackEngine::~JackEngine() JackEngine::~JackEngine()
{ {
delete fChannel; delete fChannel;
delete fEngineTiming;
delete fSignal; delete fSignal;
} }


@@ -154,14 +149,10 @@ bool JackEngine::Process(jack_time_t callback_usecs)
{ {
bool res = true; bool res = true;
// Transport begin
fEngineControl->CycleBegin(callback_usecs);
// Cycle begin
fEngineControl->CycleBegin(fClientTable, fGraphManager, callback_usecs);


// Timing
fEngineControl->IncFrameTime(callback_usecs);
fEngineTiming->UpdateTiming(callback_usecs);

// Graph
// Graph
if (fGraphManager->IsFinishedGraph()) { if (fGraphManager->IsFinishedGraph()) {
ProcessNext(callback_usecs); ProcessNext(callback_usecs);
res = true; res = true;
@@ -179,7 +170,7 @@ bool JackEngine::Process(jack_time_t callback_usecs)
} }
} }


// Transport end
// Cycle end
fEngineControl->CycleEnd(fClientTable); fEngineControl->CycleEnd(fClientTable);
return res; return res;
} }
@@ -538,7 +529,7 @@ int JackEngine::ClientExternalOpen(const char* name, int* ref, int* shared_engin


fClientTable[refnum] = client; fClientTable[refnum] = client;
fGraphManager->InitRefNum(refnum); fGraphManager->InitRefNum(refnum);
fEngineTiming->ResetRollingUsecs();
fEngineControl->ResetRollingUsecs();
*shared_engine = fEngineControl->GetShmIndex(); *shared_engine = fEngineControl->GetShmIndex();
*shared_graph_manager = fGraphManager->GetShmIndex(); *shared_graph_manager = fGraphManager->GetShmIndex();
*ref = refnum; *ref = refnum;
@@ -580,7 +571,7 @@ int JackEngine::ClientInternalOpen(const char* name, int* ref, JackEngineControl


fClientTable[refnum] = client; fClientTable[refnum] = client;
fGraphManager->InitRefNum(refnum); fGraphManager->InitRefNum(refnum);
fEngineTiming->ResetRollingUsecs();
fEngineControl->ResetRollingUsecs();
*shared_engine = fEngineControl; *shared_engine = fEngineControl;
*shared_manager = fGraphManager; *shared_manager = fGraphManager;
*ref = refnum; *ref = refnum;
@@ -634,7 +625,7 @@ int JackEngine::ClientCloseAux(int refnum, JackClientInterface* client, bool wai


// Cleanup... // Cleanup...
fSynchroTable[refnum]->Destroy(); fSynchroTable[refnum]->Destroy();
fEngineTiming->ResetRollingUsecs();
fEngineControl->ResetRollingUsecs();
return 0; return 0;
} }




+ 0
- 2
common/JackEngine.h View File

@@ -31,7 +31,6 @@ namespace Jack
class JackClientInterface; class JackClientInterface;
struct JackEngineControl; struct JackEngineControl;
class JackServerNotifyChannelInterface; class JackServerNotifyChannelInterface;
class JackEngineTiming;
class JackExternalClient; class JackExternalClient;
class JackSyncInterface; class JackSyncInterface;


@@ -48,7 +47,6 @@ class JackEngine
JackClientInterface* fClientTable[CLIENT_NUM]; JackClientInterface* fClientTable[CLIENT_NUM];
JackSynchro** fSynchroTable; JackSynchro** fSynchroTable;
JackServerNotifyChannelInterface* fChannel; /*! To communicate between the RT thread and server */ JackServerNotifyChannelInterface* fChannel; /*! To communicate between the RT thread and server */
JackEngineTiming* fEngineTiming;
JackSyncInterface* fSignal; JackSyncInterface* fSignal;
jack_time_t fLastSwitchUsecs; jack_time_t fLastSwitchUsecs;




common/JackEngineTiming.cpp → common/JackEngineControl.cpp View File

@@ -1,5 +1,6 @@
/* /*
Copyright (C) 2004-2006 Grame
Copyright (C) 2003 Paul Davis
Copyright (C) 2004-2006 Grame


This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@@ -17,50 +18,59 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.


*/ */


#include "JackEngineTiming.h"
#include "JackClientInterface.h"
#include "JackEngineControl.h" #include "JackEngineControl.h"
#include "JackGraphManager.h"
#include "JackClientControl.h" #include "JackClientControl.h"
#include <math.h>
#include <algorithm>
#include <iostream>
#include <assert.h>


namespace Jack namespace Jack
{ {


inline jack_time_t MAX(jack_time_t a, jack_time_t b)
void JackEngineControl::CycleBegin(JackClientInterface** table, JackGraphManager* manager, jack_time_t callback_usecs)
{ {
return (a < b) ? b : a;
// Transport
fTransport.CycleBegin(fSampleRate, callback_usecs);
// Timer
fFrameTimer.IncFrameTime(fBufferSize, callback_usecs, fPeriodUsecs);
// Timing
GetTimeMeasure(table, manager, callback_usecs);
CalcCPULoad(table, manager);
} }


JackEngineTiming::JackEngineTiming(JackClientInterface** table, JackGraphManager* manager, JackEngineControl* control)
void JackEngineControl::CycleEnd(JackClientInterface** table)
{ {
fClientTable = table;
fGraphManager = manager;
fEngineControl = control;
fLastTime = 0;
fCurTime = 0;
fProcessTime = 0;
fLastProcessTime = 0;
fSpareUsecs = 0;
fMaxUsecs = 0;
fAudioCycle = 0;
fTransport.CycleEnd(table, fSampleRate, fBufferSize);
}

void JackEngineControl::InitFrameTime()
{
fFrameTimer.InitFrameTime();
}

void JackEngineControl::ResetFrameTime(jack_time_t callback_usecs)
{
fFrameTimer.ResetFrameTime(fSampleRate, callback_usecs, fPeriodUsecs);
}

void JackEngineControl::ReadFrameTime(JackTimer* timer)
{
fFrameTimer.ReadFrameTime(timer);
} }


void JackEngineTiming::UpdateTiming(jack_time_t callback_usecs)
// Private
inline jack_time_t MAX(jack_time_t a, jack_time_t b)
{ {
GetTimeMeasure(callback_usecs);
CalcCPULoad();
return (a < b) ? b : a;
} }


void JackEngineTiming::CalcCPULoad()
void JackEngineControl::CalcCPULoad(JackClientInterface** table, JackGraphManager* manager)
{ {
jack_time_t lastCycleEnd = fLastProcessTime; jack_time_t lastCycleEnd = fLastProcessTime;


for (int i = REAL_REFNUM; i < CLIENT_NUM; i++) { for (int i = REAL_REFNUM; i < CLIENT_NUM; i++) {
JackClientInterface* client = fClientTable[i];
JackClientTiming* timing = fGraphManager->GetClientTiming(i);
JackClientInterface* client = table[i];
JackClientTiming* timing = manager->GetClientTiming(i);
if (client && client->GetClientControl()->fActive && timing->fStatus == Finished) { if (client && client->GetClientControl()->fActive && timing->fStatus == Finished) {
lastCycleEnd = MAX(lastCycleEnd, timing->fFinishedAt); lastCycleEnd = MAX(lastCycleEnd, timing->fFinishedAt);
} }
@@ -85,27 +95,26 @@ void JackEngineTiming::CalcCPULoad()
} }


fMaxUsecs = MAX(fMaxUsecs, maxUsecs); fMaxUsecs = MAX(fMaxUsecs, maxUsecs);
fSpareUsecs = jack_time_t((maxUsecs < fEngineControl->fPeriodUsecs) ? fEngineControl->fPeriodUsecs - maxUsecs : 0);
fEngineControl->fCPULoad
= ((1.0f - (float(fSpareUsecs) / float(fEngineControl->fPeriodUsecs))) * 50.0f + (fEngineControl->fCPULoad * 0.5f));
fSpareUsecs = jack_time_t((maxUsecs < fPeriodUsecs) ? fPeriodUsecs - maxUsecs : 0);
fCPULoad = ((1.f - (float(fSpareUsecs) / float(fPeriodUsecs))) * 50.f + (fCPULoad * 0.5f));
} }
} }


void JackEngineTiming::ResetRollingUsecs()
void JackEngineControl::ResetRollingUsecs()
{ {
memset(fRollingClientUsecs, 0, sizeof(fRollingClientUsecs)); memset(fRollingClientUsecs, 0, sizeof(fRollingClientUsecs));
fRollingClientUsecsIndex = 0; fRollingClientUsecsIndex = 0;
fRollingClientUsecsCnt = 0; fRollingClientUsecsCnt = 0;
fSpareUsecs = 0; fSpareUsecs = 0;
fRollingInterval = (int)floor((JACK_ENGINE_ROLLING_INTERVAL * 1000.0f) / fEngineControl->fPeriodUsecs);
fRollingInterval = (int)floor((JACK_ENGINE_ROLLING_INTERVAL * 1000.f) / fPeriodUsecs);
} }


void JackEngineTiming::GetTimeMeasure(jack_time_t callbackUsecs)
void JackEngineControl::GetTimeMeasure(JackClientInterface** table, JackGraphManager* manager, jack_time_t callback_usecs)
{ {
int pos = (++fAudioCycle) % TIME_POINTS; int pos = (++fAudioCycle) % TIME_POINTS;


fLastTime = fCurTime; fLastTime = fCurTime;
fCurTime = callbackUsecs;
fCurTime = callback_usecs;


fLastProcessTime = fProcessTime; fLastProcessTime = fProcessTime;
fProcessTime = GetMicroSeconds(); fProcessTime = GetMicroSeconds();
@@ -115,8 +124,8 @@ void JackEngineTiming::GetTimeMeasure(jack_time_t callbackUsecs)
fMeasure[pos].fAudioCycle = fAudioCycle; fMeasure[pos].fAudioCycle = fAudioCycle;


for (int i = 0; i < CLIENT_NUM; i++) { for (int i = 0; i < CLIENT_NUM; i++) {
JackClientInterface* client = fClientTable[i];
JackClientTiming* timing = fGraphManager->GetClientTiming(i);
JackClientInterface* client = table[i];
JackClientTiming* timing = manager->GetClientTiming(i);
if (client && client->GetClientControl()->fActive) { if (client && client->GetClientControl()->fActive) {
fMeasure[pos].fClientTable[i].fRefNum = i; fMeasure[pos].fClientTable[i].fRefNum = i;
fMeasure[pos].fClientTable[i].fSignaledAt = timing->fSignaledAt; fMeasure[pos].fClientTable[i].fSignaledAt = timing->fSignaledAt;
@@ -128,7 +137,7 @@ void JackEngineTiming::GetTimeMeasure(jack_time_t callbackUsecs)
} }
} }


void JackEngineTiming::ClearTimeMeasures()
void JackEngineControl::ClearTimeMeasures()
{ {
for (int i = 0; i < TIME_POINTS; i++) { for (int i = 0; i < TIME_POINTS; i++) {
for (int j = 0; j < CLIENT_NUM; j++) { for (int j = 0; j < CLIENT_NUM; j++) {
@@ -141,6 +150,4 @@ void JackEngineTiming::ClearTimeMeasures()
fLastTime = fCurTime = 0; fLastTime = fCurTime = 0;
} }



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


+ 85
- 42
common/JackEngineControl.h View File

@@ -29,75 +29,118 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
namespace Jack namespace Jack
{ {


class JackClientInterface;
class JackGraphManager;

#define TIME_POINTS 1000
#define JACK_ENGINE_ROLLING_COUNT 32
#define JACK_ENGINE_ROLLING_INTERVAL 1024

/*!
\brief Timing stucture for a client.
*/

struct JackTimingMeasureClient
{
int fRefNum;
jack_time_t fSignaledAt;
jack_time_t fAwakeAt;
jack_time_t fFinishedAt;
jack_client_state_t fStatus;
};

/*!
\brief Timing stucture for a table of clients.
*/

struct JackTimingMeasure
{
long fAudioCycle;
jack_time_t fEngineTime;
JackTimingMeasureClient fClientTable[CLIENT_NUM];
};

/*! /*!
\brief Engine control in shared memory. \brief Engine control in shared memory.
*/ */


struct JackEngineControl : public JackShmMem struct JackEngineControl : public JackShmMem
{ {
// Shared state
jack_nframes_t fBufferSize; jack_nframes_t fBufferSize;
jack_nframes_t fSampleRate; jack_nframes_t fSampleRate;
float fCPULoad;
bool fSyncMode; bool fSyncMode;
bool fTemporary; bool fTemporary;
jack_time_t fPeriodUsecs; jack_time_t fPeriodUsecs;
jack_time_t fTimeOutUsecs; jack_time_t fTimeOutUsecs;
bool fRealTime; bool fRealTime;
int32_t fPriority; int32_t fPriority;
UInt64 fPeriod;
UInt64 fComputation;
UInt64 fConstraint;
char fServerName[64]; char fServerName[64];
JackFrameTimer fFrameTimer;
JackTransportEngine fTransport; JackTransportEngine fTransport;
bool fVerbose; bool fVerbose;
JackEngineControl(bool sync, bool temporary, long timeout, bool rt, long priority, bool verbose, const char* server_name)
:fSyncMode(sync),
fTemporary(temporary),
fTimeOutUsecs(timeout * 1000),
fRealTime(rt),
fPriority(priority),
fVerbose(verbose)
{
snprintf(fServerName, sizeof(fServerName), server_name);
}
void InitFrameTime()
{
fFrameTimer.InitFrameTime();
}
// Timing
JackTimingMeasure fMeasure[TIME_POINTS];
jack_time_t fLastTime;
jack_time_t fCurTime;
jack_time_t fProcessTime;
jack_time_t fLastProcessTime;
jack_time_t fSpareUsecs;
jack_time_t fMaxUsecs;
uint32_t fAudioCycle;
jack_time_t fRollingClientUsecs[JACK_ENGINE_ROLLING_COUNT];
int fRollingClientUsecsCnt;
int fRollingClientUsecsIndex;
int fRollingInterval;
float fCPULoad;
void IncFrameTime(jack_time_t callback_usecs)
{
fFrameTimer.IncFrameTime(fBufferSize, callback_usecs, fPeriodUsecs);
}
// Fos OSX thread
UInt64 fPeriod;
UInt64 fComputation;
UInt64 fConstraint;
void ResetFrameTime(jack_time_t callback_usecs)
// Timer
JackFrameTimer fFrameTimer;

JackEngineControl(bool sync, bool temporary, long timeout, bool rt, long priority, bool verbose, const char* server_name)
{ {
fFrameTimer.ResetFrameTime(fSampleRate, callback_usecs, fPeriodUsecs);
fSyncMode = sync;
fTemporary = temporary;
fTimeOutUsecs = timeout * 1000;
fRealTime = rt;
fPriority = priority;
fVerbose = verbose;
fLastTime = 0;
fCurTime = 0;
fProcessTime = 0;
fLastProcessTime = 0;
fSpareUsecs = 0;
fMaxUsecs = 0;
fAudioCycle = 0;
ClearTimeMeasures();
ResetRollingUsecs();
snprintf(fServerName, sizeof(fServerName), server_name);
} }
~JackEngineControl()
{}
void ReadFrameTime(JackTimer* timer)
{
fFrameTimer.ReadFrameTime(timer);
}
// Cycle
void CycleBegin(JackClientInterface** table, JackGraphManager* manager, jack_time_t callback_usecs);
void CycleEnd(JackClientInterface** table);
void CycleBegin(jack_time_t callback_usecs)
{
fTransport.CycleBegin(fSampleRate, callback_usecs);
}

void CycleEnd(JackClientInterface** table)
{
fTransport.CycleEnd(table, fSampleRate, fBufferSize);
}
// Timer
void InitFrameTime();
void ResetFrameTime(jack_time_t callback_usecs);
void ReadFrameTime(JackTimer* timer);


// Private
void CalcCPULoad(JackClientInterface** table, JackGraphManager* manager);
void GetTimeMeasure(JackClientInterface** table, JackGraphManager* manager, jack_time_t callback_usecs);
void ClearTimeMeasures();
void ResetRollingUsecs();
}; };



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



#endif #endif

+ 0
- 104
common/JackEngineTiming.h View File

@@ -1,104 +0,0 @@
/*
Copyright (C) 2004-2006 Grame

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

*/

#ifndef __JackEngineTiming__
#define __JackEngineTiming__

#include "types.h"
#include "JackGraphManager.h"

namespace Jack
{

#define TIME_POINTS 1000
#define JACK_ENGINE_ROLLING_COUNT 32
#define JACK_ENGINE_ROLLING_INTERVAL 1024

class JackClientInterface;
struct JackEngineControl;

/*!
\brief Timing stucture for a client.
*/

struct JackTimingMeasureClient
{
int fRefNum;
jack_time_t fSignaledAt;
jack_time_t fAwakeAt;
jack_time_t fFinishedAt;
jack_client_state_t fStatus;
};

/*!
\brief Timing stucture for a table of clients.
*/

struct JackTimingMeasure
{
long fAudioCycle;
jack_time_t fEngineTime;
JackTimingMeasureClient fClientTable[CLIENT_NUM];
};

/*!
\brief Engine timing management.
*/

class JackEngineTiming
{
private:

JackClientInterface** fClientTable;
JackGraphManager* fGraphManager;
JackEngineControl* fEngineControl;

JackTimingMeasure fMeasure[TIME_POINTS];
jack_time_t fLastTime;
jack_time_t fCurTime;
jack_time_t fProcessTime;
jack_time_t fLastProcessTime;
jack_time_t fSpareUsecs;
jack_time_t fMaxUsecs;
uint32_t fAudioCycle;

jack_time_t fRollingClientUsecs[JACK_ENGINE_ROLLING_COUNT];
int fRollingClientUsecsCnt;
int fRollingClientUsecsIndex;
int fRollingInterval;

void CalcCPULoad();
void GetTimeMeasure(jack_time_t callback_usecs);

public:

JackEngineTiming(JackClientInterface** table, JackGraphManager* manager, JackEngineControl* control);
virtual ~JackEngineTiming()
{}

void UpdateTiming(jack_time_t callback_usecs);
void ResetRollingUsecs();

void ClearTimeMeasures();
};

} // end of namespace

#endif


+ 1
- 3
common/JackError.c View File

@@ -24,7 +24,7 @@


int jack_verbose = 0; int jack_verbose = 0;


EXPORT void jack_error (const char *fmt, ...)
EXPORT void jack_error(const char *fmt, ...)
{ {
va_list ap; va_list ap;
char buffer[300]; char buffer[300];
@@ -37,7 +37,6 @@ EXPORT void jack_error (const char *fmt, ...)


EXPORT void JackLog(char *fmt,...) EXPORT void JackLog(char *fmt,...)
{ {
#ifdef PRINTDEBUG
if (jack_verbose) { if (jack_verbose) {
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
@@ -45,6 +44,5 @@ EXPORT void JackLog(char *fmt,...)
vfprintf(stderr, fmt, ap); vfprintf(stderr, fmt, ap);
va_end(ap); va_end(ap);
} }
#endif
} }



+ 0
- 3
common/JackError.h View File

@@ -22,11 +22,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <stdio.h> #include <stdio.h>

#include "JackConstants.h"
#include "JackExports.h" #include "JackExports.h"



#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
{ {


+ 1
- 3
linux/Makefile View File

@@ -26,9 +26,8 @@ VPATH := $(subprojects)


LIB_LINUX := -lpthread -lrt -lasound LIB_LINUX := -lpthread -lrt -lasound



objects_common_server_lib := JackActivationCount.o JackAPI.o JackAudioDriver.o JackClient.o JackConnectionManager.o \ objects_common_server_lib := JackActivationCount.o JackAPI.o JackAudioDriver.o JackClient.o JackConnectionManager.o \
JackDriver.o JackEngine.o JackEngineTiming.o JackError.o JackExternalClient.o JackFrameTimer.o \
JackDriver.o JackEngine.o JackEngineControl.o JackError.o JackExternalClient.o JackFrameTimer.o \
JackFreewheelDriver.o JackGlobalsServer.o JackGraphManager.o JackInternalClient.o JackPort.o JackPosixSemaphore.o JackPosixThread.o JackFifo.o JackLoopbackDriver.o\ JackFreewheelDriver.o JackGlobalsServer.o JackGraphManager.o JackInternalClient.o JackPort.o JackPosixSemaphore.o JackPosixThread.o JackFifo.o JackLoopbackDriver.o\
JackPortType.o JackAudioPort.o JackMidiPort.o \ JackPortType.o JackAudioPort.o JackMidiPort.o \
JackServer.o JackShmMem.o JackThreadedDriver.o shm.o JackSocket.o JackSocketServerChannel.o JackSocketNotifyChannel.o \ JackServer.o JackShmMem.o JackThreadedDriver.o shm.o JackSocket.o JackSocketServerChannel.o JackSocketNotifyChannel.o \
@@ -40,7 +39,6 @@ objects_common_client_lib := JackActivationCount.o JackAPI.o JackClient.o JackCo
JackPortType.o JackAudioPort.o JackMidiPort.o JackMidiAPI.o \ JackPortType.o JackAudioPort.o JackMidiPort.o JackMidiAPI.o \
JackPosixThread.o JackShmMem.o shm.o JackSocket.o JackSocketClientChannel.o JackTime.o JackGlobals.o JackDebugClient.o JackTransportEngine.o timestamps.o JackPosixThread.o JackShmMem.o shm.o JackSocket.o JackSocketClientChannel.o JackTime.o JackGlobals.o JackDebugClient.o JackTransportEngine.o timestamps.o

objects_linux_server := Jackdmp.o objects_linux_server := Jackdmp.o


objects_linux_alsa := JackAlsaDriver.o memops.o generic_hw.o hdsp.o hammerfall.o ice1712.o objects_linux_alsa := JackAlsaDriver.o memops.o generic_hw.o hdsp.o hammerfall.o ice1712.o


+ 6
- 8
macosx/Jackdmp.xcodeproj/project.pbxproj View File

@@ -147,7 +147,6 @@
4B699C6F097D421600A18468 /* JackDriverLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B869B4208C8D22F001CF041 /* JackDriverLoader.h */; }; 4B699C6F097D421600A18468 /* JackDriverLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B869B4208C8D22F001CF041 /* JackDriverLoader.h */; };
4B699C70097D421600A18468 /* jslist.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B869B6408C8D76B001CF041 /* jslist.h */; }; 4B699C70097D421600A18468 /* jslist.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B869B6408C8D76B001CF041 /* jslist.h */; };
4B699C71097D421600A18468 /* JackEngine.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF8D2130834F02800C94B91 /* JackEngine.h */; }; 4B699C71097D421600A18468 /* JackEngine.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF8D2130834F02800C94B91 /* JackEngine.h */; };
4B699C72097D421600A18468 /* JackEngineTiming.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF8D2100834F01C00C94B91 /* JackEngineTiming.h */; };
4B699C73097D421600A18468 /* JackExternalClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF8D1F70834EFBD00C94B91 /* JackExternalClient.h */; }; 4B699C73097D421600A18468 /* JackExternalClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF8D1F70834EFBD00C94B91 /* JackExternalClient.h */; };
4B699C74097D421600A18468 /* JackServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF8D2220834F05C00C94B91 /* JackServer.h */; }; 4B699C74097D421600A18468 /* JackServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF8D2220834F05C00C94B91 /* JackServer.h */; };
4B699C75097D421600A18468 /* JackSocketServerNotifyChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B9745CB08AF771B0094983C /* JackSocketServerNotifyChannel.h */; }; 4B699C75097D421600A18468 /* JackSocketServerNotifyChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B9745CB08AF771B0094983C /* JackSocketServerNotifyChannel.h */; };
@@ -183,7 +182,6 @@
4B699C95097D421600A18468 /* JackDriver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF8D1B60834EEE400C94B91 /* JackDriver.cpp */; }; 4B699C95097D421600A18468 /* JackDriver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF8D1B60834EEE400C94B91 /* JackDriver.cpp */; };
4B699C96097D421600A18468 /* JackDriverLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B869D7F08C9CB00001CF041 /* JackDriverLoader.cpp */; }; 4B699C96097D421600A18468 /* JackDriverLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B869D7F08C9CB00001CF041 /* JackDriverLoader.cpp */; };
4B699C97097D421600A18468 /* JackEngine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF8D2140834F02800C94B91 /* JackEngine.cpp */; }; 4B699C97097D421600A18468 /* JackEngine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF8D2140834F02800C94B91 /* JackEngine.cpp */; };
4B699C98097D421600A18468 /* JackEngineTiming.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF8D20F0834F01C00C94B91 /* JackEngineTiming.cpp */; };
4B699C99097D421600A18468 /* JackExternalClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF8D1F80834EFBD00C94B91 /* JackExternalClient.cpp */; }; 4B699C99097D421600A18468 /* JackExternalClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF8D1F80834EFBD00C94B91 /* JackExternalClient.cpp */; };
4B699C9A097D421600A18468 /* JackInternalClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF8D1ED0834EF9200C94B91 /* JackInternalClient.cpp */; }; 4B699C9A097D421600A18468 /* JackInternalClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF8D1ED0834EF9200C94B91 /* JackInternalClient.cpp */; };
4B699C9B097D421600A18468 /* JackRPCClientUser.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B89B759076B731100D170DE /* JackRPCClientUser.c */; }; 4B699C9B097D421600A18468 /* JackRPCClientUser.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B89B759076B731100D170DE /* JackRPCClientUser.c */; };
@@ -261,6 +259,8 @@
4B6C73890CC60A85001AFFD4 /* statistics.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737C0CC60A6D001AFFD4 /* statistics.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4B6C73890CC60A85001AFFD4 /* statistics.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737C0CC60A6D001AFFD4 /* statistics.h */; settings = {ATTRIBUTES = (Public, ); }; };
4B6C738A0CC60A85001AFFD4 /* thread.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737D0CC60A6D001AFFD4 /* thread.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4B6C738A0CC60A85001AFFD4 /* thread.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737D0CC60A6D001AFFD4 /* thread.h */; settings = {ATTRIBUTES = (Public, ); }; };
4B6C738B0CC60A86001AFFD4 /* transport.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737E0CC60A6D001AFFD4 /* transport.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4B6C738B0CC60A86001AFFD4 /* transport.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737E0CC60A6D001AFFD4 /* transport.h */; settings = {ATTRIBUTES = (Public, ); }; };
4B6F7AED0CD0CDBD00F48A9D /* JackEngineControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B6F7AEC0CD0CDBD00F48A9D /* JackEngineControl.cpp */; };
4B6F7AEE0CD0CDBD00F48A9D /* JackEngineControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B6F7AEC0CD0CDBD00F48A9D /* JackEngineControl.cpp */; };
4B80D7E80BA0D17400F035BB /* JackMidiPort.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B80D7E50BA0D17400F035BB /* JackMidiPort.h */; }; 4B80D7E80BA0D17400F035BB /* JackMidiPort.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B80D7E50BA0D17400F035BB /* JackMidiPort.h */; };
4B80D7E90BA0D17400F035BB /* JackMidiPort.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B80D7E60BA0D17400F035BB /* JackMidiPort.cpp */; }; 4B80D7E90BA0D17400F035BB /* JackMidiPort.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B80D7E60BA0D17400F035BB /* JackMidiPort.cpp */; };
4B80D7EA0BA0D17400F035BB /* JackMidiAPI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B80D7E70BA0D17400F035BB /* JackMidiAPI.cpp */; }; 4B80D7EA0BA0D17400F035BB /* JackMidiAPI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B80D7E70BA0D17400F035BB /* JackMidiAPI.cpp */; };
@@ -525,6 +525,7 @@
4B6C737D0CC60A6D001AFFD4 /* thread.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = thread.h; path = ../common/jack/thread.h; sourceTree = SOURCE_ROOT; }; 4B6C737D0CC60A6D001AFFD4 /* thread.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = thread.h; path = ../common/jack/thread.h; sourceTree = SOURCE_ROOT; };
4B6C737E0CC60A6D001AFFD4 /* transport.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = transport.h; path = ../common/jack/transport.h; sourceTree = SOURCE_ROOT; }; 4B6C737E0CC60A6D001AFFD4 /* transport.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = transport.h; path = ../common/jack/transport.h; sourceTree = SOURCE_ROOT; };
4B6C737F0CC60A6D001AFFD4 /* types.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = types.h; path = ../common/jack/types.h; sourceTree = SOURCE_ROOT; }; 4B6C737F0CC60A6D001AFFD4 /* types.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = types.h; path = ../common/jack/types.h; sourceTree = SOURCE_ROOT; };
4B6F7AEC0CD0CDBD00F48A9D /* JackEngineControl.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackEngineControl.cpp; path = ../common/JackEngineControl.cpp; sourceTree = SOURCE_ROOT; };
4B799AD607899652003F3F15 /* JackMachPort.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JackMachPort.cpp; sourceTree = "<group>"; }; 4B799AD607899652003F3F15 /* JackMachPort.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JackMachPort.cpp; sourceTree = "<group>"; };
4B799AD707899652003F3F15 /* JackMachPort.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = JackMachPort.h; sourceTree = "<group>"; }; 4B799AD707899652003F3F15 /* JackMachPort.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = JackMachPort.h; sourceTree = "<group>"; };
4B80D7E50BA0D17400F035BB /* JackMidiPort.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackMidiPort.h; path = ../common/JackMidiPort.h; sourceTree = SOURCE_ROOT; }; 4B80D7E50BA0D17400F035BB /* JackMidiPort.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackMidiPort.h; path = ../common/JackMidiPort.h; sourceTree = SOURCE_ROOT; };
@@ -637,8 +638,6 @@
4BF8D1FC0834EFD100C94B91 /* JackLibClient.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackLibClient.h; path = ../common/JackLibClient.h; sourceTree = SOURCE_ROOT; }; 4BF8D1FC0834EFD100C94B91 /* JackLibClient.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackLibClient.h; path = ../common/JackLibClient.h; sourceTree = SOURCE_ROOT; };
4BF8D1FD0834EFD100C94B91 /* JackLibClient.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackLibClient.cpp; path = ../common/JackLibClient.cpp; sourceTree = SOURCE_ROOT; }; 4BF8D1FD0834EFD100C94B91 /* JackLibClient.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackLibClient.cpp; path = ../common/JackLibClient.cpp; sourceTree = SOURCE_ROOT; };
4BF8D1FE0834EFD100C94B91 /* JackLibAPI.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackLibAPI.cpp; path = ../common/JackLibAPI.cpp; sourceTree = SOURCE_ROOT; }; 4BF8D1FE0834EFD100C94B91 /* JackLibAPI.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackLibAPI.cpp; path = ../common/JackLibAPI.cpp; sourceTree = SOURCE_ROOT; };
4BF8D20F0834F01C00C94B91 /* JackEngineTiming.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackEngineTiming.cpp; path = ../common/JackEngineTiming.cpp; sourceTree = SOURCE_ROOT; };
4BF8D2100834F01C00C94B91 /* JackEngineTiming.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackEngineTiming.h; path = ../common/JackEngineTiming.h; sourceTree = SOURCE_ROOT; };
4BF8D2130834F02800C94B91 /* JackEngine.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackEngine.h; path = ../common/JackEngine.h; sourceTree = SOURCE_ROOT; }; 4BF8D2130834F02800C94B91 /* JackEngine.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackEngine.h; path = ../common/JackEngine.h; sourceTree = SOURCE_ROOT; };
4BF8D2140834F02800C94B91 /* JackEngine.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackEngine.cpp; path = ../common/JackEngine.cpp; sourceTree = SOURCE_ROOT; }; 4BF8D2140834F02800C94B91 /* JackEngine.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackEngine.cpp; path = ../common/JackEngine.cpp; sourceTree = SOURCE_ROOT; };
4BF8D2190834F03D00C94B91 /* JackEngineControl.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackEngineControl.h; path = ../common/JackEngineControl.h; sourceTree = SOURCE_ROOT; }; 4BF8D2190834F03D00C94B91 /* JackEngineControl.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackEngineControl.h; path = ../common/JackEngineControl.h; sourceTree = SOURCE_ROOT; };
@@ -1017,6 +1016,7 @@
4B123D3308B3954300540632 /* JackGlobalsClient.cpp */, 4B123D3308B3954300540632 /* JackGlobalsClient.cpp */,
4B123D3608B3954A00540632 /* JackGlobalsServer.cpp */, 4B123D3608B3954A00540632 /* JackGlobalsServer.cpp */,
4BF8D2190834F03D00C94B91 /* JackEngineControl.h */, 4BF8D2190834F03D00C94B91 /* JackEngineControl.h */,
4B6F7AEC0CD0CDBD00F48A9D /* JackEngineControl.cpp */,
4BD4B4D409BACD9600750C0F /* JackTransportEngine.h */, 4BD4B4D409BACD9600750C0F /* JackTransportEngine.h */,
4BD4B4D509BACD9600750C0F /* JackTransportEngine.cpp */, 4BD4B4D509BACD9600750C0F /* JackTransportEngine.cpp */,
4BF8D2220834F05C00C94B91 /* JackServer.h */, 4BF8D2220834F05C00C94B91 /* JackServer.h */,
@@ -1123,8 +1123,6 @@
4BF8D2140834F02800C94B91 /* JackEngine.cpp */, 4BF8D2140834F02800C94B91 /* JackEngine.cpp */,
4BF8FB0E08AC88EF00D1A344 /* JackFrameTimer.h */, 4BF8FB0E08AC88EF00D1A344 /* JackFrameTimer.h */,
4BF8FB0D08AC88EF00D1A344 /* JackFrameTimer.cpp */, 4BF8FB0D08AC88EF00D1A344 /* JackFrameTimer.cpp */,
4BF8D2100834F01C00C94B91 /* JackEngineTiming.h */,
4BF8D20F0834F01C00C94B91 /* JackEngineTiming.cpp */,
); );
name = Engine; name = Engine;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -1361,7 +1359,6 @@
4B699C6F097D421600A18468 /* JackDriverLoader.h in Headers */, 4B699C6F097D421600A18468 /* JackDriverLoader.h in Headers */,
4B699C70097D421600A18468 /* jslist.h in Headers */, 4B699C70097D421600A18468 /* jslist.h in Headers */,
4B699C71097D421600A18468 /* JackEngine.h in Headers */, 4B699C71097D421600A18468 /* JackEngine.h in Headers */,
4B699C72097D421600A18468 /* JackEngineTiming.h in Headers */,
4B699C73097D421600A18468 /* JackExternalClient.h in Headers */, 4B699C73097D421600A18468 /* JackExternalClient.h in Headers */,
4B699C74097D421600A18468 /* JackServer.h in Headers */, 4B699C74097D421600A18468 /* JackServer.h in Headers */,
4B699C75097D421600A18468 /* JackSocketServerNotifyChannel.h in Headers */, 4B699C75097D421600A18468 /* JackSocketServerNotifyChannel.h in Headers */,
@@ -2280,6 +2277,7 @@
4BAB95ED0B9E21A500A0C723 /* JackAudioPort.cpp in Sources */, 4BAB95ED0B9E21A500A0C723 /* JackAudioPort.cpp in Sources */,
4B80D7E90BA0D17400F035BB /* JackMidiPort.cpp in Sources */, 4B80D7E90BA0D17400F035BB /* JackMidiPort.cpp in Sources */,
4B80D7EA0BA0D17400F035BB /* JackMidiAPI.cpp in Sources */, 4B80D7EA0BA0D17400F035BB /* JackMidiAPI.cpp in Sources */,
4B6F7AED0CD0CDBD00F48A9D /* JackEngineControl.cpp in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@@ -2313,7 +2311,6 @@
4B699C95097D421600A18468 /* JackDriver.cpp in Sources */, 4B699C95097D421600A18468 /* JackDriver.cpp in Sources */,
4B699C96097D421600A18468 /* JackDriverLoader.cpp in Sources */, 4B699C96097D421600A18468 /* JackDriverLoader.cpp in Sources */,
4B699C97097D421600A18468 /* JackEngine.cpp in Sources */, 4B699C97097D421600A18468 /* JackEngine.cpp in Sources */,
4B699C98097D421600A18468 /* JackEngineTiming.cpp in Sources */,
4B699C99097D421600A18468 /* JackExternalClient.cpp in Sources */, 4B699C99097D421600A18468 /* JackExternalClient.cpp in Sources */,
4B699C9A097D421600A18468 /* JackInternalClient.cpp in Sources */, 4B699C9A097D421600A18468 /* JackInternalClient.cpp in Sources */,
4B699C9B097D421600A18468 /* JackRPCClientUser.c in Sources */, 4B699C9B097D421600A18468 /* JackRPCClientUser.c in Sources */,
@@ -2336,6 +2333,7 @@
4BAB95EE0B9E21A500A0C723 /* JackAudioPort.cpp in Sources */, 4BAB95EE0B9E21A500A0C723 /* JackAudioPort.cpp in Sources */,
4B80D7EC0BA0D17400F035BB /* JackMidiPort.cpp in Sources */, 4B80D7EC0BA0D17400F035BB /* JackMidiPort.cpp in Sources */,
4B80D7ED0BA0D17400F035BB /* JackMidiAPI.cpp in Sources */, 4B80D7ED0BA0D17400F035BB /* JackMidiAPI.cpp in Sources */,
4B6F7AEE0CD0CDBD00F48A9D /* JackEngineControl.cpp in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };


Loading…
Cancel
Save