Browse Source

rebase from trunk 3420:3447

git-svn-id: http://subversion.jackaudio.org/jack/jack2/branches/libjacknet@3448 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/1.9.8
sletz 16 years ago
parent
commit
51fbf0cf71
44 changed files with 390 additions and 332 deletions
  1. +30
    -13
      ChangeLog
  2. +13
    -4
      common/JackAPI.cpp
  3. +15
    -14
      common/JackAudioAdapter.cpp
  4. +66
    -43
      common/JackAudioAdapterInterface.cpp
  5. +15
    -11
      common/JackAudioAdapterInterface.h
  6. +0
    -2
      common/JackClient.cpp
  7. +0
    -5
      common/JackConnectionManager.cpp
  8. +6
    -1
      common/JackConnectionManager.h
  9. +0
    -43
      common/JackEngineControl.cpp
  10. +37
    -7
      common/JackEngineControl.h
  11. +1
    -1
      common/JackEngineProfiling.h
  12. +20
    -4
      common/JackFilters.h
  13. +1
    -1
      common/JackFrameTimer.h
  14. +5
    -1
      common/JackGlobals.cpp
  15. +5
    -2
      common/JackGlobals.h
  16. +0
    -5
      common/JackGraphManager.cpp
  17. +5
    -1
      common/JackGraphManager.h
  18. +4
    -4
      common/JackLibSampleRateResampler.cpp
  19. +2
    -2
      common/JackLibSampleRateResampler.h
  20. +2
    -2
      common/JackNetAPI.cpp
  21. +16
    -18
      common/JackNetAdapter.cpp
  22. +4
    -1
      common/JackNetDriver.cpp
  23. +6
    -3
      common/JackNetManager.cpp
  24. +4
    -10
      common/JackResampler.cpp
  25. +4
    -4
      common/JackResampler.h
  26. +1
    -0
      common/JackThreadedDriver.cpp
  27. +0
    -6
      common/JackTransportEngine.cpp
  28. +5
    -1
      common/JackTransportEngine.h
  29. +2
    -1
      common/JackWaitThreadedDriver.cpp
  30. +10
    -0
      common/jack/ringbuffer.h
  31. +31
    -4
      common/jack/thread.h
  32. +14
    -0
      common/ringbuffer.c
  33. +1
    -0
      common/wscript
  34. +6
    -6
      linux/alsa/JackAlsaAdapter.cpp
  35. +1
    -0
      linux/wscript
  36. +5
    -4
      macosx/coreaudio/JackCoreAudioAdapter.cpp
  37. +10
    -0
      macosx/iphone/iPhoneNet.xcodeproj/project.pbxproj
  38. +4
    -2
      posix/JackFifo.cpp
  39. +2
    -1
      posix/JackPosixThread.cpp
  40. +10
    -90
      posix/JackSocket.cpp
  41. +4
    -3
      posix/JackSocket.h
  42. +2
    -0
      posix/JackTypes_os.h
  43. +15
    -7
      solaris/oss/JackOSSAdapter.cpp
  44. +6
    -5
      windows/portaudio/JackPortAudioAdapter.cpp

+ 30
- 13
ChangeLog View File

@@ -17,38 +17,55 @@ Nedko Arnaudov
Fernando Lopez-Lezcano Fernando Lopez-Lezcano
Romain Moret Romain Moret
Florian Faber Florian Faber
Michael Voigt
Michael Voigt
Torben Hohn Torben Hohn
--------------------------- ---------------------------
Jackdmp changes log Jackdmp changes log
---------------------------
---------------------------


2009-03-10 Stephane Letz <letz@grame.fr>
2009-03-19 Stephane Letz <letz@grame.fr>

* Tim Blechmann optimization patch (inlining some heavy used methods).

2009-03-12 Stephane Letz <letz@grame.fr>
* Add -g (ring-buffer) parameter to netadapter.
* Virtualize and allow overriding of thread creation function, to allow Wine support (from JACK1).


2009-03-12 Stephane Letz <letz@grame.fr>
* Try automatic adaptative mode in adapters.
2009-03-11 Stephane Letz <letz@grame.fr>
* Client incorrect re-naming fixed : now done at socket level also.
2009-03-10 Stephane Letz <letz@grame.fr>
* Add -g (ring-buffer) parameter to netadapter.
* Automatic adaptative ringbuffer size mode when -g = 0.
2009-03-09 Stephane Letz <letz@grame.fr> 2009-03-09 Stephane Letz <letz@grame.fr>
* Use Torben Hohn PI controler code for adapters (in progress).

* Use Torben Hohn PI controler code for adapters (in progress).
2009-03-05 Stephane Letz <letz@grame.fr> 2009-03-05 Stephane Letz <letz@grame.fr>
* Support for BIG_ENDIAN machines in NetJack2 for transport data.
* Support for BIG_ENDIAN machines in NetJack2 for transport data.
* Add auto_connect parameter in netmanager and netadapter. * Add auto_connect parameter in netmanager and netadapter.

2009-03-03 Stephane Letz <letz@grame.fr> 2009-03-03 Stephane Letz <letz@grame.fr>
* More robust profiling tools when clients come and go. * More robust profiling tools when clients come and go.

2009-03-01 Stephane Letz <letz@grame.fr> 2009-03-01 Stephane Letz <letz@grame.fr>
* Raise default port number to 1024. * Raise default port number to 1024.
2009-02-27 Stephane Letz <letz@grame.fr> 2009-02-27 Stephane Letz <letz@grame.fr>
* Improve generated gnuplot files for adapting code. * Improve generated gnuplot files for adapting code.
2009-02-25 Stephane Letz <letz@grame.fr> 2009-02-25 Stephane Letz <letz@grame.fr>
* Major cleanup in adapter code. * Major cleanup in adapter code.
@@ -57,8 +74,8 @@ Torben Hohn
* Fix JackNetDriver::Close method. * Fix JackNetDriver::Close method.
* For audio device reservation, add card_to_num function. * For audio device reservation, add card_to_num function.
* Fix buffer size and sample rate handling in JackAlsaAdapter.
* Add control for adapter ringbuffer size.
* Fix buffer size and sample rate handling in JackAlsaAdapter.
* Add control for adapter ringbuffer size.
* Fix JackAlsaAdapter.h for 64 bits compilation. * Fix JackAlsaAdapter.h for 64 bits compilation.
2009-02-24 Stephane Letz <letz@grame.fr> 2009-02-24 Stephane Letz <letz@grame.fr>


+ 13
- 4
common/JackAPI.cpp View File

@@ -219,10 +219,12 @@ extern "C"
thread_routine routine, thread_routine routine,
void *arg); void *arg);
EXPORT int jack_drop_real_time_scheduling (pthread_t thread); EXPORT int jack_drop_real_time_scheduling (pthread_t thread);
EXPORT int jack_client_stop_thread (jack_client_t* client, pthread_t thread); EXPORT int jack_client_stop_thread (jack_client_t* client, pthread_t thread);
EXPORT int jack_client_kill_thread (jack_client_t* client, pthread_t thread); EXPORT int jack_client_kill_thread (jack_client_t* client, pthread_t thread);

#ifndef WIN32
EXPORT void jack_set_thread_creator (jack_thread_creator_t jtc);
#endif
EXPORT char * jack_get_internal_client_name (jack_client_t *client, EXPORT char * jack_get_internal_client_name (jack_client_t *client,
jack_intclient_t intclient); jack_intclient_t intclient);
EXPORT jack_intclient_t jack_internal_client_handle (jack_client_t *client, EXPORT jack_intclient_t jack_internal_client_handle (jack_client_t *client,
@@ -1759,8 +1761,8 @@ EXPORT int jack_client_max_real_time_priority(jack_client_t* ext_client)
JackEngineControl* control = GetEngineControl(); JackEngineControl* control = GetEngineControl();
return (control->fRealTime) ? control->fMaxClientPriority : -1; return (control->fRealTime) ? control->fMaxClientPriority : -1;
} }
}
}
EXPORT int jack_acquire_real_time_scheduling(pthread_t thread, int priority) EXPORT int jack_acquire_real_time_scheduling(pthread_t thread, int priority)
{ {
JackEngineControl* control = GetEngineControl(); JackEngineControl* control = GetEngineControl();
@@ -1792,6 +1794,13 @@ EXPORT int jack_client_kill_thread(jack_client_t* client, pthread_t thread)
return JackThread::KillImp(thread); return JackThread::KillImp(thread);
} }


#ifndef WIN32
EXPORT void jack_set_thread_creator (jack_thread_creator_t jtc)
{
JackGlobals::fJackThreadCreator = jtc;
}
#endif

