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.

228 lines
5.9KB

  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 General Public License as published by
  5. the Free Software Foundation; either version 2 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 General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program; if not, write to the Free Software
  13. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  14. */
  15. #include <stdlib.h>
  16. #include <stdbool.h>
  17. #include <stdio.h>
  18. #include <errno.h>
  19. #ifndef WIN32
  20. #include <unistd.h>
  21. #endif
  22. #include <math.h>
  23. #include <signal.h>
  24. #include <getopt.h>
  25. #include <string.h>
  26. #include <assert.h>
  27. #include <jack/net.h>
  28. #ifdef _MSC_VER
  29. #define alloca _alloca
  30. #include <windows.h>
  31. void usleep(__int64 usec)
  32. {
  33. HANDLE timer;
  34. LARGE_INTEGER ft;
  35. ft.QuadPart = -(10*usec); // Convert to 100 nanosecond interval, negative value indicates relative time
  36. timer = CreateWaitableTimer(NULL, TRUE, NULL);
  37. SetWaitableTimer(timer, &ft, 0, NULL, NULL, 0);
  38. WaitForSingleObject(timer, INFINITE);
  39. CloseHandle(timer);
  40. }
  41. #endif
  42. jack_net_master_t* net;
  43. #define BUFFER_SIZE 512
  44. #define SAMPLE_RATE 44100
  45. static void signal_handler(int sig)
  46. {
  47. jack_net_master_close(net);
  48. fprintf(stderr, "signal received, exiting ...\n");
  49. exit(0);
  50. }
  51. static void
  52. usage ()
  53. {
  54. fprintf (stderr, "\n"
  55. "usage: jack_net_master \n"
  56. " [ -b buffer size (default = %d) ]\n"
  57. " [ -r sample rate (default = %d) ]\n"
  58. " [ -a hostname (default = %s) ]\n"
  59. " [ -p port (default = %d) ]\n", BUFFER_SIZE, SAMPLE_RATE, DEFAULT_MULTICAST_IP, DEFAULT_PORT);
  60. }
  61. int
  62. main (int argc, char *argv[])
  63. {
  64. int buffer_size = BUFFER_SIZE;
  65. int sample_rate = SAMPLE_RATE;
  66. int udp_port = DEFAULT_PORT;
  67. const char* multicast_ip = DEFAULT_MULTICAST_IP;
  68. const char *options = "b:r:a:p:h";
  69. int option_index;
  70. int opt;
  71. struct option long_options[] =
  72. {
  73. {"buffer size", 1, 0, 'b'},
  74. {"sample rate", 1, 0, 'r'},
  75. {"hostname", 1, 0, 'a'},
  76. {"port", 1, 0, 'p'},
  77. {0, 0, 0, 0}
  78. };
  79. while ((opt = getopt_long (argc, argv, options, long_options, &option_index)) != -1) {
  80. switch (opt) {
  81. case 'b':
  82. buffer_size = atoi(optarg);
  83. break;
  84. case 'r':
  85. sample_rate = atoi(optarg);
  86. break;
  87. case 'a':
  88. multicast_ip = strdup(optarg);
  89. break;
  90. case 'p':
  91. udp_port = atoi(optarg);
  92. break;
  93. case 'h':
  94. usage();
  95. return -1;
  96. }
  97. }
  98. int i;
  99. //jack_master_t request = { 4, 4, -1, -1, buffer_size, sample_rate, "master", -1 };
  100. jack_master_t request = { -1, -1, -1, -1, buffer_size, sample_rate, "net_master", 6, true };
  101. jack_slave_t result;
  102. float** audio_input_buffer;
  103. float** audio_output_buffer;
  104. int wait_usec = (int) ((((float)buffer_size) * 1000000) / ((float)sample_rate));
  105. printf("Waiting for a slave...\n");
  106. if ((net = jack_net_master_open(multicast_ip, udp_port, &request, &result)) == 0) {
  107. fprintf(stderr, "NetJack master can not be opened\n");
  108. return 1;
  109. }
  110. printf("Slave is running...\n");
  111. /* install a signal handler to properly quits jack client */
  112. #ifdef WIN32
  113. signal(SIGINT, signal_handler);
  114. signal(SIGABRT, signal_handler);
  115. signal(SIGTERM, signal_handler);
  116. #else
  117. signal(SIGQUIT, signal_handler);
  118. signal(SIGTERM, signal_handler);
  119. signal(SIGHUP, signal_handler);
  120. signal(SIGINT, signal_handler);
  121. #endif
  122. // Allocate buffers
  123. audio_input_buffer = (float**)calloc(result.audio_input, sizeof(float*));
  124. for (i = 0; i < result.audio_input; i++) {
  125. audio_input_buffer[i] = (float*)calloc(buffer_size, sizeof(float));
  126. }
  127. audio_output_buffer = (float**)calloc(result.audio_output, sizeof(float*));
  128. for (i = 0; i < result.audio_output; i++) {
  129. audio_output_buffer[i] = (float*)calloc(buffer_size, sizeof(float));
  130. }
  131. /*
  132. Run until interrupted.
  133. WARNING !! : this code is given for demonstration purpose. For proper timing bevahiour
  134. it has to be called in a real-time context (which is *not* the case here...)
  135. */
  136. //usleep(5*1000000);
  137. printf("Wait...\n");
  138. //sleep(10);
  139. usleep(1000000);
  140. printf("Wait...OK\n");
  141. while (1) {
  142. // Copy input to output
  143. assert(result.audio_input == result.audio_output);
  144. for (i = 0; i < result.audio_input; i++) {
  145. memcpy(audio_output_buffer[i], audio_input_buffer[i], buffer_size * sizeof(float));
  146. }
  147. /*
  148. if (jack_net_master_send(net, result.audio_output, audio_output_buffer, 0, NULL) < 0) {
  149. printf("jack_net_master_send failure, exiting\n");
  150. break;
  151. }
  152. usleep(10000);
  153. if (jack_net_master_recv(net, result.audio_input, audio_input_buffer, 0, NULL) < 0) {
  154. printf("jack_net_master_recv failure, exiting\n");
  155. break;
  156. }
  157. */
  158. if (jack_net_master_send_slice(net, result.audio_output, audio_output_buffer, 0, NULL, BUFFER_SIZE/2) < 0) {
  159. printf("jack_net_master_send failure, exiting\n");
  160. break;
  161. }
  162. usleep(10000);
  163. if (jack_net_master_recv_slice(net, result.audio_input, audio_input_buffer, 0, NULL, BUFFER_SIZE/2) < 0) {
  164. printf("jack_net_master_recv failure, exiting\n");
  165. break;
  166. }
  167. usleep(wait_usec);
  168. };
  169. // Wait for application end
  170. jack_net_master_close(net);
  171. for (i = 0; i < result.audio_input; i++) {
  172. free(audio_input_buffer[i]);
  173. }
  174. free(audio_input_buffer);
  175. for (i = 0; i < result.audio_output; i++) {
  176. free(audio_output_buffer[i]);
  177. }
  178. free(audio_output_buffer);
  179. exit (0);
  180. }