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.

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