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.

129 lines
3.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;
  16. float** audio_output_buffer;
  17. int buffer_size = 4096;
  18. int sample_rate = 44100;
  19. jack_master_t request = { buffer_size, sample_rate, "master" };
  20. jack_slave_t result;
  21. static void MasterAudioCallback(int frames, float** inputs, float** outputs, void* arg)
  22. {
  23. int i;
  24. // Copy from iPod input to network
  25. for (i = 0; i < result.audio_input; i++) {
  26. memcpy(audio_output_buffer[i], inputs[i], buffer_size * sizeof(float));
  27. }
  28. if (jack_net_master_send(net, result.audio_output, audio_output_buffer, 0, NULL) < 0) {
  29. printf("jack_net_master_send error..\n");
  30. }
  31. // Copy from network to iPod output
  32. if (jack_net_master_recv(net, result.audio_input, audio_input_buffer, 0, NULL) < 0) {
  33. printf("jack_net_master_recv error..\n");
  34. }
  35. for (i = 0; i < result.audio_output; i++) {
  36. memcpy(outputs[i], audio_input_buffer[i], buffer_size * sizeof(float));
  37. }
  38. }
  39. int main(int argc, char *argv[]) {
  40. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  41. int i;
  42. int wait_usec = (unsigned long)((((float)buffer_size) / ((float)sample_rate)) * 1000000.0f);
  43. TiPhoneCoreAudioRenderer audio_device(NUM_INPUT, NUM_OUTPUT);
  44. if ((net = jack_net_master_open(DEFAULT_MULTICAST_IP, DEFAULT_PORT, "iPhone", &request, &result)) == 0) {
  45. return -1;
  46. }
  47. // Allocate buffers
  48. audio_input_buffer = (float**)calloc(result.audio_input, sizeof(float*));
  49. for (i = 0; i < result.audio_input; i++) {
  50. audio_input_buffer[i] = (float*)(calloc(buffer_size, sizeof(float)));
  51. }
  52. audio_output_buffer = (float**)calloc(result.audio_output, sizeof(float*));
  53. for (i = 0; i < result.audio_output; i++) {
  54. audio_output_buffer[i] = (float*)(calloc(buffer_size, sizeof(float)));
  55. }
  56. if (audio_device.OpenDefault(buffer_size, sample_rate) < 0) {
  57. return -1;
  58. }
  59. audio_device.SetAudioCallback(MasterAudioCallback, NULL);
  60. if (audio_device.Start() < 0) {
  61. return -1;
  62. }
  63. // Run until interrupted
  64. while (1) {}
  65. /*
  66. // Quite brutal way, the application actually does not start completely, the netjack audio processing loop is used instead...
  67. // Run until interrupted
  68. while (1) {
  69. // Copy input to output
  70. for (i = 0; i < result.audio_input; i++) {
  71. memcpy(audio_output_buffer[i], audio_input_buffer[i], buffer_size * sizeof(float));
  72. }
  73. if (jack_net_master_send(net, result.audio_output, audio_output_buffer, 0, NULL) < 0) {
  74. printf("jack_net_master_send error..\n");
  75. }
  76. if (jack_net_master_recv(net, result.audio_input, audio_input_buffer, 0, NULL) < 0) {
  77. printf("jack_net_master_recv error..\n");
  78. }
  79. usleep(wait_usec);
  80. };
  81. */
  82. audio_device.Stop();
  83. audio_device.Close();
  84. int retVal = UIApplicationMain(argc, argv, nil, nil);
  85. // Wait for application end
  86. jack_net_master_close(net);
  87. for (i = 0; i < result.audio_input; i++) {
  88. free(audio_input_buffer[i]);
  89. }
  90. free(audio_input_buffer);
  91. for (i = 0; i < result.audio_output; i++) {
  92. free(audio_output_buffer[i]);
  93. }
  94. free(audio_output_buffer);
  95. [pool release];
  96. return retVal;
  97. }