Browse Source

More robust server/client protocol.

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4697 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/1.9.9.5
sletz 13 years ago
parent
commit
0d08aa4d72
13 changed files with 367 additions and 299 deletions
  1. +5
    -1
      ChangeLog
  2. +20
    -19
      common/JackEngine.cpp
  3. +5
    -5
      common/JackEngine.h
  4. +6
    -8
      common/JackInternalClientChannel.h
  5. +15
    -15
      common/JackLockedEngine.h
  6. +127
    -39
      common/JackRequest.h
  7. +96
    -123
      common/JackRequestDecoder.cpp
  8. +1
    -1
      common/JackRequestDecoder.h
  9. +59
    -59
      macosx/coreaudio/JackCoreAudioDriver.cpp
  10. +4
    -4
      posix/JackPosixThread.cpp
  11. +15
    -13
      posix/JackSocketServerChannel.cpp
  12. +10
    -8
      windows/JackWinNamedPipeServerChannel.cpp
  13. +4
    -4
      windows/JackWinThread.cpp

+ 5
- 1
ChangeLog View File

@@ -36,9 +36,13 @@ John Emmas
Jackdmp changes log Jackdmp changes log
--------------------------- ---------------------------


2012-01-13 Stephane Letz <letz@grame.fr>

* More robust server/client protocol.

2012-01-11 Stephane Letz <letz@grame.fr> 2012-01-11 Stephane Letz <letz@grame.fr>


* Factorize code the server/client request.
* Factorize code the server/client request in JackRequestDecoder class.


2012-01-06 Stephane Letz <letz@grame.fr> 2012-01-06 Stephane Letz <letz@grame.fr>




+ 20
- 19
common/JackEngine.cpp View File

@@ -157,7 +157,7 @@ bool JackEngine::Process(jack_time_t cur_cycle_begin, jack_time_t prev_cycle_end


// Cycle begin // Cycle begin
fEngineControl->CycleBegin(fClientTable, fGraphManager, cur_cycle_begin, prev_cycle_end); fEngineControl->CycleBegin(fClientTable, fGraphManager, cur_cycle_begin, prev_cycle_end);
// Graph // Graph
if (fGraphManager->IsFinishedGraph()) { if (fGraphManager->IsFinishedGraph()) {
ProcessNext(cur_cycle_begin); ProcessNext(cur_cycle_begin);
@@ -1000,7 +1000,7 @@ void JackEngine::SessionNotify(int refnum, const char *target, jack_session_even
} }
} }


void JackEngine::SessionReply(int refnum)
int JackEngine::SessionReply(int refnum)
{ {
JackClientInterface* client = fClientTable[refnum]; JackClientInterface* client = fClientTable[refnum];
char uuid_buf[JACK_UUID_SIZE]; char uuid_buf[JACK_UUID_SIZE];
@@ -1019,72 +1019,73 @@ void JackEngine::SessionReply(int refnum)
} }
fSessionResult = NULL; fSessionResult = NULL;
} }
return 0;
} }


void JackEngine::GetUUIDForClientName(const char *client_name, char *uuid_res, int *result)
int JackEngine::GetUUIDForClientName(const char *client_name, char *uuid_res)
{ {
for (int i = 0; i < CLIENT_NUM; i++) { for (int i = 0; i < CLIENT_NUM; i++) {
JackClientInterface* client = fClientTable[i]; JackClientInterface* client = fClientTable[i];


if (client && (strcmp(client_name, client->GetClientControl()->fName) == 0)) { if (client && (strcmp(client_name, client->GetClientControl()->fName) == 0)) {
snprintf(uuid_res, JACK_UUID_SIZE, "%d", client->GetClientControl()->fSessionID); snprintf(uuid_res, JACK_UUID_SIZE, "%d", client->GetClientControl()->fSessionID);
*result = 0;
return;
return 0;
} }
} }
// Did not find name. // Did not find name.
*result = -1;
return -1;
} }


void JackEngine::GetClientNameForUUID(const char *uuid, char *name_res, int *result)
int JackEngine::GetClientNameForUUID(const char *uuid, char *name_res)
{ {
for (int i = 0; i < CLIENT_NUM; i++) { for (int i = 0; i < CLIENT_NUM; i++) {
JackClientInterface* client = fClientTable[i]; JackClientInterface* client = fClientTable[i];


if (!client)
if (!client) {
continue; continue;
}


char uuid_buf[JACK_UUID_SIZE]; char uuid_buf[JACK_UUID_SIZE];
snprintf(uuid_buf, JACK_UUID_SIZE, "%d", client->GetClientControl()->fSessionID); snprintf(uuid_buf, JACK_UUID_SIZE, "%d", client->GetClientControl()->fSessionID);


if (strcmp(uuid,uuid_buf) == 0) { if (strcmp(uuid,uuid_buf) == 0) {
strncpy(name_res, client->GetClientControl()->fName, JACK_CLIENT_NAME_SIZE); strncpy(name_res, client->GetClientControl()->fName, JACK_CLIENT_NAME_SIZE);
*result = 0;
return;
return 0;
} }
} }
// Did not find uuid. // Did not find uuid.
*result = -1;
return -1;
} }


void JackEngine::ReserveClientName(const char *name, const char *uuid, int *result)
int JackEngine::ReserveClientName(const char *name, const char *uuid)
{ {
jack_log("JackEngine::ReserveClientName ( name = %s, uuid = %s )", name, uuid); jack_log("JackEngine::ReserveClientName ( name = %s, uuid = %s )", name, uuid);


if (ClientCheckName(name)) { if (ClientCheckName(name)) {
*result = -1;
jack_log("name already taken"); jack_log("name already taken");
return;
return -1;
} }


EnsureUUID(atoi(uuid)); EnsureUUID(atoi(uuid));
fReservationMap[atoi(uuid)] = name; fReservationMap[atoi(uuid)] = name;
*result = 0;
return 0;
} }


void JackEngine::ClientHasSessionCallback(const char *name, int *result)
int JackEngine::ClientHasSessionCallback(const char *name)
{ {
JackClientInterface* client = NULL; JackClientInterface* client = NULL;
for (int i = 0; i < CLIENT_NUM; i++) { for (int i = 0; i < CLIENT_NUM; i++) {
client = fClientTable[i]; client = fClientTable[i];
if (client && (strcmp(client->GetClientControl()->fName, name) == 0))
if (client && (strcmp(client->GetClientControl()->fName, name) == 0)) {
break; break;
}
} }


if (client) { if (client) {
*result = client->GetClientControl()->fCallback[kSessionCallback];
return client->GetClientControl()->fCallback[kSessionCallback];
} else { } else {
*result = -1;
return -1;
} }
} }




+ 5
- 5
common/JackEngine.h View File

@@ -148,12 +148,12 @@ class SERVER_EXPORT JackEngine : public JackLockAble


// Session management // Session management
void SessionNotify(int refnum, const char *target, jack_session_event_type_t type, const char *path, detail::JackChannelTransactionInterface *socket, JackSessionNotifyResult** result); void SessionNotify(int refnum, const char *target, jack_session_event_type_t type, const char *path, detail::JackChannelTransactionInterface *socket, JackSessionNotifyResult** result);
void SessionReply(int refnum);
int SessionReply(int refnum);


void GetUUIDForClientName(const char *client_name, char *uuid_res, int *result);
void GetClientNameForUUID(const char *uuid, char *name_res, int *result);
void ReserveClientName(const char *name, const char *uuid, int *result);
void ClientHasSessionCallback(const char *name, int *result);
int GetUUIDForClientName(const char *client_name, char *uuid_res);
int GetClientNameForUUID(const char *uuid, char *name_res);
int ReserveClientName(const char *name, const char *uuid);
int ClientHasSessionCallback(const char *name);
}; };






+ 6
- 8
common/JackInternalClientChannel.h View File

@@ -142,8 +142,7 @@ class JackInternalClientChannel : public detail::JackClientChannelInterface
{ {
JackSessionNotifyResult* res; JackSessionNotifyResult* res;
fEngine->SessionNotify(refnum, target, type, path, NULL, &res); fEngine->SessionNotify(refnum, target, type, path, NULL, &res);
if (res == NULL)
{
if (res == NULL) {
*result = NULL; *result = NULL;
return; return;
} }
@@ -154,28 +153,27 @@ class JackInternalClientChannel : public detail::JackClientChannelInterface


void SessionReply(int refnum, int* result) void SessionReply(int refnum, int* result)
{ {
fEngine->SessionReply(refnum);
*result = 0;
*result = fEngine->SessionReply(refnum);
} }


void GetUUIDForClientName(int refnum, const char* client_name, char* uuid_res, int* result) void GetUUIDForClientName(int refnum, const char* client_name, char* uuid_res, int* result)
{ {
fEngine->GetUUIDForClientName(client_name, uuid_res, result);
*result = fEngine->GetUUIDForClientName(client_name, uuid_res);
} }


void GetClientNameForUUID(int refnum, const char* uuid, char* name_res, int* result) void GetClientNameForUUID(int refnum, const char* uuid, char* name_res, int* result)
{ {
fEngine->GetClientNameForUUID(uuid, name_res, result);
*result = fEngine->GetClientNameForUUID(uuid, name_res);
} }


void ReserveClientName(int refnum, const char* client_name, const char *uuid, int* result) void ReserveClientName(int refnum, const char* client_name, const char *uuid, int* result)
{ {
fEngine->ReserveClientName(client_name, uuid, result);
*result = fEngine->ReserveClientName(client_name, uuid);
} }


void ClientHasSessionCallback(const char* client_name, int* result) void ClientHasSessionCallback(const char* client_name, int* result)
{ {
fEngine->ClientHasSessionCallback(client_name, result);
*result = fEngine->ClientHasSessionCallback(client_name);
} }






+ 15
- 15
common/JackLockedEngine.h View File

@@ -333,42 +333,42 @@ class SERVER_EXPORT JackLockedEngine
CATCH_EXCEPTION CATCH_EXCEPTION
} }


void SessionReply(int refnum)
int SessionReply(int refnum)
{ {
TRY_CALL TRY_CALL
JackLock lock(&fEngine); JackLock lock(&fEngine);
fEngine.SessionReply(refnum);
CATCH_EXCEPTION
return fEngine.SessionReply(refnum);
CATCH_EXCEPTION_RETURN
} }


void GetUUIDForClientName(const char *client_name, char *uuid_res, int *result)
int GetUUIDForClientName(const char *client_name, char *uuid_res)
{ {
TRY_CALL TRY_CALL
JackLock lock(&fEngine); JackLock lock(&fEngine);
fEngine.GetUUIDForClientName(client_name, uuid_res, result);
CATCH_EXCEPTION
return fEngine.GetUUIDForClientName(client_name, uuid_res);
CATCH_EXCEPTION_RETURN
} }
void GetClientNameForUUID(const char *uuid, char *name_res, int *result)
int GetClientNameForUUID(const char *uuid, char *name_res)
{ {
TRY_CALL TRY_CALL
JackLock lock(&fEngine); JackLock lock(&fEngine);
fEngine.GetClientNameForUUID(uuid, name_res, result);
CATCH_EXCEPTION
return fEngine.GetClientNameForUUID(uuid, name_res);
CATCH_EXCEPTION_RETURN
} }
void ReserveClientName(const char *name, const char *uuid, int *result)
int ReserveClientName(const char *name, const char *uuid)
{ {
TRY_CALL TRY_CALL
JackLock lock(&fEngine); JackLock lock(&fEngine);
fEngine.ReserveClientName(name, uuid, result);
CATCH_EXCEPTION
return fEngine.ReserveClientName(name, uuid);
CATCH_EXCEPTION_RETURN
} }


void ClientHasSessionCallback(const char *name, int *result)
int ClientHasSessionCallback(const char *name)
{ {
TRY_CALL TRY_CALL
JackLock lock(&fEngine); JackLock lock(&fEngine);
fEngine.ClientHasSessionCallback(name, result);
CATCH_EXCEPTION
return fEngine.ClientHasSessionCallback(name);
CATCH_EXCEPTION_RETURN
} }
}; };




+ 127
- 39
common/JackRequest.h View File

@@ -22,6 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define __JackRequest__ #define __JackRequest__


