git-svn-id: http://subversion.jackaudio.org/jack/jack2/branches/libjacknet@3956 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.9.8
@@ -145,6 +145,10 @@ struct JackNetExtMaster : public JackNetMasterInterface { | |||||
fSocket.SetPort(port); | fSocket.SetPort(port); | ||||
fRequest.buffer_size = request->buffer_size; | fRequest.buffer_size = request->buffer_size; | ||||
fRequest.sample_rate = request->sample_rate; | fRequest.sample_rate = request->sample_rate; | ||||
fAudioCaptureBuffer = NULL; | |||||
fAudioPlaybackBuffer = NULL; | |||||
fMidiCaptureBuffer = NULL; | |||||
fMidiPlaybackBuffer = NULL; | |||||
} | } | ||||
virtual ~JackNetExtMaster() | virtual ~JackNetExtMaster() | ||||
@@ -283,28 +287,36 @@ struct JackNetExtMaster : public JackNetMasterInterface { | |||||
unsigned int port_index; | unsigned int port_index; | ||||
// Set buffers | // Set buffers | ||||
fAudioPlaybackBuffer = new float*[fParams.fSendAudioChannels]; | |||||
for (port_index = 0; port_index < fParams.fSendAudioChannels; port_index++) { | |||||
fAudioPlaybackBuffer[port_index] = new float[fParams.fPeriodSize]; | |||||
fNetAudioPlaybackBuffer->SetBuffer(port_index, fAudioPlaybackBuffer[port_index]); | |||||
if (fParams.fSendAudioChannels > 0) { | |||||
fAudioCaptureBuffer = new float*[fParams.fSendAudioChannels]; | |||||
for (port_index = 0; port_index < fParams.fSendAudioChannels; port_index++) { | |||||
fAudioCaptureBuffer[port_index] = new float[fParams.fPeriodSize]; | |||||
fNetAudioCaptureBuffer->SetBuffer(port_index, fAudioCaptureBuffer[port_index]); | |||||
} | |||||
} | } | ||||
fMidiPlaybackBuffer = new JackMidiBuffer*[fParams.fSendMidiChannels]; | |||||
for (port_index = 0; port_index < fParams.fSendMidiChannels; port_index++) { | |||||
fMidiPlaybackBuffer[port_index] = (JackMidiBuffer*)new float[fParams.fPeriodSize]; | |||||
fNetMidiPlaybackBuffer->SetBuffer(port_index, fMidiPlaybackBuffer[port_index]); | |||||
if (fParams.fSendMidiChannels > 0) { | |||||
fMidiCaptureBuffer = new JackMidiBuffer*[fParams.fSendMidiChannels]; | |||||
for (port_index = 0; port_index < fParams.fSendMidiChannels; port_index++) { | |||||
fMidiCaptureBuffer[port_index] = (JackMidiBuffer*)new float[fParams.fPeriodSize]; | |||||
fNetMidiCaptureBuffer->SetBuffer(port_index, fMidiCaptureBuffer[port_index]); | |||||
} | |||||
} | } | ||||
fAudioCaptureBuffer = new float*[fParams.fReturnAudioChannels]; | |||||
for (port_index = 0; port_index < fParams.fReturnAudioChannels; port_index++) { | |||||
fAudioCaptureBuffer[port_index] = new float[fParams.fPeriodSize]; | |||||
fNetAudioCaptureBuffer->SetBuffer(port_index, fAudioCaptureBuffer[port_index]); | |||||
} | |||||
if (fParams.fReturnAudioChannels > 0) { | |||||
fAudioPlaybackBuffer = new float*[fParams.fReturnAudioChannels]; | |||||
for (port_index = 0; port_index < fParams.fReturnAudioChannels; port_index++) { | |||||
fAudioPlaybackBuffer[port_index] = new float[fParams.fPeriodSize]; | |||||
fNetAudioPlaybackBuffer->SetBuffer(port_index, fAudioPlaybackBuffer[port_index]); | |||||
} | |||||
} | |||||
fMidiCaptureBuffer = new JackMidiBuffer*[fParams.fReturnMidiChannels]; | |||||
for (port_index = 0; port_index < fParams.fReturnMidiChannels; port_index++) { | |||||
fMidiCaptureBuffer[port_index] = (JackMidiBuffer*)new float[fParams.fPeriodSize]; | |||||
fNetMidiCaptureBuffer->SetBuffer(port_index, fMidiCaptureBuffer[port_index]); | |||||
if (fParams.fReturnMidiChannels > 0) { | |||||
fMidiPlaybackBuffer = new JackMidiBuffer*[fParams.fReturnMidiChannels]; | |||||
for (port_index = 0; port_index < fParams.fReturnMidiChannels; port_index++) { | |||||
fMidiPlaybackBuffer[port_index] = (JackMidiBuffer*)new float[fParams.fPeriodSize]; | |||||
fNetMidiPlaybackBuffer->SetBuffer(port_index, fMidiPlaybackBuffer[port_index]); | |||||
} | |||||
} | } | ||||
} | } | ||||
@@ -344,14 +356,13 @@ struct JackNetExtMaster : public JackNetMasterInterface { | |||||
int Read(int audio_input, float** audio_input_buffer, int midi_input, void** midi_input_buffer) | int Read(int audio_input, float** audio_input_buffer, int midi_input, void** midi_input_buffer) | ||||
{ | { | ||||
try { | try { | ||||
assert((unsigned int)audio_input == fParams.fSendAudioChannels); | |||||
int port_index; | |||||
assert((unsigned int)audio_input == fParams.fReturnAudioChannels); | |||||
for (port_index = 0; port_index < audio_input; port_index++) { | |||||
for (int port_index = 0; port_index < audio_input; port_index++) { | |||||
fNetAudioPlaybackBuffer->SetBuffer(port_index, audio_input_buffer[port_index]); | fNetAudioPlaybackBuffer->SetBuffer(port_index, audio_input_buffer[port_index]); | ||||
} | } | ||||
for (port_index = 0; port_index < midi_input; port_index++) { | |||||
for (int port_index = 0; port_index < midi_input; port_index++) { | |||||
fNetMidiPlaybackBuffer->SetBuffer(port_index, ((JackMidiBuffer**)midi_input_buffer)[port_index]); | fNetMidiPlaybackBuffer->SetBuffer(port_index, ((JackMidiBuffer**)midi_input_buffer)[port_index]); | ||||
} | } | ||||
@@ -370,14 +381,13 @@ struct JackNetExtMaster : public JackNetMasterInterface { | |||||
int Write(int audio_output, float** audio_output_buffer, int midi_output, void** midi_output_buffer) | int Write(int audio_output, float** audio_output_buffer, int midi_output, void** midi_output_buffer) | ||||
{ | { | ||||
try { | try { | ||||
assert((unsigned int)audio_output == fParams.fReturnAudioChannels); | |||||
int port_index; | |||||
assert((unsigned int)audio_output == fParams.fSendAudioChannels); | |||||
for (port_index = 0; port_index < audio_output; port_index++) { | |||||
for (int port_index = 0; port_index < audio_output; port_index++) { | |||||
fNetAudioCaptureBuffer->SetBuffer(port_index, audio_output_buffer[port_index]); | fNetAudioCaptureBuffer->SetBuffer(port_index, audio_output_buffer[port_index]); | ||||
} | } | ||||
for (port_index = 0; port_index < midi_output; port_index++) { | |||||
for (int port_index = 0; port_index < midi_output; port_index++) { | |||||
fNetMidiCaptureBuffer->SetBuffer(port_index, ((JackMidiBuffer**)midi_output_buffer)[port_index]); | fNetMidiCaptureBuffer->SetBuffer(port_index, ((JackMidiBuffer**)midi_output_buffer)[port_index]); | ||||
} | } | ||||
@@ -40,8 +40,8 @@ namespace Jack | |||||
fSocket.GetName ( fParams.fSlaveNetName ); | fSocket.GetName ( fParams.fSlaveNetName ); | ||||
fParams.fMtu = DEFAULT_MTU; | fParams.fMtu = DEFAULT_MTU; | ||||
fParams.fTransportSync = 0; | fParams.fTransportSync = 0; | ||||
fParams.fSendAudioChannels = 2; | |||||
fParams.fReturnAudioChannels = 2; | |||||
int send_audio = -1; | |||||
int return_audio = -1; | |||||
fParams.fSendMidiChannels = 0; | fParams.fSendMidiChannels = 0; | ||||
fParams.fReturnMidiChannels = 0; | fParams.fReturnMidiChannels = 0; | ||||
fParams.fSampleRate = sample_rate; | fParams.fSampleRate = sample_rate; | ||||
@@ -71,10 +71,10 @@ namespace Jack | |||||
fParams.fMtu = param->value.i; | fParams.fMtu = param->value.i; | ||||
break; | break; | ||||
case 'C' : | case 'C' : | ||||
fParams.fSendAudioChannels = param->value.i; | |||||
send_audio = param->value.i; | |||||
break; | break; | ||||
case 'P' : | case 'P' : | ||||
fParams.fReturnAudioChannels = param->value.i; | |||||
return_audio = param->value.i; | |||||
break; | break; | ||||
case 'n' : | case 'n' : | ||||
strncpy ( fParams.fName, param->value.str, JACK_CLIENT_NAME_SIZE ); | strncpy ( fParams.fName, param->value.str, JACK_CLIENT_NAME_SIZE ); | ||||
@@ -105,7 +105,13 @@ namespace Jack | |||||
//set the socket parameters | //set the socket parameters | ||||
fSocket.SetPort ( port ); | fSocket.SetPort ( port ); | ||||
fSocket.SetAddress ( fMulticastIP, port ); | fSocket.SetAddress ( fMulticastIP, port ); | ||||
// If not set, takes deafault | |||||
fParams.fSendAudioChannels = (send_audio == -1) ? 2 : send_audio; | |||||
// If not set, takes deafault | |||||
fParams.fReturnAudioChannels = (return_audio == -1) ? 2 : return_audio; | |||||
//set the audio adapter interface channel values | //set the audio adapter interface channel values | ||||
SetInputs ( fParams.fSendAudioChannels ); | SetInputs ( fParams.fSendAudioChannels ); | ||||
SetOutputs ( fParams.fReturnAudioChannels ); | SetOutputs ( fParams.fReturnAudioChannels ); | ||||
@@ -215,17 +221,22 @@ namespace Jack | |||||
} | } | ||||
//set buffers | //set buffers | ||||
fSoftCaptureBuffer = new sample_t*[fCaptureChannels]; | |||||
for ( port_index = 0; port_index < fCaptureChannels; port_index++ ) | |||||
{ | |||||
fSoftCaptureBuffer[port_index] = new sample_t[fParams.fPeriodSize]; | |||||
fNetAudioCaptureBuffer->SetBuffer ( port_index, fSoftCaptureBuffer[port_index] ); | |||||
if (fCaptureChannels > 0) { | |||||
fSoftCaptureBuffer = new sample_t*[fCaptureChannels]; | |||||
for ( port_index = 0; port_index < fCaptureChannels; port_index++ ) | |||||
{ | |||||
fSoftCaptureBuffer[port_index] = new sample_t[fParams.fPeriodSize]; | |||||
fNetAudioCaptureBuffer->SetBuffer ( port_index, fSoftCaptureBuffer[port_index] ); | |||||
} | |||||
} | } | ||||
fSoftPlaybackBuffer = new sample_t*[fPlaybackChannels]; | |||||
for ( port_index = 0; port_index < fCaptureChannels; port_index++ ) | |||||
{ | |||||
fSoftPlaybackBuffer[port_index] = new sample_t[fParams.fPeriodSize]; | |||||
fNetAudioPlaybackBuffer->SetBuffer ( port_index, fSoftPlaybackBuffer[port_index] ); | |||||
if (fPlaybackChannels > 0) { | |||||
fSoftPlaybackBuffer = new sample_t*[fPlaybackChannels]; | |||||
for ( port_index = 0; port_index < fPlaybackChannels; port_index++ ) | |||||
{ | |||||
fSoftPlaybackBuffer[port_index] = new sample_t[fParams.fPeriodSize]; | |||||
fNetAudioPlaybackBuffer->SetBuffer ( port_index, fSoftPlaybackBuffer[port_index] ); | |||||
} | |||||
} | } | ||||
//set audio adapter parameters | //set audio adapter parameters | ||||
@@ -1983,7 +1983,7 @@ extern "C" | |||||
bool capture = false; | bool capture = false; | ||||
bool playback = false; | bool playback = false; | ||||
int chan_in = -1; // Default: if not explicitely set, then max possible will be used... | int chan_in = -1; // Default: if not explicitely set, then max possible will be used... | ||||
int chan_out = -1; // Default: ifĂ not explicitely set, then max possible will be used... | |||||
int chan_out = -1; // Default: if not explicitely set, then max possible will be used... | |||||
bool monitor = false; | bool monitor = false; | ||||
const char* capture_driver_uid = ""; | const char* capture_driver_uid = ""; | ||||
const char* playback_driver_uid = ""; | const char* playback_driver_uid = ""; | ||||
@@ -80,14 +80,14 @@ OSStatus TiPhoneCoreAudioRenderer::Render(void *inRefCon, | |||||
AudioBufferList *ioData) | AudioBufferList *ioData) | ||||
{ | { | ||||
TiPhoneCoreAudioRendererPtr renderer = (TiPhoneCoreAudioRendererPtr)inRefCon; | TiPhoneCoreAudioRendererPtr renderer = (TiPhoneCoreAudioRendererPtr)inRefCon; | ||||
AudioUnitRender(renderer->fAUHAL, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData); | |||||
AudioUnitRender(renderer->fAUHAL, ioActionFlags, inTimeStamp, 1, inNumberFrames, renderer->fCAInputData); | |||||
float coef = float(LONG_MAX); | float coef = float(LONG_MAX); | ||||
float inv_coef = 1.f/float(LONG_MAX); | float inv_coef = 1.f/float(LONG_MAX); | ||||
for (int chan = 0; chan < renderer->fDevNumInChans; chan++) { | for (int chan = 0; chan < renderer->fDevNumInChans; chan++) { | ||||
for (int frame = 0; frame < inNumberFrames; frame++) { | for (int frame = 0; frame < inNumberFrames; frame++) { | ||||
renderer->fInChannel[chan][frame] = float(((long*)ioData->mBuffers[chan].mData)[frame]) * inv_coef; | |||||
renderer->fInChannel[chan][frame] = float(((int*)renderer->fCAInputData->mBuffers[chan].mData)[frame]) * inv_coef; | |||||
} | } | ||||
} | } | ||||
@@ -95,7 +95,7 @@ OSStatus TiPhoneCoreAudioRenderer::Render(void *inRefCon, | |||||
for (int chan = 0; chan < renderer->fDevNumOutChans; chan++) { | for (int chan = 0; chan < renderer->fDevNumOutChans; chan++) { | ||||
for (int frame = 0; frame < inNumberFrames; frame++) { | for (int frame = 0; frame < inNumberFrames; frame++) { | ||||
((long*)ioData->mBuffers[chan].mData)[frame] = long(renderer->fOutChannel[chan][frame] * coef); | |||||
((int*)ioData->mBuffers[chan].mData)[frame] = int(renderer->fOutChannel[chan][frame] * coef); | |||||
} | } | ||||
} | } | ||||
@@ -326,7 +326,7 @@ int TiPhoneCoreAudioRenderer::Open(int bufferSize, int samplerate) | |||||
printError(err1); | printError(err1); | ||||
} | } | ||||
} | } | ||||
if (fDevNumInChans > 0 && fDevNumOutChans == 0) { | if (fDevNumInChans > 0 && fDevNumOutChans == 0) { | ||||
AURenderCallbackStruct output; | AURenderCallbackStruct output; | ||||
output.inputProc = Render; | output.inputProc = Render; | ||||
@@ -348,6 +348,25 @@ int TiPhoneCoreAudioRenderer::Open(int bufferSize, int samplerate) | |||||
goto error; | goto error; | ||||
} | } | ||||
} | } | ||||
// Prepare buffers | |||||
fCAInputData = (AudioBufferList*)malloc(sizeof(UInt32) + fDevNumInChans * sizeof(AudioBuffer)); | |||||
fCAInputData->mNumberBuffers = fDevNumInChans; | |||||
for (int i = 0; i < fDevNumInChans; i++) { | |||||
fCAInputData->mBuffers[i].mNumberChannels = 1; | |||||
fCAInputData->mBuffers[i].mDataByteSize = bufferSize * sizeof(int); | |||||
fCAInputData->mBuffers[i].mData = malloc(bufferSize * sizeof(int)); | |||||
} | |||||
/* | |||||
// Add listeners | |||||
err1 = AudioDeviceAddPropertyListener(fDeviceID, 0, true, kAudioDeviceProcessorOverload, DeviceNotificationCallback, this); | |||||
if (err != noErr) { | |||||
jack_error("Error calling AudioDeviceAddPropertyListener with kAudioDeviceProcessorOverload"); | |||||
printError(err); | |||||
return -1; | |||||
} | |||||
*/ | |||||
return NO_ERR; | return NO_ERR; | ||||
@@ -41,6 +41,8 @@ class TiPhoneCoreAudioRenderer | |||||
int fDevNumInChans; | int fDevNumInChans; | ||||
int fDevNumOutChans; | int fDevNumOutChans; | ||||
AudioBufferList* fCAInputData; | |||||
float* fInChannel[MAX_CHANNELS]; | float* fInChannel[MAX_CHANNELS]; | ||||
float* fOutChannel[MAX_CHANNELS]; | float* fOutChannel[MAX_CHANNELS]; | ||||
@@ -57,7 +59,7 @@ class TiPhoneCoreAudioRenderer | |||||
public: | public: | ||||
TiPhoneCoreAudioRenderer(int input, int output) | TiPhoneCoreAudioRenderer(int input, int output) | ||||
:fDevNumInChans(input), fDevNumOutChans(output), fAudioCallback(NULL), fCallbackArg(NULL) | |||||
:fAudioCallback(NULL), fCallbackArg(NULL), fDevNumInChans(input), fDevNumOutChans(output), fCAInputData(NULL) | |||||
{ | { | ||||
memset(fInChannel, 0, sizeof(float*) * MAX_CHANNELS); | memset(fInChannel, 0, sizeof(float*) * MAX_CHANNELS); | ||||
memset(fOutChannel, 0, sizeof(float*) * MAX_CHANNELS); | memset(fOutChannel, 0, sizeof(float*) * MAX_CHANNELS); | ||||
@@ -70,6 +72,7 @@ class TiPhoneCoreAudioRenderer | |||||
fOutChannel[i] = new float[8192]; | fOutChannel[i] = new float[8192]; | ||||
} | } | ||||
} | } | ||||
virtual ~TiPhoneCoreAudioRenderer() | virtual ~TiPhoneCoreAudioRenderer() | ||||
{ | { | ||||
for (int i = 0; i < fDevNumInChans; i++) { | for (int i = 0; i < fDevNumInChans; i++) { | ||||
@@ -79,6 +82,13 @@ class TiPhoneCoreAudioRenderer | |||||
for (int i = 0; i < fDevNumOutChans; i++) { | for (int i = 0; i < fDevNumOutChans; i++) { | ||||
delete[] fOutChannel[i]; | delete[] fOutChannel[i]; | ||||
} | } | ||||
if (fCAInputData) { | |||||
for (int i = 0; i < fDevNumInChans; i++) { | |||||
free(fCAInputData->mBuffers[i].mData); | |||||
} | |||||
free(fCAInputData); | |||||
} | |||||
} | } | ||||
int Open(int bufferSize, int sampleRate); | int Open(int bufferSize, int sampleRate); | ||||
@@ -184,9 +184,7 @@ | |||||
4BCB37D8112D64D8008C7BC1 /* iphone-faust.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "iphone-faust.mm"; sourceTree = SOURCE_ROOT; }; | 4BCB37D8112D64D8008C7BC1 /* iphone-faust.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "iphone-faust.mm"; sourceTree = SOURCE_ROOT; }; | ||||
4BCF75F210BC2FD90082C526 /* iPhoneThruNet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iPhoneThruNet.app; sourceTree = BUILT_PRODUCTS_DIR; }; | 4BCF75F210BC2FD90082C526 /* iPhoneThruNet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iPhoneThruNet.app; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
4BCF75F610BC30140082C526 /* audio_thru.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = audio_thru.mm; sourceTree = SOURCE_ROOT; }; | 4BCF75F610BC30140082C526 /* audio_thru.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = audio_thru.mm; sourceTree = SOURCE_ROOT; }; | ||||
4BDFCCD7113DB30500D77992 /* Info copy.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info copy.plist"; sourceTree = "<group>"; }; | |||||
4BDFCD57113DB6B700D77992 /* NetJackSlave.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NetJackSlave.app; sourceTree = BUILT_PRODUCTS_DIR; }; | 4BDFCD57113DB6B700D77992 /* NetJackSlave.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NetJackSlave.app; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
4BDFCD59113DB6B700D77992 /* Info copy 2.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info copy 2.plist"; sourceTree = "<group>"; }; | |||||
4BF1360E0F4B0B4C00218A3F /* JackAudioAdapterInterface.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackAudioAdapterInterface.cpp; path = ../../common/JackAudioAdapterInterface.cpp; sourceTree = SOURCE_ROOT; }; | 4BF1360E0F4B0B4C00218A3F /* JackAudioAdapterInterface.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackAudioAdapterInterface.cpp; path = ../../common/JackAudioAdapterInterface.cpp; sourceTree = SOURCE_ROOT; }; | ||||
4BF136120F4B0B5E00218A3F /* JackAudioAdapterInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackAudioAdapterInterface.h; path = ../../common/JackAudioAdapterInterface.h; sourceTree = SOURCE_ROOT; }; | 4BF136120F4B0B5E00218A3F /* JackAudioAdapterInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackAudioAdapterInterface.h; path = ../../common/JackAudioAdapterInterface.h; sourceTree = SOURCE_ROOT; }; | ||||
4BF1364B0F4B0F7700218A3F /* JackResampler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackResampler.cpp; path = ../../common/JackResampler.cpp; sourceTree = SOURCE_ROOT; }; | 4BF1364B0F4B0F7700218A3F /* JackResampler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackResampler.cpp; path = ../../common/JackResampler.cpp; sourceTree = SOURCE_ROOT; }; | ||||
@@ -354,8 +352,6 @@ | |||||
28AD733E0D9D9553002E5188 /* MainWindow.xib */, | 28AD733E0D9D9553002E5188 /* MainWindow.xib */, | ||||
8D1107310486CEB800E47090 /* Info.plist */, | 8D1107310486CEB800E47090 /* Info.plist */, | ||||
4BC9C1D31135AA1800D22670 /* iPhoneNetMasterAppl-Info.plist */, | 4BC9C1D31135AA1800D22670 /* iPhoneNetMasterAppl-Info.plist */, | ||||
4BDFCCD7113DB30500D77992 /* Info copy.plist */, | |||||
4BDFCD59113DB6B700D77992 /* Info copy 2.plist */, | |||||
); | ); | ||||
name = Resources; | name = Resources; | ||||
sourceTree = "<group>"; | sourceTree = "<group>"; | ||||
@@ -17,37 +17,59 @@ | |||||
jack_net_master_t* net; | jack_net_master_t* net; | ||||
jack_adapter_t* adapter; | jack_adapter_t* adapter; | ||||
float** audio_input_buffer; | |||||
float** audio_output_buffer; | |||||
float** audio_input_buffer = NULL; | |||||
float** audio_output_buffer = NULL; | |||||
int buffer_size = 1024; | |||||
int sample_rate = 44100; | |||||
int buffer_size = 512; | |||||
int sample_rate = 32000; | |||||
//int sample_rate = 32000; | |||||
jack_master_t request = { buffer_size, sample_rate, "master" }; | jack_master_t request = { buffer_size, sample_rate, "master" }; | ||||
jack_slave_t result; | 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) | static void MasterAudioCallback(int frames, float** inputs, float** outputs, void* arg) | ||||
{ | { | ||||
int i; | int i; | ||||
/* | |||||
// Copy from iPod input to network buffers | // Copy from iPod input to network buffers | ||||
for (i = 0; i < result.audio_input; i++) { | for (i = 0; i < result.audio_input; i++) { | ||||
memcpy(audio_output_buffer[i], inputs[i], buffer_size * sizeof(float)); | |||||
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 | // Send network buffers | ||||
if (jack_net_master_send(net, result.audio_output, audio_output_buffer, 0, NULL) < 0) { | |||||
if (jack_net_master_send(net, result.audio_input, audio_input_buffer, 0, NULL) < 0) { | |||||
printf("jack_net_master_send error..\n"); | printf("jack_net_master_send error..\n"); | ||||
} | } | ||||
// Recv network buffers | // Recv network buffers | ||||
if (jack_net_master_recv(net, result.audio_input, audio_input_buffer, 0, NULL) < 0) { | |||||
if (jack_net_master_recv(net, result.audio_output, audio_output_buffer, 0, NULL) < 0) { | |||||
printf("jack_net_master_recv error..\n"); | printf("jack_net_master_recv error..\n"); | ||||
} | } | ||||
// Copy from network buffers to iPod output | // Copy from network buffers to iPod output | ||||
for (i = 0; i < result.audio_output; i++) { | for (i = 0; i < result.audio_output; i++) { | ||||
memcpy(outputs[i], audio_input_buffer[i], buffer_size * sizeof(float)); | |||||
memcpy(outputs[i], audio_output_buffer[i], buffer_size * sizeof(float)); | |||||
} | } | ||||
} | } | ||||
@@ -58,22 +80,26 @@ int main(int argc, char *argv[]) { | |||||
int i; | int i; | ||||
int wait_usec = (unsigned long)((((float)buffer_size) / ((float)sample_rate)) * 1000000.0f); | int wait_usec = (unsigned long)((((float)buffer_size) / ((float)sample_rate)) * 1000000.0f); | ||||
TiPhoneCoreAudioRenderer audio_device(NUM_INPUT, NUM_OUTPUT); | |||||
if ((net = jack_net_master_open(DEFAULT_MULTICAST_IP, DEFAULT_PORT, "iPhone", &request, &result)) == 0) { | if ((net = jack_net_master_open(DEFAULT_MULTICAST_IP, DEFAULT_PORT, "iPhone", &request, &result)) == 0) { | ||||
printf("jack_net_master_open error..\n"); | printf("jack_net_master_open error..\n"); | ||||
return -1; | return -1; | ||||
} | } | ||||
TiPhoneCoreAudioRenderer audio_device(result.audio_input, result.audio_output); | |||||
// Allocate buffers | // Allocate buffers | ||||
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_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))); | |||||
} | |||||
} | } | ||||
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 (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) { | if (audio_device.Open(buffer_size, sample_rate) < 0) { | ||||
@@ -70,7 +70,7 @@ int main(int argc, char *argv[]) { | |||||
//if ((net = jack_net_slave_open("169.254.112.119", DEFAULT_PORT, "iPhone", &request, &result)) == 0) { | //if ((net = jack_net_slave_open("169.254.112.119", DEFAULT_PORT, "iPhone", &request, &result)) == 0) { | ||||
if ((net = jack_net_slave_open(DEFAULT_MULTICAST_IP, DEFAULT_PORT, "iPod", &request, &result)) == 0) { | if ((net = jack_net_slave_open(DEFAULT_MULTICAST_IP, DEFAULT_PORT, "iPod", &request, &result)) == 0) { | ||||
printf("jack_net_slave_open error..\n"); | |||||
printf("jack_net_master_open error..\n"); | |||||
return -1; | return -1; | ||||
} | } | ||||