// intclient.h // intclient.h
EXPORT int jack_internal_client_new (const char *client_name, EXPORT int jack_internal_client_new (const char *client_name,
const char *load_name, const char *load_name,


+ 15
- 14
common/JackAudioAdapter.cpp View File

@@ -36,20 +36,21 @@ namespace Jack
int JackAudioAdapter::Process (jack_nframes_t frames, void* arg) int JackAudioAdapter::Process (jack_nframes_t frames, void* arg)
{ {
JackAudioAdapter* adapter = static_cast<JackAudioAdapter*>(arg); JackAudioAdapter* adapter = static_cast<JackAudioAdapter*>(arg);
if (!adapter->fAudioAdapter->IsRunning())
return 0;
float* inputBuffer[adapter->fAudioAdapter->GetInputs()]; float* inputBuffer[adapter->fAudioAdapter->GetInputs()];
float* outputBuffer[adapter->fAudioAdapter->GetOutputs()]; float* outputBuffer[adapter->fAudioAdapter->GetOutputs()];

// Always clear output
for (int i = 0; i < adapter->fAudioAdapter->GetInputs(); i++) { for (int i = 0; i < adapter->fAudioAdapter->GetInputs(); i++) {
inputBuffer[i] = (float*)jack_port_get_buffer(adapter->fCapturePortList[i], frames); inputBuffer[i] = (float*)jack_port_get_buffer(adapter->fCapturePortList[i], frames);
memset(inputBuffer[i], 0, frames * sizeof(float));
} }

for (int i = 0; i < adapter->fAudioAdapter->GetOutputs(); i++) { for (int i = 0; i < adapter->fAudioAdapter->GetOutputs(); i++) {
outputBuffer[i] = (float*)jack_port_get_buffer(adapter->fPlaybackPortList[i], frames); outputBuffer[i] = (float*)jack_port_get_buffer(adapter->fPlaybackPortList[i], frames);
} }
adapter->fAudioAdapter->PullAndPush(inputBuffer, outputBuffer, frames); adapter->fAudioAdapter->PullAndPush(inputBuffer, outputBuffer, frames);
return 0;
return 0;
} }


int JackAudioAdapter::BufferSize ( jack_nframes_t buffer_size, void* arg ) int JackAudioAdapter::BufferSize ( jack_nframes_t buffer_size, void* arg )
@@ -70,23 +71,23 @@ namespace Jack


//JackAudioAdapter ********************************************************* //JackAudioAdapter *********************************************************


JackAudioAdapter::JackAudioAdapter (jack_client_t* jack_client, JackAudioAdapterInterface* audio_io, const JSList* params, bool system)
JackAudioAdapter::JackAudioAdapter (jack_client_t* jack_client, JackAudioAdapterInterface* audio_io, const JSList* params, bool system)
:fJackClient(jack_client), fAudioAdapter(audio_io) :fJackClient(jack_client), fAudioAdapter(audio_io)
{ {
const JSList* node; const JSList* node;
const jack_driver_param_t* param; const jack_driver_param_t* param;
fAutoConnect = false; fAutoConnect = false;
for (node = params; node; node = jack_slist_next(node)) { for (node = params; node; node = jack_slist_next(node)) {
param = (const jack_driver_param_t*) node->data; param = (const jack_driver_param_t*) node->data;
switch (param->character) { switch (param->character) {
case 'c': case 'c':
fAutoConnect = param->value.i;
fAutoConnect = true;
break; break;
} }
} }
} }
JackAudioAdapter::~JackAudioAdapter() JackAudioAdapter::~JackAudioAdapter()
{ {
// When called, Close has already been used for the client, thus ports are already unregistered. // When called, Close has already been used for the client, thus ports are already unregistered.
@@ -105,11 +106,11 @@ namespace Jack
delete[] fCapturePortList; delete[] fCapturePortList;
delete[] fPlaybackPortList; delete[] fPlaybackPortList;
} }
void JackAudioAdapter::ConnectPorts() void JackAudioAdapter::ConnectPorts()
{ {
const char **ports; const char **ports;
ports = jack_get_ports(fJackClient, NULL, NULL, JackPortIsPhysical | JackPortIsInput); ports = jack_get_ports(fJackClient, NULL, NULL, JackPortIsPhysical | JackPortIsInput);
if (ports != NULL) { if (ports != NULL) {
for (int i = 0; i < fAudioAdapter->GetInputs() && ports[i]; i++) { for (int i = 0; i < fAudioAdapter->GetInputs() && ports[i]; i++) {
@@ -117,7 +118,7 @@ namespace Jack
} }
free(ports); free(ports);
} }
ports = jack_get_ports(fJackClient, NULL, NULL, JackPortIsPhysical | JackPortIsOutput); ports = jack_get_ports(fJackClient, NULL, NULL, JackPortIsPhysical | JackPortIsOutput);
if (ports != NULL) { if (ports != NULL) {
for (int i = 0; i < fAudioAdapter->GetOutputs() && ports[i]; i++) { for (int i = 0; i < fAudioAdapter->GetOutputs() && ports[i]; i++) {
@@ -137,7 +138,7 @@ namespace Jack
char name[32]; char name[32];
jack_log("JackAudioAdapter::Open fCaptureChannels %d fPlaybackChannels %d", fAudioAdapter->GetInputs(), fAudioAdapter->GetOutputs()); jack_log("JackAudioAdapter::Open fCaptureChannels %d fPlaybackChannels %d", fAudioAdapter->GetInputs(), fAudioAdapter->GetOutputs());
fAudioAdapter->Create(); fAudioAdapter->Create();
//jack ports //jack ports
fCapturePortList = new jack_port_t*[fAudioAdapter->GetInputs()]; fCapturePortList = new jack_port_t*[fAudioAdapter->GetInputs()];
fPlaybackPortList = new jack_port_t*[fAudioAdapter->GetOutputs()]; fPlaybackPortList = new jack_port_t*[fAudioAdapter->GetOutputs()];
@@ -165,7 +166,7 @@ namespace Jack
goto fail; goto fail;
if ( jack_activate ( fJackClient ) < 0 ) if ( jack_activate ( fJackClient ) < 0 )
goto fail; goto fail;
if (fAutoConnect) if (fAutoConnect)
ConnectPorts(); ConnectPorts();




+ 66
- 43
common/JackAudioAdapterInterface.cpp View File

@@ -52,13 +52,12 @@ namespace Jack
for (int i = 1; i < max; i++) for (int i = 1; i < max; i++)
{ {
fprintf(file, "%d \t %d \t %d \t %f \t %f \t %d \t %d \n", fprintf(file, "%d \t %d \t %d \t %f \t %f \t %d \t %d \n",
fTable[i].delta, fTable[i+1].time1 - fTable[i].time1,
fTable[i+1].time2 - fTable[i].time2,
fTable[i].delta, fTable[i].time1, fTable[i].time2,
fTable[i].r1, fTable[i].r2, fTable[i].pos1, fTable[i].pos2); fTable[i].r1, fTable[i].r2, fTable[i].pos1, fTable[i].pos2);
} }
fclose(file); fclose(file);


/* No used for now
// No used for now
// Adapter timing 1 // Adapter timing 1
file = fopen("AdapterTiming1.plot", "w"); file = fopen("AdapterTiming1.plot", "w");
fprintf(file, "set multiplot\n"); fprintf(file, "set multiplot\n");
@@ -68,9 +67,9 @@ namespace Jack
fprintf(file, "set xlabel \"audio cycles\"\n"); fprintf(file, "set xlabel \"audio cycles\"\n");
fprintf(file, "set ylabel \"frames\"\n"); fprintf(file, "set ylabel \"frames\"\n");
fprintf(file, "plot "); fprintf(file, "plot ");
sprintf(buffer, "\"JackAudioAdapter.log\" using 2 title \"Consumer interrupt period\" with lines,");
sprintf(buffer, "\"JackAudioAdapter.log\" using 2 title \"Ringbuffer error\" with lines,");
fprintf(file, buffer); fprintf(file, buffer);
sprintf(buffer, "\"JackAudioAdapter.log\" using 3 title \"Producer interrupt period\" with lines");
sprintf(buffer, "\"JackAudioAdapter.log\" using 3 title \"Ringbuffer error with timing correction\" with lines");
fprintf(file, buffer); fprintf(file, buffer);
fprintf(file, "\n unset multiplot\n"); fprintf(file, "\n unset multiplot\n");
@@ -89,8 +88,7 @@ namespace Jack
fprintf(file, buffer); fprintf(file, buffer);
fclose(file); fclose(file);
*/

// Adapter timing 2 // Adapter timing 2
file = fopen("AdapterTiming2.plot", "w"); file = fopen("AdapterTiming2.plot", "w");
fprintf(file, "set multiplot\n"); fprintf(file, "set multiplot\n");
@@ -155,16 +153,32 @@ namespace Jack
} }


#endif #endif

void JackAudioAdapterInterface::GrowRingBufferSize()
{
fRingbufferCurSize *= 2;
}
void JackAudioAdapterInterface::AdaptRingBufferSize()
{
if (fHostBufferSize > fAdaptedBufferSize)
fRingbufferCurSize = 4 * fHostBufferSize;
else
fRingbufferCurSize = 4 * fAdaptedBufferSize;
}
void JackAudioAdapterInterface::ResetRingBuffers() void JackAudioAdapterInterface::ResetRingBuffers()
{ {
if (fRingbufferCurSize > DEFAULT_RB_SIZE)
fRingbufferCurSize = DEFAULT_RB_SIZE;
for (int i = 0; i < fCaptureChannels; i++) for (int i = 0; i < fCaptureChannels; i++)
fCaptureRingBuffer[i]->Reset();
fCaptureRingBuffer[i]->Reset(fRingbufferCurSize);
for (int i = 0; i < fPlaybackChannels; i++) for (int i = 0; i < fPlaybackChannels; i++)
fPlaybackRingBuffer[i]->Reset();
fPlaybackRingBuffer[i]->Reset(fRingbufferCurSize);
} }

void JackAudioAdapterInterface::Reset()
void JackAudioAdapterInterface::Reset()
{ {
ResetRingBuffers(); ResetRingBuffers();
fRunning = false; fRunning = false;
@@ -179,11 +193,25 @@ namespace Jack
//ringbuffers //ringbuffers
fCaptureRingBuffer = new JackResampler*[fCaptureChannels]; fCaptureRingBuffer = new JackResampler*[fCaptureChannels];
fPlaybackRingBuffer = new JackResampler*[fPlaybackChannels]; fPlaybackRingBuffer = new JackResampler*[fPlaybackChannels];
for (int i = 0; i < fCaptureChannels; i++ )
fCaptureRingBuffer[i] = new JackLibSampleRateResampler(fQuality, fRingbufferSize);
for (int i = 0; i < fPlaybackChannels; i++ )
fPlaybackRingBuffer[i] = new JackLibSampleRateResampler(fQuality, fRingbufferSize);

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 JackLibSampleRateResampler(fQuality);
fCaptureRingBuffer[i]->Reset(fRingbufferCurSize);
}
for (int i = 0; i < fPlaybackChannels; i++ ) {
fPlaybackRingBuffer[i] = new JackLibSampleRateResampler(fQuality);
fPlaybackRingBuffer[i]->Reset(fRingbufferCurSize);
}
if (fCaptureChannels > 0) if (fCaptureChannels > 0)
jack_log("ReadSpace = %ld", fCaptureRingBuffer[0]->ReadSpace()); jack_log("ReadSpace = %ld", fCaptureRingBuffer[0]->ReadSpace());
if (fPlaybackChannels > 0) if (fPlaybackChannels > 0)
@@ -206,14 +234,14 @@ namespace Jack
{ {
bool failure = false; bool failure = false;
fRunning = true; fRunning = true;
// Finer estimation of the position in the ringbuffer
int delta_frames = (fPullAndPushTime > 0) ? (int)((float(long(GetMicroSeconds() - fPullAndPushTime)) * float(fAdaptedSampleRate)) / 1000000.f) : 0;
double ratio = fPIControler.GetRatio(fCaptureRingBuffer[0]->GetError() - delta_frames);
/*
Finer estimation of the position in the ringbuffer ??
int delta_frames = (int)(float(long(GetMicroSeconds() - fPullAndPushTime)) * float(fAdaptedSampleRate)) / 1000000.f;
double ratio = fPIControler.GetRatio(fCaptureRingBuffer[0]->GetOffset() - delta_frames);
*/
double ratio = fPIControler.GetRatio(fCaptureRingBuffer[0]->GetOffset());
#ifdef JACK_MONITOR
fTable.Write(fCaptureRingBuffer[0]->GetError(), fCaptureRingBuffer[0]->GetError() - delta_frames, ratio, 1/ratio, fCaptureRingBuffer[0]->ReadSpace(), fCaptureRingBuffer[0]->ReadSpace());
#endif
// Push/pull from ringbuffer // Push/pull from ringbuffer
for (int i = 0; i < fCaptureChannels; i++) { for (int i = 0; i < fCaptureChannels; i++) {
@@ -223,18 +251,17 @@ namespace Jack
} }


for (int i = 0; i < fPlaybackChannels; i++) { for (int i = 0; i < fPlaybackChannels; i++) {
fPlaybackRingBuffer[i]->SetRatio(1 / ratio);
fPlaybackRingBuffer[i]->SetRatio(1/ratio);
if (fPlaybackRingBuffer[i]->ReadResample(outputBuffer[i], frames) < frames) if (fPlaybackRingBuffer[i]->ReadResample(outputBuffer[i], frames) < frames)
failure = true; failure = true;
} }

#ifdef JACK_MONITOR
fTable.Write(0, 0, ratio, 1/ratio, fCaptureRingBuffer[0]->ReadSpace(), fPlaybackRingBuffer[0]->WriteSpace());
#endif

// Reset all ringbuffers in case of failure // Reset all ringbuffers in case of failure
if (failure) { if (failure) {
jack_error("JackAudioAdapterInterface::PushAndPull ringbuffer failure... reset"); jack_error("JackAudioAdapterInterface::PushAndPull ringbuffer failure... reset");
if (fAdaptative) {
GrowRingBufferSize();
jack_info("Ringbuffer size = %d frames", fRingbufferCurSize);
}
ResetRingBuffers(); ResetRingBuffers();
return -1; return -1;
} else { } else {
@@ -244,28 +271,24 @@ namespace Jack


int JackAudioAdapterInterface::PullAndPush(float** inputBuffer, float** outputBuffer, unsigned int frames) int JackAudioAdapterInterface::PullAndPush(float** inputBuffer, float** outputBuffer, unsigned int frames)
{ {
bool failure = false;
fPullAndPushTime = GetMicroSeconds(); fPullAndPushTime = GetMicroSeconds();
if (!fRunning)
return 0;

int res = 0;
// Push/pull from ringbuffer // Push/pull from ringbuffer
for (int i = 0; i < fCaptureChannels; i++) { for (int i = 0; i < fCaptureChannels; i++) {
if (fCaptureRingBuffer[i]->Read(inputBuffer[i], frames) < frames) if (fCaptureRingBuffer[i]->Read(inputBuffer[i], frames) < frames)
failure = true;
res = -1;
} }


for (int i = 0; i < fPlaybackChannels; i++) { for (int i = 0; i < fPlaybackChannels; i++) {
if (fPlaybackRingBuffer[i]->Write(outputBuffer[i], frames) < frames) if (fPlaybackRingBuffer[i]->Write(outputBuffer[i], frames) < frames)
failure = true;
}

// Reset all ringbuffers in case of failure
if (failure) {
jack_error("JackCallbackAudioAdapter::PullAndPush ringbuffer failure... reset");
Reset();
return -1;
} else {
return 0;
res = -1;
} }
return res;
} }

} // namespace } // namespace

+ 15
- 11
common/JackAudioAdapterInterface.h View File

@@ -23,6 +23,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "JackResampler.h" #include "JackResampler.h"
#include "JackFilters.h" #include "JackFilters.h"
#include "JackConstants.h" #include "JackConstants.h"
#include <stdio.h>


namespace Jack namespace Jack
{ {
@@ -89,12 +90,15 @@ namespace Jack
JackResampler** fPlaybackRingBuffer; JackResampler** fPlaybackRingBuffer;
unsigned int fQuality; unsigned int fQuality;
unsigned int fRingbufferSize;
unsigned int fRingbufferCurSize;
jack_time_t fPullAndPushTime; jack_time_t fPullAndPushTime;
bool fRunning; bool fRunning;
bool fAdaptative;
void ResetRingBuffers(); void ResetRingBuffers();
void AdaptRingBufferSize();
void GrowRingBufferSize();
public: public:


@@ -107,9 +111,11 @@ namespace Jack
fAdaptedSampleRate ( sample_rate ), fAdaptedSampleRate ( sample_rate ),
fPIControler(sample_rate / sample_rate, 256), fPIControler(sample_rate / sample_rate, 256),
fCaptureRingBuffer(NULL), fPlaybackRingBuffer(NULL), fCaptureRingBuffer(NULL), fPlaybackRingBuffer(NULL),
fQuality(0), fRingbufferSize(DEFAULT_RB_SIZE),
fQuality(0),
fRingbufferCurSize(DEFAULT_ADAPTATIVE_SIZE),
fPullAndPushTime(0), fPullAndPushTime(0),
fRunning(false)
fRunning(false),
fAdaptative(true)
{} {}
JackAudioAdapterInterface ( jack_nframes_t host_buffer_size, JackAudioAdapterInterface ( jack_nframes_t host_buffer_size,
jack_nframes_t host_sample_rate, jack_nframes_t host_sample_rate,
@@ -123,7 +129,6 @@ namespace Jack
fAdaptedSampleRate ( adapted_sample_rate ), fAdaptedSampleRate ( adapted_sample_rate ),
fPIControler(host_sample_rate / host_sample_rate, 256), fPIControler(host_sample_rate / host_sample_rate, 256),
fQuality(0), fQuality(0),
fRingbufferSize(DEFAULT_RB_SIZE),
fPullAndPushTime(0), fPullAndPushTime(0),
fRunning ( false ) fRunning ( false )
{} {}
@@ -131,11 +136,6 @@ namespace Jack
virtual ~JackAudioAdapterInterface() virtual ~JackAudioAdapterInterface()
{} {}


bool IsRunning()
{
return fRunning;
}

virtual void Reset(); virtual void Reset();
virtual void Create(); virtual void Create();
@@ -154,12 +154,16 @@ namespace Jack
virtual int SetHostBufferSize ( jack_nframes_t buffer_size ) virtual int SetHostBufferSize ( jack_nframes_t buffer_size )
{ {
fHostBufferSize = buffer_size; fHostBufferSize = buffer_size;
if (fAdaptative)
AdaptRingBufferSize();
return 0; return 0;
} }


virtual int SetAdaptedBufferSize ( jack_nframes_t buffer_size ) virtual int SetAdaptedBufferSize ( jack_nframes_t buffer_size )
{ {
fAdaptedBufferSize = buffer_size; fAdaptedBufferSize = buffer_size;
if (fAdaptative)
AdaptRingBufferSize();
return 0; return 0;
} }


@@ -217,7 +221,7 @@ namespace Jack
int PushAndPull(float** inputBuffer, float** outputBuffer, unsigned int frames); int PushAndPull(float** inputBuffer, float** outputBuffer, unsigned int frames);
int PullAndPush(float** inputBuffer, float** outputBuffer, unsigned int frames); int PullAndPush(float** inputBuffer, float** outputBuffer, unsigned int frames);
}; };


} }


+ 0
- 2
common/JackClient.cpp View File

@@ -674,13 +674,11 @@ int JackClient::TransportReposition(jack_position_t* pos)


jack_transport_state_t JackClient::TransportQuery(jack_position_t* pos) jack_transport_state_t JackClient::TransportQuery(jack_position_t* pos)
{ {
jack_log("TransportQuery");
return GetEngineControl()->fTransport.Query(pos); return GetEngineControl()->fTransport.Query(pos);
} }


jack_nframes_t JackClient::GetCurrentTransportFrame() jack_nframes_t JackClient::GetCurrentTransportFrame()
{ {
jack_log("GetCurrentTransportFrame");
return GetEngineControl()->fTransport.GetCurrentFrame(); return GetEngineControl()->fTransport.GetCurrentFrame();
} }




+ 0
- 5
common/JackConnectionManager.cpp View File

@@ -83,11 +83,6 @@ bool JackConnectionManager::IsLoopPathAux(int ref1, int ref2) const
// External API // External API
//-------------- //--------------


int JackConnectionManager::GetActivation(int refnum) const
{
return fInputCounter[refnum].GetValue();
}

/*! /*!
\brief Connect port_src to port_dst. \brief Connect port_src to port_dst.
*/ */


+ 6
- 1
common/JackConnectionManager.h View File

@@ -440,7 +440,12 @@ class SERVER_EXPORT JackConnectionManager
void DirectConnect(int ref1, int ref2); void DirectConnect(int ref1, int ref2);
void DirectDisconnect(int ref1, int ref2); void DirectDisconnect(int ref1, int ref2);


int GetActivation(int refnum) const;
int GetActivation(int refnum) const
{
return fInputCounter[refnum].GetValue();
}




// Graph // Graph
void ResetGraph(JackClientTiming* timing); void ResetGraph(JackClientTiming* timing);


+ 0
- 43
common/JackEngineControl.cpp View File

@@ -33,44 +33,6 @@ static inline jack_time_t JACK_MAX(jack_time_t a, jack_time_t b)
return (a < b) ? b : a; return (a < b) ? b : a;
} }


void JackEngineControl::CycleIncTime(jack_time_t callback_usecs)
{
// Timer
fFrameTimer.IncFrameTime(fBufferSize, callback_usecs, fPeriodUsecs);
}

void JackEngineControl::CycleBegin(JackClientInterface** table,
JackGraphManager* manager,
jack_time_t cur_cycle_begin,
jack_time_t prev_cycle_end)
{
fTransport.CycleBegin(fSampleRate, cur_cycle_begin);
CalcCPULoad(table, manager, cur_cycle_begin, prev_cycle_end);
#ifdef JACK_MONITOR
fProfiler.Profile(table, manager, fPeriodUsecs, cur_cycle_begin, prev_cycle_end);
#endif
}

void JackEngineControl::CycleEnd(JackClientInterface** table)
{
fTransport.CycleEnd(table, fSampleRate, fBufferSize);
}

void JackEngineControl::InitFrameTime()
{
fFrameTimer.InitFrameTime();
}

void JackEngineControl::ResetFrameTime(jack_time_t cur_cycle_begin)
{
fFrameTimer.ResetFrameTime(fSampleRate, cur_cycle_begin, fPeriodUsecs);
}

void JackEngineControl::ReadFrameTime(JackTimer* timer)
{
fFrameTimer.ReadFrameTime(timer);
}

void JackEngineControl::CalcCPULoad(JackClientInterface** table, void JackEngineControl::CalcCPULoad(JackClientInterface** table,
JackGraphManager* manager, JackGraphManager* manager,
jack_time_t cur_cycle_begin, jack_time_t cur_cycle_begin,
@@ -126,9 +88,4 @@ void JackEngineControl::NotifyXRun(float delayed_usecs)
fMaxDelayedUsecs = delayed_usecs; fMaxDelayedUsecs = delayed_usecs;
} }
void JackEngineControl::ResetXRun()
{
fMaxDelayedUsecs = 0.f;
}

} // end of namespace } // end of namespace

+ 37
- 7
common/JackEngineControl.h View File

@@ -119,18 +119,48 @@ struct SERVER_EXPORT JackEngineControl : public JackShmMem
{} {}


// Cycle // Cycle
void CycleIncTime(jack_time_t callback_usecs);
void CycleBegin(JackClientInterface** table, JackGraphManager* manager, jack_time_t cur_cycle_begin, jack_time_t prev_cycle_end);
void CycleEnd(JackClientInterface** table);
void CycleIncTime(jack_time_t callback_usecs)
{
// Timer
fFrameTimer.IncFrameTime(fBufferSize, callback_usecs, fPeriodUsecs);
}

void CycleBegin(JackClientInterface** table, JackGraphManager* manager, jack_time_t cur_cycle_begin, jack_time_t prev_cycle_end)
{
fTransport.CycleBegin(fSampleRate, cur_cycle_begin);
CalcCPULoad(table, manager, cur_cycle_begin, prev_cycle_end);
#ifdef JACK_MONITOR
fProfiler.Profile(table, manager, fPeriodUsecs, cur_cycle_begin, prev_cycle_end);
#endif
}

void CycleEnd(JackClientInterface** table)
{
fTransport.CycleEnd(table, fSampleRate, fBufferSize);
}


// Timer // Timer
void InitFrameTime();
void ResetFrameTime(jack_time_t callback_usecs);
void ReadFrameTime(JackTimer* timer);
void InitFrameTime()
{
fFrameTimer.InitFrameTime();
}

void ResetFrameTime(jack_time_t callback_usecs)
{
fFrameTimer.ResetFrameTime(fSampleRate, callback_usecs, fPeriodUsecs);
}

void ReadFrameTime(JackTimer* timer)
{
fFrameTimer.ReadFrameTime(timer);
}
// XRun // XRun
void NotifyXRun(float delayed_usecs); void NotifyXRun(float delayed_usecs);
void ResetXRun();
void ResetXRun()
{
fMaxDelayedUsecs = 0.f;
}


// Private // Private
void CalcCPULoad(JackClientInterface** table, JackGraphManager* manager, jack_time_t cur_cycle_begin, jack_time_t prev_cycle_end); void CalcCPULoad(JackClientInterface** table, JackGraphManager* manager, jack_time_t cur_cycle_begin, jack_time_t prev_cycle_end);


+ 1
- 1
common/JackEngineProfiling.h View File

@@ -28,7 +28,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
namespace Jack namespace Jack
{ {


#define TIME_POINTS 125000
#define TIME_POINTS 100000
#define FAILURE_TIME_POINTS 10000 #define FAILURE_TIME_POINTS 10000
#define FAILURE_WINDOW 10 #define FAILURE_WINDOW 10
#define MEASURED_CLIENTS 32 #define MEASURED_CLIENTS 32


+ 20
- 4
common/JackFilters.h View File

@@ -263,20 +263,21 @@ namespace Jack
static_resample_factor = resample_factor; static_resample_factor = resample_factor;
} }
/*
double GetRatio(int fill_level) double GetRatio(int fill_level)
{ {
double offset = fill_level; double offset = fill_level;


// Save offset. // Save offset.
offset_array[(offset_differential_index++) % smooth_size] = offset; offset_array[(offset_differential_index++) % smooth_size] = offset;
// Build the mean of the windowed offset array basically fir lowpassing. // Build the mean of the windowed offset array basically fir lowpassing.
double smooth_offset = 0.0; double smooth_offset = 0.0;
for (int i = 0; i < smooth_size; i++) { for (int i = 0; i < smooth_size; i++) {
smooth_offset += offset_array[(i + offset_differential_index - 1) % smooth_size] * window_array[i]; smooth_offset += offset_array[(i + offset_differential_index - 1) % smooth_size] * window_array[i];
} }
smooth_offset /= double(smooth_size); smooth_offset /= double(smooth_size);
// This is the integral of the smoothed_offset // This is the integral of the smoothed_offset
offset_integral += smooth_offset; offset_integral += smooth_offset;


@@ -284,13 +285,13 @@ namespace Jack
// It only used in the P component and the I component is used for the fine tuning anyways. // It only used in the P component and the I component is used for the fine tuning anyways.
if (fabs(smooth_offset) < pclamp) if (fabs(smooth_offset) < pclamp)
smooth_offset = 0.0; smooth_offset = 0.0;
// Ok, now this is the PI controller. // Ok, now this is the PI controller.
// u(t) = K * (e(t) + 1/T \int e(t') dt') // u(t) = K * (e(t) + 1/T \int e(t') dt')
// Kp = 1/catch_factor and T = catch_factor2 Ki = Kp/T // Kp = 1/catch_factor and T = catch_factor2 Ki = Kp/T
double current_resample_factor double current_resample_factor
= static_resample_factor - smooth_offset / catch_factor - offset_integral / catch_factor / catch_factor2; = static_resample_factor - smooth_offset / catch_factor - offset_integral / catch_factor / catch_factor2;
// Now quantize this value around resample_mean, so that the noise which is in the integral component doesnt hurt. // Now quantize this value around resample_mean, so that the noise which is in the integral component doesnt hurt.
current_resample_factor = floor((current_resample_factor - resample_mean) * controlquant + 0.5) / controlquant + resample_mean; current_resample_factor = floor((current_resample_factor - resample_mean) * controlquant + 0.5) / controlquant + resample_mean;


@@ -298,6 +299,21 @@ namespace Jack
resample_mean = 0.9999 * resample_mean + 0.0001 * current_resample_factor; resample_mean = 0.9999 * resample_mean + 0.0001 * current_resample_factor;
return current_resample_factor; return current_resample_factor;
} }
*/

double GetRatio(int error)
{
double smooth_offset = error;

// This is the integral of the smoothed_offset
offset_integral += smooth_offset;

// Ok, now this is the PI controller.
// u(t) = K * (e(t) + 1/T \int e(t') dt')
// Kp = 1/catch_factor and T = catch_factor2 Ki = Kp/T
return static_resample_factor - smooth_offset/catch_factor - offset_integral/catch_factor/catch_factor2;
}
void OurOfBounds() void OurOfBounds()
{ {


+ 1
- 1
common/JackFrameTimer.h View File

@@ -73,7 +73,7 @@ class SERVER_EXPORT JackTimer
\brief A class using the JackAtomicState to manage jack time. \brief A class using the JackAtomicState to manage jack time.
*/ */


class JackFrameTimer : public JackAtomicState<JackTimer>
class SERVER_EXPORT JackFrameTimer : public JackAtomicState<JackTimer>
{ {
private: private:


+ 5
- 1
common/JackGlobals.cpp View File

@@ -12,7 +12,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details. GNU Lesser General Public License for more details.


You should have received a copy of the GNU Lesser General Public License You should have received a copy of the GNU Lesser General Public License
along with this program; if not, write to the Free Software
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.


*/ */
@@ -32,4 +32,8 @@ JackMutex* JackGlobals::fOpenMutex = new JackMutex();
bool JackGlobals::fServerRunning = false; bool JackGlobals::fServerRunning = false;
JackClient* JackGlobals::fClientTable[CLIENT_NUM] = {}; JackClient* JackGlobals::fClientTable[CLIENT_NUM] = {};


#ifndef WIN32
jack_thread_creator_t JackGlobals::fJackThreadCreator = pthread_create;
#endif

} // end of namespace } // end of namespace

+ 5
- 2
common/JackGlobals.h View File

@@ -12,7 +12,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details. GNU Lesser General Public License for more details.


You should have received a copy of the GNU Lesser General Public License You should have received a copy of the GNU Lesser General Public License
along with this program; if not, write to the Free Software
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.


*/ */
@@ -36,7 +36,10 @@ struct JackGlobals {
static JackMutex* fOpenMutex; static JackMutex* fOpenMutex;
static bool fServerRunning; static bool fServerRunning;
static JackClient* fClientTable[]; static JackClient* fClientTable[];
#ifndef WIN32
static jack_thread_creator_t fJackThreadCreator;
#endif

}; };


} // end of namespace } // end of namespace


+ 0
- 5
common/JackGraphManager.cpp View File

@@ -101,11 +101,6 @@ int JackGraphManager::SuspendRefNum(JackClientControl* control, JackSynchro* tab
return manager->SuspendRefNum(control, table, fClientTiming, usec); return manager->SuspendRefNum(control, table, fClientTiming, usec);
} }


JackClientTiming* JackGraphManager::GetClientTiming(int ref)
{
return &fClientTiming[ref];
}

// Server // Server
void JackGraphManager::DirectConnect(int ref1, int ref2) void JackGraphManager::DirectConnect(int ref1, int ref2)
{ {


+ 5
- 1
common/JackGraphManager.h View File

@@ -120,7 +120,11 @@ class SERVER_EXPORT JackGraphManager : public JackShmMem, public JackAtomicState
int ResumeRefNum(JackClientControl* control, JackSynchro* table); int ResumeRefNum(JackClientControl* control, JackSynchro* table);
int SuspendRefNum(JackClientControl* control, JackSynchro* table, long usecs); int SuspendRefNum(JackClientControl* control, JackSynchro* table, long usecs);


JackClientTiming* GetClientTiming(int refnum);
JackClientTiming* GetClientTiming(int refnum)
{
return &fClientTiming[refnum];
}



void Save(JackConnectionManager* dst); void Save(JackConnectionManager* dst);
void Restore(JackConnectionManager* src); void Restore(JackConnectionManager* src);


+ 4
- 4
common/JackLibSampleRateResampler.cpp View File

@@ -31,8 +31,8 @@ JackLibSampleRateResampler::JackLibSampleRateResampler()
jack_error("JackLibSampleRateResampler::JackLibSampleRateResampler err = %s", src_strerror(error)); jack_error("JackLibSampleRateResampler::JackLibSampleRateResampler err = %s", src_strerror(error));
} }


JackLibSampleRateResampler::JackLibSampleRateResampler(unsigned int quality, unsigned int ringbuffer_size)
:JackResampler(ringbuffer_size)
JackLibSampleRateResampler::JackLibSampleRateResampler(unsigned int quality)
:JackResampler()
{ {
switch (quality) { switch (quality) {
case 0: case 0:
@@ -67,9 +67,9 @@ JackLibSampleRateResampler::~JackLibSampleRateResampler()
src_delete(fResampler); src_delete(fResampler);
} }


void JackLibSampleRateResampler::Reset()
void JackLibSampleRateResampler::Reset(unsigned int new_size)
{ {
JackResampler::Reset();
JackResampler::Reset(new_size);
src_reset(fResampler); src_reset(fResampler);
} }




+ 2
- 2
common/JackLibSampleRateResampler.h View File

@@ -40,13 +40,13 @@ class JackLibSampleRateResampler : public JackResampler
public: public:
JackLibSampleRateResampler(); JackLibSampleRateResampler();
JackLibSampleRateResampler(unsigned int quality, unsigned int ringbuffer_size);
JackLibSampleRateResampler(unsigned int quality);
virtual ~JackLibSampleRateResampler(); virtual ~JackLibSampleRateResampler();
unsigned int ReadResample(float* buffer, unsigned int frames); unsigned int ReadResample(float* buffer, unsigned int frames);
unsigned int WriteResample(float* buffer, unsigned int frames); unsigned int WriteResample(float* buffer, unsigned int frames);
void Reset();
void Reset(unsigned int new_size);
}; };
} }


+ 2
- 2
common/JackNetAPI.cpp View File

@@ -738,9 +738,9 @@ struct JackNetAdapter : public JackAudioAdapterInterface {
fCaptureRingBuffer = new JackResampler*[fCaptureChannels]; fCaptureRingBuffer = new JackResampler*[fCaptureChannels];
fPlaybackRingBuffer = new JackResampler*[fPlaybackChannels]; fPlaybackRingBuffer = new JackResampler*[fPlaybackChannels];
for (int i = 0; i < fCaptureChannels; i++ ) for (int i = 0; i < fCaptureChannels; i++ )
fCaptureRingBuffer[i] = new JackResampler(fRingbufferSize);
fCaptureRingBuffer[i] = new JackResampler();
for (int i = 0; i < fPlaybackChannels; i++ ) for (int i = 0; i < fPlaybackChannels; i++ )
fPlaybackRingBuffer[i] = new JackResampler(fRingbufferSize);
fPlaybackRingBuffer[i] = new JackResampler();


if (fCaptureChannels > 0) if (fCaptureChannels > 0)
jack_log("ReadSpace = %ld", fCaptureRingBuffer[0]->ReadSpace()); jack_log("ReadSpace = %ld", fCaptureRingBuffer[0]->ReadSpace());


+ 16
- 18
common/JackNetAdapter.cpp View File

@@ -96,7 +96,8 @@ namespace Jack
fQuality = param->value.ui; fQuality = param->value.ui;
break; break;
case 'g': case 'g':
fRingbufferSize = param->value.ui;
fRingbufferCurSize = param->value.ui;
fAdaptative = false;
break; break;
} }
} }
@@ -242,27 +243,24 @@ namespace Jack


bool JackNetAdapter::Execute() bool JackNetAdapter::Execute()
{ {
try
{
try {
// Keep running even in case of error // Keep running even in case of error
while ( fThread.GetStatus() == JackThread::kRunning )
if ( Process() == SOCKET_ERROR )
while (fThread.GetStatus() == JackThread::kRunning)
if (Process() == SOCKET_ERROR)
return false; return false;
return false; return false;
}
catch ( JackNetException& e )
{
} catch (JackNetException& e) {
e.PrintMessage(); e.PrintMessage();
jack_log ( "NetAdapter is restarted." );
jack_info("NetAdapter is restarted.");
Reset();
fThread.DropRealTime(); fThread.DropRealTime();
fThread.SetStatus ( JackThread::kIniting );
if ( Init() )
{
fThread.SetStatus ( JackThread::kRunning );
fThread.SetStatus(JackThread::kIniting);
if (Init()) {
fThread.SetStatus(JackThread::kRunning);
return true; return true;
}
else
} else {
return false; return false;
}
} }
} }


@@ -472,9 +470,9 @@ extern "C"
strcpy(desc->params[i].name, "ring-buffer"); strcpy(desc->params[i].name, "ring-buffer");
desc->params[i].character = 'g'; desc->params[i].character = 'g';
desc->params[i].type = JackDriverParamInt; desc->params[i].type = JackDriverParamInt;
desc->params[i].value.ui = 0;
strcpy(desc->params[i].short_desc, "Resampling ringbuffer size in frames (default = 16384)");
strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
desc->params[i].value.ui = 32768;
strcpy(desc->params[i].short_desc, "Fixed ringbuffer size");
strcpy(desc->params[i].long_desc, "Fixed ringbuffer size (if not set => automatic adaptative)");
i++; i++;
strcpy ( desc->params[i].name, "auto-connect" ); strcpy ( desc->params[i].name, "auto-connect" );


+ 4
- 1
common/JackNetDriver.cpp View File

@@ -45,6 +45,9 @@ namespace Jack
fSocket.GetName ( fParams.fSlaveNetName ); fSocket.GetName ( fParams.fSlaveNetName );
fParams.fTransportSync = transport_sync; fParams.fTransportSync = transport_sync;
fParams.fNetworkMode = network_mode; fParams.fNetworkMode = network_mode;
fSendTransportData.fState = -1;
fReturnTransportData.fState = -1;
fLastTransportState = -1;
fLastTimebaseMaster = -1; fLastTimebaseMaster = -1;
fMidiCapturePortList = NULL; fMidiCapturePortList = NULL;
fMidiPlaybackPortList = NULL; fMidiPlaybackPortList = NULL;
@@ -411,7 +414,7 @@ namespace Jack
case JackTransportStarting : case JackTransportStarting :
fEngineControl->fTransport.RequestNewPos ( &fSendTransportData.fPosition ); fEngineControl->fTransport.RequestNewPos ( &fSendTransportData.fPosition );
fEngineControl->fTransport.SetCommand ( TransportCommandStart ); fEngineControl->fTransport.SetCommand ( TransportCommandStart );
jack_info ( "Master starts transport." );
jack_info ( "Master starts transport frame = %d", fSendTransportData.fPosition.frame);
break; break;


case JackTransportRolling : case JackTransportRolling :


+ 6
- 3
common/JackNetManager.cpp View File

@@ -34,6 +34,9 @@ namespace Jack
//settings //settings
fClientName = const_cast<char*> ( fParams.fName ); fClientName = const_cast<char*> ( fParams.fName );
fJackClient = NULL; fJackClient = NULL;
fSendTransportData.fState = -1;
fReturnTransportData.fState = -1;
fLastTransportState = -1;
uint port_index; uint port_index;


//jack audio ports //jack audio ports
@@ -279,7 +282,7 @@ namespace Jack
fSendTransportData.fNewState = ( ( fSendTransportData.fState != fLastTransportState ) && fSendTransportData.fNewState = ( ( fSendTransportData.fState != fLastTransportState ) &&
( fSendTransportData.fState != fReturnTransportData.fState ) ); ( fSendTransportData.fState != fReturnTransportData.fState ) );
if ( fSendTransportData.fNewState ) if ( fSendTransportData.fNewState )
jack_info ( "Sending '%s' to '%s'.", GetTransportState ( fSendTransportData.fState ), fParams.fName );
jack_info ( "Sending '%s' to '%s' frame = %ld", GetTransportState ( fSendTransportData.fState ), fParams.fName, fSendTransportData.fPosition.frame );
fLastTransportState = fSendTransportData.fState; fLastTransportState = fSendTransportData.fState;
} }


