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.

1205 lines
30KB

  1. /*
  2. * ALSA RAWMIDI < - > JACK MIDI bridge
  3. *
  4. * Copyright (c) 2006,2007 Dmitry S. Baikov
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  19. */
  20. /* Required for clock_nanosleep(). Thanks, Nedko */
  21. #define _GNU_SOURCE
  22. #include "alsa_midi.h"
  23. #include <stdlib.h>
  24. #include <unistd.h>
  25. #include <errno.h>
  26. #include <pthread.h>
  27. #include <time.h>
  28. #include <limits.h>
  29. #include <ctype.h>
  30. #include <alsa/asoundlib.h>
  31. #include <jack/thread.h>
  32. #include <jack/ringbuffer.h>
  33. #include <jack/midiport.h>
  34. #include "midi_pack.h"
  35. #include "midi_unpack.h"
  36. #ifdef STANDALONE
  37. #define MESSAGE(...) fprintf(stderr, __VA_ARGS__)
  38. #else
  39. #include <jack/messagebuffer.h>
  40. #endif
  41. #define info_log(...) MESSAGE(__VA_ARGS__)
  42. #define error_log(...) MESSAGE(__VA_ARGS__)
  43. #ifdef JACK_MIDI_DEBUG
  44. #define debug_log(...) MESSAGE(__VA_ARGS__)
  45. #else
  46. #define debug_log(...)
  47. #endif
  48. enum {
  49. NANOSLEEP_RESOLUTION = 7000
  50. };
  51. #define NFRAMES_INF INT_MAX
  52. enum {
  53. #ifndef JACK_MIDI_DEBUG
  54. MAX_PFDS = 64,
  55. MAX_PORTS = MAX_PFDS-1,
  56. MAX_EVENTS = 4096,
  57. MAX_DATA = 64*1024,
  58. MIDI_THREAD_PRIO = 80
  59. #else
  60. MAX_PFDS = 6,
  61. MAX_PORTS = MAX_PFDS-1,
  62. MAX_EVENTS = 16,
  63. MAX_DATA = 64,
  64. MIDI_THREAD_PRIO = 80
  65. #endif
  66. };
  67. enum PortState {
  68. PORT_DESTROYED,
  69. PORT_CREATED,
  70. PORT_ADDED_TO_JACK,
  71. PORT_ADDED_TO_MIDI,
  72. PORT_REMOVED_FROM_MIDI,
  73. PORT_REMOVED_FROM_JACK,
  74. PORT_ZOMBIFIED,
  75. };
  76. typedef struct {
  77. int id[4]; //card, dev, dir, sub;
  78. } alsa_id_t;
  79. typedef struct {
  80. jack_time_t time;
  81. int size;
  82. int overruns;
  83. } event_head_t;
  84. typedef struct midi_port_t midi_port_t;
  85. struct midi_port_t {
  86. midi_port_t *next;
  87. enum PortState state;
  88. alsa_id_t id;
  89. char dev[16];
  90. char name[64];
  91. jack_port_t *jack;
  92. snd_rawmidi_t *rawmidi;
  93. int npfds;
  94. int is_ready;
  95. jack_ringbuffer_t *event_ring;
  96. jack_ringbuffer_t *data_ring;
  97. };
  98. typedef struct input_port_t {
  99. midi_port_t base;
  100. // jack
  101. midi_unpack_t unpack;
  102. // midi
  103. int overruns;
  104. } input_port_t;
  105. typedef struct output_port_t {
  106. midi_port_t base;
  107. // jack
  108. midi_pack_t packer;
  109. // midi
  110. event_head_t next_event;
  111. int todo;
  112. } output_port_t;
  113. typedef struct alsa_rawmidi_t alsa_rawmidi_t;
  114. typedef struct {
  115. alsa_rawmidi_t *midi;
  116. midi_port_t *port;
  117. void *buffer;
  118. jack_time_t frame_time;
  119. jack_nframes_t nframes;
  120. } process_jack_t;
  121. typedef struct {
  122. alsa_rawmidi_t *midi;
  123. int mode;
  124. midi_port_t *port;
  125. struct pollfd *rpfds;
  126. struct pollfd *wpfds;
  127. int max_pfds;
  128. jack_nframes_t cur_frames;
  129. jack_time_t cur_time;
  130. jack_time_t next_time;
  131. } process_midi_t;
  132. typedef struct midi_stream_t {
  133. alsa_rawmidi_t *owner;
  134. int mode;
  135. const char *name;
  136. pthread_t thread;
  137. int wake_pipe[2];
  138. struct {
  139. jack_ringbuffer_t *new_ports;
  140. int nports;
  141. midi_port_t *ports[MAX_PORTS];
  142. } jack, midi;
  143. size_t port_size;
  144. int (*port_init)(alsa_rawmidi_t *midi, midi_port_t *port);
  145. void (*port_close)(alsa_rawmidi_t *midi, midi_port_t *port);
  146. void (*process_jack)(process_jack_t *j);
  147. int (*process_midi)(process_midi_t *m);
  148. } midi_stream_t;
  149. struct alsa_rawmidi_t {
  150. alsa_midi_t ops;
  151. jack_client_t *client;
  152. int keep_walking;
  153. struct {
  154. pthread_t thread;
  155. midi_port_t *ports;
  156. int wake_pipe[2];
  157. } scan;
  158. midi_stream_t in;
  159. midi_stream_t out;
  160. };
  161. static int input_port_init(alsa_rawmidi_t *midi, midi_port_t *port);
  162. static void input_port_close(alsa_rawmidi_t *midi, midi_port_t *port);
  163. static void do_jack_input(process_jack_t *j);
  164. static int do_midi_input(process_midi_t *m);
  165. static int output_port_init(alsa_rawmidi_t *midi, midi_port_t *port);
  166. static void output_port_close(alsa_rawmidi_t *midi, midi_port_t *port);
  167. static void do_jack_output(process_jack_t *j);
  168. static int do_midi_output(process_midi_t *m);
  169. static
  170. int stream_init(midi_stream_t *s, alsa_rawmidi_t *midi, const char *name)
  171. {
  172. s->owner = midi;
  173. s->name = name;
  174. if (pipe(s->wake_pipe)==-1) {
  175. s->wake_pipe[0] = -1;
  176. error_log("pipe() in stream_init(%s) failed: %s", name, strerror(errno));
  177. return -errno;
  178. }
  179. s->jack.new_ports = jack_ringbuffer_create(sizeof(midi_port_t*)*MAX_PORTS);
  180. s->midi.new_ports = jack_ringbuffer_create(sizeof(midi_port_t*)*MAX_PORTS);
  181. if (!s->jack.new_ports || !s->midi.new_ports)
  182. return -ENOMEM;
  183. return 0;
  184. }
  185. static
  186. void stream_close(midi_stream_t *s)
  187. {
  188. if (s->wake_pipe[0] != -1) {
  189. close(s->wake_pipe[0]);
  190. close(s->wake_pipe[1]);
  191. }
  192. if (s->jack.new_ports)
  193. jack_ringbuffer_free(s->jack.new_ports);
  194. if (s->midi.new_ports)
  195. jack_ringbuffer_free(s->midi.new_ports);
  196. }
  197. static void alsa_rawmidi_delete(alsa_midi_t *m);
  198. static int alsa_rawmidi_attach(alsa_midi_t *m);
  199. static int alsa_rawmidi_detach(alsa_midi_t *m);
  200. static int alsa_rawmidi_start(alsa_midi_t *m);
  201. static int alsa_rawmidi_stop(alsa_midi_t *m);
  202. static void alsa_rawmidi_read(alsa_midi_t *m, jack_nframes_t nframes);
  203. static void alsa_rawmidi_write(alsa_midi_t *m, jack_nframes_t nframes);
  204. alsa_midi_t* alsa_rawmidi_new(jack_client_t *jack)
  205. {
  206. alsa_rawmidi_t *midi = calloc(1, sizeof(alsa_rawmidi_t));
  207. if (!midi)
  208. goto fail_0;
  209. midi->client = jack;
  210. if (pipe(midi->scan.wake_pipe)==-1) {
  211. error_log("pipe() in alsa_midi_new failed: %s", strerror(errno));
  212. goto fail_1;
  213. }
  214. if (stream_init(&midi->in, midi, "in"))
  215. goto fail_2;
  216. midi->in.mode = POLLIN;
  217. midi->in.port_size = sizeof(input_port_t);
  218. midi->in.port_init = input_port_init;
  219. midi->in.port_close = input_port_close;
  220. midi->in.process_jack = do_jack_input;
  221. midi->in.process_midi = do_midi_input;
  222. if (stream_init(&midi->out, midi, "out"))
  223. goto fail_3;
  224. midi->out.mode = POLLOUT;
  225. midi->out.port_size = sizeof(output_port_t);
  226. midi->out.port_init = output_port_init;
  227. midi->out.port_close = output_port_close;
  228. midi->out.process_jack = do_jack_output;
  229. midi->out.process_midi = do_midi_output;
  230. midi->ops.destroy = alsa_rawmidi_delete;
  231. midi->ops.attach = alsa_rawmidi_attach;
  232. midi->ops.detach = alsa_rawmidi_detach;
  233. midi->ops.start = alsa_rawmidi_start;
  234. midi->ops.stop = alsa_rawmidi_stop;
  235. midi->ops.read = alsa_rawmidi_read;
  236. midi->ops.write = alsa_rawmidi_write;
  237. return &midi->ops;
  238. fail_3:
  239. stream_close(&midi->out);
  240. fail_2:
  241. stream_close(&midi->in);
  242. close(midi->scan.wake_pipe[1]);
  243. close(midi->scan.wake_pipe[0]);
  244. fail_1:
  245. free(midi);
  246. fail_0:
  247. return NULL;
  248. }
  249. static
  250. midi_port_t** scan_port_del(alsa_rawmidi_t *midi, midi_port_t **list);
  251. static
  252. void alsa_rawmidi_delete(alsa_midi_t *m)
  253. {
  254. alsa_rawmidi_t *midi = (alsa_rawmidi_t*)m;
  255. alsa_rawmidi_detach(m);
  256. stream_close(&midi->out);
  257. stream_close(&midi->in);
  258. close(midi->scan.wake_pipe[0]);
  259. close(midi->scan.wake_pipe[1]);
  260. free(midi);
  261. }
  262. static void* scan_thread(void *);
  263. static void *midi_thread(void *arg);
  264. static
  265. int alsa_rawmidi_attach(alsa_midi_t *m)
  266. {
  267. return 0;
  268. }
  269. static
  270. int alsa_rawmidi_detach(alsa_midi_t *m)
  271. {
  272. alsa_rawmidi_t *midi = (alsa_rawmidi_t*)m;
  273. midi_port_t **list;
  274. alsa_rawmidi_stop(m);
  275. list = &midi->scan.ports;
  276. while (*list) {
  277. (*list)->state = PORT_REMOVED_FROM_JACK;
  278. list = scan_port_del(midi, list);
  279. }
  280. return 0;
  281. }
  282. static
  283. int alsa_rawmidi_start(alsa_midi_t *m)
  284. {
  285. alsa_rawmidi_t *midi = (alsa_rawmidi_t*)m;
  286. int err;
  287. char c = 'q';
  288. if (midi->keep_walking == 1)
  289. return -EALREADY;
  290. midi->keep_walking = 1;
  291. if ((err = jack_client_create_thread(midi->client, &midi->in.thread, MIDI_THREAD_PRIO, jack_is_realtime(midi->client), midi_thread, &midi->in))) {
  292. midi->keep_walking = 0;
  293. return err;
  294. }
  295. if ((err = jack_client_create_thread(midi->client, &midi->out.thread, MIDI_THREAD_PRIO, jack_is_realtime(midi->client), midi_thread, &midi->out))) {
  296. midi->keep_walking = 0;
  297. write(midi->in.wake_pipe[1], &c, 1);
  298. pthread_join(midi->in.thread, NULL);
  299. return err;
  300. }
  301. if ((err = jack_client_create_thread(midi->client, &midi->scan.thread, 0, 0, scan_thread, midi))) {
  302. midi->keep_walking = 0;
  303. write(midi->in.wake_pipe[1], &c, 1);
  304. write(midi->out.wake_pipe[1], &c, 1);
  305. pthread_join(midi->in.thread, NULL);
  306. pthread_join(midi->out.thread, NULL);
  307. return err;
  308. }
  309. return 0;
  310. }
  311. static
  312. int alsa_rawmidi_stop(alsa_midi_t *m)
  313. {
  314. alsa_rawmidi_t *midi = (alsa_rawmidi_t*)m;
  315. char c = 'q';
  316. if (midi->keep_walking == 0)
  317. return -EALREADY;
  318. midi->keep_walking = 0;
  319. write(midi->in.wake_pipe[1], &c, 1);
  320. write(midi->out.wake_pipe[1], &c, 1);
  321. write(midi->scan.wake_pipe[1], &c, 1);
  322. pthread_join(midi->in.thread, NULL);
  323. pthread_join(midi->out.thread, NULL);
  324. pthread_join(midi->scan.thread, NULL);
  325. // ports are freed in alsa_midi_detach()
  326. return 0;
  327. }
  328. static void jack_process(midi_stream_t *str, jack_nframes_t nframes);
  329. static
  330. void alsa_rawmidi_read(alsa_midi_t *m, jack_nframes_t nframes)
  331. {
  332. alsa_rawmidi_t *midi = (alsa_rawmidi_t*)m;
  333. jack_process(&midi->in, nframes);
  334. }
  335. static
  336. void alsa_rawmidi_write(alsa_midi_t *m, jack_nframes_t nframes)
  337. {
  338. alsa_rawmidi_t *midi = (alsa_rawmidi_t*)m;
  339. jack_process(&midi->out, nframes);
  340. }
  341. /*
  342. * -----------------------------------------------------------------------------
  343. */
  344. static inline
  345. int can_pass(size_t sz, jack_ringbuffer_t *in, jack_ringbuffer_t *out)
  346. {
  347. return jack_ringbuffer_read_space(in) >= sz && jack_ringbuffer_write_space(out) >= sz;
  348. }
  349. static
  350. void midi_port_init(const alsa_rawmidi_t *midi, midi_port_t *port, snd_rawmidi_info_t *info, const alsa_id_t *id)
  351. {
  352. const char *name;
  353. char *c;
  354. port->id = *id;
  355. snprintf(port->dev, sizeof(port->dev), "hw:%d,%d,%d", id->id[0], id->id[1], id->id[3]);
  356. name = snd_rawmidi_info_get_subdevice_name(info);
  357. if (!strlen(name))
  358. name = snd_rawmidi_info_get_name(info);
  359. snprintf(port->name, sizeof(port->name), "%s %s %s", port->id.id[2] ? "out":"in", port->dev, name);
  360. // replace all offending characters with '-'
  361. for (c=port->name; *c; ++c)
  362. if (!isalnum(*c))
  363. *c = '-';
  364. port->state = PORT_CREATED;
  365. }
  366. static
  367. inline int midi_port_open_jack(const alsa_rawmidi_t *midi, midi_port_t *port, int type, const char *name)
  368. {
  369. port->jack = jack_port_register(midi->client, name, JACK_DEFAULT_MIDI_TYPE,
  370. type | JackPortIsPhysical|JackPortIsTerminal, 0);
  371. return port->jack == NULL;
  372. }
  373. static
  374. int midi_port_open(const alsa_rawmidi_t *midi, midi_port_t *port)
  375. {
  376. int err;
  377. int type;
  378. char name[64];
  379. snd_rawmidi_t **in = NULL;
  380. snd_rawmidi_t **out = NULL;
  381. if (port->id.id[2] == 0) {
  382. in = &port->rawmidi;
  383. type = JackPortIsOutput;
  384. } else {
  385. out = &port->rawmidi;
  386. type = JackPortIsInput;
  387. }
  388. if ((err = snd_rawmidi_open(in, out, port->dev, SND_RAWMIDI_NONBLOCK))<0)
  389. return err;
  390. /* Some devices (emu10k1) have subdevs with the same name,
  391. * and we need to generate unique port name for jack */
  392. snprintf(name, sizeof(name), "%s", port->name);
  393. if (midi_port_open_jack(midi, port, type, name)) {
  394. int num;
  395. num = port->id.id[3] ? port->id.id[3] : port->id.id[1];
  396. snprintf(name, sizeof(name), "%s %d", port->name, num);
  397. if (midi_port_open_jack(midi, port, type, name))
  398. return 2;
  399. }
  400. if ((port->event_ring = jack_ringbuffer_create(MAX_EVENTS*sizeof(event_head_t)))==NULL)
  401. return 3;
  402. if ((port->data_ring = jack_ringbuffer_create(MAX_DATA))==NULL)
  403. return 4;
  404. return 0;
  405. }
  406. static
  407. void midi_port_close(const alsa_rawmidi_t *midi, midi_port_t *port)
  408. {
  409. if (port->data_ring) {
  410. jack_ringbuffer_free(port->data_ring);
  411. port->data_ring = NULL;
  412. }
  413. if (port->event_ring) {
  414. jack_ringbuffer_free(port->event_ring);
  415. port->event_ring = NULL;
  416. }
  417. if (port->jack) {
  418. jack_port_unregister(midi->client, port->jack);
  419. port->jack = NULL;
  420. }
  421. if (port->rawmidi) {
  422. snd_rawmidi_close(port->rawmidi);
  423. port->rawmidi = NULL;
  424. }
  425. }
  426. /*
  427. * ------------------------- Port scanning -------------------------------
  428. */
  429. static
  430. int alsa_id_before(const alsa_id_t *p1, const alsa_id_t *p2)
  431. {
  432. int i;
  433. for (i=0; i<4; ++i) {
  434. if (p1->id[i] < p2->id[i])
  435. return 1;
  436. else if (p1->id[i] > p2->id[i])
  437. return 0;
  438. }
  439. return 0;
  440. }
  441. static
  442. void alsa_get_id(alsa_id_t *id, snd_rawmidi_info_t *info)
  443. {
  444. id->id[0] = snd_rawmidi_info_get_card(info);
  445. id->id[1] = snd_rawmidi_info_get_device(info);
  446. id->id[2] = snd_rawmidi_info_get_stream(info) == SND_RAWMIDI_STREAM_OUTPUT ? 1 : 0;
  447. id->id[3] = snd_rawmidi_info_get_subdevice(info);
  448. }
  449. static inline
  450. void alsa_error(const char *func, int err)
  451. {
  452. error_log("%s() failed", snd_strerror(err));
  453. }
  454. typedef struct {
  455. alsa_rawmidi_t *midi;
  456. midi_port_t **iterator;
  457. snd_ctl_t *ctl;
  458. snd_rawmidi_info_t *info;
  459. } scan_t;
  460. static midi_port_t** scan_port_del(alsa_rawmidi_t *midi, midi_port_t **list);
  461. static
  462. void scan_cleanup(alsa_rawmidi_t *midi)
  463. {
  464. midi_port_t **list = &midi->scan.ports;
  465. while (*list)
  466. list = scan_port_del(midi, list);
  467. }
  468. static void scan_card(scan_t *scan);
  469. static midi_port_t** scan_port_open(alsa_rawmidi_t *midi, midi_port_t **list);
  470. void scan_cycle(alsa_rawmidi_t *midi)
  471. {
  472. int card = -1, err;
  473. scan_t scan;
  474. midi_port_t **ports;
  475. //debug_log("scan: cleanup");
  476. scan_cleanup(midi);
  477. scan.midi = midi;
  478. scan.iterator = &midi->scan.ports;
  479. snd_rawmidi_info_alloca(&scan.info);
  480. //debug_log("scan: rescan");
  481. while ((err = snd_card_next(&card))>=0 && card>=0) {
  482. char name[32];
  483. snprintf(name, sizeof(name), "hw:%d", card);
  484. if ((err = snd_ctl_open(&scan.ctl, name, SND_CTL_NONBLOCK))>=0) {
  485. scan_card(&scan);
  486. snd_ctl_close(scan.ctl);
  487. } else
  488. alsa_error("scan: snd_ctl_open", err);
  489. }
  490. // delayed open to workaround alsa<1.0.14 bug (can't open more than 1 subdevice if ctl is opened).
  491. ports = &midi->scan.ports;
  492. while (*ports) {
  493. midi_port_t *port = *ports;
  494. if (port->state == PORT_CREATED)
  495. ports = scan_port_open(midi, ports);
  496. else
  497. ports = &port->next;
  498. }
  499. }
  500. static void scan_device(scan_t *scan);
  501. static
  502. void scan_card(scan_t *scan)
  503. {
  504. int device = -1;
  505. int err;
  506. while ((err = snd_ctl_rawmidi_next_device(scan->ctl, &device))>=0 && device >=0) {
  507. snd_rawmidi_info_set_device(scan->info, device);
  508. snd_rawmidi_info_set_stream(scan->info, SND_RAWMIDI_STREAM_INPUT);
  509. snd_rawmidi_info_set_subdevice(scan->info, 0);
  510. if ((err = snd_ctl_rawmidi_info(scan->ctl, scan->info))>=0)
  511. scan_device(scan);
  512. else if (err != -ENOENT)
  513. alsa_error("scan: snd_ctl_rawmidi_info on device", err);
  514. snd_rawmidi_info_set_stream(scan->info, SND_RAWMIDI_STREAM_OUTPUT);
  515. snd_rawmidi_info_set_subdevice(scan->info, 0);
  516. if ((err = snd_ctl_rawmidi_info(scan->ctl, scan->info))>=0)
  517. scan_device(scan);
  518. else if (err != -ENOENT)
  519. alsa_error("scan: snd_ctl_rawmidi_info on device", err);
  520. }
  521. }
  522. static void scan_port_update(scan_t *scan);
  523. static
  524. void scan_device(scan_t *scan)
  525. {
  526. int err;
  527. int sub, nsubs = 0;
  528. nsubs = snd_rawmidi_info_get_subdevices_count(scan->info);
  529. for (sub=0; sub<nsubs; ++sub) {
  530. snd_rawmidi_info_set_subdevice(scan->info, sub);
  531. if ((err = snd_ctl_rawmidi_info(scan->ctl, scan->info)) < 0) {
  532. alsa_error("scan: snd_ctl_rawmidi_info on subdevice", err);
  533. continue;
  534. }
  535. scan_port_update(scan);
  536. }
  537. }
  538. static midi_port_t** scan_port_add(scan_t *scan, const alsa_id_t *id, midi_port_t **list);
  539. static
  540. void scan_port_update(scan_t *scan)
  541. {
  542. midi_port_t **list = scan->iterator;
  543. alsa_id_t id;
  544. alsa_get_id(&id, scan->info);
  545. while (*list && alsa_id_before(&(*list)->id, &id))
  546. list = scan_port_del(scan->midi, list);
  547. if (!*list || alsa_id_before(&id, &(*list)->id))
  548. list = scan_port_add(scan, &id, list);
  549. else if (*list)
  550. list = &(*list)->next;
  551. scan->iterator = list;
  552. }
  553. static
  554. midi_port_t** scan_port_add(scan_t *scan, const alsa_id_t *id, midi_port_t **list)
  555. {
  556. midi_port_t *port;
  557. midi_stream_t *str = id->id[2] ? &scan->midi->out : &scan->midi->in;
  558. port = calloc(1, str->port_size);
  559. if (!port)
  560. return list;
  561. midi_port_init(scan->midi, port, scan->info, id);
  562. port->next = *list;
  563. *list = port;
  564. error_log("scan: added port %s %s", port->dev, port->name);
  565. return &port->next;
  566. }
  567. static
  568. midi_port_t** scan_port_open(alsa_rawmidi_t *midi, midi_port_t **list)
  569. {
  570. midi_stream_t *str;
  571. midi_port_t *port;
  572. port = *list;
  573. str = port->id.id[2] ? &midi->out : &midi->in;
  574. if (jack_ringbuffer_write_space(str->jack.new_ports) < sizeof(port))
  575. goto fail_0;
  576. if (midi_port_open(midi, port))
  577. goto fail_1;
  578. if ((str->port_init)(midi, port))
  579. goto fail_2;
  580. port->state = PORT_ADDED_TO_JACK;
  581. jack_ringbuffer_write(str->jack.new_ports, (char*) &port, sizeof(port));
  582. error_log("scan: opened port %s %s", port->dev, port->name);
  583. return &port->next;
  584. fail_2:
  585. (str->port_close)(midi, port);
  586. fail_1:
  587. midi_port_close(midi, port);
  588. port->state = PORT_ZOMBIFIED;
  589. fail_0:
  590. error_log("scan: can't open port %s %s", port->dev, port->name);
  591. return &port->next;
  592. }
  593. static
  594. midi_port_t** scan_port_del(alsa_rawmidi_t *midi, midi_port_t **list)
  595. {
  596. midi_port_t *port = *list;
  597. if (port->state == PORT_REMOVED_FROM_JACK) {
  598. error_log("scan: deleted port %s %s", port->dev, port->name);
  599. *list = port->next;
  600. if (port->id.id[2] )
  601. (midi->out.port_close)(midi, port);
  602. else
  603. (midi->in.port_close)(midi, port);
  604. midi_port_close(midi, port);
  605. free(port);
  606. return list;
  607. } else {
  608. //debug_log("can't delete port %s, wrong state: %d", port->name, (int)port->state);
  609. return &port->next;
  610. }
  611. }
  612. void* scan_thread(void *arg)
  613. {
  614. alsa_rawmidi_t *midi = arg;
  615. struct pollfd wakeup;
  616. wakeup.fd = midi->scan.wake_pipe[0];
  617. wakeup.events = POLLIN|POLLERR|POLLNVAL;
  618. while (midi->keep_walking) {
  619. int res;
  620. //error_log("scanning....");
  621. scan_cycle(midi);
  622. res = poll(&wakeup, 1, 2000);
  623. if (res>0) {
  624. char c;
  625. read(wakeup.fd, &c, 1);
  626. } else if (res<0 && errno != EINTR)
  627. break;
  628. }
  629. return NULL;
  630. }
  631. /*
  632. * ------------------------------- Input/Output ------------------------------
  633. */
  634. static
  635. void jack_add_ports(midi_stream_t *str)
  636. {
  637. midi_port_t *port;
  638. while (can_pass(sizeof(port), str->jack.new_ports, str->midi.new_ports) && str->jack.nports < MAX_PORTS) {
  639. jack_ringbuffer_read(str->jack.new_ports, (char*)&port, sizeof(port));
  640. str->jack.ports[str->jack.nports++] = port;
  641. port->state = PORT_ADDED_TO_MIDI;
  642. jack_ringbuffer_write(str->midi.new_ports, (char*)&port, sizeof(port));
  643. }
  644. }
  645. static
  646. void jack_process(midi_stream_t *str, jack_nframes_t nframes)
  647. {
  648. int r, w;
  649. process_jack_t proc;
  650. jack_nframes_t cur_frames;
  651. if (!str->owner->keep_walking)
  652. return;
  653. proc.midi = str->owner;
  654. proc.nframes = nframes;
  655. proc.frame_time = jack_last_frame_time(proc.midi->client);
  656. cur_frames = jack_frame_time(proc.midi->client);
  657. if (proc.frame_time + proc.nframes < cur_frames) {
  658. int periods_lost = (cur_frames - proc.frame_time) / proc.nframes;
  659. proc.frame_time += periods_lost * proc.nframes;
  660. debug_log("xrun detected: %d periods lost", periods_lost);
  661. }
  662. // process existing ports
  663. for (r=0, w=0; r<str->jack.nports; ++r) {
  664. midi_port_t *port = str->jack.ports[r];
  665. proc.port = port;
  666. assert (port->state > PORT_ADDED_TO_JACK && port->state < PORT_REMOVED_FROM_JACK);
  667. proc.buffer = jack_port_get_buffer(port->jack, nframes);
  668. if (str->mode == POLLIN)
  669. jack_midi_clear_buffer(proc.buffer);
  670. if (port->state == PORT_REMOVED_FROM_MIDI) {
  671. port->state = PORT_REMOVED_FROM_JACK; // this signals to scan thread
  672. continue; // this effectively removes port from the midi->in.jack.ports[]
  673. }
  674. (str->process_jack)(&proc);
  675. if (r != w)
  676. str->jack.ports[w] = port;
  677. ++w;
  678. }
  679. if (str->jack.nports != w)
  680. debug_log("jack_%s: nports %d -> %d", str->name, str->jack.nports, w);
  681. str->jack.nports = w;
  682. jack_add_ports(str); // it makes no sense to add them earlier since they have no data yet
  683. // wake midi thread
  684. write(str->wake_pipe[1], &r, 1);
  685. }
  686. static
  687. void *midi_thread(void *arg)
  688. {
  689. midi_stream_t *str = arg;
  690. alsa_rawmidi_t *midi = str->owner;
  691. struct pollfd pfds[MAX_PFDS];
  692. int npfds;
  693. jack_time_t wait_nsec = 1000*1000*1000; // 1 sec
  694. process_midi_t proc;
  695. proc.midi = midi;
  696. proc.mode = str->mode;
  697. pfds[0].fd = str->wake_pipe[0];
  698. pfds[0].events = POLLIN|POLLERR|POLLNVAL;
  699. npfds = 1;
  700. //debug_log("midi_thread(%s): enter", str->name);
  701. while (midi->keep_walking) {
  702. int poll_timeout;
  703. int wait_nanosleep;
  704. int r=1, w=1; // read,write pos in pfds
  705. int rp=0, wp=0; // read, write pos in ports
  706. // sleep
  707. //if (wait_nsec != 1000*1000*1000) {
  708. // debug_log("midi_thread(%s): ", str->name);
  709. // assert (wait_nsec == 1000*1000*1000);
  710. //}
  711. poll_timeout = wait_nsec / (1000*1000);
  712. wait_nanosleep = wait_nsec % (1000*1000);
  713. if (wait_nanosleep > NANOSLEEP_RESOLUTION) {
  714. struct timespec ts;
  715. ts.tv_sec = 0;
  716. ts.tv_nsec = wait_nanosleep;
  717. clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, NULL);
  718. }
  719. int res = poll((struct pollfd*)&pfds, npfds, poll_timeout);
  720. //debug_log("midi_thread(%s): poll exit: %d", str->name, res);
  721. if (!midi->keep_walking)
  722. break;
  723. if (res < 0) {
  724. if (errno == EINTR)
  725. continue;
  726. error_log("midi_thread(%s) poll failed: %s", str->name, strerror(errno));
  727. break;
  728. }
  729. // check wakeup pipe
  730. if (pfds[0].revents & ~POLLIN)
  731. break;
  732. if (pfds[0].revents & POLLIN) {
  733. char c;
  734. read(pfds[0].fd, &c, 1);
  735. }
  736. // add new ports
  737. while (jack_ringbuffer_read_space(str->midi.new_ports) >= sizeof(midi_port_t*) && str->midi.nports < MAX_PORTS) {
  738. midi_port_t *port;
  739. jack_ringbuffer_read(str->midi.new_ports, (char*)&port, sizeof(port));
  740. str->midi.ports[str->midi.nports++] = port;
  741. debug_log("midi_thread(%s): added port %s", str->name, port->name);
  742. }
  743. // if (res == 0)
  744. // continue;
  745. // process ports
  746. proc.cur_time = 0; //jack_frame_time(midi->client);
  747. proc.next_time = NFRAMES_INF;
  748. for (rp = 0; rp < str->midi.nports; ++rp) {
  749. midi_port_t *port = str->midi.ports[rp];
  750. proc.cur_time = jack_frame_time(midi->client);
  751. proc.port = port;
  752. proc.rpfds = &pfds[r];
  753. proc.wpfds = &pfds[w];
  754. proc.max_pfds = MAX_PFDS - w;
  755. r += port->npfds;
  756. if (!(str->process_midi)(&proc)) {
  757. port->state = PORT_REMOVED_FROM_MIDI; // this signals to jack thread
  758. continue; // this effectively removes port from array
  759. }
  760. w += port->npfds;
  761. if (rp != wp)
  762. str->midi.ports[wp] = port;
  763. ++wp;
  764. }
  765. if (str->midi.nports != wp)
  766. debug_log("midi_%s: nports %d -> %d", str->name, str->midi.nports, wp);
  767. str->midi.nports = wp;
  768. if (npfds != w)
  769. debug_log("midi_%s: npfds %d -> %d", str->name, npfds, w);
  770. npfds = w;
  771. /*
  772. * Input : ports do not set proc.next_time.
  773. * Output: port sets proc.next_time ONLY if it does not have queued data.
  774. * So, zero timeout will not cause busy-looping.
  775. */
  776. if (proc.next_time < proc.cur_time) {
  777. debug_log("%s: late: next_time = %d, cur_time = %d", str->name, (int)proc.next_time, (int)proc.cur_time);
  778. wait_nsec = 0; // we are late
  779. } else if (proc.next_time != NFRAMES_INF) {
  780. jack_time_t wait_frames = proc.next_time - proc.cur_time;
  781. jack_nframes_t rate = jack_get_sample_rate(midi->client);
  782. wait_nsec = (wait_frames * (1000*1000*1000)) / rate;
  783. debug_log("midi_%s: timeout = %d", str->name, (int)wait_frames);
  784. } else
  785. wait_nsec = 1000*1000*1000;
  786. //debug_log("midi_thread(%s): wait_nsec = %lld", str->name, wait_nsec);
  787. }
  788. return NULL;
  789. }
  790. static
  791. int midi_is_ready(process_midi_t *proc)
  792. {
  793. midi_port_t *port = proc->port;
  794. if (port->npfds) {
  795. unsigned short revents = 0;
  796. int res = snd_rawmidi_poll_descriptors_revents(port->rawmidi, proc->rpfds, port->npfds, &revents);
  797. if (res) {
  798. error_log("snd_rawmidi_poll_descriptors_revents failed on port %s with: %s", port->name, snd_strerror(res));
  799. return 0;
  800. }
  801. if (revents & ~proc->mode) {
  802. debug_log("midi: port %s failed", port->name);
  803. return 0;
  804. }
  805. if (revents & proc->mode) {
  806. port->is_ready = 1;
  807. debug_log("midi: is_ready %s", port->name);
  808. }
  809. }
  810. return 1;
  811. }
  812. static
  813. int midi_update_pfds(process_midi_t *proc)
  814. {
  815. midi_port_t *port = proc->port;
  816. if (port->npfds == 0) {
  817. port->npfds = snd_rawmidi_poll_descriptors_count(port->rawmidi);
  818. if (port->npfds > proc->max_pfds) {
  819. debug_log("midi: not enough pfds for port %s", port->name);
  820. return 0;
  821. }
  822. snd_rawmidi_poll_descriptors(port->rawmidi, proc->wpfds, port->npfds);
  823. } else if (proc->rpfds != proc->wpfds) {
  824. memmove(proc->wpfds, proc->rpfds, sizeof(struct pollfd) * port->npfds);
  825. }
  826. return 1;
  827. }
  828. /*
  829. * ------------------------------------ Input ------------------------------
  830. */
  831. static
  832. int input_port_init(alsa_rawmidi_t *midi, midi_port_t *port)
  833. {
  834. input_port_t *in = (input_port_t*)port;
  835. midi_unpack_init(&in->unpack);
  836. return 0;
  837. }
  838. static
  839. void input_port_close(alsa_rawmidi_t *midi, midi_port_t *port)
  840. {
  841. }
  842. /*
  843. * Jack-level input.
  844. */
  845. static
  846. void do_jack_input(process_jack_t *p)
  847. {
  848. input_port_t *port = (input_port_t*) p->port;
  849. event_head_t event;
  850. while (jack_ringbuffer_read_space(port->base.event_ring) >= sizeof(event)) {
  851. jack_ringbuffer_data_t vec[2];
  852. jack_nframes_t time;
  853. int i, todo;
  854. jack_ringbuffer_read(port->base.event_ring, (char*)&event, sizeof(event));
  855. // TODO: take into account possible warping
  856. if ((event.time + p->nframes) < p->frame_time)
  857. time = 0;
  858. else if (event.time >= p->frame_time)
  859. time = p->nframes -1;
  860. else
  861. time = event.time + p->nframes - p->frame_time;
  862. jack_ringbuffer_get_read_vector(port->base.data_ring, vec);
  863. assert ((vec[0].len + vec[1].len) >= event.size);
  864. if (event.overruns)
  865. midi_unpack_reset(&port->unpack);
  866. todo = event.size;
  867. for (i=0; i<2 && todo>0; ++i) {
  868. int avail = todo < vec[i].len ? todo : vec[i].len;
  869. int done = midi_unpack_buf(&port->unpack, (unsigned char*)vec[i].buf, avail, p->buffer, time);
  870. if (done != avail) {
  871. debug_log("jack_in: buffer overflow in port %s", port->base.name);
  872. break;
  873. }
  874. todo -= done;
  875. }
  876. jack_ringbuffer_read_advance(port->base.data_ring, event.size);
  877. }
  878. }
  879. /*
  880. * Low level input.
  881. */
  882. static
  883. int do_midi_input(process_midi_t *proc)
  884. {
  885. input_port_t *port = (input_port_t*) proc->port;
  886. if (!midi_is_ready(proc))
  887. return 0;
  888. if (port->base.is_ready) {
  889. jack_ringbuffer_data_t vec[2];
  890. int res;
  891. jack_ringbuffer_get_write_vector(port->base.data_ring, vec);
  892. if (jack_ringbuffer_write_space(port->base.event_ring) < sizeof(event_head_t) || vec[0].len < 1) {
  893. port->overruns++;
  894. if (port->base.npfds)
  895. debug_log("midi_in: internal overflow on %s", port->base.name);
  896. // remove from poll to prevent busy-looping
  897. port->base.npfds = 0;
  898. return 1;
  899. }
  900. res = snd_rawmidi_read(port->base.rawmidi, vec[0].buf, vec[0].len);
  901. if (res < 0 && res != -EWOULDBLOCK) {
  902. error_log("midi_in: reading from port %s failed: %s", port->base.name, snd_strerror(res));
  903. return 0;
  904. } else if (res > 0) {
  905. event_head_t event;
  906. event.time = proc->cur_time;
  907. event.size = res;
  908. event.overruns = port->overruns;
  909. port->overruns = 0;
  910. debug_log("midi_in: read %d bytes at %d", (int)event.size, (int)event.time);
  911. jack_ringbuffer_write_advance(port->base.data_ring, event.size);
  912. jack_ringbuffer_write(port->base.event_ring, (char*)&event, sizeof(event));
  913. }
  914. port->base.is_ready = 0;
  915. }
  916. if (!midi_update_pfds(proc))
  917. return 0;
  918. return 1;
  919. }
  920. /*
  921. * ------------------------------------ Output ------------------------------
  922. */
  923. static int output_port_init(alsa_rawmidi_t *midi, midi_port_t *port)
  924. {
  925. output_port_t *out = (output_port_t*)port;
  926. midi_pack_reset(&out->packer);
  927. out->next_event.time = 0;
  928. out->next_event.size = 0;
  929. out->todo = 0;
  930. return 0;
  931. }
  932. static void output_port_close(alsa_rawmidi_t *midi, midi_port_t *port)
  933. {
  934. }
  935. static
  936. void do_jack_output(process_jack_t *proc)
  937. {
  938. output_port_t *port = (output_port_t*) proc->port;
  939. int nevents = jack_midi_get_event_count(proc->buffer);
  940. int i;
  941. if (nevents)
  942. debug_log("jack_out: %d events in %s", nevents, port->base.name);
  943. for (i=0; i<nevents; ++i) {
  944. jack_midi_event_t event;
  945. event_head_t hdr;
  946. jack_midi_event_get(&event, proc->buffer, i);
  947. if (jack_ringbuffer_write_space(port->base.data_ring) < event.size || jack_ringbuffer_write_space(port->base.event_ring) < sizeof(hdr)) {
  948. debug_log("jack_out: output buffer overflow on %s", port->base.name);
  949. break;
  950. }
  951. midi_pack_event(&port->packer, &event);
  952. jack_ringbuffer_write(port->base.data_ring, (char*)event.buffer, event.size);
  953. hdr.time = proc->frame_time + event.time + proc->nframes;
  954. hdr.size = event.size;
  955. jack_ringbuffer_write(port->base.event_ring, (char*)&hdr, sizeof(hdr));
  956. debug_log("jack_out: sent %d-byte event at %ld", (int)event.size, (long)event.time);
  957. }
  958. }
  959. static
  960. int do_midi_output(process_midi_t *proc)
  961. {
  962. int worked = 0;
  963. output_port_t *port = (output_port_t*) proc->port;
  964. if (!midi_is_ready(proc))
  965. return 0;
  966. // eat events
  967. while (port->next_event.time <= proc->cur_time) {
  968. port->todo += port->next_event.size;
  969. if (jack_ringbuffer_read(port->base.event_ring, (char*)&port->next_event, sizeof(port->next_event))!=sizeof(port->next_event)) {
  970. port->next_event.time = 0;
  971. port->next_event.size = 0;
  972. break;
  973. } else
  974. debug_log("midi_out: at %ld got %d bytes for %ld", (long)proc->cur_time, (int)port->next_event.size, (long)port->next_event.time);
  975. }
  976. if (port->todo)
  977. debug_log("midi_out: todo = %d at %ld", (int)port->todo, (long)proc->cur_time);
  978. // calc next wakeup time
  979. if (!port->todo && port->next_event.time && port->next_event.time < proc->next_time) {
  980. proc->next_time = port->next_event.time;
  981. debug_log("midi_out: next_time = %ld", (long)proc->next_time);
  982. }
  983. if (port->todo && port->base.is_ready) {
  984. // write data
  985. int size = port->todo;
  986. int res;
  987. jack_ringbuffer_data_t vec[2];
  988. jack_ringbuffer_get_read_vector(port->base.data_ring, vec);
  989. if (size > vec[0].len) {
  990. size = vec[0].len;
  991. assert (size > 0);
  992. }
  993. res = snd_rawmidi_write(port->base.rawmidi, vec[0].buf, size);
  994. if (res > 0) {
  995. jack_ringbuffer_read_advance(port->base.data_ring, res);
  996. debug_log("midi_out: written %d bytes to %s", res, port->base.name);
  997. port->todo -= res;
  998. worked = 1;
  999. } else if (res == -EWOULDBLOCK) {
  1000. port->base.is_ready = 0;
  1001. debug_log("midi_out: -EWOULDBLOCK on %s", port->base.name);
  1002. return 1;
  1003. } else {
  1004. error_log("midi_out: writing to port %s failed: %s", port->base.name, snd_strerror(res));
  1005. return 0;
  1006. }
  1007. snd_rawmidi_drain(port->base.rawmidi);
  1008. }
  1009. // update pfds for this port
  1010. if (!midi_update_pfds(proc))
  1011. return 0;
  1012. if (!port->todo) {
  1013. int i;
  1014. if (worked)
  1015. debug_log("midi_out: relaxing on %s", port->base.name);
  1016. for (i=0; i<port->base.npfds; ++i)
  1017. proc->wpfds[i].events &= ~POLLOUT;
  1018. } else {
  1019. int i;
  1020. for (i=0; i<port->base.npfds; ++i)
  1021. proc->wpfds[i].events |= POLLOUT;
  1022. }
  1023. return 1;
  1024. }