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.

1095 lines
27KB

  1. /*
  2. Copyright (C) 2001 Paul Davis
  3. Copyright (C) 2004-2008 Grame
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU Lesser General Public License as published by
  6. the Free Software Foundation; either version 2.1 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU Lesser General Public License for more details.
  12. You should have received a copy of the GNU Lesser General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  15. */
  16. #ifndef __JackRequest__
  17. #define __JackRequest__
  18. #include "JackConstants.h"
  19. #include "JackPlatformPlug.h"
  20. #include "types.h"
  21. #include <string.h>
  22. #include <stdio.h>
  23. namespace Jack
  24. {
  25. #define CheckRes(exp) { if ((exp) < 0) return -1;}
  26. /*!
  27. \brief Request from client to server.
  28. */
  29. struct JackRequest
  30. {
  31. enum RequestType {
  32. kRegisterPort = 1,
  33. kUnRegisterPort = 2,
  34. kConnectPorts = 3,
  35. kDisconnectPorts = 4,
  36. kSetTimeBaseClient = 5,
  37. kActivateClient = 6,
  38. kDeactivateClient = 7,
  39. kDisconnectPort = 8,
  40. kSetClientCapabilities = 9,
  41. kGetPortConnections = 10,
  42. kGetPortNConnections = 11,
  43. kReleaseTimebase = 12,
  44. kSetTimebaseCallback = 13,
  45. kSetBufferSize = 20,
  46. kSetFreeWheel = 21,
  47. kClientCheck = 22,
  48. kClientOpen = 23,
  49. kClientClose = 24,
  50. kConnectNamePorts = 25,
  51. kDisconnectNamePorts = 26,
  52. kGetInternalClientName = 27,
  53. kInternalClientHandle = 28,
  54. kInternalClientLoad = 29,
  55. kInternalClientUnload = 30,
  56. kPortRename = 31,
  57. kNotification = 32
  58. };
  59. RequestType fType;
  60. JackRequest()
  61. {}
  62. JackRequest(RequestType type): fType(type)
  63. {}
  64. virtual ~JackRequest()
  65. {}
  66. virtual int Read(JackChannelTransaction* trans)
  67. {
  68. return trans->Read(&fType, sizeof(RequestType));
  69. }
  70. virtual int Write(JackChannelTransaction* trans)
  71. {
  72. return trans->Write(&fType, sizeof(RequestType));
  73. }
  74. };
  75. /*!
  76. \brief Result from the server.
  77. */
  78. struct JackResult
  79. {
  80. int fResult;
  81. JackResult(): fResult( -1)
  82. {}
  83. JackResult(int result): fResult(result)
  84. {}
  85. virtual ~JackResult()
  86. {}
  87. virtual int Read(JackChannelTransaction* trans)
  88. {
  89. return trans->Read(&fResult, sizeof(int));
  90. }
  91. virtual int Write(JackChannelTransaction* trans)
  92. {
  93. return trans->Write(&fResult, sizeof(int));
  94. }
  95. };
  96. /*!
  97. \brief CheckClient request.
  98. */
  99. struct JackClientCheckRequest : public JackRequest
  100. {
  101. char fName[JACK_CLIENT_NAME_SIZE + 1];
  102. int fProtocol;
  103. int fOptions;
  104. JackClientCheckRequest()
  105. {}
  106. JackClientCheckRequest(const char* name, int protocol, int options)
  107. : JackRequest(JackRequest::kClientCheck), fProtocol(protocol), fOptions(options)
  108. {
  109. snprintf(fName, sizeof(fName), "%s", name);
  110. }
  111. int Read(JackChannelTransaction* trans)
  112. {
  113. CheckRes(trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1));
  114. CheckRes(trans->Read(&fProtocol, sizeof(int)));
  115. return trans->Read(&fOptions, sizeof(int));
  116. }
  117. int Write(JackChannelTransaction* trans)
  118. {
  119. CheckRes(JackRequest::Write(trans));
  120. CheckRes(trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1));
  121. CheckRes(trans->Write(&fProtocol, sizeof(int)));
  122. return trans->Write(&fOptions, sizeof(int));
  123. }
  124. };
  125. /*!
  126. \brief CheckClient result.
  127. */
  128. struct JackClientCheckResult : public JackResult
  129. {
  130. char fName[JACK_CLIENT_NAME_SIZE + 1];
  131. int fStatus;
  132. JackClientCheckResult(): JackResult(), fStatus(0)
  133. {}
  134. JackClientCheckResult(int32_t result, const char* name, int status)
  135. : JackResult(result), fStatus(status)
  136. {
  137. snprintf(fName, sizeof(fName), "%s", name);
  138. }
  139. int Read(JackChannelTransaction* trans)
  140. {
  141. CheckRes(JackResult::Read(trans));
  142. CheckRes(trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1));
  143. CheckRes(trans->Read(&fStatus, sizeof(int)));
  144. return 0;
  145. }
  146. int Write(JackChannelTransaction* trans)
  147. {
  148. CheckRes(JackResult::Write(trans));
  149. CheckRes(trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1));
  150. CheckRes(trans->Write(&fStatus, sizeof(int)));
  151. return 0;
  152. }
  153. };
  154. /*!
  155. \brief NewClient request.
  156. */
  157. struct JackClientOpenRequest : public JackRequest
  158. {
  159. int fPID;
  160. char fName[JACK_CLIENT_NAME_SIZE + 1];
  161. JackClientOpenRequest()
  162. {}
  163. JackClientOpenRequest(const char* name, int pid): JackRequest(JackRequest::kClientOpen)
  164. {
  165. snprintf(fName, sizeof(fName), "%s", name);
  166. fPID = pid;
  167. }
  168. int Read(JackChannelTransaction* trans)
  169. {
  170. CheckRes(trans->Read(&fPID, sizeof(int)));
  171. return trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1);
  172. }
  173. int Write(JackChannelTransaction* trans)
  174. {
  175. CheckRes(JackRequest::Write(trans));
  176. CheckRes(trans->Write(&fPID, sizeof(int)));
  177. return trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1);
  178. }
  179. };
  180. /*!
  181. \brief NewClient result.
  182. */
  183. struct JackClientOpenResult : public JackResult
  184. {
  185. int fSharedEngine;
  186. int fSharedClient;
  187. int fSharedGraph;
  188. JackClientOpenResult()
  189. : JackResult(), fSharedEngine(-1), fSharedClient(-1), fSharedGraph(-1)
  190. {}
  191. JackClientOpenResult(int32_t result, int index1, int index2, int index3)
  192. : JackResult(result), fSharedEngine(index1), fSharedClient(index2), fSharedGraph(index3)
  193. {}
  194. int Read(JackChannelTransaction* trans)
  195. {
  196. CheckRes(JackResult::Read(trans));
  197. CheckRes(trans->Read(&fSharedEngine, sizeof(int)));
  198. CheckRes(trans->Read(&fSharedClient, sizeof(int)));
  199. CheckRes(trans->Read(&fSharedGraph, sizeof(int)));
  200. return 0;
  201. }
  202. int Write(JackChannelTransaction* trans)
  203. {
  204. CheckRes(JackResult::Write(trans));
  205. CheckRes(trans->Write(&fSharedEngine, sizeof(int)));
  206. CheckRes(trans->Write(&fSharedClient, sizeof(int)));
  207. CheckRes(trans->Write(&fSharedGraph, sizeof(int)));
  208. return 0;
  209. }
  210. };
  211. /*!
  212. \brief CloseClient request.
  213. */
  214. struct JackClientCloseRequest : public JackRequest
  215. {
  216. int fRefNum;
  217. JackClientCloseRequest()
  218. {}
  219. JackClientCloseRequest(int refnum): JackRequest(JackRequest::kClientClose), fRefNum(refnum)
  220. {}
  221. int Read(JackChannelTransaction* trans)
  222. {
  223. return trans->Read(&fRefNum, sizeof(int));
  224. }
  225. int Write(JackChannelTransaction* trans)
  226. {
  227. CheckRes(JackRequest::Write(trans));
  228. return trans->Write(&fRefNum, sizeof(int));
  229. }
  230. };
  231. /*!
  232. \brief Activate request.
  233. */
  234. struct JackActivateRequest : public JackRequest
  235. {
  236. int fRefNum;
  237. int fState;
  238. JackActivateRequest()
  239. {}
  240. JackActivateRequest(int refnum, int state)
  241. : JackRequest(JackRequest::kActivateClient), fRefNum(refnum), fState(state)
  242. {}
  243. int Read(JackChannelTransaction* trans)
  244. {
  245. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  246. return trans->Read(&fState, sizeof(int));
  247. }
  248. int Write(JackChannelTransaction* trans)
  249. {
  250. CheckRes(JackRequest::Write(trans));
  251. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  252. return trans->Write(&fState, sizeof(int));
  253. }
  254. };
  255. /*!
  256. \brief Deactivate request.
  257. */
  258. struct JackDeactivateRequest : public JackRequest
  259. {
  260. int fRefNum;
  261. JackDeactivateRequest()
  262. {}
  263. JackDeactivateRequest(int refnum): JackRequest(JackRequest::kDeactivateClient), fRefNum(refnum)
  264. {}
  265. int Read(JackChannelTransaction* trans)
  266. {
  267. return trans->Read(&fRefNum, sizeof(int));
  268. }
  269. int Write(JackChannelTransaction* trans)
  270. {
  271. CheckRes(JackRequest::Write(trans));
  272. return trans->Write(&fRefNum, sizeof(int));
  273. }
  274. };
  275. /*!
  276. \brief PortRegister request.
  277. */
  278. struct JackPortRegisterRequest : public JackRequest
  279. {
  280. int fRefNum;
  281. char fName[JACK_PORT_NAME_SIZE + 1];
  282. char fPortType[JACK_PORT_TYPE_SIZE + 1];
  283. unsigned int fFlags;
  284. unsigned int fBufferSize;
  285. JackPortRegisterRequest()
  286. {}
  287. JackPortRegisterRequest(int refnum, const char* name, const char* port_type, unsigned int flags, unsigned int buffer_size)
  288. : JackRequest(JackRequest::kRegisterPort), fRefNum(refnum), fFlags(flags), fBufferSize(buffer_size)
  289. {
  290. strcpy(fName, name);
  291. strcpy(fPortType, port_type);
  292. }
  293. int Read(JackChannelTransaction* trans)
  294. {
  295. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  296. CheckRes(trans->Read(&fName, JACK_PORT_NAME_SIZE + 1));
  297. CheckRes(trans->Read(&fPortType, JACK_PORT_TYPE_SIZE + 1));
  298. CheckRes(trans->Read(&fFlags, sizeof(unsigned int)));
  299. CheckRes(trans->Read(&fBufferSize, sizeof(unsigned int)));
  300. return 0;
  301. }
  302. int Write(JackChannelTransaction* trans)
  303. {
  304. CheckRes(JackRequest::Write(trans));
  305. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  306. CheckRes(trans->Write(&fName, JACK_PORT_NAME_SIZE + 1));
  307. CheckRes(trans->Write(&fPortType, JACK_PORT_TYPE_SIZE + 1));
  308. CheckRes(trans->Write(&fFlags, sizeof(unsigned int)));
  309. CheckRes(trans->Write(&fBufferSize, sizeof(unsigned int)));
  310. return 0;
  311. }
  312. };
  313. /*!
  314. \brief PortRegister result.
  315. */
  316. struct JackPortRegisterResult : public JackResult
  317. {
  318. unsigned int fPortIndex;
  319. JackPortRegisterResult(): JackResult(), fPortIndex(NO_PORT)
  320. {}
  321. int Read(JackChannelTransaction* trans)
  322. {
  323. CheckRes(JackResult::Read(trans));
  324. return trans->Read(&fPortIndex, sizeof(jack_port_id_t));
  325. }
  326. int Write(JackChannelTransaction* trans)
  327. {
  328. CheckRes(JackResult::Write(trans));
  329. return trans->Write(&fPortIndex, sizeof(jack_port_id_t));
  330. }
  331. };
  332. /*!
  333. \brief PortUnregister request.
  334. */
  335. struct JackPortUnRegisterRequest : public JackRequest
  336. {
  337. int fRefNum;
  338. int fPortIndex;
  339. JackPortUnRegisterRequest()
  340. {}
  341. JackPortUnRegisterRequest(int refnum, int index)
  342. : JackRequest(JackRequest::kUnRegisterPort), fRefNum(refnum), fPortIndex(index)
  343. {}
  344. int Read(JackChannelTransaction* trans)
  345. {
  346. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  347. CheckRes(trans->Read(&fPortIndex, sizeof(int)));
  348. return 0;
  349. }
  350. int Write(JackChannelTransaction* trans)
  351. {
  352. CheckRes(JackRequest::Write(trans));
  353. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  354. CheckRes(trans->Write(&fPortIndex, sizeof(int)));
  355. return 0;
  356. }
  357. };
  358. /*!
  359. \brief PortConnectName request.
  360. */
  361. struct JackPortConnectNameRequest : public JackRequest
  362. {
  363. int fRefNum;
  364. char fSrc[JACK_PORT_NAME_SIZE + 1];
  365. char fDst[JACK_PORT_NAME_SIZE + 1];
  366. JackPortConnectNameRequest()
  367. {}
  368. JackPortConnectNameRequest(int refnum, const char* src_name, const char* dst_name)
  369. : JackRequest(JackRequest::kConnectNamePorts), fRefNum(refnum)
  370. {
  371. strcpy(fSrc, src_name);
  372. strcpy(fDst, dst_name);
  373. }
  374. int Read(JackChannelTransaction* trans)
  375. {
  376. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  377. CheckRes(trans->Read(&fSrc, JACK_PORT_NAME_SIZE + 1));
  378. CheckRes(trans->Read(&fDst, JACK_PORT_NAME_SIZE + 1));
  379. return 0;
  380. }
  381. int Write(JackChannelTransaction* trans)
  382. {
  383. CheckRes(JackRequest::Write(trans));
  384. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  385. CheckRes(trans->Write(&fSrc, JACK_PORT_NAME_SIZE + 1));
  386. CheckRes(trans->Write(&fDst, JACK_PORT_NAME_SIZE + 1));
  387. return 0;
  388. }
  389. };
  390. /*!
  391. \brief PortDisconnectName request.
  392. */
  393. struct JackPortDisconnectNameRequest : public JackRequest
  394. {
  395. int fRefNum;
  396. char fSrc[JACK_PORT_NAME_SIZE + 1];
  397. char fDst[JACK_PORT_NAME_SIZE + 1];
  398. JackPortDisconnectNameRequest()
  399. {}
  400. JackPortDisconnectNameRequest(int refnum, const char* src_name, const char* dst_name)
  401. : JackRequest(JackRequest::kDisconnectNamePorts), fRefNum(refnum)
  402. {
  403. strcpy(fSrc, src_name);
  404. strcpy(fDst, dst_name);
  405. }
  406. int Read(JackChannelTransaction* trans)
  407. {
  408. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  409. CheckRes(trans->Read(&fSrc, JACK_PORT_NAME_SIZE + 1));
  410. CheckRes(trans->Read(&fDst, JACK_PORT_NAME_SIZE + 1));
  411. return 0;
  412. }
  413. int Write(JackChannelTransaction* trans)
  414. {
  415. CheckRes(JackRequest::Write(trans));
  416. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  417. CheckRes(trans->Write(&fSrc, JACK_PORT_NAME_SIZE + 1));
  418. CheckRes(trans->Write(&fDst, JACK_PORT_NAME_SIZE + 1));
  419. return 0;
  420. }
  421. };
  422. /*!
  423. \brief PortConnect request.
  424. */
  425. struct JackPortConnectRequest : public JackRequest
  426. {
  427. int fRefNum;
  428. jack_port_id_t fSrc;
  429. jack_port_id_t fDst;
  430. JackPortConnectRequest()
  431. {}
  432. JackPortConnectRequest(int refnum, jack_port_id_t src, jack_port_id_t dst)
  433. : JackRequest(JackRequest::kConnectPorts), fRefNum(refnum), fSrc(src), fDst(dst)
  434. {}
  435. int Read(JackChannelTransaction* trans)
  436. {
  437. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  438. CheckRes(trans->Read(&fSrc, sizeof(jack_port_id_t)));
  439. CheckRes(trans->Read(&fDst, sizeof(jack_port_id_t)));
  440. return 0;
  441. }
  442. int Write(JackChannelTransaction* trans)
  443. {
  444. CheckRes(JackRequest::Write(trans));
  445. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  446. CheckRes(trans->Write(&fSrc, sizeof(jack_port_id_t)));
  447. CheckRes(trans->Write(&fDst, sizeof(jack_port_id_t)));
  448. return 0;
  449. }
  450. };
  451. /*!
  452. \brief PortDisconnect request.
  453. */
  454. struct JackPortDisconnectRequest : public JackRequest
  455. {
  456. int fRefNum;
  457. jack_port_id_t fSrc;
  458. jack_port_id_t fDst;
  459. JackPortDisconnectRequest()
  460. {}
  461. JackPortDisconnectRequest(int refnum, jack_port_id_t src, jack_port_id_t dst)
  462. : JackRequest(JackRequest::kDisconnectPorts), fRefNum(refnum), fSrc(src), fDst(dst)
  463. {}
  464. int Read(JackChannelTransaction* trans)
  465. {
  466. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  467. CheckRes(trans->Read(&fSrc, sizeof(jack_port_id_t)));
  468. CheckRes(trans->Read(&fDst, sizeof(jack_port_id_t)));
  469. return 0;
  470. }
  471. int Write(JackChannelTransaction* trans)
  472. {
  473. CheckRes(JackRequest::Write(trans));
  474. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  475. CheckRes(trans->Write(&fSrc, sizeof(jack_port_id_t)));
  476. CheckRes(trans->Write(&fDst, sizeof(jack_port_id_t)));
  477. return 0;
  478. }
  479. };
  480. /*!
  481. \brief PortRename request.
  482. */
  483. struct JackPortRenameRequest : public JackRequest
  484. {
  485. int fRefNum;
  486. jack_port_id_t fPort;
  487. char fName[JACK_PORT_NAME_SIZE + 1];
  488. JackPortRenameRequest()
  489. {}
  490. JackPortRenameRequest(int refnum, jack_port_id_t port, const char* name)
  491. : JackRequest(JackRequest::kPortRename), fRefNum(refnum), fPort(port)
  492. {
  493. strcpy(fName, name);
  494. }
  495. int Read(JackChannelTransaction* trans)
  496. {
  497. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  498. CheckRes(trans->Read(&fPort, sizeof(jack_port_id_t)));
  499. CheckRes(trans->Read(&fName, JACK_PORT_NAME_SIZE + 1));
  500. return 0;
  501. }
  502. int Write(JackChannelTransaction* trans)
  503. {
  504. CheckRes(JackRequest::Write(trans));
  505. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  506. CheckRes(trans->Write(&fPort, sizeof(jack_port_id_t)));
  507. CheckRes(trans->Write(&fName, JACK_PORT_NAME_SIZE + 1));
  508. return 0;
  509. }
  510. };
  511. /*!
  512. \brief SetBufferSize request.
  513. */
  514. struct JackSetBufferSizeRequest : public JackRequest
  515. {
  516. jack_nframes_t fBufferSize;
  517. JackSetBufferSizeRequest()
  518. {}
  519. JackSetBufferSizeRequest(jack_nframes_t buffer_size)
  520. : JackRequest(JackRequest::kSetBufferSize), fBufferSize(buffer_size)
  521. {}
  522. int Read(JackChannelTransaction* trans)
  523. {
  524. return trans->Read(&fBufferSize, sizeof(jack_nframes_t));
  525. }
  526. int Write(JackChannelTransaction* trans)
  527. {
  528. CheckRes(JackRequest::Write(trans));
  529. return trans->Write(&fBufferSize, sizeof(jack_nframes_t));
  530. }
  531. };
  532. /*!
  533. \brief SetFreeWheel request.
  534. */
  535. struct JackSetFreeWheelRequest : public JackRequest
  536. {
  537. int fOnOff;
  538. JackSetFreeWheelRequest()
  539. {}
  540. JackSetFreeWheelRequest(int onoff)
  541. : JackRequest(JackRequest::kSetFreeWheel), fOnOff(onoff)
  542. {}
  543. int Read(JackChannelTransaction* trans)
  544. {
  545. return trans->Read(&fOnOff, sizeof(int));
  546. }
  547. int Write(JackChannelTransaction* trans)
  548. {
  549. CheckRes(JackRequest::Write(trans));
  550. return trans->Write(&fOnOff, sizeof(int));
  551. }
  552. };
  553. /*!
  554. \brief ReleaseTimebase request.
  555. */
  556. struct JackReleaseTimebaseRequest : public JackRequest
  557. {
  558. int fRefNum;
  559. JackReleaseTimebaseRequest()
  560. {}
  561. JackReleaseTimebaseRequest(int refnum)
  562. : JackRequest(JackRequest::kReleaseTimebase), fRefNum(refnum)
  563. {}
  564. int Read(JackChannelTransaction* trans)
  565. {
  566. return trans->Read(&fRefNum, sizeof(int));
  567. }
  568. int Write(JackChannelTransaction* trans)
  569. {
  570. CheckRes(JackRequest::Write(trans));
  571. return trans->Write(&fRefNum, sizeof(int));
  572. }
  573. };
  574. /*!
  575. \brief SetTimebaseCallback request.
  576. */
  577. struct JackSetTimebaseCallbackRequest : public JackRequest
  578. {
  579. int fRefNum;
  580. int fConditionnal;
  581. JackSetTimebaseCallbackRequest()
  582. {}
  583. JackSetTimebaseCallbackRequest(int refnum, int conditional)
  584. : JackRequest(JackRequest::kSetTimebaseCallback), fRefNum(refnum), fConditionnal(conditional)
  585. {}
  586. int Read(JackChannelTransaction* trans)
  587. {
  588. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  589. return trans->Read(&fConditionnal, sizeof(int));
  590. }
  591. int Write(JackChannelTransaction* trans)
  592. {
  593. CheckRes(JackRequest::Write(trans));
  594. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  595. return trans->Write(&fConditionnal, sizeof(int));
  596. }
  597. };
  598. /*!
  599. \brief GetInternalClientName request.
  600. */
  601. struct JackGetInternalClientNameRequest : public JackRequest
  602. {
  603. int fRefNum;
  604. int fIntRefNum;
  605. JackGetInternalClientNameRequest()
  606. {}
  607. JackGetInternalClientNameRequest(int refnum, int int_ref)
  608. : JackRequest(JackRequest::kGetInternalClientName), fRefNum(refnum), fIntRefNum(int_ref)
  609. {}
  610. int Read(JackChannelTransaction* trans)
  611. {
  612. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  613. return trans->Read(&fIntRefNum, sizeof(int));
  614. }
  615. int Write(JackChannelTransaction* trans)
  616. {
  617. CheckRes(JackRequest::Write(trans));
  618. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  619. return trans->Write(&fIntRefNum, sizeof(int));
  620. }
  621. };
  622. /*!
  623. \brief GetInternalClient result.
  624. */
  625. struct JackGetInternalClientNameResult : public JackResult
  626. {
  627. char fName[JACK_CLIENT_NAME_SIZE + 1];
  628. JackGetInternalClientNameResult(): JackResult()
  629. {}
  630. JackGetInternalClientNameResult(int32_t result, const char* name)
  631. : JackResult(result)
  632. {
  633. snprintf(fName, sizeof(fName), "%s", name);
  634. }
  635. int Read(JackChannelTransaction* trans)
  636. {
  637. CheckRes(JackResult::Read(trans));
  638. CheckRes(trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1));
  639. return 0;
  640. }
  641. int Write(JackChannelTransaction* trans)
  642. {
  643. CheckRes(JackResult::Write(trans));
  644. CheckRes(trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1));
  645. return 0;
  646. }
  647. };
  648. /*!
  649. \brief InternalClientHandle request.
  650. */
  651. struct JackInternalClientHandleRequest : public JackRequest
  652. {
  653. int fRefNum;
  654. char fName[JACK_CLIENT_NAME_SIZE + 1];
  655. JackInternalClientHandleRequest()
  656. {}
  657. JackInternalClientHandleRequest(int refnum, const char* client_name)
  658. : JackRequest(JackRequest::kInternalClientHandle), fRefNum(refnum)
  659. {
  660. snprintf(fName, sizeof(fName), "%s", client_name);
  661. }
  662. int Read(JackChannelTransaction* trans)
  663. {
  664. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  665. return trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1);
  666. }
  667. int Write(JackChannelTransaction* trans)
  668. {
  669. CheckRes(JackRequest::Write(trans));
  670. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  671. return trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1);
  672. }
  673. };
  674. /*!
  675. \brief InternalClientHandle result.
  676. */
  677. struct JackInternalClientHandleResult : public JackResult
  678. {
  679. int fStatus;
  680. int fIntRefNum;
  681. JackInternalClientHandleResult(): JackResult()
  682. {}
  683. JackInternalClientHandleResult(int32_t result, int status, int int_ref)
  684. : JackResult(result), fStatus(status), fIntRefNum(int_ref)
  685. {}
  686. int Read(JackChannelTransaction* trans)
  687. {
  688. CheckRes(JackResult::Read(trans));
  689. CheckRes(trans->Read(&fStatus, sizeof(int)));
  690. CheckRes(trans->Read(&fIntRefNum, sizeof(int)));
  691. return 0;
  692. }
  693. int Write(JackChannelTransaction* trans)
  694. {
  695. CheckRes(JackResult::Write(trans));
  696. CheckRes(trans->Write(&fStatus, sizeof(int)));
  697. CheckRes(trans->Write(&fIntRefNum, sizeof(int)));
  698. return 0;
  699. }
  700. };
  701. /*!
  702. \brief InternalClientLoad request.
  703. */
  704. struct JackInternalClientLoadRequest : public JackRequest
  705. {
  706. #ifndef MAX_PATH
  707. #define MAX_PATH 256
  708. #endif
  709. int fRefNum;
  710. char fName[JACK_CLIENT_NAME_SIZE + 1];
  711. char fDllName[MAX_PATH + 1];
  712. char fLoadInitName[JACK_LOAD_INIT_LIMIT + 1];
  713. int fOptions;
  714. JackInternalClientLoadRequest()
  715. {}
  716. JackInternalClientLoadRequest(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options)
  717. : JackRequest(JackRequest::kInternalClientLoad), fRefNum(refnum), fOptions(options)
  718. {
  719. snprintf(fName, sizeof(fName), "%s", client_name);
  720. snprintf(fDllName, sizeof(fDllName), "%s", so_name);
  721. snprintf(fLoadInitName, sizeof(fLoadInitName), "%s", objet_data);
  722. }
  723. int Read(JackChannelTransaction* trans)
  724. {
  725. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  726. CheckRes(trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1));
  727. CheckRes(trans->Read(&fDllName, MAX_PATH + 1));
  728. CheckRes(trans->Read(&fLoadInitName, JACK_LOAD_INIT_LIMIT + 1));
  729. return trans->Read(&fOptions, sizeof(int));
  730. }
  731. int Write(JackChannelTransaction* trans)
  732. {
  733. CheckRes(JackRequest::Write(trans));
  734. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  735. CheckRes(trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1));
  736. CheckRes(trans->Write(&fDllName, MAX_PATH + 1));
  737. CheckRes(trans->Write(&fLoadInitName, JACK_LOAD_INIT_LIMIT + 1));
  738. return trans->Write(&fOptions, sizeof(int));
  739. }
  740. };
  741. /*!
  742. \brief InternalClientLoad result.
  743. */
  744. struct JackInternalClientLoadResult : public JackResult
  745. {
  746. int fStatus;
  747. int fIntRefNum;
  748. JackInternalClientLoadResult(): JackResult()
  749. {}
  750. JackInternalClientLoadResult(int32_t result, int status, int int_ref)
  751. : JackResult(result), fStatus(status), fIntRefNum(int_ref)
  752. {}
  753. int Read(JackChannelTransaction* trans)
  754. {
  755. CheckRes(JackResult::Read(trans));
  756. CheckRes(trans->Read(&fStatus, sizeof(int)));
  757. CheckRes(trans->Read(&fIntRefNum, sizeof(int)));
  758. return 0;
  759. }
  760. int Write(JackChannelTransaction* trans)
  761. {
  762. CheckRes(JackResult::Write(trans));
  763. CheckRes(trans->Write(&fStatus, sizeof(int)));
  764. CheckRes(trans->Write(&fIntRefNum, sizeof(int)));
  765. return 0;
  766. }
  767. };
  768. /*!
  769. \brief InternalClientUnload request.
  770. */
  771. struct JackInternalClientUnloadRequest : public JackRequest
  772. {
  773. int fRefNum;
  774. int fIntRefNum;
  775. JackInternalClientUnloadRequest()
  776. {}
  777. JackInternalClientUnloadRequest(int refnum, int int_ref)
  778. : JackRequest(JackRequest::kInternalClientUnload), fRefNum(refnum), fIntRefNum(int_ref)
  779. {}
  780. int Read(JackChannelTransaction* trans)
  781. {
  782. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  783. return trans->Read(&fIntRefNum, sizeof(int));
  784. }
  785. int Write(JackChannelTransaction* trans)
  786. {
  787. CheckRes(JackRequest::Write(trans));
  788. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  789. return trans->Write(&fIntRefNum, sizeof(int));
  790. }
  791. };
  792. /*!
  793. \brief InternalClientLoad result.
  794. */
  795. struct JackInternalClientUnloadResult : public JackResult
  796. {
  797. int fStatus;
  798. JackInternalClientUnloadResult(): JackResult()
  799. {}
  800. JackInternalClientUnloadResult(int32_t result, int status)
  801. : JackResult(result), fStatus(status)
  802. {}
  803. int Read(JackChannelTransaction* trans)
  804. {
  805. CheckRes(JackResult::Read(trans));
  806. CheckRes(trans->Read(&fStatus, sizeof(int)));
  807. return 0;
  808. }
  809. int Write(JackChannelTransaction* trans)
  810. {
  811. CheckRes(JackResult::Write(trans));
  812. CheckRes(trans->Write(&fStatus, sizeof(int)));
  813. return 0;
  814. }
  815. };
  816. /*!
  817. \brief ClientNotification request.
  818. */
  819. struct JackClientNotificationRequest : public JackRequest
  820. {
  821. int fRefNum;
  822. int fNotify;
  823. int fValue;
  824. JackClientNotificationRequest()
  825. {}
  826. JackClientNotificationRequest(int refnum, int notify, int value)
  827. : JackRequest(JackRequest::kNotification), fRefNum(refnum), fNotify(notify), fValue(value)
  828. {}
  829. int Read(JackChannelTransaction* trans)
  830. {
  831. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  832. CheckRes(trans->Read(&fNotify, sizeof(int)));
  833. CheckRes(trans->Read(&fValue, sizeof(int)));
  834. return 0;
  835. }
  836. int Write(JackChannelTransaction* trans)
  837. {
  838. CheckRes(JackRequest::Write(trans));
  839. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  840. CheckRes(trans->Write(&fNotify, sizeof(int)));
  841. CheckRes(trans->Write(&fValue, sizeof(int)));
  842. return 0;
  843. }
  844. };
  845. /*!
  846. \brief ClientNotification.
  847. */
  848. struct JackClientNotification
  849. {
  850. char fName[JACK_CLIENT_NAME_SIZE + 1];
  851. int fRefNum;
  852. int fNotify;
  853. int fValue1;
  854. int fValue2;
  855. int fSync;
  856. JackClientNotification(): fNotify(-1), fValue1(-1), fValue2(-1)
  857. {}
  858. JackClientNotification(const char* name, int refnum, int notify, int sync, int value1, int value2)
  859. : fRefNum(refnum), fNotify(notify), fValue1(value1), fValue2(value2), fSync(sync)
  860. {
  861. snprintf(fName, sizeof(fName), "%s", name);
  862. }
  863. int Read(JackChannelTransaction* trans)
  864. {
  865. CheckRes(trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1));
  866. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  867. CheckRes(trans->Read(&fNotify, sizeof(int)));
  868. CheckRes(trans->Read(&fValue1, sizeof(int)));
  869. CheckRes(trans->Read(&fValue2, sizeof(int)));
  870. CheckRes(trans->Read(&fSync, sizeof(int)));
  871. return 0;
  872. }
  873. int Write(JackChannelTransaction* trans)
  874. {
  875. CheckRes(trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1));
  876. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  877. CheckRes(trans->Write(&fNotify, sizeof(int)));
  878. CheckRes(trans->Write(&fValue1, sizeof(int)));
  879. CheckRes(trans->Write(&fValue2, sizeof(int)));
  880. CheckRes(trans->Write(&fSync, sizeof(int)));
  881. return 0;
  882. }
  883. };
  884. } // end of namespace
  885. #endif