@@ -328,10 +331,10 @@ namespace Jack
jack_info ( "'%s' stops transport.", fParams.fName ); jack_info ( "'%s' stops transport.", fParams.fName );
break; break;
case JackTransportStarting : case JackTransportStarting :
if ( jack_transport_reposition ( fJackClient, &fReturnTransportData.fPosition ) < 0 )
if ( jack_transport_reposition ( fJackClient, &fReturnTransportData.fPosition ) == EINVAL )
jack_error ( "Can't set new position." ); jack_error ( "Can't set new position." );
jack_transport_start ( fJackClient ); jack_transport_start ( fJackClient );
jack_info ( "'%s' starts transport.", fParams.fName );
jack_info ( "'%s' starts transport frame = %d", fParams.fName, fReturnTransportData.fPosition.frame);
break; break;
case JackTransportNetStarting : case JackTransportNetStarting :
jack_info ( "'%s' is ready to roll..", fParams.fName ); jack_info ( "'%s' is ready to roll..", fParams.fName );


+ 4
- 10
common/JackResampler.cpp View File

@@ -30,23 +30,17 @@ JackResampler::JackResampler()
jack_ringbuffer_read_advance(fRingBuffer, (sizeof(float) * fRingBufferSize) / 2); jack_ringbuffer_read_advance(fRingBuffer, (sizeof(float) * fRingBufferSize) / 2);
} }


