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.

161 lines
4.6KB

  1. //
  2. // main.m
  3. // iPhoneNet
  4. //
  5. // Created by Stéphane LETZ on 16/02/09.
  6. // Copyright Grame 2009. All rights reserved.
  7. //
  8. #import <UIKit/UIKit.h>
  9. #include <jack/net.h>
  10. #include "TiPhoneCoreAudioRenderer.h"
  11. #define NUM_INPUT 2
  12. #define NUM_OUTPUT 2
  13. jack_net_master_t* net;
  14. jack_adapter_t* adapter;
  15. float** audio_input_buffer = NULL;
  16. float** audio_output_buffer = NULL;
  17. int buffer_size = 1024;
  18. int sample_rate = 22050;
  19. //int sample_rate = 32000;
  20. jack_master_t request = { buffer_size, sample_rate, "master" };
  21. jack_slave_t result;
  22. static void MixAudio(float** dst, float** src1, float** src2, int channels, int buffer_size)
  23. {
  24. for (int chan = 0; chan < channels; chan++) {
  25. for (int frame = 0; frame < buffer_size; frame++) {
  26. dst[chan][frame] = src1[chan][frame] + src2[chan][frame];
  27. }
  28. }
  29. }
  30. static void MasterAudioCallback(int frames, float** inputs, float** outputs, void* arg)
  31. {
  32. int i;
  33. // Copy from iPod input to network buffers
  34. for (i = 0; i < result.audio_input; i++) {
  35. memcpy(audio_input_buffer[i], inputs[i], buffer_size * sizeof(float));
  36. }
  37. /*
  38. // Copy from network out buffers to network in buffers (audio thru)
  39. for (i = 0; i < result.audio_input; i++) {
  40. memcpy(audio_input_buffer[i], audio_output_buffer[i], buffer_size * sizeof(float));
  41. }
  42. */
  43. // Mix iPod input and network in buffers to network out buffers
  44. //MixAudio(audio_input_buffer, inputs, audio_output_buffer, result.audio_input, buffer_size);
  45. // Send network buffers
  46. if (jack_net_master_send(net, result.audio_input, audio_input_buffer, 0, NULL) < 0) {
  47. printf("jack_net_master_send error..\n");
  48. }
  49. // Recv network buffers
  50. if (jack_net_master_recv(net, result.audio_output, audio_output_buffer, 0, NULL) < 0) {
  51. printf("jack_net_master_recv error..\n");
  52. }
  53. // Copy from network buffers to iPod output
  54. for (i = 0; i < result.audio_output; i++) {
  55. memcpy(outputs[i], audio_output_buffer[i], buffer_size * sizeof(float));
  56. }
  57. }
  58. int main(int argc, char *argv[]) {
  59. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  60. int i;
  61. int wait_usec = (unsigned long)((((float)buffer_size) / ((float)sample_rate)) * 1000000.0f);
  62. if ((net = jack_net_master_open(DEFAULT_MULTICAST_IP, DEFAULT_PORT, "iPhone", &request, &result)) == 0) {
  63. printf("jack_net_master_open error..\n");
  64. return -1;
  65. }
  66. TiPhoneCoreAudioRenderer audio_device(result.audio_input, result.audio_output);
  67. // Allocate buffers
  68. if (result.audio_input > 0) {
  69. audio_input_buffer = (float**)calloc(result.audio_input, sizeof(float*));
  70. for (i = 0; i < result.audio_input; i++) {
  71. audio_input_buffer[i] = (float*)(calloc(buffer_size, sizeof(float)));
  72. }
  73. }
  74. if (result.audio_output > 0) {
  75. audio_output_buffer = (float**)calloc(result.audio_output, sizeof(float*));
  76. for (i = 0; i < result.audio_output; i++) {
  77. audio_output_buffer[i] = (float*)(calloc(buffer_size, sizeof(float)));
  78. }
  79. }
  80. if (audio_device.Open(buffer_size, sample_rate) < 0) {
  81. return -1;
  82. }
  83. audio_device.SetAudioCallback(MasterAudioCallback, NULL);
  84. if (audio_device.Start() < 0) {
  85. return -1;
  86. }
  87. // Run until interrupted
  88. //while (1) {}
  89. /*
  90. // Quite brutal way, the application actually does not start completely, the netjack audio processing loop is used instead...
  91. // Run until interrupted
  92. while (1) {
  93. // Copy input to output
  94. for (i = 0; i < result.audio_input; i++) {
  95. memcpy(audio_output_buffer[i], audio_input_buffer[i], buffer_size * sizeof(float));
  96. }
  97. if (jack_net_master_send(net, result.audio_output, audio_output_buffer, 0, NULL) < 0) {
  98. printf("jack_net_master_send error..\n");
  99. }
  100. if (jack_net_master_recv(net, result.audio_input, audio_input_buffer, 0, NULL) < 0) {
  101. printf("jack_net_master_recv error..\n");
  102. }
  103. usleep(wait_usec);
  104. };
  105. */
  106. int retVal = UIApplicationMain(argc, argv, nil, nil);
  107. audio_device.Stop();
  108. audio_device.Close();
  109. // Wait for application end
  110. jack_net_master_close(net);
  111. for (i = 0; i < result.audio_input; i++) {
  112. free(audio_input_buffer[i]);
  113. }
  114. free(audio_input_buffer);
  115. for (i = 0; i < result.audio_output; i++) {
  116. free(audio_output_buffer[i]);
  117. }
  118. free(audio_output_buffer);
  119. [pool release];
  120. return retVal;
  121. }