jack2 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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