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.

1271 lines
31KB

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