JackResampler::JackResampler(unsigned int ringbuffer_size)
:fRatio(1),fRingBufferSize(ringbuffer_size)
{
fRingBuffer = jack_ringbuffer_create(sizeof(float) * fRingBufferSize);
jack_ringbuffer_read_advance(fRingBuffer, (sizeof(float) * fRingBufferSize) / 2);
}

JackResampler::~JackResampler() JackResampler::~JackResampler()
{ {
if (fRingBuffer) if (fRingBuffer)
jack_ringbuffer_free(fRingBuffer); jack_ringbuffer_free(fRingBuffer);
} }


void JackResampler::Reset()
void JackResampler::Reset(unsigned int new_size)
{ {
jack_ringbuffer_reset(fRingBuffer);
jack_ringbuffer_read_advance(fRingBuffer, (sizeof(float) * fRingBufferSize) / 2);
fRingBufferSize = new_size;
jack_ringbuffer_reset_size(fRingBuffer, sizeof(float) * fRingBufferSize);
jack_ringbuffer_read_advance(fRingBuffer, (sizeof(float) * fRingBufferSize / 2));
} }


unsigned int JackResampler::ReadSpace() unsigned int JackResampler::ReadSpace()


+ 4
- 4
common/JackResampler.h View File

@@ -26,7 +26,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
namespace Jack namespace Jack
{ {


#define DEFAULT_RB_SIZE 16384
#define DEFAULT_RB_SIZE 32768
#define DEFAULT_ADAPTATIVE_SIZE 2048


inline float Range(float min, float max, float val) inline float Range(float min, float max, float val)
{ {
@@ -49,10 +50,9 @@ class JackResampler
public: public:
JackResampler(); JackResampler();
JackResampler(unsigned int ringbuffer_size);
virtual ~JackResampler(); virtual ~JackResampler();
virtual void Reset();
virtual void Reset(unsigned int new_size);
virtual unsigned int ReadResample(float* buffer, unsigned int frames); virtual unsigned int ReadResample(float* buffer, unsigned int frames);
virtual unsigned int WriteResample(float* buffer, unsigned int frames); virtual unsigned int WriteResample(float* buffer, unsigned int frames);
@@ -63,7 +63,7 @@ class JackResampler
virtual unsigned int ReadSpace(); virtual unsigned int ReadSpace();
virtual unsigned int WriteSpace(); virtual unsigned int WriteSpace();
unsigned int GetOffset()
unsigned int GetError()
{ {
return (jack_ringbuffer_read_space(fRingBuffer) / sizeof(float)) - (fRingBufferSize / 2); return (jack_ringbuffer_read_space(fRingBuffer) / sizeof(float)) - (fRingBufferSize / 2);
} }


+ 1
- 0
common/JackThreadedDriver.cpp View File

@@ -209,6 +209,7 @@ bool JackThreadedDriver::Init()
if (fDriver->IsRealTime()) { if (fDriver->IsRealTime()) {
jack_log("JackThreadedDriver::Init IsRealTime"); jack_log("JackThreadedDriver::Init IsRealTime");
// Will do "something" on OSX only... // Will do "something" on OSX only...
GetEngineControl()->fPeriod = GetEngineControl()->fConstraint = GetEngineControl()->fPeriodUsecs * 1000;
fThread.SetParams(GetEngineControl()->fPeriod, GetEngineControl()->fComputation, GetEngineControl()->fConstraint); fThread.SetParams(GetEngineControl()->fPeriod, GetEngineControl()->fComputation, GetEngineControl()->fConstraint);
if (fThread.AcquireRealTime(GetEngineControl()->fServerPriority) < 0) { if (fThread.AcquireRealTime(GetEngineControl()->fServerPriority) < 0) {
jack_error("AcquireRealTime error"); jack_error("AcquireRealTime error");


+ 0
- 6
common/JackTransportEngine.cpp View File

@@ -86,12 +86,6 @@ int JackTransportEngine::SetTimebaseMaster(int refnum, bool conditionnal)
} }
} }


void JackTransportEngine::GetTimebaseMaster(int& refnum, bool& conditionnal)
{
refnum = fTimeBaseMaster;
conditionnal = fConditionnal;
}

// RT // RT
bool JackTransportEngine::CheckAllRolling(JackClientInterface** table) bool JackTransportEngine::CheckAllRolling(JackClientInterface** table)
{ {


+ 5
- 1
common/JackTransportEngine.h View File

@@ -144,7 +144,11 @@ class SERVER_EXPORT JackTransportEngine : public JackAtomicArrayState<jack_posit
*/ */
int SetTimebaseMaster(int refnum, bool conditionnal); int SetTimebaseMaster(int refnum, bool conditionnal);
void GetTimebaseMaster(int& refnum, bool& conditionnal);
void GetTimebaseMaster(int& refnum, bool& conditionnal)
{
refnum = fTimeBaseMaster;
conditionnal = fConditionnal;
}


/* /*
\brief \brief


+ 2
- 1
common/JackWaitThreadedDriver.cpp View File

@@ -46,6 +46,7 @@ bool JackWaitThreadedDriver::Execute()
if (fDriver->IsRealTime()) { if (fDriver->IsRealTime()) {
jack_log("JackWaitThreadedDriver::Init IsRealTime"); jack_log("JackWaitThreadedDriver::Init IsRealTime");
// Will do "something" on OSX only... // Will do "something" on OSX only...
GetEngineControl()->fPeriod = GetEngineControl()->fConstraint = GetEngineControl()->fPeriodUsecs * 1000;
fThread.SetParams(GetEngineControl()->fPeriod, GetEngineControl()->fComputation, GetEngineControl()->fConstraint); fThread.SetParams(GetEngineControl()->fPeriod, GetEngineControl()->fComputation, GetEngineControl()->fConstraint);
if (fThread.AcquireRealTime(GetEngineControl()->fServerPriority) < 0) { if (fThread.AcquireRealTime(GetEngineControl()->fServerPriority) < 0) {
jack_error("AcquireRealTime error"); jack_error("AcquireRealTime error");
@@ -61,7 +62,7 @@ bool JackWaitThreadedDriver::Execute()
return false; return false;
} catch (JackNetException& e) { } catch (JackNetException& e) {
e.PrintMessage(); e.PrintMessage();
jack_log("Driver is restarted");
jack_info("Driver is restarted");
fThread.DropRealTime(); fThread.DropRealTime();
// Thread in kIniting status again... // Thread in kIniting status again...
fThread.SetStatus(JackThread::kIniting); fThread.SetStatus(JackThread::kIniting);


+ 10
- 0
common/jack/ringbuffer.h View File

@@ -192,6 +192,16 @@ int jack_ringbuffer_mlock(jack_ringbuffer_t *rb);
*/ */
void jack_ringbuffer_reset(jack_ringbuffer_t *rb); void jack_ringbuffer_reset(jack_ringbuffer_t *rb);


/**
* Reset the internal "available" size, and read and write pointers, making an empty buffer.
*
* This is not thread safe.
*
* @param rb a pointer to the ringbuffer structure.
* @param sz the new size, that must be less than allocated size.
*/
void jack_ringbuffer_reset_size (jack_ringbuffer_t * rb, size_t sz);

/** /**
* Write data into the ringbuffer. * Write data into the ringbuffer.
* *


+ 31
- 4
common/jack/thread.h View File

@@ -33,15 +33,15 @@ extern "C"
* clients. These interfaces hide some system variations in the * clients. These interfaces hide some system variations in the
* handling of realtime scheduling and associated privileges. * handling of realtime scheduling and associated privileges.
*/ */
/** /**
* @defgroup ClientThreads Creating and managing client threads * @defgroup ClientThreads Creating and managing client threads
* @{ * @{
*/ */
/** /**
* @returns if JACK is running with realtime scheduling, this returns * @returns if JACK is running with realtime scheduling, this returns
* the priority that any JACK-created client threads will run at.
* the priority that any JACK-created client threads will run at.
* Otherwise returns -1. * Otherwise returns -1.
*/ */


@@ -114,8 +114,35 @@ int jack_client_stop_thread(jack_client_t* client, pthread_t thread);
* @param thread POSIX thread ID. * @param thread POSIX thread ID.
* *
* @returns 0, if successful; otherwise an error number. * @returns 0, if successful; otherwise an error number.
*/
*/
int jack_client_kill_thread(jack_client_t* client, pthread_t thread); int jack_client_kill_thread(jack_client_t* client, pthread_t thread);
#ifndef WIN32

typedef int (*jack_thread_creator_t)(pthread_t*,
const pthread_attr_t*,
void* (*function)(void*),
void* arg);
/**
* This function can be used in very very specialized cases
* where it is necessary that client threads created by JACK
* are created by something other than pthread_create(). After
* it is used, any threads that JACK needs for the client will
* will be created by calling the function passed to this
* function.
*
* No normal application/client should consider calling this.
* The specific case for which it was created involves running
* win32/x86 plugins under Wine on Linux, where it is necessary
* that all threads that might call win32 functions are known
* to Wine.
*
* @param creator a function that creates a new thread
*
*/
void jack_set_thread_creator (jack_thread_creator_t creator);
#endif


/* @} */ /* @} */




+ 14
- 0
common/ringbuffer.c View File

@@ -55,6 +55,7 @@ EXPORT void jack_ringbuffer_read_advance(jack_ringbuffer_t *rb, size_t cnt);
EXPORT size_t jack_ringbuffer_read_space(const jack_ringbuffer_t *rb); EXPORT size_t jack_ringbuffer_read_space(const jack_ringbuffer_t *rb);
EXPORT int jack_ringbuffer_mlock(jack_ringbuffer_t *rb); EXPORT int jack_ringbuffer_mlock(jack_ringbuffer_t *rb);
EXPORT void jack_ringbuffer_reset(jack_ringbuffer_t *rb); EXPORT void jack_ringbuffer_reset(jack_ringbuffer_t *rb);
EXPORT void jack_ringbuffer_reset_size (jack_ringbuffer_t * rb, size_t sz);
EXPORT size_t jack_ringbuffer_write(jack_ringbuffer_t *rb, const char *src, EXPORT size_t jack_ringbuffer_write(jack_ringbuffer_t *rb, const char *src,
size_t cnt); size_t cnt);
void jack_ringbuffer_write_advance(jack_ringbuffer_t *rb, size_t cnt); void jack_ringbuffer_write_advance(jack_ringbuffer_t *rb, size_t cnt);
@@ -123,6 +124,19 @@ jack_ringbuffer_reset (jack_ringbuffer_t * rb)
rb->write_ptr = 0; rb->write_ptr = 0;
} }


/* Reset the read and write pointers to zero. This is not thread
safe. */

EXPORT void
jack_ringbuffer_reset_size (jack_ringbuffer_t * rb, size_t sz)
{
rb->size = sz;
rb->size_mask = rb->size;
rb->size_mask -= 1;
rb->read_ptr = 0;
rb->write_ptr = 0;
}

/* Return the number of bytes available for reading. This is the /* Return the number of bytes available for reading. This is the
number of bytes in front of the read pointer and behind the write number of bytes in front of the read pointer and behind the write
pointer. */ pointer. */


+ 1
- 0
common/wscript View File

@@ -190,6 +190,7 @@ def build(bld):
'JackAudioAdapterInterface.cpp', 'JackAudioAdapterInterface.cpp',
'JackLibSampleRateResampler.cpp', 'JackLibSampleRateResampler.cpp',
'JackResampler.cpp', 'JackResampler.cpp',
'JackGlobals.cpp',
'ringbuffer.c'] 'ringbuffer.c']


if bld.env['IS_LINUX']: if bld.env['IS_LINUX']:


+ 6
- 6
linux/alsa/JackAlsaAdapter.cpp View File

@@ -77,7 +77,8 @@ namespace Jack
fQuality = param->value.ui; fQuality = param->value.ui;
break; break;
case 'g': case 'g':
fRingbufferSize = param->value.ui;
fRingbufferCurSize = param->value.ui;
fAdaptative = false;
break; break;
} }
} }
@@ -104,7 +105,6 @@ namespace Jack


