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.

632 lines
13KB

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