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.

1021 lines
32KB

  1. /*
  2. Copyright (C) 2009 Grame
  3. This program is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU Lesser General Public License as published by
  5. the Free Software Foundation; either version 2.1 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU Lesser General Public License for more details.
  11. You should have received a copy of the GNU Lesser General Public License
  12. along with this program; if not, write to the Free Software
  13. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  14. */
  15. #include <assert.h>
  16. #include "JackNetInterface.h"
  17. #include "JackPlatformPlug.h"
  18. #include "JackError.h"
  19. #include "JackTime.h"
  20. #include "JackException.h"
  21. #include "JackAudioAdapterInterface.h"
  22. #ifdef __cplusplus
  23. extern "C"
  24. {
  25. #endif
  26. // NetJack common API
  27. #define MASTER_NAME_SIZE 256
  28. enum JackNetMode {
  29. JackFastMode = 'f',
  30. JackNormalMode = 'n',
  31. JackSlowMode = 's',
  32. };
  33. typedef struct {
  34. int audio_input;
  35. int audio_output;
  36. int midi_input;
  37. int midi_ouput;
  38. int mtu;
  39. int time_out; // in millisecond, -1 means in infinite
  40. char mode;
  41. } jack_slave_t;
  42. typedef struct {
  43. jack_nframes_t buffer_size;
  44. jack_nframes_t sample_rate;
  45. char master_name[MASTER_NAME_SIZE];
  46. } jack_master_t;
  47. // NetJack slave API
  48. typedef struct _jack_net_slave jack_net_slave_t;
  49. typedef int (* JackNetSlaveProcessCallback) (jack_nframes_t buffer_size,
  50. int audio_input,
  51. float** audio_input_buffer,
  52. int midi_input,
  53. void** midi_input_buffer,
  54. int audio_output,
  55. float** audio_output_buffer,
  56. int midi_output,
  57. void** midi_output_buffer,
  58. void* data);
  59. typedef int (*JackNetSlaveBufferSizeCallback) (jack_nframes_t nframes, void *arg);
  60. typedef int (*JackNetSlaveSampleRateCallback) (jack_nframes_t nframes, void *arg);
  61. typedef void (*JackNetSlaveShutdownCallback) (void* data);
  62. SERVER_EXPORT jack_net_slave_t* jack_net_slave_open(const char* ip, int port, const char* name, jack_slave_t* request, jack_master_t* result);
  63. SERVER_EXPORT int jack_net_slave_close(jack_net_slave_t* net);
  64. SERVER_EXPORT int jack_net_slave_activate(jack_net_slave_t* net);
  65. SERVER_EXPORT int jack_net_slave_deactivate(jack_net_slave_t* net);
  66. SERVER_EXPORT int jack_set_net_slave_process_callback(jack_net_slave_t * net, JackNetSlaveProcessCallback net_callback, void *arg);
  67. SERVER_EXPORT int jack_set_net_slave_buffer_size_callback(jack_net_slave_t *net, JackNetSlaveBufferSizeCallback bufsize_callback, void *arg);
  68. SERVER_EXPORT int jack_set_net_slave_sample_rate_callback(jack_net_slave_t *net, JackNetSlaveSampleRateCallback samplerate_callback, void *arg);
  69. SERVER_EXPORT int jack_set_net_slave_shutdown_callback(jack_net_slave_t *net, JackNetSlaveShutdownCallback shutdown_callback, void *arg);
  70. // NetJack master API
  71. typedef struct _jack_net_master jack_net_master_t;
  72. SERVER_EXPORT jack_net_master_t* jack_net_master_open(const char* ip, int port, const char* name, jack_master_t* request, jack_slave_t* result);
  73. SERVER_EXPORT int jack_net_master_close(jack_net_master_t* net);
  74. SERVER_EXPORT int jack_net_master_recv(jack_net_master_t* net, int audio_input, float** audio_input_buffer, int midi_input, void** midi_input_buffer);
  75. SERVER_EXPORT int jack_net_master_send(jack_net_master_t* net, int audio_output, float** audio_output_buffer, int midi_output, void** midi_output_buffer);
  76. // NetJack adapter API
  77. typedef struct _jack_adapter jack_adapter_t;
  78. SERVER_EXPORT jack_adapter_t* jack_create_adapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate);
  79. SERVER_EXPORT int jack_destroy_adapter(jack_adapter_t* adapter);
  80. SERVER_EXPORT int jack_adapter_push_input(jack_adapter_t* adapter, int channels, float** buffers);
  81. SERVER_EXPORT int jack_adapter_pull_input(jack_adapter_t* adapter, int channels, float** buffers);
  82. SERVER_EXPORT int jack_adapter_push_output(jack_adapter_t* adapter, int channels, float** buffers);
  83. SERVER_EXPORT int jack_adapter_pull_output(jack_adapter_t* adapter, int channels, float** buffers);
  84. #ifdef __cplusplus
  85. }
  86. #endif
  87. namespace Jack
  88. {
  89. struct JackNetExtMaster : public JackNetMasterInterface {
  90. //sample buffers
  91. float** fAudioCaptureBuffer;
  92. float** fAudioPlaybackBuffer;
  93. JackMidiBuffer** fMidiCaptureBuffer;
  94. JackMidiBuffer** fMidiPlaybackBuffer;
  95. jack_master_t fRequest;
  96. JackNetExtMaster(const char* ip,
  97. int port,
  98. const char* name,
  99. jack_master_t* request)
  100. {
  101. fRunning = true;
  102. assert(strlen(ip) < 32);
  103. strcpy(fMulticastIP, ip);
  104. fSocket.SetPort(port);
  105. fRequest.buffer_size = request->buffer_size;
  106. fRequest.sample_rate = request->sample_rate;
  107. }
  108. virtual ~JackNetExtMaster()
  109. {}
  110. int Open(jack_slave_t* result)
  111. {
  112. // Init socket API (win32)
  113. if (SocketAPIInit() < 0) {
  114. fprintf(stderr, "Can't init Socket API, exiting...\n");
  115. return -1;
  116. }
  117. // Request socket
  118. if (fSocket.NewSocket() == SOCKET_ERROR) {
  119. fprintf(stderr, "Can't create the network management input socket : %s\n", StrError(NET_ERROR_CODE));
  120. return -1;
  121. }
  122. // Bind the socket to the local port
  123. if (fSocket.Bind() == SOCKET_ERROR) {
  124. fprintf(stderr, "Can't bind the network manager socket : %s\n", StrError(NET_ERROR_CODE));
  125. fSocket.Close();
  126. return -1;
  127. }
  128. // Join multicast group
  129. if (fSocket.JoinMCastGroup(fMulticastIP) == SOCKET_ERROR)
  130. fprintf(stderr, "Can't join multicast group : %s\n", StrError(NET_ERROR_CODE));
  131. // Local loop
  132. if (fSocket.SetLocalLoop() == SOCKET_ERROR)
  133. fprintf(stderr, "Can't set local loop : %s\n", StrError(NET_ERROR_CODE));
  134. // Set a timeout on the multicast receive (the thread can now be cancelled)
  135. if (fSocket.SetTimeOut(2000000) == SOCKET_ERROR)
  136. fprintf(stderr, "Can't set timeout : %s\n", StrError(NET_ERROR_CODE));
  137. //main loop, wait for data, deal with it and wait again
  138. //utility variables
  139. int attempt = 0;
  140. int rx_bytes = 0;
  141. do
  142. {
  143. session_params_t net_params;
  144. rx_bytes = fSocket.CatchHost(&net_params, sizeof(session_params_t), 0);
  145. SessionParamsNToH(&net_params, &fParams);
  146. if ((rx_bytes == SOCKET_ERROR) && (fSocket.GetError() != NET_NO_DATA)) {
  147. fprintf(stderr, "Error in receive : %s\n", StrError(NET_ERROR_CODE));
  148. if (++attempt == 10) {
  149. fprintf(stderr, "Can't receive on the socket, exiting net manager.\n" );
  150. goto error;
  151. }
  152. }
  153. if (rx_bytes == sizeof(session_params_t )) {
  154. switch (GetPacketType(&fParams)) {
  155. case SLAVE_AVAILABLE:
  156. if (MasterInit() == 0) {
  157. SessionParamsDisplay(&fParams);
  158. fRunning = false;
  159. } else {
  160. fprintf(stderr, "Can't init new net master...\n");
  161. goto error;
  162. }
  163. break;
  164. case KILL_MASTER:
  165. break;
  166. default:
  167. break;
  168. }
  169. }
  170. }
  171. while (fRunning);
  172. // Set result paramaters
  173. result->audio_input = fParams.fSendAudioChannels;
  174. result->audio_output = fParams.fReturnAudioChannels;
  175. result->midi_input = fParams.fSendMidiChannels;
  176. result->midi_ouput = fParams.fReturnMidiChannels;
  177. result->midi_ouput = fParams.fMtu;
  178. result->mode = fParams.fNetworkMode;
  179. return 0;
  180. error:
  181. fSocket.Close();
  182. return -1;
  183. }
  184. int MasterInit()
  185. {
  186. // Check MASTER <<==> SLAVE network protocol coherency
  187. if (fParams.fProtocolVersion != MASTER_PROTOCOL) {
  188. fprintf(stderr, "Error : slave is running with a different protocol %s\n", fParams.fName);
  189. return -1;
  190. }
  191. // Settings
  192. fSocket.GetName(fParams.fMasterNetName);
  193. fParams.fID = 1;
  194. fParams.fBitdepth = 0;
  195. fParams.fPeriodSize = fRequest.buffer_size;
  196. fParams.fSampleRate = fRequest.sample_rate;
  197. // Close request socket
  198. fSocket.Close();
  199. // Network slave init
  200. if (!JackNetMasterInterface::Init())
  201. return -1;
  202. // Set global parameters
  203. SetParams();
  204. AllocPorts();
  205. return 0;
  206. }
  207. int Close()
  208. {
  209. fSocket.Close();
  210. FreePorts();
  211. return 0;
  212. }
  213. void AllocPorts()
  214. {
  215. unsigned int port_index;
  216. // Set buffers
  217. fAudioPlaybackBuffer = new float*[fParams.fSendAudioChannels];
  218. for (port_index = 0; port_index < fParams.fSendAudioChannels; port_index++) {
  219. fAudioPlaybackBuffer[port_index] = new float[fParams.fPeriodSize];
  220. fNetAudioPlaybackBuffer->SetBuffer(port_index, fAudioPlaybackBuffer[port_index]);
  221. }
  222. fMidiPlaybackBuffer = new JackMidiBuffer*[fParams.fSendMidiChannels];
  223. for (port_index = 0; port_index < fParams.fSendMidiChannels; port_index++) {
  224. fMidiPlaybackBuffer[port_index] = (JackMidiBuffer*)new float[fParams.fPeriodSize];
  225. fNetMidiPlaybackBuffer->SetBuffer(port_index, fMidiPlaybackBuffer[port_index]);
  226. }
  227. fAudioCaptureBuffer = new float*[fParams.fReturnAudioChannels];
  228. for (port_index = 0; port_index < fParams.fReturnAudioChannels; port_index++) {
  229. fAudioCaptureBuffer[port_index] = new float[fParams.fPeriodSize];
  230. fNetAudioCaptureBuffer->SetBuffer(port_index, fAudioCaptureBuffer[port_index]);
  231. }
  232. fMidiCaptureBuffer = new JackMidiBuffer*[fParams.fReturnMidiChannels];
  233. for (port_index = 0; port_index < fParams.fReturnMidiChannels; port_index++) {
  234. fMidiCaptureBuffer[port_index] = (JackMidiBuffer*)new float[fParams.fPeriodSize];
  235. fNetMidiCaptureBuffer->SetBuffer(port_index, fMidiCaptureBuffer[port_index]);
  236. }
  237. }
  238. void FreePorts()
  239. {
  240. unsigned int port_index;
  241. if (fAudioPlaybackBuffer) {
  242. for (port_index = 0; port_index < fParams.fSendAudioChannels; port_index++)
  243. delete[] fAudioPlaybackBuffer[port_index];
  244. delete[] fAudioPlaybackBuffer;
  245. fAudioPlaybackBuffer = NULL;
  246. }
  247. if (fMidiPlaybackBuffer) {
  248. for (port_index = 0; port_index < fParams.fSendMidiChannels; port_index++)
  249. delete[] (fMidiPlaybackBuffer[port_index]);
  250. delete[] fMidiPlaybackBuffer;
  251. fMidiPlaybackBuffer = NULL;
  252. }
  253. if (fAudioCaptureBuffer) {
  254. for (port_index = 0; port_index < fParams.fReturnAudioChannels; port_index++)
  255. delete[] fAudioCaptureBuffer[port_index];
  256. delete[] fAudioCaptureBuffer;
  257. fAudioCaptureBuffer = NULL;
  258. }
  259. if (fMidiCaptureBuffer) {
  260. for (port_index = 0; port_index < fParams.fReturnMidiChannels; port_index++)
  261. delete[] fMidiCaptureBuffer[port_index];
  262. delete[] fMidiCaptureBuffer;
  263. fMidiCaptureBuffer = NULL;
  264. }
  265. }
  266. int Read(int audio_input, float** audio_input_buffer, int midi_input, void** midi_input_buffer)
  267. {
  268. assert((unsigned int)audio_input == fParams.fSendAudioChannels);
  269. int port_index;
  270. for (port_index = 0; port_index < audio_input; port_index++) {
  271. fNetAudioPlaybackBuffer->SetBuffer(port_index, audio_input_buffer[port_index]);
  272. }
  273. for (port_index = 0; port_index < midi_input; port_index++) {
  274. fNetMidiPlaybackBuffer->SetBuffer(port_index, ((JackMidiBuffer**)midi_input_buffer)[port_index]);
  275. }
  276. if (SyncRecv() == SOCKET_ERROR)
  277. return 0;
  278. if (DecodeSyncPacket() < 0)
  279. return 0;
  280. return DataRecv();
  281. }
  282. int Write(int audio_output, float** audio_output_buffer, int midi_output, void** midi_output_buffer)
  283. {
  284. assert((unsigned int)audio_output == fParams.fReturnAudioChannels);
  285. int port_index;
  286. for (port_index = 0; port_index < audio_output; port_index++) {
  287. fNetAudioCaptureBuffer->SetBuffer(port_index, audio_output_buffer[port_index]);
  288. }
  289. for (port_index = 0; port_index < midi_output; port_index++) {
  290. fNetMidiCaptureBuffer->SetBuffer(port_index, ((JackMidiBuffer**)midi_output_buffer)[port_index]);
  291. }
  292. if (EncodeSyncPacket() < 0)
  293. return 0;
  294. if (SyncSend() == SOCKET_ERROR)
  295. return SOCKET_ERROR;
  296. return DataSend();
  297. }
  298. // Transport
  299. int EncodeTransportData()
  300. {
  301. return 0;
  302. }
  303. int DecodeTransportData()
  304. {
  305. return 0;
  306. }
  307. };
  308. struct JackNetExtSlave : public JackNetSlaveInterface, public JackRunnableInterface {
  309. JackThread fThread;
  310. JackNetSlaveProcessCallback fProcessCallback;
  311. void* fProcessArg;
  312. JackNetSlaveShutdownCallback fShutdownCallback;
  313. void* fShutdownArg;
  314. JackNetSlaveBufferSizeCallback fBufferSizeCallback;
  315. void* fBufferSizeArg;
  316. JackNetSlaveSampleRateCallback fSampleRateCallback;
  317. void* fSampleRateArg;
  318. //sample buffers
  319. float** fAudioCaptureBuffer;
  320. float** fAudioPlaybackBuffer;
  321. JackMidiBuffer** fMidiCaptureBuffer;
  322. JackMidiBuffer** fMidiPlaybackBuffer;
  323. JackNetExtSlave(const char* ip,
  324. int port,
  325. const char* name,
  326. jack_slave_t* request)
  327. :fThread(this),
  328. fProcessCallback(NULL),fProcessArg(NULL),
  329. fShutdownCallback(NULL), fShutdownArg(NULL),
  330. fBufferSizeCallback(NULL), fBufferSizeArg(NULL),
  331. fSampleRateCallback(NULL), fSampleRateArg(NULL),
  332. fAudioCaptureBuffer(NULL), fAudioPlaybackBuffer(NULL),
  333. fMidiCaptureBuffer(NULL), fMidiPlaybackBuffer(NULL)
  334. {
  335. char host_name[JACK_CLIENT_NAME_SIZE];
  336. // Request parameters
  337. assert(strlen(ip) < 32);
  338. strcpy(fMulticastIP, ip);
  339. fParams.fMtu = request->mtu;
  340. fParams.fTransportSync = 0;
  341. fParams.fSendAudioChannels = request->audio_input;
  342. fParams.fReturnAudioChannels = request->audio_output;
  343. fParams.fSendMidiChannels = request->midi_input;
  344. fParams.fReturnMidiChannels = request->midi_ouput;
  345. fParams.fNetworkMode = request->mode;
  346. fParams.fSlaveSyncMode = 1;
  347. // Create name with hostname and client name
  348. GetHostName(host_name, JACK_CLIENT_NAME_SIZE);
  349. snprintf(fParams.fName, JACK_CLIENT_NAME_SIZE, "%s_%s", host_name, name);
  350. fSocket.GetName(fParams.fSlaveNetName);
  351. // Set the socket parameters
  352. fSocket.SetPort(port);
  353. fSocket.SetAddress(fMulticastIP, port);
  354. }
  355. virtual ~JackNetExtSlave()
  356. {}
  357. int Open(jack_master_t* result)
  358. {
  359. // Init network connection
  360. if (!JackNetSlaveInterface::InitConnection()){
  361. return -1;
  362. }
  363. // Then set global parameters
  364. SetParams();
  365. // Set result
  366. if (result != NULL) {
  367. result->buffer_size = fParams.fPeriodSize;
  368. result->sample_rate = fParams.fSampleRate;
  369. strcpy(result->master_name, fParams.fMasterNetName);
  370. }
  371. AllocPorts();
  372. return 0;
  373. }
  374. int Restart()
  375. {
  376. // If shutdown cb is set, then call it
  377. if (fShutdownCallback)
  378. fShutdownCallback(fShutdownArg);
  379. // Init complete network connection
  380. if (!JackNetSlaveInterface::Init())
  381. return -1;
  382. // Then set global parameters
  383. SetParams();
  384. // We need to notify possibly new buffer size and sample rate (see Execute)
  385. if (fBufferSizeCallback)
  386. fBufferSizeCallback(fParams.fPeriodSize, fBufferSizeArg);
  387. if (fSampleRateCallback)
  388. fSampleRateCallback(fParams.fSampleRate, fSampleRateArg);
  389. AllocPorts();
  390. return 0;
  391. }
  392. int Close()
  393. {
  394. fSocket.Close();
  395. FreePorts();
  396. return 0;
  397. }
  398. void AllocPorts()
  399. {
  400. unsigned int port_index;
  401. // Set buffers
  402. fAudioCaptureBuffer = new float*[fParams.fSendAudioChannels];
  403. for (port_index = 0; port_index < fParams.fSendAudioChannels; port_index++) {
  404. fAudioCaptureBuffer[port_index] = new float[fParams.fPeriodSize];
  405. fNetAudioCaptureBuffer->SetBuffer(port_index, fAudioCaptureBuffer[port_index]);
  406. }
  407. fMidiCaptureBuffer = new JackMidiBuffer*[fParams.fSendMidiChannels];
  408. for (port_index = 0; port_index < fParams.fSendMidiChannels; port_index++) {
  409. fMidiCaptureBuffer[port_index] = (JackMidiBuffer*)new float[fParams.fPeriodSize];
  410. fNetMidiCaptureBuffer->SetBuffer(port_index, fMidiCaptureBuffer[port_index]);
  411. }
  412. fAudioPlaybackBuffer = new float*[fParams.fReturnAudioChannels];
  413. for (port_index = 0; port_index < fParams.fReturnAudioChannels; port_index++) {
  414. fAudioPlaybackBuffer[port_index] = new float[fParams.fPeriodSize];
  415. fNetAudioPlaybackBuffer->SetBuffer(port_index, fAudioPlaybackBuffer[port_index]);
  416. }
  417. fMidiPlaybackBuffer = new JackMidiBuffer*[fParams.fReturnMidiChannels];
  418. for (port_index = 0; port_index < fParams.fReturnMidiChannels; port_index++) {
  419. fMidiPlaybackBuffer[port_index] = (JackMidiBuffer*)new float[fParams.fPeriodSize];
  420. fNetMidiPlaybackBuffer->SetBuffer(port_index, fMidiPlaybackBuffer[port_index]);
  421. }
  422. }
  423. void FreePorts()
  424. {
  425. unsigned int port_index;
  426. if (fAudioCaptureBuffer) {
  427. for (port_index = 0; port_index < fParams.fSendAudioChannels; port_index++)
  428. delete[] fAudioCaptureBuffer[port_index];
  429. delete[] fAudioCaptureBuffer;
  430. fAudioCaptureBuffer = NULL;
  431. }
  432. if (fMidiCaptureBuffer) {
  433. for (port_index = 0; port_index < fParams.fSendMidiChannels; port_index++)
  434. delete[] (fMidiCaptureBuffer[port_index]);
  435. delete[] fMidiCaptureBuffer;
  436. fMidiCaptureBuffer = NULL;
  437. }
  438. if (fAudioPlaybackBuffer) {
  439. for (port_index = 0; port_index < fParams.fReturnAudioChannels; port_index++)
  440. delete[] fAudioPlaybackBuffer[port_index];
  441. delete[] fAudioPlaybackBuffer;
  442. fAudioPlaybackBuffer = NULL;
  443. }
  444. if (fMidiPlaybackBuffer) {
  445. for (port_index = 0; port_index < fParams.fReturnMidiChannels; port_index++)
  446. delete[] fMidiPlaybackBuffer[port_index];
  447. delete[] fMidiPlaybackBuffer;
  448. fMidiPlaybackBuffer = NULL;
  449. }
  450. }
  451. // Transport
  452. int EncodeTransportData()
  453. {
  454. return 0;
  455. }
  456. int DecodeTransportData()
  457. {
  458. return 0;
  459. }
  460. bool Init()
  461. {
  462. // Will do "something" on OSX only...
  463. fThread.SetParams(float(fParams.fPeriodSize) / float(fParams.fSampleRate) * 1000000, 100 * 1000, 500 * 1000);
  464. return (fThread.AcquireRealTime(80) == 0); // TODO: get a value from the server
  465. }
  466. bool Execute()
  467. {
  468. try {
  469. // Keep running even in case of error
  470. while (fThread.GetStatus() == JackThread::kRunning) {
  471. if (Process() == SOCKET_ERROR)
  472. return false;
  473. }
  474. return false;
  475. } catch (JackNetException& e) {
  476. // Otherwise just restart...
  477. e.PrintMessage();
  478. fThread.DropRealTime();
  479. fThread.SetStatus(JackThread::kIniting);
  480. FreePorts();
  481. Restart();
  482. if (Init()) {
  483. fThread.SetStatus(JackThread::kRunning);
  484. return true;
  485. } else {
  486. return false;
  487. }
  488. }
  489. }
  490. int Read()
  491. {
  492. // Don't return -1 in case of sync recv failure
  493. // we need the process to continue for network error detection
  494. if (SyncRecv() == SOCKET_ERROR)
  495. return 0;
  496. if (DecodeSyncPacket() < 0)
  497. return 0;
  498. return DataRecv();
  499. }
  500. int Write()
  501. {
  502. if (EncodeSyncPacket() < 0)
  503. return 0;
  504. if (SyncSend() == SOCKET_ERROR)
  505. return SOCKET_ERROR;
  506. return DataSend();
  507. }
  508. int Process()
  509. {
  510. // Read data from the network
  511. // in case of fatal network error, stop the process
  512. if (Read() == SOCKET_ERROR)
  513. return SOCKET_ERROR;
  514. fProcessCallback(fParams.fPeriodSize,
  515. fParams.fSendAudioChannels,
  516. fAudioCaptureBuffer,
  517. fParams.fSendMidiChannels,
  518. (void**)fMidiCaptureBuffer,
  519. fParams.fReturnAudioChannels,
  520. fAudioPlaybackBuffer,
  521. fParams.fReturnMidiChannels,
  522. (void**)fMidiPlaybackBuffer,
  523. fProcessArg);
  524. // Then write data to network
  525. // in case of failure, stop process
  526. if (Write() == SOCKET_ERROR)
  527. return SOCKET_ERROR;
  528. return 0;
  529. }
  530. int Start()
  531. {
  532. // Finish connection..
  533. if (!JackNetSlaveInterface::InitRendering()) {
  534. return -1;
  535. }
  536. return (fProcessCallback == 0) ? -1 : fThread.StartSync();
  537. }
  538. int Stop()
  539. {
  540. return (fProcessCallback == 0) ? -1 : fThread.Kill();
  541. }
  542. // Callback
  543. int SetProcessCallback(JackNetSlaveProcessCallback net_callback, void *arg)
  544. {
  545. if (fThread.GetStatus() == JackThread::kRunning) {
  546. return -1;
  547. } else {
  548. fProcessCallback = net_callback;
  549. fProcessArg = arg;
  550. return 0;
  551. }
  552. }
  553. int SetShutdownCallback(JackNetSlaveShutdownCallback shutdown_callback, void *arg)
  554. {
  555. if (fThread.GetStatus() == JackThread::kRunning) {
  556. return -1;
  557. } else {
  558. fShutdownCallback = shutdown_callback;
  559. fShutdownArg = arg;
  560. return 0;
  561. }
  562. }
  563. int SetBufferSizeCallback(JackNetSlaveBufferSizeCallback bufsize_callback, void *arg)
  564. {
  565. if (fThread.GetStatus() == JackThread::kRunning) {
  566. return -1;
  567. } else {
  568. fBufferSizeCallback = bufsize_callback;
  569. fBufferSizeArg = arg;
  570. return 0;
  571. }
  572. }
  573. int SetSampleRateCallback(JackNetSlaveSampleRateCallback samplerate_callback, void *arg)
  574. {
  575. if (fThread.GetStatus() == JackThread::kRunning) {
  576. return -1;
  577. } else {
  578. fSampleRateCallback = samplerate_callback;
  579. fSampleRateArg = arg;
  580. return 0;
  581. }
  582. }
  583. };
  584. struct JackNetAdapter : public JackAudioAdapterInterface {
  585. JackNetAdapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate)
  586. :JackAudioAdapterInterface(buffer_size, sample_rate)
  587. {
  588. fCaptureRingBuffer = new JackResampler*[fCaptureChannels];
  589. fPlaybackRingBuffer = new JackResampler*[fPlaybackChannels];
  590. /*
  591. for (i = 0; i < fCaptureChannels; i++)
  592. fCaptureRingBuffer[i] = new JackLibSampleRateResampler(fAudioAdapter->GetQuality());
  593. for (i = 0; i < fPlaybackChannels; i++)
  594. fPlaybackRingBuffer[i] = new JackLibSampleRateResampler(fAudioAdapter->GetQuality());
  595. */
  596. int i;
  597. for (i = 0; i < fCaptureChannels; i++)
  598. fCaptureRingBuffer[i] = new JackResampler();
  599. for (i = 0; i < fPlaybackChannels; i++)
  600. fPlaybackRingBuffer[i] = new JackResampler();
  601. }
  602. virtual ~JackNetAdapter()
  603. {
  604. int i;
  605. for (i = 0; i < fCaptureChannels; i++)
  606. delete (fCaptureRingBuffer[i]);
  607. for (i = 0; i < fPlaybackChannels; i++)
  608. delete(fPlaybackRingBuffer[i] );
  609. delete[] fCaptureRingBuffer;
  610. delete[] fPlaybackRingBuffer;
  611. }
  612. void Reset()
  613. {
  614. int i;
  615. for (i = 0; i < fCaptureChannels; i++)
  616. fCaptureRingBuffer[i]->Reset();
  617. for (i = 0; i < fPlaybackChannels; i++)
  618. fPlaybackRingBuffer[i]->Reset();
  619. }
  620. int PushInput(int audio_input, float** audio_input_buffer)
  621. {
  622. bool failure = false;
  623. int port_index;
  624. // Get the resample factor,
  625. jack_nframes_t time1, time2;
  626. ResampleFactor(time1, time2);
  627. // Resample input data,
  628. for (port_index = 0; port_index < audio_input; port_index++) {
  629. fCaptureRingBuffer[port_index]->SetRatio(time1, time2);
  630. if (fCaptureRingBuffer[port_index]->WriteResample(audio_input_buffer[port_index], fAdaptedBufferSize) < fAdaptedBufferSize)
  631. failure = true;
  632. }
  633. if (failure) {
  634. ResetRingBuffers();
  635. return -1;
  636. }
  637. return 0;
  638. }
  639. int PullInput(int audio_input, float** audio_input_buffer)
  640. {
  641. bool failure = false;
  642. int port_index;
  643. // DLL
  644. SetCallbackTime(GetMicroSeconds());
  645. // Push/pull from ringbuffer
  646. for (port_index = 0; port_index < audio_input; port_index++) {
  647. if (fCaptureRingBuffer[port_index]->Read(audio_input_buffer[port_index], fHostBufferSize) < fHostBufferSize)
  648. failure = true;
  649. }
  650. // Reset all ringbuffers in case of failure
  651. if (failure) {
  652. Reset();
  653. return -1;
  654. }
  655. return 0;
  656. }
  657. int PushOutput(int audio_input, float** audio_input_buffer)
  658. {
  659. bool failure = false;
  660. int port_index;
  661. // DLL
  662. SetCallbackTime(GetMicroSeconds());
  663. // Push/pull from ringbuffer
  664. for (port_index = 0; port_index < audio_input; port_index++) {
  665. if (fPlaybackRingBuffer[port_index]->Write(audio_input_buffer[port_index], fHostBufferSize) < fHostBufferSize)
  666. failure = true;
  667. }
  668. // Reset all ringbuffers in case of failure
  669. if (failure) {
  670. Reset();
  671. return -1;
  672. }
  673. return 0;
  674. }
  675. int PullOutput(int audio_output, float** audio_output_buffer)
  676. {
  677. bool failure = false;
  678. int port_index;
  679. //get the resample factor,
  680. jack_nframes_t time1, time2;
  681. ResampleFactor(time1, time2);
  682. //resample output data,
  683. for (port_index = 0; port_index < fPlaybackChannels; port_index++) {
  684. fPlaybackRingBuffer[port_index]->SetRatio(time2, time1);
  685. if (fPlaybackRingBuffer[port_index]->ReadResample(audio_output_buffer[port_index], fAdaptedBufferSize) < fAdaptedBufferSize)
  686. failure = true;
  687. }
  688. if (failure) {
  689. ResetRingBuffers();
  690. return -1;
  691. }
  692. return 0;
  693. }
  694. };
  695. } // end of namespace
  696. using namespace Jack;
  697. SERVER_EXPORT jack_net_slave_t* jack_net_slave_open(const char* ip, int port, const char* name, jack_slave_t* request, jack_master_t* result)
  698. {
  699. JackNetExtSlave* slave = new JackNetExtSlave(ip, port, name, request);
  700. if (slave->Open(result) == 0) {
  701. return (jack_net_slave_t*)slave;
  702. } else {
  703. delete slave;
  704. return NULL;
  705. }
  706. }
  707. SERVER_EXPORT int jack_net_slave_close(jack_net_slave_t* net)
  708. {
  709. JackNetExtSlave* slave = (JackNetExtSlave*)net;
  710. slave->Close();
  711. delete slave;
  712. return 0;
  713. }
  714. SERVER_EXPORT int jack_set_net_slave_process_callback(jack_net_slave_t* net, JackNetSlaveProcessCallback net_callback, void *arg)
  715. {
  716. JackNetExtSlave* slave = (JackNetExtSlave*)net;
  717. return slave->SetProcessCallback(net_callback, arg);
  718. }
  719. SERVER_EXPORT int jack_net_slave_activate(jack_net_slave_t* net)
  720. {
  721. JackNetExtSlave* slave = (JackNetExtSlave*)net;
  722. return slave->Start();
  723. }
  724. SERVER_EXPORT int jack_net_slave_deactivate(jack_net_slave_t* net)
  725. {
  726. JackNetExtSlave* slave = (JackNetExtSlave*)net;
  727. return slave->Stop();
  728. }
  729. SERVER_EXPORT int jack_set_net_slave_buffer_size_callback(jack_net_slave_t *net, JackNetSlaveBufferSizeCallback bufsize_callback, void *arg)
  730. {
  731. JackNetExtSlave* slave = (JackNetExtSlave*)net;
  732. return slave->SetBufferSizeCallback(bufsize_callback, arg);
  733. }
  734. SERVER_EXPORT int jack_set_net_slave_sample_rate_callback(jack_net_slave_t *net, JackNetSlaveSampleRateCallback samplerate_callback, void *arg)
  735. {
  736. JackNetExtSlave* slave = (JackNetExtSlave*)net;
  737. return slave->SetSampleRateCallback(samplerate_callback, arg);
  738. }
  739. SERVER_EXPORT int jack_set_net_slave_shutdown_callback(jack_net_slave_t *net, JackNetSlaveShutdownCallback shutdown_callback, void *arg)
  740. {
  741. JackNetExtSlave* slave = (JackNetExtSlave*)net;
  742. return slave->SetShutdownCallback(shutdown_callback, arg);
  743. }
  744. // Master API
  745. SERVER_EXPORT jack_net_master_t* jack_net_master_open(const char* ip, int port, const char* name, jack_master_t* request, jack_slave_t* result)
  746. {
  747. JackNetExtMaster* master = new JackNetExtMaster(ip, port, name, request);
  748. if (master->Open(result) == 0) {
  749. return (jack_net_master_t*)master;
  750. } else {
  751. delete master;
  752. return NULL;
  753. }
  754. }
  755. SERVER_EXPORT int jack_net_master_close(jack_net_master_t* net)
  756. {
  757. JackNetExtMaster* master = (JackNetExtMaster*)net;
  758. master->Close();
  759. delete master;
  760. return 0;
  761. }
  762. SERVER_EXPORT int jack_net_master_recv(jack_net_master_t* net, int audio_input, float** audio_input_buffer, int midi_input, void** midi_input_buffer)
  763. {
  764. JackNetExtMaster* slave = (JackNetExtMaster*)net;
  765. return slave->Read(audio_input, audio_input_buffer, midi_input, midi_input_buffer);
  766. }
  767. SERVER_EXPORT int jack_net_master_send(jack_net_master_t* net, int audio_output, float** audio_output_buffer, int midi_output, void** midi_output_buffer)
  768. {
  769. JackNetExtMaster* slave = (JackNetExtMaster*)net;
  770. return slave->Write(audio_output, audio_output_buffer, midi_output, midi_output_buffer);
  771. }
  772. // Adapter API
  773. SERVER_EXPORT jack_adapter_t* jack_create_adapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate)
  774. {
  775. return (jack_adapter_t*)new JackNetAdapter(buffer_size, sample_rate);
  776. }
  777. SERVER_EXPORT int jack_destroy_adapter(jack_adapter_t* adapter)
  778. {
  779. delete((JackNetAdapter*)adapter);
  780. return 0;
  781. }
  782. SERVER_EXPORT int jack_adapter_push_input(jack_adapter_t * adapter, int channels, float** buffers)
  783. {
  784. JackNetAdapter* slave = (JackNetAdapter*)adapter;
  785. return slave->PushInput(channels, buffers);
  786. }
  787. SERVER_EXPORT int jack_adapter_pull_input(jack_adapter_t * adapter, int channels, float** buffers)
  788. {
  789. JackNetAdapter* slave = (JackNetAdapter*)adapter;
  790. return slave->PullInput(channels, buffers);
  791. }
  792. SERVER_EXPORT int jack_adapter_push_output(jack_adapter_t * adapter, int channels, float** buffers)
  793. {
  794. JackNetAdapter* slave = (JackNetAdapter*)adapter;
  795. return slave->PushOutput(channels, buffers);
  796. }
  797. SERVER_EXPORT int jack_adapter_pull_output(jack_adapter_t * adapter, int channels, float** buffers)
  798. {
  799. JackNetAdapter* slave = (JackNetAdapter*)adapter;
  800. return slave->PullOutput(channels, buffers);
  801. }
  802. // Empty code for now..
  803. //#ifdef TARGET_OS_IPHONE
  804. SERVER_EXPORT void jack_error(const char *fmt, ...)
  805. {
  806. // TODO
  807. }
  808. SERVER_EXPORT void jack_info(const char *fmt, ...)
  809. {
  810. // TODO
  811. }
  812. SERVER_EXPORT void jack_log(const char *fmt, ...)
  813. {
  814. // TODO
  815. }
  816. //#endif