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.

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