From bc5ecb8e570e65fb45b6cfdc85783bb53db34682 Mon Sep 17 00:00:00 2001 From: sletz Date: Wed, 24 Feb 2010 20:20:41 +0000 Subject: [PATCH] Streaming from Mac to iPod (in slave mode) now somewhat works. git-svn-id: http://subversion.jackaudio.org/jack/jack2/branches/libjacknet@3924 0c269be4-1314-0410-8aa9-9f06e86f4224 --- common/JackAudioAdapterInterface.cpp | 2 + common/JackAudioAdapterInterface.h | 4 +- common/JackNetAPI.cpp | 20 +++++- .../iPhoneNet.xcodeproj/project.pbxproj | 16 +++-- macosx/iphone/main_master.mm | 2 +- macosx/iphone/main_slave.mm | 63 ++++++++++++++----- 6 files changed, 80 insertions(+), 27 deletions(-) diff --git a/common/JackAudioAdapterInterface.cpp b/common/JackAudioAdapterInterface.cpp index fed62e03..b8df9dd3 100644 --- a/common/JackAudioAdapterInterface.cpp +++ b/common/JackAudioAdapterInterface.cpp @@ -181,6 +181,8 @@ namespace Jack { if (fRingbufferCurSize > DEFAULT_RB_SIZE) fRingbufferCurSize = DEFAULT_RB_SIZE; + + jack_log("JackAudioAdapterInterface::ResetRingBuffers new_size = %ld", fRingbufferCurSize); for (int i = 0; i < fCaptureChannels; i++) fCaptureRingBuffer[i]->Reset(fRingbufferCurSize); diff --git a/common/JackAudioAdapterInterface.h b/common/JackAudioAdapterInterface.h index acf2b400..0412ae6f 100644 --- a/common/JackAudioAdapterInterface.h +++ b/common/JackAudioAdapterInterface.h @@ -129,8 +129,10 @@ namespace Jack fAdaptedSampleRate ( adapted_sample_rate ), fPIControler(host_sample_rate / host_sample_rate, 256), fQuality(0), + fRingbufferCurSize(DEFAULT_ADAPTATIVE_SIZE), fPullAndPushTime(0), - fRunning ( false ) + fRunning(false), + fAdaptative(true) {} virtual ~JackAudioAdapterInterface() diff --git a/common/JackNetAPI.cpp b/common/JackNetAPI.cpp index e780fd46..3ad6e771 100644 --- a/common/JackNetAPI.cpp +++ b/common/JackNetAPI.cpp @@ -746,10 +746,24 @@ struct JackNetAdapter : public JackAudioAdapterInterface { //ringbuffers fCaptureRingBuffer = new JackResampler*[fCaptureChannels]; fPlaybackRingBuffer = new JackResampler*[fPlaybackChannels]; - for (int i = 0; i < fCaptureChannels; i++ ) + + if (fAdaptative) { + AdaptRingBufferSize(); + jack_info("Ringbuffer automatic adaptative mode size = %d frames", fRingbufferCurSize); + } else { + if (fRingbufferCurSize > DEFAULT_RB_SIZE) + fRingbufferCurSize = DEFAULT_RB_SIZE; + jack_info("Fixed ringbuffer size = %d frames", fRingbufferCurSize); + } + + for (int i = 0; i < fCaptureChannels; i++ ) { fCaptureRingBuffer[i] = new JackResampler(); - for (int i = 0; i < fPlaybackChannels; i++ ) + fCaptureRingBuffer[i]->Reset(fRingbufferCurSize); + } + for (int i = 0; i < fPlaybackChannels; i++ ) { fPlaybackRingBuffer[i] = new JackResampler(); + fPlaybackRingBuffer[i]->Reset(fRingbufferCurSize); + } if (fCaptureChannels > 0) jack_log("ReadSpace = %ld", fCaptureRingBuffer[0]->ReadSpace()); @@ -925,7 +939,7 @@ SERVER_EXPORT void jack_log(const char *fmt, ...) { va_list ap; va_start(ap, fmt); - jack_format_and_log(LOG_LEVEL_INFO, "Jack: ", fmt, ap); + //jack_format_and_log(LOG_LEVEL_INFO, "Jack: ", fmt, ap); va_end(ap); } diff --git a/macosx/iphone/iPhoneNet.xcodeproj/project.pbxproj b/macosx/iphone/iPhoneNet.xcodeproj/project.pbxproj index 740dfe19..7463ae57 100755 --- a/macosx/iphone/iPhoneNet.xcodeproj/project.pbxproj +++ b/macosx/iphone/iPhoneNet.xcodeproj/project.pbxproj @@ -27,7 +27,6 @@ 4B0772330F54018C000DC657 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; 4B0772340F54018C000DC657 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B1A95750F49CEAB00D3626B /* AudioToolbox.framework */; }; 4B07724A0F54021B000DC657 /* main_slave.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B0772490F54021B000DC657 /* main_slave.mm */; }; - 4B0772510F54022D000DC657 /* main_master.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B0772500F54022D000DC657 /* main_master.mm */; }; 4B0773860F541EE2000DC657 /* iPhoneNetAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B0773850F541EE2000DC657 /* iPhoneNetAppDelegate.m */; }; 4B0773870F541EE2000DC657 /* iPhoneNetAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B0773850F541EE2000DC657 /* iPhoneNetAppDelegate.m */; }; 4B0773880F541EE2000DC657 /* iPhoneNetAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B0773850F541EE2000DC657 /* iPhoneNetAppDelegate.m */; }; @@ -73,6 +72,7 @@ 4B4146AB10BD3C4300C12F0C /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; 4B4146AC10BD3C4300C12F0C /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B1A95750F49CEAB00D3626B /* AudioToolbox.framework */; }; 4BBDC8FA0F5420C000465F9C /* freeverb.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4BBDC8F90F5420C000465F9C /* freeverb.mm */; }; + 4BC9C1F71135AB2800D22670 /* main_master.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B0772500F54022D000DC657 /* main_master.mm */; }; 4BCB37B6112D647C008C7BC1 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; }; 4BCB37C7112D647C008C7BC1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 4BCB37C8112D647C008C7BC1 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; @@ -161,10 +161,11 @@ 4B2791870F72570C000536B7 /* JackGlobals.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackGlobals.cpp; path = ../../common/JackGlobals.cpp; sourceTree = SOURCE_ROOT; }; 4B4146B010BD3C4300C12F0C /* iPhoneFaustNet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iPhoneFaustNet.app; sourceTree = BUILT_PRODUCTS_DIR; }; 4BBDC8F90F5420C000465F9C /* freeverb.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = freeverb.mm; sourceTree = SOURCE_ROOT; }; + 4BC9C1D31135AA1800D22670 /* iPhoneNetMasterAppl-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "iPhoneNetMasterAppl-Info.plist"; sourceTree = ""; }; 4BCB37CE112D647C008C7BC1 /* iPhoneFaust.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iPhoneFaust.app; sourceTree = BUILT_PRODUCTS_DIR; }; 4BCB37D5112D64B4008C7BC1 /* HardwareClock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HardwareClock.cpp; 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 /* iPhoneFaustNet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iPhoneFaustNet.app; sourceTree = BUILT_PRODUCTS_DIR; }; 4BCF75F610BC30140082C526 /* audio_thru.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = audio_thru.mm; 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; }; @@ -262,7 +263,7 @@ 4BFF45120F4D59DB00106083 /* libjacknet.a */, 4BFF45770F4D5D9700106083 /* iPhoneFaustNet.app */, 4B0772380F54018C000DC657 /* iPhoneNetMaster.app */, - 4BCF75F210BC2FD90082C526 /* iPhoneThruNet.app */, + 4BCF75F210BC2FD90082C526 /* iPhoneFaustNet.app */, 4B4146B010BD3C4300C12F0C /* iPhoneFaustNet.app */, 4BCB37CE112D647C008C7BC1 /* iPhoneFaust.app */, ); @@ -319,6 +320,7 @@ children = ( 28AD733E0D9D9553002E5188 /* MainWindow.xib */, 8D1107310486CEB800E47090 /* Info.plist */, + 4BC9C1D31135AA1800D22670 /* iPhoneNetMasterAppl-Info.plist */, ); name = Resources; sourceTree = ""; @@ -452,7 +454,7 @@ ); name = iPhoneThruNet; productName = iPhoneNet; - productReference = 4BCF75F210BC2FD90082C526 /* iPhoneThruNet.app */; + productReference = 4BCF75F210BC2FD90082C526 /* iPhoneFaustNet.app */; productType = "com.apple.product-type.application"; }; 4BFF455E0F4D5D9700106083 /* iPhoneFaustNet */ = { @@ -583,11 +585,11 @@ 4B07722C0F54018C000DC657 /* JackAudioAdapterInterface.cpp in Sources */, 4B07722D0F54018C000DC657 /* JackResampler.cpp in Sources */, 4B07722E0F54018C000DC657 /* ringbuffer.c in Sources */, - 4B0772510F54022D000DC657 /* main_master.mm in Sources */, 4B0773860F541EE2000DC657 /* iPhoneNetAppDelegate.m in Sources */, 4B27918B0F72570C000536B7 /* JackGlobals.cpp in Sources */, 4BF15E2511356A3E00B36B9A /* CAHostTimeBase.cpp in Sources */, 4BF15F7811357A0E00B36B9A /* TiPhoneCoreAudioRenderer.cpp in Sources */, + 4BC9C1F71135AB2800D22670 /* main_master.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -699,6 +701,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = iPhoneNet_Prefix.pch; HEADER_SEARCH_PATHS = ( + ../../macosx/coreaudio, ../../macosx, ../../posix, ../../common/jack, @@ -711,7 +714,7 @@ ); OTHER_LDFLAGS = ""; PRODUCT_NAME = iPhoneNetSlave; - SDKROOT = iphoneos2.2.1; + SDKROOT = iphoneos3.1.3; }; name = Debug; }; @@ -723,6 +726,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = iPhoneNet_Prefix.pch; HEADER_SEARCH_PATHS = ( + ../../macosx/coreaudio, ../../common/jack, ../../common, ../../posix, diff --git a/macosx/iphone/main_master.mm b/macosx/iphone/main_master.mm index b552de0b..00123edf 100644 --- a/macosx/iphone/main_master.mm +++ b/macosx/iphone/main_master.mm @@ -26,7 +26,7 @@ int sample_rate = 44100; jack_master_t request = { buffer_size, sample_rate, "master" }; jack_slave_t result; -void MasterAudioCallback(int frames, float** inputs, float** outputs, void* arg) +static void MasterAudioCallback(int frames, float** inputs, float** outputs, void* arg) { int i; diff --git a/macosx/iphone/main_slave.mm b/macosx/iphone/main_slave.mm index af9b54c0..f657f045 100644 --- a/macosx/iphone/main_slave.mm +++ b/macosx/iphone/main_slave.mm @@ -9,33 +9,39 @@ #import #include +#include "TiPhoneCoreAudioRenderer.h" + #define NUM_INPUT 2 #define NUM_OUTPUT 2 jack_net_slave_t* net; jack_adapter_t* adapter; +int buffer_size; +int sample_rate ; + + static int net_process(jack_nframes_t buffer_size, - int audio_input, - float** audio_input_buffer, - int midi_input, - void** midi_input_buffer, - int audio_output, - float** audio_output_buffer, - int midi_output, - void** midi_output_buffer, - void* data) + int audio_input, + float** audio_input_buffer, + int midi_input, + void** midi_input_buffer, + int audio_output, + float** audio_output_buffer, + int midi_output, + void** midi_output_buffer, + void* data) { - // Process input, produce output - if (audio_input == audio_output) { - // Copy input to output - for (int i = 0; i < audio_input; i++) { - memcpy(audio_output_buffer[i], audio_input_buffer[i], buffer_size * sizeof(float)); - } - } + + jack_adapter_pull_and_push(adapter, audio_output_buffer, audio_input_buffer, buffer_size); return 0; } +static void SlaveAudioCallback(int frames, float** inputs, float** outputs, void* arg) +{ + jack_adapter_push_and_pull(adapter, inputs, outputs, frames); +} + int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; @@ -46,17 +52,42 @@ int main(int argc, char *argv[]) { if ((net = jack_net_slave_open(DEFAULT_MULTICAST_IP, DEFAULT_PORT, "iPhone", &request, &result)) == 0) { return -1; } + + if ((adapter = jack_create_adapter(NUM_INPUT, + NUM_OUTPUT, + result.buffer_size, + result.sample_rate, + result.buffer_size, + result.sample_rate)) == 0) { + return -1; + } + + TiPhoneCoreAudioRenderer audio_device(NUM_INPUT, NUM_OUTPUT); jack_set_net_slave_process_callback(net, net_process, NULL); if (jack_net_slave_activate(net) != 0) { return -1; } + if (audio_device.OpenDefault(result.buffer_size, result.sample_rate) < 0) { + return -1; + } + + audio_device.SetAudioCallback(SlaveAudioCallback, NULL); + + if (audio_device.Start() < 0) { + return -1; + } + int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; + audio_device.Stop(); + audio_device.Close(); + // Wait for application end jack_net_slave_deactivate(net); jack_net_slave_close(net); + jack_destroy_adapter(adapter); return retVal; }