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.

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