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.

924 lines
35KB

  1. /*
  2. Copyright (C) 2001 Paul Davis
  3. Copyright (C) 2004 Grame
  4. Copyright (C) 2007 Pieter Palmers
  5. Copyright (C) 2009 Devin Anderson
  6. This program is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2 of the License, or
  9. (at your option) any later version.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with this program; if not, write to the Free Software
  16. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. */
  18. #include <iostream>
  19. #include <unistd.h>
  20. #include <math.h>
  21. #include <stdio.h>
  22. #include <memory.h>
  23. #include <unistd.h>
  24. #include <stdlib.h>
  25. #include <errno.h>
  26. #include <stdarg.h>
  27. #include <signal.h>
  28. #include <sys/types.h>
  29. #include <sys/time.h>
  30. #include <regex.h>
  31. #include <string.h>
  32. #include "JackFFADODriver.h"
  33. #include "JackFFADOMidiInputPort.h"
  34. #include "JackFFADOMidiOutputPort.h"
  35. #include "JackEngineControl.h"
  36. #include "JackClientControl.h"
  37. #include "JackPort.h"
  38. #include "JackGraphManager.h"
  39. #include "JackCompilerDeps.h"
  40. #include "JackLockedEngine.h"
  41. namespace Jack
  42. {
  43. #define FIREWIRE_REQUIRED_FFADO_API_VERSION 8
  44. #define jack_get_microseconds GetMicroSeconds
  45. int
  46. JackFFADODriver::ffado_driver_read (ffado_driver_t * driver, jack_nframes_t nframes)
  47. {
  48. channel_t chn;
  49. jack_default_audio_sample_t* buf = NULL;
  50. printEnter();
  51. for (chn = 0; chn < driver->capture_nchannels; chn++) {
  52. // if nothing connected, don't process
  53. if (fGraphManager->GetConnectionsNum(fCapturePortList[chn]) == 0) {
  54. buf = (jack_default_audio_sample_t*)driver->scratchbuffer;
  55. // we always have to specify a valid buffer
  56. ffado_streaming_set_capture_stream_buffer(driver->dev, chn, (char *)(buf));
  57. // notify the streaming system that it can (but doesn't have to) skip
  58. // this channel
  59. ffado_streaming_capture_stream_onoff(driver->dev, chn, 0);
  60. } else {
  61. if (driver->capture_channels[chn].stream_type == ffado_stream_type_audio) {
  62. buf = (jack_default_audio_sample_t*)fGraphManager->GetBuffer(fCapturePortList[chn], nframes);
  63. /* if the returned buffer is invalid, use the dummy buffer */
  64. if (!buf) buf = (jack_default_audio_sample_t*)driver->scratchbuffer;
  65. ffado_streaming_set_capture_stream_buffer(driver->dev, chn, (char *)(buf));
  66. ffado_streaming_capture_stream_onoff(driver->dev, chn, 1);
  67. } else if (driver->capture_channels[chn].stream_type == ffado_stream_type_midi) {
  68. ffado_streaming_set_capture_stream_buffer(driver->dev, chn,
  69. (char *)(driver->capture_channels[chn].midi_buffer));
  70. ffado_streaming_capture_stream_onoff(driver->dev, chn, 1);
  71. } else { // always have a valid buffer
  72. ffado_streaming_set_capture_stream_buffer(driver->dev, chn, (char *)(driver->scratchbuffer));
  73. // don't process what we don't use
  74. ffado_streaming_capture_stream_onoff(driver->dev, chn, 0);
  75. }
  76. }
  77. }
  78. /* now transfer the buffers */
  79. ffado_streaming_transfer_capture_buffers(driver->dev);
  80. /* process the midi data */
  81. for (chn = 0; chn < driver->capture_nchannels; chn++) {
  82. if (driver->capture_channels[chn].stream_type == ffado_stream_type_midi) {
  83. JackFFADOMidiInputPort *midi_input = (JackFFADOMidiInputPort *) driver->capture_channels[chn].midi_input;
  84. JackMidiBuffer *buffer = (JackMidiBuffer *) fGraphManager->GetBuffer(fCapturePortList[chn], nframes);
  85. midi_input->Process(buffer, driver->capture_channels[chn].midi_buffer, nframes);
  86. }
  87. }
  88. printExit();
  89. return 0;
  90. }
  91. int
  92. JackFFADODriver::ffado_driver_write (ffado_driver_t * driver, jack_nframes_t nframes)
  93. {
  94. channel_t chn;
  95. jack_default_audio_sample_t* buf;
  96. printEnter();
  97. driver->process_count++;
  98. for (chn = 0; chn < driver->playback_nchannels; chn++) {
  99. if (fGraphManager->GetConnectionsNum(fPlaybackPortList[chn]) == 0) {
  100. buf = (jack_default_audio_sample_t*)driver->nullbuffer;
  101. // we always have to specify a valid buffer
  102. ffado_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(buf));
  103. // notify the streaming system that it can (but doesn't have to) skip
  104. // this channel
  105. ffado_streaming_playback_stream_onoff(driver->dev, chn, 0);
  106. } else {
  107. if (driver->playback_channels[chn].stream_type == ffado_stream_type_audio) {
  108. buf = (jack_default_audio_sample_t*)fGraphManager->GetBuffer(fPlaybackPortList[chn], nframes);
  109. /* use the silent buffer if there is no valid jack buffer */
  110. if (!buf) buf = (jack_default_audio_sample_t*)driver->nullbuffer;
  111. ffado_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(buf));
  112. ffado_streaming_playback_stream_onoff(driver->dev, chn, 1);
  113. } else if (driver->playback_channels[chn].stream_type == ffado_stream_type_midi) {
  114. uint32_t *midi_buffer = driver->playback_channels[chn].midi_buffer;
  115. memset(midi_buffer, 0, nframes * sizeof(uint32_t));
  116. buf = (jack_default_audio_sample_t *) fGraphManager->GetBuffer(fPlaybackPortList[chn], nframes);
  117. ffado_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(midi_buffer));
  118. ffado_streaming_playback_stream_onoff(driver->dev, chn, buf ? 1 : 0);
  119. JackFFADOMidiOutputPort *midi_output = (JackFFADOMidiOutputPort *) driver->playback_channels[chn].midi_output;
  120. midi_output->Process((JackMidiBuffer *) buf, midi_buffer, nframes);
  121. } else { // always have a valid buffer
  122. ffado_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(driver->nullbuffer));
  123. ffado_streaming_playback_stream_onoff(driver->dev, chn, 0);
  124. }
  125. }
  126. }
  127. ffado_streaming_transfer_playback_buffers(driver->dev);
  128. printExit();
  129. return 0;
  130. }
  131. jack_nframes_t
  132. JackFFADODriver::ffado_driver_wait (ffado_driver_t *driver, int extra_fd, int *status,
  133. float *delayed_usecs)
  134. {
  135. jack_time_t wait_enter;
  136. jack_time_t wait_ret;
  137. ffado_wait_response response;
  138. printEnter();
  139. wait_enter = jack_get_microseconds ();
  140. if (wait_enter > driver->wait_next) {
  141. /*
  142. * This processing cycle was delayed past the
  143. * next due interrupt! Do not account this as
  144. * a wakeup delay:
  145. */
  146. driver->wait_next = 0;
  147. driver->wait_late++;
  148. }
  149. // *status = -2; interrupt
  150. // *status = -3; timeout
  151. // *status = -4; extra FD
  152. response = ffado_streaming_wait(driver->dev);
  153. wait_ret = jack_get_microseconds ();
  154. if (driver->wait_next && wait_ret > driver->wait_next) {
  155. *delayed_usecs = wait_ret - driver->wait_next;
  156. }
  157. driver->wait_last = wait_ret;
  158. driver->wait_next = wait_ret + driver->period_usecs;
  159. // driver->engine->transport_cycle_start (driver->engine, wait_ret);
  160. if(response == ffado_wait_ok) {
  161. // all good
  162. *status = 0;
  163. } else if (response == ffado_wait_xrun) {
  164. // xrun happened, but it's handled
  165. *status = 0;
  166. return 0;
  167. } else if (response == ffado_wait_error) {
  168. // an error happened (unhandled xrun)
  169. // this should be fatal
  170. jack_error("JackFFADODriver::ffado_driver_wait - unhandled xrun");
  171. *status = -1;
  172. return 0;
  173. } else if (response == ffado_wait_shutdown) {
  174. // ffado requested shutdown (e.g. device unplugged)
  175. // this should be fatal
  176. jack_error("JackFFADODriver::ffado_driver_wait - shutdown requested "
  177. "(device unplugged?)");
  178. *status = -1;
  179. return 0;
  180. } else {
  181. // unknown response code. should be fatal
  182. // this should be fatal
  183. jack_error("JackFFADODriver::ffado_driver_wait - unexpected error "
  184. "code '%d' returned from 'ffado_streaming_wait'", response);
  185. *status = -1;
  186. return 0;
  187. }
  188. fBeginDateUst = wait_ret;
  189. printExit();
  190. return driver->period_size;
  191. }
  192. int
  193. JackFFADODriver::ffado_driver_start (ffado_driver_t *driver)
  194. {
  195. int retval = 0;
  196. if ((retval = ffado_streaming_start(driver->dev))) {
  197. printError("Could not start streaming threads");
  198. return retval;
  199. }
  200. return 0;
  201. }
  202. int
  203. JackFFADODriver::ffado_driver_stop (ffado_driver_t *driver)
  204. {
  205. int retval = 0;
  206. if ((retval = ffado_streaming_stop(driver->dev))) {
  207. printError("Could not stop streaming threads");
  208. return retval;
  209. }
  210. return 0;
  211. }
  212. int
  213. JackFFADODriver::ffado_driver_restart (ffado_driver_t *driver)
  214. {
  215. if (Stop())
  216. return -1;
  217. return Start();
  218. }
  219. void
  220. JackFFADODriver::UpdateLatencies(void)
  221. {
  222. jack_latency_range_t range;
  223. ffado_driver_t* driver = (ffado_driver_t*)fDriver;
  224. for (int i = 0; i < fCaptureChannels; i++) {
  225. range.min = range.max = driver->period_size + driver->capture_frame_latency;
  226. fGraphManager->GetPort(fCapturePortList[i])->SetLatencyRange(JackCaptureLatency, &range);
  227. }
  228. for (int i = 0; i < fPlaybackChannels; i++) {
  229. // Add one buffer more latency if "async" mode is used...
  230. range.min = range.max = (driver->period_size *
  231. (driver->device_options.nb_buffers - 1)) +
  232. ((fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize) + driver->playback_frame_latency;
  233. fGraphManager->GetPort(fPlaybackPortList[i])->SetLatencyRange(JackPlaybackLatency, &range);
  234. // Monitor port
  235. if (fWithMonitorPorts) {
  236. range.min = range.max =driver->period_size;
  237. fGraphManager->GetPort(fMonitorPortList[i])->SetLatencyRange(JackCaptureLatency, &range);
  238. }
  239. }
  240. }
  241. int
  242. JackFFADODriver::SetBufferSize (jack_nframes_t nframes)
  243. {
  244. printError("Buffer size change requested but not supported!!!");
  245. /*
  246. driver->period_size = nframes;
  247. driver->period_usecs =
  248. (jack_time_t) floor ((((float) nframes) / driver->sample_rate)
  249. * 1000000.0f);
  250. */
  251. /* tell the engine to change its buffer size */
  252. //driver->engine->set_buffer_size (driver->engine, nframes);
  253. return -1; // unsupported
  254. }
  255. typedef void (*JackDriverFinishFunction) (jack_driver_t *);
  256. ffado_driver_t *
  257. JackFFADODriver::ffado_driver_new (const char *name,
  258. ffado_jack_settings_t *params)
  259. {
  260. ffado_driver_t *driver;
  261. assert(params);
  262. if (ffado_get_api_version() != FIREWIRE_REQUIRED_FFADO_API_VERSION) {
  263. printError("Incompatible libffado version! (%s)", ffado_get_version());
  264. return NULL;
  265. }
  266. printMessage("Starting FFADO backend (%s)", ffado_get_version());
  267. driver = (ffado_driver_t*)calloc (1, sizeof (ffado_driver_t));
  268. /* Setup the jack interfaces */
  269. jack_driver_nt_init ((jack_driver_nt_t *) driver);
  270. /* driver->nt_attach = (JackDriverNTAttachFunction) ffado_driver_attach;
  271. driver->nt_detach = (JackDriverNTDetachFunction) ffado_driver_detach;
  272. driver->nt_start = (JackDriverNTStartFunction) ffado_driver_start;
  273. driver->nt_stop = (JackDriverNTStopFunction) ffado_driver_stop;
  274. driver->nt_run_cycle = (JackDriverNTRunCycleFunction) ffado_driver_run_cycle;
  275. driver->null_cycle = (JackDriverNullCycleFunction) ffado_driver_null_cycle;
  276. driver->write = (JackDriverReadFunction) ffado_driver_write;
  277. driver->read = (JackDriverReadFunction) ffado_driver_read;
  278. driver->nt_bufsize = (JackDriverNTBufSizeFunction) ffado_driver_bufsize;
  279. */
  280. /* copy command line parameter contents to the driver structure */
  281. memcpy(&driver->settings, params, sizeof(ffado_jack_settings_t));
  282. /* prepare all parameters */
  283. driver->sample_rate = params->sample_rate;
  284. driver->period_size = params->period_size;
  285. fBeginDateUst = 0;
  286. driver->period_usecs =
  287. (jack_time_t) floor ((((float) driver->period_size) * 1000000.0f) / driver->sample_rate);
  288. // driver->client = client;
  289. driver->engine = NULL;
  290. memset(&driver->device_options, 0, sizeof(driver->device_options));
  291. driver->device_options.sample_rate = params->sample_rate;
  292. driver->device_options.period_size = params->period_size;
  293. driver->device_options.nb_buffers = params->buffer_size;
  294. driver->device_options.verbose = params->verbose_level;
  295. driver->capture_frame_latency = params->capture_frame_latency;
  296. driver->playback_frame_latency = params->playback_frame_latency;
  297. driver->device_options.snoop_mode = params->snoop_mode;
  298. debugPrint(DEBUG_LEVEL_STARTUP, " Driver compiled on %s %s", __DATE__, __TIME__);
  299. debugPrint(DEBUG_LEVEL_STARTUP, " Created driver %s", name);
  300. debugPrint(DEBUG_LEVEL_STARTUP, " period_size: %d", driver->device_options.period_size);
  301. debugPrint(DEBUG_LEVEL_STARTUP, " period_usecs: %d", driver->period_usecs);
  302. debugPrint(DEBUG_LEVEL_STARTUP, " sample rate: %d", driver->device_options.sample_rate);
  303. debugPrint(DEBUG_LEVEL_STARTUP, " verbose level: %d", driver->device_options.verbose);
  304. return (ffado_driver_t *) driver;
  305. }
  306. void
  307. JackFFADODriver::ffado_driver_delete (ffado_driver_t *driver)
  308. {
  309. free (driver);
  310. }
  311. int JackFFADODriver::Attach()
  312. {
  313. JackPort* port;
  314. jack_port_id_t port_index;
  315. char buf[REAL_JACK_PORT_NAME_SIZE];
  316. char portname[REAL_JACK_PORT_NAME_SIZE];
  317. jack_latency_range_t range;
  318. ffado_driver_t* driver = (ffado_driver_t*)fDriver;
  319. jack_log("JackFFADODriver::Attach fBufferSize %ld fSampleRate %ld", fEngineControl->fBufferSize, fEngineControl->fSampleRate);
  320. g_verbose = (fEngineControl->fVerbose ? 1 : 0);
  321. /* preallocate some buffers such that they don't have to be allocated
  322. in RT context (or from the stack)
  323. */
  324. /* the null buffer is a buffer that contains one period of silence */
  325. driver->nullbuffer = (ffado_sample_t *)calloc(driver->period_size, sizeof(ffado_sample_t));
  326. if (driver->nullbuffer == NULL) {
  327. printError("could not allocate memory for null buffer");
  328. return -1;
  329. }
  330. /* calloc should do this, but it can't hurt to be sure */
  331. memset(driver->nullbuffer, 0, driver->period_size*sizeof(ffado_sample_t));
  332. /* the scratch buffer is a buffer of one period that can be used as dummy memory */
  333. driver->scratchbuffer = (ffado_sample_t *)calloc(driver->period_size, sizeof(ffado_sample_t));
  334. if (driver->scratchbuffer == NULL) {
  335. printError("could not allocate memory for scratch buffer");
  336. return -1;
  337. }
  338. /* packetizer thread options */
  339. driver->device_options.realtime = (fEngineControl->fRealTime ? 1 : 0);
  340. driver->device_options.packetizer_priority = fEngineControl->fServerPriority +
  341. FFADO_RT_PRIORITY_PACKETIZER_RELATIVE;
  342. if (driver->device_options.packetizer_priority > 98) {
  343. driver->device_options.packetizer_priority = 98;
  344. }
  345. // initialize the thread
  346. driver->dev = ffado_streaming_init(driver->device_info, driver->device_options);
  347. if (!driver->dev) {
  348. printError("FFADO: Error creating virtual device");
  349. return -1;
  350. }
  351. if (driver->device_options.realtime) {
  352. printMessage("Streaming thread running with Realtime scheduling, priority %d",
  353. driver->device_options.packetizer_priority);
  354. } else {
  355. printMessage("Streaming thread running without Realtime scheduling");
  356. }
  357. ffado_streaming_set_audio_datatype(driver->dev, ffado_audio_datatype_float);
  358. /* ports */
  359. // capture
  360. driver->capture_nchannels = ffado_streaming_get_nb_capture_streams(driver->dev);
  361. driver->capture_channels = (ffado_capture_channel_t *)calloc(driver->capture_nchannels, sizeof(ffado_capture_channel_t));
  362. if (driver->capture_channels == NULL) {
  363. printError("could not allocate memory for capture channel list");
  364. return -1;
  365. }
  366. fCaptureChannels = 0;
  367. for (channel_t chn = 0; chn < driver->capture_nchannels; chn++) {
  368. ffado_streaming_get_capture_stream_name(driver->dev, chn, portname, sizeof(portname));
  369. driver->capture_channels[chn].stream_type = ffado_streaming_get_capture_stream_type(driver->dev, chn);
  370. if (driver->capture_channels[chn].stream_type == ffado_stream_type_audio) {
  371. snprintf(buf, sizeof(buf), "firewire_pcm:%s_in", portname);
  372. printMessage ("Registering audio capture port %s", buf);
  373. if (fEngine->PortRegister(fClientControl.fRefNum, buf,
  374. JACK_DEFAULT_AUDIO_TYPE,
  375. CaptureDriverFlags,
  376. fEngineControl->fBufferSize, &port_index) < 0) {
  377. jack_error("driver: cannot register port for %s", buf);
  378. return -1;
  379. }
  380. // setup port parameters
  381. if (ffado_streaming_set_capture_stream_buffer(driver->dev, chn, NULL)) {
  382. printError(" cannot configure initial port buffer for %s", buf);
  383. }
  384. ffado_streaming_capture_stream_onoff(driver->dev, chn, 0);
  385. port = fGraphManager->GetPort(port_index);
  386. range.min = range.max = driver->period_size + driver->capture_frame_latency;
  387. port->SetLatencyRange(JackCaptureLatency, &range);
  388. // capture port aliases (jackd1 style port names)
  389. snprintf(buf, sizeof(buf), "%s:capture_%i", fClientControl.fName, (int) chn + 1);
  390. port->SetAlias(buf);
  391. fCapturePortList[chn] = port_index;
  392. jack_log("JackFFADODriver::Attach fCapturePortList[i] %ld ", port_index);
  393. fCaptureChannels++;
  394. } else if (driver->capture_channels[chn].stream_type == ffado_stream_type_midi) {
  395. snprintf(buf, sizeof(buf), "firewire_pcm:%s_in", portname);
  396. printMessage ("Registering midi capture port %s", buf);
  397. if (fEngine->PortRegister(fClientControl.fRefNum, buf,
  398. JACK_DEFAULT_MIDI_TYPE,
  399. CaptureDriverFlags,
  400. fEngineControl->fBufferSize, &port_index) < 0) {
  401. jack_error("driver: cannot register port for %s", buf);
  402. return -1;
  403. }
  404. // setup port parameters
  405. if (ffado_streaming_set_capture_stream_buffer(driver->dev, chn, NULL)) {
  406. printError(" cannot configure initial port buffer for %s", buf);
  407. }
  408. if (ffado_streaming_capture_stream_onoff(driver->dev, chn, 0)) {
  409. printError(" cannot enable port %s", buf);
  410. }
  411. driver->capture_channels[chn].midi_input = new JackFFADOMidiInputPort();
  412. // setup the midi buffer
  413. driver->capture_channels[chn].midi_buffer = (uint32_t *)calloc(driver->period_size, sizeof(uint32_t));
  414. port = fGraphManager->GetPort(port_index);
  415. range.min = range.max = driver->period_size + driver->capture_frame_latency;
  416. port->SetLatencyRange(JackCaptureLatency, &range);
  417. fCapturePortList[chn] = port_index;
  418. jack_log("JackFFADODriver::Attach fCapturePortList[i] %ld ", port_index);
  419. fCaptureChannels++;
  420. } else {
  421. printMessage ("Don't register capture port %s", portname);
  422. }
  423. }
  424. // playback
  425. driver->playback_nchannels = ffado_streaming_get_nb_playback_streams(driver->dev);
  426. driver->playback_channels = (ffado_playback_channel_t *)calloc(driver->playback_nchannels, sizeof(ffado_playback_channel_t));
  427. if (driver->playback_channels == NULL) {
  428. printError("could not allocate memory for playback channel list");
  429. return -1;
  430. }
  431. fPlaybackChannels = 0;
  432. for (channel_t chn = 0; chn < driver->playback_nchannels; chn++) {
  433. ffado_streaming_get_playback_stream_name(driver->dev, chn, portname, sizeof(portname));
  434. driver->playback_channels[chn].stream_type = ffado_streaming_get_playback_stream_type(driver->dev, chn);
  435. if (driver->playback_channels[chn].stream_type == ffado_stream_type_audio) {
  436. snprintf(buf, sizeof(buf), "firewire_pcm:%s_out", portname);
  437. printMessage ("Registering audio playback port %s", buf);
  438. if (fEngine->PortRegister(fClientControl.fRefNum, buf,
  439. JACK_DEFAULT_AUDIO_TYPE,
  440. PlaybackDriverFlags,
  441. fEngineControl->fBufferSize, &port_index) < 0) {
  442. jack_error("driver: cannot register port for %s", buf);
  443. return -1;
  444. }
  445. // setup port parameters
  446. if (ffado_streaming_set_playback_stream_buffer(driver->dev, chn, NULL)) {
  447. printError(" cannot configure initial port buffer for %s", buf);
  448. }
  449. if (ffado_streaming_playback_stream_onoff(driver->dev, chn, 0)) {
  450. printError(" cannot enable port %s", buf);
  451. }
  452. port = fGraphManager->GetPort(port_index);
  453. // Add one buffer more latency if "async" mode is used...
  454. range.min = range.max = (driver->period_size * (driver->device_options.nb_buffers - 1)) + ((fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize) + driver->playback_frame_latency;
  455. port->SetLatencyRange(JackPlaybackLatency, &range);
  456. // playback port aliases (jackd1 style port names)
  457. snprintf(buf, sizeof(buf), "%s:playback_%i", fClientControl.fName, (int) chn + 1);
  458. port->SetAlias(buf);
  459. fPlaybackPortList[chn] = port_index;
  460. jack_log("JackFFADODriver::Attach fPlaybackPortList[i] %ld ", port_index);
  461. fPlaybackChannels++;
  462. } else if (driver->playback_channels[chn].stream_type == ffado_stream_type_midi) {
  463. snprintf(buf, sizeof(buf), "firewire_pcm:%s_out", portname);
  464. printMessage ("Registering midi playback port %s", buf);
  465. if (fEngine->PortRegister(fClientControl.fRefNum, buf,
  466. JACK_DEFAULT_MIDI_TYPE,
  467. PlaybackDriverFlags,
  468. fEngineControl->fBufferSize, &port_index) < 0) {
  469. jack_error("driver: cannot register port for %s", buf);
  470. return -1;
  471. }
  472. // setup port parameters
  473. if (ffado_streaming_set_playback_stream_buffer(driver->dev, chn, NULL)) {
  474. printError(" cannot configure initial port buffer for %s", buf);
  475. }
  476. if (ffado_streaming_playback_stream_onoff(driver->dev, chn, 0)) {
  477. printError(" cannot enable port %s", buf);
  478. }
  479. // setup the midi buffer
  480. // This constructor optionally accepts arguments for the
  481. // non-realtime buffer size and the realtime buffer size. Ideally,
  482. // these would become command-line options for the FFADO driver.
  483. driver->playback_channels[chn].midi_output = new JackFFADOMidiOutputPort();
  484. driver->playback_channels[chn].midi_buffer = (uint32_t *)calloc(driver->period_size, sizeof(uint32_t));
  485. port = fGraphManager->GetPort(port_index);
  486. range.min = range.max = (driver->period_size * (driver->device_options.nb_buffers - 1)) + ((fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize) + driver->playback_frame_latency;
  487. port->SetLatencyRange(JackPlaybackLatency, &range);
  488. fPlaybackPortList[chn] = port_index;
  489. jack_log("JackFFADODriver::Attach fPlaybackPortList[i] %ld ", port_index);
  490. fPlaybackChannels++;
  491. } else {
  492. printMessage ("Don't register playback port %s", portname);
  493. }
  494. }
  495. assert(fCaptureChannels < DRIVER_PORT_NUM);
  496. assert(fPlaybackChannels < DRIVER_PORT_NUM);
  497. if (ffado_streaming_prepare(driver->dev)) {
  498. printError("Could not prepare streaming device!");
  499. return -1;
  500. }
  501. // this makes no sense...
  502. assert(fCaptureChannels + fPlaybackChannels > 0);
  503. return 0;
  504. }
  505. int JackFFADODriver::Detach()
  506. {
  507. channel_t chn;
  508. ffado_driver_t* driver = (ffado_driver_t*)fDriver;
  509. jack_log("JackFFADODriver::Detach");
  510. // finish the libfreebob streaming
  511. ffado_streaming_finish(driver->dev);
  512. driver->dev = NULL;
  513. // free all internal buffers
  514. for (chn = 0; chn < driver->capture_nchannels; chn++) {
  515. if (driver->capture_channels[chn].midi_buffer)
  516. free(driver->capture_channels[chn].midi_buffer);
  517. if (driver->capture_channels[chn].midi_input)
  518. delete ((JackFFADOMidiInputPort *) (driver->capture_channels[chn].midi_input));
  519. }
  520. free(driver->capture_channels);
  521. for (chn = 0; chn < driver->playback_nchannels; chn++) {
  522. if (driver->playback_channels[chn].midi_buffer)
  523. free(driver->playback_channels[chn].midi_buffer);
  524. if (driver->playback_channels[chn].midi_output)
  525. delete ((JackFFADOMidiOutputPort *) (driver->playback_channels[chn].midi_output));
  526. }
  527. free(driver->playback_channels);
  528. free(driver->nullbuffer);
  529. free(driver->scratchbuffer);
  530. return JackAudioDriver::Detach(); // Generic JackAudioDriver Detach
  531. }
  532. int JackFFADODriver::Open(ffado_jack_settings_t *params)
  533. {
  534. // Generic JackAudioDriver Open
  535. if (JackAudioDriver::Open(
  536. params->period_size, params->sample_rate,
  537. params->playback_ports, params->playback_ports,
  538. 0, 0, 0, "", "",
  539. params->capture_frame_latency, params->playback_frame_latency) != 0) {
  540. return -1;
  541. }
  542. fDriver = (jack_driver_t *)ffado_driver_new ("ffado_pcm", params);
  543. if (fDriver) {
  544. // FFADO driver may have changed the in/out values
  545. //fCaptureChannels = ((ffado_driver_t *)fDriver)->capture_nchannels_audio;
  546. //fPlaybackChannels = ((ffado_driver_t *)fDriver)->playback_nchannels_audio;
  547. return 0;
  548. } else {
  549. JackAudioDriver::Close();
  550. return -1;
  551. }
  552. }
  553. int JackFFADODriver::Close()
  554. {
  555. // Generic audio driver close
  556. int res = JackAudioDriver::Close();
  557. ffado_driver_delete((ffado_driver_t*)fDriver);
  558. return res;
  559. }
  560. int JackFFADODriver::Start()
  561. {
  562. int res = JackAudioDriver::Start();
  563. if (res >= 0) {
  564. res = ffado_driver_start((ffado_driver_t *)fDriver);
  565. if (res < 0) {
  566. JackAudioDriver::Stop();
  567. }
  568. }
  569. return res;
  570. }
  571. int JackFFADODriver::Stop()
  572. {
  573. int res = ffado_driver_stop((ffado_driver_t *)fDriver);
  574. if (JackAudioDriver::Stop() < 0) {
  575. res = -1;
  576. }
  577. return res;
  578. }
  579. int JackFFADODriver::Read()
  580. {
  581. printEnter();
  582. /* Taken from ffado_driver_run_cycle */
  583. ffado_driver_t* driver = (ffado_driver_t*)fDriver;
  584. int wait_status = 0;
  585. fDelayedUsecs = 0.f;
  586. retry:
  587. jack_nframes_t nframes = ffado_driver_wait(driver, -1, &wait_status,
  588. &fDelayedUsecs);
  589. if ((wait_status < 0)) {
  590. printError( "wait status < 0! (= %d)", wait_status);
  591. return -1;
  592. }
  593. if (nframes == 0) {
  594. /* we detected an xrun and restarted: notify
  595. * clients about the delay.
  596. */
  597. jack_log("FFADO XRun");
  598. NotifyXRun(fBeginDateUst, fDelayedUsecs);
  599. goto retry; /* recoverable error*/
  600. }
  601. if (nframes != fEngineControl->fBufferSize)
  602. jack_log("JackFFADODriver::Read warning nframes = %ld", nframes);
  603. // Has to be done before read
  604. JackDriver::CycleIncTime();
  605. printExit();
  606. return ffado_driver_read((ffado_driver_t *)fDriver, fEngineControl->fBufferSize);
  607. }
  608. int JackFFADODriver::Write()
  609. {
  610. printEnter();
  611. int res = ffado_driver_write((ffado_driver_t *)fDriver, fEngineControl->fBufferSize);
  612. printExit();
  613. return res;
  614. }
  615. void
  616. JackFFADODriver::jack_driver_init (jack_driver_t *driver)
  617. {
  618. memset (driver, 0, sizeof (*driver));
  619. driver->attach = 0;
  620. driver->detach = 0;
  621. driver->write = 0;
  622. driver->read = 0;
  623. driver->null_cycle = 0;
  624. driver->bufsize = 0;
  625. driver->start = 0;
  626. driver->stop = 0;
  627. }
  628. void
  629. JackFFADODriver::jack_driver_nt_init (jack_driver_nt_t * driver)
  630. {
  631. memset (driver, 0, sizeof (*driver));
  632. jack_driver_init ((jack_driver_t *) driver);
  633. driver->attach = 0;
  634. driver->detach = 0;
  635. driver->bufsize = 0;
  636. driver->stop = 0;
  637. driver->start = 0;
  638. driver->nt_bufsize = 0;
  639. driver->nt_start = 0;
  640. driver->nt_stop = 0;
  641. driver->nt_attach = 0;
  642. driver->nt_detach = 0;
  643. driver->nt_run_cycle = 0;
  644. }
  645. } // end of namespace
  646. #ifdef __cplusplus
  647. extern "C"
  648. {
  649. #endif
  650. SERVER_EXPORT const jack_driver_desc_t *
  651. driver_get_descriptor () {
  652. jack_driver_desc_t * desc;
  653. jack_driver_desc_filler_t filler;
  654. jack_driver_param_value_t value;
  655. desc = jack_driver_descriptor_construct("firewire", JackDriverMaster, "Linux FFADO API based audio backend", &filler);
  656. strcpy(value.str, "hw:0");
  657. jack_driver_descriptor_add_parameter(
  658. desc,
  659. &filler,
  660. "device",
  661. 'd',
  662. JackDriverParamString,
  663. &value,
  664. NULL,
  665. "The FireWire device to use.",
  666. "The FireWire device to use. Please consult the FFADO documentation for more info.");
  667. value.ui = 1024;
  668. jack_driver_descriptor_add_parameter(desc, &filler, "period", 'p', JackDriverParamUInt, &value, NULL, "Frames per period", NULL);
  669. value.ui = 3;
  670. jack_driver_descriptor_add_parameter(desc, &filler, "nperiods", 'n', JackDriverParamUInt, &value, NULL, "Number of periods of playback latency", NULL);
  671. value.ui = 48000U;
  672. jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL);
  673. value.i = 0;
  674. jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamBool, &value, NULL, "Provide capture ports.", NULL);
  675. jack_driver_descriptor_add_parameter(desc, &filler, "playback", 'P', JackDriverParamBool, &value, NULL, "Provide playback ports.", NULL);
  676. value.i = 1;
  677. jack_driver_descriptor_add_parameter(desc, &filler, "duplex", 'D', JackDriverParamBool, &value, NULL, "Provide both capture and playback ports.", NULL);
  678. value.ui = 0;
  679. jack_driver_descriptor_add_parameter(desc, &filler, "input-latency", 'I', JackDriverParamUInt, &value, NULL, "Extra input latency (frames)", NULL);
  680. jack_driver_descriptor_add_parameter(desc, &filler, "output-latency", 'O', JackDriverParamUInt, &value, NULL, "Extra output latency (frames)", NULL);
  681. value.ui = 0;
  682. jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamUInt, &value, NULL, "Number of input channels to provide (note: currently ignored)", NULL);
  683. jack_driver_descriptor_add_parameter(desc, &filler, "outchannels", 'o', JackDriverParamUInt, &value, NULL, "Number of output channels to provide (note: currently ignored)", NULL);
  684. value.ui = 3;
  685. jack_driver_descriptor_add_parameter(desc, &filler, "verbose", 'v', JackDriverParamUInt, &value, NULL, "libffado verbose level", NULL);
  686. value.i = 0;
  687. jack_driver_descriptor_add_parameter(desc, &filler, "snoop", 'X', JackDriverParamBool, &value, NULL, "Snoop firewire traffic", NULL);
  688. return desc;
  689. }
  690. SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLockedEngine* engine, Jack::JackSynchro* table, const JSList* params) {
  691. const JSList * node;
  692. const jack_driver_param_t * param;
  693. ffado_jack_settings_t cmlparams;
  694. char *device_name=(char*)"hw:0";
  695. cmlparams.period_size_set = 0;
  696. cmlparams.sample_rate_set = 0;
  697. cmlparams.buffer_size_set = 0;
  698. /* default values */
  699. cmlparams.period_size = 1024;
  700. cmlparams.sample_rate = 48000;
  701. cmlparams.buffer_size = 3;
  702. cmlparams.playback_ports = 0;
  703. cmlparams.capture_ports = 0;
  704. cmlparams.playback_frame_latency = 0;
  705. cmlparams.capture_frame_latency = 0;
  706. cmlparams.verbose_level = 0;
  707. cmlparams.slave_mode = 0;
  708. cmlparams.snoop_mode = 0;
  709. cmlparams.device_info = NULL;
  710. for (node = params; node; node = jack_slist_next (node)) {
  711. param = (jack_driver_param_t *) node->data;
  712. switch (param->character) {
  713. case 'd':
  714. device_name = const_cast<char*>(param->value.str);
  715. break;
  716. case 'p':
  717. cmlparams.period_size = param->value.ui;
  718. cmlparams.period_size_set = 1;
  719. break;
  720. case 'n':
  721. cmlparams.buffer_size = param->value.ui;
  722. cmlparams.buffer_size_set = 1;
  723. break;
  724. case 'r':
  725. cmlparams.sample_rate = param->value.ui;
  726. cmlparams.sample_rate_set = 1;
  727. break;
  728. case 'i':
  729. cmlparams.capture_ports = param->value.ui;
  730. break;
  731. case 'o':
  732. cmlparams.playback_ports = param->value.ui;
  733. break;
  734. case 'I':
  735. cmlparams.capture_frame_latency = param->value.ui;
  736. break;
  737. case 'O':
  738. cmlparams.playback_frame_latency = param->value.ui;
  739. break;
  740. case 'x':
  741. cmlparams.slave_mode = param->value.ui;
  742. break;
  743. case 'X':
  744. cmlparams.snoop_mode = param->value.i;
  745. break;
  746. case 'v':
  747. cmlparams.verbose_level = param->value.ui;
  748. }
  749. }
  750. /* duplex is the default */
  751. if (!cmlparams.playback_ports && !cmlparams.capture_ports) {
  752. cmlparams.playback_ports = 1;
  753. cmlparams.capture_ports = 1;
  754. }
  755. // temporary
  756. cmlparams.device_info = device_name;
  757. Jack::JackFFADODriver* ffado_driver = new Jack::JackFFADODriver("system", "firewire_pcm", engine, table);
  758. Jack::JackDriverClientInterface* threaded_driver = new Jack::JackThreadedDriver(ffado_driver);
  759. // Special open for FFADO driver...
  760. if (ffado_driver->Open(&cmlparams) == 0) {
  761. return threaded_driver;
  762. } else {
  763. delete threaded_driver; // Delete the decorated driver
  764. return NULL;
  765. }
  766. }
  767. #ifdef __cplusplus
  768. }
  769. #endif