//turn the thread realtime //turn the thread realtime
fThread.AcquireRealTime ( JackServerGlobals::fInstance->GetEngineControl()->fClientPriority ); fThread.AcquireRealTime ( JackServerGlobals::fInstance->GetEngineControl()->fClientPriority );

return 0; return 0;
} }


@@ -251,7 +251,7 @@ extern "C"
strcpy ( desc->params[i].name, "duplex" ); strcpy ( desc->params[i].name, "duplex" );
desc->params[i].character = 'D'; desc->params[i].character = 'D';
desc->params[i].type = JackDriverParamBool; desc->params[i].type = JackDriverParamBool;
desc->params[i].value.i = 1;
desc->params[i].value.i = true;
strcpy ( desc->params[i].short_desc, strcpy ( desc->params[i].short_desc,
"Provide both capture and playback ports" ); "Provide both capture and playback ports" );
strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); strcpy ( desc->params[i].long_desc, desc->params[i].short_desc );
@@ -286,9 +286,9 @@ extern "C"
strcpy(desc->params[i].name, "ring-buffer"); strcpy(desc->params[i].name, "ring-buffer");
desc->params[i].character = 'g'; desc->params[i].character = 'g';
desc->params[i].type = JackDriverParamInt; desc->params[i].type = JackDriverParamInt;
desc->params[i].value.ui = 0;
strcpy(desc->params[i].short_desc, "Resampling ringbuffer size in frames (default = 16384)");
strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
desc->params[i].value.ui = 32768;
strcpy(desc->params[i].short_desc, "Fixed ringbuffer size");
strcpy(desc->params[i].long_desc, "Fixed ringbuffer size (if not set => automatic adaptative)");