#include "JackConstants.h" #include "JackConstants.h"
#include "JackError.h"
#include "JackPlatformPlug.h" #include "JackPlatformPlug.h"
#include "JackChannel.h" #include "JackChannel.h"
#include "JackTime.h" #include "JackTime.h"
@@ -34,7 +35,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
namespace Jack namespace Jack
{ {


#define CheckRes(exp) { if ((exp) < 0) return -1; }
#define CheckRes(exp) { if ((exp) < 0) { jack_error("CheckRes error"); return -1; } }
#define CheckSize() { CheckRes(trans->Read(&fSize, sizeof(int))); if (fSize != Size()) { jack_error("CheckSize error size = %d Size() = %d", fSize, Size()); return -1; } }


/*! /*!
\brief Session API constants. \brief Session API constants.
@@ -91,11 +93,12 @@ struct JackRequest
}; };


RequestType fType; RequestType fType;
int fSize;


JackRequest(): fType((RequestType)0)
JackRequest(): fType((RequestType)0), fSize(0)
{} {}


JackRequest(RequestType type): fType(type)
JackRequest(RequestType type): fType(type), fSize(0)
{} {}


virtual ~JackRequest() virtual ~JackRequest()
@@ -106,10 +109,16 @@ struct JackRequest
return trans->Read(&fType, sizeof(RequestType)); return trans->Read(&fType, sizeof(RequestType));
} }


virtual int Write(detail::JackChannelTransactionInterface* trans)
virtual int Write(detail::JackChannelTransactionInterface* trans) { return -1; }
virtual int Write(detail::JackChannelTransactionInterface* trans, int size)
{ {
return trans->Write(&fType, sizeof(RequestType));
fSize = size;
CheckRes(trans->Write(&fType, sizeof(RequestType)));
return trans->Write(&fSize, sizeof(int));
} }
virtual int Size() { return 0; }


}; };


@@ -164,6 +173,7 @@ struct JackClientCheckRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
CheckRes(trans->Read(&fName, sizeof(fName))); CheckRes(trans->Read(&fName, sizeof(fName)));
CheckRes(trans->Read(&fProtocol, sizeof(int))); CheckRes(trans->Read(&fProtocol, sizeof(int)));
CheckRes(trans->Read(&fOptions, sizeof(int))); CheckRes(trans->Read(&fOptions, sizeof(int)));
@@ -173,13 +183,15 @@ struct JackClientCheckRequest : public JackRequest


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fName, sizeof(fName))); CheckRes(trans->Write(&fName, sizeof(fName)));
CheckRes(trans->Write(&fProtocol, sizeof(int))); CheckRes(trans->Write(&fProtocol, sizeof(int)));
CheckRes(trans->Write(&fOptions, sizeof(int))); CheckRes(trans->Write(&fOptions, sizeof(int)));
CheckRes(trans->Write(&fUUID, sizeof(int))); CheckRes(trans->Write(&fUUID, sizeof(int)));
return trans->Write(&fOpen, sizeof(int)); return trans->Write(&fOpen, sizeof(int));
} }
int Size() { return sizeof(fName) + 4 * sizeof(int); }


}; };


@@ -241,6 +253,7 @@ struct JackClientOpenRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
CheckRes(trans->Read(&fPID, sizeof(int))); CheckRes(trans->Read(&fPID, sizeof(int)));
CheckRes(trans->Read(&fUUID, sizeof(int))); CheckRes(trans->Read(&fUUID, sizeof(int)));
return trans->Read(&fName, sizeof(fName)); return trans->Read(&fName, sizeof(fName));
@@ -248,12 +261,14 @@ struct JackClientOpenRequest : public JackRequest


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fPID, sizeof(int))); CheckRes(trans->Write(&fPID, sizeof(int)));
CheckRes(trans->Write(&fUUID, sizeof(int))); CheckRes(trans->Write(&fUUID, sizeof(int)));
return trans->Write(&fName, sizeof(fName)); return trans->Write(&fName, sizeof(fName));
} }


int Size() { return 2 * sizeof(int) + sizeof(fName); }
}; };


/*! /*!
@@ -310,15 +325,17 @@ struct JackClientCloseRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
return trans->Read(&fRefNum, sizeof(int)); return trans->Read(&fRefNum, sizeof(int));
} }


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
return trans->Write(&fRefNum, sizeof(int)); return trans->Write(&fRefNum, sizeof(int));
} }


int Size() { return sizeof(int); }
}; };


/*! /*!
@@ -339,17 +356,19 @@ struct JackActivateRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fRefNum, sizeof(int)));
return trans->Read(&fIsRealTime, sizeof(int)); return trans->Read(&fIsRealTime, sizeof(int));
} }


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fRefNum, sizeof(int)));
return trans->Write(&fIsRealTime, sizeof(int)); return trans->Write(&fIsRealTime, sizeof(int));
} }


int Size() { return 2 * sizeof(int); }
}; };


/*! /*!
@@ -368,15 +387,17 @@ struct JackDeactivateRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
return trans->Read(&fRefNum, sizeof(int)); return trans->Read(&fRefNum, sizeof(int));
} }


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
return trans->Write(&fRefNum, sizeof(int)); return trans->Write(&fRefNum, sizeof(int));
} }


int Size() { return sizeof(int); }
}; };


/*! /*!
@@ -403,6 +424,7 @@ struct JackPortRegisterRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fRefNum, sizeof(int)));
CheckRes(trans->Read(&fName, sizeof(fName))); CheckRes(trans->Read(&fName, sizeof(fName)));
CheckRes(trans->Read(&fPortType, sizeof(fPortType))); CheckRes(trans->Read(&fPortType, sizeof(fPortType)));
@@ -413,7 +435,7 @@ struct JackPortRegisterRequest : public JackRequest


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fRefNum, sizeof(int)));
CheckRes(trans->Write(&fName, sizeof(fName))); CheckRes(trans->Write(&fName, sizeof(fName)));
CheckRes(trans->Write(&fPortType, sizeof(fPortType))); CheckRes(trans->Write(&fPortType, sizeof(fPortType)));
@@ -421,6 +443,8 @@ struct JackPortRegisterRequest : public JackRequest
CheckRes(trans->Write(&fBufferSize, sizeof(unsigned int))); CheckRes(trans->Write(&fBufferSize, sizeof(unsigned int)));
return 0; return 0;
} }
int Size() { return sizeof(int) + sizeof(fName) + sizeof(fPortType) + 2 * sizeof(unsigned int); }


}; };


@@ -468,6 +492,7 @@ struct JackPortUnRegisterRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fRefNum, sizeof(int)));
CheckRes(trans->Read(&fPortIndex, sizeof(jack_port_id_t))); CheckRes(trans->Read(&fPortIndex, sizeof(jack_port_id_t)));
return 0; return 0;
@@ -475,12 +500,13 @@ struct JackPortUnRegisterRequest : public JackRequest


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fRefNum, sizeof(int)));
CheckRes(trans->Write(&fPortIndex, sizeof(jack_port_id_t))); CheckRes(trans->Write(&fPortIndex, sizeof(jack_port_id_t)));
return 0; return 0;
} }


int Size() { return sizeof(int) + sizeof(jack_port_id_t); }
}; };


/*! /*!
@@ -505,21 +531,23 @@ struct JackPortConnectNameRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fRefNum, sizeof(int)));
CheckRes(trans->Read(&fSrc, sizeof(fSrc))); CheckRes(trans->Read(&fSrc, sizeof(fSrc)));
CheckRes(trans->Read(&fDst, sizeof(fDst))); CheckRes(trans->Read(&fDst, sizeof(fDst)));
return 0; return 0;

} }


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fRefNum, sizeof(int)));
CheckRes(trans->Write(&fSrc, sizeof(fSrc))); CheckRes(trans->Write(&fSrc, sizeof(fSrc)));
CheckRes(trans->Write(&fDst, sizeof(fDst))); CheckRes(trans->Write(&fDst, sizeof(fDst)));
return 0; return 0;
} }
int Size() { return sizeof(int) + sizeof(fSrc) + sizeof(fDst); }


}; };


@@ -545,6 +573,7 @@ struct JackPortDisconnectNameRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fRefNum, sizeof(int)));
CheckRes(trans->Read(&fSrc, sizeof(fSrc))); CheckRes(trans->Read(&fSrc, sizeof(fSrc)));
CheckRes(trans->Read(&fDst, sizeof(fDst))); CheckRes(trans->Read(&fDst, sizeof(fDst)));
@@ -553,13 +582,15 @@ struct JackPortDisconnectNameRequest : public JackRequest


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fRefNum, sizeof(int)));
CheckRes(trans->Write(&fSrc, sizeof(fSrc))); CheckRes(trans->Write(&fSrc, sizeof(fSrc)));
CheckRes(trans->Write(&fDst, sizeof(fDst))); CheckRes(trans->Write(&fDst, sizeof(fDst)));
return 0; return 0;
} }


int Size() { return sizeof(int) + sizeof(fSrc) + sizeof(fDst); }
}; };


/*! /*!
@@ -581,6 +612,7 @@ struct JackPortConnectRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fRefNum, sizeof(int)));
CheckRes(trans->Read(&fSrc, sizeof(jack_port_id_t))); CheckRes(trans->Read(&fSrc, sizeof(jack_port_id_t)));
CheckRes(trans->Read(&fDst, sizeof(jack_port_id_t))); CheckRes(trans->Read(&fDst, sizeof(jack_port_id_t)));
@@ -589,13 +621,14 @@ struct JackPortConnectRequest : public JackRequest


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fRefNum, sizeof(int)));
CheckRes(trans->Write(&fSrc, sizeof(jack_port_id_t))); CheckRes(trans->Write(&fSrc, sizeof(jack_port_id_t)));
CheckRes(trans->Write(&fDst, sizeof(jack_port_id_t))); CheckRes(trans->Write(&fDst, sizeof(jack_port_id_t)));
return 0; return 0;
} }


int Size() { return sizeof(int) + sizeof(jack_port_id_t) + sizeof(jack_port_id_t); }
}; };


/*! /*!
@@ -617,6 +650,7 @@ struct JackPortDisconnectRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fRefNum, sizeof(int)));
CheckRes(trans->Read(&fSrc, sizeof(jack_port_id_t))); CheckRes(trans->Read(&fSrc, sizeof(jack_port_id_t)));
CheckRes(trans->Read(&fDst, sizeof(jack_port_id_t))); CheckRes(trans->Read(&fDst, sizeof(jack_port_id_t)));
@@ -625,13 +659,14 @@ struct JackPortDisconnectRequest : public JackRequest


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fRefNum, sizeof(int)));
CheckRes(trans->Write(&fSrc, sizeof(jack_port_id_t))); CheckRes(trans->Write(&fSrc, sizeof(jack_port_id_t)));
CheckRes(trans->Write(&fDst, sizeof(jack_port_id_t))); CheckRes(trans->Write(&fDst, sizeof(jack_port_id_t)));
return 0; return 0;
} }


int Size() { return sizeof(int) + sizeof(jack_port_id_t) + sizeof(jack_port_id_t); }
}; };


/*! /*!
@@ -655,6 +690,7 @@ struct JackPortRenameRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fRefNum, sizeof(int)));
CheckRes(trans->Read(&fPort, sizeof(jack_port_id_t))); CheckRes(trans->Read(&fPort, sizeof(jack_port_id_t)));
CheckRes(trans->Read(&fName, sizeof(fName))); CheckRes(trans->Read(&fName, sizeof(fName)));
@@ -663,13 +699,14 @@ struct JackPortRenameRequest : public JackRequest


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fRefNum, sizeof(int)));
CheckRes(trans->Write(&fPort, sizeof(jack_port_id_t))); CheckRes(trans->Write(&fPort, sizeof(jack_port_id_t)));
CheckRes(trans->Write(&fName, sizeof(fName))); CheckRes(trans->Write(&fName, sizeof(fName)));
return 0; return 0;

} }
int Size() { return sizeof(int) + sizeof(jack_port_id_t) + sizeof(fName); }


}; };


@@ -690,15 +727,17 @@ struct JackSetBufferSizeRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
return trans->Read(&fBufferSize, sizeof(jack_nframes_t)); return trans->Read(&fBufferSize, sizeof(jack_nframes_t));
} }


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
return trans->Write(&fBufferSize, sizeof(jack_nframes_t)); return trans->Write(&fBufferSize, sizeof(jack_nframes_t));
} }


int Size() { return sizeof(jack_nframes_t); }
}; };


/*! /*!
@@ -718,14 +757,17 @@ struct JackSetFreeWheelRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
return trans->Read(&fOnOff, sizeof(int)); return trans->Read(&fOnOff, sizeof(int));
} }


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
return trans->Write(&fOnOff, sizeof(int)); return trans->Write(&fOnOff, sizeof(int));
} }
int Size() { return sizeof(int); }


}; };


@@ -742,15 +784,17 @@ struct JackComputeTotalLatenciesRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
return 0; return 0;
} }


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
return 0; return 0;
} }


int Size() { return 0; }
}; };


/*! /*!
@@ -770,14 +814,17 @@ struct JackReleaseTimebaseRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
return trans->Read(&fRefNum, sizeof(int)); return trans->Read(&fRefNum, sizeof(int));
} }


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
return trans->Write(&fRefNum, sizeof(int)); return trans->Write(&fRefNum, sizeof(int));
} }
int Size() { return sizeof(int); }


}; };


@@ -799,17 +846,19 @@ struct JackSetTimebaseCallbackRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fRefNum, sizeof(int)));
return trans->Read(&fConditionnal, sizeof(int)); return trans->Read(&fConditionnal, sizeof(int));
} }


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fRefNum, sizeof(int)));
return trans->Write(&fConditionnal, sizeof(int)); return trans->Write(&fConditionnal, sizeof(int));
} }


int Size() { return sizeof(int) + sizeof(int); }
}; };


/*! /*!
@@ -830,17 +879,19 @@ struct JackGetInternalClientNameRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fRefNum, sizeof(int)));
return trans->Read(&fIntRefNum, sizeof(int)); return trans->Read(&fIntRefNum, sizeof(int));
} }


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fRefNum, sizeof(int)));
return trans->Write(&fIntRefNum, sizeof(int)); return trans->Write(&fIntRefNum, sizeof(int));
} }


int Size() { return sizeof(int) + sizeof(int); }
}; };


/*! /*!
@@ -874,6 +925,7 @@ struct JackGetInternalClientNameResult : public JackResult
return 0; return 0;
} }


int Size() { return sizeof(fName); }
}; };


/*! /*!
@@ -896,17 +948,19 @@ struct JackInternalClientHandleRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fRefNum, sizeof(int)));
return trans->Read(&fName, sizeof(fName)); return trans->Read(&fName, sizeof(fName));
} }


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fRefNum, sizeof(int)));
return trans->Write(&fName, sizeof(fName)); return trans->Write(&fName, sizeof(fName));
} }


int Size() { return sizeof(int) + sizeof(fName); }
}; };


/*! /*!
@@ -941,6 +995,7 @@ struct JackInternalClientHandleResult : public JackResult
return 0; return 0;
} }


int Size() { return sizeof(int) + sizeof(int); }
}; };


/*! /*!
@@ -974,6 +1029,7 @@ struct JackInternalClientLoadRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fRefNum, sizeof(int)));
CheckRes(trans->Read(&fName, sizeof(fName))); CheckRes(trans->Read(&fName, sizeof(fName)));
CheckRes(trans->Read(&fDllName, sizeof(fDllName))); CheckRes(trans->Read(&fDllName, sizeof(fDllName)));
@@ -984,7 +1040,7 @@ struct JackInternalClientLoadRequest : public JackRequest


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fRefNum, sizeof(int)));
CheckRes(trans->Write(&fName, sizeof(fName))); CheckRes(trans->Write(&fName, sizeof(fName)));
CheckRes(trans->Write(&fDllName, sizeof(fDllName))); CheckRes(trans->Write(&fDllName, sizeof(fDllName)));
@@ -993,6 +1049,7 @@ struct JackInternalClientLoadRequest : public JackRequest
return trans->Write(&fOptions, sizeof(int)); return trans->Write(&fOptions, sizeof(int));
} }


int Size() { return sizeof(int) + sizeof(fName) + sizeof(fDllName) + sizeof(fLoadInitName) + 2 * sizeof(int); }
}; };


/*! /*!
@@ -1027,6 +1084,7 @@ struct JackInternalClientLoadResult : public JackResult
return 0; return 0;
} }


int Size() { return sizeof(int) + sizeof(int); }
}; };


/*! /*!
@@ -1047,16 +1105,19 @@ struct JackInternalClientUnloadRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fRefNum, sizeof(int)));
return trans->Read(&fIntRefNum, sizeof(int)); return trans->Read(&fIntRefNum, sizeof(int));
} }


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fRefNum, sizeof(int)));
return trans->Write(&fIntRefNum, sizeof(int)); return trans->Write(&fIntRefNum, sizeof(int));
} }
int Size() { return sizeof(int) + sizeof(int); }
}; };


/*! /*!
@@ -1088,6 +1149,7 @@ struct JackInternalClientUnloadResult : public JackResult
return 0; return 0;
} }


int Size() { return sizeof(int); }
}; };


/*! /*!
@@ -1109,6 +1171,7 @@ struct JackClientNotificationRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fRefNum, sizeof(int)));
CheckRes(trans->Read(&fNotify, sizeof(int))); CheckRes(trans->Read(&fNotify, sizeof(int)));
CheckRes(trans->Read(&fValue, sizeof(int))); CheckRes(trans->Read(&fValue, sizeof(int)));
@@ -1117,12 +1180,14 @@ struct JackClientNotificationRequest : public JackRequest


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fRefNum, sizeof(int)));
CheckRes(trans->Write(&fNotify, sizeof(int))); CheckRes(trans->Write(&fNotify, sizeof(int)));
CheckRes(trans->Write(&fValue, sizeof(int))); CheckRes(trans->Write(&fValue, sizeof(int)));
return 0; return 0;
} }
int Size() { return 3 * sizeof(int); }


}; };


@@ -1260,6 +1325,7 @@ struct JackSessionNotifyRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(fRefNum))); CheckRes(trans->Read(&fRefNum, sizeof(fRefNum)));
CheckRes(trans->Read(&fPath, sizeof(fPath))); CheckRes(trans->Read(&fPath, sizeof(fPath)));
CheckRes(trans->Read(&fDst, sizeof(fDst))); CheckRes(trans->Read(&fDst, sizeof(fDst)));
@@ -1269,7 +1335,7 @@ struct JackSessionNotifyRequest : public JackRequest


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(fRefNum))); CheckRes(trans->Write(&fRefNum, sizeof(fRefNum)));
CheckRes(trans->Write(&fPath, sizeof(fPath))); CheckRes(trans->Write(&fPath, sizeof(fPath)));
CheckRes(trans->Write(&fDst, sizeof(fDst))); CheckRes(trans->Write(&fDst, sizeof(fDst)));
@@ -1277,6 +1343,7 @@ struct JackSessionNotifyRequest : public JackRequest
return 0; return 0;
} }


int Size() { return sizeof(fRefNum) + sizeof(fPath) + sizeof(fDst) + sizeof(fEventType); }
}; };


struct JackSessionReplyRequest : public JackRequest struct JackSessionReplyRequest : public JackRequest
@@ -1292,17 +1359,20 @@ struct JackSessionReplyRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(trans->Read(&fRefNum, sizeof(fRefNum)));
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int)));
return 0; return 0;
} }


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(trans->Write(&fRefNum, sizeof(fRefNum)));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int)));
return 0; return 0;
} }


int Size() { return sizeof(int); }
}; };


struct JackClientNameResult : public JackResult struct JackClientNameResult : public JackResult
@@ -1330,7 +1400,7 @@ struct JackClientNameResult : public JackResult
CheckRes(trans->Write(&fName, sizeof(fName))); CheckRes(trans->Write(&fName, sizeof(fName)));
return 0; return 0;
} }
}; };


struct JackUUIDResult : public JackResult struct JackUUIDResult : public JackResult
@@ -1376,17 +1446,20 @@ struct JackGetUUIDRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
CheckRes(trans->Read(&fName, sizeof(fName))); CheckRes(trans->Read(&fName, sizeof(fName)));
return 0; return 0;
} }


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fName, sizeof(fName))); CheckRes(trans->Write(&fName, sizeof(fName)));
return 0; return 0;
} }


int Size() { return sizeof(fName); }
}; };


struct JackGetClientNameRequest : public JackRequest struct JackGetClientNameRequest : public JackRequest
@@ -1403,18 +1476,21 @@ struct JackGetClientNameRequest : public JackRequest
} }


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{
{
CheckSize();
CheckRes(trans->Read(&fUUID, sizeof(fUUID))); CheckRes(trans->Read(&fUUID, sizeof(fUUID)));
return 0; return 0;
} }


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fUUID, sizeof(fUUID))); CheckRes(trans->Write(&fUUID, sizeof(fUUID)));
return 0; return 0;
} }


int Size() { return sizeof(fUUID); }
}; };


struct JackReserveNameRequest : public JackRequest struct JackReserveNameRequest : public JackRequest
@@ -1435,6 +1511,7 @@ struct JackReserveNameRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
CheckRes(trans->Read(&fUUID, sizeof(fUUID))); CheckRes(trans->Read(&fUUID, sizeof(fUUID)));
CheckRes(trans->Read(&fName, sizeof(fName))); CheckRes(trans->Read(&fName, sizeof(fName)));
CheckRes(trans->Read(&fRefNum, sizeof(fRefNum))); CheckRes(trans->Read(&fRefNum, sizeof(fRefNum)));
@@ -1443,13 +1520,15 @@ struct JackReserveNameRequest : public JackRequest


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fUUID, sizeof(fUUID))); CheckRes(trans->Write(&fUUID, sizeof(fUUID)));
CheckRes(trans->Write(&fName, sizeof(fName))); CheckRes(trans->Write(&fName, sizeof(fName)));
CheckRes(trans->Write(&fRefNum, sizeof(fRefNum))); CheckRes(trans->Write(&fRefNum, sizeof(fRefNum)));
return 0; return 0;
} }


int Size() { return sizeof(fUUID) + sizeof(fName) + sizeof(fRefNum); }
}; };


struct JackClientHasSessionCallbackRequest : public JackRequest struct JackClientHasSessionCallbackRequest : public JackRequest
@@ -1467,17 +1546,20 @@ struct JackClientHasSessionCallbackRequest : public JackRequest


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
CheckRes(trans->Read(&fName, sizeof(fName))); CheckRes(trans->Read(&fName, sizeof(fName)));
return 0; return 0;
} }


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(JackRequest::Write(trans));
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fName, sizeof(fName))); CheckRes(trans->Write(&fName, sizeof(fName)));
return 0; return 0;
} }


int Size() { return sizeof(fName); }
}; };


/*! /*!
@@ -1486,6 +1568,7 @@ struct JackClientHasSessionCallbackRequest : public JackRequest


struct JackClientNotification struct JackClientNotification
{ {
int fSize;
char fName[JACK_CLIENT_NAME_SIZE + 1]; char fName[JACK_CLIENT_NAME_SIZE + 1];
int fRefNum; int fRefNum;
int fNotify; int fNotify;
@@ -1501,10 +1584,12 @@ struct JackClientNotification
{ {
snprintf(fName, sizeof(fName), "%s", name); snprintf(fName, sizeof(fName), "%s", name);
snprintf(fMessage, sizeof(fMessage), "%s", message); snprintf(fMessage, sizeof(fMessage), "%s", message);
fSize = Size();
} }


int Read(detail::JackChannelTransactionInterface* trans) int Read(detail::JackChannelTransactionInterface* trans)
{ {
CheckSize();
CheckRes(trans->Read(&fName, sizeof(fName))); CheckRes(trans->Read(&fName, sizeof(fName)));
CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fRefNum, sizeof(int)));
CheckRes(trans->Read(&fNotify, sizeof(int))); CheckRes(trans->Read(&fNotify, sizeof(int)));
@@ -1517,6 +1602,7 @@ struct JackClientNotification


int Write(detail::JackChannelTransactionInterface* trans) int Write(detail::JackChannelTransactionInterface* trans)
{ {
CheckRes(trans->Write(&fSize, sizeof(int)));
CheckRes(trans->Write(&fName, sizeof(fName))); CheckRes(trans->Write(&fName, sizeof(fName)));
CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fRefNum, sizeof(int)));
CheckRes(trans->Write(&fNotify, sizeof(int))); CheckRes(trans->Write(&fNotify, sizeof(int)));
@@ -1526,6 +1612,8 @@ struct JackClientNotification
CheckRes(trans->Write(&fMessage, sizeof(fMessage))); CheckRes(trans->Write(&fMessage, sizeof(fMessage)));
return 0; return 0;
} }
int Size() { return sizeof(int) + sizeof(fName) + 5 * sizeof(int) + sizeof(fMessage); }


}; };




+ 96
- 123
common/JackRequestDecoder.cpp View File

@@ -30,6 +30,11 @@ using namespace std;
namespace Jack namespace Jack
{ {


#define CheckRead(req, socket) { if (req.Read(socket) < 0) { jack_error("CheckRead error"); return -1; } }
#define CheckWriteName(error, socket) { if (res.Write(socket) < 0) { jack_error("%s write error name = %s", error, req.fName); } }
#define CheckWriteRefNum(error, socket) { if (res.Write(socket) < 0) { jack_error("%s write error ref = %d", error, req.fRefNum); } }
#define CheckWrite(error, socket) { if (res.Write(socket) < 0) { jack_error("%s write error", error); } }

JackRequestDecoder::JackRequestDecoder(JackServer* server, JackClientHandlerInterface* handler) JackRequestDecoder::JackRequestDecoder(JackServer* server, JackClientHandlerInterface* handler)
:fServer(server), fHandler(handler) :fServer(server), fHandler(handler)
{} {}
@@ -37,7 +42,7 @@ JackRequestDecoder::JackRequestDecoder(JackServer* server, JackClientHandlerInte
JackRequestDecoder::~JackRequestDecoder() JackRequestDecoder::~JackRequestDecoder()
{} {}


void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* socket, int type_aux)
int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* socket, int type_aux)
{ {
JackRequest::RequestType type = (JackRequest::RequestType)type_aux; JackRequest::RequestType type = (JackRequest::RequestType)type_aux;
@@ -48,15 +53,14 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::ClientCheck"); jack_log("JackRequest::ClientCheck");
JackClientCheckRequest req; JackClientCheckRequest req;
JackClientCheckResult res; JackClientCheckResult res;
if (req.Read(socket) == 0)
res.fResult = fServer->GetEngine()->ClientCheck(req.fName, req.fUUID, res.fName, req.fProtocol, req.fOptions, &res.fStatus);
if (res.Write(socket) < 0)
jack_error("JackRequest::ClientCheck write error name = %s", req.fName);
CheckRead(req, socket);
res.fResult = fServer->GetEngine()->ClientCheck(req.fName, req.fUUID, res.fName, req.fProtocol, req.fOptions, &res.fStatus);
CheckWriteName("JackRequest::ClientCheck", socket);
// Atomic ClientCheck followed by ClientOpen on same socket // Atomic ClientCheck followed by ClientOpen on same socket
if (req.fOpen) { if (req.fOpen) {
JackRequest header; JackRequest header;
header.Read(socket); header.Read(socket);
HandleRequest(socket, header.fType);
return HandleRequest(socket, header.fType);
} }
break; break;
} }
@@ -65,10 +69,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::ClientOpen"); jack_log("JackRequest::ClientOpen");
JackClientOpenRequest req; JackClientOpenRequest req;
JackClientOpenResult res; JackClientOpenResult res;
if (req.Read(socket) == 0)
fHandler->ClientAdd(socket, &req, &res);
if (res.Write(socket) < 0)
jack_error("JackRequest::ClientOpen write error name = %s", req.fName);
CheckRead(req, socket);
fHandler->ClientAdd(socket, &req, &res);
CheckWriteName("JackRequest::ClientOpen", socket);
break; break;
} }


@@ -76,10 +79,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::ClientClose"); jack_log("JackRequest::ClientClose");
JackClientCloseRequest req; JackClientCloseRequest req;
JackResult res; JackResult res;
if (req.Read(socket) == 0)
res.fResult = fServer->GetEngine()->ClientExternalClose(req.fRefNum);
if (res.Write(socket) < 0)
jack_error("JackRequest::ClientClose write error ref = %d", req.fRefNum);
CheckRead(req, socket);
res.fResult = fServer->GetEngine()->ClientExternalClose(req.fRefNum);
CheckWriteRefNum("JackRequest::ClientClose", socket);
fHandler->ClientRemove(socket, req.fRefNum); fHandler->ClientRemove(socket, req.fRefNum);
break; break;
} }
@@ -88,10 +90,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
JackActivateRequest req; JackActivateRequest req;
JackResult res; JackResult res;
jack_log("JackRequest::ActivateClient"); jack_log("JackRequest::ActivateClient");
if (req.Read(socket) == 0)
res.fResult = fServer->GetEngine()->ClientActivate(req.fRefNum, req.fIsRealTime);
if (res.Write(socket) < 0)
jack_error("JackRequest::ActivateClient write error ref = %d", req.fRefNum);
CheckRead(req, socket);
res.fResult = fServer->GetEngine()->ClientActivate(req.fRefNum, req.fIsRealTime);
CheckWriteRefNum("JackRequest::ActivateClient", socket);
break; break;
} }


@@ -99,10 +100,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::DeactivateClient"); jack_log("JackRequest::DeactivateClient");
JackDeactivateRequest req; JackDeactivateRequest req;
JackResult res; JackResult res;
if (req.Read(socket) == 0)
res.fResult = fServer->GetEngine()->ClientDeactivate(req.fRefNum);
if (res.Write(socket) < 0)
jack_error("JackRequest::DeactivateClient write error ref = %d", req.fRefNum);
CheckRead(req, socket);
res.fResult = fServer->GetEngine()->ClientDeactivate(req.fRefNum);
CheckWriteRefNum("JackRequest::DeactivateClient", socket);
break; break;
} }


@@ -110,10 +110,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::RegisterPort"); jack_log("JackRequest::RegisterPort");
JackPortRegisterRequest req; JackPortRegisterRequest req;
JackPortRegisterResult res; JackPortRegisterResult res;
if (req.Read(socket) == 0)
res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fPortType, req.fFlags, req.fBufferSize, &res.fPortIndex);
if (res.Write(socket) < 0)
jack_error("JackRequest::RegisterPort write error ref = %d", req.fRefNum);
CheckRead(req, socket);
res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fPortType, req.fFlags, req.fBufferSize, &res.fPortIndex);
CheckWriteRefNum("JackRequest::RegisterPort", socket);
break; break;
} }


@@ -121,10 +120,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::UnRegisterPort"); jack_log("JackRequest::UnRegisterPort");
JackPortUnRegisterRequest req; JackPortUnRegisterRequest req;
JackResult res; JackResult res;
if (req.Read(socket) == 0)
res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex);
if (res.Write(socket) < 0)
jack_error("JackRequest::UnRegisterPort write error ref = %d", req.fRefNum);
CheckRead(req, socket);
res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex);
CheckWriteRefNum("JackRequest::UnRegisterPort", socket);
break; break;
} }


@@ -132,10 +130,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::ConnectNamePorts"); jack_log("JackRequest::ConnectNamePorts");
JackPortConnectNameRequest req; JackPortConnectNameRequest req;
JackResult res; JackResult res;
if (req.Read(socket) == 0)
res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst);
if (res.Write(socket) < 0)
jack_error("JackRequest::ConnectNamePorts write error ref = %d", req.fRefNum);
CheckRead(req, socket);
res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst);
CheckWriteRefNum("JackRequest::ConnectNamePorts", socket);
break; break;
} }


@@ -143,10 +140,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::DisconnectNamePorts"); jack_log("JackRequest::DisconnectNamePorts");
JackPortDisconnectNameRequest req; JackPortDisconnectNameRequest req;
JackResult res; JackResult res;
if (req.Read(socket) == 0)
res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst);
if (res.Write(socket) < 0)
jack_error("JackRequest::DisconnectNamePorts write error ref = %d", req.fRefNum);
CheckRead(req, socket);
res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst);
CheckWriteRefNum("JackRequest::DisconnectNamePorts", socket);
break; break;
} }


@@ -154,10 +150,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::ConnectPorts"); jack_log("JackRequest::ConnectPorts");
JackPortConnectRequest req; JackPortConnectRequest req;
JackResult res; JackResult res;
if (req.Read(socket) == 0)
res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst);
if (res.Write(socket) < 0)
jack_error("JackRequest::ConnectPorts write error ref = %d", req.fRefNum);
CheckRead(req, socket);
res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst);
CheckWriteRefNum("JackRequest::ConnectPorts", socket);
break; break;
} }


@@ -165,10 +160,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::DisconnectPorts"); jack_log("JackRequest::DisconnectPorts");
JackPortDisconnectRequest req; JackPortDisconnectRequest req;
JackResult res; JackResult res;
if (req.Read(socket) == 0)
res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst);
if (res.Write(socket) < 0)
jack_error("JackRequest::DisconnectPorts write error ref = %d", req.fRefNum);
CheckRead(req, socket);
res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst);
CheckWriteRefNum("JackRequest::DisconnectPorts", socket);
break; break;
} }


@@ -176,10 +170,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::PortRename"); jack_log("JackRequest::PortRename");
JackPortRenameRequest req; JackPortRenameRequest req;
JackResult res; JackResult res;
if (req.Read(socket) == 0)
res.fResult = fServer->GetEngine()->PortRename(req.fRefNum, req.fPort, req.fName);
if (res.Write(socket) < 0)
jack_error("JackRequest::PortRename write error ref = %d", req.fRefNum);
CheckRead(req, socket);
res.fResult = fServer->GetEngine()->PortRename(req.fRefNum, req.fPort, req.fName);
CheckWriteRefNum("JackRequest::PortRename", socket);
break; break;
} }


@@ -187,10 +180,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::SetBufferSize"); jack_log("JackRequest::SetBufferSize");
JackSetBufferSizeRequest req; JackSetBufferSizeRequest req;
JackResult res; JackResult res;
if (req.Read(socket) == 0)
res.fResult = fServer->SetBufferSize(req.fBufferSize);
if (res.Write(socket) < 0)
jack_error("JackRequest::SetBufferSize write error");
CheckRead(req, socket);
res.fResult = fServer->SetBufferSize(req.fBufferSize);
CheckWrite("JackRequest::SetBufferSize", socket);
break; break;
} }


@@ -198,10 +190,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::SetFreeWheel"); jack_log("JackRequest::SetFreeWheel");
JackSetFreeWheelRequest req; JackSetFreeWheelRequest req;
JackResult res; JackResult res;
if (req.Read(socket) == 0)
res.fResult = fServer->SetFreewheel(req.fOnOff);
if (res.Write(socket) < 0)
jack_error("JackRequest::SetFreeWheel write error");
CheckRead(req, socket);
res.fResult = fServer->SetFreewheel(req.fOnOff);
CheckWrite("JackRequest::SetFreeWheel", socket);
break; break;
} }


@@ -209,10 +200,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::ComputeTotalLatencies"); jack_log("JackRequest::ComputeTotalLatencies");
JackComputeTotalLatenciesRequest req; JackComputeTotalLatenciesRequest req;
JackResult res; JackResult res;
if (req.Read(socket) == 0)
res.fResult = fServer->GetEngine()->ComputeTotalLatencies();
if (res.Write(socket) < 0)
jack_error("JackRequest::ComputeTotalLatencies write error");
CheckRead(req, socket);
res.fResult = fServer->GetEngine()->ComputeTotalLatencies();
CheckWrite("JackRequest::ComputeTotalLatencies", socket);
break; break;
} }


@@ -220,10 +210,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::ReleaseTimebase"); jack_log("JackRequest::ReleaseTimebase");
JackReleaseTimebaseRequest req; JackReleaseTimebaseRequest req;
JackResult res; JackResult res;
if (req.Read(socket) == 0)
res.fResult = fServer->ReleaseTimebase(req.fRefNum);
if (res.Write(socket) < 0)
jack_error("JackRequest::ReleaseTimebase write error ref = %d", req.fRefNum);
CheckRead(req, socket);
res.fResult = fServer->ReleaseTimebase(req.fRefNum);
CheckWriteRefNum("JackRequest::ReleaseTimebase", socket);
break; break;
} }


@@ -231,10 +220,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::SetTimebaseCallback"); jack_log("JackRequest::SetTimebaseCallback");
JackSetTimebaseCallbackRequest req; JackSetTimebaseCallbackRequest req;
JackResult res; JackResult res;
if (req.Read(socket) == 0)
res.fResult = fServer->SetTimebaseCallback(req.fRefNum, req.fConditionnal);
if (res.Write(socket) < 0)
jack_error("JackRequest::SetTimebaseCallback write error ref = %d", req.fRefNum);
CheckRead(req, socket);
res.fResult = fServer->SetTimebaseCallback(req.fRefNum, req.fConditionnal);
CheckWriteRefNum("JackRequest::SetTimebaseCallback", socket);
break; break;
} }


@@ -242,10 +230,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::GetInternalClientName"); jack_log("JackRequest::GetInternalClientName");
JackGetInternalClientNameRequest req; JackGetInternalClientNameRequest req;
JackGetInternalClientNameResult res; JackGetInternalClientNameResult res;
if (req.Read(socket) == 0)
res.fResult = fServer->GetEngine()->GetInternalClientName(req.fIntRefNum, res.fName);
if (res.Write(socket) < 0)
jack_error("JackRequest::GetInternalClientName write error ref = %d", req.fRefNum);
CheckRead(req, socket);
res.fResult = fServer->GetEngine()->GetInternalClientName(req.fIntRefNum, res.fName);
CheckWriteRefNum("JackRequest::GetInternalClientName", socket);
break; break;
} }


@@ -253,10 +240,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::InternalClientHandle"); jack_log("JackRequest::InternalClientHandle");
JackInternalClientHandleRequest req; JackInternalClientHandleRequest req;
JackInternalClientHandleResult res; JackInternalClientHandleResult res;
if (req.Read(socket) == 0)
res.fResult = fServer->GetEngine()->InternalClientHandle(req.fName, &res.fStatus, &res.fIntRefNum);
if (res.Write(socket) < 0)
jack_error("JackRequest::InternalClientHandle write error ref = %d", req.fRefNum);
CheckRead(req, socket);
res.fResult = fServer->GetEngine()->InternalClientHandle(req.fName, &res.fStatus, &res.fIntRefNum);
CheckWriteRefNum("JackRequest::InternalClientHandle", socket);
break; break;
} }


@@ -264,10 +250,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::InternalClientLoad"); jack_log("JackRequest::InternalClientLoad");
JackInternalClientLoadRequest req; JackInternalClientLoadRequest req;
JackInternalClientLoadResult res; JackInternalClientLoadResult res;
if (req.Read(socket) == 0)
res.fResult = fServer->InternalClientLoad1(req.fName, req.fDllName, req.fLoadInitName, req.fOptions, &res.fIntRefNum, req.fUUID, &res.fStatus);
if (res.Write(socket) < 0)
jack_error("JackRequest::InternalClientLoad write error name = %s", req.fName);
CheckRead(req, socket);
res.fResult = fServer->InternalClientLoad1(req.fName, req.fDllName, req.fLoadInitName, req.fOptions, &res.fIntRefNum, req.fUUID, &res.fStatus);
CheckWriteName("JackRequest::InternalClientLoad", socket);
break; break;
} }


@@ -275,23 +260,21 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::InternalClientUnload"); jack_log("JackRequest::InternalClientUnload");
JackInternalClientUnloadRequest req; JackInternalClientUnloadRequest req;
JackInternalClientUnloadResult res; JackInternalClientUnloadResult res;
if (req.Read(socket) == 0)
res.fResult = fServer->GetEngine()->InternalClientUnload(req.fIntRefNum, &res.fStatus);
if (res.Write(socket) < 0)
jack_error("JackRequest::InternalClientUnload write error ref = %d", req.fRefNum);
CheckRead(req, socket);
res.fResult = fServer->GetEngine()->InternalClientUnload(req.fIntRefNum, &res.fStatus);
CheckWriteRefNum("JackRequest::InternalClientUnload", socket);
break; break;
} }


case JackRequest::kNotification: { case JackRequest::kNotification: {
jack_log("JackRequest::Notification"); jack_log("JackRequest::Notification");
JackClientNotificationRequest req; JackClientNotificationRequest req;
if (req.Read(socket) == 0) {
if (req.fNotify == kQUIT) {
jack_log("JackRequest::Notification kQUIT");
throw JackQuitException();
} else {
fServer->Notify(req.fRefNum, req.fNotify, req.fValue);
}
CheckRead(req, socket);
if (req.fNotify == kQUIT) {
jack_log("JackRequest::Notification kQUIT");
throw JackQuitException();
} else {
fServer->Notify(req.fRefNum, req.fNotify, req.fValue);
} }
break; break;
} }
@@ -299,9 +282,8 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
case JackRequest::kSessionNotify: { case JackRequest::kSessionNotify: {
jack_log("JackRequest::SessionNotify"); jack_log("JackRequest::SessionNotify");
JackSessionNotifyRequest req; JackSessionNotifyRequest req;
if (req.Read(socket) == 0) {
fServer->GetEngine()->SessionNotify(req.fRefNum, req.fDst, req.fEventType, req.fPath, socket, NULL);
}
CheckRead(req, socket);
fServer->GetEngine()->SessionNotify(req.fRefNum, req.fDst, req.fEventType, req.fPath, socket, NULL);
break; break;
} }


@@ -309,12 +291,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::SessionReply"); jack_log("JackRequest::SessionReply");
JackSessionReplyRequest req; JackSessionReplyRequest req;
JackResult res; JackResult res;
if (req.Read(socket) == 0) {
fServer->GetEngine()->SessionReply(req.fRefNum);
res.fResult = 0;
}
if (res.Write(socket) < 0)
jack_error("JackRequest::SessionReply write error");
CheckRead(req, socket);
res.fResult = fServer->GetEngine()->SessionReply(req.fRefNum);
CheckWrite("JackRequest::SessionReply", socket);
break; break;
} }


@@ -322,11 +301,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::GetClientByUUID"); jack_log("JackRequest::GetClientByUUID");
JackGetClientNameRequest req; JackGetClientNameRequest req;
JackClientNameResult res; JackClientNameResult res;
if (req.Read(socket) == 0) {
fServer->GetEngine()->GetClientNameForUUID(req.fUUID, res.fName, &res.fResult);
}
if (res.Write(socket) < 0)
jack_error("JackRequest::GetClientByUUID write error");
CheckRead(req, socket);
res.fResult = fServer->GetEngine()->GetClientNameForUUID(req.fUUID, res.fName);
CheckWrite("JackRequest::GetClientByUUID", socket);
break; break;
} }


@@ -334,11 +311,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::GetUUIDByClient"); jack_log("JackRequest::GetUUIDByClient");
JackGetUUIDRequest req; JackGetUUIDRequest req;
JackUUIDResult res; JackUUIDResult res;
if (req.Read(socket) == 0) {
fServer->GetEngine()->GetUUIDForClientName(req.fName, res.fUUID, &res.fResult);
}
if (res.Write(socket) < 0)
jack_error("JackRequest::GetUUIDByClient write error");
CheckRead(req, socket);
res.fResult = fServer->GetEngine()->GetUUIDForClientName(req.fName, res.fUUID);
CheckWrite("JackRequest::GetUUIDByClient", socket);
break; break;
} }


@@ -346,11 +321,9 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::ReserveClientName"); jack_log("JackRequest::ReserveClientName");
JackReserveNameRequest req; JackReserveNameRequest req;
JackResult res; JackResult res;
if (req.Read(socket) == 0) {
fServer->GetEngine()->ReserveClientName(req.fName, req.fUUID, &res.fResult);
}
if (res.Write(socket) < 0)
jack_error("JackRequest::ReserveClientName write error");
CheckRead(req, socket);
res.fResult = fServer->GetEngine()->ReserveClientName(req.fName, req.fUUID);
CheckWrite("JackRequest::ReserveClientName", socket);
break; break;
} }


@@ -358,18 +331,18 @@ void JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface*
jack_log("JackRequest::ClientHasSessionCallback"); jack_log("JackRequest::ClientHasSessionCallback");
JackClientHasSessionCallbackRequest req; JackClientHasSessionCallbackRequest req;
JackResult res; JackResult res;
if (req.Read(socket) == 0) {
fServer->GetEngine()->ClientHasSessionCallback(req.fName, &res.fResult);
}
if (res.Write(socket) < 0)
jack_error("JackRequest::ClientHasSessionCallback write error");
CheckRead(req, socket);
res.fResult = fServer->GetEngine()->ClientHasSessionCallback(req.fName);
CheckWrite("JackRequest::ClientHasSessionCallback", socket);
break; break;
} }


default: default:
jack_error("Unknown request %ld", type); jack_error("Unknown request %ld", type);
break;
return -1;
} }
return 0;
} }


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


+ 1
- 1
common/JackRequestDecoder.h View File

@@ -52,7 +52,7 @@ class JackRequestDecoder
JackRequestDecoder(JackServer* server, JackClientHandlerInterface* handler); JackRequestDecoder(JackServer* server, JackClientHandlerInterface* handler);
virtual ~JackRequestDecoder(); virtual ~JackRequestDecoder();


void HandleRequest(detail::JackChannelTransactionInterface* socket, int type);
int HandleRequest(detail::JackChannelTransactionInterface* socket, int type);
}; };


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


+ 59
- 59
macosx/coreaudio/JackCoreAudioDriver.cpp View File

@@ -287,7 +287,7 @@ OSStatus JackCoreAudioDriver::Render(void* inRefCon,
// Setup threaded based log function et get RT thread parameters once... // Setup threaded based log function et get RT thread parameters once...
if (set_threaded_log_function()) { if (set_threaded_log_function()) {


jack_log("set_threaded_log_function");
jack_log("JackCoreAudioDriver::Render : set_threaded_log_function");
JackMachThread::GetParams(pthread_self(), &driver->fEngineControl->fPeriod, &driver->fEngineControl->fComputation, &driver->fEngineControl->fConstraint); JackMachThread::GetParams(pthread_self(), &driver->fEngineControl->fPeriod, &driver->fEngineControl->fComputation, &driver->fEngineControl->fConstraint);


if (driver->fComputationGrain > 0) { if (driver->fComputationGrain > 0) {
@@ -302,8 +302,8 @@ OSStatus JackCoreAudioDriver::Render(void* inRefCon,
driver->CycleTakeBeginTime(); driver->CycleTakeBeginTime();


if (driver->Process() < 0) { if (driver->Process() < 0) {
jack_error("Process error, stopping driver.");
driver->NotifyFailure(JackBackendError, "Process error, stopping driver."); // Message length limited to JACK_MESSAGE_SIZE
jack_error("Process error, stopping driver");
driver->NotifyFailure(JackBackendError, "Process error, stopping driver"); // Message length limited to JACK_MESSAGE_SIZE
driver->Stop(); driver->Stop();
kill(JackTools::GetPID(), SIGINT); kill(JackTools::GetPID(), SIGINT);
return kAudioHardwareUnsupportedOperationError; return kAudioHardwareUnsupportedOperationError;
@@ -359,7 +359,7 @@ OSStatus JackCoreAudioDriver::SRNotificationCallback(AudioDeviceID inDevice,
jack_error("Cannot get current sample rate"); jack_error("Cannot get current sample rate");
printError(err); printError(err);
} else { } else {
jack_log("SRNotificationCallback : checked sample rate = %f", tmp_sample_rate);
jack_log("JackCoreAudioDriver::SRNotificationCallback : checked sample rate = %f", tmp_sample_rate);
} }
driver->fState = true; driver->fState = true;
break; break;
@@ -389,7 +389,7 @@ OSStatus JackCoreAudioDriver::BSNotificationCallback(AudioDeviceID inDevice,
jack_error("Cannot get current buffer size"); jack_error("Cannot get current buffer size");
printError(err); printError(err);
} else { } else {
jack_log("BSNotificationCallback : checked buffer size = %d", tmp_buffer_size);
jack_log("JackCoreAudioDriver::BSNotificationCallback : checked buffer size = %d", tmp_buffer_size);
} }
driver->fState = true; driver->fState = true;
break; break;
@@ -469,7 +469,7 @@ OSStatus JackCoreAudioDriver::DeviceNotificationCallback(AudioDeviceID inDevice,


case kAudioDevicePropertyStreamConfiguration: { case kAudioDevicePropertyStreamConfiguration: {
jack_error("Cannot handle kAudioDevicePropertyStreamConfiguration : server will quit..."); jack_error("Cannot handle kAudioDevicePropertyStreamConfiguration : server will quit...");
driver->NotifyFailure(JackBackendError, "Another application has changed the device configuration."); // Message length limited to JACK_MESSAGE_SIZE
driver->NotifyFailure(JackBackendError, "Another application has changed the device configuration"); // Message length limited to JACK_MESSAGE_SIZE
driver->CloseAUHAL(); driver->CloseAUHAL();
kill(JackTools::GetPID(), SIGINT); kill(JackTools::GetPID(), SIGINT);
return kAudioHardwareUnsupportedOperationError; return kAudioHardwareUnsupportedOperationError;
@@ -492,7 +492,7 @@ OSStatus JackCoreAudioDriver::DeviceNotificationCallback(AudioDeviceID inDevice,
// Digidesign hardware, so "special" code : change the SR again here // Digidesign hardware, so "special" code : change the SR again here
if (strncmp(device_name, digidesign_name, 10) == 0) { if (strncmp(device_name, digidesign_name, 10) == 0) {


jack_log("Digidesign HW = %s", device_name);
jack_log("JackCoreAudioDriver::DeviceNotificationCallback Digidesign HW = %s", device_name);


// Set sample rate again... // Set sample rate again...
sample_rate = driver->fEngineControl->fSampleRate; sample_rate = driver->fEngineControl->fSampleRate;
@@ -501,7 +501,7 @@ OSStatus JackCoreAudioDriver::DeviceNotificationCallback(AudioDeviceID inDevice,
jack_error("Cannot set sample rate = %f", sample_rate); jack_error("Cannot set sample rate = %f", sample_rate);
printError(err); printError(err);
} else { } else {
jack_log("Set sample rate = %f", sample_rate);
jack_log("JackCoreAudioDriver::DeviceNotificationCallback : set sample rate = %f", sample_rate);
} }


// Check new sample rate again... // Check new sample rate again...
@@ -511,12 +511,12 @@ OSStatus JackCoreAudioDriver::DeviceNotificationCallback(AudioDeviceID inDevice,
jack_error("Cannot get current sample rate"); jack_error("Cannot get current sample rate");
printError(err); printError(err);
} else { } else {
jack_log("Checked sample rate = %f", sample_rate);
jack_log("JackCoreAudioDriver::DeviceNotificationCallback : checked sample rate = %f", sample_rate);
} }
return noErr; return noErr;


} else { } else {
driver->NotifyFailure(JackBackendError, "Another application has changed the sample rate."); // Message length limited to JACK_MESSAGE_SIZE
driver->NotifyFailure(JackBackendError, "Another application has changed the sample rate"); // Message length limited to JACK_MESSAGE_SIZE
driver->CloseAUHAL(); driver->CloseAUHAL();
kill(JackTools::GetPID(), SIGINT); kill(JackTools::GetPID(), SIGINT);
return kAudioHardwareUnsupportedOperationError; return kAudioHardwareUnsupportedOperationError;
@@ -539,7 +539,7 @@ OSStatus JackCoreAudioDriver::GetDeviceIDFromUID(const char* UID, AudioDeviceID*
} else { } else {
OSStatus res = AudioHardwareGetProperty(kAudioHardwarePropertyDeviceForUID, &size, &value); OSStatus res = AudioHardwareGetProperty(kAudioHardwarePropertyDeviceForUID, &size, &value);
CFRelease(inIUD); CFRelease(inIUD);
jack_log("GetDeviceIDFromUID %s %ld", UID, *id);
jack_log("JackCoreAudioDriver::GetDeviceIDFromUID %s %ld", UID, *id);
return (*id == kAudioDeviceUnknown) ? kAudioHardwareBadDeviceError : res; return (*id == kAudioDeviceUnknown) ? kAudioHardwareBadDeviceError : res;
} }
} }
@@ -559,7 +559,7 @@ OSStatus JackCoreAudioDriver::GetDefaultDevice(AudioDeviceID* id)
return res; return res;
} }


jack_log("GetDefaultDevice: input = %ld output = %ld", inDefault, outDefault);
jack_log("JackCoreAudioDriver::GetDefaultDevice : input = %ld output = %ld", inDefault, outDefault);


// Get the device only if default input and output are the same // Get the device only if default input and output are the same
if (inDefault != outDefault) { if (inDefault != outDefault) {
@@ -588,7 +588,7 @@ OSStatus JackCoreAudioDriver::GetDefaultInputDevice(AudioDeviceID* id)
jack_error("Error: default input device is 0, please select a correct one !!"); jack_error("Error: default input device is 0, please select a correct one !!");
return -1; return -1;
} }
jack_log("GetDefaultInputDevice: input = %ld ", inDefault);
jack_log("JackCoreAudioDriver::GetDefaultInputDevice : input = %ld ", inDefault);
*id = inDefault; *id = inDefault;
return noErr; return noErr;
} }
@@ -607,7 +607,7 @@ OSStatus JackCoreAudioDriver::GetDefaultOutputDevice(AudioDeviceID* id)
jack_error("Error: default output device is 0, please select a correct one !!"); jack_error("Error: default output device is 0, please select a correct one !!");
return -1; return -1;
} }
jack_log("GetDefaultOutputDevice: output = %ld", outDefault);
jack_log("JackCoreAudioDriver::GetDefaultOutputDevice : output = %ld", outDefault);
*id = outDefault; *id = outDefault;
return noErr; return noErr;
} }
@@ -741,11 +741,11 @@ OSStatus JackCoreAudioDriver::CreateAggregateDevice(AudioDeviceID captureDeviceI
vector<AudioDeviceID> captureDeviceIDArray; vector<AudioDeviceID> captureDeviceIDArray;


if (err != noErr) { if (err != noErr) {
jack_log("Input device does not have subdevices");
jack_log("JackCoreAudioDriver::CreateAggregateDevice : input device does not have subdevices");
captureDeviceIDArray.push_back(captureDeviceID); captureDeviceIDArray.push_back(captureDeviceID);
} else { } else {
int num_devices = outSize / sizeof(AudioObjectID); int num_devices = outSize / sizeof(AudioObjectID);
jack_log("Input device has %d subdevices", num_devices);
jack_log("JackCoreAudioDriver::CreateAggregateDevice :Input device has %d subdevices", num_devices);
for (int i = 0; i < num_devices; i++) { for (int i = 0; i < num_devices; i++) {
captureDeviceIDArray.push_back(sub_device[i]); captureDeviceIDArray.push_back(sub_device[i]);
} }
@@ -755,11 +755,11 @@ OSStatus JackCoreAudioDriver::CreateAggregateDevice(AudioDeviceID captureDeviceI
vector<AudioDeviceID> playbackDeviceIDArray; vector<AudioDeviceID> playbackDeviceIDArray;


if (err != noErr) { if (err != noErr) {
jack_log("Output device does not have subdevices");
jack_log("JackCoreAudioDriver::CreateAggregateDevice : output device does not have subdevices");
playbackDeviceIDArray.push_back(playbackDeviceID); playbackDeviceIDArray.push_back(playbackDeviceID);
} else { } else {
int num_devices = outSize / sizeof(AudioObjectID); int num_devices = outSize / sizeof(AudioObjectID);
jack_log("Output device has %d subdevices", num_devices);
jack_log("JackCoreAudioDriver::CreateAggregateDevice : output device has %d subdevices", num_devices);
for (int i = 0; i < num_devices; i++) { for (int i = 0; i < num_devices; i++) {
playbackDeviceIDArray.push_back(sub_device[i]); playbackDeviceIDArray.push_back(sub_device[i]);
} }
@@ -1107,7 +1107,7 @@ OSStatus JackCoreAudioDriver::CreateAggregateDeviceAux(vector<AudioDeviceID> cap
CFRelease(playbackDeviceUID[i]); CFRelease(playbackDeviceUID[i]);
} }


jack_log("New aggregate device %ld", *outAggregateDevice);
jack_log("JackCoreAudioDriver::CreateAggregateDeviceAux : new aggregate device %ld", *outAggregateDevice);
return noErr; return noErr;


error: error:
@@ -1126,13 +1126,13 @@ int JackCoreAudioDriver::SetupDevices(const char* capture_driver_uid,


// Duplex // Duplex
if (strcmp(capture_driver_uid, "") != 0 && strcmp(playback_driver_uid, "") != 0) { if (strcmp(capture_driver_uid, "") != 0 && strcmp(playback_driver_uid, "") != 0) {
jack_log("JackCoreAudioDriver::Open duplex");
jack_log("JackCoreAudioDriver::SetupDevices : duplex");


// Same device for capture and playback... // Same device for capture and playback...
if (strcmp(capture_driver_uid, playback_driver_uid) == 0) { if (strcmp(capture_driver_uid, playback_driver_uid) == 0) {


if (GetDeviceIDFromUID(playback_driver_uid, &fDeviceID) != noErr) { if (GetDeviceIDFromUID(playback_driver_uid, &fDeviceID) != noErr) {
jack_log("Will take default in/out");
jack_log("JackCoreAudioDriver::SetupDevices : will take default in/out");
if (GetDefaultDevice(&fDeviceID) != noErr) { if (GetDefaultDevice(&fDeviceID) != noErr) {
jack_error("Cannot open default device"); jack_error("Cannot open default device");
return -1; return -1;
@@ -1149,7 +1149,7 @@ int JackCoreAudioDriver::SetupDevices(const char* capture_driver_uid,
AudioDeviceID captureID, playbackID; AudioDeviceID captureID, playbackID;


if (GetDeviceIDFromUID(capture_driver_uid, &captureID) != noErr) { if (GetDeviceIDFromUID(capture_driver_uid, &captureID) != noErr) {
jack_log("Will take default input");
jack_log("JackCoreAudioDriver::SetupDevices : will take default input");
if (GetDefaultInputDevice(&captureID) != noErr) { if (GetDefaultInputDevice(&captureID) != noErr) {
jack_error("Cannot open default input device"); jack_error("Cannot open default input device");
return -1; return -1;
@@ -1157,7 +1157,7 @@ int JackCoreAudioDriver::SetupDevices(const char* capture_driver_uid,
} }


if (GetDeviceIDFromUID(playback_driver_uid, &playbackID) != noErr) { if (GetDeviceIDFromUID(playback_driver_uid, &playbackID) != noErr) {
jack_log("Will take default output");
jack_log("JackCoreAudioDriver::SetupDevices : will take default output");
if (GetDefaultOutputDevice(&playbackID) != noErr) { if (GetDefaultOutputDevice(&playbackID) != noErr) {
jack_error("Cannot open default output device"); jack_error("Cannot open default output device");
return -1; return -1;
@@ -1174,9 +1174,9 @@ int JackCoreAudioDriver::SetupDevices(const char* capture_driver_uid,


// Capture only // Capture only
} else if (strcmp(capture_driver_uid, "") != 0) { } else if (strcmp(capture_driver_uid, "") != 0) {
jack_log("JackCoreAudioDriver::Open capture only");
jack_log("JackCoreAudioDriver::SetupDevices : capture only");
if (GetDeviceIDFromUID(capture_driver_uid, &fDeviceID) != noErr) { if (GetDeviceIDFromUID(capture_driver_uid, &fDeviceID) != noErr) {
jack_log("Will take default input");
jack_log("JackCoreAudioDriver::SetupDevices : will take default input");
if (GetDefaultInputDevice(&fDeviceID) != noErr) { if (GetDefaultInputDevice(&fDeviceID) != noErr) {
jack_error("Cannot open default input device"); jack_error("Cannot open default input device");
return -1; return -1;
@@ -1189,9 +1189,9 @@ int JackCoreAudioDriver::SetupDevices(const char* capture_driver_uid,


// Playback only // Playback only
} else if (strcmp(playback_driver_uid, "") != 0) { } else if (strcmp(playback_driver_uid, "") != 0) {
jack_log("JackCoreAudioDriver::Open playback only");
jack_log("JackCoreAudioDriver::SetupDevices : playback only");
if (GetDeviceIDFromUID(playback_driver_uid, &fDeviceID) != noErr) { if (GetDeviceIDFromUID(playback_driver_uid, &fDeviceID) != noErr) {
jack_log("Will take default output");
jack_log("JackCoreAudioDriver::SetupDevices : will take default output");
if (GetDefaultOutputDevice(&fDeviceID) != noErr) { if (GetDefaultOutputDevice(&fDeviceID) != noErr) {
jack_error("Cannot open default output device"); jack_error("Cannot open default output device");
return -1; return -1;
@@ -1204,7 +1204,7 @@ int JackCoreAudioDriver::SetupDevices(const char* capture_driver_uid,


// Use default driver in duplex mode // Use default driver in duplex mode
} else { } else {
jack_log("JackCoreAudioDriver::Open default driver");
jack_log("JackCoreAudioDriver::SetupDevices : default driver");
if (GetDefaultDevice(&fDeviceID) != noErr) { if (GetDefaultDevice(&fDeviceID) != noErr) {
jack_error("Cannot open default device in duplex mode, so aggregate default input and default output"); jack_error("Cannot open default device in duplex mode, so aggregate default input and default output");


@@ -1212,7 +1212,7 @@ int JackCoreAudioDriver::SetupDevices(const char* capture_driver_uid,
AudioDeviceID captureID, playbackID; AudioDeviceID captureID, playbackID;


if (GetDeviceIDFromUID(capture_driver_uid, &captureID) != noErr) { if (GetDeviceIDFromUID(capture_driver_uid, &captureID) != noErr) {
jack_log("Will take default input");
jack_log("JackCoreAudioDriver::SetupDevices : will take default input");
if (GetDefaultInputDevice(&captureID) != noErr) { if (GetDefaultInputDevice(&captureID) != noErr) {
jack_error("Cannot open default input device"); jack_error("Cannot open default input device");
return -1; return -1;
@@ -1220,7 +1220,7 @@ int JackCoreAudioDriver::SetupDevices(const char* capture_driver_uid,
} }


if (GetDeviceIDFromUID(playback_driver_uid, &playbackID) != noErr) { if (GetDeviceIDFromUID(playback_driver_uid, &playbackID) != noErr) {
jack_log("Will take default output");
jack_log("JackCoreAudioDriver::SetupDevices : will take default output");
if (GetDefaultOutputDevice(&playbackID) != noErr) { if (GetDefaultOutputDevice(&playbackID) != noErr) {
jack_error("Cannot open default output device"); jack_error("Cannot open default output device");
return -1; return -1;
@@ -1255,11 +1255,11 @@ int JackCoreAudioDriver::SetupChannels(bool capturing, bool playing, int& inchan
if (capturing) { if (capturing) {
err = GetTotalChannels(fDeviceID, in_nChannels, true); err = GetTotalChannels(fDeviceID, in_nChannels, true);
if (err != noErr) { if (err != noErr) {
jack_error("Cannot get input channel number");
jack_error("JackCoreAudioDriver::SetupChannels : cannot get input channel number");
printError(err); printError(err);
return -1; return -1;
} else { } else {
jack_log("Max input channels : %d", in_nChannels);
jack_log("JackCoreAudioDriver::SetupChannels : max input channels : %d", in_nChannels);
} }
} }


@@ -1270,7 +1270,7 @@ int JackCoreAudioDriver::SetupChannels(bool capturing, bool playing, int& inchan
printError(err); printError(err);
return -1; return -1;
} else { } else {
jack_log("Max output channels : %d", out_nChannels);
jack_log("JackCoreAudioDriver::SetupChannels : max output channels : %d", out_nChannels);
} }
} }


@@ -1289,12 +1289,12 @@ int JackCoreAudioDriver::SetupChannels(bool capturing, bool playing, int& inchan
} }


if (inchannels == -1) { if (inchannels == -1) {
jack_log("Setup max in channels = %d", in_nChannels);
jack_log("JackCoreAudioDriver::SetupChannels : setup max in channels = %d", in_nChannels);
inchannels = in_nChannels; inchannels = in_nChannels;
} }


if (outchannels == -1) { if (outchannels == -1) {
jack_log("Setup max out channels = %d", out_nChannels);
jack_log("JackCoreAudioDriver::SetupChannels : setup max out channels = %d", out_nChannels);
outchannels = out_nChannels; outchannels = out_nChannels;
} }


@@ -1314,7 +1314,7 @@ int JackCoreAudioDriver::SetupBufferSize(jack_nframes_t buffer_size)
printError(err); printError(err);
return -1; return -1;
} else { } else {
jack_log("Current buffer size = %ld", tmp_buffer_size);
jack_log("JackCoreAudioDriver::SetupBufferSize : current buffer size = %ld", tmp_buffer_size);
} }


// If needed, set new buffer size // If needed, set new buffer size
@@ -1335,14 +1335,14 @@ int JackCoreAudioDriver::SetupBufferSize(jack_nframes_t buffer_size)


err = AudioDeviceSetProperty(fDeviceID, NULL, 0, kAudioDeviceSectionGlobal, kAudioDevicePropertyBufferFrameSize, outSize, &tmp_buffer_size); err = AudioDeviceSetProperty(fDeviceID, NULL, 0, kAudioDeviceSectionGlobal, kAudioDevicePropertyBufferFrameSize, outSize, &tmp_buffer_size);
if (err != noErr) { if (err != noErr) {
jack_error("Cannot set buffer size = %ld", tmp_buffer_size);
jack_error("JackCoreAudioDriver::SetupBufferSize : cannot set buffer size = %ld", tmp_buffer_size);
printError(err); printError(err);
goto error; goto error;
} }


while (!fState && count++ < WAIT_NOTIFICATION_COUNTER) { while (!fState && count++ < WAIT_NOTIFICATION_COUNTER) {
usleep(100000); usleep(100000);
jack_log("Wait count = %d", count);
jack_log("JackCoreAudioDriver::SetupBufferSize : wait count = %d", count);
} }


if (count >= WAIT_NOTIFICATION_COUNTER) { if (count >= WAIT_NOTIFICATION_COUNTER) {
@@ -1357,7 +1357,7 @@ int JackCoreAudioDriver::SetupBufferSize(jack_nframes_t buffer_size)
jack_error("Cannot get current buffer size"); jack_error("Cannot get current buffer size");
printError(err); printError(err);
} else { } else {
jack_log("Checked buffer size = %ld", tmp_buffer_size);
jack_log("JackCoreAudioDriver::SetupBufferSize : checked buffer size = %ld", tmp_buffer_size);
} }


// Remove BS change notification // Remove BS change notification
@@ -1393,7 +1393,7 @@ int JackCoreAudioDriver::SetupSampleRateAux(AudioDeviceID inDevice, jack_nframes
printError(err); printError(err);
return -1; return -1;
} else { } else {
jack_log("Current sample rate = %f", tmp_sample_rate);
jack_log("JackCoreAudioDriver::SetupSampleRateAux : current sample rate = %f", tmp_sample_rate);
} }


// If needed, set new sample rate // If needed, set new sample rate
@@ -1421,7 +1421,7 @@ int JackCoreAudioDriver::SetupSampleRateAux(AudioDeviceID inDevice, jack_nframes


while (!fState && count++ < WAIT_NOTIFICATION_COUNTER) { while (!fState && count++ < WAIT_NOTIFICATION_COUNTER) {
usleep(100000); usleep(100000);
jack_log("Wait count = %d", count);
jack_log("JackCoreAudioDriver::SetupSampleRateAux : wait count = %d", count);
} }


if (count >= WAIT_NOTIFICATION_COUNTER) { if (count >= WAIT_NOTIFICATION_COUNTER) {
@@ -1436,7 +1436,7 @@ int JackCoreAudioDriver::SetupSampleRateAux(AudioDeviceID inDevice, jack_nframes
jack_error("Cannot get current sample rate"); jack_error("Cannot get current sample rate");
printError(err); printError(err);
} else { } else {
jack_log("Checked sample rate = %f", tmp_sample_rate);
jack_log("JackCoreAudioDriver::SetupSampleRateAux : checked sample rate = %f", tmp_sample_rate);
} }


// Remove SR change notification // Remove SR change notification
@@ -1469,7 +1469,7 @@ int JackCoreAudioDriver::OpenAUHAL(bool capturing,
AudioDeviceID currAudioDeviceID; AudioDeviceID currAudioDeviceID;
UInt32 size; UInt32 size;


jack_log("OpenAUHAL capturing = %d playing = %d inchannels = %d outchannels = %d in_nChannels = %d out_nChannels = %d chan_in_list = %d chan_out_list = %d",
jack_log("JackCoreAudioDriver::OpenAUHAL : capturing = %d playing = %d inchannels = %d outchannels = %d in_nChannels = %d out_nChannels = %d chan_in_list = %d chan_out_list = %d",
capturing, playing, inchannels, outchannels, in_nChannels, out_nChannels, chan_in_list.size(), chan_out_list.size()); capturing, playing, inchannels, outchannels, in_nChannels, out_nChannels, chan_in_list.size(), chan_out_list.size());


if (inchannels == 0 && outchannels == 0) { if (inchannels == 0 && outchannels == 0) {
@@ -1498,10 +1498,10 @@ int JackCoreAudioDriver::OpenAUHAL(bool capturing,
// Start I/O // Start I/O
if (capturing && inchannels > 0) { if (capturing && inchannels > 0) {
enableIO = 1; enableIO = 1;
jack_log("Setup AUHAL input on");
jack_log("JackCoreAudioDriver::OpenAUHAL : setup AUHAL input on");
} else { } else {
enableIO = 0; enableIO = 0;
jack_log("Setup AUHAL input off");
jack_log("JackCoreAudioDriver::OpenAUHAL : setup AUHAL input off");
} }


err1 = AudioUnitSetProperty(fAUHAL, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &enableIO, sizeof(enableIO)); err1 = AudioUnitSetProperty(fAUHAL, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &enableIO, sizeof(enableIO));
@@ -1513,10 +1513,10 @@ int JackCoreAudioDriver::OpenAUHAL(bool capturing,


if (playing && outchannels > 0) { if (playing && outchannels > 0) {
enableIO = 1; enableIO = 1;
jack_log("Setup AUHAL output on");
jack_log("JackCoreAudioDriver::OpenAUHAL : setup AUHAL output on");
} else { } else {
enableIO = 0; enableIO = 0;
jack_log("Setup AUHAL output off");
jack_log("JackCoreAudioDriver::OpenAUHAL : setup AUHAL output off");
} }


err1 = AudioUnitSetProperty(fAUHAL, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 0, &enableIO, sizeof(enableIO)); err1 = AudioUnitSetProperty(fAUHAL, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 0, &enableIO, sizeof(enableIO));
@@ -1533,7 +1533,7 @@ int JackCoreAudioDriver::OpenAUHAL(bool capturing,
printError(err1); printError(err1);
goto error; goto error;
} else { } else {
jack_log("AudioUnitGetPropertyCurrentDevice = %d", currAudioDeviceID);
jack_log("JackCoreAudioDriver::OpenAUHAL : AudioUnitGetPropertyCurrentDevice = %d", currAudioDeviceID);
} }


// Setup up choosen device, in both input and output cases // Setup up choosen device, in both input and output cases
@@ -1643,7 +1643,7 @@ int JackCoreAudioDriver::OpenAUHAL(bool capturing,
} }
PrintStreamDesc(&srcFormat); PrintStreamDesc(&srcFormat);


jack_log("Setup AUHAL input stream converter SR = %ld", sample_rate);
jack_log("JackCoreAudioDriver::OpenAUHAL : setup AUHAL input stream converter SR = %ld", sample_rate);
srcFormat.mSampleRate = sample_rate; srcFormat.mSampleRate = sample_rate;
srcFormat.mFormatID = kAudioFormatLinearPCM; srcFormat.mFormatID = kAudioFormatLinearPCM;
srcFormat.mFormatFlags = kAudioFormatFlagsNativeFloatPacked | kLinearPCMFormatFlagIsNonInterleaved; srcFormat.mFormatFlags = kAudioFormatFlagsNativeFloatPacked | kLinearPCMFormatFlagIsNonInterleaved;
@@ -1673,7 +1673,7 @@ int JackCoreAudioDriver::OpenAUHAL(bool capturing,
} }
PrintStreamDesc(&dstFormat); PrintStreamDesc(&dstFormat);


jack_log("Setup AUHAL output stream converter SR = %ld", sample_rate);
jack_log("JackCoreAudioDriver::OpenAUHAL : setup AUHAL output stream converter SR = %ld", sample_rate);
dstFormat.mSampleRate = sample_rate; dstFormat.mSampleRate = sample_rate;
dstFormat.mFormatID = kAudioFormatLinearPCM; dstFormat.mFormatID = kAudioFormatLinearPCM;
dstFormat.mFormatFlags = kAudioFormatFlagsNativeFloatPacked | kLinearPCMFormatFlagIsNonInterleaved; dstFormat.mFormatFlags = kAudioFormatFlagsNativeFloatPacked | kLinearPCMFormatFlagIsNonInterleaved;
@@ -2043,18 +2043,18 @@ int JackCoreAudioDriver::Attach()
char name[REAL_JACK_PORT_NAME_SIZE]; char name[REAL_JACK_PORT_NAME_SIZE];
char alias[REAL_JACK_PORT_NAME_SIZE]; char alias[REAL_JACK_PORT_NAME_SIZE];


jack_log("JackCoreAudioDriver::Attach fBufferSize %ld fSampleRate %ld", fEngineControl->fBufferSize, fEngineControl->fSampleRate);
jack_log("JackCoreAudioDriver::Attach : fBufferSize %ld fSampleRate %ld", fEngineControl->fBufferSize, fEngineControl->fSampleRate);


for (int i = 0; i < fCaptureChannels; i++) { for (int i = 0; i < fCaptureChannels; i++) {


err = AudioDeviceGetPropertyInfo(fDeviceID, i + 1, true, kAudioDevicePropertyChannelName, &size, &isWritable); err = AudioDeviceGetPropertyInfo(fDeviceID, i + 1, true, kAudioDevicePropertyChannelName, &size, &isWritable);
if (err != noErr) { if (err != noErr) {
jack_log("AudioDeviceGetPropertyInfo kAudioDevicePropertyChannelName error");
jack_log("JackCoreAudioDriver::Attach : AudioDeviceGetPropertyInfo kAudioDevicePropertyChannelName error");
} }
if (err == noErr && size > 0) { if (err == noErr && size > 0) {
err = AudioDeviceGetProperty(fDeviceID, i + 1, true, kAudioDevicePropertyChannelName, &size, channel_name); err = AudioDeviceGetProperty(fDeviceID, i + 1, true, kAudioDevicePropertyChannelName, &size, channel_name);
if (err != noErr) { if (err != noErr) {
jack_log("AudioDeviceGetProperty kAudioDevicePropertyChannelName error");
jack_log("JackCoreAudioDriver::Attach : AudioDeviceGetProperty kAudioDevicePropertyChannelName error");
} }
snprintf(alias, sizeof(alias), "%s:%s:out_%s%u", fAliasName, fCaptureDriverName, channel_name, i + 1); snprintf(alias, sizeof(alias), "%s:%s:out_%s%u", fAliasName, fCaptureDriverName, channel_name, i + 1);
} else { } else {
@@ -2077,12 +2077,12 @@ int JackCoreAudioDriver::Attach()


err = AudioDeviceGetPropertyInfo(fDeviceID, i + 1, false, kAudioDevicePropertyChannelName, &size, &isWritable); err = AudioDeviceGetPropertyInfo(fDeviceID, i + 1, false, kAudioDevicePropertyChannelName, &size, &isWritable);
if (err != noErr) { if (err != noErr) {
jack_log("AudioDeviceGetPropertyInfo kAudioDevicePropertyChannelName error");
jack_log("JackCoreAudioDriver::Attach : AudioDeviceGetPropertyInfo kAudioDevicePropertyChannelName error");
} }
if (err == noErr && size > 0) { if (err == noErr && size > 0) {
err = AudioDeviceGetProperty(fDeviceID, i + 1, false, kAudioDevicePropertyChannelName, &size, channel_name); err = AudioDeviceGetProperty(fDeviceID, i + 1, false, kAudioDevicePropertyChannelName, &size, channel_name);
if (err != noErr) { if (err != noErr) {
jack_log("AudioDeviceGetProperty kAudioDevicePropertyChannelName error");
jack_log("JackCoreAudioDriver::Attach : AudioDeviceGetProperty kAudioDevicePropertyChannelName error");
} }
snprintf(alias, sizeof(alias), "%s:%s:in_%s%u", fAliasName, fPlaybackDriverName, channel_name, i + 1); snprintf(alias, sizeof(alias), "%s:%s:in_%s%u", fAliasName, fPlaybackDriverName, channel_name, i + 1);
} else { } else {
@@ -2102,7 +2102,7 @@ int JackCoreAudioDriver::Attach()


// Monitor ports // Monitor ports
if (fWithMonitorPorts) { if (fWithMonitorPorts) {
jack_log("Create monitor port");
jack_log("JackCoreAudioDriver::Attach : create monitor port");
snprintf(name, sizeof(name), "%s:monitor_%u", fClientControl.fName, i + 1); snprintf(name, sizeof(name), "%s:monitor_%u", fClientControl.fName, i + 1);
if (fEngine->PortRegister(fClientControl.fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, MonitorDriverFlags, fEngineControl->fBufferSize, &port_index) < 0) { if (fEngine->PortRegister(fClientControl.fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, MonitorDriverFlags, fEngineControl->fBufferSize, &port_index) < 0) {
jack_error("Cannot register monitor port for %s", name); jack_error("Cannot register monitor port for %s", name);
@@ -2137,7 +2137,7 @@ int JackCoreAudioDriver::Start()


while (!fState && count++ < WAIT_COUNTER) { while (!fState && count++ < WAIT_COUNTER) {
usleep(100000); usleep(100000);
jack_log("JackCoreAudioDriver::Start wait count = %d", count);
jack_log("JackCoreAudioDriver::Start : wait count = %d", count);
} }


if (count < WAIT_COUNTER) { if (count < WAIT_COUNTER) {
@@ -2215,11 +2215,11 @@ bool JackCoreAudioDriver::TakeHog()
err = AudioDeviceGetProperty(fDeviceID, 0, kAudioDeviceSectionGlobal, kAudioAggregateDevicePropertyActiveSubDeviceList, &outSize, sub_device); err = AudioDeviceGetProperty(fDeviceID, 0, kAudioDeviceSectionGlobal, kAudioAggregateDevicePropertyActiveSubDeviceList, &outSize, sub_device);


if (err != noErr) { if (err != noErr) {
jack_log("Device does not have subdevices");
jack_log("JackCoreAudioDriver::TakeHog : device does not have subdevices");
return TakeHogAux(fDeviceID, true); return TakeHogAux(fDeviceID, true);
} else { } else {
int num_devices = outSize / sizeof(AudioObjectID); int num_devices = outSize / sizeof(AudioObjectID);
jack_log("Device does has %d subdevices", num_devices);
jack_log("JackCoreAudioDriver::TakeHog : device does has %d subdevices", num_devices);
for (int i = 0; i < num_devices; i++) { for (int i = 0; i < num_devices; i++) {
if (!TakeHogAux(sub_device[i], true)) { if (!TakeHogAux(sub_device[i], true)) {
return false; return false;


+ 4
- 4
posix/JackPosixThread.cpp View File

@@ -42,7 +42,7 @@ void* JackPosixThread::ThreadHandler(void* arg)
} }


// Signal creation thread when started with StartSync // Signal creation thread when started with StartSync
jack_log("ThreadHandler: start");
jack_log("JackPosixThread::ThreadHandler : start");
obj->fStatus = kIniting; obj->fStatus = kIniting;


// Call Init method // Call Init method
@@ -59,7 +59,7 @@ void* JackPosixThread::ThreadHandler(void* arg)
res = runnable->Execute(); res = runnable->Execute();
} }


jack_log("ThreadHandler: exit");
jack_log("JackPosixThread::ThreadHandler : exit");
pthread_exit(0); pthread_exit(0);
return 0; // never reached return 0; // never reached
} }
@@ -112,7 +112,7 @@ int JackPosixThread::StartImp(jack_native_thread_t* thread, int priority, int re


if (realtime) { if (realtime) {


jack_log("Create RT thread");
jack_log("JackPosixThread::StartImp : create RT thread");


if ((res = pthread_attr_setinheritsched(&attributes, PTHREAD_EXPLICIT_SCHED))) { if ((res = pthread_attr_setinheritsched(&attributes, PTHREAD_EXPLICIT_SCHED))) {
jack_error("Cannot request explicit scheduling for RT thread res = %d", res); jack_error("Cannot request explicit scheduling for RT thread res = %d", res);
@@ -133,7 +133,7 @@ int JackPosixThread::StartImp(jack_native_thread_t* thread, int priority, int re
} }


} else { } else {
jack_log("Create non RT thread");
jack_log("JackPosixThread::StartImp : create non RT thread");
} }


if ((res = pthread_attr_setstacksize(&attributes, THREAD_STACK))) { if ((res = pthread_attr_setstacksize(&attributes, THREAD_STACK))) {


+ 15
- 13
posix/JackSocketServerChannel.cpp View File

@@ -141,7 +141,7 @@ void JackSocketServerChannel::ClientAdd(detail::JackChannelTransactionInterface*
#ifdef __APPLE__ #ifdef __APPLE__
int on = 1; int on = 1;
if (setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, (const char*)&on, sizeof(on)) < 0) { if (setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, (const char*)&on, sizeof(on)) < 0) {
jack_log("setsockopt SO_NOSIGPIPE fd = %ld err = %s", fd, strerror(errno));
jack_log("JackSocketServerChannel::ClientAdd : setsockopt SO_NOSIGPIPE fd = %ld err = %s", fd, strerror(errno));
} }
#endif #endif
} else { } else {
@@ -202,7 +202,7 @@ void JackSocketServerChannel::BuildPoolTable()
int i; int i;


for (i = 1, it = fSocketTable.begin(); it != fSocketTable.end(); it++, i++) { for (i = 1, it = fSocketTable.begin(); it != fSocketTable.end(); it++, i++) {
jack_log("fSocketTable i = %ld fd = %ld", i, it->first);
jack_log("JackSocketServerChannel::BuildPoolTable fSocketTable i = %ld fd = %ld", i, it->first);
fPollTable[i].fd = it->first; fPollTable[i].fd = it->first;
fPollTable[i].events = POLLIN | POLLPRI | POLLERR | POLLHUP | POLLNVAL; fPollTable[i].events = POLLIN | POLLPRI | POLLERR | POLLHUP | POLLNVAL;
} }
@@ -224,44 +224,46 @@ bool JackSocketServerChannel::Execute()


// Global poll // Global poll
if ((poll(fPollTable, fSocketTable.size() + 1, 10000) < 0) && (errno != EINTR)) { if ((poll(fPollTable, fSocketTable.size() + 1, 10000) < 0) && (errno != EINTR)) {
jack_error("Engine poll failed err = %s request thread quits...", strerror(errno));
jack_error("JackSocketServerChannel::Execute : engine poll failed err = %s request thread quits...", strerror(errno));
return false; return false;
} else { } else {


// Poll all clients // Poll all clients
for (unsigned int i = 1; i < fSocketTable.size() + 1; i++) { for (unsigned int i = 1; i < fSocketTable.size() + 1; i++) {
int fd = fPollTable[i].fd; int fd = fPollTable[i].fd;
jack_log("fPollTable i = %ld fd = %ld", i, fd);
jack_log("JackSocketServerChannel::Execute : fPollTable i = %ld fd = %ld", i, fd);
if (fPollTable[i].revents & ~POLLIN) { if (fPollTable[i].revents & ~POLLIN) {
jack_log("Poll client error err = %s", strerror(errno));
jack_log("JackSocketServerChannel::Execute : poll client error err = %s", strerror(errno));
ClientKill(fd); ClientKill(fd);
} else if (fPollTable[i].revents & POLLIN) { } else if (fPollTable[i].revents & POLLIN) {
// Read header
JackClientSocket* socket = fSocketTable[fd].second; JackClientSocket* socket = fSocketTable[fd].second;
// Decode header
JackRequest header; JackRequest header;
if (header.Read(socket) < 0) { if (header.Read(socket) < 0) {
jack_log("HandleRequest: cannot read header");
jack_log("JackSocketServerChannel::Execute : cannot decode header");
ClientKill(fd); ClientKill(fd);
return false;
} else {
fDecoder->HandleRequest(socket, header.fType);
// Decode request
} else if (fDecoder->HandleRequest(socket, header.fType) < 0) {
jack_log("JackSocketServerChannel::Execute : cannot decode request");
} }
} }
} }


// Check the server request socket */ // Check the server request socket */
if (fPollTable[0].revents & POLLERR)
if (fPollTable[0].revents & POLLERR) {
jack_error("Error on server request socket err = %s", strerror(errno)); jack_error("Error on server request socket err = %s", strerror(errno));
}


if (fPollTable[0].revents & POLLIN)
if (fPollTable[0].revents & POLLIN) {
ClientCreate(); ClientCreate();
}
} }


