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.

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