jack1 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.

596 lines
19KB

  1. /*
  2. * NetJack - Packet Handling functions
  3. *
  4. * used by the driver and the jacknet_client
  5. *
  6. * Copyright (C) 2006 Torben Hohn <torbenh@gmx.de>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21. *
  22. * $Id: net_driver.c,v 1.16 2006/03/20 19:41:37 torbenh Exp $
  23. *
  24. */
  25. #include <math.h>
  26. #include <stdio.h>
  27. #include <memory.h>
  28. #include <unistd.h>
  29. #include <stdlib.h>
  30. #include <errno.h>
  31. #include <stdarg.h>
  32. #include <jack/types.h>
  33. #include <jack/engine.h>
  34. #include <sys/types.h>
  35. #include <sys/socket.h>
  36. #include <netinet/in.h>
  37. #include <samplerate.h>
  38. #include "net_driver.h"
  39. #include "netjack_packet.h"
  40. int fraggo = 0;
  41. void
  42. packet_header_hton(jacknet_packet_header *pkthdr)
  43. {
  44. pkthdr->channels = htonl(pkthdr->channels);
  45. pkthdr->period_size = htonl(pkthdr->period_size);
  46. pkthdr->sample_rate = htonl(pkthdr->sample_rate);
  47. pkthdr->sync_state = htonl(pkthdr->sync_state);
  48. pkthdr->transport_frame = htonl(pkthdr->transport_frame);
  49. pkthdr->transport_state = htonl(pkthdr->transport_state);
  50. pkthdr->framecnt = htonl(pkthdr->framecnt);
  51. pkthdr->latency = htonl(pkthdr->latency);
  52. pkthdr->reply_port = htonl(pkthdr->reply_port);
  53. pkthdr->mtu = htonl(pkthdr->mtu);
  54. pkthdr->fragment_nr = htonl(pkthdr->fragment_nr);
  55. }
  56. void
  57. packet_header_ntoh(jacknet_packet_header *pkthdr)
  58. {
  59. pkthdr->channels = ntohl(pkthdr->channels);
  60. pkthdr->period_size = ntohl(pkthdr->period_size);
  61. pkthdr->sample_rate = ntohl(pkthdr->sample_rate);
  62. pkthdr->sync_state = ntohl(pkthdr->sync_state);
  63. pkthdr->transport_frame = ntohl(pkthdr->transport_frame);
  64. pkthdr->transport_state = ntohl(pkthdr->transport_state);
  65. pkthdr->framecnt = ntohl(pkthdr->framecnt);
  66. pkthdr->latency = ntohl(pkthdr->latency);
  67. pkthdr->reply_port = ntohl(pkthdr->reply_port);
  68. pkthdr->mtu = ntohl(pkthdr->mtu);
  69. pkthdr->fragment_nr = ntohl(pkthdr->fragment_nr);
  70. }
  71. int get_sample_size(int bitdepth)
  72. {
  73. if (bitdepth == 8)
  74. return sizeof(int8_t);
  75. if (bitdepth == 16)
  76. return sizeof(int16_t);
  77. return sizeof(int32_t);
  78. }
  79. // fragmented packet IO
  80. int netjack_recvfrom(int sockfd, char *packet_buf, int pkt_size, int flags, struct sockaddr *addr, socklen_t *addr_size, int mtu)
  81. {
  82. char *rx_packet;
  83. char *dataX;
  84. int fragment_payload_size;
  85. // Copy the packet header to the tx pack first.
  86. //memcpy(tx_packet, packet_buf, sizeof(jacknet_packet_header));
  87. jacknet_packet_header *pkthdr;
  88. // Now loop and send all
  89. char *packet_bufX;
  90. // wait for fragment_nr == 0
  91. int rcv_len;
  92. rx_packet = alloca(mtu);
  93. dataX = rx_packet + sizeof(jacknet_packet_header);
  94. fragment_payload_size = mtu - sizeof(jacknet_packet_header);
  95. // Copy the packet header to the tx pack first.
  96. //memcpy(tx_packet, packet_buf, sizeof(jacknet_packet_header));
  97. pkthdr = (jacknet_packet_header *)rx_packet;
  98. // Now loop and send all
  99. packet_bufX = packet_buf + sizeof(jacknet_packet_header);
  100. if (pkt_size <= mtu)
  101. {
  102. return recvfrom(sockfd, packet_buf, pkt_size, flags, addr, addr_size);
  103. } else
  104. {
  105. rx_again:
  106. rcv_len = recvfrom(sockfd, rx_packet, mtu, 0, addr, addr_size);
  107. if (rcv_len < 0)
  108. return rcv_len;
  109. if (rcv_len >= sizeof(jacknet_packet_header)) {
  110. //printf("got fragmentooooo_nr = %d recv_len = %d\n", ntohl(pkthdr->fragment_nr), rcv_len);
  111. if ((ntohl(pkthdr->fragment_nr)) != 0)
  112. goto rx_again;
  113. } else {
  114. goto rx_again;
  115. }
  116. //goto rx_again;
  117. //printf("ok... lets go...\n");
  118. // ok... we have read a fragement 0;
  119. // copy the packet header...
  120. memcpy(packet_buf, rx_packet, sizeof(jacknet_packet_header));
  121. int fragment_count = 0;
  122. while (packet_bufX <= (packet_buf + pkt_size - fragment_payload_size)) {
  123. //printf("enter loop: fragment_count = %d, pkthdr->fragment_nr = %d\n", fragment_count, pkthdr->fragment_nr);
  124. // check fragment number.
  125. if ((ntohl(pkthdr->fragment_nr)) != fragment_count) {
  126. printf("got unexpected fragment %d (expected %d)\n", ntohl(pkthdr->fragment_nr), fragment_count);
  127. return sizeof(jacknet_packet_header) + (fragment_count) * fragment_payload_size;
  128. } else
  129. //printf("expected fragment %d\n", fragment_count);
  130. // copy the payload into the packet buffer...
  131. memcpy(packet_bufX, dataX, fragment_payload_size);
  132. rcv_len = recvfrom(sockfd, rx_packet, mtu, 0, addr, addr_size);
  133. //printf("got fragmen_nr = %d rcv_len = %d\n", ntohl(pkthdr->fragment_nr), rcv_len);
  134. //printf("got fragmen_nr = %d\n", ntohl(pkthdr->fragment_nr));
  135. if (rcv_len < 0)
  136. return -1;
  137. packet_bufX += fragment_payload_size;
  138. fragment_count++;
  139. }
  140. //printf("at the end rcv_len = %d\n ", rcv_len);
  141. int last_payload_size = packet_bufX - packet_buf - pkt_size;
  142. memcpy(packet_bufX, dataX, rcv_len - sizeof(jacknet_packet_header));
  143. }
  144. return pkt_size;
  145. }
  146. int netjack_recv(int sockfd, char *packet_buf, int pkt_size, int flags, int mtu)
  147. {
  148. if (pkt_size <= mtu) {
  149. return recv(sockfd, packet_buf, pkt_size, flags);
  150. } else {
  151. char *rx_packet = alloca(mtu);
  152. char *dataX = rx_packet + sizeof(jacknet_packet_header);
  153. int fragment_payload_size = mtu - sizeof(jacknet_packet_header);
  154. jacknet_packet_header *pkthdr = (jacknet_packet_header *)rx_packet;
  155. // Now loop and send all
  156. char *packet_bufX = packet_buf + sizeof(jacknet_packet_header);
  157. // wait for fragment_nr == 0
  158. int rcv_len;
  159. rx_again:
  160. rcv_len = recv(sockfd, rx_packet, mtu, flags);
  161. if (rcv_len < 0)
  162. return rcv_len;
  163. if (rcv_len >= sizeof(jacknet_packet_header)) {
  164. //printf("got fragmentooo_nr = %d\n", ntohl(pkthdr->fragment_nr));
  165. if (ntohl(pkthdr->fragment_nr) != 0)
  166. goto rx_again;
  167. } else {
  168. goto rx_again;
  169. }
  170. //printf("ok we got a fragment 0\n");
  171. // ok... we have read a fragement 0;
  172. // copy the packet header...
  173. memcpy(packet_buf, rx_packet, sizeof(jacknet_packet_header));
  174. int fragment_count = 0;
  175. while (packet_bufX <= (packet_buf + pkt_size - fragment_payload_size)) {
  176. // check fragment number.
  177. if (ntohl(pkthdr->fragment_nr) != fragment_count) {
  178. printf("got unexpected fragment %d (expected %d)\n", ntohl(pkthdr->fragment_nr), fragment_count);
  179. return sizeof(jacknet_packet_header) + (fragment_count - 1) * fragment_payload_size;
  180. }
  181. // copy the payload into the packet buffer...
  182. memcpy(packet_bufX, dataX, fragment_payload_size);
  183. rcv_len = recv(sockfd, rx_packet, mtu, flags);
  184. //printf("got fragmen_nr = %d rcv_len = %d\n", ntohl(pkthdr->fragment_nr), rcv_len);
  185. if (rcv_len < 0)
  186. return -1;
  187. packet_bufX += fragment_payload_size;
  188. fragment_count++;
  189. }
  190. //int last_payload_size = packet_bufX - packet_buf - pkt_size;
  191. //memcpy(packet_bufX, dataX, rcv_len - sizeof(jacknet_packet_header));
  192. }
  193. return pkt_size;
  194. }
  195. void netjack_sendto(int sockfd, char *packet_buf, int pkt_size, int flags, struct sockaddr *addr, int addr_size, int mtu)
  196. {
  197. int frag_cnt = 0;
  198. char *tx_packet, *dataX;
  199. jacknet_packet_header *pkthdr;
  200. tx_packet = alloca(mtu + 10);
  201. dataX = tx_packet + sizeof(jacknet_packet_header);
  202. pkthdr = (jacknet_packet_header *)tx_packet;
  203. int fragment_payload_size = mtu - sizeof(jacknet_packet_header);
  204. if (pkt_size <= mtu) {
  205. sendto(sockfd, packet_buf, pkt_size, flags, addr, addr_size);
  206. } else {
  207. // Copy the packet header to the tx pack first.
  208. memcpy(tx_packet, packet_buf, sizeof(jacknet_packet_header));
  209. // Now loop and send all
  210. char *packet_bufX = packet_buf + sizeof(jacknet_packet_header);
  211. while (packet_bufX < (packet_buf + pkt_size - fragment_payload_size)) {
  212. pkthdr->fragment_nr = htonl(frag_cnt++);
  213. memcpy(dataX, packet_bufX, fragment_payload_size);
  214. int err = sendto(sockfd, tx_packet, mtu, flags, addr, addr_size);
  215. packet_bufX += fragment_payload_size;
  216. }
  217. int last_payload_size = packet_buf + pkt_size - packet_bufX;
  218. memcpy(dataX, packet_bufX, last_payload_size);
  219. pkthdr->fragment_nr = htonl(frag_cnt);
  220. //printf("last fragment_count = %d, payload_size = %d\n", fragment_count, last_payload_size);
  221. // sendto(last_pack_size);
  222. sendto(sockfd, tx_packet, last_payload_size + sizeof(jacknet_packet_header), flags, addr, addr_size);
  223. }
  224. }
  225. // render functions for float
  226. void render_payload_to_jack_ports_float( void *packet_payload, jack_nframes_t net_period_down, JSList *capture_ports, JSList *capture_srcs, jack_nframes_t nframes)
  227. {
  228. channel_t chn = 0;
  229. JSList *node = capture_ports;
  230. JSList *src_node = capture_srcs;
  231. uint32_t *packet_bufX = (uint32_t *)packet_payload;
  232. while (node != NULL) {
  233. int i;
  234. int_float_t val;
  235. SRC_DATA src;
  236. jack_port_t *port = (jack_port_t *) node->data;
  237. jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
  238. if (net_period_down != nframes) {
  239. SRC_STATE *src_state = src_node->data;
  240. for (i = 0; i < net_period_down; i++) {
  241. packet_bufX[i] = ntohl(packet_bufX[i]);
  242. }
  243. src.data_in = (float *)packet_bufX;
  244. src.input_frames = net_period_down;
  245. src.data_out = buf;
  246. src.output_frames = nframes;
  247. src.src_ratio = (float) nframes / (float) net_period_down;
  248. src.end_of_input = 0;
  249. src_set_ratio(src_state, src.src_ratio);
  250. src_process(src_state, &src);
  251. src_node = jack_slist_next (src_node);
  252. } else {
  253. for (i = 0; i < net_period_down; i++) {
  254. val.i = packet_bufX[i];
  255. val.i = ntohl(val.i);
  256. buf[i] = val.f;
  257. }
  258. }
  259. packet_bufX = (packet_bufX + net_period_down);
  260. node = jack_slist_next (node);
  261. chn++;
  262. }
  263. }
  264. void render_jack_ports_to_payload_float (JSList *playback_ports, JSList *playback_srcs, jack_nframes_t nframes, void *packet_payload, jack_nframes_t net_period_up)
  265. {
  266. channel_t chn = 0;
  267. JSList *node = playback_ports;
  268. JSList *src_node = playback_srcs;
  269. uint32_t *packet_bufX = (uint32_t *)packet_payload;
  270. while (node != NULL) {
  271. SRC_DATA src;
  272. int i;
  273. int_float_t val;
  274. jack_port_t *port = (jack_port_t *) node->data;
  275. jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
  276. if (net_period_up != nframes) {
  277. SRC_STATE *src_state = src_node->data;
  278. src.data_in = buf;
  279. src.input_frames = nframes;
  280. src.data_out = (float *) packet_bufX;
  281. src.output_frames = net_period_up;
  282. src.src_ratio = (float) net_period_up / (float) nframes;
  283. src.end_of_input = 0;
  284. src_set_ratio(src_state, src.src_ratio);
  285. src_process(src_state, &src);
  286. for (i = 0; i < net_period_up; i++) {
  287. packet_bufX[i] = htonl(packet_bufX[i]);
  288. }
  289. src_node = jack_slist_next (src_node);
  290. } else {
  291. for (i = 0; i < net_period_up; i++) {
  292. val.f = buf[i];
  293. val.i = htonl(val.i);
  294. packet_bufX[i] = val.i;
  295. }
  296. }
  297. packet_bufX = (packet_bufX + net_period_up);
  298. node = jack_slist_next (node);
  299. chn++;
  300. }
  301. }
  302. // render functions for 16bit
  303. void render_payload_to_jack_ports_16bit( void *packet_payload, jack_nframes_t net_period_down, JSList *capture_ports, JSList *capture_srcs, jack_nframes_t nframes)
  304. {
  305. channel_t chn = 0;
  306. JSList *node = capture_ports;
  307. JSList *src_node = capture_srcs;
  308. uint16_t *packet_bufX = (uint16_t *)packet_payload;
  309. while (node != NULL) {
  310. int i;
  311. //uint32_t val;
  312. SRC_DATA src;
  313. jack_port_t *port = (jack_port_t *) node->data;
  314. jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
  315. float *floatbuf = alloca(sizeof(float) * net_period_down);
  316. if (net_period_down != nframes) {
  317. SRC_STATE *src_state = src_node->data;
  318. for (i = 0; i < net_period_down; i++) {
  319. floatbuf[i] = ((float) ntohs(packet_bufX[i])) / 32767.0 - 1.0;
  320. }
  321. src.data_in = floatbuf;
  322. src.input_frames = net_period_down;
  323. src.data_out = buf;
  324. src.output_frames = nframes;
  325. src.src_ratio = (float) nframes / (float) net_period_down;
  326. src.end_of_input = 0;
  327. src_set_ratio(src_state, src.src_ratio);
  328. src_process(src_state, &src);
  329. src_node = jack_slist_next (src_node);
  330. } else {
  331. for (i = 0; i < net_period_down; i++) {
  332. buf[i] = ((float) ntohs(packet_bufX[i])) / 32768.0 - 1.0;
  333. }
  334. }
  335. packet_bufX = (packet_bufX + net_period_down);
  336. node = jack_slist_next (node);
  337. chn++;
  338. }
  339. }
  340. void render_jack_ports_to_payload_16bit (JSList *playback_ports, JSList *playback_srcs, jack_nframes_t nframes, void *packet_payload, jack_nframes_t net_period_up)
  341. {
  342. channel_t chn = 0;
  343. JSList *node = playback_ports;
  344. JSList *src_node = playback_srcs;
  345. uint16_t *packet_bufX = (uint16_t *)packet_payload;
  346. while (node != NULL) {
  347. SRC_DATA src;
  348. int i;
  349. jack_port_t *port = (jack_port_t *) node->data;
  350. jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
  351. if (net_period_up != nframes) {
  352. SRC_STATE *src_state = src_node->data;
  353. float *floatbuf = alloca(sizeof(float) * net_period_up);
  354. src.data_in = buf;
  355. src.input_frames = nframes;
  356. src.data_out = floatbuf;
  357. src.output_frames = net_period_up;
  358. src.src_ratio = (float) net_period_up / (float) nframes;
  359. src.end_of_input = 0;
  360. src_set_ratio(src_state, src.src_ratio);
  361. src_process(src_state, &src);
  362. for (i = 0; i < net_period_up; i++) {
  363. packet_bufX[i] = htons(((uint16_t)((floatbuf[i] + 1.0) * 32767.0)));
  364. }
  365. src_node = jack_slist_next (src_node);
  366. } else {
  367. for (i = 0; i < net_period_up; i++) {
  368. packet_bufX[i] = htons(((uint16_t)((buf[i] + 1.0) * 32767.0)));
  369. }
  370. }
  371. packet_bufX = (packet_bufX + net_period_up);
  372. node = jack_slist_next (node);
  373. chn++;
  374. }
  375. }
  376. // render functions for 8bit
  377. void render_payload_to_jack_ports_8bit(void *packet_payload, jack_nframes_t net_period_down, JSList *capture_ports, JSList *capture_srcs, jack_nframes_t nframes)
  378. {
  379. channel_t chn = 0;
  380. JSList *node = capture_ports;
  381. JSList *src_node = capture_srcs;
  382. int8_t *packet_bufX = (int8_t *)packet_payload;
  383. while (node != NULL) {
  384. int i;
  385. //uint32_t val;
  386. SRC_DATA src;
  387. jack_port_t *port = (jack_port_t *) node->data;
  388. jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
  389. float *floatbuf = alloca(sizeof(float) * net_period_down);
  390. if (net_period_down != nframes) {
  391. SRC_STATE *src_state = src_node->data;
  392. for (i = 0; i < net_period_down; i++) {
  393. floatbuf[i] = ((float) packet_bufX[i]) / 127.0;
  394. }
  395. src.data_in = floatbuf;
  396. src.input_frames = net_period_down;
  397. src.data_out = buf;
  398. src.output_frames = nframes;
  399. src.src_ratio = (float) nframes / (float) net_period_down;
  400. src.end_of_input = 0;
  401. src_set_ratio(src_state, src.src_ratio);
  402. src_process(src_state, &src);
  403. src_node = jack_slist_next (src_node);
  404. } else {
  405. for (i = 0; i < net_period_down; i++) {
  406. buf[i] = ((float) packet_bufX[i]) / 127.0;
  407. }
  408. }
  409. packet_bufX = (packet_bufX + net_period_down);
  410. node = jack_slist_next (node);
  411. chn++;
  412. }
  413. }
  414. void render_jack_ports_to_payload_8bit(JSList *playback_ports, JSList *playback_srcs, jack_nframes_t nframes, void *packet_payload, jack_nframes_t net_period_up)
  415. {
  416. channel_t chn = 0;
  417. JSList *node = playback_ports;
  418. JSList *src_node = playback_srcs;
  419. int8_t *packet_bufX = (int8_t *)packet_payload;
  420. while (node != NULL) {
  421. SRC_DATA src;
  422. int i;
  423. jack_port_t *port = (jack_port_t *) node->data;
  424. jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
  425. if (net_period_up != nframes) {
  426. SRC_STATE *src_state = src_node->data;
  427. float *floatbuf = alloca(sizeof(float) * net_period_up);
  428. src.data_in = buf;
  429. src.input_frames = nframes;
  430. src.data_out = floatbuf;
  431. src.output_frames = net_period_up;
  432. src.src_ratio = (float) net_period_up / (float) nframes;
  433. src.end_of_input = 0;
  434. src_set_ratio(src_state, src.src_ratio);
  435. src_process(src_state, &src);
  436. for (i = 0; i < net_period_up; i++) {
  437. packet_bufX[i] = floatbuf[i] * 127.0;
  438. }
  439. src_node = jack_slist_next (src_node);
  440. } else {
  441. for (i = 0; i < net_period_up; i++) {
  442. packet_bufX[i] = buf[i] * 127.0;
  443. }
  444. }
  445. packet_bufX = (packet_bufX + net_period_up);
  446. node = jack_slist_next (node);
  447. chn++;
  448. }
  449. }
  450. // wrapper functions with bitdepth argument...
  451. void render_payload_to_jack_ports(int bitdepth, void *packet_payload, jack_nframes_t net_period_down, JSList *capture_ports, JSList *capture_srcs, jack_nframes_t nframes)
  452. {
  453. if (bitdepth == 8)
  454. render_payload_to_jack_ports_8bit(packet_payload, net_period_down, capture_ports, capture_srcs, nframes);
  455. else if (bitdepth == 16)
  456. render_payload_to_jack_ports_16bit(packet_payload, net_period_down, capture_ports, capture_srcs, nframes);
  457. else
  458. render_payload_to_jack_ports_float(packet_payload, net_period_down, capture_ports, capture_srcs, nframes);
  459. }
  460. void render_jack_ports_to_payload(int bitdepth, JSList *playback_ports, JSList *playback_srcs, jack_nframes_t nframes, void *packet_payload, jack_nframes_t net_period_up)
  461. {
  462. if (bitdepth == 8)
  463. render_jack_ports_to_payload_8bit(playback_ports, playback_srcs, nframes, packet_payload, net_period_up);
  464. else if (bitdepth == 16)
  465. render_jack_ports_to_payload_16bit(playback_ports, playback_srcs, nframes, packet_payload, net_period_up);
  466. else
  467. render_jack_ports_to_payload_float(playback_ports, playback_srcs, nframes, packet_payload, net_period_up);
  468. }