jack2 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1870 lines
52KB

  1. /*
  2. Copyright (C) 2001 Paul Davis
  3. Copyright (C) 2004-2008 Grame
  4. Copyright (C) 2016-2026 Filipe Coelho
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU Lesser General Public License as published by
  7. the Free Software Foundation; either version 2.1 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU Lesser General Public License for more details.
  13. You should have received a copy of the GNU Lesser General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  16. */
  17. #ifndef __JackRequest__
  18. #define __JackRequest__
  19. #include "JackConstants.h"
  20. #include "JackError.h"
  21. #include "JackPlatformPlug.h"
  22. #include "JackChannel.h"
  23. #include "JackTime.h"
  24. #include "types.h"
  25. #include <string.h>
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. #include <list>
  29. namespace Jack
  30. {
  31. #define JACK_CLIENT_NAME_SIZE_1 (JACK_CLIENT_NAME_SIZE + 1)
  32. #define JACK_LOAD_INIT_LIMIT_1 (JACK_LOAD_INIT_LIMIT + 1)
  33. #define JACK_MESSAGE_SIZE_1 (JACK_MESSAGE_SIZE + 1)
  34. #define JACK_PORT_NAME_SIZE_1 (JACK_PORT_NAME_SIZE + 1)
  35. #define JACK_PORT_TYPE_SIZE_1 (JACK_PORT_TYPE_SIZE + 1)
  36. #define REAL_JACK_PORT_NAME_SIZE_1 (REAL_JACK_PORT_NAME_SIZE + 1)
  37. #define CheckRes(exp) { \
  38. int reserr = (exp); \
  39. if (reserr < 0) { \
  40. if (reserr != JACK_REQUEST_ERR_ABORTED) \
  41. jack_error("CheckRes error for " #exp "in %s", __PRETTY_FUNCTION__); \
  42. return reserr; \
  43. } \
  44. }
  45. #define CheckSize() { \
  46. int size = -1; \
  47. CheckRes(trans->Read(&size, sizeof(int))); \
  48. if (size != Size()) { \
  49. jack_error("CheckSize error size = %d Size() = %d", size, Size()); \
  50. return -1; \
  51. } \
  52. }
  53. /*!
  54. \brief Session API constants.
  55. */
  56. enum JackSessionReply {
  57. kImmediateSessionReply = 1,
  58. kPendingSessionReply = 2
  59. };
  60. /*!
  61. \brief Request from client to server.
  62. */
  63. struct JackRequest
  64. {
  65. enum RequestType {
  66. kRegisterPort = 1,
  67. kUnRegisterPort = 2,
  68. kConnectPorts = 3,
  69. kDisconnectPorts = 4,
  70. kSetTimeBaseClient = 5,
  71. kActivateClient = 6,
  72. kDeactivateClient = 7,
  73. kDisconnectPort = 8,
  74. kSetClientCapabilities = 9,
  75. kGetPortConnections = 10,
  76. kGetPortNConnections = 11,
  77. kReleaseTimebase = 12,
  78. kSetTimebaseCallback = 13,
  79. kSetBufferSize = 20,
  80. kSetFreeWheel = 21,
  81. kClientCheck = 22,
  82. kClientOpen = 23,
  83. kClientClose = 24,
  84. kConnectNamePorts = 25,
  85. kDisconnectNamePorts = 26,
  86. kGetInternalClientName = 27,
  87. kInternalClientHandle = 28,
  88. kInternalClientLoad = 29,
  89. kInternalClientUnload = 30,
  90. kPortRename = 31,
  91. kNotification = 32,
  92. kSessionNotify = 33,
  93. kSessionReply = 34,
  94. kGetClientByUUID = 35,
  95. kReserveClientName = 36,
  96. kGetUUIDByClient = 37,
  97. kClientHasSessionCallback = 38,
  98. kComputeTotalLatencies = 39,
  99. kPropertyChangeNotify = 40
  100. };
  101. RequestType fType;
  102. JackRequest(RequestType type)
  103. : fType(type)
  104. {}
  105. virtual ~JackRequest()
  106. {}
  107. virtual int Read(detail::JackChannelTransactionInterface* trans) = 0;
  108. virtual int Write(detail::JackChannelTransactionInterface* trans) = 0;
  109. };
  110. struct JackRequestHeader : JackRequest
  111. {
  112. JackRequestHeader()
  113. : JackRequest((RequestType)0)
  114. {}
  115. int Read(detail::JackChannelTransactionInterface* trans) override
  116. {
  117. return trans->Read(&fType, sizeof(RequestType));
  118. }
  119. int Write(detail::JackChannelTransactionInterface* trans) override
  120. {
  121. return -1;
  122. }
  123. };
  124. template<int DataSize>
  125. struct JackRequestImpl : JackRequest
  126. {
  127. static constexpr int TotalSize = sizeof(RequestType) + sizeof(int) + DataSize;
  128. JackRequestImpl(RequestType type)
  129. : JackRequest(type), fPacketPos(0)
  130. {
  131. }
  132. int WritePacketInit()
  133. {
  134. if (fType == 0) {
  135. jack_error("JackRequestImpl::WritePacketInit error unspecified type");
  136. return -1;
  137. }
  138. if (fPacketPos != 0) {
  139. jack_error("JackRequestImpl::WritePacketInit error called more than once for type %d", fType);
  140. return -1;
  141. }
  142. const int size = DataSize;
  143. memcpy(fPacketData, &fType, sizeof(RequestType));
  144. memcpy(fPacketData + sizeof(RequestType), &size, sizeof(int));
  145. fPacketPos = sizeof(RequestType) + sizeof(int);
  146. return 0;
  147. }
  148. int WritePacket(void* data, int len)
  149. {
  150. if (fPacketPos == 0) {
  151. jack_error("JackRequestImpl::WritePacket failed for type %d because it has not been initialized", fType);
  152. return -1;
  153. }
  154. if (fPacketPos == -1) {
  155. jack_error("JackRequestImpl::WritePacket failed for type %d because it has already been sent", fType);
  156. return -1;
  157. }
  158. if (fPacketPos + len > TotalSize) {
  159. jack_error("JackRequestImpl::WritePacket failed for type %d because of too much data, pos %d, len %d, total size %d",
  160. fType, fPacketPos, len, TotalSize);
  161. return -1;
  162. }
  163. jack_log("JackRequestImpl::WritePacket ok for type %d, pos %d, len %d, total size %d (new pos %d)",
  164. fType, fPacketPos, len, TotalSize, fPacketPos + len);
  165. memcpy(fPacketData + fPacketPos, data, len);
  166. fPacketPos += len;
  167. return 0;
  168. }
  169. int Write(detail::JackChannelTransactionInterface* trans) override
  170. {
  171. if (fPacketPos != TotalSize) {
  172. jack_error("JackRequestImpl::Write failed for type %d because of incomplete data, pos %d, total size %d",
  173. fType, fPacketPos, TotalSize);
  174. return -1;
  175. }
  176. // invalidate any more writes
  177. fPacketPos = -1;
  178. const int err = trans->Write(fPacketData, TotalSize);
  179. if (err < 0 && err != JACK_REQUEST_ERR_ABORTED)
  180. jack_error("JackRequestImpl::Write failed for type %d", fType);
  181. return err;
  182. }
  183. static constexpr int Size() { return DataSize; }
  184. private:
  185. uint8_t fPacketData[TotalSize];
  186. int fPacketPos;
  187. };
  188. /*!
  189. \brief Result from the server.
  190. */
  191. struct JackResult
  192. {
  193. int fResult;
  194. JackResult(): fResult( -1)
  195. {}
  196. JackResult(int result): fResult(result)
  197. {}
  198. virtual ~JackResult()
  199. {}
  200. virtual int Read(detail::JackChannelTransactionInterface* trans)
  201. {
  202. return trans->Read(&fResult, sizeof(int));
  203. }
  204. virtual int Write(detail::JackChannelTransactionInterface* trans)
  205. {
  206. return trans->Write(&fResult, sizeof(int));
  207. }
  208. };
  209. /*!
  210. \brief CheckClient request.
  211. */
  212. struct JackClientCheckRequest : public JackRequestImpl<JACK_CLIENT_NAME_SIZE_1 + 3 * sizeof(int) + sizeof(jack_uuid_t)>
  213. {
  214. char fName[JACK_CLIENT_NAME_SIZE_1];
  215. int fProtocol;
  216. int fOptions;
  217. int fOpen;
  218. jack_uuid_t fUUID;
  219. JackClientCheckRequest()
  220. : JackRequestImpl(kClientCheck), fProtocol(0), fOptions(0), fOpen(0), fUUID(JACK_UUID_EMPTY_INITIALIZER)
  221. {
  222. memset(fName, 0, sizeof(fName));
  223. }
  224. JackClientCheckRequest(const char* name, int protocol, int options, jack_uuid_t uuid, int open = false)
  225. : JackRequestImpl(kClientCheck), fProtocol(protocol), fOptions(options), fOpen(open), fUUID(uuid)
  226. {
  227. memset(fName, 0, sizeof(fName));
  228. snprintf(fName, sizeof(fName), "%s", name);
  229. }
  230. int Read(detail::JackChannelTransactionInterface* trans) override
  231. {
  232. CheckSize();
  233. CheckRes(trans->Read(&fName, sizeof(fName)));
  234. CheckRes(trans->Read(&fProtocol, sizeof(int)));
  235. CheckRes(trans->Read(&fOptions, sizeof(int)));
  236. CheckRes(trans->Read(&fUUID, sizeof(jack_uuid_t)));
  237. return trans->Read(&fOpen, sizeof(int));
  238. }
  239. int Write(detail::JackChannelTransactionInterface* trans) override
  240. {
  241. CheckRes(WritePacketInit());
  242. CheckRes(WritePacket(&fName, sizeof(fName)));
  243. CheckRes(WritePacket(&fProtocol, sizeof(int)));
  244. CheckRes(WritePacket(&fOptions, sizeof(int)));
  245. CheckRes(WritePacket(&fUUID, sizeof(jack_uuid_t)));
  246. CheckRes(WritePacket(&fOpen, sizeof(int)));
  247. return JackRequestImpl::Write(trans);
  248. }
  249. static constexpr int Size() { return sizeof(fName) + 3 * sizeof(int) + sizeof(jack_uuid_t); }
  250. };
  251. /*!
  252. \brief CheckClient result.
  253. */
  254. struct JackClientCheckResult : public JackResult
  255. {
  256. char fName[JACK_CLIENT_NAME_SIZE+1];
  257. int fStatus;
  258. JackClientCheckResult(): JackResult(), fStatus(0)
  259. {
  260. memset(fName, 0, sizeof(fName));
  261. }
  262. JackClientCheckResult(int32_t result, const char* name, int status)
  263. : JackResult(result), fStatus(status)
  264. {
  265. memset(fName, 0, sizeof(fName));
  266. snprintf(fName, sizeof(fName), "%s", name);
  267. }
  268. int Read(detail::JackChannelTransactionInterface* trans) override
  269. {
  270. CheckRes(JackResult::Read(trans));
  271. CheckRes(trans->Read(&fName, sizeof(fName)));
  272. CheckRes(trans->Read(&fStatus, sizeof(int)));
  273. return 0;
  274. }
  275. int Write(detail::JackChannelTransactionInterface* trans) override
  276. {
  277. CheckRes(JackResult::Write(trans));
  278. CheckRes(trans->Write(&fName, sizeof(fName)));
  279. CheckRes(trans->Write(&fStatus, sizeof(int)));
  280. return 0;
  281. }
  282. };
  283. /*!
  284. \brief NewClient request.
  285. */
  286. struct JackClientOpenRequest : public JackRequestImpl<sizeof(int) + sizeof(jack_uuid_t) + JACK_CLIENT_NAME_SIZE_1>
  287. {
  288. int fPID;
  289. jack_uuid_t fUUID;
  290. char fName[JACK_CLIENT_NAME_SIZE_1];
  291. JackClientOpenRequest()
  292. : JackRequestImpl(kClientOpen), fPID(0), fUUID(JACK_UUID_EMPTY_INITIALIZER)
  293. {
  294. memset(fName, 0, sizeof(fName));
  295. }
  296. JackClientOpenRequest(const char* name, int pid, jack_uuid_t uuid)
  297. : JackRequestImpl(kClientOpen)
  298. {
  299. memset(fName, 0, sizeof(fName));
  300. snprintf(fName, sizeof(fName), "%s", name);
  301. fPID = pid;
  302. fUUID = uuid;
  303. }
  304. int Read(detail::JackChannelTransactionInterface* trans) override
  305. {
  306. CheckSize();
  307. CheckRes(trans->Read(&fPID, sizeof(int)));
  308. CheckRes(trans->Read(&fUUID, sizeof(jack_uuid_t)));
  309. return trans->Read(&fName, sizeof(fName));
  310. }
  311. int Write(detail::JackChannelTransactionInterface* trans) override
  312. {
  313. CheckRes(WritePacketInit());
  314. CheckRes(WritePacket(&fPID, sizeof(int)));
  315. CheckRes(WritePacket(&fUUID, sizeof(jack_uuid_t)));
  316. CheckRes(WritePacket(&fName, sizeof(fName)));
  317. return JackRequestImpl::Write(trans);
  318. }
  319. };
  320. /*!
  321. \brief NewClient result.
  322. */
  323. struct JackClientOpenResult : public JackResult
  324. {
  325. int fSharedEngine;
  326. int fSharedClient;
  327. int fSharedGraph;
  328. JackClientOpenResult()
  329. : JackResult(), fSharedEngine(-1), fSharedClient(-1), fSharedGraph(-1)
  330. {}
  331. JackClientOpenResult(int32_t result, int index1, int index2, int index3)
  332. : JackResult(result), fSharedEngine(index1), fSharedClient(index2), fSharedGraph(index3)
  333. {}
  334. int Read(detail::JackChannelTransactionInterface* trans) override
  335. {
  336. CheckRes(JackResult::Read(trans));
  337. CheckRes(trans->Read(&fSharedEngine, sizeof(int)));
  338. CheckRes(trans->Read(&fSharedClient, sizeof(int)));
  339. CheckRes(trans->Read(&fSharedGraph, sizeof(int)));
  340. return 0;
  341. }
  342. int Write(detail::JackChannelTransactionInterface* trans) override
  343. {
  344. CheckRes(JackResult::Write(trans));
  345. CheckRes(trans->Write(&fSharedEngine, sizeof(int)));
  346. CheckRes(trans->Write(&fSharedClient, sizeof(int)));
  347. CheckRes(trans->Write(&fSharedGraph, sizeof(int)));
  348. return 0;
  349. }
  350. };
  351. /*!
  352. \brief CloseClient request.
  353. */
  354. struct JackClientCloseRequest : public JackRequestImpl<sizeof(int)>
  355. {
  356. int fRefNum;
  357. JackClientCloseRequest()
  358. : JackRequestImpl(kClientClose), fRefNum(0)
  359. {}
  360. JackClientCloseRequest(int refnum)
  361. : JackRequestImpl(kClientClose), fRefNum(refnum)
  362. {}
  363. int Read(detail::JackChannelTransactionInterface* trans) override
  364. {
  365. CheckSize();
  366. return trans->Read(&fRefNum, sizeof(int));
  367. }
  368. int Write(detail::JackChannelTransactionInterface* trans) override
  369. {
  370. CheckRes(WritePacketInit());
  371. CheckRes(WritePacket(&fRefNum, sizeof(int)));
  372. return JackRequestImpl::Write(trans);
  373. }
  374. };
  375. /*!
  376. \brief Activate request.
  377. */
  378. struct JackActivateRequest : public JackRequestImpl<2 * sizeof(int)>
  379. {
  380. int fRefNum;
  381. int fIsRealTime;
  382. JackActivateRequest()
  383. : JackRequestImpl(kActivateClient), fRefNum(0), fIsRealTime(0)
  384. {}
  385. JackActivateRequest(int refnum, int is_real_time)
  386. : JackRequestImpl(kActivateClient), fRefNum(refnum), fIsRealTime(is_real_time)
  387. {}
  388. int Read(detail::JackChannelTransactionInterface* trans) override
  389. {
  390. CheckSize();
  391. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  392. return trans->Read(&fIsRealTime, sizeof(int));
  393. }
  394. int Write(detail::JackChannelTransactionInterface* trans) override
  395. {
  396. CheckRes(WritePacketInit());
  397. CheckRes(WritePacket(&fRefNum, sizeof(int)));
  398. CheckRes(WritePacket(&fIsRealTime, sizeof(int)));
  399. return JackRequestImpl::Write(trans);
  400. }
  401. };
  402. /*!
  403. \brief Deactivate request.
  404. */
  405. struct JackDeactivateRequest : public JackRequestImpl<sizeof(int)>
  406. {
  407. int fRefNum;
  408. JackDeactivateRequest()
  409. : JackRequestImpl(kDeactivateClient), fRefNum(0)
  410. {}
  411. JackDeactivateRequest(int refnum)
  412. : JackRequestImpl(kDeactivateClient), fRefNum(refnum)
  413. {}
  414. int Read(detail::JackChannelTransactionInterface* trans) override
  415. {
  416. CheckSize();
  417. return trans->Read(&fRefNum, sizeof(int));
  418. }
  419. int Write(detail::JackChannelTransactionInterface* trans) override
  420. {
  421. CheckRes(WritePacketInit());
  422. CheckRes(WritePacket(&fRefNum, sizeof(int)));
  423. return JackRequestImpl::Write(trans);
  424. }
  425. };
  426. /*!
  427. \brief PortRegister request.
  428. */
  429. struct JackPortRegisterRequest : public JackRequestImpl<sizeof(int) + JACK_PORT_NAME_SIZE_1 + JACK_PORT_TYPE_SIZE_1 + 2 * sizeof(unsigned int)>
  430. {
  431. int fRefNum;
  432. char fName[JACK_PORT_NAME_SIZE_1]; // port short name
  433. char fPortType[JACK_PORT_TYPE_SIZE_1];
  434. unsigned int fFlags;
  435. unsigned int fBufferSize;
  436. JackPortRegisterRequest()
  437. : JackRequestImpl(kRegisterPort), fRefNum(0), fFlags(0), fBufferSize(0)
  438. {
  439. memset(fName, 0, sizeof(fName));
  440. memset(fPortType, 0, sizeof(fPortType));
  441. }
  442. JackPortRegisterRequest(int refnum, const char* name, const char* port_type, unsigned int flags, unsigned int buffer_size)
  443. : JackRequestImpl(kRegisterPort), fRefNum(refnum), fFlags(flags), fBufferSize(buffer_size)
  444. {
  445. memset(fName, 0, sizeof(fName));
  446. memset(fPortType, 0, sizeof(fPortType));
  447. strncpy(fName, name, sizeof(fName)-1);
  448. strncpy(fPortType, port_type, sizeof(fPortType)-1);
  449. }
  450. int Read(detail::JackChannelTransactionInterface* trans) override
  451. {
  452. CheckSize();
  453. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  454. CheckRes(trans->Read(&fName, sizeof(fName)));
  455. CheckRes(trans->Read(&fPortType, sizeof(fPortType)));
  456. CheckRes(trans->Read(&fFlags, sizeof(unsigned int)));
  457. CheckRes(trans->Read(&fBufferSize, sizeof(unsigned int)));
  458. return 0;
  459. }
  460. int Write(detail::JackChannelTransactionInterface* trans) override
  461. {
  462. CheckRes(WritePacketInit());
  463. CheckRes(WritePacket(&fRefNum, sizeof(int)));
  464. CheckRes(WritePacket(&fName, sizeof(fName)));
  465. CheckRes(WritePacket(&fPortType, sizeof(fPortType)));
  466. CheckRes(WritePacket(&fFlags, sizeof(unsigned int)));
  467. CheckRes(WritePacket(&fBufferSize, sizeof(unsigned int)));
  468. return JackRequestImpl::Write(trans);
  469. }
  470. };
  471. /*!
  472. \brief PortRegister result.
  473. */
  474. struct JackPortRegisterResult : public JackResult
  475. {
  476. jack_port_id_t fPortIndex;
  477. JackPortRegisterResult(): JackResult(), fPortIndex(NO_PORT)
  478. {}
  479. int Read(detail::JackChannelTransactionInterface* trans) override
  480. {
  481. CheckRes(JackResult::Read(trans));
  482. return trans->Read(&fPortIndex, sizeof(jack_port_id_t));
  483. }
  484. int Write(detail::JackChannelTransactionInterface* trans) override
  485. {
  486. CheckRes(JackResult::Write(trans));
  487. return trans->Write(&fPortIndex, sizeof(jack_port_id_t));
  488. }
  489. };
  490. /*!
  491. \brief PortUnregister request.
  492. */
  493. struct JackPortUnRegisterRequest : public JackRequestImpl<sizeof(int) + sizeof(jack_port_id_t)>
  494. {
  495. int fRefNum;
  496. jack_port_id_t fPortIndex;
  497. JackPortUnRegisterRequest()
  498. : JackRequestImpl(kUnRegisterPort), fRefNum(0), fPortIndex(0)
  499. {}
  500. JackPortUnRegisterRequest(int refnum, jack_port_id_t index)
  501. : JackRequestImpl(kUnRegisterPort), fRefNum(refnum), fPortIndex(index)
  502. {}
  503. int Read(detail::JackChannelTransactionInterface* trans) override
  504. {
  505. CheckSize();
  506. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  507. CheckRes(trans->Read(&fPortIndex, sizeof(jack_port_id_t)));
  508. return 0;
  509. }
  510. int Write(detail::JackChannelTransactionInterface* trans) override
  511. {
  512. CheckRes(WritePacketInit());
  513. CheckRes(WritePacket(&fRefNum, sizeof(int)));
  514. CheckRes(WritePacket(&fPortIndex, sizeof(jack_port_id_t)));
  515. return JackRequestImpl::Write(trans);
  516. }
  517. };
  518. /*!
  519. \brief PortConnectName request.
  520. */
  521. struct JackPortConnectNameRequest : public JackRequestImpl<sizeof(int) + 2 * REAL_JACK_PORT_NAME_SIZE_1>
  522. {
  523. int fRefNum;
  524. char fSrc[REAL_JACK_PORT_NAME_SIZE_1]; // port full name
  525. char fDst[REAL_JACK_PORT_NAME_SIZE_1]; // port full name
  526. JackPortConnectNameRequest()
  527. : JackRequestImpl(kConnectNamePorts), fRefNum(0)
  528. {
  529. memset(fSrc, 0, sizeof(fSrc));
  530. memset(fDst, 0, sizeof(fDst));
  531. }
  532. JackPortConnectNameRequest(int refnum, const char* src_name, const char* dst_name)
  533. : JackRequestImpl(kConnectNamePorts), fRefNum(refnum)
  534. {
  535. memset(fSrc, 0, sizeof(fSrc));
  536. memset(fDst, 0, sizeof(fDst));
  537. strncpy(fSrc, src_name, sizeof(fSrc)-1);
  538. strncpy(fDst, dst_name, sizeof(fDst)-1);
  539. }
  540. int Read(detail::JackChannelTransactionInterface* trans) override
  541. {
  542. CheckSize();
  543. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  544. CheckRes(trans->Read(&fSrc, sizeof(fSrc)));
  545. CheckRes(trans->Read(&fDst, sizeof(fDst)));
  546. return 0;
  547. }
  548. int Write(detail::JackChannelTransactionInterface* trans) override
  549. {
  550. CheckRes(WritePacketInit());
  551. CheckRes(WritePacket(&fRefNum, sizeof(int)));
  552. CheckRes(WritePacket(&fSrc, sizeof(fSrc)));
  553. CheckRes(WritePacket(&fDst, sizeof(fDst)));
  554. return JackRequestImpl::Write(trans);
  555. }
  556. };
  557. /*!
  558. \brief PortDisconnectName request.
  559. */
  560. struct JackPortDisconnectNameRequest : public JackRequestImpl<sizeof(int) + 2 * REAL_JACK_PORT_NAME_SIZE_1>
  561. {
  562. int fRefNum;
  563. char fSrc[REAL_JACK_PORT_NAME_SIZE_1]; // port full name
  564. char fDst[REAL_JACK_PORT_NAME_SIZE_1]; // port full name
  565. JackPortDisconnectNameRequest()
  566. : JackRequestImpl(kDisconnectNamePorts), fRefNum(0)
  567. {
  568. memset(fSrc, 0, sizeof(fSrc));
  569. memset(fDst, 0, sizeof(fDst));
  570. }
  571. JackPortDisconnectNameRequest(int refnum, const char* src_name, const char* dst_name)
  572. : JackRequestImpl(kDisconnectNamePorts), fRefNum(refnum)
  573. {
  574. memset(fSrc, 0, sizeof(fSrc));
  575. memset(fDst, 0, sizeof(fDst));
  576. strncpy(fSrc, src_name, sizeof(fSrc)-1);
  577. strncpy(fDst, dst_name, sizeof(fDst)-1);
  578. }
  579. int Read(detail::JackChannelTransactionInterface* trans) override
  580. {
  581. CheckSize();
  582. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  583. CheckRes(trans->Read(&fSrc, sizeof(fSrc)));
  584. CheckRes(trans->Read(&fDst, sizeof(fDst)));
  585. return 0;
  586. }
  587. int Write(detail::JackChannelTransactionInterface* trans) override
  588. {
  589. CheckRes(WritePacketInit());
  590. CheckRes(WritePacket(&fRefNum, sizeof(int)));
  591. CheckRes(WritePacket(&fSrc, sizeof(fSrc)));
  592. CheckRes(WritePacket(&fDst, sizeof(fDst)));
  593. return JackRequestImpl::Write(trans);
  594. }
  595. };
  596. /*!
  597. \brief PortConnect request.
  598. */
  599. struct JackPortConnectRequest : public JackRequestImpl<sizeof(int) + 2 * sizeof(jack_port_id_t)>
  600. {
  601. int fRefNum;
  602. jack_port_id_t fSrc;
  603. jack_port_id_t fDst;
  604. JackPortConnectRequest()
  605. : JackRequestImpl(kConnectPorts), fRefNum(0), fSrc(0), fDst(0)
  606. {}
  607. JackPortConnectRequest(int refnum, jack_port_id_t src, jack_port_id_t dst)
  608. : JackRequestImpl(kConnectPorts), fRefNum(refnum), fSrc(src), fDst(dst)
  609. {}
  610. int Read(detail::JackChannelTransactionInterface* trans) override
  611. {
  612. CheckSize();
  613. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  614. CheckRes(trans->Read(&fSrc, sizeof(jack_port_id_t)));
  615. CheckRes(trans->Read(&fDst, sizeof(jack_port_id_t)));
  616. return 0;
  617. }
  618. int Write(detail::JackChannelTransactionInterface* trans) override
  619. {
  620. CheckRes(WritePacketInit());
  621. CheckRes(WritePacket(&fRefNum, sizeof(int)));
  622. CheckRes(WritePacket(&fSrc, sizeof(jack_port_id_t)));
  623. CheckRes(WritePacket(&fDst, sizeof(jack_port_id_t)));
  624. return JackRequestImpl::Write(trans);
  625. }
  626. };
  627. /*!
  628. \brief PortDisconnect request.
  629. */
  630. struct JackPortDisconnectRequest : public JackRequestImpl<sizeof(int) + 2 * sizeof(jack_port_id_t)>
  631. {
  632. int fRefNum;
  633. jack_port_id_t fSrc;
  634. jack_port_id_t fDst;
  635. JackPortDisconnectRequest()
  636. : JackRequestImpl(kDisconnectPorts), fRefNum(0), fSrc(0), fDst(0)
  637. {}
  638. JackPortDisconnectRequest(int refnum, jack_port_id_t src, jack_port_id_t dst)
  639. : JackRequestImpl(kDisconnectPorts), fRefNum(refnum), fSrc(src), fDst(dst)
  640. {}
  641. int Read(detail::JackChannelTransactionInterface* trans) override
  642. {
  643. CheckSize();
  644. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  645. CheckRes(trans->Read(&fSrc, sizeof(jack_port_id_t)));
  646. CheckRes(trans->Read(&fDst, sizeof(jack_port_id_t)));
  647. return 0;
  648. }
  649. int Write(detail::JackChannelTransactionInterface* trans) override
  650. {
  651. CheckRes(WritePacketInit());
  652. CheckRes(WritePacket(&fRefNum, sizeof(int)));
  653. CheckRes(WritePacket(&fSrc, sizeof(jack_port_id_t)));
  654. CheckRes(WritePacket(&fDst, sizeof(jack_port_id_t)));
  655. return JackRequestImpl::Write(trans);
  656. }
  657. };
  658. /*!
  659. \brief PortRename request.
  660. */
  661. struct JackPortRenameRequest : public JackRequestImpl<sizeof(int) + sizeof(jack_port_id_t) + JACK_PORT_NAME_SIZE_1>
  662. {
  663. int fRefNum;
  664. jack_port_id_t fPort;
  665. char fName[JACK_PORT_NAME_SIZE_1]; // port short name
  666. JackPortRenameRequest()
  667. : JackRequestImpl(kPortRename), fRefNum(0), fPort(0)
  668. {
  669. memset(fName, 0, sizeof(fName));
  670. }
  671. JackPortRenameRequest(int refnum, jack_port_id_t port, const char* name)
  672. : JackRequestImpl(kPortRename), fRefNum(refnum), fPort(port)
  673. {
  674. memset(fName, 0, sizeof(fName));
  675. strncpy(fName, name, sizeof(fName)-1);
  676. }
  677. int Read(detail::JackChannelTransactionInterface* trans) override
  678. {
  679. CheckSize();
  680. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  681. CheckRes(trans->Read(&fPort, sizeof(jack_port_id_t)));
  682. CheckRes(trans->Read(&fName, sizeof(fName)));
  683. return 0;
  684. }
  685. int Write(detail::JackChannelTransactionInterface* trans) override
  686. {
  687. CheckRes(WritePacketInit());
  688. CheckRes(WritePacket(&fRefNum, sizeof(int)));
  689. CheckRes(WritePacket(&fPort, sizeof(jack_port_id_t)));
  690. CheckRes(WritePacket(&fName, sizeof(fName)));
  691. return JackRequestImpl::Write(trans);
  692. }
  693. };
  694. /*!
  695. \brief SetBufferSize request.
  696. */
  697. struct JackSetBufferSizeRequest : public JackRequestImpl<sizeof(jack_nframes_t)>
  698. {
  699. jack_nframes_t fBufferSize;
  700. JackSetBufferSizeRequest()
  701. : JackRequestImpl(kSetBufferSize), fBufferSize(0)
  702. {}
  703. JackSetBufferSizeRequest(jack_nframes_t buffer_size)
  704. : JackRequestImpl(kSetBufferSize), fBufferSize(buffer_size)
  705. {}
  706. int Read(detail::JackChannelTransactionInterface* trans) override
  707. {
  708. CheckSize();
  709. return trans->Read(&fBufferSize, sizeof(jack_nframes_t));
  710. }
  711. int Write(detail::JackChannelTransactionInterface* trans) override
  712. {
  713. CheckRes(WritePacketInit());
  714. CheckRes(WritePacket(&fBufferSize, sizeof(jack_nframes_t)));
  715. return JackRequestImpl::Write(trans);
  716. }
  717. };
  718. /*!
  719. \brief SetFreeWheel request.
  720. */
  721. struct JackSetFreeWheelRequest : public JackRequestImpl<sizeof(int)>
  722. {
  723. int fOnOff;
  724. JackSetFreeWheelRequest()
  725. : JackRequestImpl(kSetFreeWheel), fOnOff(0)
  726. {}
  727. JackSetFreeWheelRequest(int onoff)
  728. : JackRequestImpl(kSetFreeWheel), fOnOff(onoff)
  729. {}
  730. int Read(detail::JackChannelTransactionInterface* trans) override
  731. {
  732. CheckSize();
  733. return trans->Read(&fOnOff, sizeof(int));
  734. }
  735. int Write(detail::JackChannelTransactionInterface* trans) override
  736. {
  737. CheckRes(WritePacketInit());
  738. CheckRes(WritePacket(&fOnOff, sizeof(int)));
  739. return JackRequestImpl::Write(trans);
  740. }
  741. };
  742. /*!
  743. \brief ComputeTotalLatencies request.
  744. */
  745. struct JackComputeTotalLatenciesRequest : public JackRequestImpl<0>
  746. {
  747. JackComputeTotalLatenciesRequest()
  748. : JackRequestImpl(kComputeTotalLatencies)
  749. {}
  750. int Read(detail::JackChannelTransactionInterface* trans) override
  751. {
  752. CheckSize();
  753. return 0;
  754. }
  755. int Write(detail::JackChannelTransactionInterface* trans) override
  756. {
  757. CheckRes(WritePacketInit());
  758. return JackRequestImpl::Write(trans);
  759. }
  760. };
  761. /*!
  762. \brief ReleaseTimebase request.
  763. */
  764. struct JackReleaseTimebaseRequest : public JackRequestImpl<sizeof(int)>
  765. {
  766. int fRefNum;
  767. JackReleaseTimebaseRequest()
  768. : JackRequestImpl(kReleaseTimebase), fRefNum(0)
  769. {}
  770. JackReleaseTimebaseRequest(int refnum)
  771. : JackRequestImpl(kReleaseTimebase), fRefNum(refnum)
  772. {}
  773. int Read(detail::JackChannelTransactionInterface* trans) override
  774. {
  775. CheckSize();
  776. return trans->Read(&fRefNum, sizeof(int));
  777. }
  778. int Write(detail::JackChannelTransactionInterface* trans) override
  779. {
  780. CheckRes(WritePacketInit());
  781. CheckRes(WritePacket(&fRefNum, sizeof(int)));
  782. return JackRequestImpl::Write(trans);
  783. }
  784. };
  785. /*!
  786. \brief SetTimebaseCallback request.
  787. */
  788. struct JackSetTimebaseCallbackRequest : public JackRequestImpl<sizeof(int) + sizeof(int)>
  789. {
  790. int fRefNum;
  791. int fConditionnal;
  792. JackSetTimebaseCallbackRequest()
  793. : JackRequestImpl(kSetTimebaseCallback), fRefNum(0), fConditionnal(0)
  794. {}
  795. JackSetTimebaseCallbackRequest(int refnum, int conditional)
  796. : JackRequestImpl(kSetTimebaseCallback), fRefNum(refnum), fConditionnal(conditional)
  797. {}
  798. int Read(detail::JackChannelTransactionInterface* trans) override
  799. {
  800. CheckSize();
  801. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  802. return trans->Read(&fConditionnal, sizeof(int));
  803. }
  804. int Write(detail::JackChannelTransactionInterface* trans) override
  805. {
  806. CheckRes(WritePacketInit());
  807. CheckRes(WritePacket(&fRefNum, sizeof(int)));
  808. CheckRes(WritePacket(&fConditionnal, sizeof(int)));
  809. return JackRequestImpl::Write(trans);
  810. }
  811. };
  812. /*!
  813. \brief GetInternalClientName request.
  814. */
  815. struct JackGetInternalClientNameRequest : public JackRequestImpl<sizeof(int) + sizeof(int)>
  816. {
  817. int fRefNum;
  818. int fIntRefNum;
  819. JackGetInternalClientNameRequest()
  820. : JackRequestImpl(kGetInternalClientName), fRefNum(0), fIntRefNum(0)
  821. {}
  822. JackGetInternalClientNameRequest(int refnum, int int_ref)
  823. : JackRequestImpl(kGetInternalClientName), fRefNum(refnum), fIntRefNum(int_ref)
  824. {}
  825. int Read(detail::JackChannelTransactionInterface* trans) override
  826. {
  827. CheckSize();
  828. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  829. return trans->Read(&fIntRefNum, sizeof(int));
  830. }
  831. int Write(detail::JackChannelTransactionInterface* trans) override
  832. {
  833. CheckRes(WritePacketInit());
  834. CheckRes(WritePacket(&fRefNum, sizeof(int)));
  835. CheckRes(WritePacket(&fIntRefNum, sizeof(int)));
  836. return JackRequestImpl::Write(trans);
  837. }
  838. };
  839. /*!
  840. \brief GetInternalClient result.
  841. */
  842. struct JackGetInternalClientNameResult : public JackResult
  843. {
  844. char fName[JACK_CLIENT_NAME_SIZE+1];
  845. JackGetInternalClientNameResult(): JackResult()
  846. {
  847. memset(fName, 0, sizeof(fName));
  848. }
  849. JackGetInternalClientNameResult(int32_t result, const char* name)
  850. : JackResult(result)
  851. {
  852. memset(fName, 0, sizeof(fName));
  853. snprintf(fName, sizeof(fName), "%s", name);
  854. }
  855. int Read(detail::JackChannelTransactionInterface* trans) override
  856. {
  857. CheckRes(JackResult::Read(trans));
  858. CheckRes(trans->Read(&fName, sizeof(fName)));
  859. return 0;
  860. }
  861. int Write(detail::JackChannelTransactionInterface* trans) override
  862. {
  863. CheckRes(JackResult::Write(trans));
  864. CheckRes(trans->Write(&fName, sizeof(fName)));
  865. return 0;
  866. }
  867. int Size() const { return sizeof(fName); }
  868. };
  869. /*!
  870. \brief InternalClientHandle request.
  871. */
  872. struct JackInternalClientHandleRequest : public JackRequestImpl<sizeof(int) + JACK_CLIENT_NAME_SIZE_1>
  873. {
  874. int fRefNum;
  875. char fName[JACK_CLIENT_NAME_SIZE_1];
  876. JackInternalClientHandleRequest()
  877. : JackRequestImpl(kInternalClientHandle), fRefNum(0)
  878. {
  879. memset(fName, 0, sizeof(fName));
  880. }
  881. JackInternalClientHandleRequest(int refnum, const char* client_name)
  882. : JackRequestImpl(kInternalClientHandle), fRefNum(refnum)
  883. {
  884. memset(fName, 0, sizeof(fName));
  885. snprintf(fName, sizeof(fName), "%s", client_name);
  886. }
  887. int Read(detail::JackChannelTransactionInterface* trans) override
  888. {
  889. CheckSize();
  890. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  891. return trans->Read(&fName, sizeof(fName));
  892. }
  893. int Write(detail::JackChannelTransactionInterface* trans) override
  894. {
  895. CheckRes(WritePacketInit());
  896. CheckRes(WritePacket(&fRefNum, sizeof(int)));
  897. CheckRes(WritePacket(&fName, sizeof(fName)));
  898. return JackRequestImpl::Write(trans);
  899. }
  900. };
  901. /*!
  902. \brief InternalClientHandle result.
  903. */
  904. struct JackInternalClientHandleResult : public JackResult
  905. {
  906. int fStatus;
  907. int fIntRefNum;
  908. JackInternalClientHandleResult(): JackResult(), fStatus(0), fIntRefNum(0)
  909. {}
  910. JackInternalClientHandleResult(int32_t result, int status, int int_ref)
  911. : JackResult(result), fStatus(status), fIntRefNum(int_ref)
  912. {}
  913. int Read(detail::JackChannelTransactionInterface* trans) override
  914. {
  915. CheckRes(JackResult::Read(trans));
  916. CheckRes(trans->Read(&fStatus, sizeof(int)));
  917. CheckRes(trans->Read(&fIntRefNum, sizeof(int)));
  918. return 0;
  919. }
  920. int Write(detail::JackChannelTransactionInterface* trans) override
  921. {
  922. CheckRes(JackResult::Write(trans));
  923. CheckRes(trans->Write(&fStatus, sizeof(int)));
  924. CheckRes(trans->Write(&fIntRefNum, sizeof(int)));
  925. return 0;
  926. }
  927. int Size() const { return sizeof(int) + sizeof(int); }
  928. };
  929. /*!
  930. \brief InternalClientLoad request.
  931. */
  932. #ifndef MAX_PATH
  933. #define MAX_PATH 256
  934. #endif
  935. #define MAX_PATH_1 (MAX_PATH + 1)
  936. struct JackInternalClientLoadRequest : public JackRequestImpl<sizeof(int) + JACK_CLIENT_NAME_SIZE_1 + MAX_PATH_1 + JACK_LOAD_INIT_LIMIT_1 + sizeof(int) + sizeof(jack_uuid_t)>
  937. {
  938. int fRefNum;
  939. char fName[JACK_CLIENT_NAME_SIZE_1];
  940. char fDllName[MAX_PATH_1];
  941. char fLoadInitName[JACK_LOAD_INIT_LIMIT_1];
  942. int fOptions;
  943. jack_uuid_t fUUID;
  944. JackInternalClientLoadRequest()
  945. : JackRequestImpl(kInternalClientLoad), fRefNum(0), fOptions(0), fUUID(JACK_UUID_EMPTY_INITIALIZER)
  946. {
  947. memset(fName, 0, sizeof(fName));
  948. memset(fDllName, 0, sizeof(fDllName));
  949. memset(fLoadInitName, 0, sizeof(fLoadInitName));
  950. }
  951. JackInternalClientLoadRequest(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, jack_uuid_t uuid )
  952. : JackRequestImpl(kInternalClientLoad), fRefNum(refnum), fOptions(options), fUUID(uuid)
  953. {
  954. memset(fName, 0, sizeof(fName));
  955. memset(fDllName, 0, sizeof(fDllName));
  956. memset(fLoadInitName, 0, sizeof(fLoadInitName));
  957. strncpy(fName, client_name, sizeof(fName)-1);
  958. if (so_name) {
  959. strncpy(fDllName, so_name, sizeof(fDllName)-1);
  960. }
  961. if (objet_data) {
  962. strncpy(fLoadInitName, objet_data, sizeof(fLoadInitName)-1);
  963. }
  964. }
  965. int Read(detail::JackChannelTransactionInterface* trans) override
  966. {
  967. CheckSize();
  968. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  969. CheckRes(trans->Read(&fName, sizeof(fName)));
  970. CheckRes(trans->Read(&fDllName, sizeof(fDllName)));
  971. CheckRes(trans->Read(&fLoadInitName, sizeof(fLoadInitName)));
  972. CheckRes(trans->Read(&fUUID, sizeof(jack_uuid_t)));
  973. return trans->Read(&fOptions, sizeof(int));
  974. }
  975. int Write(detail::JackChannelTransactionInterface* trans) override
  976. {
  977. CheckRes(WritePacketInit());
  978. CheckRes(WritePacket(&fRefNum, sizeof(int)));
  979. CheckRes(WritePacket(&fName, sizeof(fName)));
  980. CheckRes(WritePacket(&fDllName, sizeof(fDllName)));
  981. CheckRes(WritePacket(&fLoadInitName, sizeof(fLoadInitName)));
  982. CheckRes(WritePacket(&fUUID, sizeof(jack_uuid_t)));
  983. CheckRes(WritePacket(&fOptions, sizeof(int)));
  984. return JackRequestImpl::Write(trans);
  985. }
  986. };
  987. /*!
  988. \brief InternalClientLoad result.
  989. */
  990. struct JackInternalClientLoadResult : public JackResult
  991. {
  992. int fStatus;
  993. int fIntRefNum;
  994. JackInternalClientLoadResult(): JackResult(), fStatus(0), fIntRefNum(0)
  995. {}
  996. JackInternalClientLoadResult(int32_t result, int status, int int_ref)
  997. : JackResult(result), fStatus(status), fIntRefNum(int_ref)
  998. {}
  999. int Read(detail::JackChannelTransactionInterface* trans) override
  1000. {
  1001. CheckRes(JackResult::Read(trans));
  1002. CheckRes(trans->Read(&fStatus, sizeof(int)));
  1003. CheckRes(trans->Read(&fIntRefNum, sizeof(int)));
  1004. return 0;
  1005. }
  1006. int Write(detail::JackChannelTransactionInterface* trans) override
  1007. {
  1008. CheckRes(JackResult::Write(trans));
  1009. CheckRes(trans->Write(&fStatus, sizeof(int)));
  1010. CheckRes(trans->Write(&fIntRefNum, sizeof(int)));
  1011. return 0;
  1012. }
  1013. int Size() const { return sizeof(int) + sizeof(int); }
  1014. };
  1015. /*!
  1016. \brief InternalClientUnload request.
  1017. */
  1018. struct JackInternalClientUnloadRequest : public JackRequestImpl<sizeof(int) + sizeof(int)>
  1019. {
  1020. int fRefNum;
  1021. int fIntRefNum;
  1022. JackInternalClientUnloadRequest()
  1023. : JackRequestImpl(kInternalClientUnload), fRefNum(0), fIntRefNum(0)
  1024. {}
  1025. JackInternalClientUnloadRequest(int refnum, int int_ref)
  1026. : JackRequestImpl(kInternalClientUnload), fRefNum(refnum), fIntRefNum(int_ref)
  1027. {}
  1028. int Read(detail::JackChannelTransactionInterface* trans) override
  1029. {
  1030. CheckSize();
  1031. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  1032. return trans->Read(&fIntRefNum, sizeof(int));
  1033. }
  1034. int Write(detail::JackChannelTransactionInterface* trans) override
  1035. {
  1036. CheckRes(WritePacketInit());
  1037. CheckRes(WritePacket(&fRefNum, sizeof(int)));
  1038. CheckRes(WritePacket(&fIntRefNum, sizeof(int)));
  1039. return JackRequestImpl::Write(trans);
  1040. }
  1041. };
  1042. /*!
  1043. \brief InternalClientLoad result.
  1044. */
  1045. struct JackInternalClientUnloadResult : public JackResult
  1046. {
  1047. int fStatus;
  1048. JackInternalClientUnloadResult(): JackResult(), fStatus(0)
  1049. {}
  1050. JackInternalClientUnloadResult(int32_t result, int status)
  1051. : JackResult(result), fStatus(status)
  1052. {}
  1053. int Read(detail::JackChannelTransactionInterface* trans) override
  1054. {
  1055. CheckRes(JackResult::Read(trans));
  1056. CheckRes(trans->Read(&fStatus, sizeof(int)));
  1057. return 0;
  1058. }
  1059. int Write(detail::JackChannelTransactionInterface* trans) override
  1060. {
  1061. CheckRes(JackResult::Write(trans));
  1062. CheckRes(trans->Write(&fStatus, sizeof(int)));
  1063. return 0;
  1064. }
  1065. int Size() const { return sizeof(int); }
  1066. };
  1067. /*!
  1068. \brief ClientNotification request.
  1069. */
  1070. struct JackClientNotificationRequest : public JackRequestImpl<3 * sizeof(int)>
  1071. {
  1072. int fRefNum;
  1073. int fNotify;
  1074. int fValue;
  1075. JackClientNotificationRequest()
  1076. : JackRequestImpl(kNotification), fRefNum(0), fNotify(0), fValue(0)
  1077. {}
  1078. JackClientNotificationRequest(int refnum, int notify, int value)
  1079. : JackRequestImpl(kNotification), fRefNum(refnum), fNotify(notify), fValue(value)
  1080. {}
  1081. int Read(detail::JackChannelTransactionInterface* trans) override
  1082. {
  1083. CheckSize();
  1084. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  1085. CheckRes(trans->Read(&fNotify, sizeof(int)));
  1086. CheckRes(trans->Read(&fValue, sizeof(int)));
  1087. return 0;
  1088. }
  1089. int Write(detail::JackChannelTransactionInterface* trans) override
  1090. {
  1091. CheckRes(WritePacketInit());
  1092. CheckRes(WritePacket(&fRefNum, sizeof(int)));
  1093. CheckRes(WritePacket(&fNotify, sizeof(int)));
  1094. CheckRes(WritePacket(&fValue, sizeof(int)));
  1095. return JackRequestImpl::Write(trans);
  1096. }
  1097. };
  1098. struct JackSessionCommand
  1099. {
  1100. char fUUID[JACK_UUID_STRING_SIZE];
  1101. char fClientName[JACK_CLIENT_NAME_SIZE+1];
  1102. char fCommand[JACK_SESSION_COMMAND_SIZE+1];
  1103. jack_session_flags_t fFlags;
  1104. JackSessionCommand() : fFlags(JackSessionSaveError)
  1105. {
  1106. memset(fUUID, 0, sizeof(fUUID));
  1107. memset(fClientName, 0, sizeof(fClientName));
  1108. memset(fCommand, 0, sizeof(fCommand));
  1109. }
  1110. JackSessionCommand(const char *uuid, const char *clientname, const char *command, jack_session_flags_t flags)
  1111. {
  1112. memset(fUUID, 0, sizeof(fUUID));
  1113. memset(fClientName, 0, sizeof(fClientName));
  1114. memset(fCommand, 0, sizeof(fCommand));
  1115. strncpy(fUUID, uuid, sizeof(fUUID)-1);
  1116. strncpy(fClientName, clientname, sizeof(fClientName)-1);
  1117. strncpy(fCommand, command, sizeof(fCommand)-1);
  1118. fFlags = flags;
  1119. }
  1120. };
  1121. struct JackSessionNotifyResult : public JackResult
  1122. {
  1123. std::list<JackSessionCommand> fCommandList;
  1124. bool fDone;
  1125. JackSessionNotifyResult(): JackResult(), fDone(false)
  1126. {}
  1127. JackSessionNotifyResult(int32_t result)
  1128. : JackResult(result), fDone(false)
  1129. {}
  1130. int Read(detail::JackChannelTransactionInterface* trans) override
  1131. {
  1132. if (trans == NULL)
  1133. {
  1134. return 0;
  1135. }
  1136. CheckRes(JackResult::Read(trans));
  1137. while (true) {
  1138. JackSessionCommand buffer;
  1139. CheckRes(trans->Read(buffer.fUUID, sizeof(buffer.fUUID)));
  1140. if (buffer.fUUID[0] == '\0')
  1141. break;
  1142. CheckRes(trans->Read(buffer.fClientName, sizeof(buffer.fClientName)));
  1143. CheckRes(trans->Read(buffer.fCommand, sizeof(buffer.fCommand)));
  1144. CheckRes(trans->Read(&(buffer.fFlags), sizeof(buffer.fFlags)));
  1145. fCommandList.push_back(buffer);
  1146. }
  1147. fDone = true;
  1148. return 0;
  1149. }
  1150. int Write(detail::JackChannelTransactionInterface* trans) override
  1151. {
  1152. if (trans == NULL)
  1153. {
  1154. fDone = true;
  1155. return 0;
  1156. }
  1157. char terminator[JACK_UUID_STRING_SIZE];
  1158. memset(terminator, 0, sizeof(terminator));
  1159. CheckRes(JackResult::Write(trans));
  1160. for (std::list<JackSessionCommand>::iterator i = fCommandList.begin(); i != fCommandList.end(); i++) {
  1161. CheckRes(trans->Write(i->fUUID, sizeof(i->fUUID)));
  1162. CheckRes(trans->Write(i->fClientName, sizeof(i->fClientName)));
  1163. CheckRes(trans->Write(i->fCommand, sizeof(i->fCommand)));
  1164. CheckRes(trans->Write(&(i->fFlags), sizeof(i->fFlags)));
  1165. }
  1166. CheckRes(trans->Write(terminator, sizeof(terminator)));
  1167. return 0;
  1168. }
  1169. jack_session_command_t* GetCommands()
  1170. {
  1171. /* TODO: some kind of signal should be used instead */
  1172. while (!fDone)
  1173. {
  1174. JackSleep(50000); /* 50 ms */
  1175. }
  1176. jack_session_command_t* session_command = (jack_session_command_t *)malloc(sizeof(jack_session_command_t) * (fCommandList.size() + 1));
  1177. int i = 0;
  1178. for (std::list<JackSessionCommand>::iterator ci = fCommandList.begin(); ci != fCommandList.end(); ci++) {
  1179. session_command[i].uuid = strdup(ci->fUUID);
  1180. session_command[i].client_name = strdup(ci->fClientName);
  1181. session_command[i].command = strdup(ci->fCommand);
  1182. session_command[i].flags = ci->fFlags;
  1183. i += 1;
  1184. }
  1185. session_command[i].uuid = NULL;
  1186. session_command[i].client_name = NULL;
  1187. session_command[i].command = NULL;
  1188. session_command[i].flags = (jack_session_flags_t)0;
  1189. return session_command;
  1190. }
  1191. };
  1192. /*!
  1193. \brief SessionNotify request.
  1194. */
  1195. struct JackSessionNotifyRequest : public JackRequestImpl<JACK_MESSAGE_SIZE_1 + JACK_CLIENT_NAME_SIZE_1 + sizeof(jack_session_event_type_t) + sizeof(int)>
  1196. {
  1197. char fPath[JACK_MESSAGE_SIZE_1];
  1198. char fDst[JACK_CLIENT_NAME_SIZE_1];
  1199. jack_session_event_type_t fEventType;
  1200. int fRefNum;
  1201. JackSessionNotifyRequest()
  1202. : JackRequestImpl(kSessionNotify), fEventType(JackSessionSave), fRefNum(0)
  1203. {}
  1204. JackSessionNotifyRequest(int refnum, const char* path, jack_session_event_type_t type, const char* dst)
  1205. : JackRequestImpl(kSessionNotify), fEventType(type), fRefNum(refnum)
  1206. {
  1207. memset(fPath, 0, sizeof(fPath));
  1208. memset(fDst, 0, sizeof(fDst));
  1209. strncpy(fPath, path, sizeof(fPath)-1);
  1210. if (dst) {
  1211. strncpy(fDst, dst, sizeof(fDst)-1);
  1212. }
  1213. }
  1214. int Read(detail::JackChannelTransactionInterface* trans) override
  1215. {
  1216. CheckSize();
  1217. CheckRes(trans->Read(&fRefNum, sizeof(fRefNum)));
  1218. CheckRes(trans->Read(&fPath, sizeof(fPath)));
  1219. CheckRes(trans->Read(&fDst, sizeof(fDst)));
  1220. CheckRes(trans->Read(&fEventType, sizeof(fEventType)));
  1221. return 0;
  1222. }
  1223. int Write(detail::JackChannelTransactionInterface* trans) override
  1224. {
  1225. CheckRes(WritePacketInit());
  1226. CheckRes(WritePacket(&fRefNum, sizeof(fRefNum)));
  1227. CheckRes(WritePacket(&fPath, sizeof(fPath)));
  1228. CheckRes(WritePacket(&fDst, sizeof(fDst)));
  1229. CheckRes(WritePacket(&fEventType, sizeof(fEventType)));
  1230. return JackRequestImpl::Write(trans);
  1231. }
  1232. };
  1233. struct JackSessionReplyRequest : public JackRequestImpl<sizeof(int)>
  1234. {
  1235. int fRefNum;
  1236. JackSessionReplyRequest()
  1237. : JackRequestImpl(kSessionReply), fRefNum(0)
  1238. {}
  1239. JackSessionReplyRequest(int refnum)
  1240. : JackRequestImpl(kSessionReply), fRefNum(refnum)
  1241. {}
  1242. int Read(detail::JackChannelTransactionInterface* trans) override
  1243. {
  1244. CheckSize();
  1245. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  1246. return 0;
  1247. }
  1248. int Write(detail::JackChannelTransactionInterface* trans) override
  1249. {
  1250. CheckRes(WritePacketInit());
  1251. CheckRes(WritePacket(&fRefNum, sizeof(int)));
  1252. return JackRequestImpl::Write(trans);
  1253. }
  1254. };
  1255. struct JackClientNameResult : public JackResult
  1256. {
  1257. char fName[JACK_CLIENT_NAME_SIZE+1];
  1258. JackClientNameResult(): JackResult()
  1259. {
  1260. memset(fName, 0, sizeof(fName));
  1261. }
  1262. JackClientNameResult(int32_t result, const char* name)
  1263. : JackResult(result)
  1264. {
  1265. memset(fName, 0, sizeof(fName));
  1266. strncpy(fName, name, sizeof(fName)-1);
  1267. }
  1268. int Read(detail::JackChannelTransactionInterface* trans) override
  1269. {
  1270. CheckRes(JackResult::Read(trans));
  1271. CheckRes(trans->Read(&fName, sizeof(fName)));
  1272. return 0;
  1273. }
  1274. int Write(detail::JackChannelTransactionInterface* trans) override
  1275. {
  1276. CheckRes(JackResult::Write(trans));
  1277. CheckRes(trans->Write(&fName, sizeof(fName)));
  1278. return 0;
  1279. }
  1280. };
  1281. struct JackUUIDResult : public JackResult
  1282. {
  1283. char fUUID[JACK_UUID_STRING_SIZE];
  1284. JackUUIDResult(): JackResult()
  1285. {
  1286. memset(fUUID, 0, sizeof(fUUID));
  1287. }
  1288. JackUUIDResult(int32_t result, const char* uuid)
  1289. : JackResult(result)
  1290. {
  1291. memset(fUUID, 0, sizeof(fUUID));
  1292. strncpy(fUUID, uuid, sizeof(fUUID)-1);
  1293. }
  1294. int Read(detail::JackChannelTransactionInterface* trans) override
  1295. {
  1296. CheckRes(JackResult::Read(trans));
  1297. CheckRes(trans->Read(&fUUID, sizeof(fUUID)));
  1298. return 0;
  1299. }
  1300. int Write(detail::JackChannelTransactionInterface* trans) override
  1301. {
  1302. CheckRes(JackResult::Write(trans));
  1303. CheckRes(trans->Write(&fUUID, sizeof(fUUID)));
  1304. return 0;
  1305. }
  1306. };
  1307. struct JackGetUUIDRequest : public JackRequestImpl<JACK_CLIENT_NAME_SIZE_1>
  1308. {
  1309. char fName[JACK_CLIENT_NAME_SIZE_1];
  1310. JackGetUUIDRequest()
  1311. : JackRequestImpl(kGetUUIDByClient)
  1312. {
  1313. memset(fName, 0, sizeof(fName));
  1314. }
  1315. JackGetUUIDRequest(const char* client_name)
  1316. : JackRequestImpl(kGetUUIDByClient)
  1317. {
  1318. memset(fName, 0, sizeof(fName));
  1319. strncpy(fName, client_name, sizeof(fName)-1);
  1320. }
  1321. int Read(detail::JackChannelTransactionInterface* trans) override
  1322. {
  1323. CheckSize();
  1324. CheckRes(trans->Read(&fName, sizeof(fName)));
  1325. return 0;
  1326. }
  1327. int Write(detail::JackChannelTransactionInterface* trans) override
  1328. {
  1329. CheckRes(WritePacketInit());
  1330. CheckRes(WritePacket(&fName, sizeof(fName)));
  1331. return JackRequestImpl::Write(trans);
  1332. }
  1333. };
  1334. struct JackGetClientNameRequest : public JackRequestImpl<JACK_UUID_STRING_SIZE>
  1335. {
  1336. char fUUID[JACK_UUID_STRING_SIZE];
  1337. JackGetClientNameRequest()
  1338. : JackRequestImpl(kGetClientByUUID)
  1339. {
  1340. memset(fUUID, 0, sizeof(fUUID));
  1341. }
  1342. JackGetClientNameRequest(const char* uuid)
  1343. : JackRequestImpl(kGetClientByUUID)
  1344. {
  1345. memset(fUUID, 0, sizeof(fUUID));
  1346. strncpy(fUUID, uuid, sizeof(fUUID)-1);
  1347. }
  1348. int Read(detail::JackChannelTransactionInterface* trans) override
  1349. {
  1350. CheckSize();
  1351. CheckRes(trans->Read(&fUUID, sizeof(fUUID)));
  1352. return 0;
  1353. }
  1354. int Write(detail::JackChannelTransactionInterface* trans) override
  1355. {
  1356. CheckRes(WritePacketInit());
  1357. CheckRes(WritePacket(&fUUID, sizeof(fUUID)));
  1358. return JackRequestImpl::Write(trans);
  1359. }
  1360. };
  1361. struct JackReserveNameRequest : public JackRequestImpl<sizeof(int) + JACK_CLIENT_NAME_SIZE_1 + JACK_UUID_STRING_SIZE>
  1362. {
  1363. int fRefNum;
  1364. char fName[JACK_CLIENT_NAME_SIZE_1];
  1365. char fUUID[JACK_UUID_STRING_SIZE];
  1366. JackReserveNameRequest()
  1367. : JackRequestImpl(kReserveClientName), fRefNum(0)
  1368. {
  1369. memset(fName, 0, sizeof(fName));
  1370. memset(fUUID, 0, sizeof(fUUID));
  1371. }
  1372. JackReserveNameRequest(int refnum, const char *name, const char* uuid)
  1373. : JackRequestImpl(kReserveClientName), fRefNum(refnum)
  1374. {
  1375. memset(fName, 0, sizeof(fName));
  1376. memset(fUUID, 0, sizeof(fUUID));
  1377. strncpy(fName, name, sizeof(fName)-1);
  1378. strncpy(fUUID, uuid, sizeof(fUUID)-1);
  1379. }
  1380. int Read(detail::JackChannelTransactionInterface* trans) override
  1381. {
  1382. CheckSize();
  1383. CheckRes(trans->Read(&fUUID, sizeof(fUUID)));
  1384. CheckRes(trans->Read(&fName, sizeof(fName)));
  1385. CheckRes(trans->Read(&fRefNum, sizeof(fRefNum)));
  1386. return 0;
  1387. }
  1388. int Write(detail::JackChannelTransactionInterface* trans) override
  1389. {
  1390. CheckRes(WritePacketInit());
  1391. CheckRes(WritePacket(&fUUID, sizeof(fUUID)));
  1392. CheckRes(WritePacket(&fName, sizeof(fName)));
  1393. CheckRes(WritePacket(&fRefNum, sizeof(fRefNum)));
  1394. return JackRequestImpl::Write(trans);
  1395. }
  1396. };
  1397. struct JackClientHasSessionCallbackRequest : public JackRequestImpl<JACK_CLIENT_NAME_SIZE_1>
  1398. {
  1399. char fName[JACK_CLIENT_NAME_SIZE_1];
  1400. JackClientHasSessionCallbackRequest()
  1401. : JackRequestImpl(kClientHasSessionCallback)
  1402. {
  1403. memset(fName, 0, sizeof(fName));
  1404. }
  1405. JackClientHasSessionCallbackRequest(const char *name)
  1406. : JackRequestImpl(kClientHasSessionCallback)
  1407. {
  1408. memset(fName, 0, sizeof(fName));
  1409. strncpy(fName, name, sizeof(fName)-1);
  1410. }
  1411. int Read(detail::JackChannelTransactionInterface* trans) override
  1412. {
  1413. CheckSize();
  1414. CheckRes(trans->Read(&fName, sizeof(fName)));
  1415. return 0;
  1416. }
  1417. int Write(detail::JackChannelTransactionInterface* trans) override
  1418. {
  1419. CheckRes(WritePacketInit());
  1420. CheckRes(WritePacket(&fName, sizeof(fName)));
  1421. return JackRequestImpl::Write(trans);
  1422. }
  1423. };
  1424. struct JackPropertyChangeNotifyRequest : public JackRequestImpl<sizeof(jack_uuid_t) + MAX_PATH_1 + sizeof(jack_property_change_t)>
  1425. {
  1426. jack_uuid_t fSubject;
  1427. char fKey[MAX_PATH_1];
  1428. jack_property_change_t fChange;
  1429. JackPropertyChangeNotifyRequest()
  1430. : JackRequestImpl(kPropertyChangeNotify), fChange((jack_property_change_t)0)
  1431. {
  1432. jack_uuid_clear(&fSubject);
  1433. memset(fKey, 0, sizeof(fKey));
  1434. }
  1435. JackPropertyChangeNotifyRequest(jack_uuid_t subject, const char* key, jack_property_change_t change)
  1436. : JackRequestImpl(kPropertyChangeNotify), fChange(change)
  1437. {
  1438. jack_uuid_copy(&fSubject, subject);
  1439. memset(fKey, 0, sizeof(fKey));
  1440. if (key)
  1441. strncpy(fKey, key, sizeof(fKey)-1);
  1442. }
  1443. int Read(detail::JackChannelTransactionInterface* trans) override
  1444. {
  1445. CheckSize();
  1446. CheckRes(trans->Read(&fSubject, sizeof(fSubject)));
  1447. CheckRes(trans->Read(&fKey, sizeof(fKey)));
  1448. CheckRes(trans->Read(&fChange, sizeof(fChange)));
  1449. return 0;
  1450. }
  1451. int Write(detail::JackChannelTransactionInterface* trans) override
  1452. {
  1453. CheckRes(WritePacketInit());
  1454. CheckRes(WritePacket(&fSubject, sizeof(fSubject)));
  1455. CheckRes(WritePacket(&fKey, sizeof(fKey)));
  1456. CheckRes(WritePacket(&fChange, sizeof(fChange)));
  1457. return JackRequestImpl::Write(trans);
  1458. }
  1459. };
  1460. /*!
  1461. \brief ClientNotification.
  1462. */
  1463. struct JackClientNotification
  1464. {
  1465. int fSize;
  1466. char fName[JACK_CLIENT_NAME_SIZE+1];
  1467. int fRefNum;
  1468. int fNotify;
  1469. int fValue1;
  1470. int fValue2;
  1471. int fSync;
  1472. char fMessage[JACK_MESSAGE_SIZE+1];
  1473. JackClientNotification(): fSize(0), fRefNum(0), fNotify(-1), fValue1(-1), fValue2(-1), fSync(0)
  1474. {
  1475. memset(fName, 0, sizeof(fName));
  1476. memset(fMessage, 0, sizeof(fMessage));
  1477. }
  1478. JackClientNotification(const char* name, int refnum, int notify, int sync, const char* message, int value1, int value2)
  1479. : fRefNum(refnum), fNotify(notify), fValue1(value1), fValue2(value2), fSync(sync)
  1480. {
  1481. memset(fName, 0, sizeof(fName));
  1482. memset(fMessage, 0, sizeof(fMessage));
  1483. strncpy(fName, name, sizeof(fName)-1);
  1484. if (message) {
  1485. strncpy(fMessage, message, sizeof(fMessage)-1);
  1486. }
  1487. fSize = Size();
  1488. }
  1489. int Read(detail::JackChannelTransactionInterface* trans)
  1490. {
  1491. CheckSize();
  1492. CheckRes(trans->Read(&fName, sizeof(fName)));
  1493. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  1494. CheckRes(trans->Read(&fNotify, sizeof(int)));
  1495. CheckRes(trans->Read(&fValue1, sizeof(int)));
  1496. CheckRes(trans->Read(&fValue2, sizeof(int)));
  1497. CheckRes(trans->Read(&fSync, sizeof(int)));
  1498. CheckRes(trans->Read(&fMessage, sizeof(fMessage)));
  1499. return 0;
  1500. }
  1501. int Write(detail::JackChannelTransactionInterface* trans)
  1502. {
  1503. CheckRes(trans->Write(&fSize, sizeof(int)));
  1504. CheckRes(trans->Write(&fName, sizeof(fName)));
  1505. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  1506. CheckRes(trans->Write(&fNotify, sizeof(int)));
  1507. CheckRes(trans->Write(&fValue1, sizeof(int)));
  1508. CheckRes(trans->Write(&fValue2, sizeof(int)));
  1509. CheckRes(trans->Write(&fSync, sizeof(int)));
  1510. CheckRes(trans->Write(&fMessage, sizeof(fMessage)));
  1511. return 0;
  1512. }
  1513. int Size() const { return sizeof(int) + sizeof(fName) + 5 * sizeof(int) + sizeof(fMessage); }
  1514. };
  1515. } // end of namespace
  1516. #endif