// // main.m // iPhoneNet // // Created by Stéphane LETZ on 16/02/09. // Copyright Grame 2009. All rights reserved. // #import #include #include "TiPhoneCoreAudioRenderer.h" #define NUM_INPUT 2 #define NUM_OUTPUT 2 jack_net_master_t* net; jack_adapter_t* adapter; float** audio_input_buffer = NULL; float** audio_output_buffer = NULL; int buffer_size = 1024; int sample_rate = 22050; //int sample_rate = 32000; jack_master_t request = { -1, -1, -1, -1, buffer_size, sample_rate, "master" }; jack_slave_t result; static void MixAudio(float** dst, float** src1, float** src2, int channels, int buffer_size) { for (int chan = 0; chan < channels; chan++) { for (int frame = 0; frame < buffer_size; frame++) { dst[chan][frame] = src1[chan][frame] + src2[chan][frame]; } } } static void MasterAudioCallback(int frames, float** inputs, float** outputs, void* arg) { int i; // Copy from iPod input to network buffers for (i = 0; i < result.audio_input; i++) { memcpy(audio_input_buffer[i], inputs[i], buffer_size * sizeof(float)); } /* // Copy from network out buffers to network in buffers (audio thru) for (i = 0; i < result.audio_input; i++) { memcpy(audio_input_buffer[i], audio_output_buffer[i], buffer_size * sizeof(float)); } */ // Mix iPod input and network in buffers to network out buffers //MixAudio(audio_input_buffer, inputs, audio_output_buffer, result.audio_input, buffer_size); // Send network buffers if (jack_net_master_send(net, result.audio_input, audio_input_buffer, 0, NULL) < 0) { printf("jack_net_master_send error..\n"); } // Recv network buffers if (jack_net_master_recv(net, result.audio_output, audio_output_buffer, 0, NULL) < 0) { printf("jack_net_master_recv error..\n"); } // Copy from network buffers to iPod output for (i = 0; i < result.audio_output; i++) { memcpy(outputs[i], audio_output_buffer[i], buffer_size * sizeof(float)); } } int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int i; if ((net = jack_net_master_open(DEFAULT_MULTICAST_IP, DEFAULT_PORT, "iPhone", &request, &result)) == 0) { printf("jack_net_master_open error..\n"); return -1; } TiPhoneCoreAudioRenderer audio_device(result.audio_input, result.audio_output); // Allocate buffers if (result.audio_input > 0) { audio_input_buffer = (float**)calloc(result.audio_input, sizeof(float*)); for (i = 0; i < result.audio_input; i++) { audio_input_buffer[i] = (float*)(calloc(buffer_size, sizeof(float))); } } if (result.audio_output > 0) { audio_output_buffer = (float**)calloc(result.audio_output, sizeof(float*)); for (i = 0; i < result.audio_output; i++) { audio_output_buffer[i] = (float*)(calloc(buffer_size, sizeof(float))); } } if (audio_device.Open(buffer_size, sample_rate) < 0) { return -1; } audio_device.SetAudioCallback(MasterAudioCallback, NULL); if (audio_device.Start() < 0) { return -1; } /* // Quite brutal way, the application actually does not start completely, the netjack audio processing loop is used instead... // Run until interrupted int wait_usec = (unsigned long)((((float)buffer_size) / ((float)sample_rate)) * 1000000.0f); while (1) { // Copy input to output for (i = 0; i < result.audio_input; i++) { memcpy(audio_output_buffer[i], audio_input_buffer[i], buffer_size * sizeof(float)); } if (jack_net_master_send(net, result.audio_output, audio_output_buffer, 0, NULL) < 0) { printf("jack_net_master_send error..\n"); } if (jack_net_master_recv(net, result.audio_input, audio_input_buffer, 0, NULL) < 0) { printf("jack_net_master_recv error..\n"); } usleep(wait_usec); }; */ int retVal = UIApplicationMain(argc, argv, nil, nil); audio_device.Stop(); audio_device.Close(); // Wait for application end jack_net_master_close(net); for (i = 0; i < result.audio_input; i++) { free(audio_input_buffer[i]); } free(audio_input_buffer); for (i = 0; i < result.audio_output; i++) { free(audio_output_buffer[i]); } free(audio_output_buffer); [pool release]; return retVal; }