Commit cbd652cf authored by sletz's avatar sletz
Browse files

Improve master mode.

git-svn-id: http://subversion.jackaudio.org/jack/jack2/branches/libjacknet@3955 0c269be4-1314-0410-8aa9-9f06e86f4224
parent 347ff4c3
......@@ -212,13 +212,13 @@ namespace Jack
int GetInputs()
{
jack_log ( "JackAudioAdapterInterface::GetInputs %d", fCaptureChannels );
//jack_log("JackAudioAdapterInterface::GetInputs %d", fCaptureChannels);
return fCaptureChannels;
}
int GetOutputs()
{
jack_log ( "JackAudioAdapterInterface::GetOutputs %d", fPlaybackChannels );
//jack_log ("JackAudioAdapterInterface::GetOutputs %d", fPlaybackChannels);
return fPlaybackChannels;
}
......
......@@ -214,6 +214,7 @@ struct JackNetExtMaster : public JackNetMasterInterface {
fprintf(stderr, "Can't init new net master...\n");
goto error;
}
jack_info ( "Waiting for a slave..." );
break;
case KILL_MASTER:
......@@ -787,7 +788,7 @@ struct JackNetAdapter : public JackAudioAdapterInterface {
Destroy();
}
int Flush()
void Flush()
{
for (int i = 0; i < fCaptureChannels; i++ ) {
fCaptureRingBuffer[i]->Reset(fRingbufferCurSize);
......@@ -881,14 +882,14 @@ SERVER_EXPORT int jack_net_master_close(jack_net_master_t* net)
}
SERVER_EXPORT int jack_net_master_recv(jack_net_master_t* net, int audio_input, float** audio_input_buffer, int midi_input, void** midi_input_buffer)
{
JackNetExtMaster* slave = (JackNetExtMaster*)net;
return slave->Read(audio_input, audio_input_buffer, midi_input, midi_input_buffer);
JackNetExtMaster* master = (JackNetExtMaster*)net;
return master->Read(audio_input, audio_input_buffer, midi_input, midi_input_buffer);
}
SERVER_EXPORT int jack_net_master_send(jack_net_master_t* net, int audio_output, float** audio_output_buffer, int midi_output, void** midi_output_buffer)
{
JackNetExtMaster* slave = (JackNetExtMaster*)net;
return slave->Write(audio_output, audio_output_buffer, midi_output, midi_output_buffer);
JackNetExtMaster* master = (JackNetExtMaster*)net;
return master->Write(audio_output, audio_output_buffer, midi_output, midi_output_buffer);
}
// Adapter API
......
......@@ -117,18 +117,18 @@ namespace Jack
JackNetAdapter::~JackNetAdapter()
{
jack_log ( "JackNetAdapter::~JackNetAdapter" );
jack_log ("JackNetAdapter::~JackNetAdapter");
int port_index;
if ( fSoftCaptureBuffer )
if (fSoftCaptureBuffer)
{
for ( port_index = 0; port_index < fCaptureChannels; port_index++ )
for (port_index = 0; port_index < fCaptureChannels; port_index++)
delete[] fSoftCaptureBuffer[port_index];
delete[] fSoftCaptureBuffer;
}
if ( fSoftPlaybackBuffer )
if (fSoftPlaybackBuffer)
{
for ( port_index = 0; port_index < fPlaybackChannels; port_index++ )
for ( port_index = 0; port_index < fPlaybackChannels; port_index++)
delete[] fSoftPlaybackBuffer[port_index];
delete[] fSoftPlaybackBuffer;
}
......@@ -194,6 +194,8 @@ namespace Jack
}
//thread------------------------------------------------------------------------------
// TODO : if failure, thread exist... need to restart ?
bool JackNetAdapter::Init()
{
jack_log ( "JackNetAdapter::Init" );
......@@ -201,11 +203,16 @@ namespace Jack
int port_index;
//init network connection
if ( !JackNetSlaveInterface::Init() )
if (!JackNetSlaveInterface::Init()) {
jack_error("JackNetSlaveInterface::Init() error..." );
return false;
}
//then set global parameters
SetParams();
if (!SetParams()) {
jack_error("SetParams error..." );
return false;
}
//set buffers
fSoftCaptureBuffer = new sample_t*[fCaptureChannels];
......
......@@ -142,13 +142,17 @@ namespace Jack
( fParams.fSlaveSyncMode ) ? "sync" : "async", ( fParams.fTransportSync ) ? "with" : "without" );
//init network
if (!JackNetSlaveInterface::Init())
if (!JackNetSlaveInterface::Init()) {
jack_error("JackNetSlaveInterface::Init() error..." );
return false;
}
//set global parameters
if (!SetParams())
if (!SetParams()) {
jack_error("SetParams error..." );
return false;
}
//allocate midi ports lists
fMidiCapturePortList = new jack_port_id_t [fParams.fSendMidiChannels];
fMidiPlaybackPortList = new jack_port_id_t [fParams.fReturnMidiChannels];
......
......@@ -67,9 +67,21 @@ namespace Jack
memset(&fReturnTransportData, 0, sizeof(net_transport_data_t));
}
void JackNetInterface::FreeNetworkBuffers()
{
delete fNetMidiCaptureBuffer;
delete fNetMidiPlaybackBuffer;
delete fNetAudioCaptureBuffer;
delete fNetAudioPlaybackBuffer;
fNetMidiCaptureBuffer = NULL;
fNetMidiPlaybackBuffer = NULL;
fNetAudioCaptureBuffer = NULL;
fNetAudioPlaybackBuffer = NULL;
}
JackNetInterface::~JackNetInterface()
{
jack_log ( "JackNetInterface::~JackNetInterface" );
jack_log ("JackNetInterface::~JackNetInterface");
fSocket.Close();
delete[] fTxBuffer;
......@@ -270,11 +282,7 @@ namespace Jack
return true;
error:
delete fNetMidiCaptureBuffer;
delete fNetMidiPlaybackBuffer;
delete fNetAudioCaptureBuffer;
delete fNetAudioPlaybackBuffer;
FreeNetworkBuffers();
return false;
}
......@@ -650,7 +658,7 @@ namespace Jack
return true;
}
net_status_t JackNetSlaveInterface::SendAvailableToMaster(int count)
net_status_t JackNetSlaveInterface::SendAvailableToMaster(long try_count)
{
jack_log ( "JackNetSlaveInterface::SendAvailableToMaster()" );
//utility
......@@ -698,10 +706,11 @@ namespace Jack
return NET_RECV_ERROR;
}
}
while (strcmp(host_params.fPacketType, fParams.fPacketType) && (GetPacketType(&host_params) != SLAVE_SETUP) && (--count > 0));
while (strcmp(host_params.fPacketType, fParams.fPacketType) && (GetPacketType(&host_params) != SLAVE_SETUP) && (--try_count > 0));
// Time out failure..
if (count == 0) {
if (try_count == 0) {
jack_error("Time out error in connect");
return NET_CONNECT_ERROR;
}
......@@ -710,8 +719,8 @@ namespace Jack
fParams = host_params;
//connect the socket
if ( fSocket.Connect() == SOCKET_ERROR ) {
jack_error ( "Error in connect : %s", StrError ( NET_ERROR_CODE ) );
if (fSocket.Connect() == SOCKET_ERROR) {
jack_error("Error in connect : %s", StrError(NET_ERROR_CODE));
return NET_CONNECT_ERROR;
}
return NET_CONNECTED;
......@@ -719,17 +728,17 @@ namespace Jack
net_status_t JackNetSlaveInterface::SendStartToMaster()
{
jack_log ( "JackNetSlaveInterface::SendStartToMaster" );
jack_log("JackNetSlaveInterface::SendStartToMaster");
//tell the master to start
session_params_t net_params;
memset(&net_params, 0, sizeof ( session_params_t ));
SetPacketType ( &fParams, START_MASTER );
SessionParamsHToN(&fParams, &net_params);
if ( fSocket.Send ( &net_params, sizeof ( session_params_t ), 0 ) == SOCKET_ERROR )
if (fSocket.Send(&net_params, sizeof(session_params_t), 0) == SOCKET_ERROR)
{
jack_error ( "Error in send : %s", StrError ( NET_ERROR_CODE ) );
return ( fSocket.GetError() == NET_CONN_ERROR ) ? NET_ERROR : NET_SEND_ERROR;
jack_error("Error in send : %s", StrError(NET_ERROR_CODE));
return (fSocket.GetError() == NET_CONN_ERROR) ? NET_ERROR : NET_SEND_ERROR;
}
return NET_ROLLING;
}
......@@ -784,10 +793,7 @@ namespace Jack
return true;
error:
delete fNetMidiCaptureBuffer;
delete fNetMidiPlaybackBuffer;
delete fNetAudioCaptureBuffer;
delete fNetAudioPlaybackBuffer;
FreeNetworkBuffers();
return false;
}
......
......@@ -63,6 +63,7 @@ namespace Jack
//utility methods
int SetNetBufferSize();
void FreeNetworkBuffers();
//virtual methods : depends on the sub class master/slave
virtual bool SetParams();
......@@ -148,7 +149,7 @@ namespace Jack
bool InitConnection(int time_out);
bool InitRendering();
net_status_t SendAvailableToMaster(int count = LONG_MAX);
net_status_t SendAvailableToMaster(long count = LONG_MAX); // long here (and not int...)
net_status_t SendStartToMaster();
bool SetParams();
......
......@@ -113,12 +113,16 @@ namespace Jack
bool JackNetMaster::Init(bool auto_connect)
{
//network init
if (!JackNetMasterInterface::Init())
if (!JackNetMasterInterface::Init()){
jack_error("JackNetMasterInterface::Init() error..." );
return false;
}
//set global parameters
if (!SetParams())
if (!SetParams()) {
jack_error("SetParams error..." );
return false;
}
//jack client and process
jack_status_t status;
......
......@@ -49,7 +49,6 @@ HardwareClock::HardwareClock()
mach_timebase_info_data_t info;
mach_timebase_info(&info);
m_clockToSeconds = (double)info.numer/info.denom/1000000000.0;
Reset();
}
......@@ -57,7 +56,6 @@ void HardwareClock::Reset()
{
m_startAbsTime = mach_absolute_time();
m_lastAbsTime = m_startAbsTime;
m_time = m_startAbsTime*m_clockToSeconds;
m_deltaTime = 1.0f/60.0f;
}
......@@ -69,7 +67,6 @@ void HardwareClock::Update()
m_time = currentTime*m_clockToSeconds;
m_deltaTime = (double)dt*m_clockToSeconds;
m_lastAbsTime = currentTime;
}
......@@ -200,8 +197,8 @@ namespace Jack
int NetMidiBuffer::RenderToNetwork ( int subcycle, size_t total_size )
{
int size = total_size - subcycle * fMaxPcktSize;
int copy_size = ( size <= fMaxPcktSize ) ? size : fMaxPcktSize;
memcpy ( fNetBuffer, fBuffer + subcycle * fMaxPcktSize, copy_size );
int copy_size = (size <= fMaxPcktSize) ? size : fMaxPcktSize;
memcpy(fNetBuffer, fBuffer + subcycle * fMaxPcktSize, copy_size);
return copy_size;
}
......@@ -414,12 +411,9 @@ namespace Jack
return 0;
}
HardwareClock clock;
//network<->buffer
//network<->buffer
int NetCeltAudioBuffer::RenderFromNetwork(int cycle, int subcycle, size_t copy_size)
{
//clock.Update();
if (subcycle == fNumPackets - 1) {
for (int port_index = 0; port_index < fNPorts; port_index++)
memcpy(fCompressedBuffer[port_index] + subcycle * fSubPeriodBytesSize, fNetBuffer + port_index * fLastSubPeriodBytesSize, fLastSubPeriodBytesSize);
......@@ -432,11 +426,6 @@ namespace Jack
jack_error("Packet(s) missing from... %d %d", fLastSubCycle, subcycle);
fLastSubCycle = subcycle;
//clock.Update();
//const float dt = clock.GetDeltaTime();
//printf("Delta: %f s\n", dt);
return copy_size;
}
......
......@@ -278,7 +278,7 @@ namespace Jack
virtual int RenderToJackPorts () = 0;
//network<->buffer
virtual int RenderFromNetwork ( int cycle, int subcycle, size_t copy_size ) = 0;
virtual int RenderFromNetwork ( int cycle, int subcycle, size_t copy_size ) = 0;
virtual int RenderToNetwork (int subcycle, size_t total_size ) = 0;
virtual void SetBuffer ( int index, sample_t* buffer ) = 0;
......
......@@ -64,8 +64,8 @@ class SERVER_EXPORT JackWaitThreadedDriver : public JackThreadedDriver
// JackRunnableInterface interface
bool Execute()
{
// Blocks until decorated driver is started (that is when it's Init method returns).
fDriver->Initialize();
// Blocks until decorated driver is started (that is when it's Initialize method returns true).
while (!fDriver->Initialize()) {}
fRunning = true;
return false;
}
......
......@@ -153,12 +153,12 @@
/* Begin PBXFileReference section */
1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
1D6058910D05DD3D006BFB54 /* NetJack.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NetJack.app; sourceTree = BUILT_PRODUCTS_DIR; };
1D6058910D05DD3D006BFB54 /* NetJackSlave.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NetJackSlave.app; sourceTree = BUILT_PRODUCTS_DIR; };
1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = "<group>"; };
32CA4F630368D1EE00C91783 /* iPhoneNet_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iPhoneNet_Prefix.pch; sourceTree = "<group>"; };
4B0772380F54018C000DC657 /* iPhoneNetMaster.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iPhoneNetMaster.app; sourceTree = BUILT_PRODUCTS_DIR; };
4B0772380F54018C000DC657 /* NetJackMaster.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NetJackMaster.app; sourceTree = BUILT_PRODUCTS_DIR; };
4B0772490F54021B000DC657 /* main_slave.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main_slave.mm; sourceTree = SOURCE_ROOT; };
4B0772500F54022D000DC657 /* main_master.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main_master.mm; sourceTree = SOURCE_ROOT; };
4B0773840F541EE2000DC657 /* iPhoneNetAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iPhoneNetAppDelegate.h; sourceTree = "<group>"; };
......@@ -182,7 +182,7 @@
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 /* iPhoneFaustNet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iPhoneFaustNet.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; };
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; };
......@@ -290,11 +290,11 @@
19C28FACFE9D520D11CA2CBB /* Products */ = {
isa = PBXGroup;
children = (
1D6058910D05DD3D006BFB54 /* NetJack.app */,
1D6058910D05DD3D006BFB54 /* NetJackSlave.app */,
4BFF45120F4D59DB00106083 /* libjacknet.a */,
4BFF45770F4D5D9700106083 /* iPhoneFaustNet.app */,
4B0772380F54018C000DC657 /* iPhoneNetMaster.app */,
4BCF75F210BC2FD90082C526 /* iPhoneFaustNet.app */,
4B0772380F54018C000DC657 /* NetJackMaster.app */,
4BCF75F210BC2FD90082C526 /* iPhoneThruNet.app */,
4B4146B010BD3C4300C12F0C /* iPhoneFaustNet.app */,
4BCB37CE112D647C008C7BC1 /* iPhoneFaust.app */,
4BDFCD57113DB6B700D77992 /* NetJackSlave.app */,
......@@ -404,7 +404,7 @@
);
name = iPhoneNetSlave;
productName = iPhoneNet;
productReference = 1D6058910D05DD3D006BFB54 /* NetJack.app */;
productReference = 1D6058910D05DD3D006BFB54 /* NetJackSlave.app */;
productType = "com.apple.product-type.application";
};
4B07721F0F54018C000DC657 /* iPhoneNetMaster */ = {
......@@ -421,7 +421,7 @@
);
name = iPhoneNetMaster;
productName = iPhoneNet;
productReference = 4B0772380F54018C000DC657 /* iPhoneNetMaster.app */;
productReference = 4B0772380F54018C000DC657 /* NetJackMaster.app */;
productType = "com.apple.product-type.application";
};
4B1A940F0F49BDE000D3626B /* libjacknet */ = {
......@@ -489,7 +489,7 @@
);
name = iPhoneThruNet;
productName = iPhoneNet;
productReference = 4BCF75F210BC2FD90082C526 /* iPhoneFaustNet.app */;
productReference = 4BCF75F210BC2FD90082C526 /* iPhoneThruNet.app */;
productType = "com.apple.product-type.application";
};
4BDFCD3B113DB6B700D77992 /* iPhoneNetSlaveLib */ = {
......@@ -793,7 +793,7 @@
"\"$(SRCROOT)/build/Debug-iphonesimulator\"",
);
OTHER_LDFLAGS = libcelt.a;
PRODUCT_NAME = iPhoneNetSlave;
PRODUCT_NAME = NetJackSlave;
SDKROOT = iphoneos3.1.3;
};
name = Debug;
......@@ -822,7 +822,7 @@
"\"$(SRCROOT)/build/Debug-iphonesimulator\"",
);
OTHER_LDFLAGS = libcelt.a;
PRODUCT_NAME = NetJack;
PRODUCT_NAME = NetJackSlave;
SDKROOT = iphoneos3.1.3;
};
name = Release;
......@@ -837,6 +837,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = iPhoneNet_Prefix.pch;
HEADER_SEARCH_PATHS = (
/usr/local/include,
../../macosx/coreaudio,
../../macosx,
../../posix,
......@@ -848,8 +849,8 @@
"$(inherited)",
"\\\"$(SRCROOT)/build/Debug-iphonesimulator\\\"",
);
OTHER_LDFLAGS = "";
PRODUCT_NAME = iPhoneNetMaster;
OTHER_LDFLAGS = libcelt.a;
PRODUCT_NAME = NetJackMaster;
SDKROOT = iphoneos3.1.3;
};
name = Debug;
......@@ -862,6 +863,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = iPhoneNet_Prefix.pch;
HEADER_SEARCH_PATHS = (
/usr/local/include,
../../macosx/coreaudio,
../../common/jack,
../../common,
......@@ -873,7 +875,8 @@
"$(inherited)",
"\\\"$(SRCROOT)/build/Debug-iphonesimulator\\\"",
);
PRODUCT_NAME = iPhoneNetMaster;
OTHER_LDFLAGS = libcelt.a;
PRODUCT_NAME = NetJackMaster;
};
name = Release;
};
......@@ -1097,7 +1100,7 @@
"\\\"$(SRCROOT)/build/Debug-iphonesimulator\\\"",
);
OTHER_LDFLAGS = "-ljacknet";
PRODUCT_NAME = iPhoneNetSlave;
PRODUCT_NAME = NetJackSlave;
SDKROOT = iphoneos3.1.3;
};
name = Debug;
......
......@@ -20,7 +20,7 @@ jack_adapter_t* adapter;
float** audio_input_buffer;
float** audio_output_buffer;
int buffer_size = 4096;
int buffer_size = 1024;
int sample_rate = 44100;
jack_master_t request = { buffer_size, sample_rate, "master" };
......@@ -30,18 +30,22 @@ static void MasterAudioCallback(int frames, float** inputs, float** outputs, voi
{
int i;
// Copy from iPod input to network
// Copy from iPod input to network buffers
for (i = 0; i < result.audio_input; i++) {
memcpy(audio_output_buffer[i], inputs[i], buffer_size * sizeof(float));
}
// Send network buffers
if (jack_net_master_send(net, result.audio_output, audio_output_buffer, 0, NULL) < 0) {
printf("jack_net_master_send error..\n");
}
// Copy from network to iPod output
// Recv network buffers
if (jack_net_master_recv(net, result.audio_input, audio_input_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_input_buffer[i], buffer_size * sizeof(float));
}
......@@ -57,6 +61,7 @@ int main(int argc, char *argv[]) {
TiPhoneCoreAudioRenderer audio_device(NUM_INPUT, NUM_OUTPUT);
if ((net = jack_net_master_open(DEFAULT_MULTICAST_IP, DEFAULT_PORT, "iPhone", &request, &result)) == 0) {
printf("jack_net_master_open error..\n");
return -1;
}
......@@ -82,7 +87,7 @@ int main(int argc, char *argv[]) {
}
// Run until interrupted
while (1) {}
//while (1) {}
/*
// Quite brutal way, the application actually does not start completely, the netjack audio processing loop is used instead...
......@@ -105,10 +110,11 @@ int main(int argc, char *argv[]) {
};
*/
int retVal = UIApplicationMain(argc, argv, nil, nil);
audio_device.Stop();
audio_device.Close();
int retVal = UIApplicationMain(argc, argv, nil, nil);
// Wait for application end
jack_net_master_close(net);
......
......@@ -70,6 +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(DEFAULT_MULTICAST_IP, DEFAULT_PORT, "iPod", &request, &result)) == 0) {
printf("jack_net_slave_open error..\n");
return -1;
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment