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.

1039 lines
25KB

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