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.

1429 lines
43KB

  1. /*
  2. * NetJack - Packet Handling functions
  3. *
  4. * used by the driver and the jacknet_client
  5. *
  6. * Copyright (C) 2008 Marc-Olivier Barre <marco@marcochapeau.org>
  7. * Copyright (C) 2008 Pieter Palmers <pieterpalmers@users.sourceforge.net>
  8. * Copyright (C) 2006 Torben Hohn <torbenh@gmx.de>
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 2 of the License, or
  13. * (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with this program; if not, write to the Free Software
  22. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  23. *
  24. * $Id: net_driver.c,v 1.16 2006/03/20 19:41:37 torbenh Exp $
  25. *
  26. */
  27. #include "config.h"
  28. #if HAVE_PPOLL
  29. #define _GNU_SOURCE
  30. #endif
  31. #include <math.h>
  32. #include <stdio.h>
  33. #include <memory.h>
  34. #include <unistd.h>
  35. #include <stdlib.h>
  36. #include <errno.h>
  37. #include <stdarg.h>
  38. #include <jack/types.h>
  39. #include <jack/engine.h>
  40. #include <sys/types.h>
  41. #include <sys/socket.h>
  42. #include <netinet/in.h>
  43. #include <poll.h>
  44. #include <errno.h>
  45. #include <signal.h>
  46. #if HAVE_SAMPLERATE
  47. #include <samplerate.h>
  48. #endif
  49. #if HAVE_CELT
  50. #include <celt/celt.h>
  51. #endif
  52. #include "net_driver.h"
  53. #include "netjack_packet.h"
  54. int fraggo = 0;
  55. packet_cache *global_packcache;
  56. void
  57. packet_header_hton (jacknet_packet_header *pkthdr)
  58. {
  59. pkthdr->capture_channels_audio = htonl(pkthdr->capture_channels_audio);
  60. pkthdr->playback_channels_audio = htonl(pkthdr->playback_channels_audio);
  61. pkthdr->capture_channels_midi = htonl(pkthdr->capture_channels_midi);
  62. pkthdr->playback_channels_midi = htonl(pkthdr->playback_channels_midi);
  63. pkthdr->period_size = htonl(pkthdr->period_size);
  64. pkthdr->sample_rate = htonl(pkthdr->sample_rate);
  65. pkthdr->sync_state = htonl(pkthdr->sync_state);
  66. pkthdr->transport_frame = htonl(pkthdr->transport_frame);
  67. pkthdr->transport_state = htonl(pkthdr->transport_state);
  68. pkthdr->framecnt = htonl(pkthdr->framecnt);
  69. pkthdr->latency = htonl(pkthdr->latency);
  70. pkthdr->reply_port = htonl(pkthdr->reply_port);
  71. pkthdr->mtu = htonl(pkthdr->mtu);
  72. pkthdr->fragment_nr = htonl(pkthdr->fragment_nr);
  73. }
  74. void
  75. packet_header_ntoh (jacknet_packet_header *pkthdr)
  76. {
  77. pkthdr->capture_channels_audio = ntohl(pkthdr->capture_channels_audio);
  78. pkthdr->playback_channels_audio = ntohl(pkthdr->playback_channels_audio);
  79. pkthdr->capture_channels_midi = ntohl(pkthdr->capture_channels_midi);
  80. pkthdr->playback_channels_midi = ntohl(pkthdr->playback_channels_midi);
  81. pkthdr->period_size = ntohl(pkthdr->period_size);
  82. pkthdr->sample_rate = ntohl(pkthdr->sample_rate);
  83. pkthdr->sync_state = ntohl(pkthdr->sync_state);
  84. pkthdr->transport_frame = ntohl(pkthdr->transport_frame);
  85. pkthdr->transport_state = ntohl(pkthdr->transport_state);
  86. pkthdr->framecnt = ntohl(pkthdr->framecnt);
  87. pkthdr->latency = ntohl(pkthdr->latency);
  88. pkthdr->reply_port = ntohl(pkthdr->reply_port);
  89. pkthdr->mtu = ntohl(pkthdr->mtu);
  90. pkthdr->fragment_nr = ntohl(pkthdr->fragment_nr);
  91. }
  92. int get_sample_size (int bitdepth)
  93. {
  94. if (bitdepth == 8)
  95. return sizeof (int8_t);
  96. if (bitdepth == 16)
  97. return sizeof (int16_t);
  98. if( bitdepth == 1000 )
  99. return sizeof( unsigned char );
  100. return sizeof (int32_t);
  101. }
  102. // fragment management functions.
  103. packet_cache
  104. *packet_cache_new (int num_packets, int pkt_size, int mtu)
  105. {
  106. int fragment_payload_size = mtu - sizeof (jacknet_packet_header);
  107. int i, fragment_number;
  108. if( pkt_size == sizeof(jacknet_packet_header) )
  109. fragment_number = 1;
  110. else
  111. fragment_number = (pkt_size - sizeof (jacknet_packet_header) - 1) / fragment_payload_size + 1;
  112. packet_cache *pcache = malloc (sizeof (packet_cache));
  113. if (pcache == NULL)
  114. {
  115. jack_error ("could not allocate packet cache (1)\n");
  116. return NULL;
  117. }
  118. pcache->size = num_packets;
  119. pcache->packets = malloc (sizeof (cache_packet) * num_packets);
  120. pcache->master_address_valid = 0;
  121. pcache->last_framecnt_retreived = 0;
  122. pcache->last_framecnt_retreived_valid = 0;
  123. if (pcache->packets == NULL)
  124. {
  125. jack_error ("could not allocate packet cache (2)\n");
  126. return NULL;
  127. }
  128. for (i = 0; i < num_packets; i++)
  129. {
  130. pcache->packets[i].valid = 0;
  131. pcache->packets[i].num_fragments = fragment_number;
  132. pcache->packets[i].packet_size = pkt_size;
  133. pcache->packets[i].mtu = mtu;
  134. pcache->packets[i].framecnt = 0;
  135. pcache->packets[i].fragment_array = malloc (sizeof (char) * fragment_number);
  136. pcache->packets[i].packet_buf = malloc (pkt_size);
  137. if ((pcache->packets[i].fragment_array == NULL) || (pcache->packets[i].packet_buf == NULL))
  138. {
  139. jack_error ("could not allocate packet cache (3)\n");
  140. return NULL;
  141. }
  142. }
  143. pcache->mtu = mtu;
  144. return pcache;
  145. }
  146. void
  147. packet_cache_free (packet_cache *pcache)
  148. {
  149. int i;
  150. for (i = 0; i < pcache->size; i++)
  151. {
  152. free (pcache->packets[i].fragment_array);
  153. free (pcache->packets[i].packet_buf);
  154. }
  155. free (pcache->packets);
  156. free (pcache);
  157. }
  158. cache_packet
  159. *packet_cache_get_packet (packet_cache *pcache, jack_nframes_t framecnt)
  160. {
  161. int i;
  162. cache_packet *retval;
  163. for (i = 0; i < pcache->size; i++)
  164. {
  165. if (pcache->packets[i].valid && (pcache->packets[i].framecnt == framecnt))
  166. return &(pcache->packets[i]);
  167. }
  168. // The Packet is not in the packet cache.
  169. // find a free packet.
  170. retval = packet_cache_get_free_packet (pcache);
  171. if (retval != NULL)
  172. {
  173. cache_packet_set_framecnt (retval, framecnt);
  174. return retval;
  175. }
  176. // No Free Packet available
  177. // Get The Oldest packet and reset it.
  178. retval = packet_cache_get_oldest_packet (pcache);
  179. //printf( "Dropping %d from Cache :S\n", retval->framecnt );
  180. cache_packet_reset (retval);
  181. cache_packet_set_framecnt (retval, framecnt);
  182. return retval;
  183. }
  184. // TODO: fix wrapping case... need to pass
  185. // current expected frame here.
  186. //
  187. // or just save framecount into packet_cache.
  188. cache_packet
  189. *packet_cache_get_oldest_packet (packet_cache *pcache)
  190. {
  191. jack_nframes_t minimal_frame = JACK_MAX_FRAMES;
  192. cache_packet *retval = &(pcache->packets[0]);
  193. int i;
  194. for (i = 0; i < pcache->size; i++)
  195. {
  196. if (pcache->packets[i].valid && (pcache->packets[i].framecnt < minimal_frame))
  197. {
  198. minimal_frame = pcache->packets[i].framecnt;
  199. retval = &(pcache->packets[i]);
  200. }
  201. }
  202. return retval;
  203. }
  204. cache_packet
  205. *packet_cache_get_free_packet (packet_cache *pcache)
  206. {
  207. int i;
  208. for (i = 0; i < pcache->size; i++)
  209. {
  210. if (pcache->packets[i].valid == 0)
  211. return &(pcache->packets[i]);
  212. }
  213. return NULL;
  214. }
  215. void
  216. cache_packet_reset (cache_packet *pack)
  217. {
  218. int i;
  219. pack->valid = 0;
  220. // XXX: i dont think this is necessary here...
  221. // fragement array is cleared in _set_framecnt()
  222. for (i = 0; i < pack->num_fragments; i++)
  223. pack->fragment_array[i] = 0;
  224. }
  225. void
  226. cache_packet_set_framecnt (cache_packet *pack, jack_nframes_t framecnt)
  227. {
  228. int i;
  229. pack->framecnt = framecnt;
  230. for (i = 0; i < pack->num_fragments; i++)
  231. pack->fragment_array[i] = 0;
  232. pack->valid = 1;
  233. }
  234. void
  235. cache_packet_add_fragment (cache_packet *pack, char *packet_buf, int rcv_len)
  236. {
  237. jacknet_packet_header *pkthdr = (jacknet_packet_header *) packet_buf;
  238. int fragment_payload_size = pack->mtu - sizeof (jacknet_packet_header);
  239. char *packet_bufX = pack->packet_buf + sizeof (jacknet_packet_header);
  240. char *dataX = packet_buf + sizeof (jacknet_packet_header);
  241. jack_nframes_t fragment_nr = ntohl (pkthdr->fragment_nr);
  242. jack_nframes_t framecnt = ntohl (pkthdr->framecnt);
  243. if (framecnt != pack->framecnt)
  244. {
  245. jack_error ("errror. framecnts dont match\n");
  246. return;
  247. }
  248. if (fragment_nr == 0)
  249. {
  250. memcpy (pack->packet_buf, packet_buf, rcv_len);
  251. pack->fragment_array[0] = 1;
  252. return;
  253. }
  254. if ((fragment_nr < pack->num_fragments) && (fragment_nr > 0))
  255. {
  256. if ((fragment_nr * fragment_payload_size + rcv_len - sizeof (jacknet_packet_header)) <= (pack->packet_size - sizeof (jacknet_packet_header)))
  257. {
  258. memcpy (packet_bufX + fragment_nr * fragment_payload_size, dataX, rcv_len - sizeof (jacknet_packet_header));
  259. pack->fragment_array[fragment_nr] = 1;
  260. }
  261. else
  262. jack_error ("too long packet received...");
  263. }
  264. }
  265. int
  266. cache_packet_is_complete (cache_packet *pack)
  267. {
  268. int i;
  269. for (i = 0; i < pack->num_fragments; i++)
  270. if (pack->fragment_array[i] == 0)
  271. return FALSE;
  272. return TRUE;
  273. }
  274. // new poll using nanoseconds resolution and
  275. // not waiting forever.
  276. int
  277. netjack_poll_deadline (int sockfd, jack_time_t deadline)
  278. {
  279. struct pollfd fds;
  280. int i, poll_err = 0;
  281. sigset_t sigmask;
  282. struct sigaction action;
  283. #if HAVE_PPOLL
  284. struct timespec timeout_spec = { 0, 0 };
  285. #else
  286. sigset_t rsigmask;
  287. int timeout;
  288. #endif
  289. jack_time_t now = jack_get_time();
  290. if( now >= deadline )
  291. return 0;
  292. #if HAVE_PPOLL
  293. timeout_spec.tv_nsec = (deadline - now) * 1000;
  294. #else
  295. timeout = lrintf( (float)(deadline - now) / 1000.0 );
  296. #endif
  297. sigemptyset(&sigmask);
  298. sigaddset(&sigmask, SIGHUP);
  299. sigaddset(&sigmask, SIGINT);
  300. sigaddset(&sigmask, SIGQUIT);
  301. sigaddset(&sigmask, SIGPIPE);
  302. sigaddset(&sigmask, SIGTERM);
  303. sigaddset(&sigmask, SIGUSR1);
  304. sigaddset(&sigmask, SIGUSR2);
  305. action.sa_handler = SIG_DFL;
  306. action.sa_mask = sigmask;
  307. action.sa_flags = SA_RESTART;
  308. for (i = 1; i < NSIG; i++)
  309. if (sigismember (&sigmask, i))
  310. sigaction (i, &action, 0);
  311. fds.fd = sockfd;
  312. fds.events = POLLIN;
  313. #if HAVE_PPOLL
  314. poll_err = ppoll (&fds, 1, &timeout_spec, &sigmask);
  315. #else
  316. sigprocmask (SIG_UNBLOCK, &sigmask, &rsigmask);
  317. poll_err = poll (&fds, 1, timeout);
  318. sigprocmask (SIG_SETMASK, &rsigmask, NULL);
  319. #endif
  320. if (poll_err == -1)
  321. {
  322. switch (errno)
  323. {
  324. case EBADF:
  325. jack_error ("Error %d: An invalid file descriptor was given in one of the sets", errno);
  326. break;
  327. case EFAULT:
  328. jack_error ("Error %d: The array given as argument was not contained in the calling program's address space", errno);
  329. break;
  330. case EINTR:
  331. jack_error ("Error %d: A signal occurred before any requested event", errno);
  332. break;
  333. case EINVAL:
  334. jack_error ("Error %d: The nfds value exceeds the RLIMIT_NOFILE value", errno);
  335. break;
  336. case ENOMEM:
  337. jack_error ("Error %d: There was no space to allocate file descriptor tables", errno);
  338. break;
  339. }
  340. }
  341. return poll_err;
  342. }
  343. int
  344. netjack_poll (int sockfd, int timeout)
  345. {
  346. struct pollfd fds;
  347. int i, poll_err = 0;
  348. sigset_t sigmask, rsigmask;
  349. struct sigaction action;
  350. sigemptyset(&sigmask);
  351. sigaddset(&sigmask, SIGHUP);
  352. sigaddset(&sigmask, SIGINT);
  353. sigaddset(&sigmask, SIGQUIT);
  354. sigaddset(&sigmask, SIGPIPE);
  355. sigaddset(&sigmask, SIGTERM);
  356. sigaddset(&sigmask, SIGUSR1);
  357. sigaddset(&sigmask, SIGUSR2);
  358. action.sa_handler = SIG_DFL;
  359. action.sa_mask = sigmask;
  360. action.sa_flags = SA_RESTART;
  361. for (i = 1; i < NSIG; i++)
  362. if (sigismember (&sigmask, i))
  363. sigaction (i, &action, 0);
  364. fds.fd = sockfd;
  365. fds.events = POLLIN;
  366. sigprocmask(SIG_UNBLOCK, &sigmask, &rsigmask);
  367. while (poll_err == 0)
  368. {
  369. poll_err = poll (&fds, 1, timeout);
  370. }
  371. sigprocmask(SIG_SETMASK, &rsigmask, NULL);
  372. if (poll_err == -1)
  373. {
  374. switch (errno)
  375. {
  376. case EBADF:
  377. jack_error ("Error %d: An invalid file descriptor was given in one of the sets", errno);
  378. break;
  379. case EFAULT:
  380. jack_error ("Error %d: The array given as argument was not contained in the calling program's address space", errno);
  381. break;
  382. case EINTR:
  383. jack_error ("Error %d: A signal occurred before any requested event", errno);
  384. break;
  385. case EINVAL:
  386. jack_error ("Error %d: The nfds value exceeds the RLIMIT_NOFILE value", errno);
  387. break;
  388. case ENOMEM:
  389. jack_error ("Error %d: There was no space to allocate file descriptor tables", errno);
  390. break;
  391. }
  392. return FALSE;
  393. }
  394. return TRUE;
  395. }
  396. // This now reads all a socket has into the cache.
  397. // replacing netjack_recv functions.
  398. void
  399. packet_cache_drain_socket( packet_cache *pcache, int sockfd )
  400. {
  401. char *rx_packet = alloca (pcache->mtu);
  402. jacknet_packet_header *pkthdr = (jacknet_packet_header *) rx_packet;
  403. int rcv_len;
  404. jack_nframes_t framecnt;
  405. cache_packet *cpack;
  406. struct sockaddr_in sender_address;
  407. socklen_t senderlen = sizeof( struct sockaddr_in );
  408. while (1)
  409. {
  410. rcv_len = recvfrom (sockfd, rx_packet, pcache->mtu, MSG_DONTWAIT,
  411. (struct sockaddr*) &sender_address, &senderlen);
  412. if (rcv_len < 0)
  413. return;
  414. if (pcache->master_address_valid) {
  415. // Verify its from our master.
  416. if (memcmp (&sender_address, &(pcache->master_address), senderlen) != 0)
  417. continue;
  418. } else {
  419. // Setup this one as master
  420. //printf( "setup master...\n" );
  421. memcpy ( &(pcache->master_address), &sender_address, senderlen );
  422. pcache->master_address_valid = 1;
  423. }
  424. framecnt = ntohl (pkthdr->framecnt);
  425. if( pcache->last_framecnt_retreived_valid && (framecnt <= pcache->last_framecnt_retreived ))
  426. continue;
  427. //printf( "Got Packet %d\n", framecnt );
  428. cpack = packet_cache_get_packet (global_packcache, framecnt);
  429. cache_packet_add_fragment (cpack, rx_packet, rcv_len);
  430. cpack->recv_timestamp = jack_get_time();
  431. }
  432. }
  433. void
  434. packet_cache_reset_master_address( packet_cache *pcache )
  435. {
  436. pcache->master_address_valid = 0;
  437. pcache->last_framecnt_retreived = 0;
  438. pcache->last_framecnt_retreived_valid = 0;
  439. }
  440. void
  441. packet_cache_clear_old_packets (packet_cache *pcache, jack_nframes_t framecnt )
  442. {
  443. int i;
  444. for (i = 0; i < pcache->size; i++)
  445. {
  446. if (pcache->packets[i].valid && (pcache->packets[i].framecnt < framecnt))
  447. {
  448. cache_packet_reset (&(pcache->packets[i]));
  449. }
  450. }
  451. }
  452. int
  453. packet_cache_retreive_packet( packet_cache *pcache, jack_nframes_t framecnt, char *packet_buf, int pkt_size, jack_time_t *timestamp )
  454. {
  455. int i;
  456. cache_packet *cpack = NULL;
  457. for (i = 0; i < pcache->size; i++) {
  458. if (pcache->packets[i].valid && (pcache->packets[i].framecnt == framecnt)) {
  459. cpack = &(pcache->packets[i]);
  460. break;
  461. }
  462. }
  463. if( cpack == NULL ) {
  464. //printf( "retreive packet: %d....not found\n", framecnt );
  465. return -1;
  466. }
  467. if( !cache_packet_is_complete( cpack ) ) {
  468. return -1;
  469. }
  470. // ok. cpack is the one we want and its complete.
  471. memcpy (packet_buf, cpack->packet_buf, pkt_size);
  472. if( timestamp )
  473. *timestamp = cpack->recv_timestamp;
  474. pcache->last_framecnt_retreived_valid = 1;
  475. pcache->last_framecnt_retreived = framecnt;
  476. cache_packet_reset (cpack);
  477. packet_cache_clear_old_packets( pcache, framecnt );
  478. return pkt_size;
  479. }
  480. float
  481. packet_cache_get_fill( packet_cache *pcache, jack_nframes_t expected_framecnt )
  482. {
  483. int num_packets_before_us = 0;
  484. int i;
  485. for (i = 0; i < pcache->size; i++)
  486. {
  487. cache_packet *cpack = &(pcache->packets[i]);
  488. if (cpack->valid && cache_packet_is_complete( cpack ))
  489. if( cpack->framecnt >= expected_framecnt )
  490. num_packets_before_us += 1;
  491. }
  492. return 100.0 * (float)num_packets_before_us / (float)( pcache->size ) ;
  493. }
  494. // Returns 0 when no valid packet is inside the cache.
  495. int
  496. packet_cache_get_next_available_framecnt( packet_cache *pcache, jack_nframes_t expected_framecnt, jack_nframes_t *framecnt )
  497. {
  498. int i;
  499. jack_nframes_t best_offset = JACK_MAX_FRAMES/2-1;
  500. int retval = 0;
  501. for (i = 0; i < pcache->size; i++)
  502. {
  503. cache_packet *cpack = &(pcache->packets[i]);
  504. //printf( "p%d: valid=%d, frame %d\n", i, cpack->valid, cpack->framecnt );
  505. if (!cpack->valid || !cache_packet_is_complete( cpack )) {
  506. //printf( "invalid\n" );
  507. continue;
  508. }
  509. if( (cpack->framecnt - expected_framecnt) > best_offset ) {
  510. continue;
  511. }
  512. best_offset = cpack->framecnt - expected_framecnt;
  513. retval = 1;
  514. if( best_offset == 0 )
  515. break;
  516. }
  517. if( retval && framecnt )
  518. *framecnt = expected_framecnt + best_offset;
  519. return retval;
  520. }
  521. int
  522. packet_cache_get_highest_available_framecnt( packet_cache *pcache, jack_nframes_t *framecnt )
  523. {
  524. int i;
  525. jack_nframes_t best_value = 0;
  526. int retval = 0;
  527. for (i = 0; i < pcache->size; i++)
  528. {
  529. cache_packet *cpack = &(pcache->packets[i]);
  530. //printf( "p%d: valid=%d, frame %d\n", i, cpack->valid, cpack->framecnt );
  531. if (!cpack->valid || !cache_packet_is_complete( cpack )) {
  532. //printf( "invalid\n" );
  533. continue;
  534. }
  535. if (cpack->framecnt < best_value) {
  536. continue;
  537. }
  538. best_value = cpack->framecnt;
  539. retval = 1;
  540. }
  541. if( retval && framecnt )
  542. *framecnt = best_value;
  543. return retval;
  544. }
  545. // Returns 0 when no valid packet is inside the cache.
  546. int
  547. packet_cache_find_latency( packet_cache *pcache, jack_nframes_t expected_framecnt, jack_nframes_t *framecnt )
  548. {
  549. int i;
  550. jack_nframes_t best_offset = 0;
  551. int retval = 0;
  552. for (i = 0; i < pcache->size; i++)
  553. {
  554. cache_packet *cpack = &(pcache->packets[i]);
  555. //printf( "p%d: valid=%d, frame %d\n", i, cpack->valid, cpack->framecnt );
  556. if (!cpack->valid || !cache_packet_is_complete( cpack )) {
  557. //printf( "invalid\n" );
  558. continue;
  559. }
  560. if( (cpack->framecnt - expected_framecnt) < best_offset ) {
  561. continue;
  562. }
  563. best_offset = cpack->framecnt - expected_framecnt;
  564. retval = 1;
  565. if( best_offset == 0 )
  566. break;
  567. }
  568. if( retval && framecnt )
  569. *framecnt = JACK_MAX_FRAMES - best_offset;
  570. return retval;
  571. }
  572. // fragmented packet IO
  573. int
  574. netjack_recvfrom (int sockfd, char *packet_buf, int pkt_size, int flags, struct sockaddr *addr, socklen_t *addr_size, int mtu)
  575. {
  576. if (pkt_size <= mtu)
  577. return recvfrom (sockfd, packet_buf, pkt_size, flags, addr, addr_size);
  578. char *rx_packet = alloca (mtu);
  579. jacknet_packet_header *pkthdr = (jacknet_packet_header *) rx_packet;
  580. int rcv_len;
  581. jack_nframes_t framecnt;
  582. cache_packet *cpack;
  583. do
  584. {
  585. rcv_len = recvfrom (sockfd, rx_packet, mtu, 0, addr, addr_size);
  586. if (rcv_len < 0)
  587. return rcv_len;
  588. framecnt = ntohl (pkthdr->framecnt);
  589. cpack = packet_cache_get_packet (global_packcache, framecnt);
  590. cache_packet_add_fragment (cpack, rx_packet, rcv_len);
  591. } while (!cache_packet_is_complete (cpack));
  592. memcpy (packet_buf, cpack->packet_buf, pkt_size);
  593. cache_packet_reset (cpack);
  594. return pkt_size;
  595. }
  596. int
  597. netjack_recv (int sockfd, char *packet_buf, int pkt_size, int flags, int mtu)
  598. {
  599. if (pkt_size <= mtu)
  600. return recv (sockfd, packet_buf, pkt_size, flags);
  601. char *rx_packet = alloca (mtu);
  602. jacknet_packet_header *pkthdr = (jacknet_packet_header *) rx_packet;
  603. int rcv_len;
  604. jack_nframes_t framecnt;
  605. cache_packet *cpack;
  606. do
  607. {
  608. rcv_len = recv (sockfd, rx_packet, mtu, flags);
  609. if (rcv_len < 0)
  610. return rcv_len;
  611. framecnt = ntohl (pkthdr->framecnt);
  612. cpack = packet_cache_get_packet (global_packcache, framecnt);
  613. cache_packet_add_fragment (cpack, rx_packet, rcv_len);
  614. } while (!cache_packet_is_complete (cpack));
  615. memcpy (packet_buf, cpack->packet_buf, pkt_size);
  616. cache_packet_reset (cpack);
  617. return pkt_size;
  618. }
  619. void
  620. netjack_sendto (int sockfd, char *packet_buf, int pkt_size, int flags, struct sockaddr *addr, int addr_size, int mtu)
  621. {
  622. int frag_cnt = 0;
  623. char *tx_packet, *dataX;
  624. jacknet_packet_header *pkthdr;
  625. tx_packet = alloca (mtu + 10);
  626. dataX = tx_packet + sizeof (jacknet_packet_header);
  627. pkthdr = (jacknet_packet_header *) tx_packet;
  628. int fragment_payload_size = mtu - sizeof (jacknet_packet_header);
  629. if (pkt_size <= mtu) {
  630. int err;
  631. pkthdr = (jacknet_packet_header *) packet_buf;
  632. pkthdr->fragment_nr = htonl (0);
  633. err = sendto(sockfd, packet_buf, pkt_size, flags, addr, addr_size);
  634. if( err<0 ) {
  635. printf( "error in send\n" );
  636. perror( "send" );
  637. }
  638. }
  639. else
  640. {
  641. int err;
  642. // Copy the packet header to the tx pack first.
  643. memcpy(tx_packet, packet_buf, sizeof (jacknet_packet_header));
  644. // Now loop and send all
  645. char *packet_bufX = packet_buf + sizeof (jacknet_packet_header);
  646. while (packet_bufX < (packet_buf + pkt_size - fragment_payload_size))
  647. {
  648. pkthdr->fragment_nr = htonl (frag_cnt++);
  649. memcpy (dataX, packet_bufX, fragment_payload_size);
  650. sendto (sockfd, tx_packet, mtu, flags, addr, addr_size);
  651. packet_bufX += fragment_payload_size;
  652. }
  653. int last_payload_size = packet_buf + pkt_size - packet_bufX;
  654. memcpy (dataX, packet_bufX, last_payload_size);
  655. pkthdr->fragment_nr = htonl (frag_cnt);
  656. //jack_error("last fragment_count = %d, payload_size = %d\n", fragment_count, last_payload_size);
  657. // sendto(last_pack_size);
  658. err = sendto(sockfd, tx_packet, last_payload_size + sizeof(jacknet_packet_header), flags, addr, addr_size);
  659. if( err<0 ) {
  660. printf( "error in send\n" );
  661. perror( "send" );
  662. }
  663. }
  664. }
  665. void
  666. decode_midi_buffer (uint32_t *buffer_uint32, unsigned int buffer_size_uint32, jack_default_audio_sample_t* buf)
  667. {
  668. int i;
  669. jack_midi_clear_buffer (buf);
  670. for (i = 0; i < buffer_size_uint32 - 3;)
  671. {
  672. uint32_t payload_size;
  673. payload_size = buffer_uint32[i];
  674. payload_size = ntohl (payload_size);
  675. if (payload_size)
  676. {
  677. jack_midi_event_t event;
  678. event.time = ntohl (buffer_uint32[i+1]);
  679. event.size = ntohl (buffer_uint32[i+2]);
  680. event.buffer = (jack_midi_data_t*) (&(buffer_uint32[i+3]));
  681. jack_midi_event_write (buf, event.time, event.buffer, event.size);
  682. // skip to the next event
  683. unsigned int nb_data_quads = (((event.size-1) & ~0x3) >> 2)+1;
  684. i += 3+nb_data_quads;
  685. }
  686. else
  687. break; // no events can follow an empty event, we're done
  688. }
  689. }
  690. void
  691. encode_midi_buffer (uint32_t *buffer_uint32, unsigned int buffer_size_uint32, jack_default_audio_sample_t* buf)
  692. {
  693. int i;
  694. unsigned int written = 0;
  695. // midi port, encode midi events
  696. unsigned int nevents = jack_midi_get_event_count (buf);
  697. for (i = 0; i < nevents; ++i)
  698. {
  699. jack_midi_event_t event;
  700. jack_midi_event_get (&event, buf, i);
  701. unsigned int nb_data_quads = (((event.size - 1) & ~0x3) >> 2) + 1;
  702. unsigned int payload_size = 3 + nb_data_quads;
  703. // only write if we have sufficient space for the event
  704. // otherwise drop it
  705. if (written + payload_size < buffer_size_uint32 - 1)
  706. {
  707. // write header
  708. buffer_uint32[written]=htonl (payload_size);
  709. written++;
  710. buffer_uint32[written]=htonl (event.time);
  711. written++;
  712. buffer_uint32[written]=htonl (event.size);
  713. written++;
  714. // write data
  715. jack_midi_data_t* tmpbuff = (jack_midi_data_t*)(&(buffer_uint32[written]));
  716. memcpy (tmpbuff, event.buffer, event.size);
  717. written += nb_data_quads;
  718. }
  719. else
  720. {
  721. // buffer overflow
  722. jack_error ("midi buffer overflow");
  723. break;
  724. }
  725. }
  726. // now put a netjack_midi 'no-payload' event, signaling EOF
  727. buffer_uint32[written]=0;
  728. }
  729. // render functions for float
  730. void
  731. 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, int dont_htonl_floats)
  732. {
  733. channel_t chn = 0;
  734. JSList *node = capture_ports;
  735. #if HAVE_SAMPLERATE
  736. JSList *src_node = capture_srcs;
  737. #endif
  738. uint32_t *packet_bufX = (uint32_t *)packet_payload;
  739. if( !packet_payload )
  740. return;
  741. while (node != NULL)
  742. {
  743. int i;
  744. int_float_t val;
  745. #if HAVE_SAMPLERATE
  746. SRC_DATA src;
  747. #endif
  748. jack_port_t *port = (jack_port_t *) node->data;
  749. jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
  750. const char *porttype = jack_port_type (port);
  751. if (strncmp (porttype, JACK_DEFAULT_AUDIO_TYPE, jack_port_type_size()) == 0)
  752. {
  753. #if HAVE_SAMPLERATE
  754. // audio port, resample if necessary
  755. if (net_period_down != nframes)
  756. {
  757. SRC_STATE *src_state = src_node->data;
  758. for (i = 0; i < net_period_down; i++)
  759. {
  760. packet_bufX[i] = ntohl (packet_bufX[i]);
  761. }
  762. src.data_in = (float *) packet_bufX;
  763. src.input_frames = net_period_down;
  764. src.data_out = buf;
  765. src.output_frames = nframes;
  766. src.src_ratio = (float) nframes / (float) net_period_down;
  767. src.end_of_input = 0;
  768. src_set_ratio (src_state, src.src_ratio);
  769. src_process (src_state, &src);
  770. src_node = jack_slist_next (src_node);
  771. }
  772. else
  773. #endif
  774. {
  775. if( dont_htonl_floats )
  776. {
  777. memcpy( buf, packet_bufX, net_period_down*sizeof(jack_default_audio_sample_t));
  778. }
  779. else
  780. {
  781. for (i = 0; i < net_period_down; i++)
  782. {
  783. val.i = packet_bufX[i];
  784. val.i = ntohl (val.i);
  785. buf[i] = val.f;
  786. }
  787. }
  788. }
  789. }
  790. else if (strncmp (porttype, JACK_DEFAULT_MIDI_TYPE, jack_port_type_size()) == 0)
  791. {
  792. // midi port, decode midi events
  793. // convert the data buffer to a standard format (uint32_t based)
  794. unsigned int buffer_size_uint32 = net_period_down;
  795. uint32_t * buffer_uint32 = (uint32_t*)packet_bufX;
  796. decode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
  797. }
  798. packet_bufX = (packet_bufX + net_period_down);
  799. node = jack_slist_next (node);
  800. chn++;
  801. }
  802. }
  803. void
  804. 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, int dont_htonl_floats )
  805. {
  806. channel_t chn = 0;
  807. JSList *node = playback_ports;
  808. #if HAVE_SAMPLERATE
  809. JSList *src_node = playback_srcs;
  810. #endif
  811. uint32_t *packet_bufX = (uint32_t *) packet_payload;
  812. while (node != NULL)
  813. {
  814. #if HAVE_SAMPLERATE
  815. SRC_DATA src;
  816. #endif
  817. int i;
  818. int_float_t val;
  819. jack_port_t *port = (jack_port_t *) node->data;
  820. jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
  821. const char *porttype = jack_port_type (port);
  822. if (strncmp (porttype, JACK_DEFAULT_AUDIO_TYPE, jack_port_type_size()) == 0)
  823. {
  824. // audio port, resample if necessary
  825. #if HAVE_SAMPLERATE
  826. if (net_period_up != nframes) {
  827. SRC_STATE *src_state = src_node->data;
  828. src.data_in = buf;
  829. src.input_frames = nframes;
  830. src.data_out = (float *) packet_bufX;
  831. src.output_frames = net_period_up;
  832. src.src_ratio = (float) net_period_up / (float) nframes;
  833. src.end_of_input = 0;
  834. src_set_ratio (src_state, src.src_ratio);
  835. src_process (src_state, &src);
  836. for (i = 0; i < net_period_up; i++)
  837. {
  838. packet_bufX[i] = htonl (packet_bufX[i]);
  839. }
  840. src_node = jack_slist_next (src_node);
  841. }
  842. else
  843. #endif
  844. {
  845. if( dont_htonl_floats )
  846. {
  847. memcpy( packet_bufX, buf, net_period_up*sizeof(jack_default_audio_sample_t) );
  848. }
  849. else
  850. {
  851. for (i = 0; i < net_period_up; i++)
  852. {
  853. val.f = buf[i];
  854. val.i = htonl (val.i);
  855. packet_bufX[i] = val.i;
  856. }
  857. }
  858. }
  859. }
  860. else if (strncmp(porttype, JACK_DEFAULT_MIDI_TYPE, jack_port_type_size()) == 0)
  861. {
  862. // encode midi events from port to packet
  863. // convert the data buffer to a standard format (uint32_t based)
  864. unsigned int buffer_size_uint32 = net_period_up;
  865. uint32_t * buffer_uint32 = (uint32_t*) packet_bufX;
  866. encode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
  867. }
  868. packet_bufX = (packet_bufX + net_period_up);
  869. node = jack_slist_next (node);
  870. chn++;
  871. }
  872. }
  873. // render functions for 16bit
  874. void
  875. 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)
  876. {
  877. channel_t chn = 0;
  878. JSList *node = capture_ports;
  879. #if HAVE_SAMPLERATE
  880. JSList *src_node = capture_srcs;
  881. #endif
  882. uint16_t *packet_bufX = (uint16_t *)packet_payload;
  883. if( !packet_payload )
  884. return;
  885. while (node != NULL)
  886. {
  887. int i;
  888. //uint32_t val;
  889. #if HAVE_SAMPLERATE
  890. SRC_DATA src;
  891. #endif
  892. jack_port_t *port = (jack_port_t *) node->data;
  893. jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
  894. #if HAVE_SAMPLERATE
  895. float *floatbuf = alloca (sizeof(float) * net_period_down);
  896. #endif
  897. const char *portname = jack_port_type (port);
  898. if (strncmp(portname, JACK_DEFAULT_AUDIO_TYPE, jack_port_type_size()) == 0)
  899. {
  900. // audio port, resample if necessary
  901. #if HAVE_SAMPLERATE
  902. if (net_period_down != nframes)
  903. {
  904. SRC_STATE *src_state = src_node->data;
  905. for (i = 0; i < net_period_down; i++)
  906. {
  907. floatbuf[i] = ((float) ntohs(packet_bufX[i])) / 32767.0 - 1.0;
  908. }
  909. src.data_in = floatbuf;
  910. src.input_frames = net_period_down;
  911. src.data_out = buf;
  912. src.output_frames = nframes;
  913. src.src_ratio = (float) nframes / (float) net_period_down;
  914. src.end_of_input = 0;
  915. src_set_ratio (src_state, src.src_ratio);
  916. src_process (src_state, &src);
  917. src_node = jack_slist_next (src_node);
  918. }
  919. else
  920. #endif
  921. for (i = 0; i < net_period_down; i++)
  922. buf[i] = ((float) ntohs (packet_bufX[i])) / 32768.0 - 1.0;
  923. }
  924. else if (strncmp(portname, JACK_DEFAULT_MIDI_TYPE, jack_port_type_size()) == 0)
  925. {
  926. // midi port, decode midi events
  927. // convert the data buffer to a standard format (uint32_t based)
  928. unsigned int buffer_size_uint32 = net_period_down / 2;
  929. uint32_t * buffer_uint32 = (uint32_t*) packet_bufX;
  930. decode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
  931. }
  932. packet_bufX = (packet_bufX + net_period_down);
  933. node = jack_slist_next (node);
  934. chn++;
  935. }
  936. }
  937. void
  938. 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)
  939. {
  940. channel_t chn = 0;
  941. JSList *node = playback_ports;
  942. #if HAVE_SAMPLERATE
  943. JSList *src_node = playback_srcs;
  944. #endif
  945. uint16_t *packet_bufX = (uint16_t *)packet_payload;
  946. while (node != NULL)
  947. {
  948. #if HAVE_SAMPLERATE
  949. SRC_DATA src;
  950. #endif
  951. int i;
  952. jack_port_t *port = (jack_port_t *) node->data;
  953. jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
  954. const char *portname = jack_port_type (port);
  955. if (strncmp (portname, JACK_DEFAULT_AUDIO_TYPE, jack_port_type_size()) == 0)
  956. {
  957. // audio port, resample if necessary
  958. #if HAVE_SAMPLERATE
  959. if (net_period_up != nframes)
  960. {
  961. SRC_STATE *src_state = src_node->data;
  962. float *floatbuf = alloca (sizeof(float) * net_period_up);
  963. src.data_in = buf;
  964. src.input_frames = nframes;
  965. src.data_out = floatbuf;
  966. src.output_frames = net_period_up;
  967. src.src_ratio = (float) net_period_up / (float) nframes;
  968. src.end_of_input = 0;
  969. src_set_ratio (src_state, src.src_ratio);
  970. src_process (src_state, &src);
  971. for (i = 0; i < net_period_up; i++)
  972. {
  973. packet_bufX[i] = htons (((uint16_t)((floatbuf[i] + 1.0) * 32767.0)));
  974. }
  975. src_node = jack_slist_next (src_node);
  976. }
  977. else
  978. #endif
  979. for (i = 0; i < net_period_up; i++)
  980. packet_bufX[i] = htons(((uint16_t)((buf[i] + 1.0) * 32767.0)));
  981. }
  982. else if (strncmp(portname, JACK_DEFAULT_MIDI_TYPE, jack_port_type_size()) == 0)
  983. {
  984. // encode midi events from port to packet
  985. // convert the data buffer to a standard format (uint32_t based)
  986. unsigned int buffer_size_uint32 = net_period_up / 2;
  987. uint32_t * buffer_uint32 = (uint32_t*) packet_bufX;
  988. encode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
  989. }
  990. packet_bufX = (packet_bufX + net_period_up);
  991. node = jack_slist_next (node);
  992. chn++;
  993. }
  994. }
  995. // render functions for 8bit
  996. void
  997. 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)
  998. {
  999. channel_t chn = 0;
  1000. JSList *node = capture_ports;
  1001. #if HAVE_SAMPLERATE
  1002. JSList *src_node = capture_srcs;
  1003. #endif
  1004. int8_t *packet_bufX = (int8_t *)packet_payload;
  1005. if( !packet_payload )
  1006. return;
  1007. while (node != NULL)
  1008. {
  1009. int i;
  1010. //uint32_t val;
  1011. #if HAVE_SAMPLERATE
  1012. SRC_DATA src;
  1013. #endif
  1014. jack_port_t *port = (jack_port_t *) node->data;
  1015. jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
  1016. #if HAVE_SAMPLERATE
  1017. float *floatbuf = alloca (sizeof (float) * net_period_down);
  1018. #endif
  1019. const char *portname = jack_port_type (port);
  1020. if (strncmp (portname, JACK_DEFAULT_AUDIO_TYPE, jack_port_type_size()) == 0)
  1021. {
  1022. #if HAVE_SAMPLERATE
  1023. // audio port, resample if necessary
  1024. if (net_period_down != nframes)
  1025. {
  1026. SRC_STATE *src_state = src_node->data;
  1027. for (i = 0; i < net_period_down; i++)
  1028. floatbuf[i] = ((float) packet_bufX[i]) / 127.0;
  1029. src.data_in = floatbuf;
  1030. src.input_frames = net_period_down;
  1031. src.data_out = buf;
  1032. src.output_frames = nframes;
  1033. src.src_ratio = (float) nframes / (float) net_period_down;
  1034. src.end_of_input = 0;
  1035. src_set_ratio (src_state, src.src_ratio);
  1036. src_process (src_state, &src);
  1037. src_node = jack_slist_next (src_node);
  1038. }
  1039. else
  1040. #endif
  1041. for (i = 0; i < net_period_down; i++)
  1042. buf[i] = ((float) packet_bufX[i]) / 127.0;
  1043. }
  1044. else if (strncmp(portname, JACK_DEFAULT_MIDI_TYPE, jack_port_type_size()) == 0)
  1045. {
  1046. // midi port, decode midi events
  1047. // convert the data buffer to a standard format (uint32_t based)
  1048. unsigned int buffer_size_uint32 = net_period_down / 2;
  1049. uint32_t * buffer_uint32 = (uint32_t*) packet_bufX;
  1050. decode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
  1051. }
  1052. packet_bufX = (packet_bufX + net_period_down);
  1053. node = jack_slist_next (node);
  1054. chn++;
  1055. }
  1056. }
  1057. void
  1058. 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)
  1059. {
  1060. channel_t chn = 0;
  1061. JSList *node = playback_ports;
  1062. #if HAVE_SAMPLERATE
  1063. JSList *src_node = playback_srcs;
  1064. #endif
  1065. int8_t *packet_bufX = (int8_t *)packet_payload;
  1066. while (node != NULL)
  1067. {
  1068. #if HAVE_SAMPLERATE
  1069. SRC_DATA src;
  1070. #endif
  1071. int i;
  1072. jack_port_t *port = (jack_port_t *) node->data;
  1073. jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
  1074. const char *portname = jack_port_type (port);
  1075. if (strncmp (portname, JACK_DEFAULT_AUDIO_TYPE, jack_port_type_size()) == 0)
  1076. {
  1077. #if HAVE_SAMPLERATE
  1078. // audio port, resample if necessary
  1079. if (net_period_up != nframes)
  1080. {
  1081. SRC_STATE *src_state = src_node->data;
  1082. float *floatbuf = alloca (sizeof (float) * net_period_up);
  1083. src.data_in = buf;
  1084. src.input_frames = nframes;
  1085. src.data_out = floatbuf;
  1086. src.output_frames = net_period_up;
  1087. src.src_ratio = (float) net_period_up / (float) nframes;
  1088. src.end_of_input = 0;
  1089. src_set_ratio (src_state, src.src_ratio);
  1090. src_process (src_state, &src);
  1091. for (i = 0; i < net_period_up; i++)
  1092. packet_bufX[i] = floatbuf[i] * 127.0;
  1093. src_node = jack_slist_next (src_node);
  1094. }
  1095. else
  1096. #endif
  1097. for (i = 0; i < net_period_up; i++)
  1098. packet_bufX[i] = buf[i] * 127.0;
  1099. }
  1100. else if (strncmp(portname, JACK_DEFAULT_MIDI_TYPE, jack_port_type_size()) == 0)
  1101. {
  1102. // encode midi events from port to packet
  1103. // convert the data buffer to a standard format (uint32_t based)
  1104. unsigned int buffer_size_uint32 = net_period_up / 4;
  1105. uint32_t * buffer_uint32 = (uint32_t*) packet_bufX;
  1106. encode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
  1107. }
  1108. packet_bufX = (packet_bufX + net_period_up);
  1109. node = jack_slist_next (node);
  1110. chn++;
  1111. }
  1112. }
  1113. #if HAVE_CELT
  1114. // render functions for celt.
  1115. void
  1116. render_payload_to_jack_ports_celt (void *packet_payload, jack_nframes_t net_period_down, JSList *capture_ports, JSList *capture_srcs, jack_nframes_t nframes)
  1117. {
  1118. channel_t chn = 0;
  1119. JSList *node = capture_ports;
  1120. JSList *src_node = capture_srcs;
  1121. unsigned char *packet_bufX = (unsigned char *)packet_payload;
  1122. while (node != NULL)
  1123. {
  1124. jack_port_t *port = (jack_port_t *) node->data;
  1125. jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
  1126. const char *portname = jack_port_type (port);
  1127. if (strncmp(portname, JACK_DEFAULT_AUDIO_TYPE, jack_port_type_size()) == 0)
  1128. {
  1129. // audio port, decode celt data.
  1130. CELTDecoder *decoder = src_node->data;
  1131. if( !packet_payload )
  1132. celt_decode_float( decoder, NULL, net_period_down, buf );
  1133. else
  1134. celt_decode_float( decoder, packet_bufX, net_period_down, buf );
  1135. src_node = jack_slist_next (src_node);
  1136. }
  1137. else if (strncmp(portname, JACK_DEFAULT_MIDI_TYPE, jack_port_type_size()) == 0)
  1138. {
  1139. // midi port, decode midi events
  1140. // convert the data buffer to a standard format (uint32_t based)
  1141. unsigned int buffer_size_uint32 = net_period_down / 2;
  1142. uint32_t * buffer_uint32 = (uint32_t*) packet_bufX;
  1143. if( packet_payload )
  1144. decode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
  1145. }
  1146. packet_bufX = (packet_bufX + net_period_down);
  1147. node = jack_slist_next (node);
  1148. chn++;
  1149. }
  1150. }
  1151. void
  1152. render_jack_ports_to_payload_celt (JSList *playback_ports, JSList *playback_srcs, jack_nframes_t nframes, void *packet_payload, jack_nframes_t net_period_up)
  1153. {
  1154. channel_t chn = 0;
  1155. JSList *node = playback_ports;
  1156. JSList *src_node = playback_srcs;
  1157. unsigned char *packet_bufX = (unsigned char *)packet_payload;
  1158. while (node != NULL)
  1159. {
  1160. jack_port_t *port = (jack_port_t *) node->data;
  1161. jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
  1162. const char *portname = jack_port_type (port);
  1163. if (strncmp (portname, JACK_DEFAULT_AUDIO_TYPE, jack_port_type_size()) == 0)
  1164. {
  1165. // audio port, encode celt data.
  1166. int encoded_bytes;
  1167. float *floatbuf = alloca (sizeof(float) * nframes );
  1168. memcpy( floatbuf, buf, nframes*sizeof(float) );
  1169. CELTEncoder *encoder = src_node->data;
  1170. encoded_bytes = celt_encode_float( encoder, floatbuf, NULL, packet_bufX, net_period_up );
  1171. if( encoded_bytes != net_period_up )
  1172. printf( "something in celt changed. netjack needs to be changed to handle this.\n" );
  1173. src_node = jack_slist_next( src_node );
  1174. }
  1175. else if (strncmp(portname, JACK_DEFAULT_MIDI_TYPE, jack_port_type_size()) == 0)
  1176. {
  1177. // encode midi events from port to packet
  1178. // convert the data buffer to a standard format (uint32_t based)
  1179. unsigned int buffer_size_uint32 = net_period_up / 2;
  1180. uint32_t * buffer_uint32 = (uint32_t*) packet_bufX;
  1181. encode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
  1182. }
  1183. packet_bufX = (packet_bufX + net_period_up);
  1184. node = jack_slist_next (node);
  1185. chn++;
  1186. }
  1187. }
  1188. #endif
  1189. /* Wrapper functions with bitdepth argument... */
  1190. void
  1191. 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, int dont_htonl_floats)
  1192. {
  1193. if (bitdepth == 8)
  1194. render_payload_to_jack_ports_8bit (packet_payload, net_period_down, capture_ports, capture_srcs, nframes);
  1195. else if (bitdepth == 16)
  1196. render_payload_to_jack_ports_16bit (packet_payload, net_period_down, capture_ports, capture_srcs, nframes);
  1197. #if HAVE_CELT
  1198. else if (bitdepth == 1000)
  1199. render_payload_to_jack_ports_celt (packet_payload, net_period_down, capture_ports, capture_srcs, nframes);
  1200. #endif
  1201. else
  1202. render_payload_to_jack_ports_float (packet_payload, net_period_down, capture_ports, capture_srcs, nframes, dont_htonl_floats);
  1203. }
  1204. void
  1205. 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, int dont_htonl_floats)
  1206. {
  1207. if (bitdepth == 8)
  1208. render_jack_ports_to_payload_8bit (playback_ports, playback_srcs, nframes, packet_payload, net_period_up);
  1209. else if (bitdepth == 16)
  1210. render_jack_ports_to_payload_16bit (playback_ports, playback_srcs, nframes, packet_payload, net_period_up);
  1211. #if HAVE_CELT
  1212. else if (bitdepth == 1000)
  1213. render_jack_ports_to_payload_celt (playback_ports, playback_srcs, nframes, packet_payload, net_period_up);
  1214. #endif
  1215. else
  1216. render_jack_ports_to_payload_float (playback_ports, playback_srcs, nframes, packet_payload, net_period_up, dont_htonl_floats);
  1217. }