BuildPoolTable(); BuildPoolTable();
return true; return true;


} catch (JackQuitException& e) { } catch (JackQuitException& e) {
jack_log("JackSocketServerChannel::Execute JackQuitException");
jack_log("JackSocketServerChannel::Execute : JackQuitException");
return false; return false;
} }
} }


+ 10
- 8
windows/JackWinNamedPipeServerChannel.cpp View File

@@ -85,34 +85,36 @@ void JackClientPipeThread::Close() // Close


bool JackClientPipeThread::Execute() bool JackClientPipeThread::Execute()
{ {
try{
try {
jack_log("JackClientPipeThread::Execute"); jack_log("JackClientPipeThread::Execute");

JackRequest header; JackRequest header;
int res = header.Read(fPipe); int res = header.Read(fPipe);
bool ret = true; bool ret = true;


// Lock the global mutex // Lock the global mutex
if (WaitForSingleObject(fMutex, INFINITE) == WAIT_FAILED) { if (WaitForSingleObject(fMutex, INFINITE) == WAIT_FAILED) {
jack_error("JackClientPipeThread::HandleRequest: mutex wait error");
jack_error("JackClientPipeThread::Execute : mutex wait error");
} }


// Decode header
if (res < 0) { if (res < 0) {
jack_log("HandleRequest: cannot read header");
jack_log("JackClientPipeThread::Execute : cannot decode header");
ClientKill(); ClientKill();
ret = false; ret = false;
// Decode request
} else if {fDecoder->HandleRequest(fPipe, header.fType) < 0) {
jack_log("JackClientPipeThread::Execute : cannot decode request");
} }


fDecoder->HandleRequest(fPipe, header.fType);

// Unlock the global mutex // Unlock the global mutex
if (!ReleaseMutex(fMutex)) { if (!ReleaseMutex(fMutex)) {
jack_error("JackClientPipeThread::HandleRequest: mutex release error");
jack_error("JackClientPipeThread::Execute : mutex release error");
} }
return ret; return ret;


} catch (JackQuitException& e) { } catch (JackQuitException& e) {
jack_log("JackClientPipeThread::Execute JackQuitException");
jack_log("JackClientPipeThread::Execute : JackQuitException");
return false; return false;
} }
} }


