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.

702 lines
16KB

  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 "JackPort.h"
  18. #include "JackChannelTransaction.h"
  19. #include "JackError.h"
  20. #include <stdio.h>
  21. namespace Jack
  22. {
  23. /*!
  24. \brief Request from client to server.
  25. */
  26. struct JackRequest
  27. {
  28. public:
  29. typedef enum {
  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. kClientNew = 22,
  46. kClientClose = 23,
  47. kConnectNamePorts = 24,
  48. kDisconnectNamePorts = 25,
  49. kNotification = 26
  50. } RequestType;
  51. RequestType fType;
  52. JackRequest()
  53. {}
  54. JackRequest(RequestType type): fType(type)
  55. {}
  56. virtual ~JackRequest()
  57. {}
  58. virtual int Read(JackChannelTransaction* trans)
  59. {
  60. return trans->Read(&fType, sizeof(RequestType));
  61. }
  62. virtual int Write(JackChannelTransaction* trans)
  63. {
  64. return trans->Write(&fType, sizeof(RequestType));
  65. }
  66. };
  67. #define CheckRes(res) {if (res < 0) return res;}
  68. /*!
  69. \brief Result from the server.
  70. */
  71. struct JackResult
  72. {
  73. int fResult;
  74. JackResult(): fResult( -1)
  75. {}
  76. JackResult(int status): fResult(status)
  77. {}
  78. virtual ~JackResult()
  79. {}
  80. virtual int Read(JackChannelTransaction* trans)
  81. {
  82. return trans->Read(&fResult, sizeof(int));
  83. }
  84. virtual int Write(JackChannelTransaction* trans)
  85. {
  86. return trans->Write(&fResult, sizeof(int));
  87. }
  88. };
  89. /*!
  90. \brief NewClient request.
  91. */
  92. struct JackClientNewRequest : public JackRequest
  93. {
  94. char fName[JACK_CLIENT_NAME_SIZE + 1];
  95. JackClientNewRequest()
  96. {}
  97. JackClientNewRequest(const char* name): JackRequest(JackRequest::kClientNew)
  98. {
  99. snprintf(fName, sizeof(fName), "%s", name);
  100. }
  101. int Read(JackChannelTransaction* trans)
  102. {
  103. return trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1);
  104. }
  105. int Write(JackChannelTransaction* trans)
  106. {
  107. CheckRes(JackRequest::Write(trans));
  108. return trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1);
  109. }
  110. };
  111. /*!
  112. \brief NewClient result.
  113. */
  114. struct JackClientNewResult : public JackResult
  115. {
  116. int fSharedEngine;
  117. int fSharedClient;
  118. int fSharedGraph;
  119. uint32_t fProtocolVersion;
  120. JackClientNewResult()
  121. :fSharedEngine(-1), fSharedClient(-1), fSharedGraph(-1), fProtocolVersion(0)
  122. {}
  123. JackClientNewResult(int32_t status, int index1, int index2, int index3)
  124. : JackResult(status), fSharedEngine(index1), fSharedClient(index2), fSharedGraph(index3), fProtocolVersion(0)
  125. {}
  126. int Read(JackChannelTransaction* trans)
  127. {
  128. CheckRes(JackResult::Read(trans));
  129. CheckRes(trans->Read(&fSharedEngine, sizeof(int)));
  130. CheckRes(trans->Read(&fSharedClient, sizeof(int)));
  131. CheckRes(trans->Read(&fSharedGraph, sizeof(int)));
  132. CheckRes(trans->Read(&fProtocolVersion, sizeof(uint32_t)));
  133. return 0;
  134. }
  135. int Write(JackChannelTransaction* trans)
  136. {
  137. CheckRes(JackResult::Write(trans));
  138. CheckRes(trans->Write(&fSharedEngine, sizeof(int)));
  139. CheckRes(trans->Write(&fSharedClient, sizeof(int)));
  140. CheckRes(trans->Write(&fSharedGraph, sizeof(int)));
  141. CheckRes(trans->Write(&fProtocolVersion, sizeof(uint32_t)));
  142. JackLog("JackClientNewResult::Write result = %ld\n", fResult);
  143. return 0;
  144. }
  145. };
  146. /*!
  147. \brief CloseClient request.
  148. */
  149. struct JackClientCloseRequest : public JackRequest
  150. {
  151. int fRefNum;
  152. JackClientCloseRequest()
  153. {}
  154. JackClientCloseRequest(int refnum): JackRequest(JackRequest::kClientClose), fRefNum(refnum)
  155. {}
  156. int Read(JackChannelTransaction* trans)
  157. {
  158. return trans->Read(&fRefNum, sizeof(int));
  159. }
  160. int Write(JackChannelTransaction* trans)
  161. {
  162. CheckRes(JackRequest::Write(trans));
  163. return trans->Write(&fRefNum, sizeof(int));
  164. }
  165. };
  166. /*!
  167. \brief Activate request.
  168. */
  169. struct JackActivateRequest : public JackRequest
  170. {
  171. int fRefNum;
  172. JackActivateRequest()
  173. {}
  174. JackActivateRequest(int refnum): JackRequest(JackRequest::kActivateClient), fRefNum(refnum)
  175. {}
  176. int Read(JackChannelTransaction* trans)
  177. {
  178. return trans->Read(&fRefNum, sizeof(int));
  179. }
  180. int Write(JackChannelTransaction* trans)
  181. {
  182. CheckRes(JackRequest::Write(trans));
  183. return trans->Write(&fRefNum, sizeof(int));
  184. }
  185. };
  186. /*!
  187. \brief Deactivate request.
  188. */
  189. struct JackDeactivateRequest : public JackRequest
  190. {
  191. int fRefNum;
  192. JackDeactivateRequest()
  193. {}
  194. JackDeactivateRequest(int refnum): JackRequest(JackRequest::kDeactivateClient), fRefNum(refnum)
  195. {}
  196. int Read(JackChannelTransaction* trans)
  197. {
  198. return trans->Read(&fRefNum, sizeof(int));
  199. }
  200. int Write(JackChannelTransaction* trans)
  201. {
  202. CheckRes(JackRequest::Write(trans));
  203. return trans->Write(&fRefNum, sizeof(int));
  204. }
  205. };
  206. /*!
  207. \brief PortRegister request.
  208. */
  209. struct JackPortRegisterRequest : public JackRequest
  210. {
  211. int fRefNum;
  212. char fName[JACK_PORT_NAME_SIZE + 1];
  213. char fPortType[JACK_PORT_TYPE_SIZE + 1];
  214. unsigned int fFlags;
  215. unsigned int fBufferSize;
  216. JackPortRegisterRequest()
  217. {}
  218. JackPortRegisterRequest(int refnum, const char* name, const char* port_type, unsigned int flags, unsigned int buffer_size)
  219. : JackRequest(JackRequest::kRegisterPort), fRefNum(refnum), fFlags(flags), fBufferSize(buffer_size)
  220. {
  221. strcpy(fName, name);
  222. strcpy(fPortType, port_type);
  223. }
  224. int Read(JackChannelTransaction* trans)
  225. {
  226. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  227. CheckRes(trans->Read(&fName, JACK_PORT_NAME_SIZE + 1));
  228. CheckRes(trans->Read(&fPortType, JACK_PORT_TYPE_SIZE + 1));
  229. CheckRes(trans->Read(&fFlags, sizeof(unsigned int)));
  230. CheckRes(trans->Read(&fBufferSize, sizeof(unsigned int)));
  231. return 0;
  232. }
  233. int Write(JackChannelTransaction* trans)
  234. {
  235. CheckRes(JackRequest::Write(trans));
  236. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  237. CheckRes(trans->Write(&fName, JACK_PORT_NAME_SIZE + 1));
  238. CheckRes(trans->Write(&fPortType, JACK_PORT_TYPE_SIZE + 1));
  239. CheckRes(trans->Write(&fFlags, sizeof(unsigned int)));
  240. CheckRes(trans->Write(&fBufferSize, sizeof(unsigned int)));
  241. return 0;
  242. }
  243. };
  244. /*!
  245. \brief PortRegister result.
  246. */
  247. struct JackPortRegisterResult : public JackResult
  248. {
  249. jack_port_id_t fPortIndex;
  250. JackPortRegisterResult(): fPortIndex(NO_PORT)
  251. {}
  252. int Read(JackChannelTransaction* trans)
  253. {
  254. CheckRes(JackResult::Read(trans));
  255. return trans->Read(&fPortIndex, sizeof(jack_port_id_t));
  256. }
  257. int Write(JackChannelTransaction* trans)
  258. {
  259. CheckRes(JackResult::Write(trans));
  260. return trans->Write(&fPortIndex, sizeof(jack_port_id_t));
  261. }
  262. };
  263. /*!
  264. \brief PortUnregister request.
  265. */
  266. struct JackPortUnRegisterRequest : public JackRequest
  267. {
  268. int fRefNum;
  269. int fPortIndex;
  270. JackPortUnRegisterRequest()
  271. {}
  272. JackPortUnRegisterRequest(int refnum, int index): JackRequest(JackRequest::kUnRegisterPort), fRefNum(refnum), fPortIndex(index)
  273. {}
  274. int Read(JackChannelTransaction* trans)
  275. {
  276. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  277. CheckRes(trans->Read(&fPortIndex, sizeof(int)));
  278. return 0;
  279. }
  280. int Write(JackChannelTransaction* trans)
  281. {
  282. CheckRes(JackRequest::Write(trans));
  283. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  284. CheckRes(trans->Write(&fPortIndex, sizeof(int)));
  285. return 0;
  286. }
  287. };
  288. /*!
  289. \brief PortConnectName request.
  290. */
  291. struct JackPortConnectNameRequest : public JackRequest
  292. {
  293. int fRefNum;
  294. char fSrc[JACK_PORT_NAME_SIZE + 1];
  295. char fDst[JACK_PORT_NAME_SIZE + 1];
  296. JackPortConnectNameRequest()
  297. {}
  298. JackPortConnectNameRequest(int refnum, const char* src_name, const char* dst_name): JackRequest(JackRequest::kConnectNamePorts), fRefNum(refnum)
  299. {
  300. strcpy(fSrc, src_name);
  301. strcpy(fDst, dst_name);
  302. }
  303. int Read(JackChannelTransaction* trans)
  304. {
  305. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  306. CheckRes(trans->Read(&fSrc, JACK_PORT_NAME_SIZE + 1));
  307. CheckRes(trans->Read(&fDst,JACK_PORT_NAME_SIZE + 1));
  308. return 0;
  309. }
  310. int Write(JackChannelTransaction* trans)
  311. {
  312. CheckRes(JackRequest::Write(trans));
  313. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  314. CheckRes(trans->Write(&fSrc, JACK_PORT_NAME_SIZE + 1));
  315. CheckRes(trans->Write(&fDst, JACK_PORT_NAME_SIZE + 1));
  316. return 0;
  317. }
  318. };
  319. /*!
  320. \brief PortDisconnectName request.
  321. */
  322. struct JackPortDisconnectNameRequest : public JackRequest
  323. {
  324. int fRefNum;
  325. char fSrc[JACK_PORT_NAME_SIZE + 1];
  326. char fDst[JACK_PORT_NAME_SIZE + 1];
  327. JackPortDisconnectNameRequest()
  328. {}
  329. JackPortDisconnectNameRequest(int refnum, const char* src_name, const char* dst_name): JackRequest(JackRequest::kDisconnectNamePorts), fRefNum(refnum)
  330. {
  331. strcpy(fSrc, src_name);
  332. strcpy(fDst, dst_name);
  333. }
  334. int Read(JackChannelTransaction* trans)
  335. {
  336. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  337. CheckRes(trans->Read(&fSrc, JACK_PORT_NAME_SIZE + 1));
  338. CheckRes(trans->Read(&fDst, JACK_PORT_NAME_SIZE + 1));
  339. return 0;
  340. }
  341. int Write(JackChannelTransaction* trans)
  342. {
  343. CheckRes(JackRequest::Write(trans));
  344. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  345. CheckRes(trans->Write(&fSrc, JACK_PORT_NAME_SIZE + 1));
  346. CheckRes(trans->Write(&fDst, JACK_PORT_NAME_SIZE + 1));
  347. return 0;
  348. }
  349. };
  350. /*!
  351. \brief PortConnect request.
  352. */
  353. struct JackPortConnectRequest : public JackRequest
  354. {
  355. int fRefNum;
  356. jack_port_id_t fSrc;
  357. jack_port_id_t fDst;
  358. JackPortConnectRequest()
  359. {}
  360. JackPortConnectRequest(int refnum, jack_port_id_t src, jack_port_id_t dst): JackRequest(JackRequest::kConnectPorts), fRefNum(refnum), fSrc(src), fDst(dst)
  361. {}
  362. int Read(JackChannelTransaction* trans)
  363. {
  364. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  365. CheckRes(trans->Read(&fSrc, sizeof(jack_port_id_t)));
  366. CheckRes(trans->Read(&fDst, sizeof(jack_port_id_t)));
  367. return 0;
  368. }
  369. int Write(JackChannelTransaction* trans)
  370. {
  371. CheckRes(JackRequest::Write(trans));
  372. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  373. CheckRes(trans->Write(&fSrc, sizeof(jack_port_id_t)));
  374. CheckRes(trans->Write(&fDst, sizeof(jack_port_id_t)));
  375. return 0;
  376. }
  377. };
  378. /*!
  379. \brief PortDisconnect request.
  380. */
  381. struct JackPortDisconnectRequest : public JackRequest
  382. {
  383. int fRefNum;
  384. jack_port_id_t fSrc;
  385. jack_port_id_t fDst;
  386. JackPortDisconnectRequest()
  387. {}
  388. JackPortDisconnectRequest(int refnum, jack_port_id_t src, jack_port_id_t dst): JackRequest(JackRequest::kDisconnectPorts), fRefNum(refnum), fSrc(src), fDst(dst)
  389. {}
  390. int Read(JackChannelTransaction* trans)
  391. {
  392. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  393. CheckRes(trans->Read(&fSrc, sizeof(jack_port_id_t)));
  394. CheckRes(trans->Read(&fDst, sizeof(jack_port_id_t)));
  395. return 0;
  396. }
  397. int Write(JackChannelTransaction* trans)
  398. {
  399. CheckRes(JackRequest::Write(trans));
  400. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  401. CheckRes(trans->Write(&fSrc, sizeof(jack_port_id_t)));
  402. CheckRes(trans->Write(&fDst, sizeof(jack_port_id_t)));
  403. return 0;
  404. }
  405. };
  406. /*!
  407. \brief SetBufferSize request.
  408. */
  409. struct JackSetBufferSizeRequest : public JackRequest
  410. {
  411. jack_nframes_t fBufferSize;
  412. JackSetBufferSizeRequest()
  413. {}
  414. JackSetBufferSizeRequest(jack_nframes_t buffer_size): JackRequest(JackRequest::kSetBufferSize), fBufferSize(buffer_size)
  415. {}
  416. int Read(JackChannelTransaction* trans)
  417. {
  418. return trans->Read(&fBufferSize, sizeof(jack_nframes_t));
  419. }
  420. int Write(JackChannelTransaction* trans)
  421. {
  422. CheckRes(JackRequest::Write(trans));
  423. return trans->Write(&fBufferSize, sizeof(jack_nframes_t));
  424. }
  425. };
  426. /*!
  427. \brief SetFreeWheel request.
  428. */
  429. struct JackSetFreeWheelRequest : public JackRequest
  430. {
  431. int fOnOff;
  432. JackSetFreeWheelRequest()
  433. {}
  434. JackSetFreeWheelRequest(int onoff): JackRequest(JackRequest::kSetFreeWheel), fOnOff(onoff)
  435. {}
  436. int Read(JackChannelTransaction* trans)
  437. {
  438. return trans->Read(&fOnOff, sizeof(int));
  439. }
  440. int Write(JackChannelTransaction* trans)
  441. {
  442. CheckRes(JackRequest::Write(trans));
  443. return trans->Write(&fOnOff, sizeof(int));
  444. }
  445. };
  446. /*!
  447. \brief ReleaseTimebase request.
  448. */
  449. struct JackReleaseTimebaseRequest : public JackRequest
  450. {
  451. int fRefNum;
  452. JackReleaseTimebaseRequest()
  453. {}
  454. JackReleaseTimebaseRequest(int refnum): JackRequest(JackRequest::kReleaseTimebase), fRefNum(refnum)
  455. {}
  456. int Read(JackChannelTransaction* trans)
  457. {
  458. return trans->Read(&fRefNum, sizeof(int));
  459. }
  460. int Write(JackChannelTransaction* trans)
  461. {
  462. CheckRes(JackRequest::Write(trans));
  463. return trans->Write(&fRefNum, sizeof(int));
  464. }
  465. };
  466. /*!
  467. \brief SetTimebaseCallback request.
  468. */
  469. struct JackSetTimebaseCallbackRequest : public JackRequest
  470. {
  471. int fRefNum;
  472. int fConditionnal;
  473. JackSetTimebaseCallbackRequest()
  474. {}
  475. JackSetTimebaseCallbackRequest(int refnum, int conditional): JackRequest(JackRequest::kSetTimebaseCallback), fRefNum(refnum), fConditionnal(conditional)
  476. {}
  477. int Read(JackChannelTransaction* trans)
  478. {
  479. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  480. return trans->Read(&fConditionnal, sizeof(int));
  481. }
  482. int Write(JackChannelTransaction* trans)
  483. {
  484. CheckRes(JackRequest::Write(trans));
  485. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  486. return trans->Write(&fConditionnal, sizeof(int));
  487. }
  488. };
  489. /*!
  490. \brief ClientNotification request.
  491. */
  492. struct JackClientNotificationRequest : public JackRequest
  493. {
  494. int fRefNum;
  495. int fNotify;
  496. int fValue;
  497. JackClientNotificationRequest()
  498. {}
  499. JackClientNotificationRequest(int refnum, int notify, int value)
  500. : JackRequest(JackRequest::kNotification), fRefNum(refnum), fNotify(notify), fValue(value)
  501. {}
  502. int Read(JackChannelTransaction* trans)
  503. {
  504. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  505. CheckRes(trans->Read(&fNotify, sizeof(int)));
  506. CheckRes(trans->Read(&fValue, sizeof(int)));
  507. return 0;
  508. }
  509. int Write(JackChannelTransaction* trans)
  510. {
  511. CheckRes(JackRequest::Write(trans));
  512. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  513. CheckRes(trans->Write(&fNotify, sizeof(int)));
  514. CheckRes(trans->Write(&fValue, sizeof(int)));
  515. return 0;
  516. }
  517. };
  518. /*!
  519. \brief ClientNotification.
  520. */
  521. struct JackClientNotification
  522. {
  523. char fName[JACK_CLIENT_NAME_SIZE + 1];
  524. int fRefNum;
  525. int fNotify;
  526. int fValue;
  527. int fSync;
  528. JackClientNotification(): fNotify( -1), fValue( -1)
  529. {}
  530. JackClientNotification(const char* name, int refnum, int notify, int sync, int value)
  531. : fRefNum(refnum), fNotify(notify), fValue(value), fSync(sync)
  532. {
  533. snprintf(fName, sizeof(fName), "%s", name);
  534. }
  535. int Read(JackChannelTransaction* trans)
  536. {
  537. CheckRes(trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1));
  538. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  539. CheckRes(trans->Read(&fNotify, sizeof(int)));
  540. CheckRes(trans->Read(&fValue, sizeof(int)));
  541. CheckRes(trans->Read(&fSync, sizeof(int)));
  542. return 0;
  543. }
  544. int Write(JackChannelTransaction* trans)
  545. {
  546. CheckRes(trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1));
  547. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  548. CheckRes(trans->Write(&fNotify, sizeof(int)));
  549. CheckRes(trans->Write(&fValue, sizeof(int)));
  550. CheckRes(trans->Write(&fSync, sizeof(int)));
  551. return 0;
  552. }
  553. };
  554. } // end of namespace
  555. #endif