return desc; return desc;
} }


+ 1
- 0
linux/wscript View File

@@ -22,6 +22,7 @@ def create_jack_driver_obj(bld, target, sources, uselib = None):
driver.install_path = '${ADDON_DIR}/' driver.install_path = '${ADDON_DIR}/'
if uselib: if uselib:
driver.uselib = uselib driver.uselib = uselib
driver.uselib_local = 'serverlib'
return driver return driver


def build(bld): def build(bld):


+ 5
- 4
macosx/coreaudio/JackCoreAudioAdapter.cpp View File

@@ -378,7 +378,8 @@ JackCoreAudioAdapter::JackCoreAudioAdapter(jack_nframes_t buffer_size, jack_nfra
break; break;
case 'g': case 'g':
fRingbufferSize = param->value.ui;
fRingbufferCurSize = param->value.ui;
fAdaptative = false;
break; break;
} }
} }
@@ -1080,9 +1081,9 @@ extern "C"
strcpy(desc->params[i].name, "ring-buffer"); strcpy(desc->params[i].name, "ring-buffer");
desc->params[i].character = 'g'; desc->params[i].character = 'g';
desc->params[i].type = JackDriverParamInt; desc->params[i].type = JackDriverParamInt;
desc->params[i].value.ui = 0;
strcpy(desc->params[i].short_desc, "Resampling ringbuffer size in frames (default = 16384)");
strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
desc->params[i].value.ui = 32768;
strcpy(desc->params[i].short_desc, "Fixed ringbuffer size");
strcpy(desc->params[i].long_desc, "Fixed ringbuffer size (if not set => automatic adaptative)");


