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.

209 lines
5.5KB

  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. jack_net_master_t* net;
  29. #define BUFFER_SIZE 512
  30. #define SAMPLE_RATE 44100
  31. static void signal_handler(int sig)
  32. {
  33. jack_net_master_close(net);
  34. fprintf(stderr, "signal received, exiting ...\n");
  35. exit(0);
  36. }
  37. static void
  38. usage ()
  39. {
  40. fprintf (stderr, "\n"
  41. "usage: jack_net_master \n"
  42. " [ -b buffer size (default = %d) ]\n"
  43. " [ -r sample rate (default = %d) ]\n"
  44. " [ -a hostname (default = %s) ]\n"
  45. " [ -p port (default = %d) ]\n", BUFFER_SIZE, SAMPLE_RATE, DEFAULT_MULTICAST_IP, DEFAULT_PORT);
  46. }
  47. int
  48. main (int argc, char *argv[])
  49. {
  50. int buffer_size = BUFFER_SIZE;
  51. int sample_rate = SAMPLE_RATE;
  52. int udp_port = DEFAULT_PORT;
  53. const char* multicast_ip = DEFAULT_MULTICAST_IP;
  54. const char *options = "b:r:a:p:h";
  55. int option_index;
  56. int opt;
  57. struct option long_options[] =
  58. {
  59. {"buffer size", 1, 0, 'b'},
  60. {"sample rate", 1, 0, 'r'},
  61. {"hostname", 1, 0, 'a'},
  62. {"port", 1, 0, 'p'},
  63. {0, 0, 0, 0}
  64. };
  65. while ((opt = getopt_long (argc, argv, options, long_options, &option_index)) != -1) {
  66. switch (opt) {
  67. case 'b':
  68. buffer_size = atoi(optarg);
  69. break;
  70. case 'r':
  71. sample_rate = atoi(optarg);
  72. break;
  73. case 'a':
  74. multicast_ip = strdup(optarg);
  75. break;
  76. case 'p':
  77. udp_port = atoi(optarg);
  78. break;
  79. case 'h':
  80. usage();
  81. return -1;
  82. }
  83. }
  84. int i;
  85. //jack_master_t request = { 4, 4, -1, -1, buffer_size, sample_rate, "master", -1 };
  86. jack_master_t request = { -1, -1, -1, -1, buffer_size, sample_rate, "net_master", 6, true };
  87. jack_slave_t result;
  88. float** audio_input_buffer;
  89. float** audio_output_buffer;
  90. int wait_usec = (int) ((((float)buffer_size) * 1000000) / ((float)sample_rate));
  91. printf("Waiting for a slave...\n");
  92. if ((net = jack_net_master_open(multicast_ip, udp_port, &request, &result)) == 0) {
  93. fprintf(stderr, "NetJack master can not be opened\n");
  94. return 1;
  95. }
  96. printf("Slave is running...\n");
  97. /* install a signal handler to properly quits jack client */
  98. #ifdef WIN32
  99. signal(SIGINT, signal_handler);
  100. signal(SIGABRT, signal_handler);
  101. signal(SIGTERM, signal_handler);
  102. #else
  103. signal(SIGQUIT, signal_handler);
  104. signal(SIGTERM, signal_handler);
  105. signal(SIGHUP, signal_handler);
  106. signal(SIGINT, signal_handler);
  107. #endif
  108. // Allocate buffers
  109. audio_input_buffer = (float**)calloc(result.audio_input, sizeof(float*));
  110. for (i = 0; i < result.audio_input; i++) {
  111. audio_input_buffer[i] = (float*)calloc(buffer_size, sizeof(float));
  112. }
  113. audio_output_buffer = (float**)calloc(result.audio_output, sizeof(float*));
  114. for (i = 0; i < result.audio_output; i++) {
  115. audio_output_buffer[i] = (float*)calloc(buffer_size, sizeof(float));
  116. }
  117. /*
  118. Run until interrupted.
  119. WARNING !! : this code is given for demonstration purpose. For proper timing bevahiour
  120. it has to be called in a real-time context (which is *not* the case here...)
  121. */
  122. //usleep(5*1000000);
  123. printf("Wait...\n");
  124. //sleep(10);
  125. usleep(1000000);
  126. printf("Wait...OK\n");
  127. while (1) {
  128. // Copy input to output
  129. assert(result.audio_input == result.audio_output);
  130. for (i = 0; i < result.audio_input; i++) {
  131. memcpy(audio_output_buffer[i], audio_input_buffer[i], buffer_size * sizeof(float));
  132. }
  133. /*
  134. if (jack_net_master_send(net, result.audio_output, audio_output_buffer, 0, NULL) < 0) {
  135. printf("jack_net_master_send failure, exiting\n");
  136. break;
  137. }
  138. usleep(10000);
  139. if (jack_net_master_recv(net, result.audio_input, audio_input_buffer, 0, NULL) < 0) {
  140. printf("jack_net_master_recv failure, exiting\n");
  141. break;
  142. }
  143. */
  144. if (jack_net_master_send_slice(net, result.audio_output, audio_output_buffer, 0, NULL, BUFFER_SIZE/2) < 0) {
  145. printf("jack_net_master_send failure, exiting\n");
  146. break;
  147. }
  148. usleep(10000);
  149. if (jack_net_master_recv_slice(net, result.audio_input, audio_input_buffer, 0, NULL, BUFFER_SIZE/2) < 0) {
  150. printf("jack_net_master_recv failure, exiting\n");
  151. break;
  152. }
  153. usleep(wait_usec);
  154. };
  155. // Wait for application end
  156. jack_net_master_close(net);
  157. for (i = 0; i < result.audio_input; i++) {
  158. free(audio_input_buffer[i]);
  159. }
  160. free(audio_input_buffer);
  161. for (i = 0; i < result.audio_output; i++) {
  162. free(audio_output_buffer[i]);
  163. }
  164. free(audio_output_buffer);
  165. exit (0);
  166. }