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.

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