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.

1262 lines
32KB

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