+ 4
- 4
windows/JackWinThread.cpp View File

@@ -32,7 +32,7 @@ DWORD WINAPI JackWinThread::ThreadHandler(void* arg)
JackRunnableInterface* runnable = obj->fRunnable; JackRunnableInterface* runnable = obj->fRunnable;


// Signal creation thread when started with StartSync // Signal creation thread when started with StartSync
jack_log("ThreadHandler: start");
jack_log("JackWinThread::ThreadHandler : start");
obj->fStatus = kIniting; obj->fStatus = kIniting;


// Call Init method // Call Init method
@@ -50,7 +50,7 @@ DWORD WINAPI JackWinThread::ThreadHandler(void* arg)
} }


SetEvent(obj->fEvent); SetEvent(obj->fEvent);
jack_log("ThreadHandler: exit");
jack_log("JackWinThread::ThreadHandler : exit");
return 0; return 0;
} }


@@ -109,14 +109,14 @@ int JackWinThread::StartImp(jack_native_thread_t* thread, int priority, int real


if (realtime) { if (realtime) {


jack_log("Create RT thread");
jack_log("JackWinThread::StartImp : create RT thread");
if (!SetThreadPriority(*thread, THREAD_PRIORITY_TIME_CRITICAL)) { if (!SetThreadPriority(*thread, THREAD_PRIORITY_TIME_CRITICAL)) {
jack_error("Cannot set priority class = %d", GetLastError()); jack_error("Cannot set priority class = %d", GetLastError());
return -1; return -1;
} }


} else { } else {
jack_log("Create non RT thread");
jack_log("JackWinThread::StartImp : create non RT thread");
} }


return 0; return 0;


Loading…
Cancel
Save