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.

796 lines
28KB

  1. /* -*- mode: c; c-file-style: "linux"; -*- */
  2. /*
  3. NetJack Driver
  4. Copyright (C) 2008 Pieter Palmers <pieterpalmers@users.sourceforge.net>
  5. Copyright (C) 2006 Torben Hohn <torbenh@gmx.de>
  6. Copyright (C) 2003 Robert Ham <rah@bash.sh>
  7. Copyright (C) 2001 Paul Davis
  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. This program is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. GNU General Public License for more details.
  16. You should have received a copy of the GNU General Public License
  17. along with this program; if not, write to the Free Software
  18. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19. $Id: net_driver.c,v 1.17 2006/04/16 20:16:10 torbenh Exp $
  20. */
  21. #include <math.h>
  22. #include <stdio.h>
  23. #include <memory.h>
  24. #include <unistd.h>
  25. #include <stdlib.h>
  26. #include <errno.h>
  27. #include <stdarg.h>
  28. #include <sys/mman.h>
  29. #include <sys/poll.h>
  30. #include <jack/types.h>
  31. #include <jack/engine.h>
  32. #include <sysdeps/time.h>
  33. #include <sys/types.h>
  34. #include <sys/socket.h>
  35. #include <netinet/in.h>
  36. #include <samplerate.h>
  37. #include "net_driver.h"
  38. #include "netjack_packet.h"
  39. #undef DEBUG_WAKEUP
  40. static int sync_state = TRUE;
  41. static jack_transport_state_t last_transport_state;
  42. static int framecnt; // this is set upon reading a packet.
  43. // and will be written into the pkthdr of an outgoing packet.
  44. static int
  45. net_driver_sync_cb(jack_transport_state_t state, jack_position_t *pos, net_driver_t *driver)
  46. {
  47. int retval = sync_state;
  48. if (state == JackTransportStarting && last_transport_state != JackTransportStarting) {
  49. retval = 0;
  50. }
  51. if (state == JackTransportStarting)
  52. jack_info("Starting sync_state = %d", sync_state);
  53. last_transport_state = state;
  54. return retval;
  55. }
  56. static jack_nframes_t
  57. net_driver_wait (net_driver_t *driver, int extra_fd, int *status,
  58. float *delayed_usecs)
  59. {
  60. // ok... we wait for a packet on the socket
  61. // TODO:
  62. // we should be able to run freely if the sync source is not transmitting
  63. // especially we should be able to compensate for packet loss somehow.
  64. // but lets try this out first.
  65. //
  66. // on packet loss we should either detect an xrun or just continue running when we
  67. // think, that the sync source is not running anymore.
  68. #if 0
  69. fd_set read_fds;
  70. int res = 0;
  71. while (res == 0) {
  72. FD_ZERO(&read_fds);
  73. FD_SET(driver->sockfd, &read_fds);
  74. res = select(driver->sockfd + 1, &read_fds, NULL, NULL, NULL); // wait here until there is a packet to get
  75. }
  76. #endif
  77. socklen_t address_size = sizeof(struct sockaddr_in);
  78. int bufsize = get_sample_size(driver->bitdepth) * driver->capture_channels * driver->net_period_down + sizeof(jacknet_packet_header);
  79. jacknet_packet_header *pkthdr = (jacknet_packet_header *)driver->rx_buf;
  80. rx_again:
  81. if (!driver->srcaddress_valid) {
  82. // XXX: Somthings really bad ;)
  83. puts("!driver->srcaddress_valid");
  84. return 0;
  85. }
  86. int len = netjack_recvfrom(driver->sockfd, (char *)driver->rx_buf, bufsize,
  87. MSG_WAITALL, (struct sockaddr*) & driver->syncsource_address, &address_size, 1400);
  88. if (len != bufsize) {
  89. jack_info("wrong_packet_len: len=%d, expected=%d", len, bufsize);
  90. goto rx_again;
  91. }
  92. packet_header_ntoh(pkthdr);
  93. //driver->srcaddress_valid = 0;
  94. driver->last_wait_ust = jack_get_microseconds ();
  95. driver->engine->transport_cycle_start (driver->engine,
  96. driver->last_wait_ust);
  97. /* this driver doesn't work so well if we report a delay */
  98. *delayed_usecs = 0; /* lie about it */
  99. *status = 0;
  100. return driver->period_size;
  101. }
  102. static inline int
  103. net_driver_run_cycle (net_driver_t *driver)
  104. {
  105. jack_engine_t *engine = driver->engine;
  106. int wait_status;
  107. float delayed_usecs;
  108. jack_nframes_t nframes = net_driver_wait (driver, -1, &wait_status,
  109. &delayed_usecs);
  110. // currently there is no xrun detection.
  111. // so nframes will always be period_size.
  112. // XXX: i uncomment this code because the signature of delay()
  113. // changed samewhere in the 0.99.x series. so this is the showstopper for 0.99.0
  114. #if 0
  115. if (nframes == 0) {
  116. /* we detected an xrun and restarted: notify
  117. * clients about the delay. */
  118. engine->delay (engine, delayed_usecs);
  119. return 0;
  120. }
  121. #endif
  122. if (wait_status == 0)
  123. return engine->run_cycle (engine, nframes, delayed_usecs);
  124. if (wait_status < 0)
  125. return -1;
  126. else
  127. return 0;
  128. }
  129. static int
  130. net_driver_null_cycle (net_driver_t* driver, jack_nframes_t nframes)
  131. {
  132. //int rx_size = get_sample_size(driver->bitdepth) * driver->capture_channels * driver->net_period_down + sizeof(jacknet_packet_header);
  133. int tx_size = get_sample_size(driver->bitdepth) * driver->playback_channels * driver->net_period_up + sizeof(jacknet_packet_header);
  134. unsigned int *packet_buf, *packet_bufX;
  135. packet_buf = alloca( tx_size);
  136. jacknet_packet_header *tx_pkthdr = (jacknet_packet_header *)packet_buf;
  137. jacknet_packet_header *rx_pkthdr = (jacknet_packet_header *)driver->rx_buf;
  138. framecnt = rx_pkthdr->framecnt;
  139. driver->reply_port = rx_pkthdr->reply_port;
  140. // offset packet_bufX by the packetheader.
  141. packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
  142. tx_pkthdr->sync_state = (driver->engine->control->sync_remain <= 1);
  143. tx_pkthdr->framecnt = framecnt;
  144. // memset 0 the payload.
  145. int payload_size = get_sample_size(driver->bitdepth) * driver->playback_channels * driver->net_period_up;
  146. memset(packet_bufX, 0, payload_size);
  147. packet_header_hton(tx_pkthdr);
  148. if (driver->srcaddress_valid)
  149. if (driver->reply_port)
  150. driver->syncsource_address.sin_port = htons(driver->reply_port);
  151. netjack_sendto(driver->outsockfd, (char *)packet_buf, tx_size,
  152. 0, (struct sockaddr*)&driver->syncsource_address, sizeof(struct sockaddr_in), 1400);
  153. return 0;
  154. }
  155. static int
  156. net_driver_bufsize (net_driver_t* driver, jack_nframes_t nframes)
  157. {
  158. if (nframes != driver->period_size)
  159. return EINVAL;
  160. return 0;
  161. }
  162. static int
  163. net_driver_read (net_driver_t* driver, jack_nframes_t nframes)
  164. {
  165. //jack_default_audio_sample_t* buf;
  166. //jack_port_t *port;
  167. jack_position_t local_trans_pos;
  168. jack_transport_state_t local_trans_state;
  169. //int bufsize = get_sample_size(driver->bitdepth) * driver->capture_channels * driver->net_period_down + sizeof(jacknet_packet_header);
  170. unsigned int *packet_buf, *packet_bufX;
  171. packet_buf = driver->rx_buf;
  172. jacknet_packet_header *pkthdr = (jacknet_packet_header *)packet_buf;
  173. packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
  174. //packet_header_ntoh(pkthdr);
  175. // fill framecnt from pkthdr.
  176. if (pkthdr->framecnt != framecnt + 1)
  177. jack_info("bogus framecount %d", pkthdr->framecnt);
  178. framecnt = pkthdr->framecnt;
  179. driver->reply_port = pkthdr->reply_port;
  180. // check whether, we should handle the transport sync stuff, or leave trnasports untouched.
  181. if (driver->handle_transport_sync) {
  182. // read local transport info....
  183. local_trans_state = jack_transport_query(driver->client, &local_trans_pos);
  184. // Now check if we have to start or stop local transport to sync to remote...
  185. switch (pkthdr->transport_state) {
  186. case JackTransportStarting:
  187. // the master transport is starting... so we set our reply to the sync_callback;
  188. if (local_trans_state == JackTransportStopped) {
  189. jack_transport_start(driver->client);
  190. last_transport_state = JackTransportStopped;
  191. sync_state = FALSE;
  192. jack_info("locally stopped... starting...");
  193. }
  194. if (local_trans_pos.frame != (pkthdr->transport_frame + (pkthdr->latency) * nframes)) {
  195. jack_transport_locate(driver->client, (pkthdr->transport_frame + (pkthdr->latency) * nframes));
  196. last_transport_state = JackTransportRolling;
  197. sync_state = FALSE;
  198. jack_info("starting locate to %d", pkthdr->transport_frame + (pkthdr->latency)*nframes);
  199. }
  200. break;
  201. case JackTransportStopped:
  202. sync_state = TRUE;
  203. if (local_trans_pos.frame != (pkthdr->transport_frame)) {
  204. jack_transport_locate(driver->client, (pkthdr->transport_frame));
  205. jack_info("transport is stopped locate to %d", pkthdr->transport_frame);
  206. }
  207. if (local_trans_state != JackTransportStopped)
  208. jack_transport_stop(driver->client);
  209. break;
  210. case JackTransportRolling:
  211. sync_state = TRUE;
  212. // if(local_trans_pos.frame != (pkthdr->transport_frame + (pkthdr->latency) * nframes)) {
  213. // jack_transport_locate(driver->client, (pkthdr->transport_frame + (pkthdr->latency + 2) * nframes));
  214. // jack_info("running locate to %d", pkthdr->transport_frame + (pkthdr->latency)*nframes);
  215. // }
  216. if (local_trans_state != JackTransportRolling)
  217. jack_transport_start(driver->client);
  218. break;
  219. case JackTransportLooping:
  220. break;
  221. }
  222. }
  223. render_payload_to_jack_ports(driver->bitdepth, packet_bufX, driver->net_period_down, driver->capture_ports, driver->capture_srcs, nframes);
  224. return 0;
  225. }
  226. static int
  227. net_driver_write (net_driver_t* driver, jack_nframes_t nframes)
  228. {
  229. uint32_t *packet_buf, *packet_bufX;
  230. int packet_size = get_sample_size(driver->bitdepth) * driver->playback_channels * driver->net_period_up + sizeof(jacknet_packet_header);
  231. packet_buf = alloca(packet_size);
  232. jacknet_packet_header *pkthdr = (jacknet_packet_header *)packet_buf;
  233. // offset packet_bufX by the packetheader.
  234. packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
  235. pkthdr->sync_state = (driver->engine->control->sync_remain <= 1);
  236. pkthdr->framecnt = framecnt;
  237. render_jack_ports_to_payload(driver->bitdepth, driver->playback_ports, driver->playback_srcs, nframes, packet_bufX, driver->net_period_up);
  238. packet_header_hton(pkthdr);
  239. if (driver->srcaddress_valid)
  240. if (driver->reply_port)
  241. driver->syncsource_address.sin_port = htons(driver->reply_port);
  242. netjack_sendto(driver->outsockfd, (char *)packet_buf, packet_size,
  243. 0, (struct sockaddr*)&driver->syncsource_address, sizeof(struct sockaddr_in), 1400);
  244. return 0;
  245. }
  246. static int
  247. net_driver_attach (net_driver_t *driver)
  248. {
  249. puts ("net_driver_attach");
  250. jack_port_t * port;
  251. char buf[32];
  252. unsigned int chn;
  253. int port_flags;
  254. driver->engine->set_buffer_size (driver->engine, driver->period_size);
  255. driver->engine->set_sample_rate (driver->engine, driver->sample_rate);
  256. if (driver->handle_transport_sync)
  257. jack_set_sync_callback(driver->client, (JackSyncCallback) net_driver_sync_cb, driver);
  258. port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal;
  259. for (chn = 0; chn < driver->capture_channels_audio; chn++) {
  260. snprintf (buf, sizeof(buf) - 1, "capture_%u", chn + 1);
  261. port = jack_port_register (driver->client, buf,
  262. JACK_DEFAULT_AUDIO_TYPE,
  263. port_flags, 0);
  264. if (!port) {
  265. jack_error ("NET: cannot register port for %s", buf);
  266. break;
  267. }
  268. driver->capture_ports =
  269. jack_slist_append (driver->capture_ports, port);
  270. driver->capture_srcs = jack_slist_append(driver->capture_srcs, src_new(SRC_LINEAR, 1, NULL));
  271. }
  272. for (chn = driver->capture_channels_audio; chn < driver->capture_channels; chn++) {
  273. snprintf (buf, sizeof(buf) - 1, "capture_%u", chn + 1);
  274. port = jack_port_register (driver->client, buf,
  275. JACK_DEFAULT_MIDI_TYPE,
  276. port_flags, 0);
  277. if (!port) {
  278. jack_error ("NET: cannot register port for %s", buf);
  279. break;
  280. }
  281. driver->capture_ports =
  282. jack_slist_append (driver->capture_ports, port);
  283. //driver->capture_srcs = jack_slist_append(driver->capture_srcs, src_new(SRC_LINEAR, 1, NULL));
  284. }
  285. port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal;
  286. for (chn = 0; chn < driver->playback_channels_audio; chn++) {
  287. snprintf (buf, sizeof(buf) - 1, "playback_%u", chn + 1);
  288. port = jack_port_register (driver->client, buf,
  289. JACK_DEFAULT_AUDIO_TYPE,
  290. port_flags, 0);
  291. if (!port) {
  292. jack_error ("NET: cannot register port for %s", buf);
  293. break;
  294. }
  295. driver->playback_ports =
  296. jack_slist_append (driver->playback_ports, port);
  297. driver->playback_srcs = jack_slist_append(driver->playback_srcs, src_new(SRC_LINEAR, 1, NULL));
  298. }
  299. for (chn = driver->playback_channels_audio; chn < driver->playback_channels; chn++) {
  300. snprintf (buf, sizeof(buf) - 1, "playback_%u", chn + 1);
  301. port = jack_port_register (driver->client, buf,
  302. JACK_DEFAULT_MIDI_TYPE,
  303. port_flags, 0);
  304. if (!port) {
  305. jack_error ("NET: cannot register port for %s", buf);
  306. break;
  307. }
  308. driver->playback_ports =
  309. jack_slist_append (driver->playback_ports, port);
  310. //driver->playback_srcs = jack_slist_append(driver->playback_srcs, src_new(SRC_LINEAR, 1, NULL));
  311. }
  312. jack_activate (driver->client);
  313. return 0;
  314. }
  315. static int
  316. net_driver_detach (net_driver_t *driver)
  317. {
  318. JSList * node;
  319. if (driver->engine == 0)
  320. return 0;
  321. //#if 0
  322. for (node = driver->capture_ports; node; node = jack_slist_next (node))
  323. jack_port_unregister (driver->client,
  324. ((jack_port_t *) node->data));
  325. jack_slist_free (driver->capture_ports);
  326. driver->capture_ports = NULL;
  327. //#endif
  328. for (node = driver->playback_ports; node; node = jack_slist_next (node))
  329. jack_port_unregister (driver->client,
  330. ((jack_port_t *) node->data));
  331. jack_slist_free (driver->playback_ports);
  332. driver->playback_ports = NULL;
  333. return 0;
  334. }
  335. static void
  336. net_driver_delete (net_driver_t *driver)
  337. {
  338. jack_driver_nt_finish ((jack_driver_nt_t *) driver);
  339. free (driver);
  340. }
  341. static jack_driver_t *
  342. net_driver_new (jack_client_t * client,
  343. char *name,
  344. unsigned int capture_ports,
  345. unsigned int playback_ports,
  346. unsigned int capture_ports_midi,
  347. unsigned int playback_ports_midi,
  348. jack_nframes_t sample_rate,
  349. jack_nframes_t period_size,
  350. unsigned int listen_port,
  351. unsigned int transport_sync,
  352. unsigned int resample_factor,
  353. unsigned int resample_factor_up,
  354. unsigned int bitdepth)
  355. {
  356. net_driver_t * driver;
  357. struct sockaddr_in address;
  358. jack_info("creating net driver ... %s|%" PRIu32 "|%" PRIu32
  359. "|%u|%u|%u|transport_sync:%u", name, sample_rate, period_size, listen_port,
  360. capture_ports, playback_ports, transport_sync);
  361. driver = (net_driver_t *) calloc (1, sizeof (net_driver_t));
  362. jack_driver_nt_init ((jack_driver_nt_t *) driver);
  363. driver->write = (JackDriverWriteFunction) net_driver_write;
  364. driver->read = (JackDriverReadFunction) net_driver_read;
  365. driver->null_cycle = (JackDriverNullCycleFunction) net_driver_null_cycle;
  366. driver->nt_attach = (JackDriverNTAttachFunction) net_driver_attach;
  367. driver->nt_detach = (JackDriverNTDetachFunction) net_driver_detach;
  368. driver->nt_bufsize = (JackDriverNTBufSizeFunction) net_driver_bufsize;
  369. driver->nt_run_cycle = (JackDriverNTRunCycleFunction) net_driver_run_cycle;
  370. // Fill in driver values.
  371. // might be subject to autoconfig...
  372. // so dont calculate anything with them...
  373. driver->sample_rate = sample_rate;
  374. driver->period_size = period_size;
  375. driver->listen_port = listen_port;
  376. driver->last_wait_ust = 0;
  377. driver->capture_channels = capture_ports + capture_ports_midi;
  378. driver->capture_channels_audio = capture_ports;
  379. driver->capture_channels_midi = capture_ports_midi;
  380. driver->capture_ports = NULL;
  381. driver->playback_channels = playback_ports + playback_ports_midi;
  382. driver->playback_channels_audio = playback_ports;
  383. driver->playback_channels_midi = playback_ports_midi;
  384. driver->playback_ports = NULL;
  385. driver->handle_transport_sync = transport_sync;
  386. driver->client = client;
  387. driver->engine = NULL;
  388. if ((bitdepth != 0) && (bitdepth != 8) && (bitdepth != 16)) {
  389. jack_info("Invalid bitdepth: %d (8,16 or 0 for float) !!!", bitdepth);
  390. return NULL;
  391. }
  392. driver->bitdepth = bitdepth;
  393. if (resample_factor_up == 0)
  394. resample_factor_up = resample_factor;
  395. // Now open the socket, and wait for the first packet to arrive...
  396. driver->sockfd = socket(PF_INET, SOCK_DGRAM, 0);
  397. if (driver->sockfd == -1) {
  398. jack_info("socket error");
  399. return NULL;
  400. }
  401. address.sin_family = AF_INET;
  402. address.sin_port = htons(driver->listen_port);
  403. address.sin_addr.s_addr = htonl(INADDR_ANY);
  404. if (bind(driver->sockfd, (struct sockaddr *) &address, sizeof(address)) < 0) {
  405. jack_info("bind error");
  406. return NULL;
  407. }
  408. driver->outsockfd = socket(PF_INET, SOCK_DGRAM, 0);
  409. if (driver->sockfd == -1) {
  410. jack_info("socket error");
  411. return NULL;
  412. }
  413. driver->srcaddress_valid = 0;
  414. jacknet_packet_header *first_packet = alloca(sizeof(jacknet_packet_header));
  415. socklen_t address_size = sizeof(struct sockaddr_in);
  416. jack_info("Waiting for an incoming packet !!!");
  417. jack_info("*** IMPORTANT *** Dont connect a client to jackd until the driver is attached to a clock source !!!");
  418. int first_pack_len = recvfrom(driver->sockfd, first_packet, sizeof(jacknet_packet_header), 0, (struct sockaddr*) & driver->syncsource_address, &address_size);
  419. driver->srcaddress_valid = 1;
  420. jack_info("first_pack_len=%d", first_pack_len);
  421. // A packet is here.... If it wasnt the old trigger packet containing only 'x' evaluate the autoconf data...
  422. driver->mtu = 0;
  423. if (first_pack_len == sizeof(jacknet_packet_header)) {
  424. packet_header_ntoh(first_packet);
  425. jack_info("AutoConfig Override !!!");
  426. if (driver->sample_rate != first_packet->sample_rate) {
  427. jack_info("AutoConfig Override: sample_rate = %d", first_packet->sample_rate);
  428. driver->sample_rate = first_packet->sample_rate;
  429. }
  430. if (driver->period_size != first_packet->period_size) {
  431. jack_info("AutoConfig Override: period_size = %d", first_packet->period_size);
  432. driver->period_size = first_packet->period_size;
  433. }
  434. // autoconfig channel counts
  435. if (driver->capture_channels_audio != first_packet->capture_channels_audio) {
  436. jack_info("AutoConfig Override: capture_channels_audio = %d", first_packet->capture_channels_audio);
  437. driver->capture_channels_audio = first_packet->capture_channels_audio;
  438. }
  439. if (driver->capture_channels_midi != first_packet->capture_channels_midi) {
  440. jack_info("AutoConfig Override: capture_channels_midi = %d", first_packet->capture_channels_midi);
  441. driver->capture_channels_midi = first_packet->capture_channels_midi;
  442. }
  443. if (driver->playback_channels_audio != first_packet->playback_channels_audio) {
  444. jack_info("AutoConfig Override: playback_channels_audio = %d", first_packet->playback_channels_audio);
  445. driver->playback_channels_audio = first_packet->playback_channels_audio;
  446. }
  447. if (driver->playback_channels_midi != first_packet->playback_channels_midi) {
  448. jack_info("AutoConfig Override: playback_channels_midi = %d", first_packet->playback_channels_midi);
  449. driver->playback_channels_midi = first_packet->playback_channels_midi;
  450. }
  451. driver->capture_channels = driver->capture_channels_audio + driver->capture_channels_midi;
  452. driver->playback_channels = driver->playback_channels_audio + driver->playback_channels_midi;
  453. driver->mtu = first_packet->mtu;
  454. driver->latency = first_packet->latency;
  455. }
  456. // After possible Autoconfig: do all calculations...
  457. driver->period_usecs =
  458. (jack_time_t) floor ((((float) driver->period_size) / driver->sample_rate)
  459. * 1000000.0f);
  460. driver->net_period_down = (float) driver->period_size / (float) resample_factor;
  461. driver->net_period_up = (float) driver->period_size / (float) resample_factor_up;
  462. driver->rx_buf = malloc(sizeof(jacknet_packet_header) + driver->net_period_down * driver->capture_channels * get_sample_size(driver->bitdepth));
  463. // XXX: dont need it when packet size < mtu
  464. driver->pkt_buf = malloc(sizeof(jacknet_packet_header) + driver->net_period_down * driver->capture_channels * get_sample_size(driver->bitdepth));
  465. int rx_bufsize = sizeof(jacknet_packet_header) + driver->net_period_down * driver->capture_channels * get_sample_size(driver->bitdepth);
  466. global_packcache = packet_cache_new(driver->latency + 5, rx_bufsize, 1400);
  467. jack_info("netjack: period : up: %d / dn: %d", driver->net_period_up, driver->net_period_down);
  468. jack_info("netjack: framerate: %d", driver->sample_rate);
  469. jack_info("netjack: audio : cap: %d / pbk: %d)", driver->capture_channels_audio, driver->playback_channels_audio);
  470. jack_info("netjack: midi : cap: %d / pbk: %d)", driver->capture_channels_midi, driver->playback_channels_midi);
  471. jack_info("netjack: buffsize : rx: %d)", rx_bufsize);
  472. return (jack_driver_t *) driver;
  473. }
  474. /* DRIVER "PLUGIN" INTERFACE */
  475. jack_driver_desc_t *
  476. driver_get_descriptor ()
  477. {
  478. jack_driver_desc_t * desc;
  479. jack_driver_param_desc_t * params;
  480. unsigned int i;
  481. desc = calloc (1, sizeof (jack_driver_desc_t));
  482. strcpy (desc->name, "net");
  483. desc->nparams = 11;
  484. params = calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
  485. i = 0;
  486. strcpy (params[i].name, "inchannels");
  487. params[i].character = 'i';
  488. params[i].type = JackDriverParamUInt;
  489. params[i].value.ui = 2U;
  490. strcpy (params[i].short_desc, "Number of capture channels (defaults to 2)");
  491. strcpy (params[i].long_desc, params[i].short_desc);
  492. i++;
  493. strcpy (params[i].name, "outchannels");
  494. params[i].character = 'o';
  495. params[i].type = JackDriverParamUInt;
  496. params[i].value.ui = 2U;
  497. strcpy (params[i].short_desc, "Number of playback channels (defaults to 2)");
  498. strcpy (params[i].long_desc, params[i].short_desc);
  499. i++;
  500. strcpy (params[i].name, "midi inchannels");
  501. params[i].character = 'I';
  502. params[i].type = JackDriverParamUInt;
  503. params[i].value.ui = 1U;
  504. strcpy (params[i].short_desc, "Number of midi capture channels (defaults to 1)");
  505. strcpy (params[i].long_desc, params[i].short_desc);
  506. i++;
  507. strcpy (params[i].name, "midi outchannels");
  508. params[i].character = 'O';
  509. params[i].type = JackDriverParamUInt;
  510. params[i].value.ui = 1U;
  511. strcpy (params[i].short_desc, "Number of midi playback channels (defaults to 1)");
  512. strcpy (params[i].long_desc, params[i].short_desc);
  513. i++;
  514. strcpy (params[i].name, "rate");
  515. params[i].character = 'r';
  516. params[i].type = JackDriverParamUInt;
  517. params[i].value.ui = 48000U;
  518. strcpy (params[i].short_desc, "Sample rate");
  519. strcpy (params[i].long_desc, params[i].short_desc);
  520. i++;
  521. strcpy (params[i].name, "period");
  522. params[i].character = 'p';
  523. params[i].type = JackDriverParamUInt;
  524. params[i].value.ui = 1024U;
  525. strcpy (params[i].short_desc, "Frames per period");
  526. strcpy (params[i].long_desc, params[i].short_desc);
  527. i++;
  528. strcpy (params[i].name, "listen-port");
  529. params[i].character = 'l';
  530. params[i].type = JackDriverParamUInt;
  531. params[i].value.ui = 3000U;
  532. strcpy (params[i].short_desc,
  533. "The socket port we are listening on for sync packets");
  534. strcpy (params[i].long_desc, params[i].short_desc);
  535. i++;
  536. strcpy (params[i].name, "factor");
  537. params[i].character = 'f';
  538. params[i].type = JackDriverParamUInt;
  539. params[i].value.ui = 1U;
  540. strcpy (params[i].short_desc,
  541. "Factor for sample rate reduction");
  542. strcpy (params[i].long_desc, params[i].short_desc);
  543. i++;
  544. strcpy (params[i].name, "upstream-factor");
  545. params[i].character = 'u';
  546. params[i].type = JackDriverParamUInt;
  547. params[i].value.ui = 0U;
  548. strcpy (params[i].short_desc,
  549. "Factor for sample rate reduction on the upstream");
  550. strcpy (params[i].long_desc, params[i].short_desc);
  551. i++;
  552. strcpy (params[i].name, "bit-depth");
  553. params[i].character = 'b';
  554. params[i].type = JackDriverParamUInt;
  555. params[i].value.ui = 0U;
  556. strcpy (params[i].short_desc,
  557. "Sample bit-depth (0 for float, 8 for 8bit and 16 for 16bit)");
  558. strcpy (params[i].long_desc, params[i].short_desc);
  559. i++;
  560. strcpy (params[i].name, "transport-sync");
  561. params[i].character = 't';
  562. params[i].type = JackDriverParamUInt;
  563. params[i].value.ui = 1U;
  564. strcpy (params[i].short_desc,
  565. "Whether to slave the transport to the master transport");
  566. strcpy (params[i].long_desc, params[i].short_desc);
  567. desc->params = params;
  568. return desc;
  569. }
  570. const char driver_client_name[] = "net_pcm";
  571. jack_driver_t *
  572. driver_initialize (jack_client_t *client, const JSList * params)
  573. {
  574. jack_nframes_t sample_rate = 48000;
  575. jack_nframes_t resample_factor = 1;
  576. jack_nframes_t period_size = 1024;
  577. unsigned int capture_ports = 2;
  578. unsigned int playback_ports = 2;
  579. unsigned int capture_ports_midi = 1;
  580. unsigned int playback_ports_midi = 1;
  581. unsigned int listen_port = 3000;
  582. unsigned int resample_factor_up = 0;
  583. unsigned int bitdepth = 0;
  584. unsigned int handle_transport_sync = 1;
  585. const JSList * node;
  586. const jack_driver_param_t * param;
  587. for (node = params; node; node = jack_slist_next (node)) {
  588. param = (const jack_driver_param_t *) node->data;
  589. switch (param->character) {
  590. case 'i':
  591. capture_ports = param->value.ui;
  592. break;
  593. case 'o':
  594. playback_ports = param->value.ui;
  595. break;
  596. case 'I':
  597. capture_ports_midi = param->value.ui;
  598. break;
  599. case 'O':
  600. playback_ports_midi = param->value.ui;
  601. break;
  602. case 'r':
  603. sample_rate = param->value.ui;
  604. break;
  605. case 'p':
  606. period_size = param->value.ui;
  607. break;
  608. case 'l':
  609. listen_port = param->value.ui;
  610. break;
  611. case 'f':
  612. resample_factor = param->value.ui;
  613. break;
  614. case 'u':
  615. resample_factor_up = param->value.ui;
  616. break;
  617. case 'b':
  618. bitdepth = param->value.ui;
  619. break;
  620. case 't':
  621. handle_transport_sync = param->value.ui;
  622. break;
  623. }
  624. }
  625. return net_driver_new (client, "net_pcm", capture_ports, playback_ports,
  626. capture_ports_midi, playback_ports_midi,
  627. sample_rate, period_size,
  628. listen_port, handle_transport_sync,
  629. resample_factor, resample_factor_up, bitdepth);
  630. }
  631. void
  632. driver_finish (jack_driver_t *driver)
  633. {
  634. net_driver_delete ((net_driver_t *) driver);
  635. }