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.

1166 lines
38KB

  1. /*
  2. Copyright (C) 2001 Paul Davis
  3. Copyright (C) 2004 Grame
  4. Copyright (C) 2007 Pieter Palmers
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. */
  17. #include <iostream>
  18. #include <unistd.h>
  19. #include <math.h>
  20. #include <stdio.h>
  21. #include <memory.h>
  22. #include <unistd.h>
  23. #include <stdlib.h>
  24. #include <errno.h>
  25. #include <stdarg.h>
  26. #include <signal.h>
  27. #include <sys/types.h>
  28. #include <sys/time.h>
  29. #include <regex.h>
  30. #include <string.h>
  31. #include "JackFFADODriver.h"
  32. #include "JackEngineControl.h"
  33. #include "JackClientControl.h"
  34. #include "JackPort.h"
  35. #include "JackGraphManager.h"
  36. namespace Jack
  37. {
  38. #define FIREWIRE_REQUIRED_FFADO_API_VERSION 5
  39. #define jack_get_microseconds GetMicroSeconds
  40. #define SAMPLE_MAX_24BIT 8388608.0f
  41. #define SAMPLE_MAX_16BIT 32768.0f
  42. int
  43. JackFFADODriver::ffado_driver_read (ffado_driver_t * driver, jack_nframes_t nframes)
  44. {
  45. jack_default_audio_sample_t* buf = NULL;
  46. // channel_t chn;
  47. // JSList *node;
  48. // jack_port_t* port;
  49. ffado_sample_t nullbuffer[nframes];
  50. void *addr_of_nullbuffer = (void *)nullbuffer;
  51. ffado_streaming_stream_type stream_type;
  52. printEnter();
  53. //make sure all buffers have a valid buffer if not connected
  54. for (unsigned int i = 0; i < driver->capture_nchannels; i++) {
  55. stream_type = ffado_streaming_get_capture_stream_type(driver->dev, i);
  56. if (stream_type == ffado_stream_type_audio) {
  57. ffado_streaming_set_capture_stream_buffer(driver->dev, i, (char *)(nullbuffer));
  58. ffado_streaming_capture_stream_onoff(driver->dev, i, 0);
  59. } else if (stream_type == ffado_stream_type_midi) {
  60. // these should be read/written with the per-stream functions
  61. } else { // empty other buffers without doing something with them
  62. ffado_streaming_set_capture_stream_buffer(driver->dev, i, (char *)(nullbuffer));
  63. ffado_streaming_capture_stream_onoff(driver->dev, i, 0);
  64. }
  65. }
  66. for (int i = 0; i < fCaptureChannels; i++) {
  67. stream_type = ffado_streaming_get_capture_stream_type(driver->dev, i);
  68. if (stream_type == ffado_stream_type_audio) {
  69. if (fGraphManager->GetConnectionsNum(fCapturePortList[i]) > 0) {
  70. buf = (jack_default_audio_sample_t*)fGraphManager->GetBuffer(fCapturePortList[i], nframes);
  71. if (!buf) {
  72. buf = (jack_default_audio_sample_t *)addr_of_nullbuffer;
  73. }
  74. ffado_streaming_set_capture_stream_buffer(driver->dev, i, (char *)(buf));
  75. ffado_streaming_capture_stream_onoff(driver->dev, i, 1);
  76. }
  77. } else if (stream_type == ffado_stream_type_midi) {
  78. // these should be read/written with the per-stream functions
  79. } else { // empty other buffers without doing something with them
  80. ffado_streaming_set_capture_stream_buffer(driver->dev, i, (char *)(nullbuffer));
  81. ffado_streaming_capture_stream_onoff(driver->dev, i, 0);
  82. }
  83. }
  84. // now transfer the buffers
  85. ffado_streaming_transfer_capture_buffers(driver->dev);
  86. printExit();
  87. return 0;
  88. }
  89. int
  90. JackFFADODriver::ffado_driver_write (ffado_driver_t * driver, jack_nframes_t nframes)
  91. {
  92. jack_default_audio_sample_t* buf = NULL;
  93. ffado_streaming_stream_type stream_type;
  94. ffado_sample_t nullbuffer[nframes];
  95. void *addr_of_nullbuffer = (void*)nullbuffer;
  96. memset(&nullbuffer, 0, nframes*sizeof(ffado_sample_t));
  97. printEnter();
  98. driver->process_count++;
  99. assert(driver->dev);
  100. // make sure all buffers output silence if not connected
  101. for (unsigned int i = 0; i < driver->playback_nchannels; i++) {
  102. stream_type = ffado_streaming_get_playback_stream_type(driver->dev, i);
  103. if (stream_type == ffado_stream_type_audio) {
  104. ffado_streaming_set_playback_stream_buffer(driver->dev, i, (char *)(nullbuffer));
  105. ffado_streaming_playback_stream_onoff(driver->dev, i, 0);
  106. } else if (stream_type == ffado_stream_type_midi) {
  107. // these should be read/written with the per-stream functions
  108. } else { // empty other buffers without doing something with them
  109. ffado_streaming_set_playback_stream_buffer(driver->dev, i, (char *)(nullbuffer));
  110. ffado_streaming_playback_stream_onoff(driver->dev, i, 0);
  111. }
  112. }
  113. for (int i = 0; i < fPlaybackChannels; i++) {
  114. stream_type = ffado_streaming_get_playback_stream_type(driver->dev, i);
  115. if (stream_type == ffado_stream_type_audio) {
  116. // Ouput ports
  117. if (fGraphManager->GetConnectionsNum(fPlaybackPortList[i]) > 0) {
  118. buf = (jack_default_audio_sample_t*)fGraphManager->GetBuffer(fPlaybackPortList[i], nframes);
  119. if (!buf) {
  120. buf = (jack_default_audio_sample_t *)addr_of_nullbuffer;
  121. }
  122. ffado_streaming_set_playback_stream_buffer(driver->dev, i, (char *)(buf));
  123. ffado_streaming_playback_stream_onoff(driver->dev, i, 1);
  124. }
  125. }
  126. }
  127. ffado_streaming_transfer_playback_buffers(driver->dev);
  128. printExit();
  129. return 0;
  130. }
  131. jack_nframes_t
  132. JackFFADODriver::ffado_driver_wait (ffado_driver_t *driver, int extra_fd, int *status,
  133. float *delayed_usecs)
  134. {
  135. int nframes;
  136. jack_time_t wait_enter;
  137. jack_time_t wait_ret;
  138. printEnter();
  139. wait_enter = jack_get_microseconds ();
  140. if (wait_enter > driver->wait_next) {
  141. /*
  142. * This processing cycle was delayed past the
  143. * next due interrupt! Do not account this as
  144. * a wakeup delay:
  145. */
  146. driver->wait_next = 0;
  147. driver->wait_late++;
  148. }
  149. // *status = -2; interrupt
  150. // *status = -3; timeout
  151. // *status = -4; extra FD
  152. nframes = ffado_streaming_wait(driver->dev);
  153. wait_ret = jack_get_microseconds ();
  154. if (driver->wait_next && wait_ret > driver->wait_next) {
  155. *delayed_usecs = wait_ret - driver->wait_next;
  156. }
  157. driver->wait_last = wait_ret;
  158. driver->wait_next = wait_ret + driver->period_usecs;
  159. // driver->engine->transport_cycle_start (driver->engine, wait_ret);
  160. if (nframes < 0) {
  161. *status = 0;
  162. return 0;
  163. }
  164. *status = 0;
  165. fLastWaitUst = wait_ret;
  166. // FIXME: this should do something more usefull
  167. *delayed_usecs = 0;
  168. printExit();
  169. return nframes - nframes % driver->period_size;
  170. }
  171. int
  172. JackFFADODriver::ffado_driver_start (ffado_driver_t *driver)
  173. {
  174. int retval = 0;
  175. #ifdef FFADO_DRIVER_WITH_MIDI
  176. if (driver->midi_handle) {
  177. if ((retval = ffado_driver_midi_start(driver->midi_handle))) {
  178. printError("Could not start MIDI threads");
  179. return retval;
  180. }
  181. }
  182. #endif
  183. if ((retval = ffado_streaming_start(driver->dev))) {
  184. printError("Could not start streaming threads");
  185. #ifdef FFADO_DRIVER_WITH_MIDI
  186. if (driver->midi_handle) {
  187. ffado_driver_midi_stop(driver->midi_handle);
  188. }
  189. #endif
  190. return retval;
  191. }
  192. return 0;
  193. }
  194. int
  195. JackFFADODriver::ffado_driver_stop (ffado_driver_t *driver)
  196. {
  197. int retval = 0;
  198. #ifdef FFADO_DRIVER_WITH_MIDI
  199. if (driver->midi_handle) {
  200. if ((retval = ffado_driver_midi_stop(driver->midi_handle))) {
  201. printError("Could not stop MIDI threads");
  202. return retval;
  203. }
  204. }
  205. #endif
  206. if ((retval = ffado_streaming_stop(driver->dev))) {
  207. printError("Could not stop streaming threads");
  208. return retval;
  209. }
  210. return 0;
  211. }
  212. int
  213. JackFFADODriver::ffado_driver_restart (ffado_driver_t *driver)
  214. {
  215. if (Stop())
  216. return -1;
  217. return Start();
  218. }
  219. int
  220. JackFFADODriver::SetBufferSize (jack_nframes_t nframes)
  221. {
  222. printError("Buffer size change requested but not supported!!!");
  223. /*
  224. driver->period_size = nframes;
  225. driver->period_usecs =
  226. (jack_time_t) floor ((((float) nframes) / driver->sample_rate)
  227. * 1000000.0f);
  228. */
  229. /* tell the engine to change its buffer size */
  230. //driver->engine->set_buffer_size (driver->engine, nframes);
  231. return -1; // unsupported
  232. }
  233. typedef void (*JackDriverFinishFunction) (jack_driver_t *);
  234. ffado_driver_t *
  235. JackFFADODriver::ffado_driver_new (char *name,
  236. ffado_jack_settings_t *params)
  237. {
  238. ffado_driver_t *driver;
  239. assert(params);
  240. if(ffado_get_api_version() != FIREWIRE_REQUIRED_FFADO_API_VERSION) {
  241. printError("Incompatible libffado version! (%s)", ffado_get_version());
  242. return NULL;
  243. }
  244. printMessage("Starting FFADO backend (%s)", ffado_get_version());
  245. driver = (ffado_driver_t*)calloc (1, sizeof (ffado_driver_t));
  246. /* Setup the jack interfaces */
  247. jack_driver_nt_init ((jack_driver_nt_t *) driver);
  248. /* driver->nt_attach = (JackDriverNTAttachFunction) ffado_driver_attach;
  249. driver->nt_detach = (JackDriverNTDetachFunction) ffado_driver_detach;
  250. driver->nt_start = (JackDriverNTStartFunction) ffado_driver_start;
  251. driver->nt_stop = (JackDriverNTStopFunction) ffado_driver_stop;
  252. driver->nt_run_cycle = (JackDriverNTRunCycleFunction) ffado_driver_run_cycle;
  253. driver->null_cycle = (JackDriverNullCycleFunction) ffado_driver_null_cycle;
  254. driver->write = (JackDriverReadFunction) ffado_driver_write;
  255. driver->read = (JackDriverReadFunction) ffado_driver_read;
  256. driver->nt_bufsize = (JackDriverNTBufSizeFunction) ffado_driver_bufsize;
  257. */
  258. /* copy command line parameter contents to the driver structure */
  259. memcpy(&driver->settings, params, sizeof(ffado_jack_settings_t));
  260. /* prepare all parameters */
  261. driver->sample_rate = params->sample_rate;
  262. driver->period_size = params->period_size;
  263. fLastWaitUst = 0;
  264. driver->period_usecs =
  265. (jack_time_t) floor ((((float) driver->period_size) * 1000000.0f) / driver->sample_rate);
  266. // driver->client = client;
  267. driver->engine = NULL;
  268. memset(&driver->device_options, 0, sizeof(driver->device_options));
  269. driver->device_options.sample_rate = params->sample_rate;
  270. driver->device_options.period_size = params->period_size;
  271. driver->device_options.nb_buffers = params->buffer_size;
  272. driver->device_options.verbose = params->verbose_level;
  273. driver->capture_frame_latency = params->capture_frame_latency;
  274. driver->playback_frame_latency = params->playback_frame_latency;
  275. debugPrint(DEBUG_LEVEL_STARTUP, " Driver compiled on %s %s", __DATE__, __TIME__);
  276. debugPrint(DEBUG_LEVEL_STARTUP, " Created driver %s", name);
  277. debugPrint(DEBUG_LEVEL_STARTUP, " period_size: %d", driver->device_options.period_size);
  278. debugPrint(DEBUG_LEVEL_STARTUP, " period_usecs: %d", driver->period_usecs);
  279. debugPrint(DEBUG_LEVEL_STARTUP, " sample rate: %d", driver->device_options.sample_rate);
  280. debugPrint(DEBUG_LEVEL_STARTUP, " verbose level: %d", driver->device_options.verbose);
  281. return (ffado_driver_t *) driver;
  282. }
  283. void
  284. JackFFADODriver::ffado_driver_delete (ffado_driver_t *driver)
  285. {
  286. free (driver);
  287. }
  288. #ifdef FFADO_DRIVER_WITH_MIDI
  289. /*
  290. * MIDI support
  291. */
  292. // the thread that will queue the midi events from the seq to the stream buffers
  293. void *
  294. JackFFADODriver::ffado_driver_midi_queue_thread(void *arg)
  295. {
  296. ffado_driver_midi_handle_t *m = (ffado_driver_midi_handle_t *)arg;
  297. assert(m);
  298. snd_seq_event_t *ev;
  299. unsigned char work_buffer[MIDI_TRANSMIT_BUFFER_SIZE];
  300. int bytes_to_send;
  301. int b;
  302. int i;
  303. printMessage("MIDI queue thread started");
  304. while (1) {
  305. // get next event, if one is present
  306. while ((snd_seq_event_input(m->seq_handle, &ev) > 0)) {
  307. // get the port this event is originated from
  308. ffado_midi_port_t *port = NULL;
  309. for (i = 0;i < m->nb_output_ports;i++) {
  310. if (m->output_ports[i]->seq_port_nr == ev->dest.port) {
  311. port = m->output_ports[i];
  312. break;
  313. }
  314. }
  315. if (!port) {
  316. printError(" Could not find target port for event: dst=%d src=%d", ev->dest.port, ev->source.port);
  317. break;
  318. }
  319. // decode it to the work buffer
  320. if ((bytes_to_send = snd_midi_event_decode ( port->parser,
  321. work_buffer,
  322. MIDI_TRANSMIT_BUFFER_SIZE,
  323. ev)) < 0) { // failed
  324. printError(" Error decoding event for port %d (errcode=%d)", port->seq_port_nr, bytes_to_send);
  325. bytes_to_send = 0;
  326. //return -1;
  327. }
  328. for (b = 0;b < bytes_to_send;b++) {
  329. ffado_sample_t tmp_event = work_buffer[b];
  330. if (ffado_streaming_write(m->dev, port->stream_nr, &tmp_event, 1) < 1) {
  331. printError(" Midi send buffer overrun");
  332. }
  333. }
  334. }
  335. // sleep for some time
  336. usleep(MIDI_THREAD_SLEEP_TIME_USECS);
  337. }
  338. return NULL;
  339. }
  340. // the dequeue thread (maybe we need one thread per stream)
  341. void *
  342. JackFFADODriver::ffado_driver_midi_dequeue_thread (void *arg)
  343. {
  344. ffado_driver_midi_handle_t *m = (ffado_driver_midi_handle_t *)arg;
  345. int i;
  346. int s;
  347. int samples_read;
  348. assert(m);
  349. while (1) {
  350. // read incoming events
  351. for (i = 0;i < m->nb_input_ports;i++) {
  352. unsigned int buff[64];
  353. ffado_midi_port_t *port = m->input_ports[i];
  354. if (!port) {
  355. printError(" something went wrong when setting up the midi input port map (%d)", i);
  356. }
  357. do {
  358. samples_read = ffado_streaming_read(m->dev, port->stream_nr, buff, 64);
  359. for (s = 0;s < samples_read;s++) {
  360. unsigned int *byte = (buff + s) ;
  361. snd_seq_event_t ev;
  362. if ((snd_midi_event_encode_byte(port->parser, (*byte) & 0xFF, &ev)) > 0) {
  363. // a midi message is complete, send it out to ALSA
  364. snd_seq_ev_set_subs(&ev);
  365. snd_seq_ev_set_direct(&ev);
  366. snd_seq_ev_set_source(&ev, port->seq_port_nr);
  367. snd_seq_event_output_direct(port->seq_handle, &ev);
  368. }
  369. }
  370. } while (samples_read > 0);
  371. }
  372. // sleep for some time
  373. usleep(MIDI_THREAD_SLEEP_TIME_USECS);
  374. }
  375. return NULL;
  376. }
  377. ffado_driver_midi_handle_t *
  378. JackFFADODriver::ffado_driver_midi_init(ffado_driver_t *driver)
  379. {
  380. // int err;
  381. char buf[256];
  382. channel_t chn;
  383. int nchannels;
  384. int i = 0;
  385. ffado_device_t *dev = driver->dev;
  386. assert(dev);
  387. ffado_driver_midi_handle_t *m = calloc(1, sizeof(ffado_driver_midi_handle_t));
  388. if (!m) {
  389. printError("not enough memory to create midi structure");
  390. return NULL;
  391. }
  392. if (snd_seq_open(&m->seq_handle, "default", SND_SEQ_OPEN_DUPLEX, SND_SEQ_NONBLOCK) < 0) {
  393. printError("Error opening ALSA sequencer.");
  394. free(m);
  395. return NULL;
  396. }
  397. snd_seq_set_client_name(m->seq_handle, "FFADO Jack MIDI");
  398. // find out the number of midi in/out ports we need to setup
  399. nchannels = ffado_streaming_get_nb_capture_streams(dev);
  400. m->nb_input_ports = 0;
  401. for (chn = 0; chn < nchannels; chn++) {
  402. if (ffado_streaming_get_capture_stream_type(dev, chn) == ffado_stream_type_midi) {
  403. m->nb_input_ports++;
  404. }
  405. }
  406. m->input_ports = calloc(m->nb_input_ports, sizeof(ffado_midi_port_t *));
  407. if (!m->input_ports) {
  408. printError("not enough memory to create midi structure");
  409. free(m);
  410. return NULL;
  411. }
  412. i = 0;
  413. for (chn = 0; chn < nchannels; chn++) {
  414. if (ffado_streaming_get_capture_stream_type(dev, chn) == ffado_stream_type_midi) {
  415. m->input_ports[i] = calloc(1, sizeof(ffado_midi_port_t));
  416. if (!m->input_ports[i]) {
  417. // fixme
  418. printError("Could not allocate memory for seq port");
  419. continue;
  420. }
  421. ffado_streaming_get_capture_stream_name(dev, chn, buf, sizeof(buf) - 1);
  422. printMessage("Register MIDI IN port %s", buf);
  423. m->input_ports[i]->seq_port_nr = snd_seq_create_simple_port(m->seq_handle, buf,
  424. SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ,
  425. SND_SEQ_PORT_TYPE_MIDI_GENERIC);
  426. if (m->input_ports[i]->seq_port_nr < 0) {
  427. printError("Could not create seq port");
  428. m->input_ports[i]->stream_nr = -1;
  429. m->input_ports[i]->seq_port_nr = -1;
  430. } else {
  431. m->input_ports[i]->stream_nr = chn;
  432. m->input_ports[i]->seq_handle = m->seq_handle;
  433. if (snd_midi_event_new ( ALSA_SEQ_BUFF_SIZE, &(m->input_ports[i]->parser)) < 0) {
  434. printError("could not init parser for MIDI IN port %d", i);
  435. m->input_ports[i]->stream_nr = -1;
  436. m->input_ports[i]->seq_port_nr = -1;
  437. }
  438. }
  439. i++;
  440. }
  441. }
  442. // playback
  443. nchannels = ffado_streaming_get_nb_playback_streams(dev);
  444. m->nb_output_ports = 0;
  445. for (chn = 0; chn < nchannels; chn++) {
  446. if (ffado_streaming_get_playback_stream_type(dev, chn) == ffado_stream_type_midi) {
  447. m->nb_output_ports++;
  448. }
  449. }
  450. m->output_ports = calloc(m->nb_output_ports, sizeof(ffado_midi_port_t *));
  451. if (!m->output_ports) {
  452. printError("not enough memory to create midi structure");
  453. for (i = 0; i < m->nb_input_ports; i++) {
  454. free(m->input_ports[i]);
  455. }
  456. free(m->input_ports);
  457. free(m);
  458. return NULL;
  459. }
  460. i = 0;
  461. for (chn = 0; chn < nchannels; chn++) {
  462. if (ffado_streaming_get_playback_stream_type(dev, chn) == ffado_stream_type_midi) {
  463. m->output_ports[i] = calloc(1, sizeof(ffado_midi_port_t));
  464. if (!m->output_ports[i]) {
  465. // fixme
  466. printError("Could not allocate memory for seq port");
  467. continue;
  468. }
  469. ffado_streaming_get_playback_stream_name(dev, chn, buf, sizeof(buf) - 1);
  470. printMessage("Register MIDI OUT port %s", buf);
  471. m->output_ports[i]->seq_port_nr = snd_seq_create_simple_port(m->seq_handle, buf,
  472. SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE,
  473. SND_SEQ_PORT_TYPE_MIDI_GENERIC);
  474. if (m->output_ports[i]->seq_port_nr < 0) {
  475. printError("Could not create seq port");
  476. m->output_ports[i]->stream_nr = -1;
  477. m->output_ports[i]->seq_port_nr = -1;
  478. } else {
  479. m->output_ports[i]->stream_nr = chn;
  480. m->output_ports[i]->seq_handle = m->seq_handle;
  481. if (snd_midi_event_new ( ALSA_SEQ_BUFF_SIZE, &(m->output_ports[i]->parser)) < 0) {
  482. printError("could not init parser for MIDI OUT port %d", i);
  483. m->output_ports[i]->stream_nr = -1;
  484. m->output_ports[i]->seq_port_nr = -1;
  485. }
  486. }
  487. i++;
  488. }
  489. }
  490. m->dev = dev;
  491. m->driver = driver;
  492. return m;
  493. }
  494. int
  495. JackFFADODriver::ffado_driver_midi_start (ffado_driver_midi_handle_t *m)
  496. {
  497. assert(m);
  498. // start threads
  499. m->queue_thread_realtime = (m->driver->engine->control->real_time ? 1 : 0);
  500. m->queue_thread_priority =
  501. m->driver->engine->control->client_priority +
  502. FFADO_RT_PRIORITY_MIDI_RELATIVE;
  503. if (m->queue_thread_priority > 98) {
  504. m->queue_thread_priority = 98;
  505. }
  506. if (m->queue_thread_realtime) {
  507. printMessage("MIDI threads running with Realtime scheduling, priority %d",
  508. m->queue_thread_priority);
  509. } else {
  510. printMessage("MIDI threads running without Realtime scheduling");
  511. }
  512. if (jack_client_create_thread(NULL, &m->queue_thread, m->queue_thread_priority, m->queue_thread_realtime, ffado_driver_midi_queue_thread, (void *)m)) {
  513. printError(" cannot create midi queueing thread");
  514. return -1;
  515. }
  516. if (jack_client_create_thread(NULL, &m->dequeue_thread, m->queue_thread_priority, m->queue_thread_realtime, ffado_driver_midi_dequeue_thread, (void *)m)) {
  517. printError(" cannot create midi dequeueing thread");
  518. return -1;
  519. }
  520. return 0;
  521. }
  522. int
  523. JackFFADODriver::ffado_driver_midi_stop (ffado_driver_midi_handle_t *m)
  524. {
  525. assert(m);
  526. pthread_cancel (m->queue_thread);
  527. pthread_join (m->queue_thread, NULL);
  528. pthread_cancel (m->dequeue_thread);
  529. pthread_join (m->dequeue_thread, NULL);
  530. return 0;
  531. }
  532. void
  533. JackFFADODriver::ffado_driver_midi_finish (ffado_driver_midi_handle_t *m)
  534. {
  535. assert(m);
  536. int i;
  537. // TODO: add state info here, if not stopped then stop
  538. for (i = 0;i < m->nb_input_ports;i++) {
  539. free(m->input_ports[i]);
  540. }
  541. free(m->input_ports);
  542. for (i = 0;i < m->nb_output_ports;i++) {
  543. free(m->output_ports[i]);
  544. }
  545. free(m->output_ports);
  546. free(m);
  547. }
  548. #endif
  549. int JackFFADODriver::Attach()
  550. {
  551. JackPort* port;
  552. int port_index;
  553. unsigned long port_flags;
  554. char buf[JACK_PORT_NAME_SIZE];
  555. char portname[JACK_PORT_NAME_SIZE];
  556. ffado_driver_t* driver = (ffado_driver_t*)fDriver;
  557. JackLog("JackFFADODriver::Attach fBufferSize %ld fSampleRate %ld\n", fEngineControl->fBufferSize, fEngineControl->fSampleRate);
  558. g_verbose = (fEngineControl->fVerbose ? 1 : 0);
  559. /* packetizer thread options */
  560. driver->device_options.realtime = (fEngineControl->fRealTime ? 1 : 0);
  561. driver->device_options.packetizer_priority = fEngineControl->fPriority +
  562. FFADO_RT_PRIORITY_PACKETIZER_RELATIVE;
  563. if (driver->device_options.packetizer_priority > 98) {
  564. driver->device_options.packetizer_priority = 98;
  565. }
  566. // initialize the thread
  567. driver->dev = ffado_streaming_init(driver->device_info, driver->device_options);
  568. if (!driver->dev) {
  569. printError("FFADO: Error creating virtual device");
  570. return -1;
  571. }
  572. #ifdef FFADO_DRIVER_WITH_MIDI
  573. driver->midi_handle = ffado_driver_midi_init(driver);
  574. if (!driver->midi_handle) {
  575. printError("-----------------------------------------------------------");
  576. printError("Error creating midi device!");
  577. printError("FFADO will run without MIDI support.");
  578. printError("Consult the above error messages to solve the problem. ");
  579. printError("-----------------------------------------------------------\n\n");
  580. }
  581. #endif
  582. if (driver->device_options.realtime) {
  583. printMessage("Streaming thread running with Realtime scheduling, priority %d",
  584. driver->device_options.packetizer_priority);
  585. } else {
  586. printMessage("Streaming thread running without Realtime scheduling");
  587. }
  588. /* ports */
  589. // capture
  590. port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal;
  591. driver->capture_nchannels = ffado_streaming_get_nb_capture_streams(driver->dev);
  592. driver->capture_nchannels_audio = 0;
  593. for (unsigned int i = 0; i < driver->capture_nchannels; i++) {
  594. ffado_streaming_get_capture_stream_name(driver->dev, i, portname, sizeof(portname) - 1);
  595. snprintf(buf, sizeof(buf) - 1, "%s:%s", fClientControl->fName, portname);
  596. if (ffado_streaming_get_capture_stream_type(driver->dev, i) != ffado_stream_type_audio) {
  597. printMessage ("Don't register capture port %s", buf);
  598. } else {
  599. printMessage ("Registering capture port %s", buf);
  600. if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf,
  601. JACK_DEFAULT_AUDIO_TYPE,
  602. (JackPortFlags)port_flags)) == NO_PORT) {
  603. jack_error("driver: cannot register port for %s", buf);
  604. return -1;
  605. }
  606. ffado_streaming_set_capture_buffer_type(driver->dev, i, ffado_buffer_type_float);
  607. ffado_streaming_capture_stream_onoff(driver->dev, i, 0);
  608. port = fGraphManager->GetPort(port_index);
  609. port->SetLatency(driver->period_size + driver->capture_frame_latency);
  610. fCapturePortList[i] = port_index;
  611. JackLog("JackFFADODriver::Attach fCapturePortList[i] %ld \n", port_index);
  612. driver->capture_nchannels_audio++;
  613. }
  614. }
  615. // playback
  616. port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal;
  617. driver->playback_nchannels = ffado_streaming_get_nb_playback_streams(driver->dev);
  618. driver->playback_nchannels_audio = 0;
  619. for (unsigned int i = 0; i < driver->playback_nchannels; i++) {
  620. ffado_streaming_get_playback_stream_name(driver->dev, i, portname, sizeof(portname) - 1);
  621. snprintf(buf, sizeof(buf) - 1, "%s:%s", fClientControl->fName, portname);
  622. if (ffado_streaming_get_playback_stream_type(driver->dev, i) != ffado_stream_type_audio) {
  623. printMessage ("Don't register playback port %s", buf);
  624. } else {
  625. printMessage ("Registering playback port %s", buf);
  626. if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf,
  627. JACK_DEFAULT_AUDIO_TYPE,
  628. (JackPortFlags)port_flags)) == NO_PORT) {
  629. jack_error("driver: cannot register port for %s", buf);
  630. return -1;
  631. }
  632. ffado_streaming_set_playback_buffer_type(driver->dev, i, ffado_buffer_type_float);
  633. ffado_streaming_playback_stream_onoff(driver->dev, i, 0);
  634. port = fGraphManager->GetPort(port_index);
  635. port->SetLatency((driver->period_size * (driver->device_options.nb_buffers - 1)) + driver->playback_frame_latency);
  636. fPlaybackPortList[i] = port_index;
  637. JackLog("JackFFADODriver::Attach fPlaybackPortList[i] %ld \n", port_index);
  638. driver->playback_nchannels_audio++;
  639. }
  640. }
  641. fCaptureChannels = driver->capture_nchannels_audio;
  642. fPlaybackChannels = driver->playback_nchannels_audio;
  643. assert(fCaptureChannels < PORT_NUM);
  644. assert(fPlaybackChannels < PORT_NUM);
  645. if(ffado_streaming_prepare(driver->dev)) {
  646. printError("Could not prepare streaming device!");
  647. return -1;
  648. }
  649. // this makes no sense...
  650. assert(fCaptureChannels + fPlaybackChannels > 0);
  651. return 0;
  652. }
  653. int JackFFADODriver::Detach()
  654. {
  655. ffado_driver_t* driver = (ffado_driver_t*)fDriver;
  656. JackLog("JackFFADODriver::Detach\n");
  657. // finish the libfreebob streaming
  658. ffado_streaming_finish(driver->dev);
  659. driver->dev = NULL;
  660. #ifdef FFADO_DRIVER_WITH_MIDI
  661. if (driver->midi_handle) {
  662. ffado_driver_midi_finish(driver->midi_handle);
  663. }
  664. driver->midi_handle = NULL;
  665. #endif
  666. return JackAudioDriver::Detach(); // Generic JackAudioDriver Detach
  667. }
  668. int JackFFADODriver::Open(ffado_jack_settings_t *params)
  669. {
  670. // Generic JackAudioDriver Open
  671. if (JackAudioDriver::Open(
  672. params->period_size, params->sample_rate,
  673. params->playback_ports, params->playback_ports,
  674. 0, 0, 0, "", "",
  675. params->capture_frame_latency, params->playback_frame_latency) != 0) {
  676. return -1;
  677. }
  678. fDriver = (jack_driver_t *)ffado_driver_new ("ffado_pcm", params);
  679. if (fDriver) {
  680. // FFADO driver may have changed the in/out values
  681. fCaptureChannels = ((ffado_driver_t *)fDriver)->capture_nchannels_audio;
  682. fPlaybackChannels = ((ffado_driver_t *)fDriver)->playback_nchannels_audio;
  683. return 0;
  684. } else {
  685. return -1;
  686. }
  687. }
  688. int JackFFADODriver::Close()
  689. {
  690. JackAudioDriver::Close();
  691. ffado_driver_delete((ffado_driver_t*)fDriver);
  692. return 0;
  693. }
  694. int JackFFADODriver::Start()
  695. {
  696. return ffado_driver_start((ffado_driver_t *)fDriver);
  697. }
  698. int JackFFADODriver::Stop()
  699. {
  700. return ffado_driver_stop((ffado_driver_t *)fDriver);
  701. }
  702. int JackFFADODriver::Read()
  703. {
  704. printEnter();
  705. /* Taken from ffado_driver_run_cycle */
  706. ffado_driver_t* driver = (ffado_driver_t*)fDriver;
  707. int wait_status = 0;
  708. float delayed_usecs = 0.0;
  709. jack_nframes_t nframes = ffado_driver_wait (driver, -1, &wait_status,
  710. &delayed_usecs);
  711. if ((wait_status < 0)) {
  712. printError( "wait status < 0! (= %d)", wait_status);
  713. return -1;
  714. }
  715. if (nframes == 0) {
  716. /* we detected an xrun and restarted: notify
  717. * clients about the delay.
  718. */
  719. //engine->delay (engine, delayed_usecs);
  720. JackLog("FFADO XRun \n");
  721. //NotifyXRun(jack_get_microseconds());
  722. NotifyXRun(fLastWaitUst);
  723. //return 0;
  724. return -1;
  725. }
  726. //fLastWaitUst = GetMicroSeconds(); // Take callback date here
  727. if (nframes != fEngineControl->fBufferSize)
  728. JackLog("JackFFADODriver::Read nframes = %ld\n", nframes);
  729. //return engine->run_cycle (engine, nframes, delayed_usecs);
  730. fDelayedUst = (jack_time_t)delayed_usecs;
  731. printExit();
  732. return ffado_driver_read((ffado_driver_t *)fDriver, fEngineControl->fBufferSize);
  733. }
  734. int JackFFADODriver::Write()
  735. {
  736. printEnter();
  737. int res = ffado_driver_write((ffado_driver_t *)fDriver, fEngineControl->fBufferSize);
  738. printExit();
  739. return res;
  740. }
  741. void
  742. JackFFADODriver::jack_driver_init (jack_driver_t *driver)
  743. {
  744. memset (driver, 0, sizeof (*driver));
  745. driver->attach = 0;
  746. driver->detach = 0;
  747. driver->write = 0;
  748. driver->read = 0;
  749. driver->null_cycle = 0;
  750. driver->bufsize = 0;
  751. driver->start = 0;
  752. driver->stop = 0;
  753. }
  754. void
  755. JackFFADODriver::jack_driver_nt_init (jack_driver_nt_t * driver)
  756. {
  757. memset (driver, 0, sizeof (*driver));
  758. jack_driver_init ((jack_driver_t *) driver);
  759. driver->attach = 0;
  760. driver->detach = 0;
  761. driver->bufsize = 0;
  762. driver->stop = 0;
  763. driver->start = 0;
  764. driver->nt_bufsize = 0;
  765. driver->nt_start = 0;
  766. driver->nt_stop = 0;
  767. driver->nt_attach = 0;
  768. driver->nt_detach = 0;
  769. driver->nt_run_cycle = 0;
  770. }
  771. } // end of namespace
  772. #ifdef __cplusplus
  773. extern "C"
  774. {
  775. #endif
  776. const jack_driver_desc_t *
  777. driver_get_descriptor () {
  778. jack_driver_desc_t * desc;
  779. jack_driver_param_desc_t * params;
  780. unsigned int i;
  781. desc = (jack_driver_desc_t *)calloc (1, sizeof (jack_driver_desc_t));
  782. strcpy (desc->name, "firewire");
  783. desc->nparams = 12;
  784. params = (jack_driver_param_desc_t *)calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
  785. desc->params = params;
  786. i = 0;
  787. strcpy (params[i].name, "device");
  788. params[i].character = 'd';
  789. params[i].type = JackDriverParamString;
  790. strcpy (params[i].value.str, "hw:0");
  791. strcpy (params[i].short_desc, "The FireWire device to use. Format is: 'hw:port[,node]'.");
  792. strcpy (params[i].long_desc, params[i].short_desc);
  793. i++;
  794. strcpy (params[i].name, "period");
  795. params[i].character = 'p';
  796. params[i].type = JackDriverParamUInt;
  797. params[i].value.ui = 1024;
  798. strcpy (params[i].short_desc, "Frames per period");
  799. strcpy (params[i].long_desc, params[i].short_desc);
  800. i++;
  801. strcpy (params[i].name, "nperiods");
  802. params[i].character = 'n';
  803. params[i].type = JackDriverParamUInt;
  804. params[i].value.ui = 3;
  805. strcpy (params[i].short_desc, "Number of periods of playback latency");
  806. strcpy (params[i].long_desc, params[i].short_desc);
  807. i++;
  808. strcpy (params[i].name, "rate");
  809. params[i].character = 'r';
  810. params[i].type = JackDriverParamUInt;
  811. params[i].value.ui = 48000U;
  812. strcpy (params[i].short_desc, "Sample rate");
  813. strcpy (params[i].long_desc, params[i].short_desc);
  814. i++;
  815. strcpy (params[i].name, "capture");
  816. params[i].character = 'C';
  817. params[i].type = JackDriverParamBool;
  818. params[i].value.i = 0;
  819. strcpy (params[i].short_desc, "Provide capture ports.");
  820. strcpy (params[i].long_desc, params[i].short_desc);
  821. i++;
  822. strcpy (params[i].name, "playback");
  823. params[i].character = 'P';
  824. params[i].type = JackDriverParamBool;
  825. params[i].value.i = 0;
  826. strcpy (params[i].short_desc, "Provide playback ports.");
  827. strcpy (params[i].long_desc, params[i].short_desc);
  828. i++;
  829. strcpy (params[i].name, "duplex");
  830. params[i].character = 'D';
  831. params[i].type = JackDriverParamBool;
  832. params[i].value.i = 1;
  833. strcpy (params[i].short_desc, "Provide both capture and playback ports.");
  834. strcpy (params[i].long_desc, params[i].short_desc);
  835. i++;
  836. strcpy (params[i].name, "input-latency");
  837. params[i].character = 'I';
  838. params[i].type = JackDriverParamUInt;
  839. params[i].value.ui = 0;
  840. strcpy (params[i].short_desc, "Extra input latency (frames)");
  841. strcpy (params[i].long_desc, params[i].short_desc);
  842. i++;
  843. strcpy (params[i].name, "output-latency");
  844. params[i].character = 'O';
  845. params[i].type = JackDriverParamUInt;
  846. params[i].value.ui = 0;
  847. strcpy (params[i].short_desc, "Extra output latency (frames)");
  848. strcpy (params[i].long_desc, params[i].short_desc);
  849. i++;
  850. strcpy (params[i].name, "inchannels");
  851. params[i].character = 'i';
  852. params[i].type = JackDriverParamUInt;
  853. params[i].value.ui = 0;
  854. strcpy (params[i].short_desc, "Number of input channels to provide (note: currently ignored)");
  855. strcpy (params[i].long_desc, params[i].short_desc);
  856. i++;
  857. strcpy (params[i].name, "outchannels");
  858. params[i].character = 'o';
  859. params[i].type = JackDriverParamUInt;
  860. params[i].value.ui = 0;
  861. strcpy (params[i].short_desc, "Number of output channels to provide (note: currently ignored)");
  862. strcpy (params[i].long_desc, params[i].short_desc);
  863. i++;
  864. strcpy (params[i].name, "verbose");
  865. params[i].character = 'v';
  866. params[i].type = JackDriverParamUInt;
  867. params[i].value.ui = 3;
  868. strcpy (params[i].short_desc, "libffado verbose level");
  869. strcpy (params[i].long_desc, params[i].short_desc);
  870. return desc;
  871. }
  872. Jack::JackDriverClientInterface* driver_initialize(Jack::JackEngine* engine, Jack::JackSynchro** table, const JSList* params) {
  873. const JSList * node;
  874. const jack_driver_param_t * param;
  875. ffado_jack_settings_t cmlparams;
  876. char *device_name = "hw:0";
  877. cmlparams.period_size_set = 0;
  878. cmlparams.sample_rate_set = 0;
  879. cmlparams.buffer_size_set = 0;
  880. /* default values */
  881. cmlparams.period_size = 1024;
  882. cmlparams.sample_rate = 48000;
  883. cmlparams.buffer_size = 3;
  884. cmlparams.playback_ports = 0;
  885. cmlparams.capture_ports = 0;
  886. cmlparams.playback_frame_latency = 0;
  887. cmlparams.capture_frame_latency = 0;
  888. for (node = params; node; node = jack_slist_next (node)) {
  889. param = (jack_driver_param_t *) node->data;
  890. switch (param->character) {
  891. case 'd':
  892. device_name = strdup (param->value.str);
  893. break;
  894. case 'p':
  895. cmlparams.period_size = param->value.ui;
  896. cmlparams.period_size_set = 1;
  897. break;
  898. case 'n':
  899. cmlparams.buffer_size = param->value.ui;
  900. cmlparams.buffer_size_set = 1;
  901. break;
  902. case 'r':
  903. cmlparams.sample_rate = param->value.ui;
  904. cmlparams.sample_rate_set = 1;
  905. break;
  906. case 'C':
  907. cmlparams.capture_ports = 1;
  908. break;
  909. case 'P':
  910. cmlparams.playback_ports = 1;
  911. break;
  912. case 'D':
  913. cmlparams.capture_ports = 1;
  914. cmlparams.playback_ports = 1;
  915. break;
  916. case 'I':
  917. cmlparams.capture_frame_latency = param->value.ui;
  918. break;
  919. case 'O':
  920. cmlparams.playback_frame_latency = param->value.ui;
  921. break;
  922. // ignore these for now
  923. case 'i':
  924. break;
  925. case 'o':
  926. break;
  927. case 'v':
  928. cmlparams.verbose_level = param->value.ui;
  929. }
  930. }
  931. /* duplex is the default */
  932. if (!cmlparams.playback_ports && !cmlparams.capture_ports) {
  933. cmlparams.playback_ports = TRUE;
  934. cmlparams.capture_ports = TRUE;
  935. }
  936. Jack::JackFFADODriver* ffado_driver = new Jack::JackFFADODriver("firewire_pcm", engine, table);
  937. Jack::JackDriverClientInterface* threaded_driver = new Jack::JackThreadedDriver(ffado_driver);
  938. // Special open for FFADO driver...
  939. if (ffado_driver->Open(&cmlparams) == 0) {
  940. return threaded_driver;
  941. } else {
  942. delete threaded_driver; // Delete the decorated driver
  943. return NULL;
  944. }
  945. }
  946. #ifdef __cplusplus
  947. }
  948. #endif