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.

1006 lines
37KB

  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. #if defined(HAVE_CONFIG_H)
  18. #include "config.h"
  19. #endif
  20. #include <iostream>
  21. #include <unistd.h>
  22. #include <math.h>
  23. #include <stdio.h>
  24. #include <memory.h>
  25. #include <unistd.h>
  26. #include <stdlib.h>
  27. #include <errno.h>
  28. #include <stdarg.h>
  29. #include <signal.h>
  30. #include <sys/types.h>
  31. #include <sys/time.h>
  32. #include <regex.h>
  33. #include <string.h>
  34. #include "JackFFADODriver.h"
  35. #include "JackEngineControl.h"
  36. #include "JackClientControl.h"
  37. #include "JackPort.h"
  38. #include "JackGraphManager.h"
  39. #include "JackExports.h"
  40. namespace Jack
  41. {
  42. #define FIREWIRE_REQUIRED_FFADO_API_VERSION 8
  43. #define jack_get_microseconds GetMicroSeconds
  44. #define SAMPLE_MAX_24BIT 8388608.0f
  45. #define SAMPLE_MAX_16BIT 32768.0f
  46. int
  47. JackFFADODriver::ffado_driver_read (ffado_driver_t * driver, jack_nframes_t nframes)
  48. {
  49. channel_t chn;
  50. jack_default_audio_sample_t* buf = NULL;
  51. printEnter();
  52. for (chn = 0; chn < driver->capture_nchannels; chn++) {
  53. // if nothing connected, don't process
  54. if (fGraphManager->GetConnectionsNum(fCapturePortList[chn]) == 0) {
  55. buf = (jack_default_audio_sample_t*)driver->scratchbuffer;
  56. // we always have to specify a valid buffer
  57. ffado_streaming_set_capture_stream_buffer(driver->dev, chn, (char *)(buf));
  58. // notify the streaming system that it can (but doesn't have to) skip
  59. // this channel
  60. ffado_streaming_capture_stream_onoff(driver->dev, chn, 0);
  61. } else {
  62. if (driver->capture_channels[chn].stream_type == ffado_stream_type_audio) {
  63. buf = (jack_default_audio_sample_t*)fGraphManager->GetBuffer(fCapturePortList[chn], nframes);
  64. /* if the returned buffer is invalid, use the dummy buffer */
  65. if (!buf) buf = (jack_default_audio_sample_t*)driver->scratchbuffer;
  66. ffado_streaming_set_capture_stream_buffer(driver->dev, chn, (char *)(buf));
  67. ffado_streaming_capture_stream_onoff(driver->dev, chn, 1);
  68. } else if (driver->capture_channels[chn].stream_type == ffado_stream_type_midi) {
  69. ffado_streaming_set_capture_stream_buffer(driver->dev, chn,
  70. (char *)(driver->capture_channels[chn].midi_buffer));
  71. ffado_streaming_capture_stream_onoff(driver->dev, chn, 1);
  72. } else { // always have a valid buffer
  73. ffado_streaming_set_capture_stream_buffer(driver->dev, chn, (char *)(driver->scratchbuffer));
  74. // don't process what we don't use
  75. ffado_streaming_capture_stream_onoff(driver->dev, chn, 0);
  76. }
  77. }
  78. }
  79. /* now transfer the buffers */
  80. ffado_streaming_transfer_capture_buffers(driver->dev);
  81. /* process the midi data */
  82. for (chn = 0; chn < driver->capture_nchannels; chn++) {
  83. if (driver->capture_channels[chn].stream_type == ffado_stream_type_midi) {
  84. jack_nframes_t i;
  85. int done;
  86. uint32_t *midi_buffer = driver->capture_channels[chn].midi_buffer;
  87. midi_unpack_t *midi_unpack = &driver->capture_channels[chn].midi_unpack;
  88. buf = (jack_default_audio_sample_t*)fGraphManager->GetBuffer(fCapturePortList[chn], nframes);
  89. jack_midi_clear_buffer(buf);
  90. /* if the returned buffer is invalid, discard the midi data */
  91. if (!buf) continue;
  92. /* else unpack
  93. note that libffado guarantees that midi bytes are on 8-byte aligned indexes
  94. */
  95. for (i = 0; i < nframes; i += 8) {
  96. if (midi_buffer[i] & 0xFF000000) {
  97. done = midi_unpack_buf(midi_unpack, (unsigned char *)(midi_buffer + i), 1, buf, i);
  98. if (done != 1) {
  99. printError("buffer overflow in channel %d\n", chn);
  100. break;
  101. }
  102. printMessage("MIDI IN: %08X (i=%d)", midi_buffer[i], i);
  103. }
  104. }
  105. }
  106. }
  107. printExit();
  108. return 0;
  109. }
  110. int
  111. JackFFADODriver::ffado_driver_write (ffado_driver_t * driver, jack_nframes_t nframes)
  112. {
  113. channel_t chn;
  114. jack_default_audio_sample_t* buf;
  115. printEnter();
  116. driver->process_count++;
  117. for (chn = 0; chn < driver->playback_nchannels; chn++) {
  118. if (fGraphManager->GetConnectionsNum(fPlaybackPortList[chn]) == 0) {
  119. buf = (jack_default_audio_sample_t*)driver->nullbuffer;
  120. // we always have to specify a valid buffer
  121. ffado_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(buf));
  122. // notify the streaming system that it can (but doesn't have to) skip
  123. // this channel
  124. ffado_streaming_playback_stream_onoff(driver->dev, chn, 0);
  125. } else {
  126. if (driver->playback_channels[chn].stream_type == ffado_stream_type_audio) {
  127. buf = (jack_default_audio_sample_t*)fGraphManager->GetBuffer(fPlaybackPortList[chn], nframes);
  128. /* use the silent buffer if there is no valid jack buffer */
  129. if (!buf) buf = (jack_default_audio_sample_t*)driver->nullbuffer;
  130. ffado_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(buf));
  131. } else if (driver->playback_channels[chn].stream_type == ffado_stream_type_midi) {
  132. jack_nframes_t nevents;
  133. jack_nframes_t i;
  134. midi_pack_t *midi_pack = &driver->playback_channels[chn].midi_pack;
  135. uint32_t *midi_buffer = driver->playback_channels[chn].midi_buffer;
  136. buf = (jack_default_audio_sample_t*)fGraphManager->GetBuffer(fPlaybackPortList[chn], nframes);
  137. jack_nframes_t min_next_pos = 0;
  138. memset(midi_buffer, 0, nframes * sizeof(uint32_t));
  139. ffado_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(midi_buffer));
  140. /* if the returned buffer is invalid, continue */
  141. if (!buf) {
  142. ffado_streaming_playback_stream_onoff(driver->dev, chn, 0);
  143. continue;
  144. }
  145. ffado_streaming_playback_stream_onoff(driver->dev, chn, 1);
  146. // check if we still have to process bytes from the previous period
  147. if (driver->playback_channels[chn].nb_overflow_bytes) {
  148. printMessage("have to process %d bytes from previous period", driver->playback_channels[chn].nb_overflow_bytes);
  149. }
  150. for (i = 0; i < driver->playback_channels[chn].nb_overflow_bytes; ++i) {
  151. midi_buffer[min_next_pos] = 0x01000000 | (driver->playback_channels[chn].overflow_buffer[i] & 0xFF);
  152. min_next_pos += 8;
  153. }
  154. driver->playback_channels[chn].nb_overflow_bytes = 0;
  155. // process the events in this period
  156. nevents = jack_midi_get_event_count(buf);
  157. //if (nevents)
  158. // printMessage("MIDI: %d events in ch %d", nevents, chn);
  159. for (i = 0; i < nevents; ++i) {
  160. size_t j;
  161. jack_midi_event_t event;
  162. jack_midi_event_get(&event, buf, i);
  163. midi_pack_event(midi_pack, &event);
  164. // floor the initial position to be a multiple of 8
  165. jack_nframes_t pos = event.time & 0xFFFFFFF8;
  166. for (j = 0; j < event.size; j++) {
  167. // make sure we don't overwrite a previous byte
  168. while (pos < min_next_pos && pos < nframes) {
  169. pos += 8;
  170. printMessage("have to correct pos to %d", pos);
  171. }
  172. if (pos >= nframes) {
  173. unsigned int f;
  174. printMessage("midi message crosses period boundary");
  175. driver->playback_channels[chn].nb_overflow_bytes = event.size - j;
  176. if (driver->playback_channels[chn].nb_overflow_bytes > MIDI_OVERFLOW_BUFFER_SIZE) {
  177. printError("too much midi bytes cross period boundary");
  178. driver->playback_channels[chn].nb_overflow_bytes = MIDI_OVERFLOW_BUFFER_SIZE;
  179. }
  180. // save the bytes that still have to be transmitted in the next period
  181. for (f = 0; f < driver->playback_channels[chn].nb_overflow_bytes; f++) {
  182. driver->playback_channels[chn].overflow_buffer[f] = event.buffer[j+f];
  183. }
  184. // exit since we can't transmit anything anymore.
  185. // the rate should be controlled
  186. if (i < nevents - 1) {
  187. printError("%d midi events lost due to period crossing", nevents - i - 1);
  188. }
  189. break;
  190. } else {
  191. midi_buffer[pos] = 0x01000000 | (event.buffer[j] & 0xFF);
  192. pos += 8;
  193. min_next_pos = pos;
  194. }
  195. }
  196. //printMessage("MIDI: sent %d-byte event at %ld", (int)event.size, (long)event.time);
  197. }
  198. } else { // always have a valid buffer
  199. ffado_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(driver->nullbuffer));
  200. ffado_streaming_playback_stream_onoff(driver->dev, chn, 0);
  201. }
  202. }
  203. }
  204. ffado_streaming_transfer_playback_buffers(driver->dev);
  205. printExit();
  206. return 0;
  207. }
  208. jack_nframes_t
  209. JackFFADODriver::ffado_driver_wait (ffado_driver_t *driver, int extra_fd, int *status,
  210. float *delayed_usecs)
  211. {
  212. jack_time_t wait_enter;
  213. jack_time_t wait_ret;
  214. ffado_wait_response response;
  215. printEnter();
  216. wait_enter = jack_get_microseconds ();
  217. if (wait_enter > driver->wait_next) {
  218. /*
  219. * This processing cycle was delayed past the
  220. * next due interrupt! Do not account this as
  221. * a wakeup delay:
  222. */
  223. driver->wait_next = 0;
  224. driver->wait_late++;
  225. }
  226. // *status = -2; interrupt
  227. // *status = -3; timeout
  228. // *status = -4; extra FD
  229. response = ffado_streaming_wait(driver->dev);
  230. wait_ret = jack_get_microseconds ();
  231. if (driver->wait_next && wait_ret > driver->wait_next) {
  232. *delayed_usecs = wait_ret - driver->wait_next;
  233. }
  234. driver->wait_last = wait_ret;
  235. driver->wait_next = wait_ret + driver->period_usecs;
  236. // driver->engine->transport_cycle_start (driver->engine, wait_ret);
  237. if(response == ffado_wait_ok) {
  238. // all good
  239. *status = 0;
  240. } else if (response == ffado_wait_xrun) {
  241. // xrun happened, but it's handled
  242. *status = 0;
  243. return 0;
  244. } else if (response == ffado_wait_error) {
  245. // an error happened (unhandled xrun)
  246. // this should be fatal
  247. *status = -1;
  248. return 0;
  249. } else if (response == ffado_wait_shutdown) {
  250. // ffado requested shutdown (e.g. device unplugged)
  251. // this should be fatal
  252. *status = -1;
  253. return 0;
  254. } else {
  255. // unknown response code. should be fatal
  256. // this should be fatal
  257. *status = -1;
  258. return 0;
  259. }
  260. fBeginDateUst = wait_ret;
  261. printExit();
  262. return driver->period_size;
  263. }
  264. int
  265. JackFFADODriver::ffado_driver_start (ffado_driver_t *driver)
  266. {
  267. int retval = 0;
  268. if ((retval = ffado_streaming_start(driver->dev))) {
  269. printError("Could not start streaming threads");
  270. return retval;
  271. }
  272. return 0;
  273. }
  274. int
  275. JackFFADODriver::ffado_driver_stop (ffado_driver_t *driver)
  276. {
  277. int retval = 0;
  278. if ((retval = ffado_streaming_stop(driver->dev))) {
  279. printError("Could not stop streaming threads");
  280. return retval;
  281. }
  282. return 0;
  283. }
  284. int
  285. JackFFADODriver::ffado_driver_restart (ffado_driver_t *driver)
  286. {
  287. if (Stop())
  288. return -1;
  289. return Start();
  290. }
  291. int
  292. JackFFADODriver::SetBufferSize (jack_nframes_t nframes)
  293. {
  294. printError("Buffer size change requested but not supported!!!");
  295. /*
  296. driver->period_size = nframes;
  297. driver->period_usecs =
  298. (jack_time_t) floor ((((float) nframes) / driver->sample_rate)
  299. * 1000000.0f);
  300. */
  301. /* tell the engine to change its buffer size */
  302. //driver->engine->set_buffer_size (driver->engine, nframes);
  303. return -1; // unsupported
  304. }
  305. typedef void (*JackDriverFinishFunction) (jack_driver_t *);
  306. ffado_driver_t *
  307. JackFFADODriver::ffado_driver_new (const char *name,
  308. ffado_jack_settings_t *params)
  309. {
  310. ffado_driver_t *driver;
  311. assert(params);
  312. if (ffado_get_api_version() != FIREWIRE_REQUIRED_FFADO_API_VERSION) {
  313. printError("Incompatible libffado version! (%s)", ffado_get_version());
  314. return NULL;
  315. }
  316. printMessage("Starting FFADO backend (%s)", ffado_get_version());
  317. driver = (ffado_driver_t*)calloc (1, sizeof (ffado_driver_t));
  318. /* Setup the jack interfaces */
  319. jack_driver_nt_init ((jack_driver_nt_t *) driver);
  320. /* driver->nt_attach = (JackDriverNTAttachFunction) ffado_driver_attach;
  321. driver->nt_detach = (JackDriverNTDetachFunction) ffado_driver_detach;
  322. driver->nt_start = (JackDriverNTStartFunction) ffado_driver_start;
  323. driver->nt_stop = (JackDriverNTStopFunction) ffado_driver_stop;
  324. driver->nt_run_cycle = (JackDriverNTRunCycleFunction) ffado_driver_run_cycle;
  325. driver->null_cycle = (JackDriverNullCycleFunction) ffado_driver_null_cycle;
  326. driver->write = (JackDriverReadFunction) ffado_driver_write;
  327. driver->read = (JackDriverReadFunction) ffado_driver_read;
  328. driver->nt_bufsize = (JackDriverNTBufSizeFunction) ffado_driver_bufsize;
  329. */
  330. /* copy command line parameter contents to the driver structure */
  331. memcpy(&driver->settings, params, sizeof(ffado_jack_settings_t));
  332. /* prepare all parameters */
  333. driver->sample_rate = params->sample_rate;
  334. driver->period_size = params->period_size;
  335. fBeginDateUst = 0;
  336. driver->period_usecs =
  337. (jack_time_t) floor ((((float) driver->period_size) * 1000000.0f) / driver->sample_rate);
  338. // driver->client = client;
  339. driver->engine = NULL;
  340. memset(&driver->device_options, 0, sizeof(driver->device_options));
  341. driver->device_options.sample_rate = params->sample_rate;
  342. driver->device_options.period_size = params->period_size;
  343. driver->device_options.nb_buffers = params->buffer_size;
  344. driver->device_options.verbose = params->verbose_level;
  345. driver->capture_frame_latency = params->capture_frame_latency;
  346. driver->playback_frame_latency = params->playback_frame_latency;
  347. debugPrint(DEBUG_LEVEL_STARTUP, " Driver compiled on %s %s", __DATE__, __TIME__);
  348. debugPrint(DEBUG_LEVEL_STARTUP, " Created driver %s", name);
  349. debugPrint(DEBUG_LEVEL_STARTUP, " period_size: %d", driver->device_options.period_size);
  350. debugPrint(DEBUG_LEVEL_STARTUP, " period_usecs: %d", driver->period_usecs);
  351. debugPrint(DEBUG_LEVEL_STARTUP, " sample rate: %d", driver->device_options.sample_rate);
  352. debugPrint(DEBUG_LEVEL_STARTUP, " verbose level: %d", driver->device_options.verbose);
  353. return (ffado_driver_t *) driver;
  354. }
  355. void
  356. JackFFADODriver::ffado_driver_delete (ffado_driver_t *driver)
  357. {
  358. free (driver);
  359. }
  360. int JackFFADODriver::Attach()
  361. {
  362. JackPort* port;
  363. int port_index;
  364. unsigned long port_flags;
  365. char buf[JACK_PORT_NAME_SIZE];
  366. char portname[JACK_PORT_NAME_SIZE];
  367. ffado_driver_t* driver = (ffado_driver_t*)fDriver;
  368. jack_log("JackFFADODriver::Attach fBufferSize %ld fSampleRate %ld", fEngineControl->fBufferSize, fEngineControl->fSampleRate);
  369. g_verbose = (fEngineControl->fVerbose ? 1 : 0);
  370. /* preallocate some buffers such that they don't have to be allocated
  371. in RT context (or from the stack)
  372. */
  373. /* the null buffer is a buffer that contains one period of silence */
  374. driver->nullbuffer = (ffado_sample_t *)calloc(driver->period_size, sizeof(ffado_sample_t));
  375. if (driver->nullbuffer == NULL) {
  376. printError("could not allocate memory for null buffer");
  377. return -1;
  378. }
  379. /* calloc should do this, but it can't hurt to be sure */
  380. memset(driver->nullbuffer, 0, driver->period_size*sizeof(ffado_sample_t));
  381. /* the scratch buffer is a buffer of one period that can be used as dummy memory */
  382. driver->scratchbuffer = (ffado_sample_t *)calloc(driver->period_size, sizeof(ffado_sample_t));
  383. if (driver->scratchbuffer == NULL) {
  384. printError("could not allocate memory for scratch buffer");
  385. return -1;
  386. }
  387. /* packetizer thread options */
  388. driver->device_options.realtime = (fEngineControl->fRealTime ? 1 : 0);
  389. driver->device_options.packetizer_priority = fEngineControl->fPriority +
  390. FFADO_RT_PRIORITY_PACKETIZER_RELATIVE;
  391. if (driver->device_options.packetizer_priority > 98) {
  392. driver->device_options.packetizer_priority = 98;
  393. }
  394. // initialize the thread
  395. driver->dev = ffado_streaming_init(driver->device_info, driver->device_options);
  396. if (!driver->dev) {
  397. printError("FFADO: Error creating virtual device");
  398. return -1;
  399. }
  400. if (driver->device_options.realtime) {
  401. printMessage("Streaming thread running with Realtime scheduling, priority %d",
  402. driver->device_options.packetizer_priority);
  403. } else {
  404. printMessage("Streaming thread running without Realtime scheduling");
  405. }
  406. ffado_streaming_set_audio_datatype(driver->dev, ffado_audio_datatype_float);
  407. /* ports */
  408. // capture
  409. port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal;
  410. driver->capture_nchannels = ffado_streaming_get_nb_capture_streams(driver->dev);
  411. driver->capture_channels = (ffado_capture_channel_t *)calloc(driver->capture_nchannels, sizeof(ffado_capture_channel_t));
  412. if (driver->capture_channels == NULL) {
  413. printError("could not allocate memory for capture channel list");
  414. return -1;
  415. }
  416. fCaptureChannels = 0;
  417. for (channel_t chn = 0; chn < driver->capture_nchannels; chn++) {
  418. ffado_streaming_get_capture_stream_name(driver->dev, chn, portname, sizeof(portname) - 1);
  419. driver->capture_channels[chn].stream_type = ffado_streaming_get_capture_stream_type(driver->dev, chn);
  420. if (driver->capture_channels[chn].stream_type == ffado_stream_type_audio) {
  421. snprintf(buf, sizeof(buf) - 1, "%s:AC%d_%s", fClientControl->fName, (int)chn, portname);
  422. printMessage ("Registering audio capture port %s", buf);
  423. if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf,
  424. JACK_DEFAULT_AUDIO_TYPE,
  425. (JackPortFlags)port_flags,
  426. fEngineControl->fBufferSize)) == NO_PORT) {
  427. jack_error("driver: cannot register port for %s", buf);
  428. return -1;
  429. }
  430. // setup port parameters
  431. if (ffado_streaming_set_capture_stream_buffer(driver->dev, chn, NULL)) {
  432. printError(" cannot configure initial port buffer for %s", buf);
  433. }
  434. ffado_streaming_capture_stream_onoff(driver->dev, chn, 0);
  435. port = fGraphManager->GetPort(port_index);
  436. port->SetLatency(driver->period_size + driver->capture_frame_latency);
  437. fCapturePortList[chn] = port_index;
  438. jack_log("JackFFADODriver::Attach fCapturePortList[i] %ld ", port_index);
  439. fCaptureChannels++;
  440. } else if (driver->capture_channels[chn].stream_type == ffado_stream_type_midi) {
  441. snprintf(buf, sizeof(buf) - 1, "%s:MC%d_%s", fClientControl->fName, (int)chn, portname);
  442. printMessage ("Registering midi capture port %s", buf);
  443. if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf,
  444. JACK_DEFAULT_MIDI_TYPE,
  445. (JackPortFlags)port_flags,
  446. fEngineControl->fBufferSize)) == NO_PORT) {
  447. jack_error("driver: cannot register port for %s", buf);
  448. return -1;
  449. }
  450. // setup port parameters
  451. if (ffado_streaming_set_capture_stream_buffer(driver->dev, chn, NULL)) {
  452. printError(" cannot configure initial port buffer for %s", buf);
  453. }
  454. if (ffado_streaming_capture_stream_onoff(driver->dev, chn, 0)) {
  455. printError(" cannot enable port %s", buf);
  456. }
  457. // setup midi unpacker
  458. midi_unpack_init(&driver->capture_channels[chn].midi_unpack);
  459. midi_unpack_reset(&driver->capture_channels[chn].midi_unpack);
  460. // setup the midi buffer
  461. driver->capture_channels[chn].midi_buffer = (uint32_t *)calloc(driver->period_size, sizeof(uint32_t));
  462. port = fGraphManager->GetPort(port_index);
  463. port->SetLatency(driver->period_size + driver->capture_frame_latency);
  464. fCapturePortList[chn] = port_index;
  465. jack_log("JackFFADODriver::Attach fCapturePortList[i] %ld ", port_index);
  466. fCaptureChannels++;
  467. } else {
  468. printMessage ("Don't register capture port %s", portname);
  469. }
  470. }
  471. // playback
  472. port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal;
  473. driver->playback_nchannels = ffado_streaming_get_nb_playback_streams(driver->dev);
  474. driver->playback_channels = (ffado_playback_channel_t *)calloc(driver->playback_nchannels, sizeof(ffado_playback_channel_t));
  475. if (driver->playback_channels == NULL) {
  476. printError("could not allocate memory for playback channel list");
  477. return -1;
  478. }
  479. fPlaybackChannels = 0;
  480. for (channel_t chn = 0; chn < driver->playback_nchannels; chn++) {
  481. ffado_streaming_get_playback_stream_name(driver->dev, chn, portname, sizeof(portname) - 1);
  482. driver->playback_channels[chn].stream_type = ffado_streaming_get_playback_stream_type(driver->dev, chn);
  483. if (driver->playback_channels[chn].stream_type == ffado_stream_type_audio) {
  484. snprintf(buf, sizeof(buf) - 1, "%s:AP%d_%s", fClientControl->fName, (int)chn, portname);
  485. printMessage ("Registering audio playback port %s", buf);
  486. if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf,
  487. JACK_DEFAULT_AUDIO_TYPE,
  488. (JackPortFlags)port_flags,
  489. fEngineControl->fBufferSize)) == NO_PORT) {
  490. jack_error("driver: cannot register port for %s", buf);
  491. return -1;
  492. }
  493. // setup port parameters
  494. if (ffado_streaming_set_playback_stream_buffer(driver->dev, chn, NULL)) {
  495. printError(" cannot configure initial port buffer for %s", buf);
  496. }
  497. if (ffado_streaming_playback_stream_onoff(driver->dev, chn, 0)) {
  498. printError(" cannot enable port %s", buf);
  499. }
  500. port = fGraphManager->GetPort(port_index);
  501. // Add one buffer more latency if "async" mode is used...
  502. port->SetLatency((driver->period_size * (driver->device_options.nb_buffers - 1)) + ((fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize) + driver->playback_frame_latency);
  503. fPlaybackPortList[chn] = port_index;
  504. jack_log("JackFFADODriver::Attach fPlaybackPortList[i] %ld ", port_index);
  505. fPlaybackChannels++;
  506. } else if (driver->playback_channels[chn].stream_type == ffado_stream_type_midi) {
  507. snprintf(buf, sizeof(buf) - 1, "%s:MP%d_%s", fClientControl->fName, (int)chn, portname);
  508. printMessage ("Registering midi playback port %s", buf);
  509. if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf,
  510. JACK_DEFAULT_MIDI_TYPE,
  511. (JackPortFlags)port_flags,
  512. fEngineControl->fBufferSize)) == NO_PORT) {
  513. jack_error("driver: cannot register port for %s", buf);
  514. return -1;
  515. }
  516. // setup port parameters
  517. if (ffado_streaming_set_playback_stream_buffer(driver->dev, chn, NULL)) {
  518. printError(" cannot configure initial port buffer for %s", buf);
  519. }
  520. if (ffado_streaming_playback_stream_onoff(driver->dev, chn, 0)) {
  521. printError(" cannot enable port %s", buf);
  522. }
  523. // setup midi packer
  524. midi_pack_reset(&driver->playback_channels[chn].midi_pack);
  525. // setup the midi buffer
  526. driver->playback_channels[chn].midi_buffer = (uint32_t *)calloc(driver->period_size, sizeof(uint32_t));
  527. port = fGraphManager->GetPort(port_index);
  528. port->SetLatency((driver->period_size * (driver->device_options.nb_buffers - 1)) + driver->playback_frame_latency);
  529. fPlaybackPortList[chn] = port_index;
  530. jack_log("JackFFADODriver::Attach fPlaybackPortList[i] %ld ", port_index);
  531. fPlaybackChannels++;
  532. } else {
  533. printMessage ("Don't register playback port %s", portname);
  534. }
  535. }
  536. assert(fCaptureChannels < PORT_NUM);
  537. assert(fPlaybackChannels < PORT_NUM);
  538. if (ffado_streaming_prepare(driver->dev)) {
  539. printError("Could not prepare streaming device!");
  540. return -1;
  541. }
  542. // this makes no sense...
  543. assert(fCaptureChannels + fPlaybackChannels > 0);
  544. return 0;
  545. }
  546. int JackFFADODriver::Detach()
  547. {
  548. channel_t chn;
  549. ffado_driver_t* driver = (ffado_driver_t*)fDriver;
  550. jack_log("JackFFADODriver::Detach");
  551. // finish the libfreebob streaming
  552. ffado_streaming_finish(driver->dev);
  553. driver->dev = NULL;
  554. // free all internal buffers
  555. for (chn = 0; chn < driver->capture_nchannels; chn++) {
  556. if (driver->capture_channels[chn].midi_buffer)
  557. free(driver->capture_channels[chn].midi_buffer);
  558. }
  559. free(driver->capture_channels);
  560. for (chn = 0; chn < driver->playback_nchannels; chn++) {
  561. if (driver->playback_channels[chn].midi_buffer)
  562. free(driver->playback_channels[chn].midi_buffer);
  563. }
  564. free(driver->playback_channels);
  565. free(driver->nullbuffer);
  566. free(driver->scratchbuffer);
  567. return JackAudioDriver::Detach(); // Generic JackAudioDriver Detach
  568. }
  569. int JackFFADODriver::Open(ffado_jack_settings_t *params)
  570. {
  571. // Generic JackAudioDriver Open
  572. if (JackAudioDriver::Open(
  573. params->period_size, params->sample_rate,
  574. params->playback_ports, params->playback_ports,
  575. 0, 0, 0, "", "",
  576. params->capture_frame_latency, params->playback_frame_latency) != 0) {
  577. return -1;
  578. }
  579. fDriver = (jack_driver_t *)ffado_driver_new ("ffado_pcm", params);
  580. if (fDriver) {
  581. // FFADO driver may have changed the in/out values
  582. //fCaptureChannels = ((ffado_driver_t *)fDriver)->capture_nchannels_audio;
  583. //fPlaybackChannels = ((ffado_driver_t *)fDriver)->playback_nchannels_audio;
  584. return 0;
  585. } else {
  586. return -1;
  587. }
  588. }
  589. int JackFFADODriver::Close()
  590. {
  591. JackAudioDriver::Close();
  592. ffado_driver_delete((ffado_driver_t*)fDriver);
  593. return 0;
  594. }
  595. int JackFFADODriver::Start()
  596. {
  597. return ffado_driver_start((ffado_driver_t *)fDriver);
  598. }
  599. int JackFFADODriver::Stop()
  600. {
  601. return ffado_driver_stop((ffado_driver_t *)fDriver);
  602. }
  603. int JackFFADODriver::Read()
  604. {
  605. printEnter();
  606. /* Taken from ffado_driver_run_cycle */
  607. ffado_driver_t* driver = (ffado_driver_t*)fDriver;
  608. int wait_status = 0;
  609. fDelayedUsecs = 0.f;
  610. jack_nframes_t nframes = ffado_driver_wait(driver, -1, &wait_status,
  611. &fDelayedUsecs);
  612. if ((wait_status < 0)) {
  613. printError( "wait status < 0! (= %d)", wait_status);
  614. return -1;
  615. }
  616. if (nframes == 0) {
  617. /* we detected an xrun and restarted: notify
  618. * clients about the delay.
  619. */
  620. jack_log("FFADO XRun");
  621. NotifyXRun(fBeginDateUst, fDelayedUsecs);
  622. return -1;
  623. }
  624. if (nframes != fEngineControl->fBufferSize)
  625. jack_log("JackFFADODriver::Read nframes = %ld", nframes);
  626. // Has to be done before read
  627. JackDriver::CycleIncTime();
  628. printExit();
  629. return ffado_driver_read((ffado_driver_t *)fDriver, fEngineControl->fBufferSize);
  630. }
  631. int JackFFADODriver::Write()
  632. {
  633. printEnter();
  634. int res = ffado_driver_write((ffado_driver_t *)fDriver, fEngineControl->fBufferSize);
  635. printExit();
  636. return res;
  637. }
  638. void
  639. JackFFADODriver::jack_driver_init (jack_driver_t *driver)
  640. {
  641. memset (driver, 0, sizeof (*driver));
  642. driver->attach = 0;
  643. driver->detach = 0;
  644. driver->write = 0;
  645. driver->read = 0;
  646. driver->null_cycle = 0;
  647. driver->bufsize = 0;
  648. driver->start = 0;
  649. driver->stop = 0;
  650. }
  651. void
  652. JackFFADODriver::jack_driver_nt_init (jack_driver_nt_t * driver)
  653. {
  654. memset (driver, 0, sizeof (*driver));
  655. jack_driver_init ((jack_driver_t *) driver);
  656. driver->attach = 0;
  657. driver->detach = 0;
  658. driver->bufsize = 0;
  659. driver->stop = 0;
  660. driver->start = 0;
  661. driver->nt_bufsize = 0;
  662. driver->nt_start = 0;
  663. driver->nt_stop = 0;
  664. driver->nt_attach = 0;
  665. driver->nt_detach = 0;
  666. driver->nt_run_cycle = 0;
  667. }
  668. } // end of namespace
  669. #ifdef __cplusplus
  670. extern "C"
  671. {
  672. #endif
  673. EXPORT const jack_driver_desc_t *
  674. driver_get_descriptor () {
  675. jack_driver_desc_t * desc;
  676. jack_driver_param_desc_t * params;
  677. unsigned int i;
  678. desc = (jack_driver_desc_t *)calloc (1, sizeof (jack_driver_desc_t));
  679. strcpy (desc->name, "firewire");
  680. desc->nparams = 11;
  681. params = (jack_driver_param_desc_t *)calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
  682. desc->params = params;
  683. i = 0;
  684. strcpy (params[i].name, "period");
  685. params[i].character = 'p';
  686. params[i].type = JackDriverParamUInt;
  687. params[i].value.ui = 1024;
  688. strcpy (params[i].short_desc, "Frames per period");
  689. strcpy (params[i].long_desc, params[i].short_desc);
  690. i++;
  691. strcpy (params[i].name, "nperiods");
  692. params[i].character = 'n';
  693. params[i].type = JackDriverParamUInt;
  694. params[i].value.ui = 3;
  695. strcpy (params[i].short_desc, "Number of periods of playback latency");
  696. strcpy (params[i].long_desc, params[i].short_desc);
  697. i++;
  698. strcpy (params[i].name, "rate");
  699. params[i].character = 'r';
  700. params[i].type = JackDriverParamUInt;
  701. params[i].value.ui = 48000U;
  702. strcpy (params[i].short_desc, "Sample rate");
  703. strcpy (params[i].long_desc, params[i].short_desc);
  704. i++;
  705. strcpy (params[i].name, "capture");
  706. params[i].character = 'C';
  707. params[i].type = JackDriverParamBool;
  708. params[i].value.i = 0;
  709. strcpy (params[i].short_desc, "Provide capture ports.");
  710. strcpy (params[i].long_desc, params[i].short_desc);
  711. i++;
  712. strcpy (params[i].name, "playback");
  713. params[i].character = 'P';
  714. params[i].type = JackDriverParamBool;
  715. params[i].value.i = 0;
  716. strcpy (params[i].short_desc, "Provide playback ports.");
  717. strcpy (params[i].long_desc, params[i].short_desc);
  718. i++;
  719. strcpy (params[i].name, "duplex");
  720. params[i].character = 'D';
  721. params[i].type = JackDriverParamBool;
  722. params[i].value.i = 1;
  723. strcpy (params[i].short_desc, "Provide both capture and playback ports.");
  724. strcpy (params[i].long_desc, params[i].short_desc);
  725. i++;
  726. strcpy (params[i].name, "input-latency");
  727. params[i].character = 'I';
  728. params[i].type = JackDriverParamUInt;
  729. params[i].value.ui = 0;
  730. strcpy (params[i].short_desc, "Extra input latency (frames)");
  731. strcpy (params[i].long_desc, params[i].short_desc);
  732. i++;
  733. strcpy (params[i].name, "output-latency");
  734. params[i].character = 'O';
  735. params[i].type = JackDriverParamUInt;
  736. params[i].value.ui = 0;
  737. strcpy (params[i].short_desc, "Extra output latency (frames)");
  738. strcpy (params[i].long_desc, params[i].short_desc);
  739. i++;
  740. strcpy (params[i].name, "inchannels");
  741. params[i].character = 'i';
  742. params[i].type = JackDriverParamUInt;
  743. params[i].value.ui = 0;
  744. strcpy (params[i].short_desc, "Number of input channels to provide (note: currently ignored)");
  745. strcpy (params[i].long_desc, params[i].short_desc);
  746. i++;
  747. strcpy (params[i].name, "outchannels");
  748. params[i].character = 'o';
  749. params[i].type = JackDriverParamUInt;
  750. params[i].value.ui = 0;
  751. strcpy (params[i].short_desc, "Number of output channels to provide (note: currently ignored)");
  752. strcpy (params[i].long_desc, params[i].short_desc);
  753. i++;
  754. strcpy (params[i].name, "verbose");
  755. params[i].character = 'v';
  756. params[i].type = JackDriverParamUInt;
  757. params[i].value.ui = 3;
  758. strcpy (params[i].short_desc, "libffado verbose level");
  759. strcpy (params[i].long_desc, params[i].short_desc);
  760. return desc;
  761. }
  762. EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLockedEngine* engine, Jack::JackSynchro* table, const JSList* params) {
  763. const JSList * node;
  764. const jack_driver_param_t * param;
  765. ffado_jack_settings_t cmlparams;
  766. cmlparams.period_size_set = 0;
  767. cmlparams.sample_rate_set = 0;
  768. cmlparams.buffer_size_set = 0;
  769. /* default values */
  770. cmlparams.period_size = 1024;
  771. cmlparams.sample_rate = 48000;
  772. cmlparams.buffer_size = 3;
  773. cmlparams.playback_ports = 0;
  774. cmlparams.capture_ports = 0;
  775. cmlparams.playback_frame_latency = 0;
  776. cmlparams.capture_frame_latency = 0;
  777. cmlparams.verbose_level = 0;
  778. cmlparams.slave_mode = 0;
  779. cmlparams.snoop_mode = 0;
  780. cmlparams.device_info = NULL;
  781. for (node = params; node; node = jack_slist_next (node)) {
  782. param = (jack_driver_param_t *) node->data;
  783. switch (param->character) {
  784. case 'p':
  785. cmlparams.period_size = param->value.ui;
  786. cmlparams.period_size_set = 1;
  787. break;
  788. case 'n':
  789. cmlparams.buffer_size = param->value.ui;
  790. cmlparams.buffer_size_set = 1;
  791. break;
  792. case 'r':
  793. cmlparams.sample_rate = param->value.ui;
  794. cmlparams.sample_rate_set = 1;
  795. break;
  796. case 'C':
  797. cmlparams.capture_ports = 1;
  798. break;
  799. case 'P':
  800. cmlparams.playback_ports = 1;
  801. break;
  802. case 'D':
  803. cmlparams.capture_ports = 1;
  804. cmlparams.playback_ports = 1;
  805. break;
  806. case 'I':
  807. cmlparams.capture_frame_latency = param->value.ui;
  808. break;
  809. case 'O':
  810. cmlparams.playback_frame_latency = param->value.ui;
  811. break;
  812. // ignore these for now
  813. case 'i':
  814. break;
  815. case 'o':
  816. break;
  817. case 'v':
  818. cmlparams.verbose_level = param->value.ui;
  819. }
  820. }
  821. /* duplex is the default */
  822. if (!cmlparams.playback_ports && !cmlparams.capture_ports) {
  823. cmlparams.playback_ports = TRUE;
  824. cmlparams.capture_ports = TRUE;
  825. }
  826. Jack::JackFFADODriver* ffado_driver = new Jack::JackFFADODriver("system", "firewire_pcm", engine, table);
  827. Jack::JackDriverClientInterface* threaded_driver = new Jack::JackThreadedDriver(ffado_driver);
  828. // Special open for FFADO driver...
  829. if (ffado_driver->Open(&cmlparams) == 0) {
  830. return threaded_driver;
  831. } else {
  832. delete threaded_driver; // Delete the decorated driver
  833. return NULL;
  834. }
  835. }
  836. #ifdef __cplusplus
  837. }
  838. #endif