JackRequest.h
/*
Copyright (C) 2001 Paul Davis
Copyright (C) 2004-2008 Grame
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __JackRequest__
#define __JackRequest__
#include "JackConstants.h"
#include "JackError.h"
#include "JackPlatformPlug.h"
#include "JackChannel.h"
#include "JackTime.h"
#include "types.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <list>
namespace Jack
{
#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; } }
enum JackSessionReply {
kImmediateSessionReply = 1,
kPendingSessionReply = 2
};
struct JackRequest
{
enum RequestType {
kRegisterPort = 1,
kUnRegisterPort = 2,
kConnectPorts = 3,
kDisconnectPorts = 4,
kSetTimeBaseClient = 5,
kActivateClient = 6,
kDeactivateClient = 7,
kDisconnectPort = 8,
kSetClientCapabilities = 9,
kGetPortConnections = 10,
kGetPortNConnections = 11,
kReleaseTimebase = 12,
kSetTimebaseCallback = 13,
kSetBufferSize = 20,
kSetFreeWheel = 21,
kClientCheck = 22,
kClientOpen = 23,
kClientClose = 24,
kConnectNamePorts = 25,
kDisconnectNamePorts = 26,
kGetInternalClientName = 27,
kInternalClientHandle = 28,
kInternalClientLoad = 29,
kInternalClientUnload = 30,
kPortRename = 31,
kNotification = 32,
kSessionNotify = 33,
kSessionReply = 34,
kGetClientByUUID = 35,
kReserveClientName = 36,
kGetUUIDByClient = 37,
kClientHasSessionCallback = 38,
kComputeTotalLatencies = 39
};
RequestType fType;
int fSize;
JackRequest(): fType((RequestType)0), fSize(0)
{}
JackRequest(RequestType type): fType(type), fSize(0)
{}
virtual ~JackRequest()
{}
virtual int Read(detail::JackChannelTransactionInterface* trans)
{
return trans->Read(&fType, sizeof(RequestType));
}
virtual int Write(detail::JackChannelTransactionInterface* trans) { return -1; }
virtual int Write(detail::JackChannelTransactionInterface* trans, int size)
{
fSize = size;
CheckRes(trans->Write(&fType, sizeof(RequestType)));
return trans->Write(&fSize, sizeof(int));
}
virtual int Size() { return 0; }
};
struct JackResult
{
int fResult;
JackResult(): fResult( -1)
{}
JackResult(int result): fResult(result)
{}
virtual ~JackResult()
{}
virtual int Read(detail::JackChannelTransactionInterface* trans)
{
return trans->Read(&fResult, sizeof(int));
}
virtual int Write(detail::JackChannelTransactionInterface* trans)
{
return trans->Write(&fResult, sizeof(int));
}
};
struct JackClientCheckRequest : public JackRequest
{
char fName[JACK_CLIENT_NAME_SIZE+1];
int fProtocol;
int fOptions;
int fUUID;
int fOpen;
JackClientCheckRequest()
{}
JackClientCheckRequest(const char* name, int protocol, int options, int uuid, int open = false)
: JackRequest(JackRequest::kClientCheck), fProtocol(protocol), fOptions(options), fUUID(uuid), fOpen(open)
{
snprintf(fName, sizeof(fName), "%s", name);
}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fName, sizeof(fName)));
CheckRes(trans->Read(&fProtocol, sizeof(int)));
CheckRes(trans->Read(&fOptions, sizeof(int)));
CheckRes(trans->Read(&fUUID, sizeof(int)));
return trans->Read(&fOpen, sizeof(int));
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fName, sizeof(fName)));
CheckRes(trans->Write(&fProtocol, sizeof(int)));
CheckRes(trans->Write(&fOptions, sizeof(int)));
CheckRes(trans->Write(&fUUID, sizeof(int)));
return trans->Write(&fOpen, sizeof(int));
}
int Size() { return sizeof(fName) + 4 * sizeof(int); }
};
struct JackClientCheckResult : public JackResult
{
char fName[JACK_CLIENT_NAME_SIZE+1];
int fStatus;
JackClientCheckResult(): JackResult(), fStatus(0)
{}
JackClientCheckResult(int32_t result, const char* name, int status)
: JackResult(result), fStatus(status)
{
snprintf(fName, sizeof(fName), "%s", name);
}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackResult::Read(trans));
CheckRes(trans->Read(&fName, sizeof(fName)));
CheckRes(trans->Read(&fStatus, sizeof(int)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackResult::Write(trans));
CheckRes(trans->Write(&fName, sizeof(fName)));
CheckRes(trans->Write(&fStatus, sizeof(int)));
return 0;
}
};
struct JackClientOpenRequest : public JackRequest
{
int fPID;
int fUUID;
char fName[JACK_CLIENT_NAME_SIZE+1];
JackClientOpenRequest()
{}
JackClientOpenRequest(const char* name, int pid, int uuid): JackRequest(JackRequest::kClientOpen)
{
snprintf(fName, sizeof(fName), "%s", name);
fPID = pid;
fUUID = uuid;
}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fPID, sizeof(int)));
CheckRes(trans->Read(&fUUID, sizeof(int)));
return trans->Read(&fName, sizeof(fName));
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fPID, sizeof(int)));
CheckRes(trans->Write(&fUUID, sizeof(int)));
return trans->Write(&fName, sizeof(fName));
}
int Size() { return 2 * sizeof(int) + sizeof(fName); }
};
struct JackClientOpenResult : public JackResult
{
int fSharedEngine;
int fSharedClient;
int fSharedGraph;
JackClientOpenResult()
: JackResult(), fSharedEngine(-1), fSharedClient(-1), fSharedGraph(-1)
{}
JackClientOpenResult(int32_t result, int index1, int index2, int index3)
: JackResult(result), fSharedEngine(index1), fSharedClient(index2), fSharedGraph(index3)
{}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackResult::Read(trans));
CheckRes(trans->Read(&fSharedEngine, sizeof(int)));
CheckRes(trans->Read(&fSharedClient, sizeof(int)));
CheckRes(trans->Read(&fSharedGraph, sizeof(int)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackResult::Write(trans));
CheckRes(trans->Write(&fSharedEngine, sizeof(int)));
CheckRes(trans->Write(&fSharedClient, sizeof(int)));
CheckRes(trans->Write(&fSharedGraph, sizeof(int)));
return 0;
}
};
struct JackClientCloseRequest : public JackRequest
{
int fRefNum;
JackClientCloseRequest()
{}
JackClientCloseRequest(int refnum): JackRequest(JackRequest::kClientClose), fRefNum(refnum)
{}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
return trans->Read(&fRefNum, sizeof(int));
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
return trans->Write(&fRefNum, sizeof(int));
}
int Size() { return sizeof(int); }
};
struct JackActivateRequest : public JackRequest
{
int fRefNum;
int fIsRealTime;
JackActivateRequest()
{}
JackActivateRequest(int refnum, int is_real_time)
: JackRequest(JackRequest::kActivateClient), fRefNum(refnum), fIsRealTime(is_real_time)
{}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int)));
return trans->Read(&fIsRealTime, sizeof(int));
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int)));
return trans->Write(&fIsRealTime, sizeof(int));
}
int Size() { return 2 * sizeof(int); }
};
struct JackDeactivateRequest : public JackRequest
{
int fRefNum;
JackDeactivateRequest()
{}
JackDeactivateRequest(int refnum): JackRequest(JackRequest::kDeactivateClient), fRefNum(refnum)
{}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
return trans->Read(&fRefNum, sizeof(int));
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
return trans->Write(&fRefNum, sizeof(int));
}
int Size() { return sizeof(int); }
};
struct JackPortRegisterRequest : public JackRequest
{
int fRefNum;
char fName[JACK_PORT_NAME_SIZE + 1]; // port short name
char fPortType[JACK_PORT_TYPE_SIZE + 1];
unsigned int fFlags;
unsigned int fBufferSize;
JackPortRegisterRequest()
{}
JackPortRegisterRequest(int refnum, const char* name, const char* port_type, unsigned int flags, unsigned int buffer_size)
: JackRequest(JackRequest::kRegisterPort), fRefNum(refnum), fFlags(flags), fBufferSize(buffer_size)
{
strcpy(fName, name);
strcpy(fPortType, port_type);
}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int)));
CheckRes(trans->Read(&fName, sizeof(fName)));
CheckRes(trans->Read(&fPortType, sizeof(fPortType)));
CheckRes(trans->Read(&fFlags, sizeof(unsigned int)));
CheckRes(trans->Read(&fBufferSize, sizeof(unsigned int)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int)));
CheckRes(trans->Write(&fName, sizeof(fName)));
CheckRes(trans->Write(&fPortType, sizeof(fPortType)));
CheckRes(trans->Write(&fFlags, sizeof(unsigned int)));
CheckRes(trans->Write(&fBufferSize, sizeof(unsigned int)));
return 0;
}
int Size() { return sizeof(int) + sizeof(fName) + sizeof(fPortType) + 2 * sizeof(unsigned int); }
};
struct JackPortRegisterResult : public JackResult
{
jack_port_id_t fPortIndex;
JackPortRegisterResult(): JackResult(), fPortIndex(NO_PORT)
{}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackResult::Read(trans));
return trans->Read(&fPortIndex, sizeof(jack_port_id_t));
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackResult::Write(trans));
return trans->Write(&fPortIndex, sizeof(jack_port_id_t));
}
};
struct JackPortUnRegisterRequest : public JackRequest
{
int fRefNum;
jack_port_id_t fPortIndex;
JackPortUnRegisterRequest()
{}
JackPortUnRegisterRequest(int refnum, jack_port_id_t index)
: JackRequest(JackRequest::kUnRegisterPort), fRefNum(refnum), fPortIndex(index)
{}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int)));
CheckRes(trans->Read(&fPortIndex, sizeof(jack_port_id_t)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int)));
CheckRes(trans->Write(&fPortIndex, sizeof(jack_port_id_t)));
return 0;
}
int Size() { return sizeof(int) + sizeof(jack_port_id_t); }
};
struct JackPortConnectNameRequest : public JackRequest
{
int fRefNum;
char fSrc[REAL_JACK_PORT_NAME_SIZE+1]; // port full name
char fDst[REAL_JACK_PORT_NAME_SIZE+1]; // port full name
JackPortConnectNameRequest()
{}
JackPortConnectNameRequest(int refnum, const char* src_name, const char* dst_name)
: JackRequest(JackRequest::kConnectNamePorts), fRefNum(refnum)
{
strcpy(fSrc, src_name);
strcpy(fDst, dst_name);
}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int)));
CheckRes(trans->Read(&fSrc, sizeof(fSrc)));
CheckRes(trans->Read(&fDst, sizeof(fDst)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int)));
CheckRes(trans->Write(&fSrc, sizeof(fSrc)));
CheckRes(trans->Write(&fDst, sizeof(fDst)));
return 0;
}
int Size() { return sizeof(int) + sizeof(fSrc) + sizeof(fDst); }
};
struct JackPortDisconnectNameRequest : public JackRequest
{
int fRefNum;
char fSrc[REAL_JACK_PORT_NAME_SIZE+1]; // port full name
char fDst[REAL_JACK_PORT_NAME_SIZE+1]; // port full name
JackPortDisconnectNameRequest()
{}
JackPortDisconnectNameRequest(int refnum, const char* src_name, const char* dst_name)
: JackRequest(JackRequest::kDisconnectNamePorts), fRefNum(refnum)
{
strcpy(fSrc, src_name);
strcpy(fDst, dst_name);
}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int)));
CheckRes(trans->Read(&fSrc, sizeof(fSrc)));
CheckRes(trans->Read(&fDst, sizeof(fDst)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int)));
CheckRes(trans->Write(&fSrc, sizeof(fSrc)));
CheckRes(trans->Write(&fDst, sizeof(fDst)));
return 0;
}
int Size() { return sizeof(int) + sizeof(fSrc) + sizeof(fDst); }
};
struct JackPortConnectRequest : public JackRequest
{
int fRefNum;
jack_port_id_t fSrc;
jack_port_id_t fDst;
JackPortConnectRequest()
{}
JackPortConnectRequest(int refnum, jack_port_id_t src, jack_port_id_t dst)
: JackRequest(JackRequest::kConnectPorts), fRefNum(refnum), fSrc(src), fDst(dst)
{}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int)));
CheckRes(trans->Read(&fSrc, sizeof(jack_port_id_t)));
CheckRes(trans->Read(&fDst, sizeof(jack_port_id_t)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int)));
CheckRes(trans->Write(&fSrc, sizeof(jack_port_id_t)));
CheckRes(trans->Write(&fDst, sizeof(jack_port_id_t)));
return 0;
}
int Size() { return sizeof(int) + sizeof(jack_port_id_t) + sizeof(jack_port_id_t); }
};
struct JackPortDisconnectRequest : public JackRequest
{
int fRefNum;
jack_port_id_t fSrc;
jack_port_id_t fDst;
JackPortDisconnectRequest()
{}
JackPortDisconnectRequest(int refnum, jack_port_id_t src, jack_port_id_t dst)
: JackRequest(JackRequest::kDisconnectPorts), fRefNum(refnum), fSrc(src), fDst(dst)
{}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int)));
CheckRes(trans->Read(&fSrc, sizeof(jack_port_id_t)));
CheckRes(trans->Read(&fDst, sizeof(jack_port_id_t)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int)));
CheckRes(trans->Write(&fSrc, sizeof(jack_port_id_t)));
CheckRes(trans->Write(&fDst, sizeof(jack_port_id_t)));
return 0;
}
int Size() { return sizeof(int) + sizeof(jack_port_id_t) + sizeof(jack_port_id_t); }
};
struct JackPortRenameRequest : public JackRequest
{
int fRefNum;
jack_port_id_t fPort;
char fName[JACK_PORT_NAME_SIZE + 1]; // port short name
JackPortRenameRequest()
{}
JackPortRenameRequest(int refnum, jack_port_id_t port, const char* name)
: JackRequest(JackRequest::kPortRename), fRefNum(refnum), fPort(port)
{
strcpy(fName, name);
}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int)));
CheckRes(trans->Read(&fPort, sizeof(jack_port_id_t)));
CheckRes(trans->Read(&fName, sizeof(fName)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int)));
CheckRes(trans->Write(&fPort, sizeof(jack_port_id_t)));
CheckRes(trans->Write(&fName, sizeof(fName)));
return 0;
}
int Size() { return sizeof(int) + sizeof(jack_port_id_t) + sizeof(fName); }
};
struct JackSetBufferSizeRequest : public JackRequest
{
jack_nframes_t fBufferSize;
JackSetBufferSizeRequest()
{}
JackSetBufferSizeRequest(jack_nframes_t buffer_size)
: JackRequest(JackRequest::kSetBufferSize), fBufferSize(buffer_size)
{}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
return trans->Read(&fBufferSize, sizeof(jack_nframes_t));
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
return trans->Write(&fBufferSize, sizeof(jack_nframes_t));
}
int Size() { return sizeof(jack_nframes_t); }
};
struct JackSetFreeWheelRequest : public JackRequest
{
int fOnOff;
JackSetFreeWheelRequest()
{}
JackSetFreeWheelRequest(int onoff)
: JackRequest(JackRequest::kSetFreeWheel), fOnOff(onoff)
{}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
return trans->Read(&fOnOff, sizeof(int));
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
return trans->Write(&fOnOff, sizeof(int));
}
int Size() { return sizeof(int); }
};
struct JackComputeTotalLatenciesRequest : public JackRequest
{
JackComputeTotalLatenciesRequest()
: JackRequest(JackRequest::kComputeTotalLatencies)
{}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
return 0;
}
int Size() { return 0; }
};
struct JackReleaseTimebaseRequest : public JackRequest
{
int fRefNum;
JackReleaseTimebaseRequest()
{}
JackReleaseTimebaseRequest(int refnum)
: JackRequest(JackRequest::kReleaseTimebase), fRefNum(refnum)
{}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
return trans->Read(&fRefNum, sizeof(int));
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
return trans->Write(&fRefNum, sizeof(int));
}
int Size() { return sizeof(int); }
};
struct JackSetTimebaseCallbackRequest : public JackRequest
{
int fRefNum;
int fConditionnal;
JackSetTimebaseCallbackRequest()
{}
JackSetTimebaseCallbackRequest(int refnum, int conditional)
: JackRequest(JackRequest::kSetTimebaseCallback), fRefNum(refnum), fConditionnal(conditional)
{}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int)));
return trans->Read(&fConditionnal, sizeof(int));
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int)));
return trans->Write(&fConditionnal, sizeof(int));
}
int Size() { return sizeof(int) + sizeof(int); }
};
struct JackGetInternalClientNameRequest : public JackRequest
{
int fRefNum;
int fIntRefNum;
JackGetInternalClientNameRequest()
{}
JackGetInternalClientNameRequest(int refnum, int int_ref)
: JackRequest(JackRequest::kGetInternalClientName), fRefNum(refnum), fIntRefNum(int_ref)
{}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int)));
return trans->Read(&fIntRefNum, sizeof(int));
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int)));
return trans->Write(&fIntRefNum, sizeof(int));
}
int Size() { return sizeof(int) + sizeof(int); }
};
struct JackGetInternalClientNameResult : public JackResult
{
char fName[JACK_CLIENT_NAME_SIZE+1];
JackGetInternalClientNameResult(): JackResult()
{}
JackGetInternalClientNameResult(int32_t result, const char* name)
: JackResult(result)
{
snprintf(fName, sizeof(fName), "%s", name);
}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackResult::Read(trans));
CheckRes(trans->Read(&fName, sizeof(fName)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackResult::Write(trans));
CheckRes(trans->Write(&fName, sizeof(fName)));
return 0;
}
int Size() { return sizeof(fName); }
};
struct JackInternalClientHandleRequest : public JackRequest
{
int fRefNum;
char fName[JACK_CLIENT_NAME_SIZE+1];
JackInternalClientHandleRequest()
{}
JackInternalClientHandleRequest(int refnum, const char* client_name)
: JackRequest(JackRequest::kInternalClientHandle), fRefNum(refnum)
{
snprintf(fName, sizeof(fName), "%s", client_name);
}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int)));
return trans->Read(&fName, sizeof(fName));
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int)));
return trans->Write(&fName, sizeof(fName));
}
int Size() { return sizeof(int) + sizeof(fName); }
};
struct JackInternalClientHandleResult : public JackResult
{
int fStatus;
int fIntRefNum;
JackInternalClientHandleResult(): JackResult()
{}
JackInternalClientHandleResult(int32_t result, int status, int int_ref)
: JackResult(result), fStatus(status), fIntRefNum(int_ref)
{}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackResult::Read(trans));
CheckRes(trans->Read(&fStatus, sizeof(int)));
CheckRes(trans->Read(&fIntRefNum, sizeof(int)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackResult::Write(trans));
CheckRes(trans->Write(&fStatus, sizeof(int)));
CheckRes(trans->Write(&fIntRefNum, sizeof(int)));
return 0;
}
int Size() { return sizeof(int) + sizeof(int); }
};
struct JackInternalClientLoadRequest : public JackRequest
{
#ifndef MAX_PATH
#define MAX_PATH 256
#endif
int fRefNum;
char fName[JACK_CLIENT_NAME_SIZE+1];
char fDllName[MAX_PATH+1];
char fLoadInitName[JACK_LOAD_INIT_LIMIT+1];
int fOptions;
int fUUID;
JackInternalClientLoadRequest()
{}
JackInternalClientLoadRequest(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int uuid )
: JackRequest(JackRequest::kInternalClientLoad), fRefNum(refnum), fOptions(options), fUUID(uuid)
{
snprintf(fName, sizeof(fName), "%s", client_name);
snprintf(fDllName, sizeof(fDllName), "%s", so_name);
snprintf(fLoadInitName, sizeof(fLoadInitName), "%s", objet_data);
snprintf(fLoadInitName, sizeof(fLoadInitName), "%s", objet_data);
}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int)));
CheckRes(trans->Read(&fName, sizeof(fName)));
CheckRes(trans->Read(&fDllName, sizeof(fDllName)));
CheckRes(trans->Read(&fLoadInitName, sizeof(fLoadInitName)));
CheckRes(trans->Read(&fUUID, sizeof(int)));
return trans->Read(&fOptions, sizeof(int));
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int)));
CheckRes(trans->Write(&fName, sizeof(fName)));
CheckRes(trans->Write(&fDllName, sizeof(fDllName)));
CheckRes(trans->Write(&fLoadInitName, sizeof(fLoadInitName)));
CheckRes(trans->Write(&fUUID, sizeof(int)));
return trans->Write(&fOptions, sizeof(int));
}
int Size() { return sizeof(int) + sizeof(fName) + sizeof(fDllName) + sizeof(fLoadInitName) + 2 * sizeof(int); }
};
struct JackInternalClientLoadResult : public JackResult
{
int fStatus;
int fIntRefNum;
JackInternalClientLoadResult(): JackResult()
{}
JackInternalClientLoadResult(int32_t result, int status, int int_ref)
: JackResult(result), fStatus(status), fIntRefNum(int_ref)
{}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackResult::Read(trans));
CheckRes(trans->Read(&fStatus, sizeof(int)));
CheckRes(trans->Read(&fIntRefNum, sizeof(int)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackResult::Write(trans));
CheckRes(trans->Write(&fStatus, sizeof(int)));
CheckRes(trans->Write(&fIntRefNum, sizeof(int)));
return 0;
}
int Size() { return sizeof(int) + sizeof(int); }
};
struct JackInternalClientUnloadRequest : public JackRequest
{
int fRefNum;
int fIntRefNum;
JackInternalClientUnloadRequest()
{}
JackInternalClientUnloadRequest(int refnum, int int_ref)
: JackRequest(JackRequest::kInternalClientUnload), fRefNum(refnum), fIntRefNum(int_ref)
{}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int)));
return trans->Read(&fIntRefNum, sizeof(int));
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int)));
return trans->Write(&fIntRefNum, sizeof(int));
}
int Size() { return sizeof(int) + sizeof(int); }
};
struct JackInternalClientUnloadResult : public JackResult
{
int fStatus;
JackInternalClientUnloadResult(): JackResult()
{}
JackInternalClientUnloadResult(int32_t result, int status)
: JackResult(result), fStatus(status)
{}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackResult::Read(trans));
CheckRes(trans->Read(&fStatus, sizeof(int)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackResult::Write(trans));
CheckRes(trans->Write(&fStatus, sizeof(int)));
return 0;
}
int Size() { return sizeof(int); }
};
struct JackClientNotificationRequest : public JackRequest
{
int fRefNum;
int fNotify;
int fValue;
JackClientNotificationRequest()
{}
JackClientNotificationRequest(int refnum, int notify, int value)
: JackRequest(JackRequest::kNotification), fRefNum(refnum), fNotify(notify), fValue(value)
{}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int)));
CheckRes(trans->Read(&fNotify, sizeof(int)));
CheckRes(trans->Read(&fValue, sizeof(int)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int)));
CheckRes(trans->Write(&fNotify, sizeof(int)));
CheckRes(trans->Write(&fValue, sizeof(int)));
return 0;
}
int Size() { return 3 * sizeof(int); }
};
struct JackSessionCommand
{
char fUUID[JACK_UUID_SIZE];
char fClientName[JACK_CLIENT_NAME_SIZE+1];
char fCommand[JACK_SESSION_COMMAND_SIZE];
jack_session_flags_t fFlags;
JackSessionCommand()
{}
JackSessionCommand(const char *uuid, const char *clientname, const char *command, jack_session_flags_t flags)
{
strncpy(fUUID, uuid, sizeof(fUUID));
strncpy(fClientName, clientname, sizeof(fClientName));
strncpy(fCommand, command, sizeof(fCommand));
fFlags = flags;
}
};
struct JackSessionNotifyResult : public JackResult
{
std::list<JackSessionCommand> fCommandList;
bool fDone;
JackSessionNotifyResult(): JackResult(), fDone(false)
{}
JackSessionNotifyResult(int32_t result)
: JackResult(result), fDone(false)
{}
int Read(detail::JackChannelTransactionInterface* trans)
{
if (trans == NULL)
{
return 0;
}
CheckRes(JackResult::Read(trans));
while (true) {
JackSessionCommand buffer;
CheckRes(trans->Read(buffer.fUUID, sizeof(buffer.fUUID)));
if (buffer.fUUID[0] == '\0')
break;
CheckRes(trans->Read(buffer.fClientName, sizeof(buffer.fClientName)));
CheckRes(trans->Read(buffer.fCommand, sizeof(buffer.fCommand)));
CheckRes(trans->Read(&(buffer.fFlags), sizeof(buffer.fFlags)));
fCommandList.push_back(buffer);
}
fDone = true;
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
if (trans == NULL)
{
fDone = true;
return 0;
}
char terminator[JACK_UUID_SIZE];
terminator[0] = '\0';
CheckRes(JackResult::Write(trans));
for (std::list<JackSessionCommand>::iterator i = fCommandList.begin(); i != fCommandList.end(); i++) {
CheckRes(trans->Write(i->fUUID, sizeof(i->fUUID)));
CheckRes(trans->Write(i->fClientName, sizeof(i->fClientName)));
CheckRes(trans->Write(i->fCommand, sizeof(i->fCommand)));
CheckRes(trans->Write(&(i->fFlags), sizeof(i->fFlags)));
}
CheckRes(trans->Write(terminator, sizeof(terminator)));
return 0;
}
jack_session_command_t* GetCommands()
{
/* TODO: some kind of signal should be used instead */
while (!fDone)
{
JackSleep(50000); /* 50 ms */
}
jack_session_command_t* session_command = (jack_session_command_t *)malloc(sizeof(jack_session_command_t) * (fCommandList.size() + 1));
int i = 0;
for (std::list<JackSessionCommand>::iterator ci = fCommandList.begin(); ci != fCommandList.end(); ci++) {
session_command[i].uuid = strdup(ci->fUUID);
session_command[i].client_name = strdup(ci->fClientName);
session_command[i].command = strdup(ci->fCommand);
session_command[i].flags = ci->fFlags;
i += 1;
}
session_command[i].uuid = NULL;
session_command[i].client_name = NULL;
session_command[i].command = NULL;
session_command[i].flags = (jack_session_flags_t)0;
return session_command;
}
};
struct JackSessionNotifyRequest : public JackRequest
{
char fPath[JACK_MESSAGE_SIZE+1];
char fDst[JACK_CLIENT_NAME_SIZE+1];
jack_session_event_type_t fEventType;
int fRefNum;
JackSessionNotifyRequest()
{}
JackSessionNotifyRequest(int refnum, const char* path, jack_session_event_type_t type, const char* dst)
: JackRequest(JackRequest::kSessionNotify), fEventType(type), fRefNum(refnum)
{
snprintf(fPath, sizeof(fPath), "%s", path);
if (dst) {
snprintf(fDst, sizeof(fDst), "%s", dst);
} else {
fDst[0] = '\0';
}
}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(fRefNum)));
CheckRes(trans->Read(&fPath, sizeof(fPath)));
CheckRes(trans->Read(&fDst, sizeof(fDst)));
CheckRes(trans->Read(&fEventType, sizeof(fEventType)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(fRefNum)));
CheckRes(trans->Write(&fPath, sizeof(fPath)));
CheckRes(trans->Write(&fDst, sizeof(fDst)));
CheckRes(trans->Write(&fEventType, sizeof(fEventType)));
return 0;
}
int Size() { return sizeof(fRefNum) + sizeof(fPath) + sizeof(fDst) + sizeof(fEventType); }
};
struct JackSessionReplyRequest : public JackRequest
{
int fRefNum;
JackSessionReplyRequest()
{}
JackSessionReplyRequest(int refnum)
: JackRequest(JackRequest::kSessionReply), fRefNum(refnum)
{}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fRefNum, sizeof(int)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fRefNum, sizeof(int)));
return 0;
}
int Size() { return sizeof(int); }
};
struct JackClientNameResult : public JackResult
{
char fName[JACK_CLIENT_NAME_SIZE+1];
JackClientNameResult(): JackResult()
{}
JackClientNameResult(int32_t result, const char* name)
: JackResult(result)
{
snprintf(fName, sizeof(fName), "%s", name);
}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackResult::Read(trans));
CheckRes(trans->Read(&fName, sizeof(fName)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackResult::Write(trans));
CheckRes(trans->Write(&fName, sizeof(fName)));
return 0;
}
};
struct JackUUIDResult : public JackResult
{
char fUUID[JACK_UUID_SIZE];
JackUUIDResult(): JackResult()
{}
JackUUIDResult(int32_t result, const char* uuid)
: JackResult(result)
{
snprintf(fUUID, sizeof(fUUID), "%s", uuid);
}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackResult::Read(trans));
CheckRes(trans->Read(&fUUID, sizeof(fUUID)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackResult::Write(trans));
CheckRes(trans->Write(&fUUID, sizeof(fUUID)));
return 0;
}
};
struct JackGetUUIDRequest : public JackRequest
{
char fName[JACK_CLIENT_NAME_SIZE+1];
JackGetUUIDRequest()
{}
JackGetUUIDRequest(const char* client_name)
: JackRequest(JackRequest::kGetUUIDByClient)
{
strncpy(fName, client_name, sizeof(fName));
}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fName, sizeof(fName)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fName, sizeof(fName)));
return 0;
}
int Size() { return sizeof(fName); }
};
struct JackGetClientNameRequest : public JackRequest
{
char fUUID[JACK_UUID_SIZE];
JackGetClientNameRequest()
{}
JackGetClientNameRequest(const char* uuid)
: JackRequest(JackRequest::kGetClientByUUID)
{
strncpy(fUUID, uuid, sizeof(fUUID));
}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fUUID, sizeof(fUUID)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fUUID, sizeof(fUUID)));
return 0;
}
int Size() { return sizeof(fUUID); }
};
struct JackReserveNameRequest : public JackRequest
{
int fRefNum;
char fName[JACK_CLIENT_NAME_SIZE+1];
char fUUID[JACK_UUID_SIZE];
JackReserveNameRequest()
{}
JackReserveNameRequest(int refnum, const char *name, const char* uuid)
: JackRequest(JackRequest::kReserveClientName), fRefNum(refnum)
{
strncpy(fName, name, sizeof(fName));
strncpy(fUUID, uuid, sizeof(fUUID));
}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fUUID, sizeof(fUUID)));
CheckRes(trans->Read(&fName, sizeof(fName)));
CheckRes(trans->Read(&fRefNum, sizeof(fRefNum)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fUUID, sizeof(fUUID)));
CheckRes(trans->Write(&fName, sizeof(fName)));
CheckRes(trans->Write(&fRefNum, sizeof(fRefNum)));
return 0;
}
int Size() { return sizeof(fUUID) + sizeof(fName) + sizeof(fRefNum); }
};
struct JackClientHasSessionCallbackRequest : public JackRequest
{
char fName[JACK_CLIENT_NAME_SIZE+1];
JackClientHasSessionCallbackRequest()
{}
JackClientHasSessionCallbackRequest(const char *name)
: JackRequest(JackRequest::kClientHasSessionCallback)
{
strncpy(fName, name, sizeof(fName));
}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fName, sizeof(fName)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
CheckRes(trans->Write(&fName, sizeof(fName)));
return 0;
}
int Size() { return sizeof(fName); }
};
struct JackClientNotification
{
int fSize;
char fName[JACK_CLIENT_NAME_SIZE+1];
int fRefNum;
int fNotify;
int fValue1;
int fValue2;
int fSync;
char fMessage[JACK_MESSAGE_SIZE+1];
JackClientNotification(): fNotify(-1), fValue1(-1), fValue2(-1)
{}
JackClientNotification(const char* name, int refnum, int notify, int sync, const char* message, int value1, int value2)
: fRefNum(refnum), fNotify(notify), fValue1(value1), fValue2(value2), fSync(sync)
{
snprintf(fName, sizeof(fName), "%s", name);
snprintf(fMessage, sizeof(fMessage), "%s", message);
fSize = Size();
}
int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
CheckRes(trans->Read(&fName, sizeof(fName)));
CheckRes(trans->Read(&fRefNum, sizeof(int)));
CheckRes(trans->Read(&fNotify, sizeof(int)));
CheckRes(trans->Read(&fValue1, sizeof(int)));
CheckRes(trans->Read(&fValue2, sizeof(int)));
CheckRes(trans->Read(&fSync, sizeof(int)));
CheckRes(trans->Read(&fMessage, sizeof(fMessage)));
return 0;
}
int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(trans->Write(&fSize, sizeof(int)));
CheckRes(trans->Write(&fName, sizeof(fName)));
CheckRes(trans->Write(&fRefNum, sizeof(int)));
CheckRes(trans->Write(&fNotify, sizeof(int)));
CheckRes(trans->Write(&fValue1, sizeof(int)));
CheckRes(trans->Write(&fValue2, sizeof(int)));
CheckRes(trans->Write(&fSync, sizeof(int)));
CheckRes(trans->Write(&fMessage, sizeof(fMessage)));
return 0;
}
int Size() { return sizeof(int) + sizeof(fName) + 5 * sizeof(int) + sizeof(fMessage); }
};
} // end of namespace
#endif
Jack::JackReleaseTimebaseRequest
ReleaseTimebase request.
Definition: JackRequest.h:804
Jack
Definition: JackAC3Encoder.cpp:30
Jack::JackPortConnectNameRequest
PortConnectName request.
Definition: JackRequest.h:516
Jack::JackSetBufferSizeRequest
SetBufferSize request.
Definition: JackRequest.h:717
Jack::JackInternalClientHandleResult
InternalClientHandle result.
Definition: JackRequest.h:970
Jack::JackClientCloseRequest
CloseClient request.
Definition: JackRequest.h:316
Jack::JackClientCheckResult
CheckClient result.
Definition: JackRequest.h:202
Jack::JackSetTimebaseCallbackRequest
SetTimebaseCallback request.
Definition: JackRequest.h:835
Jack::JackPortDisconnectRequest
PortDisconnect request.
Definition: JackRequest.h:638
Jack::JackResult
Result from the server.
Definition: JackRequest.h:129
Jack::JackClientOpenRequest
NewClient request.
Definition: JackRequest.h:238
Jack::JackReserveNameRequest
Definition: JackRequest.h:1496
Jack::JackInternalClientLoadResult
InternalClientLoad result.
Definition: JackRequest.h:1059
Jack::JackRequest
Request from client to server.
Definition: JackRequest.h:56
Jack::JackClientNotificationRequest
ClientNotification request.
Definition: JackRequest.h:1159
Jack::JackClientCheckRequest
CheckClient request.
Definition: JackRequest.h:157
Jack::JackGetInternalClientNameRequest
GetInternalClientName request.
Definition: JackRequest.h:868
Jack::JackClientNameResult
Definition: JackRequest.h:1378
Jack::JackClientOpenResult
NewClient result.
Definition: JackRequest.h:278
Jack::JackGetInternalClientNameResult
GetInternalClient result.
Definition: JackRequest.h:901
jack_session_command_t
Definition: JackSession.h:59
Jack::JackPortRegisterResult
PortRegister result.
Definition: JackRequest.h:455
Jack::JackComputeTotalLatenciesRequest
ComputeTotalLatencies request.
Definition: JackRequest.h:778
Jack::JackPortRenameRequest
PortRename request.
Definition: JackRequest.h:676
Jack::JackDeactivateRequest
Deactivate request.
Definition: JackRequest.h:378
Jack::JackActivateRequest
Activate request.
Definition: JackRequest.h:345
Jack::JackPortUnRegisterRequest
PortUnregister request.
Definition: JackRequest.h:481
jack_session_flags_t
enum JackSessionFlags jack_session_flags_t
Definition: session.h:98
Jack::JackSessionNotifyRequest
SessionNotify request.
Definition: JackRequest.h:1306
Jack::JackInternalClientUnloadRequest
InternalClientUnload request.
Definition: JackRequest.h:1094
Jack::JackInternalClientLoadRequest
InternalClientLoad request.
Definition: JackRequest.h:1005
Jack::JackPortConnectRequest
PortConnect request.
Definition: JackRequest.h:600
Jack::JackInternalClientUnloadResult
InternalClientLoad result.
Definition: JackRequest.h:1127
Jack::JackGetUUIDRequest
Definition: JackRequest.h:1434
Jack::JackPortDisconnectNameRequest
PortDisconnectName request.
Definition: JackRequest.h:558
Jack::JackGetClientNameRequest
Definition: JackRequest.h:1465
Jack::JackSessionCommand
Definition: JackRequest.h:1194
Jack::detail::JackChannelTransactionInterface
Definition: JackChannel.h:38
Jack::JackSetFreeWheelRequest
SetFreeWheel request.
Definition: JackRequest.h:747
Jack::JackSessionNotifyResult
Definition: JackRequest.h:1213
Jack::JackSessionReplyRequest
Definition: JackRequest.h:1349
Jack::JackUUIDResult
Definition: JackRequest.h:1406
Jack::JackClientNotification
ClientNotification.
Definition: JackRequest.h:1569
Jack::JackPortRegisterRequest
PortRegister request.
Definition: JackRequest.h:407
Jack::JackInternalClientHandleRequest
InternalClientHandle request.
Definition: JackRequest.h:935
Jack::JackClientHasSessionCallbackRequest
Definition: JackRequest.h:1534