return desc; return desc;
} }


+ 10
- 0
macosx/iphone/iPhoneNet.xcodeproj/project.pbxproj View File

@@ -52,6 +52,10 @@
4B1A945A0F49C03600D3626B /* JackPosixThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1A933B0F49AC4500D3626B /* JackPosixThread.cpp */; }; 4B1A945A0F49C03600D3626B /* JackPosixThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1A933B0F49AC4500D3626B /* JackPosixThread.cpp */; };
4B1A947F0F49C42300D3626B /* JackAudioQueueAdapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1A947D0F49C42300D3626B /* JackAudioQueueAdapter.cpp */; }; 4B1A947F0F49C42300D3626B /* JackAudioQueueAdapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1A947D0F49C42300D3626B /* JackAudioQueueAdapter.cpp */; };
4B1A95760F49CEAB00D3626B /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B1A95750F49CEAB00D3626B /* AudioToolbox.framework */; }; 4B1A95760F49CEAB00D3626B /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B1A95750F49CEAB00D3626B /* AudioToolbox.framework */; };
4B2791880F72570C000536B7 /* JackGlobals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B2791870F72570C000536B7 /* JackGlobals.cpp */; };
4B2791890F72570C000536B7 /* JackGlobals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B2791870F72570C000536B7 /* JackGlobals.cpp */; };
4B27918A0F72570C000536B7 /* JackGlobals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B2791870F72570C000536B7 /* JackGlobals.cpp */; };
4B27918B0F72570C000536B7 /* JackGlobals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B2791870F72570C000536B7 /* JackGlobals.cpp */; };
4BBDC8FA0F5420C000465F9C /* freeverb.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4BBDC8F90F5420C000465F9C /* freeverb.mm */; }; 4BBDC8FA0F5420C000465F9C /* freeverb.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4BBDC8F90F5420C000465F9C /* freeverb.mm */; };
4BF1360F0F4B0B4C00218A3F /* JackAudioAdapterInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF1360E0F4B0B4C00218A3F /* JackAudioAdapterInterface.cpp */; }; 4BF1360F0F4B0B4C00218A3F /* JackAudioAdapterInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF1360E0F4B0B4C00218A3F /* JackAudioAdapterInterface.cpp */; };
4BF136100F4B0B4C00218A3F /* JackAudioAdapterInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF1360E0F4B0B4C00218A3F /* JackAudioAdapterInterface.cpp */; }; 4BF136100F4B0B4C00218A3F /* JackAudioAdapterInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF1360E0F4B0B4C00218A3F /* JackAudioAdapterInterface.cpp */; };
@@ -104,6 +108,7 @@
4B1A947D0F49C42300D3626B /* JackAudioQueueAdapter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackAudioQueueAdapter.cpp; path = ../coreaudio/JackAudioQueueAdapter.cpp; sourceTree = SOURCE_ROOT; }; 4B1A947D0F49C42300D3626B /* JackAudioQueueAdapter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackAudioQueueAdapter.cpp; path = ../coreaudio/JackAudioQueueAdapter.cpp; sourceTree = SOURCE_ROOT; };
4B1A947E0F49C42300D3626B /* JackAudioQueueAdapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackAudioQueueAdapter.h; path = ../coreaudio/JackAudioQueueAdapter.h; sourceTree = SOURCE_ROOT; }; 4B1A947E0F49C42300D3626B /* JackAudioQueueAdapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackAudioQueueAdapter.h; path = ../coreaudio/JackAudioQueueAdapter.h; sourceTree = SOURCE_ROOT; };
4B1A95750F49CEAB00D3626B /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.1.sdk/System/Library/Frameworks/AudioToolbox.framework; sourceTree = "<absolute>"; }; 4B1A95750F49CEAB00D3626B /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.1.sdk/System/Library/Frameworks/AudioToolbox.framework; sourceTree = "<absolute>"; };
4B2791870F72570C000536B7 /* JackGlobals.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackGlobals.cpp; path = ../../common/JackGlobals.cpp; sourceTree = SOURCE_ROOT; };
4BBDC8F90F5420C000465F9C /* freeverb.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = freeverb.mm; sourceTree = SOURCE_ROOT; }; 4BBDC8F90F5420C000465F9C /* freeverb.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = freeverb.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; }; 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; };
@@ -204,6 +209,7 @@
4B1A93110F49AB3400D3626B /* JackNetTool.cpp */, 4B1A93110F49AB3400D3626B /* JackNetTool.cpp */,
4B1A930F0F49AB2F00D3626B /* JackNetInterface.cpp */, 4B1A930F0F49AB2F00D3626B /* JackNetInterface.cpp */,
4B1A930D0F49AB2A00D3626B /* JackNetAPI.cpp */, 4B1A930D0F49AB2A00D3626B /* JackNetAPI.cpp */,
4B2791870F72570C000536B7 /* JackGlobals.cpp */,
32CA4F630368D1EE00C91783 /* iPhoneNet_Prefix.pch */, 32CA4F630368D1EE00C91783 /* iPhoneNet_Prefix.pch */,
4B0772490F54021B000DC657 /* main_slave.mm */, 4B0772490F54021B000DC657 /* main_slave.mm */,
4B0772500F54022D000DC657 /* main_master.mm */, 4B0772500F54022D000DC657 /* main_master.mm */,
@@ -383,6 +389,7 @@
4BF136550F4B0F9F00218A3F /* ringbuffer.c in Sources */, 4BF136550F4B0F9F00218A3F /* ringbuffer.c in Sources */,
4B07724A0F54021B000DC657 /* main_slave.mm in Sources */, 4B07724A0F54021B000DC657 /* main_slave.mm in Sources */,
4B0773870F541EE2000DC657 /* iPhoneNetAppDelegate.m in Sources */, 4B0773870F541EE2000DC657 /* iPhoneNetAppDelegate.m in Sources */,
4B27918A0F72570C000536B7 /* JackGlobals.cpp in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@@ -403,6 +410,7 @@
4B07722E0F54018C000DC657 /* ringbuffer.c in Sources */, 4B07722E0F54018C000DC657 /* ringbuffer.c in Sources */,
4B0772510F54022D000DC657 /* main_master.mm in Sources */, 4B0772510F54022D000DC657 /* main_master.mm in Sources */,
4B0773860F541EE2000DC657 /* iPhoneNetAppDelegate.m in Sources */, 4B0773860F541EE2000DC657 /* iPhoneNetAppDelegate.m in Sources */,
4B27918B0F72570C000536B7 /* JackGlobals.cpp in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@@ -420,6 +428,7 @@
4BF136100F4B0B4C00218A3F /* JackAudioAdapterInterface.cpp in Sources */, 4BF136100F4B0B4C00218A3F /* JackAudioAdapterInterface.cpp in Sources */,
4BF1364E0F4B0F7700218A3F /* JackResampler.cpp in Sources */, 4BF1364E0F4B0F7700218A3F /* JackResampler.cpp in Sources */,
4BF136560F4B0F9F00218A3F /* ringbuffer.c in Sources */, 4BF136560F4B0F9F00218A3F /* ringbuffer.c in Sources */,
4B2791890F72570C000536B7 /* JackGlobals.cpp in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@@ -440,6 +449,7 @@
4BFF456D0F4D5D9700106083 /* ringbuffer.c in Sources */, 4BFF456D0F4D5D9700106083 /* ringbuffer.c in Sources */,
4B0773880F541EE2000DC657 /* iPhoneNetAppDelegate.m in Sources */, 4B0773880F541EE2000DC657 /* iPhoneNetAppDelegate.m in Sources */,
4BBDC8FA0F5420C000465F9C /* freeverb.mm in Sources */, 4BBDC8FA0F5420C000465F9C /* freeverb.mm in Sources */,
4B2791880F72570C000536B7 /* JackGlobals.cpp in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };


+ 4
- 2
posix/JackFifo.cpp View File

@@ -30,9 +30,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
namespace Jack namespace Jack
{ {


void JackFifo::BuildName(const char* name, const char* server_name, char* res)
void JackFifo::BuildName(const char* client_name, const char* server_name, char* res)
{ {
sprintf(res, "%s/jack_fifo.%d_%s_%s", jack_client_dir, JackTools::GetUID(), server_name, name);
char ext_client_name[JACK_CLIENT_NAME_SIZE + 1];
JackTools::RewriteName(client_name, ext_client_name);
sprintf(res, "%s/jack_fifo.%d_%s_%s", jack_client_dir, JackTools::GetUID(), server_name, ext_client_name);
} }


bool JackFifo::Signal() bool JackFifo::Signal()


+ 2
- 1
posix/JackPosixThread.cpp View File

@@ -21,6 +21,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "JackPosixThread.h" #include "JackPosixThread.h"
#include "JackError.h" #include "JackError.h"
#include "JackTime.h" #include "JackTime.h"
#include "JackGlobals.h"
#include <string.h> // for memset #include <string.h> // for memset
#include <unistd.h> // for _POSIX_PRIORITY_SCHEDULING check #include <unistd.h> // for _POSIX_PRIORITY_SCHEDULING check


@@ -139,7 +140,7 @@ int JackPosixThread::StartImp(pthread_t* thread, int priority, int realtime, voi
return -1; return -1;
} }


if ((res = pthread_create(thread, &attributes, start_routine, arg))) {
if ((res = JackGlobals::fJackThreadCreator(thread, &attributes, start_routine, arg))) {
jack_error("Cannot create thread res = %d err = %s", res, strerror(errno)); jack_error("Cannot create thread res = %d err = %s", res, strerror(errno));
return -1; return -1;
} }


+ 10
- 90
posix/JackSocket.cpp View File

@@ -29,6 +29,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
namespace Jack namespace Jack
{ {


static void BuildName(const char* client_name, char* res, const char* dir, int which)
{
char ext_client_name[JACK_CLIENT_NAME_SIZE + 1];
JackTools::RewriteName(client_name, ext_client_name);
sprintf(res, "%s/jack_%s_%d_%d", dir, ext_client_name, JackTools::GetUID(), which);
}

JackClientSocket::JackClientSocket(int socket): fSocket(socket),fTimeOut(0) JackClientSocket::JackClientSocket(int socket): fSocket(socket),fTimeOut(0)
{} {}


@@ -112,36 +119,7 @@ int JackClientSocket::Connect(const char* dir, const char* name, int which) // A
} }


addr.sun_family = AF_UNIX; addr.sun_family = AF_UNIX;
snprintf(addr.sun_path, sizeof(addr.sun_path) - 1, "%s/jack_%s_%d_%d", dir, name, JackTools::GetUID(), which);
jack_log("Connect: addr.sun_path %s", addr.sun_path);

if (connect(fSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
jack_error("Cannot connect to server socket err = %s", strerror(errno));
close(fSocket);
return -1;
}

#ifdef __APPLE__
int on = 1 ;
if (setsockopt(fSocket, SOL_SOCKET, SO_NOSIGPIPE, (const char*)&on, sizeof(on)) < 0) {
jack_log("setsockopt SO_NOSIGPIPE fd = %ld err = %s", fSocket, strerror(errno));
}
#endif

return 0;
}

int JackClientSocket::Connect(const char* dir, int which)
{
struct sockaddr_un addr;

if ((fSocket = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
jack_error("Cannot create socket err = %s", strerror(errno));
return -1;
}

addr.sun_family = AF_UNIX;
snprintf(addr.sun_path, sizeof(addr.sun_path) - 1, "%s/jack_%d_%d", dir, JackTools::GetUID(), which);
BuildName(name, addr.sun_path, dir, which);
jack_log("Connect: addr.sun_path %s", addr.sun_path); jack_log("Connect: addr.sun_path %s", addr.sun_path);


if (connect(fSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) { if (connect(fSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
@@ -271,67 +249,9 @@ int JackServerSocket::Bind(const char* dir, const char* name, int which) // A re
} }


addr.sun_family = AF_UNIX; addr.sun_family = AF_UNIX;

// TO CORRECT: always reuse the same name for now...
snprintf(fName, sizeof(addr.sun_path) - 1, "%s/jack_%s_%d_%d", dir, name, JackTools::GetUID(), which);
BuildName(name, fName, dir, which);
strncpy(addr.sun_path, fName, sizeof(addr.sun_path) - 1); strncpy(addr.sun_path, fName, sizeof(addr.sun_path) - 1);
/*
if (access(addr.sun_path, F_OK) == 0) {
goto error;
}
*/

