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