jack_log("Bind: addr.sun_path %s", addr.sun_path);
unlink(fName); // Security...

if (bind(fSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
jack_error("Cannot bind server to socket err = %s", strerror(errno));
goto error;
}

if (listen(fSocket, 1) < 0) {
jack_error("Cannot enable listen on server socket err = %s", strerror(errno));
goto error;
}

return 0;

error:
unlink(fName);
close(fSocket);
return -1;
}

int JackServerSocket::Bind(const char* dir, int which) // A revoir : utilisation de "which"
{
struct sockaddr_un addr;

if ((fSocket = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
jack_error("Cannot create server socket err = %s", strerror(errno));
return -1;
}

addr.sun_family = AF_UNIX;

/*
for (int i = 0; i < 999; i++) {
snprintf(addr.sun_path, sizeof(addr.sun_path) - 1,"%s/jack_%d", dir, i);
snprintf(fName, sizeof(addr.sun_path) - 1,"%s/jack_%d", dir, i);
if (access(addr.sun_path, F_OK) != 0) {
break;
}
}
*/

// TO CORRECT: always reuse the same name for now...
snprintf(fName, sizeof(addr.sun_path) - 1, "%s/jack_%d_%d", dir, JackTools::GetUID(), which);
strncpy(addr.sun_path, fName, sizeof(addr.sun_path) - 1);
/*
if (access(addr.sun_path, F_OK) == 0) {
goto error;
}
*/

jack_log("Bind: addr.sun_path %s", addr.sun_path); jack_log("Bind: addr.sun_path %s", addr.sun_path);
unlink(fName); // Security... unlink(fName); // Security...




+ 4
- 3
posix/JackSocket.h View File

@@ -50,7 +50,6 @@ class JackClientSocket
{} {}
JackClientSocket(int socket); JackClientSocket(int socket);


int Connect(const char* dir, int which);
int Connect(const char* dir, const char* name, int which); int Connect(const char* dir, const char* name, int which);
int Close(); int Close();
int Read(void* data, int len); int Read(void* data, int len);
@@ -69,13 +68,16 @@ class JackClientSocket
\brief Server socket. \brief Server socket.
*/ */


#define SOCKET_MAX_NAME_SIZE 256


class JackServerSocket class JackServerSocket
{ {


private: private:


int fSocket; int fSocket;
char fName[256];
char fName[SOCKET_MAX_NAME_SIZE];


public: public:


@@ -84,7 +86,6 @@ class JackServerSocket
~JackServerSocket() ~JackServerSocket()
{} {}


int Bind(const char* dir, int which);
int Bind(const char* dir, const char* name, int which); int Bind(const char* dir, const char* name, int which);
JackClientSocket* Accept(); JackClientSocket* Accept();
int Close(); int Close();


+ 2
- 0
posix/JackTypes_os.h View File

@@ -26,4 +26,6 @@
typedef unsigned long long UInt64; typedef unsigned long long UInt64;
typedef pthread_key_t jack_tls_key; typedef pthread_key_t jack_tls_key;


typedef int (*jack_thread_creator_t)(pthread_t*, const pthread_attr_t*, void* (*function)(void*), void* arg);

#endif #endif

+ 15
- 7
solaris/oss/JackOSSAdapter.cpp View File

@@ -183,7 +183,8 @@ JackOSSAdapter::JackOSSAdapter(jack_nframes_t buffer_size, jack_nframes_t sample
break; break;
case 'g': case 'g':
fRingbufferSize = param->value.ui;
fRingbufferCurSize = param->value.ui;
fAdaptative = false;
break; break;


} }
@@ -494,9 +495,16 @@ int JackOSSAdapter::Open()
} }


DisplayDeviceInfo(); DisplayDeviceInfo();

//start adapter thread
if (fThread.StartSync() < 0) {
jack_error ( "Cannot start audioadapter thread" );
return -1;
}
//turn the thread realtime
fThread.AcquireRealTime(JackServerGlobals::fInstance->GetEngineControl()->fClientPriority); fThread.AcquireRealTime(JackServerGlobals::fInstance->GetEngineControl()->fClientPriority);
return fThread.StartSync();
return 0;
error: error:
CloseAux(); CloseAux();
@@ -742,10 +750,10 @@ extern "C"
strcpy(desc->params[i].name, "ring-buffer"); strcpy(desc->params[i].name, "ring-buffer");
desc->params[i].character = 'g'; desc->params[i].character = 'g';
desc->params[i].type = JackDriverParamInt; desc->params[i].type = JackDriverParamInt;
desc->params[i].value.ui = 0;
strcpy(desc->params[i].short_desc, "Resampling ringbuffer size in frames (default = 16384)");
strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
desc->params[i].value.ui = 32768;
strcpy(desc->params[i].short_desc, "Fixed ringbuffer size");
strcpy(desc->params[i].long_desc, "Fixed ringbuffer size (if not set => automatic adaptative)");
return desc; return desc;
} }


+ 6
- 5
windows/portaudio/JackPortAudioAdapter.cpp View File

@@ -97,7 +97,8 @@ namespace Jack
fQuality = param->value.ui; fQuality = param->value.ui;
break; break;
case 'g': case 'g':
fRingbufferSize = param->value.ui;
fRingbufferCurSize = param->value.ui;
fAdaptative = false;
break; break;
} }
} }
@@ -282,7 +283,7 @@ extern "C"
strcpy(desc->params[i].name, "list-devices"); strcpy(desc->params[i].name, "list-devices");
desc->params[i].character = 'l'; desc->params[i].character = 'l';
desc->params[i].type = JackDriverParamBool; desc->params[i].type = JackDriverParamBool;
desc->params[i].value.i = TRUE;
desc->params[i].value.i = true;
strcpy(desc->params[i].short_desc, "Display available PortAudio devices"); strcpy(desc->params[i].short_desc, "Display available PortAudio devices");
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); strcpy(desc->params[i].long_desc, desc->params[i].short_desc);


@@ -298,9 +299,9 @@ extern "C"
strcpy(desc->params[i].name, "ring-buffer"); strcpy(desc->params[i].name, "ring-buffer");
desc->params[i].character = 'g'; desc->params[i].character = 'g';
desc->params[i].type = JackDriverParamInt; desc->params[i].type = JackDriverParamInt;
desc->params[i].value.ui = 0;
strcpy(desc->params[i].short_desc, "Resampling ringbuffer size in frames (default = 16384)");
strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
desc->params[i].value.ui = 32768;
strcpy(desc->params[i].short_desc, "Fixed ringbuffer size");
strcpy(desc->params[i].long_desc, "Fixed ringbuffer size (if not set => automatic adaptative)");


return desc; return desc;
} }


Loading…
Cancel
Save