diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..90db7d79 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +build/ +man/*.1 +.waf* +.lock* diff --git a/ChangeLog b/ChangeLog index 15c83a4e..50ec5610 100644 --- a/ChangeLog +++ b/ChangeLog @@ -36,6 +36,88 @@ John Emmas Jackdmp changes log --------------------------- +2012-03-15 Stephane Letz + + * POST_PACKED_STRUCTURE used for jack_latency_range_t type. + +2012-03-09 Stephane Letz + + * Remove JACK_32_64 flag, so POST_PACKED_STRUCTURE now always used. + +2012-02-10 Stephane Letz + + * Improve libjacknet master mode. + +2012-02-09 Stephane Letz + + * In control API, UNIX like sigset_t replaced by more abstract jackctl_sigmask_t * opaque struct. + +2012-02-01 Stephane Letz + + * Check server API callback from notification thread. + * Use a time-out in notification channel write function. + * Fix lock management in JackEngine. + +2012-01-29 Stephane Letz + + * A bit more robust JackMessageBuffer implementation (in progress). + +2012-01-27 Stephane Letz + + * Rename JackProcessSync in JackPosixProcessSync. + +2012-01-26 Stephane Letz + + * Add EndTime function (especially for Windows). + +2012-01-25 Stephane Letz + + * Fix NetJack2 initialisation bug. + +2012-01-24 Stephane Letz + + * Improve ShutDown in NetManager. + * Correct ShutDown in JackInternalClient and JackLibClient. + +2012-01-20 Stephane Letz + + * Experimental system port alias use in WIndows JackRouter. + +2012-01-19 Stephane Letz + + * Implement shutdown for in server clients. + * Better time-out management in NetJack2. + +2012-01-13 Stephane Letz + + * More robust server/client protocol. + +2012-01-11 Stephane Letz + + * Factorize code the server/client request in JackRequestDecoder class. + +2012-01-06 Stephane Letz + + * Cleanup drivers and internals loading code. + * jackctl_driver_params_parse API moved in public control.h. + * More general drivers/internals loading model on Windows. + +2012-01-06 Stephane Letz + + * Fix for compilation on Solaris. + +2012-01-04 Stephane Letz + + * Fix library symbols export issue. + +2012-01-02 Stephane Letz + + * Adrian Knoth fix in midiseq.c. + +2011-12-20 Stephane Letz + + * Version 1.9.9 started. + 2011-11-25 Stephane Letz * More robust dynamic port management in JACK/CoreMidi bridge. diff --git a/common/JackAC3Encoder.cpp b/common/JackAC3Encoder.cpp new file mode 100644 index 00000000..d535c086 --- /dev/null +++ b/common/JackAC3Encoder.cpp @@ -0,0 +1,317 @@ +/* +Copyright (C) 2006 Jesse Chappell (AC3Jack) +Copyright (C) 2012 Grame + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "JackAC3Encoder.h" +#include "JackError.h" +#include +#include +#include + +#define max(x,y) (((x)>(y)) ? (x) : (y)) +#define min(x,y) (((x)<(y)) ? (x) : (y)) + +namespace Jack +{ + +#ifndef __ppc__ + +JackAC3Encoder::JackAC3Encoder(const JackAC3EncoderParams& params) +{ + aften_set_defaults(&fAftenContext); + + fAftenContext.channels = params.channels; + fAftenContext.samplerate = params.sample_rate; + fAftenContext.params.bitrate = params.bitrate; + + int acmod = A52_ACMOD_MONO; + int lfe = params.lfe; + + switch (params.channels) { + + case 1: acmod = A52_ACMOD_MONO; break; + case 2: acmod = A52_ACMOD_STEREO; break; + case 3: acmod = A52_ACMOD_3_0; break; + case 4: acmod = A52_ACMOD_2_2; break; + case 5: acmod = A52_ACMOD_3_2; break; + break; + + default: + break; + } + + if (lfe) { + fAftenContext.channels += 1; + } + + fAftenContext.acmod = acmod; + fAftenContext.lfe = lfe; + fAftenContext.sample_format = A52_SAMPLE_FMT_FLT; + fAftenContext.verbose = 1; + + fAftenContext.system.n_threads = 1; + + // create interleaved framebuffer for MAX_AC3_CHANNELS + fSampleBuffer = new float[MAX_AC3_CHANNELS * A52_SAMPLES_PER_FRAME]; + + // create AC3 buffer + fAC3Buffer = new unsigned char[A52_MAX_CODED_FRAME_SIZE]; + memset(fAC3Buffer, 0, A52_MAX_CODED_FRAME_SIZE); + + fZeroBuffer = new unsigned char[SPDIF_FRAME_SIZE]; + memset(fZeroBuffer, 0, SPDIF_FRAME_SIZE); + + fRingBuffer = jack_ringbuffer_create(32768); + + fOutSizeByte = 0; + fFramePos = 0; + + fSampleRate = 0; + fByteRate = 0; +} + +bool JackAC3Encoder::Init(jack_nframes_t sample_rate) +{ + fSampleRate = sample_rate; + fByteRate = fSampleRate * sizeof(short) * 2; + return (aften_encode_init(&fAftenContext) == 0); +} + +JackAC3Encoder::~JackAC3Encoder() +{ + aften_encode_close(&fAftenContext); + + delete [] fSampleBuffer; + delete [] fAC3Buffer; + delete [] fZeroBuffer; + + if (fRingBuffer) { + jack_ringbuffer_free(fRingBuffer); + } +} + +void JackAC3Encoder::Process(float** inputs_buffer, float** outputs_buffer, int nframes) +{ + // fill and process frame buffers as appropriate + jack_nframes_t frames_left = A52_SAMPLES_PER_FRAME - fFramePos; + jack_nframes_t offset = 0; + + while (offset < nframes) + { + if ((nframes - offset) >= frames_left) { + + // copy only frames_left more data + jack_nframes_t pos = fFramePos * fAftenContext.channels; + for (jack_nframes_t spos = offset; spos < offset + frames_left; ++spos) { + for (size_t i = 0; i < fAftenContext.channels; ++i) { + fSampleBuffer[pos + i] = inputs_buffer[i][spos]; + } + pos += fAftenContext.channels; + } + + // use interleaved version + int res = aften_encode_frame(&fAftenContext, fAC3Buffer + SPDIF_HEADER_SIZE, fSampleBuffer); + if (res < 0) { + jack_error("aften_encode_frame error !!"); + return; + } + + fOutSizeByte = res; + + FillSpdifHeader(fAC3Buffer, fOutSizeByte + SPDIF_HEADER_SIZE); + + // push AC3 output to SPDIF ring buffer + float calc_ac3byterate = (fOutSizeByte * fSampleRate / (float) A52_SAMPLES_PER_FRAME); + jack_nframes_t silencebytes = (jack_nframes_t) (fOutSizeByte * (fByteRate / calc_ac3byterate)) - fOutSizeByte - SPDIF_HEADER_SIZE; + + jack_ringbuffer_write(fRingBuffer, (const char *)fAC3Buffer, fOutSizeByte + SPDIF_HEADER_SIZE); + + // write the proper remainder of zero padding (inefficient, should be memsetting) + jack_ringbuffer_write(fRingBuffer, (const char *)fZeroBuffer, silencebytes); + + offset += frames_left; + frames_left = A52_SAMPLES_PER_FRAME; + fFramePos = 0; + + } else { + + // copy incoming data into frame buffers without processing + jack_nframes_t pos = fFramePos * fAftenContext.channels; + for (jack_nframes_t spos = offset; spos < nframes; ++spos) { + for (size_t i = 0; i < fAftenContext.channels; ++i) { + fSampleBuffer[pos + i] = inputs_buffer[i][spos]; + } + pos += fAftenContext.channels; + } + + fFramePos += (nframes - offset); + offset += (nframes-offset); + } + } + + Output2Driver(outputs_buffer, nframes); +} + +void JackAC3Encoder::FillSpdifHeader(unsigned char* buf, int outsize) +{ + // todo, use outsize and not assume the fixed frame size? + int ac3outsize = outsize - SPDIF_HEADER_SIZE; + + buf[0] = 0x72; buf[1] = 0xf8; /* spdif syncword */ + buf[2] = 0x1f; buf[3] = 0x4e; /* .............. */ + buf[4] = 0x01; /* AC3 data */ + buf[5] = buf[13] & 7; /* bsmod, stream = 0 */ + buf[6] = (ac3outsize << 3) & 0xff; + buf[7] = (ac3outsize >> 5) & 0xff; + +#if !IS_BIGENDIAN + swab(buf+SPDIF_HEADER_SIZE, buf + SPDIF_HEADER_SIZE, ac3outsize); +#endif +} + +int JackAC3Encoder::Output2Driver(float** outputs, jack_nframes_t nframes) +{ + int wrotebytes = 0; + jack_nframes_t nframes_left = nframes; + + if (jack_ringbuffer_read_space(fRingBuffer) == 0) { + + // just write silence + memset(outputs[0], 0, nframes * sizeof(jack_default_audio_sample_t)); + memset(outputs[1], 0, nframes * sizeof(jack_default_audio_sample_t)); + + } else { + + jack_ringbuffer_data_t rb_data[2]; + + jack_ringbuffer_get_read_vector(fRingBuffer, rb_data); + + while (nframes_left > 0 && rb_data[0].len > 4) { + + jack_nframes_t towrite_frames = (rb_data[0].len) / (sizeof(short) * 2); + towrite_frames = min(towrite_frames, nframes_left); + + // write and deinterleave into the two channels +#if 1 + sample_move_dS_s16(outputs[0] + (nframes - nframes_left), (char *) rb_data[0].buf, towrite_frames, sizeof(short) * 2); + sample_move_dS_s16(outputs[1] + (nframes - nframes_left), (char *) rb_data[0].buf + sizeof(short), towrite_frames, sizeof(short) * 2); +#else + sample_move_dS_s16_24ph(outputs[0] + (nframes - nframes_left), (char *) rb_data[0].buf, towrite_frames, sizeof(short) * 2); + sample_move_dS_s16_24ph(outputs[1] + (nframes - nframes_left), (char *) rb_data[0].buf + sizeof(short), towrite_frames, sizeof(short) * 2); +#endif + wrotebytes = towrite_frames * sizeof(short) * 2; + nframes_left -= towrite_frames; + + jack_ringbuffer_read_advance(fRingBuffer, wrotebytes); + jack_ringbuffer_get_read_vector(fRingBuffer, rb_data); + } + + if (nframes_left > 0) { + // write silence + memset(outputs[0] + (nframes - nframes_left), 0, (nframes_left) * sizeof(jack_default_audio_sample_t)); + memset(outputs[1] + (nframes - nframes_left), 0, (nframes_left) * sizeof(jack_default_audio_sample_t)); + } + } + + return wrotebytes; +} + +void JackAC3Encoder::sample_move_dS_s16(jack_default_audio_sample_t* dst, char *src, jack_nframes_t nsamples, unsigned long src_skip) +{ + /* ALERT: signed sign-extension portability !!! */ + while (nsamples--) { + *dst = (*((short *) src)) / SAMPLE_MAX_16BIT; + dst++; + src += src_skip; + } +} + +void JackAC3Encoder::sample_move_dS_s16_24ph(jack_default_audio_sample_t* dst, char *src, jack_nframes_t nsamples, unsigned long src_skip) +{ + /* ALERT: signed sign-extension portability !!! */ + while (nsamples--) { + *dst = (((int)(*((short *) src))) << 8) / SAMPLE_MAX_24BIT; + dst++; + src += src_skip; + } +} + +void JackAC3Encoder::GetChannelName(const char* name, const char* alias, char* portname, int channel) +{ + /* + * 2 channels = L, R + * 3 channels = L, C, R + * 4 channels = L, R, LS, RS + * 5 ch = L, C, R, LS, RS + * 6 ch = L, C, R, LS, RS, LFE + */ + + const char* AC3_name = ""; + + switch (channel) { + + case 0: + AC3_name = "AC3_1_Left"; + break; + + case 1: + if (fAftenContext.channels == 2 || fAftenContext.channels == 4) { + AC3_name = "AC3_2_Right"; + } else { + AC3_name = "AC3_2_Center"; + } + break; + + case 2: + if (fAftenContext.channels == 4) { + AC3_name = "AC3_3_LeftSurround"; + } else { + AC3_name = "AC3_3_Right"; + } + break; + + case 3: + if (fAftenContext.channels == 4) { + AC3_name = "AC3_4_RightSurround"; + } else { + AC3_name = "AC3_4_LeftSurround"; + } + break; + + case 4: + if (fAftenContext.channels > 4) { + AC3_name = "AC3_5_RightSurround"; + } + break; + + default: + break; + } + + // Last channel + if (fAftenContext.lfe && (channel == fAftenContext.channels - 1)) { + sprintf(portname, "%s:%s:AC3_%d_LFE", name, alias, fAftenContext.channels); + } else { + sprintf(portname, "%s:%s:%s", name, alias, AC3_name); + } +} + +#endif + +} // end of namespace \ No newline at end of file diff --git a/common/JackAC3Encoder.h b/common/JackAC3Encoder.h new file mode 100644 index 00000000..b31ca4e2 --- /dev/null +++ b/common/JackAC3Encoder.h @@ -0,0 +1,100 @@ +/* +Copyright (C) 2006 Jesse Chappell (AC3Jack) +Copyright (C) 2012 Grame + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef __JackAC3Encoder__ +#define __JackAC3Encoder__ + +#include +#include + +#include "ringbuffer.h" +#include "types.h" + +#define MAX_AC3_CHANNELS 6 + +#define SPDIF_HEADER_SIZE 8 +#define SPDIF_FRAME_SIZE 6144 + +#define SAMPLE_MAX_16BIT 32768.0f +#define SAMPLE_MAX_24BIT 8388608.0f + +namespace Jack +{ + +struct JackAC3EncoderParams +{ + int64_t duration; + unsigned int channels; + int bitdepth; + int bitrate; + unsigned int sample_rate; + bool lfe; +}; + +class JackAC3Encoder +{ + + private: + + AftenContext fAftenContext; + jack_ringbuffer_t* fRingBuffer; + + float* fSampleBuffer; + unsigned char* fAC3Buffer; + unsigned char* fZeroBuffer; + + int fOutSizeByte; + + jack_nframes_t fFramePos; + jack_nframes_t fSampleRate; + jack_nframes_t fByteRate; + + void FillSpdifHeader(unsigned char* buf, int outsize); + int Output2Driver(float** outputs, jack_nframes_t nframes); + + void sample_move_dS_s16(jack_default_audio_sample_t* dst, char *src, jack_nframes_t nsamples, unsigned long src_skip); + void sample_move_dS_s16_24ph(jack_default_audio_sample_t* dst, char *src, jack_nframes_t nsamples, unsigned long src_skip); + + public: + + #ifdef __ppc__ + JackAC3Encoder(const JackAC3EncoderParams& params) {} + virtual ~JackAC3Encoder() {} + + bool Init(jack_nframes_t sample_rate) {return false;} + + void Process(float** inputs, float** outputs, int nframes) {} + void GetChannelName(const char* name, const char* alias, char* portname, int channel) {} + #else + JackAC3Encoder(const JackAC3EncoderParams& params); + virtual ~JackAC3Encoder(); + + bool Init(jack_nframes_t sample_rate); + + void Process(float** inputs, float** outputs, int nframes); + void GetChannelName(const char* name, const char* alias, char* portname, int channel); + #endif +}; + +typedef JackAC3Encoder * JackAC3EncoderPtr; + +} // end of namespace + +#endif diff --git a/common/JackAPI.cpp b/common/JackAPI.cpp index 5c1be12d..fe3cee76 100644 --- a/common/JackAPI.cpp +++ b/common/JackAPI.cpp @@ -28,10 +28,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "JackPortType.h" #include -#ifdef __CLIENTDEBUG__ -#include "JackLibGlobals.h" -#endif - using namespace Jack; #ifdef __cplusplus @@ -184,10 +180,15 @@ extern "C" LIB_EXPORT int jack_engine_takeover_timebase(jack_client_t *); LIB_EXPORT jack_nframes_t jack_frames_since_cycle_start(const jack_client_t *); LIB_EXPORT jack_time_t jack_get_time(); - LIB_EXPORT jack_nframes_t jack_time_to_frames(const jack_client_t *client, jack_time_t time); + LIB_EXPORT jack_nframes_t jack_time_to_frames(const jack_client_t *client, jack_time_t usecs); LIB_EXPORT jack_time_t jack_frames_to_time(const jack_client_t *client, jack_nframes_t frames); LIB_EXPORT jack_nframes_t jack_frame_time(const jack_client_t *); LIB_EXPORT jack_nframes_t jack_last_frame_time(const jack_client_t *client); + LIB_EXPORT int jack_get_cycle_times(const jack_client_t *client, + jack_nframes_t *current_frames, + jack_time_t *current_usecs, + jack_time_t *next_usecs, + float *period_usecs); LIB_EXPORT float jack_cpu_load(jack_client_t *client); LIB_EXPORT jack_native_thread_t jack_client_thread_id(jack_client_t *); LIB_EXPORT void jack_set_error_function(print_function); @@ -246,10 +247,6 @@ extern "C" const char* client_name, jack_options_t options, jack_status_t *status, ...); - LIB_EXPORT jack_intclient_t jack_internal_client_load_aux(jack_client_t *client, - const char* client_name, - jack_options_t options, - jack_status_t *status, va_list ap); LIB_EXPORT jack_status_t jack_internal_client_unload(jack_client_t *client, jack_intclient_t intclient); @@ -287,7 +284,7 @@ static inline void WaitGraphChange() graph change in RT context (just read the current graph state). */ - if (jack_tls_get(JackGlobals::fRealTime) == NULL) { + if (jack_tls_get(JackGlobals::fRealTimeThread) == NULL) { JackGraphManager* manager = GetGraphManager(); JackEngineControl* control = GetEngineControl(); assert(manager); @@ -311,16 +308,16 @@ LIB_EXPORT void jack_set_info_function(print_function func) LIB_EXPORT jack_client_t* jack_client_new(const char* client_name) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_client_new"); -#endif + try { assert(JackGlobals::fOpenMutex); JackGlobals::fOpenMutex->Lock(); jack_error("jack_client_new: deprecated"); int options = JackUseExactName; - if (getenv("JACK_START_SERVER") == NULL) + if (getenv("JACK_START_SERVER") == NULL) { options |= JackNoStartServer; + } jack_client_t* res = jack_client_new_aux(client_name, (jack_options_t)options, NULL); JackGlobals::fOpenMutex->Unlock(); return res; @@ -335,9 +332,8 @@ LIB_EXPORT jack_client_t* jack_client_new(const char* client_name) LIB_EXPORT void* jack_port_get_buffer(jack_port_t* port, jack_nframes_t frames) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_get_buffer"); -#endif + uintptr_t port_aux = (uintptr_t)port; jack_port_id_t myport = (jack_port_id_t)port_aux; if (!CheckPort(myport)) { @@ -351,9 +347,8 @@ LIB_EXPORT void* jack_port_get_buffer(jack_port_t* port, jack_nframes_t frames) LIB_EXPORT const char* jack_port_name(const jack_port_t* port) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_name"); -#endif + uintptr_t port_aux = (uintptr_t)port; jack_port_id_t myport = (jack_port_id_t)port_aux; if (!CheckPort(myport)) { @@ -367,9 +362,8 @@ LIB_EXPORT const char* jack_port_name(const jack_port_t* port) LIB_EXPORT const char* jack_port_short_name(const jack_port_t* port) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_short_name"); -#endif + uintptr_t port_aux = (uintptr_t)port; jack_port_id_t myport = (jack_port_id_t)port_aux; if (!CheckPort(myport)) { @@ -383,9 +377,8 @@ LIB_EXPORT const char* jack_port_short_name(const jack_port_t* port) LIB_EXPORT int jack_port_flags(const jack_port_t* port) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_flags"); -#endif + uintptr_t port_aux = (uintptr_t)port; jack_port_id_t myport = (jack_port_id_t)port_aux; if (!CheckPort(myport)) { @@ -399,12 +392,11 @@ LIB_EXPORT int jack_port_flags(const jack_port_t* port) LIB_EXPORT const char* jack_port_type(const jack_port_t* port) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_type"); -#endif + uintptr_t port_aux = (uintptr_t)port; jack_port_id_t myport = (jack_port_id_t)port_aux; - if (!CheckPort(myport)) { + if (!CheckPort(myport)) { jack_error("jack_port_flags called an incorrect port %ld", myport); return NULL; } else { @@ -415,9 +407,8 @@ LIB_EXPORT const char* jack_port_type(const jack_port_t* port) LIB_EXPORT jack_port_type_id_t jack_port_type_id(const jack_port_t *port) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_type_id"); -#endif + uintptr_t port_aux = (uintptr_t)port; jack_port_id_t myport = (jack_port_id_t)port_aux; if (!CheckPort(myport)) { @@ -431,9 +422,8 @@ LIB_EXPORT jack_port_type_id_t jack_port_type_id(const jack_port_t *port) LIB_EXPORT int jack_port_connected(const jack_port_t* port) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_connected"); -#endif + uintptr_t port_aux = (uintptr_t)port; jack_port_id_t myport = (jack_port_id_t)port_aux; if (!CheckPort(myport)) { @@ -448,9 +438,8 @@ LIB_EXPORT int jack_port_connected(const jack_port_t* port) LIB_EXPORT int jack_port_connected_to(const jack_port_t* port, const char* port_name) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_connected_to"); -#endif + uintptr_t port_aux = (uintptr_t)port; jack_port_id_t src = (jack_port_id_t)port_aux; if (!CheckPort(src)) { @@ -474,9 +463,8 @@ LIB_EXPORT int jack_port_connected_to(const jack_port_t* port, const char* port_ LIB_EXPORT int jack_port_tie(jack_port_t* src, jack_port_t* dst) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_tie"); -#endif + uintptr_t src_aux = (uintptr_t)src; jack_port_id_t mysrc = (jack_port_id_t)src_aux; if (!CheckPort(mysrc)) { @@ -500,9 +488,8 @@ LIB_EXPORT int jack_port_tie(jack_port_t* src, jack_port_t* dst) LIB_EXPORT int jack_port_untie(jack_port_t* port) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_untie"); -#endif + uintptr_t port_aux = (uintptr_t)port; jack_port_id_t myport = (jack_port_id_t)port_aux; if (!CheckPort(myport)) { @@ -516,9 +503,8 @@ LIB_EXPORT int jack_port_untie(jack_port_t* port) LIB_EXPORT jack_nframes_t jack_port_get_latency(jack_port_t* port) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_get_latency"); -#endif + uintptr_t port_aux = (uintptr_t)port; jack_port_id_t myport = (jack_port_id_t)port_aux; if (!CheckPort(myport)) { @@ -533,9 +519,8 @@ LIB_EXPORT jack_nframes_t jack_port_get_latency(jack_port_t* port) LIB_EXPORT void jack_port_set_latency(jack_port_t* port, jack_nframes_t frames) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_set_latency"); -#endif + uintptr_t port_aux = (uintptr_t)port; jack_port_id_t myport = (jack_port_id_t)port_aux; if (!CheckPort(myport)) { @@ -549,9 +534,8 @@ LIB_EXPORT void jack_port_set_latency(jack_port_t* port, jack_nframes_t frames) LIB_EXPORT void jack_port_get_latency_range(jack_port_t *port, jack_latency_callback_mode_t mode, jack_latency_range_t *range) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_get_latency_range"); -#endif + uintptr_t port_aux = (uintptr_t)port; jack_port_id_t myport = (jack_port_id_t)port_aux; if (!CheckPort(myport)) { @@ -566,9 +550,8 @@ LIB_EXPORT void jack_port_get_latency_range(jack_port_t *port, jack_latency_call LIB_EXPORT void jack_port_set_latency_range(jack_port_t *port, jack_latency_callback_mode_t mode, jack_latency_range_t *range) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_set_latency_range"); -#endif + uintptr_t port_aux = (uintptr_t)port; jack_port_id_t myport = (jack_port_id_t)port_aux; if (!CheckPort(myport)) { @@ -583,9 +566,8 @@ LIB_EXPORT void jack_port_set_latency_range(jack_port_t *port, jack_latency_call LIB_EXPORT int jack_recompute_total_latency(jack_client_t* ext_client, jack_port_t* port) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_recompute_total_latency"); -#endif + JackClient* client = (JackClient*)ext_client; uintptr_t port_aux = (uintptr_t)port; @@ -605,9 +587,7 @@ LIB_EXPORT int jack_recompute_total_latency(jack_client_t* ext_client, jack_port LIB_EXPORT int jack_recompute_total_latencies(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_recompute_total_latencies"); -#endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { @@ -620,9 +600,8 @@ LIB_EXPORT int jack_recompute_total_latencies(jack_client_t* ext_client) LIB_EXPORT int jack_port_set_name(jack_port_t* port, const char* name) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_set_name"); -#endif + uintptr_t port_aux = (uintptr_t)port; jack_port_id_t myport = (jack_port_id_t)port_aux; if (!CheckPort(myport)) { @@ -645,9 +624,8 @@ LIB_EXPORT int jack_port_set_name(jack_port_t* port, const char* name) LIB_EXPORT int jack_port_set_alias(jack_port_t* port, const char* name) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_set_alias"); -#endif + uintptr_t port_aux = (uintptr_t)port; jack_port_id_t myport = (jack_port_id_t)port_aux; if (!CheckPort(myport)) { @@ -664,9 +642,8 @@ LIB_EXPORT int jack_port_set_alias(jack_port_t* port, const char* name) LIB_EXPORT int jack_port_unset_alias(jack_port_t* port, const char* name) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_unset_alias"); -#endif + uintptr_t port_aux = (uintptr_t)port; jack_port_id_t myport = (jack_port_id_t)port_aux; if (!CheckPort(myport)) { @@ -683,9 +660,8 @@ LIB_EXPORT int jack_port_unset_alias(jack_port_t* port, const char* name) LIB_EXPORT int jack_port_get_aliases(const jack_port_t* port, char* const aliases[2]) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_get_aliases"); -#endif + uintptr_t port_aux = (uintptr_t)port; jack_port_id_t myport = (jack_port_id_t)port_aux; if (!CheckPort(myport)) { @@ -699,9 +675,8 @@ LIB_EXPORT int jack_port_get_aliases(const jack_port_t* port, char* const aliase LIB_EXPORT int jack_port_request_monitor(jack_port_t* port, int onoff) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_request_monitor"); -#endif + uintptr_t port_aux = (uintptr_t)port; jack_port_id_t myport = (jack_port_id_t)port_aux; if (!CheckPort(myport)) { @@ -715,9 +690,8 @@ LIB_EXPORT int jack_port_request_monitor(jack_port_t* port, int onoff) LIB_EXPORT int jack_port_request_monitor_by_name(jack_client_t* ext_client, const char* port_name, int onoff) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_request_monitor_by_name"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_port_request_monitor_by_name called with a NULL client"); @@ -738,9 +712,8 @@ LIB_EXPORT int jack_port_request_monitor_by_name(jack_client_t* ext_client, cons LIB_EXPORT int jack_port_ensure_monitor(jack_port_t* port, int onoff) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_ensure_monitor"); -#endif + uintptr_t port_aux = (uintptr_t)port; jack_port_id_t myport = (jack_port_id_t)port_aux; if (!CheckPort(myport)) { @@ -754,9 +727,8 @@ LIB_EXPORT int jack_port_ensure_monitor(jack_port_t* port, int onoff) LIB_EXPORT int jack_port_monitoring_input(jack_port_t* port) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_monitoring_input"); -#endif + uintptr_t port_aux = (uintptr_t)port; jack_port_id_t myport = (jack_port_id_t)port_aux; if (!CheckPort(myport)) { @@ -770,9 +742,8 @@ LIB_EXPORT int jack_port_monitoring_input(jack_port_t* port) LIB_EXPORT int jack_is_realtime(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_is_realtime"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_is_realtime called with a NULL client"); @@ -785,9 +756,8 @@ LIB_EXPORT int jack_is_realtime(jack_client_t* ext_client) LIB_EXPORT void jack_on_shutdown(jack_client_t* ext_client, JackShutdownCallback callback, void* arg) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_on_shutdown"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_on_shutdown called with a NULL client"); @@ -798,9 +768,8 @@ LIB_EXPORT void jack_on_shutdown(jack_client_t* ext_client, JackShutdownCallback LIB_EXPORT void jack_on_info_shutdown(jack_client_t* ext_client, JackInfoShutdownCallback callback, void* arg) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_on_info_shutdown"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_on_info_shutdown called with a NULL client"); @@ -811,9 +780,8 @@ LIB_EXPORT void jack_on_info_shutdown(jack_client_t* ext_client, JackInfoShutdow LIB_EXPORT int jack_set_process_callback(jack_client_t* ext_client, JackProcessCallback callback, void* arg) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_set_process_callback"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_process_callback called with a NULL client"); @@ -825,9 +793,8 @@ LIB_EXPORT int jack_set_process_callback(jack_client_t* ext_client, JackProcessC LIB_EXPORT jack_nframes_t jack_thread_wait(jack_client_t* ext_client, int status) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_thread_wait"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_thread_wait called with a NULL client"); @@ -840,9 +807,8 @@ LIB_EXPORT jack_nframes_t jack_thread_wait(jack_client_t* ext_client, int status LIB_EXPORT jack_nframes_t jack_cycle_wait(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_cycle_wait"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_cycle_wait called with a NULL client"); @@ -854,9 +820,8 @@ LIB_EXPORT jack_nframes_t jack_cycle_wait(jack_client_t* ext_client) LIB_EXPORT void jack_cycle_signal(jack_client_t* ext_client, int status) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_cycle_signal"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_cycle_signal called with a NULL client"); @@ -867,9 +832,8 @@ LIB_EXPORT void jack_cycle_signal(jack_client_t* ext_client, int status) LIB_EXPORT int jack_set_process_thread(jack_client_t* ext_client, JackThreadCallback fun, void *arg) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_set_process_thread"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_process_thread called with a NULL client"); @@ -881,9 +845,8 @@ LIB_EXPORT int jack_set_process_thread(jack_client_t* ext_client, JackThreadCall LIB_EXPORT int jack_set_freewheel_callback(jack_client_t* ext_client, JackFreewheelCallback freewheel_callback, void* arg) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_set_freewheel_callback"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_freewheel_callback called with a NULL client"); @@ -895,9 +858,8 @@ LIB_EXPORT int jack_set_freewheel_callback(jack_client_t* ext_client, JackFreewh LIB_EXPORT int jack_set_freewheel(jack_client_t* ext_client, int onoff) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_set_freewheel"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_freewheel called with a NULL client"); @@ -909,9 +871,8 @@ LIB_EXPORT int jack_set_freewheel(jack_client_t* ext_client, int onoff) LIB_EXPORT int jack_set_buffer_size(jack_client_t* ext_client, jack_nframes_t buffer_size) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_set_buffer_size"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_buffer_size called with a NULL client"); @@ -925,9 +886,8 @@ LIB_EXPORT int jack_set_buffer_size(jack_client_t* ext_client, jack_nframes_t bu LIB_EXPORT int jack_set_buffer_size_callback(jack_client_t* ext_client, JackBufferSizeCallback bufsize_callback, void* arg) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_set_buffer_size_callback"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_buffer_size_callback called with a NULL client"); @@ -939,9 +899,8 @@ LIB_EXPORT int jack_set_buffer_size_callback(jack_client_t* ext_client, JackBuff LIB_EXPORT int jack_set_sample_rate_callback(jack_client_t* ext_client, JackSampleRateCallback srate_callback, void* arg) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_set_sample_rate_callback"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_sample_rate_callback called with a NULL client"); @@ -953,9 +912,8 @@ LIB_EXPORT int jack_set_sample_rate_callback(jack_client_t* ext_client, JackSamp LIB_EXPORT int jack_set_client_registration_callback(jack_client_t* ext_client, JackClientRegistrationCallback registration_callback, void* arg) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_set_client_registration_callback"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_client_registration_callback called with a NULL client"); @@ -967,9 +925,8 @@ LIB_EXPORT int jack_set_client_registration_callback(jack_client_t* ext_client, LIB_EXPORT int jack_set_port_registration_callback(jack_client_t* ext_client, JackPortRegistrationCallback registration_callback, void* arg) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_set_port_registration_callback"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_port_registration_callback called with a NULL client"); @@ -981,9 +938,8 @@ LIB_EXPORT int jack_set_port_registration_callback(jack_client_t* ext_client, Ja LIB_EXPORT int jack_set_port_connect_callback(jack_client_t* ext_client, JackPortConnectCallback portconnect_callback, void* arg) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_set_port_connect_callback"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_port_connect_callback called with a NULL client"); @@ -995,9 +951,8 @@ LIB_EXPORT int jack_set_port_connect_callback(jack_client_t* ext_client, JackPor LIB_EXPORT int jack_set_port_rename_callback(jack_client_t* ext_client, JackPortRenameCallback rename_callback, void* arg) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_set_port_rename_callback"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_port_rename_callback called with a NULL client"); @@ -1009,9 +964,8 @@ LIB_EXPORT int jack_set_port_rename_callback(jack_client_t* ext_client, JackPort LIB_EXPORT int jack_set_graph_order_callback(jack_client_t* ext_client, JackGraphOrderCallback graph_callback, void* arg) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_set_graph_order_callback"); -#endif + JackClient* client = (JackClient*)ext_client; jack_log("jack_set_graph_order_callback ext_client %x client %x ", ext_client, client); if (client == NULL) { @@ -1024,9 +978,8 @@ LIB_EXPORT int jack_set_graph_order_callback(jack_client_t* ext_client, JackGrap LIB_EXPORT int jack_set_xrun_callback(jack_client_t* ext_client, JackXRunCallback xrun_callback, void* arg) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_set_xrun_callback"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_xrun_callback called with a NULL client"); @@ -1038,9 +991,8 @@ LIB_EXPORT int jack_set_xrun_callback(jack_client_t* ext_client, JackXRunCallbac LIB_EXPORT int jack_set_latency_callback(jack_client_t* ext_client, JackLatencyCallback latency_callback, void *arg) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_set_latency_callback"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_latency_callback called with a NULL client"); @@ -1052,9 +1004,8 @@ LIB_EXPORT int jack_set_latency_callback(jack_client_t* ext_client, JackLatencyC LIB_EXPORT int jack_set_thread_init_callback(jack_client_t* ext_client, JackThreadInitCallback init_callback, void *arg) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_set_thread_init_callback"); -#endif + JackClient* client = (JackClient*)ext_client; jack_log("jack_set_thread_init_callback ext_client %x client %x ", ext_client, client); if (client == NULL) { @@ -1067,9 +1018,8 @@ LIB_EXPORT int jack_set_thread_init_callback(jack_client_t* ext_client, JackThre LIB_EXPORT int jack_activate(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_activate"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_activate called with a NULL client"); @@ -1081,9 +1031,8 @@ LIB_EXPORT int jack_activate(jack_client_t* ext_client) LIB_EXPORT int jack_deactivate(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_deactivate"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_deactivate called with a NULL client"); @@ -1095,9 +1044,8 @@ LIB_EXPORT int jack_deactivate(jack_client_t* ext_client) LIB_EXPORT jack_port_t* jack_port_register(jack_client_t* ext_client, const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_register"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_port_register called with a NULL client"); @@ -1112,9 +1060,8 @@ LIB_EXPORT jack_port_t* jack_port_register(jack_client_t* ext_client, const char LIB_EXPORT int jack_port_unregister(jack_client_t* ext_client, jack_port_t* port) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_unregister"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_port_unregister called with a NULL client"); @@ -1131,9 +1078,8 @@ LIB_EXPORT int jack_port_unregister(jack_client_t* ext_client, jack_port_t* port LIB_EXPORT int jack_port_is_mine(const jack_client_t* ext_client, const jack_port_t* port) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_is_mine"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_port_is_mine called with a NULL client"); @@ -1150,9 +1096,8 @@ LIB_EXPORT int jack_port_is_mine(const jack_client_t* ext_client, const jack_por LIB_EXPORT const char** jack_port_get_connections(const jack_port_t* port) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_get_connections"); -#endif + uintptr_t port_aux = (uintptr_t)port; jack_port_id_t myport = (jack_port_id_t)port_aux; if (!CheckPort(myport)) { @@ -1168,9 +1113,8 @@ LIB_EXPORT const char** jack_port_get_connections(const jack_port_t* port) // Calling client does not need to "own" the port LIB_EXPORT const char** jack_port_get_all_connections(const jack_client_t* ext_client, const jack_port_t* port) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_get_all_connections"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_port_get_all_connections called with a NULL client"); @@ -1191,9 +1135,8 @@ LIB_EXPORT const char** jack_port_get_all_connections(const jack_client_t* ext_c LIB_EXPORT jack_nframes_t jack_port_get_total_latency(jack_client_t* ext_client, jack_port_t* port) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_get_total_latency"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_port_get_total_latency called with a NULL client"); @@ -1219,9 +1162,8 @@ LIB_EXPORT jack_nframes_t jack_port_get_total_latency(jack_client_t* ext_client, LIB_EXPORT int jack_connect(jack_client_t* ext_client, const char* src, const char* dst) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_connect"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_connect called with a NULL client"); @@ -1236,15 +1178,14 @@ LIB_EXPORT int jack_connect(jack_client_t* ext_client, const char* src, const ch LIB_EXPORT int jack_disconnect(jack_client_t* ext_client, const char* src, const char* dst) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_disconnect"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_disconnect called with a NULL client"); return -1; } else if ((src == NULL) || (dst == NULL)) { - jack_error("jack_connect called with a NULL port name"); + jack_error("jack_disconnect called with a NULL port name"); return -1; } else { return client->PortDisconnect(src, dst); @@ -1253,9 +1194,8 @@ LIB_EXPORT int jack_disconnect(jack_client_t* ext_client, const char* src, const LIB_EXPORT int jack_port_disconnect(jack_client_t* ext_client, jack_port_t* src) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_disconnect"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_port_disconnect called with a NULL client"); @@ -1272,9 +1212,8 @@ LIB_EXPORT int jack_port_disconnect(jack_client_t* ext_client, jack_port_t* src) LIB_EXPORT jack_nframes_t jack_get_sample_rate(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_get_sample_rate"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_get_sample_rate called with a NULL client"); @@ -1287,9 +1226,8 @@ LIB_EXPORT jack_nframes_t jack_get_sample_rate(jack_client_t* ext_client) LIB_EXPORT jack_nframes_t jack_get_buffer_size(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_get_buffer_size"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_get_buffer_size called with a NULL client"); @@ -1302,9 +1240,8 @@ LIB_EXPORT jack_nframes_t jack_get_buffer_size(jack_client_t* ext_client) LIB_EXPORT const char** jack_get_ports(jack_client_t* ext_client, const char* port_name_pattern, const char* type_name_pattern, unsigned long flags) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_get_ports"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_get_ports called with a NULL client"); @@ -1316,9 +1253,8 @@ LIB_EXPORT const char** jack_get_ports(jack_client_t* ext_client, const char* po LIB_EXPORT jack_port_t* jack_port_by_name(jack_client_t* ext_client, const char* portname) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_by_name"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_get_ports called with a NULL client"); @@ -1339,18 +1275,16 @@ LIB_EXPORT jack_port_t* jack_port_by_name(jack_client_t* ext_client, const char* LIB_EXPORT jack_port_t* jack_port_by_id(jack_client_t* ext_client, jack_port_id_t id) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_by_id"); -#endif + /* jack_port_t* type is actually the port index */ return (jack_port_t*)((uintptr_t)id); } LIB_EXPORT int jack_engine_takeover_timebase(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_engine_takeover_timebase"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_engine_takeover_timebase called with a NULL client"); @@ -1363,9 +1297,8 @@ LIB_EXPORT int jack_engine_takeover_timebase(jack_client_t* ext_client) LIB_EXPORT jack_nframes_t jack_frames_since_cycle_start(const jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_frames_since_cycle_start"); -#endif + JackTimer timer; JackEngineControl* control = GetEngineControl(); if (control) { @@ -1378,17 +1311,15 @@ LIB_EXPORT jack_nframes_t jack_frames_since_cycle_start(const jack_client_t* ext LIB_EXPORT jack_time_t jack_get_time() { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_get_time"); -#endif + return GetMicroSeconds(); } LIB_EXPORT jack_time_t jack_frames_to_time(const jack_client_t* ext_client, jack_nframes_t frames) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_frames_to_time"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_frames_to_time called with a NULL client"); @@ -1405,11 +1336,10 @@ LIB_EXPORT jack_time_t jack_frames_to_time(const jack_client_t* ext_client, jack } } -LIB_EXPORT jack_nframes_t jack_time_to_frames(const jack_client_t* ext_client, jack_time_t time) +LIB_EXPORT jack_nframes_t jack_time_to_frames(const jack_client_t* ext_client, jack_time_t usecs) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_time_to_frames"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_time_to_frames called with a NULL client"); @@ -1419,7 +1349,7 @@ LIB_EXPORT jack_nframes_t jack_time_to_frames(const jack_client_t* ext_client, j JackEngineControl* control = GetEngineControl(); if (control) { control->ReadFrameTime(&timer); - return timer.Time2Frames(time, control->fBufferSize); + return timer.Time2Frames(usecs, control->fBufferSize); } else { return 0; } @@ -1428,26 +1358,41 @@ LIB_EXPORT jack_nframes_t jack_time_to_frames(const jack_client_t* ext_client, j LIB_EXPORT jack_nframes_t jack_frame_time(const jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_frame_time"); -#endif + return jack_time_to_frames(ext_client, GetMicroSeconds()); } LIB_EXPORT jack_nframes_t jack_last_frame_time(const jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_last_frame_time"); -#endif + JackEngineControl* control = GetEngineControl(); return (control) ? control->fFrameTimer.ReadCurrentState()->CurFrame() : 0; } +LIB_EXPORT int jack_get_cycle_times(const jack_client_t *client, + jack_nframes_t *current_frames, + jack_time_t *current_usecs, + jack_time_t *next_usecs, + float *period_usecs) +{ + JackGlobals::CheckContext("jack_get_cycle_times"); + + JackEngineControl* control = GetEngineControl(); + if (control) { + JackTimer timer; + control->ReadFrameTime(&timer); + return timer.GetCycleTimes(current_frames, current_usecs, next_usecs, period_usecs); + } else { + return -1; + } +} + LIB_EXPORT float jack_cpu_load(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_cpu_load"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_cpu_load called with a NULL client"); @@ -1460,9 +1405,8 @@ LIB_EXPORT float jack_cpu_load(jack_client_t* ext_client) LIB_EXPORT jack_native_thread_t jack_client_thread_id(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_client_thread_id"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_client_thread_id called with a NULL client"); @@ -1474,9 +1418,8 @@ LIB_EXPORT jack_native_thread_t jack_client_thread_id(jack_client_t* ext_client) LIB_EXPORT char* jack_get_client_name(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_get_client_name"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_get_client_name called with a NULL client"); @@ -1503,9 +1446,8 @@ LIB_EXPORT int jack_port_type_size(void) LIB_EXPORT size_t jack_port_type_get_buffer_size(jack_client_t* ext_client, const char* port_type) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_port_type_get_buffer_size"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_port_type_get_buffer_size called with a NULL client"); @@ -1524,9 +1466,8 @@ LIB_EXPORT size_t jack_port_type_get_buffer_size(jack_client_t* ext_client, cons // transport.h LIB_EXPORT int jack_release_timebase(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_release_timebase"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_release_timebase called with a NULL client"); @@ -1538,9 +1479,8 @@ LIB_EXPORT int jack_release_timebase(jack_client_t* ext_client) LIB_EXPORT int jack_set_sync_callback(jack_client_t* ext_client, JackSyncCallback sync_callback, void *arg) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_set_sync_callback"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_sync_callback called with a NULL client"); @@ -1552,9 +1492,8 @@ LIB_EXPORT int jack_set_sync_callback(jack_client_t* ext_client, JackSyncCallbac LIB_EXPORT int jack_set_sync_timeout(jack_client_t* ext_client, jack_time_t timeout) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_set_sync_timeout"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_sync_timeout called with a NULL client"); @@ -1566,9 +1505,8 @@ LIB_EXPORT int jack_set_sync_timeout(jack_client_t* ext_client, jack_time_t time LIB_EXPORT int jack_set_timebase_callback(jack_client_t* ext_client, int conditional, JackTimebaseCallback timebase_callback, void* arg) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_set_timebase_callback"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_set_timebase_callback called with a NULL client"); @@ -1580,9 +1518,8 @@ LIB_EXPORT int jack_set_timebase_callback(jack_client_t* ext_client, int conditi LIB_EXPORT int jack_transport_locate(jack_client_t* ext_client, jack_nframes_t frame) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_transport_locate"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_transport_locate called with a NULL client"); @@ -1595,9 +1532,8 @@ LIB_EXPORT int jack_transport_locate(jack_client_t* ext_client, jack_nframes_t f LIB_EXPORT jack_transport_state_t jack_transport_query(const jack_client_t* ext_client, jack_position_t* pos) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_transport_query"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_transport_query called with a NULL client"); @@ -1609,9 +1545,8 @@ LIB_EXPORT jack_transport_state_t jack_transport_query(const jack_client_t* ext_ LIB_EXPORT jack_nframes_t jack_get_current_transport_frame(const jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_get_current_transport_frame"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_get_current_transport_frame called with a NULL client"); @@ -1623,9 +1558,8 @@ LIB_EXPORT jack_nframes_t jack_get_current_transport_frame(const jack_client_t* LIB_EXPORT int jack_transport_reposition(jack_client_t* ext_client, const jack_position_t* pos) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_transport_reposition"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_transport_reposition called with a NULL client"); @@ -1638,9 +1572,8 @@ LIB_EXPORT int jack_transport_reposition(jack_client_t* ext_client, const jack_p LIB_EXPORT void jack_transport_start(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_transport_start"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_transport_start called with a NULL client"); @@ -1651,9 +1584,8 @@ LIB_EXPORT void jack_transport_start(jack_client_t* ext_client) LIB_EXPORT void jack_transport_stop(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_transport_stop"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_transport_stop called with a NULL client"); @@ -1665,9 +1597,8 @@ LIB_EXPORT void jack_transport_stop(jack_client_t* ext_client) // deprecated LIB_EXPORT void jack_get_transport_info(jack_client_t* ext_client, jack_transport_info_t* tinfo) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_get_transport_info"); -#endif + jack_error("jack_get_transport_info: deprecated"); if (tinfo) memset(tinfo, 0, sizeof(jack_transport_info_t)); @@ -1675,9 +1606,8 @@ LIB_EXPORT void jack_get_transport_info(jack_client_t* ext_client, jack_transpor LIB_EXPORT void jack_set_transport_info(jack_client_t* ext_client, jack_transport_info_t* tinfo) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_set_transport_info"); -#endif + jack_error("jack_set_transport_info: deprecated"); if (tinfo) memset(tinfo, 0, sizeof(jack_transport_info_t)); @@ -1686,9 +1616,8 @@ LIB_EXPORT void jack_set_transport_info(jack_client_t* ext_client, jack_transpor // statistics.h LIB_EXPORT float jack_get_max_delayed_usecs(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_get_max_delayed_usecs"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_get_max_delayed_usecs called with a NULL client"); @@ -1701,9 +1630,8 @@ LIB_EXPORT float jack_get_max_delayed_usecs(jack_client_t* ext_client) LIB_EXPORT float jack_get_xrun_delayed_usecs(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_get_xrun_delayed_usecs"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_get_xrun_delayed_usecs called with a NULL client"); @@ -1716,9 +1644,8 @@ LIB_EXPORT float jack_get_xrun_delayed_usecs(jack_client_t* ext_client) LIB_EXPORT void jack_reset_max_delayed_usecs(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_reset_max_delayed_usecs"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_reset_max_delayed_usecs called with a NULL client"); @@ -1731,9 +1658,8 @@ LIB_EXPORT void jack_reset_max_delayed_usecs(jack_client_t* ext_client) // thread.h LIB_EXPORT int jack_client_real_time_priority(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_client_real_time_priority"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_client_real_time_priority called with a NULL client"); @@ -1746,9 +1672,8 @@ LIB_EXPORT int jack_client_real_time_priority(jack_client_t* ext_client) LIB_EXPORT int jack_client_max_real_time_priority(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_client_max_real_time_priority"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_client_max_real_time_priority called with a NULL client"); @@ -1774,9 +1699,8 @@ LIB_EXPORT int jack_client_create_thread(jack_client_t* client, thread_routine routine, void *arg) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_client_create_thread"); -#endif + JackEngineControl* control = GetEngineControl(); int res = JackThread::StartImp(thread, priority, realtime, routine, arg); return (res == 0) @@ -1791,24 +1715,26 @@ LIB_EXPORT int jack_drop_real_time_scheduling(jack_native_thread_t thread) LIB_EXPORT int jack_client_stop_thread(jack_client_t* client, jack_native_thread_t thread) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_client_stop_thread"); -#endif + return JackThread::StopImp(thread); } LIB_EXPORT int jack_client_kill_thread(jack_client_t* client, jack_native_thread_t thread) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_client_kill_thread"); -#endif + return JackThread::KillImp(thread); } #ifndef WIN32 LIB_EXPORT void jack_set_thread_creator (jack_thread_creator_t jtc) { - JackGlobals::fJackThreadCreator = (jtc == NULL) ? pthread_create : jtc; + if (jtc == NULL) { + JackGlobals::fJackThreadCreator = pthread_create; + } else { + JackGlobals::fJackThreadCreator = jtc; + } } #endif @@ -1817,26 +1743,23 @@ LIB_EXPORT int jack_internal_client_new (const char* client_name, const char* load_name, const char* load_init) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_internal_client_new"); -#endif + jack_error("jack_internal_client_new: deprecated"); return -1; } LIB_EXPORT void jack_internal_client_close (const char* client_name) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_internal_client_close"); -#endif + jack_error("jack_internal_client_close: deprecated"); } LIB_EXPORT char* jack_get_internal_client_name(jack_client_t* ext_client, jack_intclient_t intclient) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_get_internal_client_name"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_get_internal_client_name called with a NULL client"); @@ -1851,9 +1774,8 @@ LIB_EXPORT char* jack_get_internal_client_name(jack_client_t* ext_client, jack_i LIB_EXPORT jack_intclient_t jack_internal_client_handle(jack_client_t* ext_client, const char* client_name, jack_status_t* status) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_internal_client_handle"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_internal_client_handle called with a NULL client"); @@ -1867,11 +1789,10 @@ LIB_EXPORT jack_intclient_t jack_internal_client_handle(jack_client_t* ext_clien } } -LIB_EXPORT jack_intclient_t jack_internal_client_load_aux(jack_client_t* ext_client, const char* client_name, jack_options_t options, jack_status_t* status, va_list ap) +static jack_intclient_t jack_internal_client_load_aux(jack_client_t* ext_client, const char* client_name, jack_options_t options, jack_status_t* status, va_list ap) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_internal_client_load_aux"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_internal_client_load called with a NULL client"); @@ -1899,9 +1820,8 @@ LIB_EXPORT jack_intclient_t jack_internal_client_load_aux(jack_client_t* ext_cli LIB_EXPORT jack_intclient_t jack_internal_client_load(jack_client_t *client, const char* client_name, jack_options_t options, jack_status_t *status, ...) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_internal_client_load"); -#endif + va_list ap; va_start(ap, status); jack_intclient_t res = jack_internal_client_load_aux(client, client_name, options, status, ap); @@ -1911,9 +1831,8 @@ LIB_EXPORT jack_intclient_t jack_internal_client_load(jack_client_t *client, con LIB_EXPORT jack_status_t jack_internal_client_unload(jack_client_t* ext_client, jack_intclient_t intclient) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_internal_client_load"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_internal_client_unload called with a NULL client"); @@ -1933,9 +1852,8 @@ LIB_EXPORT void jack_get_version(int *major_ptr, int *micro_ptr, int *proto_ptr) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_get_version"); -#endif + // FIXME: We need these comming from build system *major_ptr = 0; *minor_ptr = 0; @@ -1945,17 +1863,15 @@ LIB_EXPORT void jack_get_version(int *major_ptr, LIB_EXPORT const char* jack_get_version_string() { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_get_version_string"); -#endif + return VERSION; } LIB_EXPORT void jack_free(void* ptr) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_free"); -#endif + if (ptr) { free(ptr); } @@ -1964,9 +1880,8 @@ LIB_EXPORT void jack_free(void* ptr) // session.h LIB_EXPORT int jack_set_session_callback(jack_client_t* ext_client, JackSessionCallback session_callback, void* arg) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_set_session_callback"); -#endif + JackClient* client = (JackClient*)ext_client; jack_log("jack_set_session_callback ext_client %x client %x ", ext_client, client); if (client == NULL) { @@ -1979,9 +1894,8 @@ LIB_EXPORT int jack_set_session_callback(jack_client_t* ext_client, JackSessionC LIB_EXPORT jack_session_command_t* jack_session_notify(jack_client_t* ext_client, const char* target, jack_session_event_type_t ev_type, const char* path) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_session_notify"); -#endif + JackClient* client = (JackClient*)ext_client; jack_log("jack_session_notify ext_client %x client %x ", ext_client, client); if (client == NULL) { @@ -1994,9 +1908,8 @@ LIB_EXPORT jack_session_command_t* jack_session_notify(jack_client_t* ext_client LIB_EXPORT int jack_session_reply(jack_client_t* ext_client, jack_session_event_t *event) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_session_reply"); -#endif + JackClient* client = (JackClient*)ext_client; jack_log("jack_session_reply ext_client %x client %x ", ext_client, client); if (client == NULL) { @@ -2009,9 +1922,8 @@ LIB_EXPORT int jack_session_reply(jack_client_t* ext_client, jack_session_event_ LIB_EXPORT void jack_session_event_free(jack_session_event_t* ev) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_session_event_free"); -#endif + if (ev) { if (ev->session_dir) free((void *)ev->session_dir); @@ -2025,9 +1937,8 @@ LIB_EXPORT void jack_session_event_free(jack_session_event_t* ev) LIB_EXPORT char *jack_client_get_uuid(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_client_get_uuid"); -#endif + JackClient* client = (JackClient*)ext_client; if (client == NULL) { jack_error("jack_client_get_uuid called with a NULL client"); @@ -2041,9 +1952,8 @@ LIB_EXPORT char *jack_client_get_uuid(jack_client_t* ext_client) LIB_EXPORT char* jack_get_uuid_for_client_name(jack_client_t* ext_client, const char* client_name) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_get_uuid_for_client_name"); -#endif + JackClient* client = (JackClient*)ext_client; jack_log("jack_get_uuid_for_client_name ext_client %x client %x ", ext_client, client); if (client == NULL) { @@ -2056,9 +1966,8 @@ LIB_EXPORT char* jack_get_uuid_for_client_name(jack_client_t* ext_client, const LIB_EXPORT char* jack_get_client_name_by_uuid(jack_client_t* ext_client, const char* client_uuid) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_get_client_name_by_uuid"); -#endif + JackClient* client = (JackClient*)ext_client; jack_log("jack_get_uuid_for_client_name ext_client %x client %x ", ext_client, client); if (client == NULL) { @@ -2071,9 +1980,8 @@ LIB_EXPORT char* jack_get_client_name_by_uuid(jack_client_t* ext_client, const c LIB_EXPORT int jack_reserve_client_name(jack_client_t* ext_client, const char* client_name, const char* uuid) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_reserve_client_name"); -#endif + JackClient* client = (JackClient*)ext_client; jack_log("jack_reserve_client_name ext_client %x client %x ", ext_client, client); if (client == NULL) { @@ -2086,9 +1994,8 @@ LIB_EXPORT int jack_reserve_client_name(jack_client_t* ext_client, const char* c LIB_EXPORT void jack_session_commands_free(jack_session_command_t *cmds) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_session_commands_free"); -#endif + if (!cmds) { return; @@ -2116,9 +2023,8 @@ LIB_EXPORT void jack_session_commands_free(jack_session_command_t *cmds) LIB_EXPORT int jack_client_has_session_callback(jack_client_t* ext_client, const char* client_name) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_client_has_session_callback"); -#endif + JackClient* client = (JackClient*)ext_client; jack_log("jack_client_has_session_callback ext_client %x client %x ", ext_client, client); if (client == NULL) { diff --git a/common/JackAudioAdapter.cpp b/common/JackAudioAdapter.cpp index 96b248af..3eda1167 100644 --- a/common/JackAudioAdapter.cpp +++ b/common/JackAudioAdapter.cpp @@ -35,20 +35,22 @@ namespace Jack int JackAudioAdapter::Process(jack_nframes_t frames, void* arg) { JackAudioAdapter* adapter = static_cast(arg); - jack_default_audio_sample_t* inputBuffer[adapter->fAudioAdapter->GetInputs()]; - jack_default_audio_sample_t* outputBuffer[adapter->fAudioAdapter->GetOutputs()]; + return adapter->ProcessAux(frames); +} +int JackAudioAdapter::ProcessAux(jack_nframes_t frames) +{ // Always clear output - for (int i = 0; i < adapter->fAudioAdapter->GetInputs(); i++) { - inputBuffer[i] = (jack_default_audio_sample_t*)jack_port_get_buffer(adapter->fCapturePortList[i], frames); - memset(inputBuffer[i], 0, frames * sizeof(jack_default_audio_sample_t)); + for (int i = 0; i < fAudioAdapter->GetInputs(); i++) { + fInputBufferList[i] = (jack_default_audio_sample_t*)jack_port_get_buffer(fCapturePortList[i], frames); + memset(fInputBufferList[i], 0, frames * sizeof(jack_default_audio_sample_t)); } - for (int i = 0; i < adapter->fAudioAdapter->GetOutputs(); i++) { - outputBuffer[i] = (jack_default_audio_sample_t*)jack_port_get_buffer(adapter->fPlaybackPortList[i], frames); + for (int i = 0; i < fAudioAdapter->GetOutputs(); i++) { + fOutputBufferList[i] = (jack_default_audio_sample_t*)jack_port_get_buffer(fPlaybackPortList[i], frames); } - adapter->fAudioAdapter->PullAndPush(inputBuffer, outputBuffer, frames); + fAudioAdapter->PullAndPush(fInputBufferList, fOutputBufferList, frames); return 0; } @@ -126,6 +128,9 @@ void JackAudioAdapter::FreePorts() delete[] fCapturePortList; delete[] fPlaybackPortList; + + delete[] fInputBufferList; + delete[] fOutputBufferList; } void JackAudioAdapter::ConnectPorts() @@ -164,6 +169,9 @@ int JackAudioAdapter::Open() fCapturePortList = new jack_port_t*[fAudioAdapter->GetInputs()]; fPlaybackPortList = new jack_port_t*[fAudioAdapter->GetOutputs()]; + fInputBufferList = new jack_default_audio_sample_t*[fAudioAdapter->GetInputs()]; + fOutputBufferList = new jack_default_audio_sample_t*[fAudioAdapter->GetOutputs()]; + for (int i = 0; i < fAudioAdapter->GetInputs(); i++) { snprintf(name, sizeof(name), "capture_%d", i + 1); if ((fCapturePortList[i] = jack_port_register(fClient, name, JACK_DEFAULT_AUDIO_TYPE, CaptureDriverFlags, 0)) == NULL) { diff --git a/common/JackAudioAdapter.h b/common/JackAudioAdapter.h index fd7ed13e..8baa4094 100644 --- a/common/JackAudioAdapter.h +++ b/common/JackAudioAdapter.h @@ -42,6 +42,9 @@ namespace Jack jack_port_t** fCapturePortList; jack_port_t** fPlaybackPortList; + jack_default_audio_sample_t** fInputBufferList; + jack_default_audio_sample_t** fOutputBufferList; + jack_client_t* fClient; JackAudioAdapterInterface* fAudioAdapter; bool fAutoConnect; @@ -49,6 +52,7 @@ namespace Jack void FreePorts(); void ConnectPorts(); void Reset(); + int ProcessAux(jack_nframes_t frames); public: diff --git a/common/JackAudioAdapterInterface.cpp b/common/JackAudioAdapterInterface.cpp index 6beeed5e..c75b9297 100644 --- a/common/JackAudioAdapterInterface.cpp +++ b/common/JackAudioAdapterInterface.cpp @@ -26,6 +26,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "JackLibSampleRateResampler.h" #endif #include "JackTime.h" +#include "JackError.h" #include namespace Jack @@ -317,4 +318,75 @@ namespace Jack return res; } + int JackAudioAdapterInterface::SetHostBufferSize(jack_nframes_t buffer_size) + { + fHostBufferSize = buffer_size; + if (fAdaptative) { + AdaptRingBufferSize(); + } + return 0; + } + + int JackAudioAdapterInterface::SetAdaptedBufferSize(jack_nframes_t buffer_size) + { + fAdaptedBufferSize = buffer_size; + if (fAdaptative) { + AdaptRingBufferSize(); + } + return 0; + } + + int JackAudioAdapterInterface::SetBufferSize(jack_nframes_t buffer_size) + { + SetHostBufferSize(buffer_size); + SetAdaptedBufferSize(buffer_size); + return 0; + } + + int JackAudioAdapterInterface::SetHostSampleRate(jack_nframes_t sample_rate) + { + fHostSampleRate = sample_rate; + fPIControler.Init(double(fHostSampleRate) / double(fAdaptedSampleRate)); + return 0; + } + + int JackAudioAdapterInterface::SetAdaptedSampleRate(jack_nframes_t sample_rate) + { + fAdaptedSampleRate = sample_rate; + fPIControler.Init(double(fHostSampleRate) / double(fAdaptedSampleRate)); + return 0; + } + + int JackAudioAdapterInterface::SetSampleRate(jack_nframes_t sample_rate) + { + SetHostSampleRate(sample_rate); + SetAdaptedSampleRate(sample_rate); + return 0; + } + + void JackAudioAdapterInterface::SetInputs(int inputs) + { + jack_log("JackAudioAdapterInterface::SetInputs %d", inputs); + fCaptureChannels = inputs; + } + + void JackAudioAdapterInterface::SetOutputs(int outputs) + { + jack_log("JackAudioAdapterInterface::SetOutputs %d", outputs); + fPlaybackChannels = outputs; + } + + int JackAudioAdapterInterface::GetInputs() + { + //jack_log("JackAudioAdapterInterface::GetInputs %d", fCaptureChannels); + return fCaptureChannels; + } + + int JackAudioAdapterInterface::GetOutputs() + { + //jack_log ("JackAudioAdapterInterface::GetOutputs %d", fPlaybackChannels); + return fPlaybackChannels; + } + + } // namespace diff --git a/common/JackAudioAdapterInterface.h b/common/JackAudioAdapterInterface.h index 2ae7e374..b8985c91 100644 --- a/common/JackAudioAdapterInterface.h +++ b/common/JackAudioAdapterInterface.h @@ -154,75 +154,16 @@ namespace Jack return 0; } - virtual int SetHostBufferSize(jack_nframes_t buffer_size) - { - fHostBufferSize = buffer_size; - if (fAdaptative) { - AdaptRingBufferSize(); - } - return 0; - } - - virtual int SetAdaptedBufferSize(jack_nframes_t buffer_size) - { - fAdaptedBufferSize = buffer_size; - if (fAdaptative) { - AdaptRingBufferSize(); - } - return 0; - } - - virtual int SetBufferSize(jack_nframes_t buffer_size) - { - SetHostBufferSize(buffer_size); - SetAdaptedBufferSize(buffer_size); - return 0; - } - - virtual int SetHostSampleRate(jack_nframes_t sample_rate) - { - fHostSampleRate = sample_rate; - fPIControler.Init(double(fHostSampleRate) / double(fAdaptedSampleRate)); - return 0; - } - - virtual int SetAdaptedSampleRate(jack_nframes_t sample_rate) - { - fAdaptedSampleRate = sample_rate; - fPIControler.Init(double(fHostSampleRate) / double(fAdaptedSampleRate)); - return 0; - } - - virtual int SetSampleRate(jack_nframes_t sample_rate) - { - SetHostSampleRate(sample_rate); - SetAdaptedSampleRate(sample_rate); - return 0; - } - - void SetInputs(int inputs) - { - jack_log("JackAudioAdapterInterface::SetInputs %d", inputs); - fCaptureChannels = inputs; - } - - void SetOutputs(int outputs) - { - jack_log("JackAudioAdapterInterface::SetOutputs %d", outputs); - fPlaybackChannels = outputs; - } - - int GetInputs() - { - //jack_log("JackAudioAdapterInterface::GetInputs %d", fCaptureChannels); - return fCaptureChannels; - } - - int GetOutputs() - { - //jack_log ("JackAudioAdapterInterface::GetOutputs %d", fPlaybackChannels); - return fPlaybackChannels; - } + virtual int SetHostBufferSize(jack_nframes_t buffer_size); + virtual int SetAdaptedBufferSize(jack_nframes_t buffer_size); + virtual int SetBufferSize(jack_nframes_t buffer_size); + virtual int SetHostSampleRate(jack_nframes_t sample_rate); + virtual int SetAdaptedSampleRate(jack_nframes_t sample_rate); + virtual int SetSampleRate(jack_nframes_t sample_rate); + void SetInputs(int inputs); + void SetOutputs(int outputs); + int GetInputs(); + int GetOutputs(); virtual int GetInputLatency(int port_index) { return 0; } virtual int GetOutputLatency(int port_index) { return 0; } diff --git a/common/JackAudioDriver.cpp b/common/JackAudioDriver.cpp index 337afe84..3cb0f56f 100644 --- a/common/JackAudioDriver.cpp +++ b/common/JackAudioDriver.cpp @@ -46,25 +46,20 @@ int JackAudioDriver::SetBufferSize(jack_nframes_t buffer_size) // Update engine and graph manager state fEngineControl->fBufferSize = buffer_size; fGraphManager->SetBufferSize(buffer_size); - fEngineControl->fPeriodUsecs = jack_time_t(1000000.f / fEngineControl->fSampleRate * fEngineControl->fBufferSize); // in microsec - if (!fEngineControl->fTimeOut) { - fEngineControl->fTimeOutUsecs = jack_time_t(2.f * fEngineControl->fPeriodUsecs); - } - + + fEngineControl->UpdateTimeOut(); UpdateLatencies(); - // Redirect on slaves drivers... + // Redirected on slaves drivers... return JackDriver::SetBufferSize(buffer_size); } int JackAudioDriver::SetSampleRate(jack_nframes_t sample_rate) { fEngineControl->fSampleRate = sample_rate; - fEngineControl->fPeriodUsecs = jack_time_t(1000000.f / fEngineControl->fSampleRate * fEngineControl->fBufferSize); // in microsec - if (!fEngineControl->fTimeOut) { - fEngineControl->fTimeOutUsecs = jack_time_t(2.f * fEngineControl->fPeriodUsecs); - } + fEngineControl->UpdateTimeOut(); + // Redirected on slaves drivers... return JackDriver::SetSampleRate(sample_rate); } diff --git a/common/JackChannel.h b/common/JackChannel.h index 5979ba8e..40f23b4f 100644 --- a/common/JackChannel.h +++ b/common/JackChannel.h @@ -35,6 +35,54 @@ class JackGraphManager; namespace detail { +class JackChannelTransactionInterface +{ + + public: + + JackChannelTransactionInterface() + {} + virtual ~JackChannelTransactionInterface() + {} + + virtual int Read(void* data, int len) = 0; + virtual int Write(void* data, int len) = 0; + +}; + +class JackRequestInterface +{ + + public: + + JackRequestInterface() + {} + virtual ~JackRequestInterface() + {} + + virtual int Connect(const char* dir, const char* name, int which) = 0; + virtual int Close() = 0; + +}; + +class JackClientRequestInterface : public JackChannelTransactionInterface, public JackRequestInterface +{ + + public: + + JackClientRequestInterface() + {} + virtual ~JackClientRequestInterface() + {} + + virtual int Read(void* data, int len) { return -1; } + virtual int Write(void* data, int len) { return -1; } + + virtual int Connect(const char* dir, const char* name, int which) { return -1; } + virtual int Close() { return -1; } + +}; + /*! \brief Inter process channel for server/client bidirectionnal communication : request and (receiving) notifications. */ diff --git a/common/JackClient.cpp b/common/JackClient.cpp index 9e1c952b..fd12bc22 100644 --- a/common/JackClient.cpp +++ b/common/JackClient.cpp @@ -88,6 +88,19 @@ JackClient::JackClient(JackSynchro* table):fThread(this) JackClient::~JackClient() {} +void JackClient::ShutDown() +{ + jack_log("JackClient::ShutDown"); + + if (fInfoShutdown) { + fInfoShutdown(JackFailure, "JACK server has been closed", fInfoShutdownArg); + fInfoShutdown = NULL; + } else if (fShutdown) { + fShutdown(fShutdownArg); + fShutdown = NULL; + } +} + int JackClient::Close() { jack_log("JackClient::Close ref = %ld", GetClientControl()->fRefNum); @@ -346,15 +359,18 @@ int JackClient::HandleLatencyCallback(int status) if (port->GetFlags() & JackPortIsOutput) { jack_latency_range_t other_latency; port->GetLatencyRange(mode, &other_latency); - if (other_latency.max > latency.max) + if (other_latency.max > latency.max) { latency.max = other_latency.max; - if (other_latency.min < latency.min) + } + if (other_latency.min < latency.min) { latency.min = other_latency.min; + } } } - if (latency.min == UINT32_MAX) + if (latency.min == UINT32_MAX) { latency.min = 0; + } /* now set the found latency on all input ports */ @@ -373,15 +389,18 @@ int JackClient::HandleLatencyCallback(int status) if (port->GetFlags() & JackPortIsInput) { jack_latency_range_t other_latency; port->GetLatencyRange(mode, &other_latency); - if (other_latency.max > latency.max) + if (other_latency.max > latency.max) { latency.max = other_latency.max; - if (other_latency.min < latency.min) + } + if (other_latency.min < latency.min) { latency.min = other_latency.min; + } } } - if (latency.min == UINT32_MAX) + if (latency.min == UINT32_MAX) { latency.min = 0; + } /* now set the found latency on all output ports */ @@ -409,13 +428,15 @@ connected to the client may not be activated. int JackClient::Activate() { jack_log("JackClient::Activate"); - if (IsActive()) + if (IsActive()) { return 0; + } // RT thread is started only when needed... if (IsRealTime()) { - if (StartThread() < 0) + if (StartThread() < 0) { return -1; + } } /* @@ -440,8 +461,9 @@ int JackClient::Activate() int JackClient::Deactivate() { jack_log("JackClient::Deactivate"); - if (!IsActive()) + if (!IsActive()) { return 0; + } GetClientControl()->fActive = false; @@ -455,8 +477,9 @@ int JackClient::Deactivate() jack_log("JackClient::Deactivate res = %ld", result); // RT thread is stopped only when needed... - if (IsRealTime()) + if (IsRealTime()) { fThread.Kill(); + } return result; } @@ -493,11 +516,13 @@ bool JackClient::Init() InitAux(); // Setup context - if (!jack_tls_set(JackGlobals::fRealTime, this)) - jack_error("failed to set thread realtime key"); + if (!jack_tls_set(JackGlobals::fRealTimeThread, this)) { + jack_error("Failed to set thread realtime key"); + } - if (GetEngineControl()->fRealTime) + if (GetEngineControl()->fRealTime) { set_threaded_log_function(); + } // Setup RT if (GetEngineControl()->fRealTime) { @@ -560,19 +585,22 @@ inline void JackClient::ExecuteThread() inline jack_nframes_t JackClient::CycleWaitAux() { - if (!WaitSync()) + if (!WaitSync()) { Error(); // Terminates the thread + } CallSyncCallbackAux(); return GetEngineControl()->fBufferSize; } inline void JackClient::CycleSignalAux(int status) { - if (status == 0) + if (status == 0) { CallTimebaseCallbackAux(); + } SignalSync(); - if (status != 0) + if (status != 0) { End(); // Terminates the thread + } } jack_nframes_t JackClient::CycleWait() @@ -747,27 +775,6 @@ int JackClient::ComputeTotalLatencies() return result; } -/* -ShutDown is called: -- from the RT thread when Execute method fails -- possibly from a "closed" notification channel -(Not needed since the synch object used (Sema of Fifo will fails when server quits... see ShutDown)) -*/ - -void JackClient::ShutDown() -{ - jack_log("JackClient::ShutDown"); - JackGlobals::fServerRunning = false; - - if (fInfoShutdown) { - fInfoShutdown(JackFailure, "JACK server has been closed", fInfoShutdownArg); - fInfoShutdown = NULL; - } else if (fShutdown) { - fShutdown(fShutdownArg); - fShutdown = NULL; - } -} - //---------------------- // Transport management //---------------------- @@ -780,8 +787,9 @@ inline int JackClient::ActivateAux() jack_log("JackClient::ActivateAux"); // RT thread is started - if (StartThread() < 0) + if (StartThread() < 0) { return -1; + } int result = -1; GetClientControl()->fCallback[kRealTimeCallback] = IsRealTime(); @@ -1001,8 +1009,7 @@ int JackClient::SetInitCallback(JackThreadInitCallback callback, void *arg) fInitArg = arg; fInit = callback; /* make sure that the message buffer thread is initialized too */ - JackMessageBuffer::fInstance->SetInitCallback(callback, arg); - return 0; + return JackMessageBuffer::fInstance->SetInitCallback(callback, arg); } } @@ -1042,8 +1049,9 @@ int JackClient::SetSampleRateCallback(JackSampleRateCallback callback, void *arg fSampleRateArg = arg; fSampleRate = callback; // Now invoke it - if (callback) + if (callback) { callback(GetEngineControl()->fSampleRate, arg); + } return 0; } } @@ -1122,7 +1130,7 @@ int JackClient::SetProcessThread(JackThreadCallback fun, void *arg) jack_error("You cannot set callbacks on an active client"); return -1; } else if (fProcess) { - jack_error ("A process callback has already been setup, both models cannot be used at the same time!"); + jack_error("A process callback has already been setup, both models cannot be used at the same time!"); return -1; } else { fThreadFun = fun; diff --git a/common/JackClient.h b/common/JackClient.h index 86630583..0c977d06 100644 --- a/common/JackClient.h +++ b/common/JackClient.h @@ -27,6 +27,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "JackSynchro.h" #include "JackPlatformPlug.h" #include "JackChannel.h" +#include "JackRequest.h" #include "varargs.h" #include @@ -86,7 +87,7 @@ class SERVER_EXPORT JackClient : public JackClientInterface, public JackRunnable void* fThreadFunArg; void* fSessionArg; void* fLatencyArg; - char fServerName[64]; + char fServerName[JACK_SERVER_CONTROL_NAME_SIZE]; JackThread fThread; /*! Thread to execute the Process function */ detail::JackClientChannelInterface* fChannel; diff --git a/common/JackClientInterface.h b/common/JackClientInterface.h index bd94ed38..523ffbf6 100644 --- a/common/JackClientInterface.h +++ b/common/JackClientInterface.h @@ -13,7 +13,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 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. */ @@ -36,12 +36,12 @@ class SERVER_EXPORT JackClientInterface { public: - + JackClientInterface() {} virtual ~JackClientInterface() {} - + virtual int Close() = 0; virtual int ClientNotify(int refnum, const char* name, int notify, int sync, const char* message, int value1, int value2) = 0; diff --git a/common/JackConstants.h b/common/JackConstants.h index 02c2cf06..ab16d972 100644 --- a/common/JackConstants.h +++ b/common/JackConstants.h @@ -24,7 +24,7 @@ #include "config.h" #endif -#define VERSION "1.9.8" +#define VERSION "1.9.9" #define BUFFER_SIZE_MAX 8192 @@ -71,7 +71,7 @@ #define JACK_PROTOCOL_VERSION 8 -#define SOCKET_TIME_OUT 5 // in sec +#define SOCKET_TIME_OUT 2 // in sec #define DRIVER_OPEN_TIMEOUT 5 // in sec #define FREEWHEEL_DRIVER_TIMEOUT 10 // in sec #define DRIVER_TIMEOUT_FACTOR 10 diff --git a/common/JackControlAPI.cpp b/common/JackControlAPI.cpp index 45990530..a2e94fe8 100644 --- a/common/JackControlAPI.cpp +++ b/common/JackControlAPI.cpp @@ -237,7 +237,7 @@ jackctl_add_driver_parameters( jackctl_value.b = descriptor_ptr->value.i; break; default: - jack_error("unknown driver parameter type %i", (int)descriptor_ptr->type); + jack_error("Unknown driver parameter type %i", (int)descriptor_ptr->type); assert(0); goto fail; } @@ -330,7 +330,7 @@ jackctl_create_param_list( retparam_ptr->value.i = param_ptr->value_ptr->b; break; default: - jack_error("unknown parameter type %i", (int)param_ptr->type); + jack_error("Unknown parameter type %i", (int)param_ptr->type); assert(0); goto free; } @@ -361,7 +361,7 @@ jackctl_drivers_load( descriptor_node_ptr = jack_drivers_load(NULL); if (descriptor_node_ptr == NULL) { - jack_error("could not find any drivers in driver directory!"); + jack_error("Could not find any drivers in driver directory!"); return false; } @@ -370,7 +370,7 @@ jackctl_drivers_load( driver_ptr = (struct jackctl_driver *)malloc(sizeof(struct jackctl_driver)); if (driver_ptr == NULL) { - jack_error("memory allocation of jackctl_driver structure failed."); + jack_error("Memory allocation of jackctl_driver structure failed."); goto next; } @@ -430,7 +430,7 @@ jackctl_internals_load( descriptor_node_ptr = jack_internals_load(NULL); if (descriptor_node_ptr == NULL) { - jack_error("could not find any internals in driver directory!"); + jack_error("Could not find any internals in driver directory!"); return false; } @@ -439,7 +439,7 @@ jackctl_internals_load( internal_ptr = (struct jackctl_internal *)malloc(sizeof(struct jackctl_internal)); if (internal_ptr == NULL) { - jack_error("memory allocation of jackctl_driver structure failed."); + jack_error("Memory allocation of jackctl_driver structure failed."); goto next; } @@ -506,57 +506,68 @@ jackctl_server_free_parameters( #ifdef WIN32 -static HANDLE waitEvent; +struct jackctl_sigmask +{ + HANDLE wait_event; +}; + +static jackctl_sigmask sigmask; -static void do_nothing_handler(int signum) +static void signal_handler(int signum) { - printf("jack main caught signal %d\n", signum); + printf("Jack main caught signal %d\n", signum); (void) signal(SIGINT, SIG_DFL); - SetEvent(waitEvent); + SetEvent(sigmask.wait_event); } -sigset_t +jackctl_sigmask_t * jackctl_setup_signals( unsigned int flags) { - if ((waitEvent = CreateEvent(NULL, FALSE, FALSE, NULL)) == NULL) { + if ((sigmask.wait_event = CreateEvent(NULL, FALSE, FALSE, NULL)) == NULL) { jack_error("CreateEvent fails err = %ld", GetLastError()); return 0; } - (void) signal(SIGINT, do_nothing_handler); - (void) signal(SIGABRT, do_nothing_handler); - (void) signal(SIGTERM, do_nothing_handler); + (void) signal(SIGINT, signal_handler); + (void) signal(SIGABRT, signal_handler); + (void) signal(SIGTERM, signal_handler); - return (sigset_t)waitEvent; + return &sigmask; } -void jackctl_wait_signals(sigset_t signals) +void jackctl_wait_signals(jackctl_sigmask_t * signals) { - if (WaitForSingleObject(waitEvent, INFINITE) != WAIT_OBJECT_0) { + if (WaitForSingleObject(signals->wait_event, INFINITE) != WAIT_OBJECT_0) { jack_error("WaitForSingleObject fails err = %ld", GetLastError()); } } #else +struct jackctl_sigmask +{ + sigset_t signals; +}; + +static jackctl_sigmask sigmask; + static void -do_nothing_handler(int sig) +signal_handler(int sig) { /* this is used by the child (active) process, but it never gets called unless we are already shutting down after another signal. */ char buf[64]; - snprintf (buf, sizeof(buf), "received signal %d during shutdown (ignored)\n", sig); + snprintf(buf, sizeof(buf), "Received signal %d during shutdown (ignored)\n", sig); } -SERVER_EXPORT sigset_t +SERVER_EXPORT jackctl_sigmask_t * jackctl_setup_signals( unsigned int flags) { - sigset_t signals; sigset_t allsignals; struct sigaction action; int i; @@ -595,54 +606,54 @@ jackctl_setup_signals( after a return from sigwait(). */ - sigemptyset(&signals); - sigaddset(&signals, SIGHUP); - sigaddset(&signals, SIGINT); - sigaddset(&signals, SIGQUIT); - sigaddset(&signals, SIGPIPE); - sigaddset(&signals, SIGTERM); - sigaddset(&signals, SIGUSR1); - sigaddset(&signals, SIGUSR2); + sigemptyset(&sigmask.signals); + sigaddset(&sigmask.signals, SIGHUP); + sigaddset(&sigmask.signals, SIGINT); + sigaddset(&sigmask.signals, SIGQUIT); + sigaddset(&sigmask.signals, SIGPIPE); + sigaddset(&sigmask.signals, SIGTERM); + sigaddset(&sigmask.signals, SIGUSR1); + sigaddset(&sigmask.signals, SIGUSR2); /* all child threads will inherit this mask unless they * explicitly reset it */ - pthread_sigmask(SIG_BLOCK, &signals, 0); + pthread_sigmask(SIG_BLOCK, &sigmask.signals, 0); /* install a do-nothing handler because otherwise pthreads behaviour is undefined when we enter sigwait. */ sigfillset(&allsignals); - action.sa_handler = do_nothing_handler; + action.sa_handler = signal_handler; action.sa_mask = allsignals; action.sa_flags = SA_RESTART|SA_RESETHAND; for (i = 1; i < NSIG; i++) { - if (sigismember (&signals, i)) + if (sigismember (&sigmask.signals, i)) { sigaction(i, &action, 0); } } - return signals; + return &sigmask; } SERVER_EXPORT void -jackctl_wait_signals(sigset_t signals) +jackctl_wait_signals(jackctl_sigmask_t * sigmask) { int sig; bool waiting = true; while (waiting) { #if defined(sun) && !defined(__sun__) // SUN compiler only, to check - sigwait(&signals); + sigwait(&sigmask->signals); #else - sigwait(&signals, &sig); + sigwait(&sigmask->signals, &sig); #endif - fprintf(stderr, "jack main caught signal %d\n", sig); + fprintf(stderr, "Jack main caught signal %d\n", sig); switch (sig) { case SIGUSR1: @@ -664,7 +675,7 @@ jackctl_wait_signals(sigset_t signals) // unblock signals so we can see them during shutdown. // this will help prod developers not to lose sight of // bugs that cause segfaults etc. during shutdown. - sigprocmask(SIG_UNBLOCK, &signals, 0); + sigprocmask(SIG_UNBLOCK, &sigmask->signals, 0); } } #endif @@ -911,15 +922,15 @@ SERVER_EXPORT bool jackctl_server_close(jackctl_server *server_ptr) delete server_ptr->engine; /* clean up shared memory and files from this server instance */ - jack_log("cleaning up shared memory"); + jack_log("Cleaning up shared memory"); jack_cleanup_shm(); - jack_log("cleaning up files"); + jack_log("Cleaning up files"); JackTools::CleanupFiles(server_ptr->name.str); - jack_log("unregistering server `%s'", server_ptr->name.str); + jack_log("Unregistering server `%s'", server_ptr->name.str); jack_unregister_server(server_ptr->name.str); @@ -956,14 +967,14 @@ jackctl_server_open( jack_error("`%s' server already active", server_ptr->name.str); goto fail; case ENOSPC: - jack_error("too many servers already active"); + jack_error("Too many servers already active"); goto fail; case ENOMEM: - jack_error("no access to shm registry"); + jack_error("No access to shm registry"); goto fail; } - jack_log("server `%s' registered", server_ptr->name.str); + jack_log("Server `%s' registered", server_ptr->name.str); /* clean up shared memory and files from any previous * instance of this server name */ @@ -976,7 +987,7 @@ jackctl_server_open( /* check port max value before allocating server */ if (server_ptr->port_max.ui > PORT_NUM_MAX) { - jack_error("JACK server started with too much ports %d (when port max can be %d)", server_ptr->port_max.ui, PORT_NUM_MAX); + jack_error("Jack server started with too much ports %d (when port max can be %d)", server_ptr->port_max.ui, PORT_NUM_MAX); goto fail; } @@ -1003,7 +1014,7 @@ jackctl_server_open( jackctl_destroy_param_list(paramlist); if (rc < 0) { - jack_error("JackServer::Open() failed with %d", rc); + jack_error("JackServer::Open failed with %d", rc); goto fail_delete; } @@ -1019,15 +1030,15 @@ fail_delete: server_ptr->engine = NULL; fail_unregister: - jack_log("cleaning up shared memory"); + jack_log("Cleaning up shared memory"); jack_cleanup_shm(); - jack_log("cleaning up files"); + jack_log("Cleaning up files"); JackTools::CleanupFiles(server_ptr->name.str); - jack_log("unregistering server `%s'", server_ptr->name.str); + jack_log("Unregistering server `%s'", server_ptr->name.str); jack_unregister_server(server_ptr->name.str); @@ -1138,7 +1149,7 @@ SERVER_EXPORT union jackctl_parameter_value jackctl_parameter_get_enum_constrain strcpy(jackctl_value.str, value_ptr->str); break; default: - jack_error("bad driver parameter type %i (enum constraint)", (int)parameter_ptr->type); + jack_error("Bad driver parameter type %i (enum constraint)", (int)parameter_ptr->type); assert(0); } @@ -1167,7 +1178,7 @@ SERVER_EXPORT void jackctl_parameter_get_range_constraint(jackctl_parameter *par max_ptr->ui = parameter_ptr->constraint_ptr->constraint.range.max.ui; return; default: - jack_error("bad driver parameter type %i (range constraint)", (int)parameter_ptr->type); + jack_error("Bad driver parameter type %i (range constraint)", (int)parameter_ptr->type); assert(0); } } @@ -1307,7 +1318,7 @@ SERVER_EXPORT bool jackctl_server_add_slave(jackctl_server * server_ptr, jackctl { if (server_ptr && server_ptr->engine) { if (server_ptr->engine->IsRunning()) { - jack_error("cannot add a slave in a running server"); + jack_error("Cannot add a slave in a running server"); return false; } else { JSList * paramlist = jackctl_create_param_list(driver_ptr->parameters); @@ -1330,7 +1341,7 @@ SERVER_EXPORT bool jackctl_server_remove_slave(jackctl_server * server_ptr, jack { if (server_ptr && server_ptr->engine) { if (server_ptr->engine->IsRunning()) { - jack_error("cannot remove a slave from a running server"); + jack_error("Cannot remove a slave from a running server"); return false; } else { if (driver_ptr->infos) { diff --git a/common/JackControlAPI.h b/common/JackControlAPI.h index 0363d24c..d9529388 100644 --- a/common/JackControlAPI.h +++ b/common/JackControlAPI.h @@ -25,15 +25,6 @@ #include "jslist.h" #include "JackCompilerDeps.h" -#ifdef WIN32 -#ifdef __MINGW32__ -#include -typedef _sigset_t sigset_t; -#else -typedef HANDLE sigset_t; -#endif -#endif - /** Parameter types, intentionally similar to jack_driver_param_type_t */ typedef enum { @@ -80,6 +71,9 @@ typedef struct jackctl_internal jackctl_internal_t; /** opaque type for parameter object */ typedef struct jackctl_parameter jackctl_parameter_t; +/** opaque type for sigmask object */ +typedef struct jackctl_sigmask jackctl_sigmask_t; + #ifdef __cplusplus extern "C" { #endif @@ -87,13 +81,13 @@ extern "C" { } /* Adjust editor indent */ #endif -SERVER_EXPORT sigset_t +SERVER_EXPORT jackctl_sigmask_t * jackctl_setup_signals( unsigned int flags); SERVER_EXPORT void jackctl_wait_signals( - sigset_t signals); + jackctl_sigmask_t * signals); SERVER_EXPORT jackctl_server_t * jackctl_server_create( @@ -252,6 +246,9 @@ SERVER_EXPORT bool jackctl_server_switch_master(jackctl_server_t * server, jackctl_driver_t * driver); +SERVER_EXPORT int +jackctl_parse_driver_params(jackctl_driver * driver_ptr, int argc, char* argv[]); + #if 0 { /* Adjust editor indent */ #endif diff --git a/common/JackDebugClient.cpp b/common/JackDebugClient.cpp index 3b0af9b4..e5efa7da 100644 --- a/common/JackDebugClient.cpp +++ b/common/JackDebugClient.cpp @@ -115,7 +115,11 @@ int JackDebugClient::Close() void JackDebugClient::CheckClient(const char* function_name) const { +#ifdef WIN32 + *fStream << "CheckClient : " << function_name << ", calling thread : " << GetCurrentThread() << endl; +#else *fStream << "CheckClient : " << function_name << ", calling thread : " << pthread_self() << endl; +#endif if (fIsClosed > 0) { *fStream << "!!! ERROR !!! : Accessing a client '" << fClientName << "' already closed " << "from " << function_name << endl; @@ -290,13 +294,13 @@ int JackDebugClient::PortDisconnect(jack_port_id_t src) { CheckClient("PortDisconnect"); if (!fIsActivated) - *fStream << "!!! ERROR !!! : Trying to disconnect port " << src << " while that client has not been activated !" << endl; + *fStream << "!!! ERROR !!! : Trying to disconnect port " << src << " while that client has not been activated !" << endl; int res = fClient->PortDisconnect(src); int i; for (i = (fTotalPortNumber - 1); i >= 0; i--) { // We search the record into the history if (fPortList[i].idport == src) { // We found the record in sources if (fPortList[i].IsUnregistered != 0) - *fStream << "!!! ERROR !!! : Disconnecting port " << src << " previoulsy unregistered !" << endl; + *fStream << "!!! ERROR !!! : Disconnecting port " << src << " previoulsy unregistered !" << endl; fPortList[i].IsConnected--; *fStream << "Disconnecting port " << src << ". " << endl; break; @@ -313,9 +317,17 @@ int JackDebugClient::PortDisconnect(jack_port_id_t src) int JackDebugClient::PortIsMine(jack_port_id_t port_index) { CheckClient("PortIsMine"); + *fStream << "JackClientDebug : PortIsMine port_index " << port_index << endl; return fClient->PortIsMine(port_index); } +int JackDebugClient::PortRename(jack_port_id_t port_index, const char* name) +{ + CheckClient("PortRename"); + *fStream << "JackClientDebug : PortRename port_index " << port_index << "name" << name << endl; + return fClient->PortRename(port_index, name); +} + //-------------------- // Context management //-------------------- @@ -323,6 +335,7 @@ int JackDebugClient::PortIsMine(jack_port_id_t port_index) int JackDebugClient::SetBufferSize(jack_nframes_t buffer_size) { CheckClient("SetBufferSize"); + *fStream << "JackClientDebug : SetBufferSize buffer_size " << buffer_size << endl; return fClient->SetBufferSize(buffer_size); } @@ -330,13 +343,19 @@ int JackDebugClient::SetFreeWheel(int onoff) { CheckClient("SetFreeWheel"); if (onoff && fFreewheel) - *fStream << "!!! ERROR !!! : Freewheel setup seems incorrect : set = ON while FW is already ON " << endl; + *fStream << "!!! ERROR !!! : Freewheel setup seems incorrect : set = ON while FW is already ON " << endl; if (!onoff && !fFreewheel) - *fStream << "!!! ERROR !!! : Freewheel setup seems incorrect : set = OFF while FW is already OFF " << endl; + *fStream << "!!! ERROR !!! : Freewheel setup seems incorrect : set = OFF while FW is already OFF " << endl; fFreewheel = onoff ? true : false; return fClient->SetFreeWheel(onoff); } +int JackDebugClient::ComputeTotalLatencies() +{ + CheckClient("ComputeTotalLatencies"); + return fClient->ComputeTotalLatencies(); +} + /* ShutDown is called: - from the RT thread when Execute method fails @@ -346,6 +365,7 @@ ShutDown is called: void JackDebugClient::ShutDown() { + CheckClient("ShutDown"); fClient->ShutDown(); } @@ -368,6 +388,7 @@ int JackDebugClient::SetSyncCallback(JackSyncCallback sync_callback, void* arg) int JackDebugClient::SetSyncTimeout(jack_time_t timeout) { CheckClient("SetSyncTimeout"); + *fStream << "JackClientDebug : SetSyncTimeout timeout " << timeout << endl; return fClient->SetSyncTimeout(timeout); } @@ -380,6 +401,7 @@ int JackDebugClient::SetTimebaseCallback(int conditional, JackTimebaseCallback t void JackDebugClient::TransportLocate(jack_nframes_t frame) { CheckClient("TransportLocate"); + *fStream << "JackClientDebug : TransportLocate frame " << frame << endl; fClient->TransportLocate(frame); } @@ -435,10 +457,11 @@ int JackDebugClient::TimeCallback(jack_nframes_t nframes, void *arg) jack_time_t t1 = GetMicroSeconds(); int res = client->fProcessTimeCallback(nframes, client->fProcessTimeCallbackArg); if (res == 0) { - jack_time_t t2 = GetMicroSeconds(); + jack_time_t t2 = GetMicroSeconds(); long delta = long((t2 - t1) - client->GetEngineControl()->fPeriodUsecs); - if (delta > 0 && !client->fFreewheel) + if (delta > 0 && !client->fFreewheel) { *client->fStream << "!!! ERROR !!! : Process overload of " << delta << " us" << endl; + } } return res; } @@ -446,9 +469,17 @@ int JackDebugClient::TimeCallback(jack_nframes_t nframes, void *arg) int JackDebugClient::SetProcessCallback(JackProcessCallback callback, void *arg) { CheckClient("SetProcessCallback"); + fProcessTimeCallback = callback; fProcessTimeCallbackArg = arg; - return fClient->SetProcessCallback(TimeCallback, this); + + if (callback == NULL) { + // Clear the callback... + return fClient->SetProcessCallback(callback, arg); + } else { + // Setup the measuring version... + return fClient->SetProcessCallback(TimeCallback, this); + } } int JackDebugClient::SetXRunCallback(JackXRunCallback callback, void *arg) @@ -517,9 +548,16 @@ int JackDebugClient::SetLatencyCallback(JackLatencyCallback callback, void *arg) return fClient->SetLatencyCallback(callback, arg); } +int JackDebugClient::SetProcessThread(JackThreadCallback fun, void *arg) +{ + CheckClient("SetProcessThread"); + return fClient->SetProcessThread(fun, arg); +} + jack_session_command_t* JackDebugClient::SessionNotify(const char* target, jack_session_event_type_t type, const char* path) { CheckClient("SessionNotify"); + *fStream << "JackClientDebug : SessionNotify target " << target << "type " << type << "path " << path << endl; return fClient->SessionNotify(target, type, path); } @@ -532,24 +570,28 @@ int JackDebugClient::SessionReply(jack_session_event_t* ev) char* JackDebugClient::GetUUIDForClientName(const char* client_name) { CheckClient("GetUUIDForClientName"); + *fStream << "JackClientDebug : GetUUIDForClientName client_name " << client_name << endl; return fClient->GetUUIDForClientName(client_name); } char* JackDebugClient::GetClientNameByUUID(const char* uuid) { CheckClient("GetClientNameByUUID"); + *fStream << "JackClientDebug : GetClientNameByUUID uuid " << uuid << endl; return fClient->GetClientNameByUUID(uuid); } int JackDebugClient::ReserveClientName(const char* client_name, const char* uuid) { CheckClient("ReserveClientName"); + *fStream << "JackClientDebug : ReserveClientName client_name " << client_name << "uuid " << uuid << endl; return fClient->ReserveClientName(client_name, uuid); } int JackDebugClient::ClientHasSessionCallback(const char* client_name) { CheckClient("ClientHasSessionCallback"); + *fStream << "JackClientDebug : ClientHasSessionCallback client_name " << client_name << endl; return fClient->ClientHasSessionCallback(client_name); } diff --git a/common/JackDebugClient.h b/common/JackDebugClient.h index f781b075..7256552e 100644 --- a/common/JackDebugClient.h +++ b/common/JackDebugClient.h @@ -46,7 +46,7 @@ PortFollower; \brief A "decorator" debug client to validate API use. */ -class LIB_EXPORT JackDebugClient : public JackClient +class JackDebugClient : public JackClient { protected: @@ -83,6 +83,7 @@ class LIB_EXPORT JackDebugClient : public JackClient // Context int SetBufferSize(jack_nframes_t buffer_size); int SetFreeWheel(int onoff); + int ComputeTotalLatencies(); void ShutDown(); jack_native_thread_t GetThreadID(); @@ -95,6 +96,7 @@ class LIB_EXPORT JackDebugClient : public JackClient int PortDisconnect(jack_port_id_t src); int PortIsMine(jack_port_id_t port_index); + int PortRename(jack_port_id_t port_index, const char* name); // Transport int ReleaseTimebase(); @@ -129,6 +131,9 @@ class LIB_EXPORT JackDebugClient : public JackClient int InternalClientHandle(const char* client_name, jack_status_t* status); int InternalClientLoad(const char* client_name, jack_options_t options, jack_status_t* status, jack_varargs_t* va); void InternalClientUnload(int ref, jack_status_t* status); + + // RT Thread + int SetProcessThread(JackThreadCallback fun, void *arg); // Session API jack_session_command_t* SessionNotify(const char* target, jack_session_event_type_t type, const char* path); diff --git a/common/JackDriver.cpp b/common/JackDriver.cpp index d0111e5f..4e0cbbc3 100644 --- a/common/JackDriver.cpp +++ b/common/JackDriver.cpp @@ -129,10 +129,7 @@ int JackDriver::Open(bool capturing, strcpy(fCaptureDriverName, capture_driver_name); strcpy(fPlaybackDriverName, playback_driver_name); - fEngineControl->fPeriodUsecs = jack_time_t(1000000.f / fEngineControl->fSampleRate * fEngineControl->fBufferSize); // in microsec - if (!fEngineControl->fTimeOut) { - fEngineControl->fTimeOutUsecs = jack_time_t(2.f * fEngineControl->fPeriodUsecs); - } + fEngineControl->UpdateTimeOut(); fGraphManager->DirectConnect(fClientControl.fRefNum, fClientControl.fRefNum); // Connect driver to itself for "sync" mode SetupDriverSync(fClientControl.fRefNum, false); @@ -183,10 +180,7 @@ int JackDriver::Open(jack_nframes_t buffer_size, strcpy(fCaptureDriverName, capture_driver_name); strcpy(fPlaybackDriverName, playback_driver_name); - fEngineControl->fPeriodUsecs = jack_time_t(1000000.f / fEngineControl->fSampleRate * fEngineControl->fBufferSize); // in microsec - if (!fEngineControl->fTimeOut) { - fEngineControl->fTimeOutUsecs = jack_time_t(2.f * fEngineControl->fPeriodUsecs); - } + fEngineControl->UpdateTimeOut(); fGraphManager->SetBufferSize(buffer_size); fGraphManager->DirectConnect(fClientControl.fRefNum, fClientControl.fRefNum); // Connect driver to itself for "sync" mode @@ -495,7 +489,7 @@ void JackDriver::SaveConnections() fConnections.push_back(make_pair(aliases[0], connections[j])); jack_info("Save connection: %s %s", aliases[0], connections[j]); */ - fConnections.push_back(make_pair(fGraphManager->GetPort(fCapturePortList[i])->GetName(), connections[j])); + fConnections.push_back(make_pair(string(fGraphManager->GetPort(fCapturePortList[i])->GetName()), string(connections[j]))); jack_info("Save connection: %s %s", fGraphManager->GetPort(fCapturePortList[i])->GetName(), connections[j]); } free(connections); @@ -510,7 +504,7 @@ void JackDriver::SaveConnections() fConnections.push_back(make_pair(connections[j], aliases[0])); jack_info("Save connection: %s %s", connections[j], aliases[0]); */ - fConnections.push_back(make_pair(connections[j], fGraphManager->GetPort(fPlaybackPortList[i])->GetName())); + fConnections.push_back(make_pair(string(connections[j]), string(fGraphManager->GetPort(fPlaybackPortList[i])->GetName()))); jack_info("Save connection: %s %s", connections[j], fGraphManager->GetPort(fPlaybackPortList[i])->GetName()); } free(connections); diff --git a/common/JackDriver.h b/common/JackDriver.h index 4f230ebe..3cc564b8 100644 --- a/common/JackDriver.h +++ b/common/JackDriver.h @@ -176,7 +176,7 @@ class SERVER_EXPORT JackDriver : public JackDriverClientInterface void CycleTakeEndTime(); void SetupDriverSync(int ref, bool freewheel); - + void NotifyXRun(jack_time_t callback_usecs, float delayed_usecs); // XRun notification sent by the driver void NotifyBufferSize(jack_nframes_t buffer_size); // BufferSize notification sent by the driver void NotifySampleRate(jack_nframes_t sample_rate); // SampleRate notification sent by the driver diff --git a/common/JackDriverInfo.h b/common/JackDriverInfo.h new file mode 100644 index 00000000..f2b862f5 --- /dev/null +++ b/common/JackDriverInfo.h @@ -0,0 +1,55 @@ +/* +Copyright (C) 2001-2005 Paul Davis +Copyright (C) 2004-2008 Grame + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef __JackDriverInfo__ +#define __JackDriverInfo__ + +#include "driver_interface.h" +#include "JackDriver.h" +#include "JackSystemDeps.h" + +typedef Jack::JackDriverClientInterface* (*driverInitialize) (Jack::JackLockedEngine*, Jack::JackSynchro*, const JSList*); + +class SERVER_EXPORT JackDriverInfo +{ + + private: + + driverInitialize fInitialize; + DRIVER_HANDLE fHandle; + Jack::JackDriverClientInterface* fBackend; + + public: + + JackDriverInfo():fInitialize(NULL),fHandle(NULL),fBackend(NULL) + {} + ~JackDriverInfo(); + + Jack::JackDriverClientInterface* Open(jack_driver_desc_t* driver_desc, Jack::JackLockedEngine*, Jack::JackSynchro*, const JSList*); + + Jack::JackDriverClientInterface* GetBackend() + { + return fBackend; + } + +}; + +#endif + diff --git a/common/JackDriverLoader.cpp b/common/JackDriverLoader.cpp index f7de89ee..488cb43f 100644 --- a/common/JackDriverLoader.cpp +++ b/common/JackDriverLoader.cpp @@ -20,6 +20,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "JackSystemDeps.h" #include "JackDriverLoader.h" +#include "JackDriverInfo.h" #include "JackConstants.h" #include "JackError.h" #include @@ -31,9 +32,57 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include #endif +#ifdef WIN32 + +static char* locate_dll_driver_dir() +{ +#ifdef _WIN64 + HMODULE libjack_handle = LoadLibrary("libjackserver64.dll"); +#else + HMODULE libjack_handle = LoadLibrary("libjackserver.dll"); +#endif + + // For WIN32 ADDON_DIR is defined in JackConstants.h as relative path + char driver_dir_storage[512]; + if (3 < GetModuleFileName(libjack_handle, driver_dir_storage, 512)) { + char *p = strrchr(driver_dir_storage, '\\'); + if (p && (p != driver_dir_storage)) { + *p = 0; + } + jack_info("Drivers/internals found in : %s", driver_dir_storage); + strcat(driver_dir_storage, "/"); + strcat(driver_dir_storage, ADDON_DIR); + FreeLibrary(libjack_handle); + return strdup(driver_dir_storage); + } else { + jack_error("Cannot get JACK dll directory : %d", GetLastError()); + FreeLibrary(libjack_handle); + return NULL; + } +} + +static char* locate_driver_dir(HANDLE& file, WIN32_FIND_DATA& filedata) +{ + // Search drivers/internals iin the same folder of "libjackserver.dll" + char* driver_dir = locate_dll_driver_dir(); + char dll_filename[512]; + snprintf(dll_filename, sizeof(dll_filename), "%s/*.dll", driver_dir); + file = (HANDLE)FindFirstFile(dll_filename, &filedata); + + if (file == INVALID_HANDLE_VALUE) { + jack_error("Drivers not found "); + free(driver_dir); + return NULL; + } else { + return driver_dir; + } +} + +#endif + jack_driver_desc_t* jackctl_driver_get_desc(jackctl_driver_t * driver); -SERVER_EXPORT void jack_print_driver_options(jack_driver_desc_t* desc, FILE* file) +void jack_print_driver_options(jack_driver_desc_t* desc, FILE* file) { unsigned long i; char arg_default[JACK_DRIVER_PARAM_STRING_MAX + 1]; @@ -69,15 +118,14 @@ SERVER_EXPORT void jack_print_driver_options(jack_driver_desc_t* desc, FILE* fil } } -static void -jack_print_driver_param_usage (jack_driver_desc_t* desc, unsigned long param, FILE *file) +static void jack_print_driver_param_usage (jack_driver_desc_t* desc, unsigned long param, FILE *file) { fprintf (file, "Usage information for the '%s' parameter for driver '%s':\n", desc->params[param].name, desc->name); fprintf (file, "%s\n", desc->params[param].long_desc); } -SERVER_EXPORT void jack_free_driver_params(JSList * driver_params) +void jack_free_driver_params(JSList * driver_params) { JSList*node_ptr = driver_params; JSList*next_node_ptr; @@ -90,8 +138,7 @@ SERVER_EXPORT void jack_free_driver_params(JSList * driver_params) } } -SERVER_EXPORT int -jack_parse_driver_params(jack_driver_desc_t* desc, int argc, char* argv[], JSList** param_ptr) +int jack_parse_driver_params(jack_driver_desc_t* desc, int argc, char* argv[], JSList** param_ptr) { struct option * long_options; char* options, * options_ptr; @@ -116,7 +163,7 @@ jack_parse_driver_params(jack_driver_desc_t* desc, int argc, char* argv[], JSLis } } - fprintf (stderr, "jackd: unknown option '%s' " + fprintf (stderr, "Jackd: unknown option '%s' " "for driver '%s'\n", argv[2], desc->name); } @@ -218,8 +265,7 @@ jack_parse_driver_params(jack_driver_desc_t* desc, int argc, char* argv[], JSLis return 0; } -SERVER_EXPORT int -jackctl_parse_driver_params(jackctl_driver *driver_ptr, int argc, char* argv[]) +SERVER_EXPORT int jackctl_driver_params_parse(jackctl_driver *driver_ptr, int argc, char* argv[]) { struct option* long_options; char* options, * options_ptr; @@ -250,7 +296,7 @@ jackctl_parse_driver_params(jackctl_driver *driver_ptr, int argc, char* argv[]) } } - fprintf (stderr, "jackd: unknown option '%s' " + fprintf (stderr, "Jackd: unknown option '%s' " "for driver '%s'\n", argv[2], desc->name); } @@ -352,8 +398,7 @@ jackctl_parse_driver_params(jackctl_driver *driver_ptr, int argc, char* argv[]) return 0; } -jack_driver_desc_t* -jack_find_driver_descriptor (JSList * drivers, const char* name) +jack_driver_desc_t* jack_find_driver_descriptor (JSList * drivers, const char* name) { jack_driver_desc_t* desc = 0; JSList* node; @@ -371,193 +416,87 @@ jack_find_driver_descriptor (JSList * drivers, const char* name) return desc; } -static jack_driver_desc_t* -jack_get_descriptor (JSList * drivers, const char* sofile, const char* symbol) +static void* check_symbol(const char* sofile, const char* symbol, const char* driver_dir, void** res_dllhandle = NULL) { - jack_driver_desc_t* descriptor, * other_descriptor; - JackDriverDescFunction so_get_descriptor = NULL; - JSList* node; - void * dlhandle; - char* filename; + void* dlhandle; + void* res = NULL; + char filename[1024]; + sprintf(filename, "%s/%s", driver_dir, sofile); + + if ((dlhandle = LoadDriverModule(filename)) == NULL) { #ifdef WIN32 - int dlerr; + jack_error ("Could not open component .dll '%s': %ld", filename, GetLastError()); #else - const char* dlerr; + jack_error ("Could not open component .so '%s': %s", filename, dlerror()); #endif - - int err; - const char* driver_dir; - - if ((driver_dir = getenv("JACK_DRIVER_DIR")) == 0) { - // for WIN32 ADDON_DIR is defined in JackConstants.h as relative path - // for posix systems, it is absolute path of default driver dir -#ifdef WIN32 - char temp_driver_dir1[512]; - char temp_driver_dir2[512]; - if (3 < GetModuleFileName(NULL, temp_driver_dir1, 512)) { - char *p = strrchr(temp_driver_dir1, '\\'); - if (p && (p != temp_driver_dir1)) - *p = 0; - else - GetCurrentDirectory(512, temp_driver_dir1); + } else { + res = (void*)GetDriverProc(dlhandle, symbol); + if (res_dllhandle) { + *res_dllhandle = dlhandle; } else { - GetCurrentDirectory(512, temp_driver_dir1); + UnloadDriverModule(dlhandle); } - sprintf(temp_driver_dir2, "%s/%s", temp_driver_dir1, ADDON_DIR); - driver_dir = temp_driver_dir2; -#else - driver_dir = ADDON_DIR; -#endif } - int len = strlen(driver_dir) + 1 + strlen(sofile) + 1; - filename = (char*)malloc(len); - snprintf(filename, len, "%s/%s", driver_dir, sofile); - - if ((dlhandle = LoadDriverModule(filename)) == NULL) { -#ifdef WIN32 - jack_error ("could not open driver .dll '%s': %ld", filename, GetLastError()); -#else - jack_error ("could not open driver .so '%s': %s", filename, dlerror()); -#endif - - free(filename); - return NULL; - } + return res; +} - so_get_descriptor = (JackDriverDescFunction)GetDriverProc(dlhandle, symbol); +static jack_driver_desc_t* jack_get_descriptor (JSList* drivers, const char* sofile, const char* symbol, const char* driver_dir) +{ + jack_driver_desc_t* descriptor = NULL; + jack_driver_desc_t* other_descriptor; + JackDriverDescFunction so_get_descriptor = NULL; + char filename[1024]; + JSList* node; + void* dlhandle; -#ifdef WIN32 - if ((so_get_descriptor == NULL) && (dlerr = GetLastError()) != 0) { - jack_error("jack_get_descriptor : dll is not a driver, err = %ld", dlerr); -#else - if ((so_get_descriptor == NULL) && (dlerr = dlerror ()) != NULL) { - jack_error("jack_get_descriptor err = %s", dlerr); -#endif + sprintf(filename, "%s/%s", driver_dir, sofile); + so_get_descriptor = (JackDriverDescFunction)check_symbol(sofile, symbol, driver_dir, &dlhandle); - UnloadDriverModule(dlhandle); - free(filename); - return NULL; + if (so_get_descriptor == NULL) { + jack_error("jack_get_descriptor : dll %s is not a driver", sofile); + goto error; } if ((descriptor = so_get_descriptor ()) == NULL) { - jack_error("driver from '%s' returned NULL descriptor", filename); - UnloadDriverModule(dlhandle); - free(filename); - return NULL; + jack_error("Driver from '%s' returned NULL descriptor", filename); + goto error; } -#ifdef WIN32 - if ((err = UnloadDriverModule(dlhandle)) == 0) { - jack_error ("error closing driver .so '%s': %ld", filename, GetLastError ()); - } -#else - if ((err = UnloadDriverModule(dlhandle)) != 0) { - jack_error ("error closing driver .so '%s': %s", filename, dlerror ()); - } -#endif - /* check it doesn't exist already */ for (node = drivers; node; node = jack_slist_next (node)) { other_descriptor = (jack_driver_desc_t*) node->data; - if (strcmp(descriptor->name, other_descriptor->name) == 0) { - jack_error("the drivers in '%s' and '%s' both have the name '%s'; using the first", + jack_error("The drivers in '%s' and '%s' both have the name '%s'; using the first", other_descriptor->file, filename, other_descriptor->name); /* FIXME: delete the descriptor */ - free(filename); - return NULL; + goto error; } } strncpy(descriptor->file, filename, JACK_PATH_MAX); - free(filename); - return descriptor; -} -static bool check_symbol(const char* sofile, const char* symbol) -{ - void * dlhandle; - bool res = false; - const char* driver_dir; +error: - if ((driver_dir = getenv("JACK_DRIVER_DIR")) == 0) { - // for WIN32 ADDON_DIR is defined in JackConstants.h as relative path - // for posix systems, it is absolute path of default driver dir -#ifdef WIN32 - char temp_driver_dir1[512]; - char temp_driver_dir2[512]; - if (3 < GetModuleFileName(NULL, temp_driver_dir1, 512)) { - char *p = strrchr(temp_driver_dir1, '\\'); - if (p && (p != temp_driver_dir1)) - *p = 0; - else - GetCurrentDirectory(512, temp_driver_dir1); - } else { - GetCurrentDirectory(512, temp_driver_dir1); - } - snprintf(temp_driver_dir2, sizeof(temp_driver_dir2), "%s/%s", temp_driver_dir1, ADDON_DIR); - driver_dir = temp_driver_dir2; -#else - driver_dir = ADDON_DIR; -#endif - } - - int len = strlen(driver_dir) + 1 + strlen(sofile) + 1; - char* filename = (char*)malloc(len); - snprintf(filename, len, "%s/%s", driver_dir, sofile); - - if ((dlhandle = LoadDriverModule(filename)) == NULL) { -#ifdef WIN32 - jack_error ("could not open component .dll '%s': %ld", filename, GetLastError()); -#else - jack_error ("could not open component .so '%s': %s", filename, dlerror()); -#endif - } else { - res = (GetDriverProc(dlhandle, symbol)) ? true : false; - UnloadDriverModule(dlhandle); - } - - free(filename); - return res; + UnloadDriverModule(dlhandle); + return descriptor; } #ifdef WIN32 -JSList * -jack_drivers_load (JSList * drivers) { - char* driver_dir; - char driver_dir_storage[512]; - char dll_filename[512]; +JSList * jack_drivers_load(JSList * drivers) +{ + //char dll_filename[512]; WIN32_FIND_DATA filedata; HANDLE file; const char* ptr = NULL; JSList* driver_list = NULL; jack_driver_desc_t* desc = NULL; - if ((driver_dir = getenv("JACK_DRIVER_DIR")) == 0) { - // for WIN32 ADDON_DIR is defined in JackConstants.h as relative path - if (3 < GetModuleFileName(NULL, driver_dir_storage, 512)) { - char *p = strrchr(driver_dir_storage, '\\'); - if (p && (p != driver_dir_storage)) - *p = 0; - else - GetCurrentDirectory(512, driver_dir_storage); - } else { - GetCurrentDirectory(512, driver_dir_storage); - } - strcat(driver_dir_storage, "/"); - strcat(driver_dir_storage, ADDON_DIR); - driver_dir = driver_dir_storage; - } - - snprintf(dll_filename, sizeof(dll_filename), "%s/*.dll", driver_dir); - - file = (HANDLE )FindFirstFile(dll_filename, &filedata); - - if (file == INVALID_HANDLE_VALUE) { - jack_error("error invalid handle"); - return NULL; + char* driver_dir = locate_driver_dir(file, filedata); + if (!driver_dir) { + jack_error("Driver folder not found"); + goto error; } do { @@ -570,17 +509,18 @@ jack_drivers_load (JSList * drivers) { if (!ptr) { continue; } + ptr++; if (strncmp ("dll", ptr, 3) != 0) { continue; } /* check if dll is an internal client */ - if (check_symbol(filedata.cFileName, "jack_internal_initialize")) { - continue; + if (check_symbol(filedata.cFileName, "jack_internal_initialize", driver_dir) != NULL) { + continue; } - desc = jack_get_descriptor (drivers, filedata.cFileName, "driver_get_descriptor"); + desc = jack_get_descriptor (drivers, filedata.cFileName, "driver_get_descriptor", driver_dir); if (desc) { driver_list = jack_slist_append (driver_list, desc); } else { @@ -590,17 +530,21 @@ jack_drivers_load (JSList * drivers) { } while (FindNextFile(file, &filedata)); if (!driver_list) { - jack_error ("could not find any drivers in %s!", driver_dir); - return NULL; + jack_error ("Could not find any drivers in %s!", driver_dir); } +error: + if (driver_dir) { + free(driver_dir); + } + FindClose(file); return driver_list; } #else -JSList * -jack_drivers_load (JSList * drivers) { +JSList* jack_drivers_load (JSList * drivers) +{ struct dirent * dir_entry; DIR * dir_stream; const char* ptr; @@ -617,7 +561,7 @@ jack_drivers_load (JSList * drivers) { from the .so files in it */ dir_stream = opendir (driver_dir); if (!dir_stream) { - jack_error ("could not open driver directory %s: %s", + jack_error ("Could not open driver directory %s: %s", driver_dir, strerror (errno)); return NULL; } @@ -639,11 +583,11 @@ jack_drivers_load (JSList * drivers) { } /* check if dll is an internal client */ - if (check_symbol(dir_entry->d_name, "jack_internal_initialize")) { - continue; + if (check_symbol(dir_entry->d_name, "jack_internal_initialize", driver_dir) != NULL) { + continue; } - desc = jack_get_descriptor (drivers, dir_entry->d_name, "driver_get_descriptor"); + desc = jack_get_descriptor (drivers, dir_entry->d_name, "driver_get_descriptor", driver_dir); if (desc) { driver_list = jack_slist_append (driver_list, desc); } else { @@ -653,12 +597,12 @@ jack_drivers_load (JSList * drivers) { err = closedir (dir_stream); if (err) { - jack_error ("error closing driver directory %s: %s", + jack_error ("Error closing driver directory %s: %s", driver_dir, strerror (errno)); } if (!driver_list) { - jack_error ("could not find any drivers in %s!", driver_dir); + jack_error ("Could not find any drivers in %s!", driver_dir); return NULL; } @@ -669,40 +613,19 @@ jack_drivers_load (JSList * drivers) { #ifdef WIN32 -JSList * -jack_internals_load (JSList * internals) { - char* driver_dir; - char driver_dir_storage[512]; - char dll_filename[512]; +JSList* jack_internals_load(JSList * internals) +{ + ///char dll_filename[512]; WIN32_FIND_DATA filedata; HANDLE file; const char* ptr = NULL; JSList* driver_list = NULL; jack_driver_desc_t* desc; - if ((driver_dir = getenv("JACK_DRIVER_DIR")) == 0) { - // for WIN32 ADDON_DIR is defined in JackConstants.h as relative path - if (3 < GetModuleFileName(NULL, driver_dir_storage, 512)) { - char *p = strrchr(driver_dir_storage, '\\'); - if (p && (p != driver_dir_storage)) - *p = 0; - else - GetCurrentDirectory(512, driver_dir_storage); - } else { - GetCurrentDirectory(512, driver_dir_storage); - } - strcat(driver_dir_storage, "/"); - strcat(driver_dir_storage, ADDON_DIR); - driver_dir = driver_dir_storage; - } - - snprintf(dll_filename, sizeof(dll_filename), "%s/*.dll", driver_dir); - - file = (HANDLE )FindFirstFile(dll_filename, &filedata); - - if (file == INVALID_HANDLE_VALUE) { - jack_error("could not open driver directory %s", driver_dir); - return NULL; + char* driver_dir = locate_driver_dir(file, filedata); + if (!driver_dir) { + jack_error("Driver folder not found"); + goto error; } do { @@ -711,17 +634,18 @@ jack_internals_load (JSList * internals) { if (!ptr) { continue; } + ptr++; if (strncmp ("dll", ptr, 3) != 0) { continue; } /* check if dll is an internal client */ - if (!check_symbol(filedata.cFileName, "jack_internal_initialize")) { - continue; + if (check_symbol(filedata.cFileName, "jack_internal_initialize", driver_dir) == NULL) { + continue; } - desc = jack_get_descriptor (internals, filedata.cFileName, "jack_get_descriptor"); + desc = jack_get_descriptor (internals, filedata.cFileName, "jack_get_descriptor", driver_dir); if (desc) { driver_list = jack_slist_append (driver_list, desc); } else { @@ -731,17 +655,21 @@ jack_internals_load (JSList * internals) { } while (FindNextFile(file, &filedata)); if (!driver_list) { - jack_error ("could not find any internals in %s!", driver_dir); - return NULL; + jack_error ("Could not find any internals in %s!", driver_dir); } + error: + if (driver_dir) { + free(driver_dir); + } + FindClose(file); return driver_list; } #else -JSList * -jack_internals_load (JSList * internals) { +JSList* jack_internals_load(JSList * internals) +{ struct dirent * dir_entry; DIR * dir_stream; const char* ptr; @@ -758,7 +686,7 @@ jack_internals_load (JSList * internals) { from the .so files in it */ dir_stream = opendir (driver_dir); if (!dir_stream) { - jack_error ("could not open driver directory %s: %s\n", + jack_error ("Could not open driver directory %s: %s\n", driver_dir, strerror (errno)); return NULL; } @@ -769,17 +697,18 @@ jack_internals_load (JSList * internals) { if (!ptr) { continue; } + ptr++; if (strncmp ("so", ptr, 2) != 0) { continue; } /* check if dll is an internal client */ - if (!check_symbol(dir_entry->d_name, "jack_internal_initialize")) { - continue; + if (check_symbol(dir_entry->d_name, "jack_internal_initialize", driver_dir) == NULL) { + continue; } - desc = jack_get_descriptor (internals, dir_entry->d_name, "jack_get_descriptor"); + desc = jack_get_descriptor (internals, dir_entry->d_name, "jack_get_descriptor", driver_dir); if (desc) { driver_list = jack_slist_append (driver_list, desc); } else { @@ -789,12 +718,12 @@ jack_internals_load (JSList * internals) { err = closedir (dir_stream); if (err) { - jack_error ("error closing internal directory %s: %s\n", + jack_error ("Error closing internal directory %s: %s\n", driver_dir, strerror (errno)); } if (!driver_list) { - jack_error ("could not find any internals in %s!", driver_dir); + jack_error ("Could not find any internals in %s!", driver_dir); return NULL; } @@ -819,14 +748,14 @@ Jack::JackDriverClientInterface* JackDriverInfo::Open(jack_driver_desc_t* driver if (fHandle == NULL) { #ifdef WIN32 if ((errstr = GetLastError ()) != 0) { - jack_error ("can't load \"%s\": %ld", driver_desc->file, errstr); + jack_error ("Can't load \"%s\": %ld", driver_desc->file, errstr); #else if ((errstr = dlerror ()) != 0) { - jack_error ("can't load \"%s\": %s", driver_desc->file, errstr); + jack_error ("Can't load \"%s\": %s", driver_desc->file, errstr); #endif } else { - jack_error ("bizarre error loading driver shared object %s", driver_desc->file); + jack_error ("Error loading driver shared object %s", driver_desc->file); } return NULL; } @@ -838,7 +767,7 @@ Jack::JackDriverClientInterface* JackDriverInfo::Open(jack_driver_desc_t* driver #else if ((fInitialize == NULL) && (errstr = dlerror ()) != 0) { #endif - jack_error("no initialize function in shared object %s\n", driver_desc->file); + jack_error("No initialize function in shared object %s\n", driver_desc->file); return NULL; } @@ -849,13 +778,12 @@ Jack::JackDriverClientInterface* JackDriverInfo::Open(jack_driver_desc_t* driver JackDriverInfo::~JackDriverInfo() { delete fBackend; - if (fHandle) + if (fHandle) { UnloadDriverModule(fHandle); + } } -SERVER_EXPORT -jack_driver_desc_t* -jack_driver_descriptor_construct( +SERVER_EXPORT jack_driver_desc_t* jack_driver_descriptor_construct( const char * name, jack_driver_type_t type, const char * description, @@ -876,7 +804,7 @@ jack_driver_descriptor_construct( desc_ptr = (jack_driver_desc_t*)calloc (1, sizeof (jack_driver_desc_t)); if (desc_ptr == NULL) { - jack_error("calloc() failed to allocate memory for driver descriptor struct"); + jack_error("Error calloc() failed to allocate memory for driver descriptor struct"); return 0; } @@ -893,9 +821,7 @@ jack_driver_descriptor_construct( return desc_ptr; } -SERVER_EXPORT -int -jack_driver_descriptor_add_parameter( +SERVER_EXPORT int jack_driver_descriptor_add_parameter( jack_driver_desc_t* desc_ptr, jack_driver_desc_filler_t * filler_ptr, const char* name, @@ -933,7 +859,7 @@ jack_driver_descriptor_add_parameter( newsize = filler_ptr->size + 20; // most drivers have less than 20 parameters param_ptr = (jack_driver_param_desc_t*)realloc (desc_ptr->params, newsize * sizeof (jack_driver_param_desc_t)); if (param_ptr == NULL) { - jack_error("realloc() failed for parameter array of %zu elements", newsize); + jack_error("Error realloc() failed for parameter array of %zu elements", newsize); return false; } filler_ptr->size = newsize; @@ -952,6 +878,5 @@ jack_driver_descriptor_add_parameter( memcpy(param_ptr->long_desc, long_desc, long_desc_len + 1); desc_ptr->nparams++; - return true; } diff --git a/common/JackDriverLoader.h b/common/JackDriverLoader.h index dc8cc701..e7748565 100644 --- a/common/JackDriverLoader.h +++ b/common/JackDriverLoader.h @@ -24,53 +24,15 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "driver_interface.h" #include "JackControlAPI.h" #include "JackPlatformPlug.h" -#include "JackDriver.h" -#include "JackSystemDeps.h" - -typedef jack_driver_desc_t* (*JackDriverDescFunction) (); -typedef Jack::JackDriverClientInterface* (*driverInitialize) (Jack::JackLockedEngine*, Jack::JackSynchro*, const JSList*); - -class SERVER_EXPORT JackDriverInfo -{ - - private: - - driverInitialize fInitialize; - DRIVER_HANDLE fHandle; - Jack::JackDriverClientInterface* fBackend; - - public: - - JackDriverInfo():fInitialize(NULL),fHandle(NULL),fBackend(NULL) - {} - ~JackDriverInfo(); - - Jack::JackDriverClientInterface* Open(jack_driver_desc_t* driver_desc, Jack::JackLockedEngine*, Jack::JackSynchro*, const JSList*); - - Jack::JackDriverClientInterface* GetBackend() - { - return fBackend; - } - -}; jack_driver_desc_t* jack_find_driver_descriptor(JSList* drivers, const char* name); - JSList* jack_drivers_load(JSList* drivers); JSList* jack_internals_load(JSList* internals); +void jack_free_driver_params(JSList * param_ptr); +void jack_print_driver_options(jack_driver_desc_t* desc, FILE* file); -#ifdef __cplusplus -extern "C" -{ -#endif - -SERVER_EXPORT int jackctl_parse_driver_params(jackctl_driver * driver_ptr, int argc, char* argv[]); -SERVER_EXPORT void jack_free_driver_params(JSList * param_ptr); -SERVER_EXPORT void jack_print_driver_options(jack_driver_desc_t* desc, FILE* file); - -#ifdef __cplusplus -} -#endif +// External control.h API +extern "C" SERVER_EXPORT int jackctl_driver_params_parse(jackctl_driver * driver, int argc, char* argv[]); #endif diff --git a/common/JackEngine.cpp b/common/JackEngine.cpp index b7236803..32cc2990 100644 --- a/common/JackEngine.cpp +++ b/common/JackEngine.cpp @@ -38,13 +38,16 @@ namespace Jack JackEngine::JackEngine(JackGraphManager* manager, JackSynchro* table, - JackEngineControl* control) + JackEngineControl* control) + : JackLockAble(control->fServerName), + fSignal(control->fServerName) { fGraphManager = manager; fSynchroTable = table; fEngineControl = control; - for (int i = 0; i < CLIENT_NUM; i++) + for (int i = 0; i < CLIENT_NUM; i++) { fClientTable[i] = NULL; + } fLastSwitchUsecs = 0; fMaxUUID = 0; fSessionPendingReplies = 0; @@ -78,20 +81,33 @@ int JackEngine::Close() if (JackLoadableInternalClient* loadable_client = dynamic_cast(fClientTable[i])) { jack_log("JackEngine::Close loadable client = %s", loadable_client->GetClientControl()->fName); loadable_client->Close(); - // Close does not delete the pointer for internal clients fClientTable[i] = NULL; delete loadable_client; } else if (JackExternalClient* external_client = dynamic_cast(fClientTable[i])) { jack_log("JackEngine::Close external client = %s", external_client->GetClientControl()->fName); external_client->Close(); - // Close deletes the pointer for external clients fClientTable[i] = NULL; + delete external_client; } } return 0; } +void JackEngine::ShutDown() +{ + jack_log("JackEngine::ShutDown"); + + // Shutdown remaining clients (RT is stopped) + for (int i = fEngineControl->fDriverNum; i < CLIENT_NUM; i++) { + if (JackLoadableInternalClient* loadable_client = dynamic_cast(fClientTable[i])) { + jack_log("JackEngine::ShutDown loadable client = %s", loadable_client->GetClientControl()->fName); + loadable_client->ShutDown(); + } + } +} + + void JackEngine::NotifyQuit() { fChannel.NotifyQuit(); @@ -119,8 +135,9 @@ void JackEngine::ReleaseRefnum(int ref) if (fEngineControl->fTemporary) { int i; for (i = fEngineControl->fDriverNum; i < CLIENT_NUM; i++) { - if (fClientTable[i]) + if (fClientTable[i]) { break; + } } if (i == CLIENT_NUM) { // last client and temporay case: quit the server @@ -146,8 +163,9 @@ void JackEngine::ProcessNext(jack_time_t cur_cycle_begin) void JackEngine::ProcessCurrent(jack_time_t cur_cycle_begin) { - if (cur_cycle_begin < fLastSwitchUsecs + 2 * fEngineControl->fPeriodUsecs) // Signal XRun only for the first failing cycle + if (cur_cycle_begin < fLastSwitchUsecs + 2 * fEngineControl->fPeriodUsecs) { // Signal XRun only for the first failing cycle CheckXRun(cur_cycle_begin); + } fGraphManager->RunCurrentGraph(); } @@ -157,7 +175,7 @@ bool JackEngine::Process(jack_time_t cur_cycle_begin, jack_time_t prev_cycle_end // Cycle begin fEngineControl->CycleBegin(fClientTable, fGraphManager, cur_cycle_begin, prev_cycle_end); - + // Graph if (fGraphManager->IsFinishedGraph()) { ProcessNext(cur_cycle_begin); @@ -236,26 +254,42 @@ int JackEngine::ComputeTotalLatencies() // Notifications //--------------- +int JackEngine::ClientNotify(JackClientInterface* client, int refnum, const char* name, int notify, int sync, const char* message, int value1, int value2) +{ + if (!client) { + return 0; + } + + if (!client->GetClientControl()->fCallback[notify]) { + jack_log("JackEngine::ClientNotify: no callback for notification = %ld", notify); + return 0; + } + + int ret; + + // External client + if (dynamic_cast(client)) { + ret = client->ClientNotify(refnum, name, notify, sync, message, value1, value2); + // Important for internal client : unlock before calling the notification callbacks + } else { + bool res = Unlock(); + ret = client->ClientNotify(refnum, name, notify, sync, message, value1, value2); + if (res) { + Lock(); + } + } + + if (ret < 0) { + jack_error("NotifyClient fails name = %s notification = %ld val1 = %ld val2 = %ld", name, notify, value1, value2); + } + return ret; +} + void JackEngine::NotifyClient(int refnum, int event, int sync, const char* message, int value1, int value2) { JackClientInterface* client = fClientTable[refnum]; - - // The client may be notified by the RT thread while closing if (client) { - - if (client->GetClientControl()->fCallback[event]) { - /* - Important for internal clients : unlock before calling the notification callbacks. - */ - bool res = Unlock(); - if (client->ClientNotify(refnum, client->GetClientControl()->fName, event, sync, message, value1, value2) < 0) - jack_error("NotifyClient fails name = %s event = %ld val1 = %ld val2 = %ld", client->GetClientControl()->fName, event, value1, value2); - if (res) - Lock(); - - } else { - jack_log("JackEngine::NotifyClient: no callback for event = %ld", event); - } + ClientNotify(client, refnum, client->GetClientControl()->fName, event, sync, message, value1, value2); } } @@ -266,19 +300,21 @@ void JackEngine::NotifyClients(int event, int sync, const char* message, int val } } -int JackEngine::NotifyAddClient(JackClientInterface* new_client, const char* name, int refnum) +int JackEngine::NotifyAddClient(JackClientInterface* new_client, const char* new_name, int refnum) { - jack_log("JackEngine::NotifyAddClient: name = %s", name); + jack_log("JackEngine::NotifyAddClient: name = %s", new_name); + // Notify existing clients of the new client and new client of existing clients. for (int i = 0; i < CLIENT_NUM; i++) { JackClientInterface* old_client = fClientTable[i]; if (old_client && old_client != new_client) { - if (old_client->ClientNotify(refnum, name, kAddClient, false, "", 0, 0) < 0) { - jack_error("NotifyAddClient old_client fails name = %s", old_client->GetClientControl()->fName); + char* old_name = old_client->GetClientControl()->fName; + if (ClientNotify(old_client, refnum, new_name, kAddClient, false, "", 0, 0) < 0) { + jack_error("NotifyAddClient old_client fails name = %s", old_name); // Not considered as a failure... } - if (new_client->ClientNotify(i, old_client->GetClientControl()->fName, kAddClient, true, "", 0, 0) < 0) { - jack_error("NotifyAddClient new_client fails name = %s", name); + if (ClientNotify(new_client, i, old_name, kAddClient, true, "", 0, 0) < 0) { + jack_error("NotifyAddClient new_client fails name = %s", new_name); return -1; } } @@ -291,10 +327,7 @@ void JackEngine::NotifyRemoveClient(const char* name, int refnum) { // Notify existing clients (including the one beeing suppressed) of the removed client for (int i = 0; i < CLIENT_NUM; i++) { - JackClientInterface* client = fClientTable[i]; - if (client) { - client->ClientNotify(refnum, name, kRemoveClient, false, "", 0, 0); - } + ClientNotify(fClientTable[i], refnum, name, kRemoveClient, false, "", 0, 0); } } @@ -491,13 +524,15 @@ bool JackEngine::ClientCheckName(const char* name) { for (int i = 0; i < CLIENT_NUM; i++) { JackClientInterface* client = fClientTable[i]; - if (client && (strcmp(client->GetClientControl()->fName, name) == 0)) + if (client && (strcmp(client->GetClientControl()->fName, name) == 0)) { return true; + } } for (std::map::iterator i = fReservationMap.begin(); i != fReservationMap.end(); i++) { - if (i->second == name) + if (i->second == name) { return true; + } } return false; @@ -510,8 +545,9 @@ int JackEngine::GetNewUUID() void JackEngine::EnsureUUID(int uuid) { - if (uuid > fMaxUUID) - fMaxUUID = uuid+1; + if (uuid > fMaxUUID) { + fMaxUUID = uuid + 1; + } for (int i = 0; i < CLIENT_NUM; i++) { JackClientInterface* client = fClientTable[i]; @@ -525,8 +561,9 @@ int JackEngine::GetClientPID(const char* name) { for (int i = 0; i < CLIENT_NUM; i++) { JackClientInterface* client = fClientTable[i]; - if (client && (strcmp(client->GetClientControl()->fName, name) == 0)) + if (client && (strcmp(client->GetClientControl()->fName, name) == 0)) { return client->GetClientControl()->fPID; + } } return 0; @@ -536,8 +573,9 @@ int JackEngine::GetClientRefNum(const char* name) { for (int i = 0; i < CLIENT_NUM; i++) { JackClientInterface* client = fClientTable[i]; - if (client && (strcmp(client->GetClientControl()->fName, name) == 0)) + if (client && (strcmp(client->GetClientControl()->fName, name) == 0)) { return client->GetClientControl()->fRefNum; + } } return -1; @@ -657,9 +695,9 @@ error: // Used for external clients int JackEngine::ClientExternalClose(int refnum) { + jack_log("JackEngine::ClientExternalClose ref = %ld", refnum); JackClientInterface* client = fClientTable[refnum]; - fEngineControl->fTransport.ResetTimebase(refnum); - int res = ClientCloseAux(refnum, client, true); + int res = ClientCloseAux(refnum, true); client->Close(); delete client; return res; @@ -668,13 +706,16 @@ int JackEngine::ClientExternalClose(int refnum) // Used for server internal clients or drivers when the RT thread is stopped int JackEngine::ClientInternalClose(int refnum, bool wait) { - JackClientInterface* client = fClientTable[refnum]; - return ClientCloseAux(refnum, client, wait); + jack_log("JackEngine::ClientInternalClose ref = %ld", refnum); + return ClientCloseAux(refnum, wait); } -int JackEngine::ClientCloseAux(int refnum, JackClientInterface* client, bool wait) +int JackEngine::ClientCloseAux(int refnum, bool wait) { jack_log("JackEngine::ClientCloseAux ref = %ld", refnum); + + JackClientInterface* client = fClientTable[refnum]; + fEngineControl->fTransport.ResetTimebase(refnum); // Unregister all ports ==> notifications are sent jack_int_t ports[PORT_NUM_FOR_CLIENT]; @@ -717,8 +758,9 @@ int JackEngine::ClientActivate(int refnum, bool is_real_time) JackClientInterface* client = fClientTable[refnum]; jack_log("JackEngine::ClientActivate ref = %ld name = %s", refnum, client->GetClientControl()->fName); - if (is_real_time) + if (is_real_time) { fGraphManager->Activate(refnum); + } // Wait for graph state change to be effective if (!fSignal.LockedTimedWait(fEngineControl->fTimeOutUsecs * 10)) { @@ -802,8 +844,9 @@ int JackEngine::PortRegister(int refnum, const char* name, const char *type, uns // buffer_size is actually ignored... *port_index = fGraphManager->AllocatePort(refnum, name, type, (JackPortFlags)flags, fEngineControl->fBufferSize); if (*port_index != NO_PORT) { - if (client->GetClientControl()->fActive) + if (client->GetClientControl()->fActive) { NotifyPortRegistation(*port_index, true); + } return 0; } else { return -1; @@ -819,8 +862,9 @@ int JackEngine::PortUnRegister(int refnum, jack_port_id_t port_index) PortDisconnect(refnum, port_index, ALL_PORTS); if (fGraphManager->ReleasePort(refnum, port_index) == 0) { - if (client->GetClientControl()->fActive) + if (client->GetClientControl()->fActive) { NotifyPortRegistation(port_index, false); + } return 0; } else { return -1; @@ -843,8 +887,9 @@ int JackEngine::PortConnect(int refnum, jack_port_id_t src, jack_port_id_t dst) JackClientInterface* client; int ref; - if (fGraphManager->CheckPorts(src, dst) < 0) + if (fGraphManager->CheckPorts(src, dst) < 0) { return -1; + } ref = fGraphManager->GetOutputRefNum(src); assert(ref >= 0); @@ -867,8 +912,9 @@ int JackEngine::PortConnect(int refnum, jack_port_id_t src, jack_port_id_t dst) } int res = fGraphManager->Connect(src, dst); - if (res == 0) + if (res == 0) { NotifyPortConnect(src, dst, true); + } return res; } @@ -932,7 +978,7 @@ int JackEngine::PortRename(int refnum, jack_port_id_t port, const char* name) // Session management //-------------------- -void JackEngine::SessionNotify(int refnum, const char *target, jack_session_event_type_t type, const char *path, JackChannelTransaction *socket, JackSessionNotifyResult** result) +void JackEngine::SessionNotify(int refnum, const char *target, jack_session_event_type_t type, const char *path, detail::JackChannelTransactionInterface *socket, JackSessionNotifyResult** result) { if (fSessionPendingReplies != 0) { JackSessionNotifyResult res(-1); @@ -967,8 +1013,9 @@ void JackEngine::SessionNotify(int refnum, const char *target, jack_session_even snprintf(path_buf, sizeof(path_buf), "%s%s%c", path, client->GetClientControl()->fName, DIR_SEPARATOR); int res = JackTools::MkDir(path_buf); - if (res) + if (res) { jack_error("JackEngine::SessionNotify: can not create session directory '%s'", path_buf); + } int result = client->ClientNotify(i, client->GetClientControl()->fName, kSessionCallback, true, path_buf, (int)type, 0); @@ -1000,7 +1047,7 @@ void JackEngine::SessionNotify(int refnum, const char *target, jack_session_even } } -void JackEngine::SessionReply(int refnum) +int JackEngine::SessionReply(int refnum) { JackClientInterface* client = fClientTable[refnum]; char uuid_buf[JACK_UUID_SIZE]; @@ -1013,78 +1060,78 @@ void JackEngine::SessionReply(int refnum) if (fSessionPendingReplies == 0) { fSessionResult->Write(fSessionTransaction); - if (fSessionTransaction != NULL) - { + if (fSessionTransaction != NULL) { delete fSessionResult; } fSessionResult = NULL; } + + return 0; } -void JackEngine::GetUUIDForClientName(const char *client_name, char *uuid_res, int *result) +int JackEngine::GetUUIDForClientName(const char *client_name, char *uuid_res) { for (int i = 0; i < CLIENT_NUM; i++) { JackClientInterface* client = fClientTable[i]; if (client && (strcmp(client_name, client->GetClientControl()->fName) == 0)) { snprintf(uuid_res, JACK_UUID_SIZE, "%d", client->GetClientControl()->fSessionID); - *result = 0; - return; + return 0; } } // Did not find name. - *result = -1; + return -1; } -void JackEngine::GetClientNameForUUID(const char *uuid, char *name_res, int *result) +int JackEngine::GetClientNameForUUID(const char *uuid, char *name_res) { for (int i = 0; i < CLIENT_NUM; i++) { JackClientInterface* client = fClientTable[i]; - if (!client) + if (!client) { continue; + } char uuid_buf[JACK_UUID_SIZE]; snprintf(uuid_buf, JACK_UUID_SIZE, "%d", client->GetClientControl()->fSessionID); if (strcmp(uuid,uuid_buf) == 0) { strncpy(name_res, client->GetClientControl()->fName, JACK_CLIENT_NAME_SIZE); - *result = 0; - return; + return 0; } } // Did not find uuid. - *result = -1; + return -1; } -void JackEngine::ReserveClientName(const char *name, const char *uuid, int *result) +int JackEngine::ReserveClientName(const char *name, const char *uuid) { jack_log("JackEngine::ReserveClientName ( name = %s, uuid = %s )", name, uuid); if (ClientCheckName(name)) { - *result = -1; jack_log("name already taken"); - return; + return -1; } EnsureUUID(atoi(uuid)); fReservationMap[atoi(uuid)] = name; - *result = 0; + return 0; } -void JackEngine::ClientHasSessionCallback(const char *name, int *result) +int JackEngine::ClientHasSessionCallback(const char *name) { JackClientInterface* client = NULL; for (int i = 0; i < CLIENT_NUM; i++) { client = fClientTable[i]; - if (client && (strcmp(client->GetClientControl()->fName, name) == 0)) + if (client && (strcmp(client->GetClientControl()->fName, name) == 0)) { break; + } } if (client) { - *result = client->GetClientControl()->fCallback[kSessionCallback]; + return client->GetClientControl()->fCallback[kSessionCallback]; } else { - *result = -1; + return -1; } } diff --git a/common/JackEngine.h b/common/JackEngine.h index ca38089e..ebd3eb1b 100644 --- a/common/JackEngine.h +++ b/common/JackEngine.h @@ -26,6 +26,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "JackMutex.h" #include "JackTransportEngine.h" #include "JackPlatformPlug.h" +#include "JackRequest.h" +#include "JackChannel.h" #include namespace Jack @@ -54,15 +56,15 @@ class SERVER_EXPORT JackEngine : public JackLockAble jack_time_t fLastSwitchUsecs; int fSessionPendingReplies; - JackChannelTransaction* fSessionTransaction; + detail::JackChannelTransactionInterface* fSessionTransaction; JackSessionNotifyResult* fSessionResult; std::map fReservationMap; int fMaxUUID; - int ClientCloseAux(int refnum, JackClientInterface* client, bool wait); + int ClientCloseAux(int refnum, bool wait); void CheckXRun(jack_time_t callback_usecs); - int NotifyAddClient(JackClientInterface* new_client, const char* name, int refnum); + int NotifyAddClient(JackClientInterface* new_client, const char* new_name, int refnum); void NotifyRemoveClient(const char* name, int refnum); void ProcessNext(jack_time_t callback_usecs); @@ -74,6 +76,8 @@ class SERVER_EXPORT JackEngine : public JackLockAble int AllocateRefnum(); void ReleaseRefnum(int ref); + int ClientNotify(JackClientInterface* client, int refnum, const char* name, int notify, int sync, const char* message, int value1, int value2); + void NotifyClient(int refnum, int event, int sync, const char* message, int value1, int value2); void NotifyClients(int event, int sync, const char* message, int value1, int value2); @@ -97,6 +101,8 @@ class SERVER_EXPORT JackEngine : public JackLockAble int Open(); int Close(); + + void ShutDown(); // Client management int ClientCheck(const char* name, int uuid, char* name_res, int protocol, int options, int* status); @@ -145,13 +151,13 @@ class SERVER_EXPORT JackEngine : public JackLockAble void NotifyQuit(); // Session management - void SessionNotify(int refnum, const char *target, jack_session_event_type_t type, const char *path, JackChannelTransaction *socket, JackSessionNotifyResult** result); - void SessionReply(int refnum); + void SessionNotify(int refnum, const char *target, jack_session_event_type_t type, const char *path, detail::JackChannelTransactionInterface *socket, JackSessionNotifyResult** result); + int SessionReply(int refnum); - void GetUUIDForClientName(const char *client_name, char *uuid_res, int *result); - void GetClientNameForUUID(const char *uuid, char *name_res, int *result); - void ReserveClientName(const char *name, const char *uuid, int *result); - void ClientHasSessionCallback(const char *name, int *result); + int GetUUIDForClientName(const char *client_name, char *uuid_res); + int GetClientNameForUUID(const char *uuid, char *name_res); + int ReserveClientName(const char *name, const char *uuid); + int ClientHasSessionCallback(const char *name); }; diff --git a/common/JackEngineControl.cpp b/common/JackEngineControl.cpp index 4af6f68d..f757cd88 100644 --- a/common/JackEngineControl.cpp +++ b/common/JackEngineControl.cpp @@ -97,10 +97,11 @@ void JackEngineControl::ResetRollingUsecs() void JackEngineControl::NotifyXRun(jack_time_t callback_usecs, float delayed_usecs) { - ResetFrameTime(callback_usecs); + ResetFrameTime(callback_usecs); fXrunDelayedUsecs = delayed_usecs; - if (delayed_usecs > fMaxDelayedUsecs) + if (delayed_usecs > fMaxDelayedUsecs) { fMaxDelayedUsecs = delayed_usecs; + } } } // end of namespace diff --git a/common/JackEngineControl.h b/common/JackEngineControl.h index 7e168708..f6d32f44 100644 --- a/common/JackEngineControl.h +++ b/common/JackEngineControl.h @@ -124,6 +124,14 @@ struct SERVER_EXPORT JackEngineControl : public JackShmMem ~JackEngineControl() {} + + void UpdateTimeOut() + { + fPeriodUsecs = jack_time_t(1000000.f / fSampleRate * fBufferSize); // In microsec + if (!(fTimeOut && fTimeOutUsecs > 2 * fPeriodUsecs)) { + fTimeOutUsecs = 2 * fPeriodUsecs; + } + } // Cycle void CycleIncTime(jack_time_t callback_usecs) @@ -154,7 +162,7 @@ struct SERVER_EXPORT JackEngineControl : public JackShmMem void ResetFrameTime(jack_time_t callback_usecs) { - fFrameTimer.ResetFrameTime(fSampleRate, callback_usecs, fPeriodUsecs); + fFrameTimer.ResetFrameTime(callback_usecs); } void ReadFrameTime(JackTimer* timer) diff --git a/common/JackError.cpp b/common/JackError.cpp index d78f95e5..6b386f5b 100644 --- a/common/JackError.cpp +++ b/common/JackError.cpp @@ -2,21 +2,21 @@ Copyright (C) 2001 Paul Davis Copyright (C) 2004-2008 Grame Copyright (C) 2008 Nedko Arnaudov - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - + You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - + */ #include @@ -29,7 +29,7 @@ using namespace Jack; static bool change_thread_log_function(jack_log_function_t log_function) { - return (jack_tls_get(JackGlobals::fKeyLogFunction) == NULL + return (jack_tls_get(JackGlobals::fKeyLogFunction) == NULL && jack_tls_set(JackGlobals::fKeyLogFunction, (void*)log_function)); } diff --git a/common/JackError.h b/common/JackError.h index 3e9d890a..abb596f7 100644 --- a/common/JackError.h +++ b/common/JackError.h @@ -31,14 +31,8 @@ extern "C" { #endif -#define LOG_LEVEL_INFO 1 -#define LOG_LEVEL_ERROR 2 - SERVER_EXPORT void jack_error(const char *fmt, ...); - SERVER_EXPORT void jack_info(const char *fmt, ...); - - // like jack_info() but only if verbose mode is enabled SERVER_EXPORT void jack_log(const char *fmt, ...); SERVER_EXPORT extern void (*jack_error_callback)(const char *desc); @@ -47,14 +41,16 @@ extern "C" SERVER_EXPORT extern void default_jack_error_callback(const char *desc); SERVER_EXPORT extern void default_jack_info_callback(const char *desc); - SERVER_EXPORT extern void silent_jack_error_callback(const char *desc); - SERVER_EXPORT extern void silent_jack_info_callback(const char *desc); + SERVER_EXPORT void silent_jack_error_callback(const char *desc); + SERVER_EXPORT void silent_jack_info_callback(const char *desc); - typedef void (* jack_log_function_t)(int level, const char *message); + SERVER_EXPORT int set_threaded_log_function(); - void jack_log_function(int level, const char *message); + #define LOG_LEVEL_INFO 1 + #define LOG_LEVEL_ERROR 2 - SERVER_EXPORT int set_threaded_log_function(); + void jack_log_function(int level, const char *message); + typedef void (* jack_log_function_t)(int level, const char *message); #ifdef __cplusplus } diff --git a/common/JackException.cpp b/common/JackException.cpp new file mode 100644 index 00000000..53eebdb4 --- /dev/null +++ b/common/JackException.cpp @@ -0,0 +1,34 @@ +/* +Copyright (C) 2008 Grame + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "JackException.h" +#include "JackError.h" + +namespace Jack +{ + + void JackException::PrintMessage() + { + std::string str = what(); + if (str != "") { + jack_info(str.c_str()); + } + } + +} diff --git a/common/JackException.h b/common/JackException.h index 8e873e9e..ac8d81ce 100644 --- a/common/JackException.h +++ b/common/JackException.h @@ -20,10 +20,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #ifndef __JackException__ #define __JackException__ +#include "JackCompilerDeps.h" + #include #include #include -#include "JackError.h" namespace Jack { @@ -55,14 +56,9 @@ class SERVER_EXPORT JackException : public std::runtime_error { return what(); } - void PrintMessage() - { - std::string str = what(); - if (str != "") { - jack_info(str.c_str()); - } - } -}; + void PrintMessage(); + + }; /*! \brief Exception thrown by JackEngine in temporary mode. diff --git a/common/JackFrameTimer.cpp b/common/JackFrameTimer.cpp index 180de970..56cbb6ec 100644 --- a/common/JackFrameTimer.cpp +++ b/common/JackFrameTimer.cpp @@ -43,14 +43,26 @@ JackTimer::JackTimer() fCurrentWakeup = 0; fCurrentCallback = 0; fNextWakeUp = 0; - fFilterCoefficient = 0.01f; - fSecondOrderIntegrator = 0.0f; + fPeriodUsecs = 0.0f; + fFilterOmega = 0.0f; /* Initialised later */ } -jack_nframes_t JackTimer::Time2Frames(jack_time_t time, jack_nframes_t buffer_size) +jack_nframes_t JackTimer::Time2Frames(jack_time_t usecs, jack_nframes_t buffer_size) { if (fInitialized) { - return fFrames + (long)rint(((double) ((long long)(time - fCurrentWakeup)) / ((long long)(fNextWakeUp - fCurrentWakeup))) * buffer_size); + /* + Make sure we have signed differences. It would make a lot of sense + to use the standard signed intNN_t types everywhere instead of e.g. + jack_nframes_t and jack_time_t. This would at least ensure that the + types used below are the correct ones. There is no way to get a type + that would be 'a signed version of jack_time_t' for example - the + types below are inherently fragile and there is no automatic way to + check they are the correct ones. The only way is to check manually + against jack/types.h. FA - 16/02/2012 + */ + int64_t du = usecs - fCurrentWakeup; + int64_t dp = fNextWakeUp - fCurrentWakeup; + return fFrames + (int32_t)rint((double)du / (double)dp * buffer_size); } else { return 0; } @@ -59,12 +71,37 @@ jack_nframes_t JackTimer::Time2Frames(jack_time_t time, jack_nframes_t buffer_si jack_time_t JackTimer::Frames2Time(jack_nframes_t frames, jack_nframes_t buffer_size) { if (fInitialized) { - return fCurrentWakeup + (long)rint(((double) ((long long)(frames - fFrames)) * ((long long)(fNextWakeUp - fCurrentWakeup))) / buffer_size); + /* + Make sure we have signed differences. It would make a lot of sense + to use the standard signed intNN_t types everywhere instead of e.g. + jack_nframes_t and jack_time_t. This would at least ensure that the + types used below are the correct ones. There is no way to get a type + that would be 'a signed version of jack_time_t' for example - the + types below are inherently fragile and there is no automatic way to + check they are the correct ones. The only way is to check manually + against jack/types.h. FA - 16/02/2012 + */ + int32_t df = frames - fFrames; + int64_t dp = fNextWakeUp - fCurrentWakeup; + return fCurrentWakeup + (int64_t)rint((double) df * (double) dp / buffer_size); } else { return 0; } } +int JackTimer::GetCycleTimes(jack_nframes_t* current_frames, jack_time_t* current_usecs, jack_time_t* next_usecs, float* period_usecs) +{ + if (fInitialized) { + *current_frames = fFrames; + *current_usecs = fCurrentWakeup; + *next_usecs = fNextWakeUp; + *period_usecs = fPeriodUsecs; + return 0; + } else { + return -1; + } +} + jack_nframes_t JackTimer::FramesSinceCycleStart(jack_time_t cur_time, jack_nframes_t frames_rate) { return (jack_nframes_t) floor((((float)frames_rate) / 1000000.0f) * (cur_time - fCurrentCallback)); @@ -80,20 +117,17 @@ void JackFrameTimer::IncFrameTime(jack_nframes_t buffer_size, jack_time_t callba if (fFirstWakeUp) { InitFrameTimeAux(callback_usecs, period_usecs); fFirstWakeUp = false; - } else { - IncFrameTimeAux(buffer_size, callback_usecs, period_usecs); } + + IncFrameTimeAux(buffer_size, callback_usecs, period_usecs); } -void JackFrameTimer::ResetFrameTime(jack_nframes_t frames_rate, jack_time_t callback_usecs, jack_time_t period_usecs) +void JackFrameTimer::ResetFrameTime(jack_time_t callback_usecs) { if (!fFirstWakeUp) { // ResetFrameTime may be called by a xrun/delayed wakeup on the first cycle JackTimer* timer = WriteNextStateStart(); - jack_nframes_t period_size_guess = (jack_nframes_t)(frames_rate * ((timer->fNextWakeUp - timer->fCurrentWakeup) / 1000000.0)); - timer->fFrames += ((callback_usecs - timer->fNextWakeUp) / period_size_guess) * period_size_guess; timer->fCurrentWakeup = callback_usecs; timer->fCurrentCallback = callback_usecs; - timer->fNextWakeUp = callback_usecs + period_usecs; WriteNextStateStop(); TrySwitchState(); // always succeed since there is only one writer } @@ -119,10 +153,44 @@ void JackFrameTimer::ReadFrameTime(JackTimer* timer) void JackFrameTimer::InitFrameTimeAux(jack_time_t callback_usecs, jack_time_t period_usecs) { + /* the first wakeup or post-freewheeling or post-xrun */ + + /* There seems to be no significant difference between + the two conditions OR-ed above. Incrementing the + frame_time after an xrun shouldn't harm, as there + will be a discontinuity anyway. So the two are + combined in this version. + FA 16/03/2012 + */ + /* Since the DLL *will* be run, next_wakeup should be the + current wakeup time *without* adding the period time, as + if it were computed in the previous period. + FA 16/03/2012 + */ + /* Added initialisation of timer->period_usecs, required + due to the modified implementation of the DLL itself. + OTOH, this should maybe not be repeated after e.g. + freewheeling or an xrun, as the current value would be + more accurate than the nominal one. But it doesn't really + harm either. Implementing this would require a new flag + in the engine structure, to be used after freewheeling + or an xrun instead of first_wakeup. I don't know if this + can be done without breaking compatibility, so I did not + add this + FA 13/02/2012 + */ + /* Added initialisation of timer->filter_omega. This makes + the DLL bandwidth independent of the actual period time. + The bandwidth is now 1/8 Hz in all cases. The value of + timer->filter_omega is 2 * pi * BW * Tperiod. + FA 13/02/2012 + */ + JackTimer* timer = WriteNextStateStart(); - timer->fSecondOrderIntegrator = 0.0f; + timer->fPeriodUsecs = (float)period_usecs; timer->fCurrentCallback = callback_usecs; - timer->fNextWakeUp = callback_usecs + period_usecs; + timer->fNextWakeUp = callback_usecs; + timer->fFilterOmega = period_usecs * 7.854e-7f; WriteNextStateStop(); TrySwitchState(); // always succeed since there is only one writer } @@ -130,13 +198,38 @@ void JackFrameTimer::InitFrameTimeAux(jack_time_t callback_usecs, jack_time_t pe void JackFrameTimer::IncFrameTimeAux(jack_nframes_t buffer_size, jack_time_t callback_usecs, jack_time_t period_usecs) { JackTimer* timer = WriteNextStateStart(); - float delta = (int64_t)callback_usecs - (int64_t)timer->fNextWakeUp; + + /* Modified implementation (the actual result is the same). + + 'fSecondOrderIntegrator' is renamed to 'fPeriodUsecs' + and now represents the DLL's best estimate of the + period time in microseconds (before it was a scaled + version of the difference w.r.t. the nominal value). + This allows this value to be made available to clients + that are interested in it (see jack_get_cycle_times). + This change also means that 'fPeriodUsecs' must be + initialised to the nominal period time instead of zero. + This is done in the first cycle in jack_run_cycle(). + + 'fFilterCoefficient' is renamed to 'fFilterOmega'. It + is now equal to the 'omega' value as defined in the + 'Using a DLL to filter time' paper (before it was a + scaled version of this value). It is computed once in + jack_run_cycle() rather than set to a fixed value. This + makes the DLL bandwidth independent of the period time. + + FA 13/02/2012 + */ + + float delta = (float)((int64_t)callback_usecs - (int64_t)timer->fNextWakeUp); + delta *= timer->fFilterOmega; timer->fCurrentWakeup = timer->fNextWakeUp; timer->fCurrentCallback = callback_usecs; timer->fFrames += buffer_size; - timer->fSecondOrderIntegrator += 0.5f * timer->fFilterCoefficient * delta; - timer->fNextWakeUp = timer->fCurrentWakeup + period_usecs + (int64_t) floorf((timer->fFilterCoefficient * (delta + timer->fSecondOrderIntegrator))); + timer->fPeriodUsecs += timer->fFilterOmega * delta; + timer->fNextWakeUp += (int64_t)floorf(timer->fPeriodUsecs + 1.41f * delta + 0.5f); timer->fInitialized = true; + WriteNextStateStop(); TrySwitchState(); // always succeed since there is only one writer } diff --git a/common/JackFrameTimer.h b/common/JackFrameTimer.h index 3ab3e153..a32e7423 100644 --- a/common/JackFrameTimer.h +++ b/common/JackFrameTimer.h @@ -44,8 +44,8 @@ class SERVER_EXPORT JackTimer jack_time_t fCurrentWakeup; jack_time_t fCurrentCallback; jack_time_t fNextWakeUp; - float fSecondOrderIntegrator; - float fFilterCoefficient; /* set once, never altered */ + float fPeriodUsecs; + float fFilterOmega; /* set once, never altered */ bool fInitialized; public: @@ -57,6 +57,7 @@ class SERVER_EXPORT JackTimer jack_nframes_t Time2Frames(jack_time_t time, jack_nframes_t buffer_size); jack_time_t Frames2Time(jack_nframes_t frames, jack_nframes_t buffer_size); jack_nframes_t FramesSinceCycleStart(jack_time_t cur_time, jack_nframes_t frames_rate); + int GetCycleTimes(jack_nframes_t* current_frames, jack_time_t* current_usecs, jack_time_t* next_usecs, float* period_usecs); jack_nframes_t CurFrame() { @@ -92,7 +93,7 @@ class SERVER_EXPORT JackFrameTimer : public JackAtomicState {} void InitFrameTime(); - void ResetFrameTime(jack_nframes_t frames_rate, jack_time_t callback_usecs, jack_time_t period_usecs); + void ResetFrameTime(jack_time_t callback_usecs); void IncFrameTime(jack_nframes_t buffer_size, jack_time_t callback_usecs, jack_time_t period_usecs); void ReadFrameTime(JackTimer* timer); diff --git a/common/JackFreewheelDriver.cpp b/common/JackFreewheelDriver.cpp index 2bfb1d15..d0234f3b 100644 --- a/common/JackFreewheelDriver.cpp +++ b/common/JackFreewheelDriver.cpp @@ -37,7 +37,8 @@ int JackFreewheelDriver::Process() if (fEngine->Process(fBeginDateUst, fEndDateUst)) { - if (ResumeRefNum()) { // Signal all clients + // Resume connected clients in the graph + if (ResumeRefNum()) { jack_error("JackFreewheelDriver::Process: ResumeRefNum error"); res = -1; } @@ -61,6 +62,7 @@ int JackFreewheelDriver::Process() int JackFreewheelDriver::ProcessReadSync() { + // Resume connected clients in the graph if (ResumeRefNum() < 0) { // Signal all clients jack_error("JackFreewheelDriver::ProcessReadSync: ResumeRefNum error"); return -1; @@ -80,6 +82,7 @@ int JackFreewheelDriver::ProcessWriteSync() int JackFreewheelDriver::ProcessReadAsync() { + // Resume connected clients in the graph if (ResumeRefNum() < 0) { // Signal all clients jack_error("JackFreewheelDriver::ProcessReadAsync: ResumeRefNum error"); return -1; diff --git a/common/JackGenericClientChannel.cpp b/common/JackGenericClientChannel.cpp new file mode 100644 index 00000000..2cf2a26c --- /dev/null +++ b/common/JackGenericClientChannel.cpp @@ -0,0 +1,298 @@ +/* +Copyright (C) 2004-2008 Grame + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#include "JackGenericClientChannel.h" +#include "JackClient.h" +#include "JackGlobals.h" +#include "JackError.h" + +namespace Jack +{ + +JackGenericClientChannel::JackGenericClientChannel() +{} + +JackGenericClientChannel::~JackGenericClientChannel() +{} + +int JackGenericClientChannel::ServerCheck(const char* server_name) +{ + jack_log("JackGenericClientChannel::ServerCheck = %s", server_name); + + // Connect to server + if (fRequest->Connect(jack_server_dir, server_name, 0) < 0) { + jack_error("Cannot connect to server request channel"); + return -1; + } else { + return 0; + } +} + +void JackGenericClientChannel::ServerSyncCall(JackRequest* req, JackResult* res, int* result) +{ + // Check call context + if (jack_tls_get(JackGlobals::fNotificationThread)) { + jack_error("Cannot callback the server in notification thread!"); + *result = -1; + return; + } + + if (req->Write(fRequest) < 0) { + jack_error("Could not write request type = %ld", req->fType); + *result = -1; + return; + } + + if (res->Read(fRequest) < 0) { + jack_error("Could not read result type = %ld", req->fType); + *result = -1; + return; + } + + *result = res->fResult; +} + +void JackGenericClientChannel::ServerAsyncCall(JackRequest* req, JackResult* res, int* result) +{ + // Check call context + if (jack_tls_get(JackGlobals::fNotificationThread)) { + jack_error("Cannot callback the server in notification thread!"); + *result = -1; + return; + } + + if (req->Write(fRequest) < 0) { + jack_error("Could not write request type = %ld", req->fType); + *result = -1; + } else { + *result = 0; + } +} + +void JackGenericClientChannel::ClientCheck(const char* name, int uuid, char* name_res, int protocol, int options, int* status, int* result, int open) +{ + JackClientCheckRequest req(name, protocol, options, uuid, open); + JackClientCheckResult res; + ServerSyncCall(&req, &res, result); + *status = res.fStatus; + strcpy(name_res, res.fName); +} + +void JackGenericClientChannel::ClientOpen(const char* name, int pid, int uuid, int* shared_engine, int* shared_client, int* shared_graph, int* result) +{ + JackClientOpenRequest req(name, pid, uuid); + JackClientOpenResult res; + ServerSyncCall(&req, &res, result); + *shared_engine = res.fSharedEngine; + *shared_client = res.fSharedClient; + *shared_graph = res.fSharedGraph; +} + +void JackGenericClientChannel::ClientClose(int refnum, int* result) +{ + JackClientCloseRequest req(refnum); + JackResult res; + ServerSyncCall(&req, &res, result); +} + +void JackGenericClientChannel::ClientActivate(int refnum, int is_real_time, int* result) +{ + JackActivateRequest req(refnum, is_real_time); + JackResult res; + ServerSyncCall(&req, &res, result); +} + +void JackGenericClientChannel::ClientDeactivate(int refnum, int* result) +{ + JackDeactivateRequest req(refnum); + JackResult res; + ServerSyncCall(&req, &res, result); +} + +void JackGenericClientChannel::PortRegister(int refnum, const char* name, const char* type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result) +{ + JackPortRegisterRequest req(refnum, name, type, flags, buffer_size); + JackPortRegisterResult res; + ServerSyncCall(&req, &res, result); + *port_index = res.fPortIndex; +} + +void JackGenericClientChannel::PortUnRegister(int refnum, jack_port_id_t port_index, int* result) +{ + JackPortUnRegisterRequest req(refnum, port_index); + JackResult res; + ServerSyncCall(&req, &res, result); +} + +void JackGenericClientChannel::PortConnect(int refnum, const char* src, const char* dst, int* result) +{ + JackPortConnectNameRequest req(refnum, src, dst); + JackResult res; + ServerSyncCall(&req, &res, result); +} + +void JackGenericClientChannel::PortDisconnect(int refnum, const char* src, const char* dst, int* result) +{ + JackPortDisconnectNameRequest req(refnum, src, dst); + JackResult res; + ServerSyncCall(&req, &res, result); +} + +void JackGenericClientChannel::PortConnect(int refnum, jack_port_id_t src, jack_port_id_t dst, int* result) +{ + JackPortConnectRequest req(refnum, src, dst); + JackResult res; + ServerSyncCall(&req, &res, result); +} + +void JackGenericClientChannel::PortDisconnect(int refnum, jack_port_id_t src, jack_port_id_t dst, int* result) +{ + JackPortDisconnectRequest req(refnum, src, dst); + JackResult res; + ServerSyncCall(&req, &res, result); +} + +void JackGenericClientChannel::PortRename(int refnum, jack_port_id_t port, const char* name, int* result) +{ + JackPortRenameRequest req(refnum, port, name); + JackResult res; + ServerSyncCall(&req, &res, result); +} + +void JackGenericClientChannel::SetBufferSize(jack_nframes_t buffer_size, int* result) +{ + JackSetBufferSizeRequest req(buffer_size); + JackResult res; + ServerSyncCall(&req, &res, result); +} + +void JackGenericClientChannel::SetFreewheel(int onoff, int* result) +{ + JackSetFreeWheelRequest req(onoff); + JackResult res; + ServerSyncCall(&req, &res, result); +} + +void JackGenericClientChannel::ComputeTotalLatencies(int* result) +{ + JackComputeTotalLatenciesRequest req; + JackResult res; + ServerSyncCall(&req, &res, result); +} + +void JackGenericClientChannel::SessionNotify(int refnum, const char* target, jack_session_event_type_t type, const char* path, jack_session_command_t** result) +{ + JackSessionNotifyRequest req(refnum, path, type, target); + JackSessionNotifyResult res; + int intresult; + ServerSyncCall(&req, &res, &intresult); + *result = res.GetCommands(); +} + +void JackGenericClientChannel::SessionReply(int refnum, int* result) +{ + JackSessionReplyRequest req(refnum); + JackResult res; + ServerSyncCall(&req, &res, result); +} + +void JackGenericClientChannel::GetUUIDForClientName(int refnum, const char* client_name, char* uuid_res, int* result) +{ + JackGetUUIDRequest req(client_name); + JackUUIDResult res; + ServerSyncCall(&req, &res, result); + strncpy(uuid_res, res.fUUID, JACK_UUID_SIZE); +} + +void JackGenericClientChannel::GetClientNameForUUID(int refnum, const char* uuid, char* name_res, int* result) +{ + JackGetClientNameRequest req(uuid); + JackClientNameResult res; + ServerSyncCall(&req, &res, result); + strncpy(name_res, res.fName, JACK_CLIENT_NAME_SIZE); +} + +void JackGenericClientChannel::ClientHasSessionCallback(const char* client_name, int* result) +{ + JackClientHasSessionCallbackRequest req(client_name); + JackResult res; + ServerSyncCall(&req, &res, result); +} + +void JackGenericClientChannel::ReserveClientName(int refnum, const char* client_name, const char* uuid, int* result) +{ + JackReserveNameRequest req(refnum, client_name, uuid); + JackResult res; + ServerSyncCall(&req, &res, result); +} + +void JackGenericClientChannel::ReleaseTimebase(int refnum, int* result) +{ + JackReleaseTimebaseRequest req(refnum); + JackResult res; + ServerSyncCall(&req, &res, result); +} + +void JackGenericClientChannel::SetTimebaseCallback(int refnum, int conditional, int* result) +{ + JackSetTimebaseCallbackRequest req(refnum, conditional); + JackResult res; + ServerSyncCall(&req, &res, result); +} + +void JackGenericClientChannel::GetInternalClientName(int refnum, int int_ref, char* name_res, int* result) +{ + JackGetInternalClientNameRequest req(refnum, int_ref); + JackGetInternalClientNameResult res; + ServerSyncCall(&req, &res, result); + strcpy(name_res, res.fName); +} + +void JackGenericClientChannel::InternalClientHandle(int refnum, const char* client_name, int* status, int* int_ref, int* result) +{ + JackInternalClientHandleRequest req(refnum, client_name); + JackInternalClientHandleResult res; + ServerSyncCall(&req, &res, result); + *int_ref = res.fIntRefNum; + *status = res.fStatus; +} + +void JackGenericClientChannel::InternalClientLoad(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int* status, int* int_ref, int uuid, int* result) +{ + JackInternalClientLoadRequest req(refnum, client_name, so_name, objet_data, options, uuid); + JackInternalClientLoadResult res; + ServerSyncCall(&req, &res, result); + *int_ref = res.fIntRefNum; + *status = res.fStatus; +} + +void JackGenericClientChannel::InternalClientUnload(int refnum, int int_ref, int* status, int* result) +{ + JackInternalClientUnloadRequest req(refnum, int_ref); + JackInternalClientUnloadResult res; + ServerSyncCall(&req, &res, result); + *status = res.fStatus; +} + +} // end of namespace + + + + + diff --git a/common/JackGenericClientChannel.h b/common/JackGenericClientChannel.h new file mode 100644 index 00000000..e866feeb --- /dev/null +++ b/common/JackGenericClientChannel.h @@ -0,0 +1,103 @@ +/* +Copyright (C) 2004-2008 Grame + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifndef __JackGenericClientChannel__ +#define __JackGenericClientChannel__ + +#include "JackChannel.h" + +namespace Jack +{ + +struct JackRequest; +struct JackResult; + +/*! +\brief Generic JackClientChannel class. +*/ + +class JackGenericClientChannel : public detail::JackClientChannelInterface +{ + + protected: + + detail::JackClientRequestInterface* fRequest; + + void ServerSyncCall(JackRequest* req, JackResult* res, int* result); + void ServerAsyncCall(JackRequest* req, JackResult* res, int* result); + + public: + + JackGenericClientChannel(); + virtual ~JackGenericClientChannel(); + + virtual int Open(const char* server_name, const char* name, int uuid, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status) { return -1; } + virtual void Close() {} + + virtual int Start() { return -1; } + virtual void Stop() {} + + int ServerCheck(const char* server_name); + + void ClientCheck(const char* name, int uuid, char* name_res, int protocol, int options, int* status, int* result, int open); + void ClientOpen(const char* name, int pid, int uuid, int* shared_engine, int* shared_client, int* shared_graph, int* result); + void ClientOpen(const char* name, int* ref, int uuid, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, int* result) + {} + void ClientClose(int refnum, int* result); + + void ClientActivate(int refnum, int is_real_time, int* result); + void ClientDeactivate(int refnum, int* result); + + void PortRegister(int refnum, const char* name, const char* type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result); + void PortUnRegister(int refnum, jack_port_id_t port_index, int* result); + + void PortConnect(int refnum, const char* src, const char* dst, int* result); + void PortDisconnect(int refnum, const char* src, const char* dst, int* result); + + void PortConnect(int refnum, jack_port_id_t src, jack_port_id_t dst, int* result); + void PortDisconnect(int refnum, jack_port_id_t src, jack_port_id_t dst, int* result); + + void PortRename(int refnum, jack_port_id_t port, const char* name, int* result); + + void SetBufferSize(jack_nframes_t buffer_size, int* result); + void SetFreewheel(int onoff, int* result); + + void ComputeTotalLatencies(int* result); + + void ReleaseTimebase(int refnum, int* result); + void SetTimebaseCallback(int refnum, int conditional, int* result); + + void GetInternalClientName(int refnum, int int_ref, char* name_res, int* result); + void InternalClientHandle(int refnum, const char* client_name, int* status, int* int_ref, int* result); + void InternalClientLoad(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int* status, int* int_ref, int uuid, int* result); + void InternalClientUnload(int refnum, int int_ref, int* status, int* result); + + // Session API + void SessionNotify(int refnum, const char* target, jack_session_event_type_t type, const char* path, jack_session_command_t** result); + void SessionReply(int refnum, int* result); + void GetUUIDForClientName(int refnum, const char* client_name, char* uuid_res, int* result); + void GetClientNameForUUID(int refnum, const char* uuid, char* name_res, int* result); + void ReserveClientName(int refnum, const char* client_name, const char *uuid, int* result); + void ClientHasSessionCallback(const char* client_name, int* result); +}; + +} // end of namespace + +#endif + diff --git a/common/JackGlobals.cpp b/common/JackGlobals.cpp index 5bd3b52a..b3f8eee7 100644 --- a/common/JackGlobals.cpp +++ b/common/JackGlobals.cpp @@ -24,8 +24,11 @@ namespace Jack bool JackGlobals::fVerbose = 0; -jack_tls_key JackGlobals::fRealTime; -static bool gKeyRealtimeInitialized = jack_tls_allocate_key(&JackGlobals::fRealTime); +jack_tls_key JackGlobals::fRealTimeThread; +static bool gKeyRealtimeThreadInitialized = jack_tls_allocate_key(&JackGlobals::fRealTimeThread); + +jack_tls_key JackGlobals::fNotificationThread; +static bool gKeyNotificationThreadInitialized = jack_tls_allocate_key(&JackGlobals::fNotificationThread); jack_tls_key JackGlobals::fKeyLogFunction; static bool fKeyLogFunctionInitialized = jack_tls_allocate_key(&JackGlobals::fKeyLogFunction); @@ -39,6 +42,7 @@ jack_thread_creator_t JackGlobals::fJackThreadCreator = pthread_create; #endif #ifdef __CLIENTDEBUG__ + std::ofstream* JackGlobals::fStream = NULL; void JackGlobals::CheckContext(const char* name) @@ -59,6 +63,12 @@ void JackGlobals::CheckContext(const char* name) } (*fStream) << "JACK API call : " << name << ", calling thread : " << pthread_self() << std::endl; } + +#else + +void JackGlobals::CheckContext(const char* name) +{} + #endif } // end of namespace diff --git a/common/JackGlobals.h b/common/JackGlobals.h index 6f215e7d..3c87c6ba 100644 --- a/common/JackGlobals.h +++ b/common/JackGlobals.h @@ -37,7 +37,8 @@ namespace Jack // Globals used for client management on server or library side. struct JackGlobals { - static jack_tls_key fRealTime; + static jack_tls_key fRealTimeThread; + static jack_tls_key fNotificationThread; static jack_tls_key fKeyLogFunction; static JackMutex* fOpenMutex; static volatile bool fServerRunning; @@ -49,8 +50,8 @@ struct JackGlobals { #ifdef __CLIENTDEBUG__ static std::ofstream* fStream; - static void CheckContext(const char* name); #endif + static void CheckContext(const char* name); }; // Each "side" server and client will implement this to get the shared graph manager, engine control and inter-process synchro table. diff --git a/common/JackGraphManager.cpp b/common/JackGraphManager.cpp index 16688e4b..f89acf17 100644 --- a/common/JackGraphManager.cpp +++ b/common/JackGraphManager.cpp @@ -344,7 +344,7 @@ void JackGraphManager::RecalculateLatency(jack_port_id_t port_index, jack_latenc next_index = GetCurrentIndex(); } while (cur_index != next_index); // Until a coherent state has been read - jack_log("JackGraphManager::RecalculateLatency port_index = %ld", port_index); + //jack_log("JackGraphManager::RecalculateLatency port_index = %ld", port_index); } // Server diff --git a/common/JackInternalClient.cpp b/common/JackInternalClient.cpp index 12d0c671..5b7060c9 100644 --- a/common/JackInternalClient.cpp +++ b/common/JackInternalClient.cpp @@ -27,7 +27,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "JackServer.h" #include "JackEngineControl.h" #include "JackClientControl.h" + #include "JackInternalClientChannel.h" +#include "JackGenericClientChannel.h" + #include "JackTools.h" #include @@ -98,11 +101,16 @@ int JackInternalClient::Open(const char* server_name, const char* name, int uuid return 0; error: - fChannel->Stop(); fChannel->Close(); return -1; } +void JackInternalClient::ShutDown() +{ + jack_log("JackInternalClient::ShutDown"); + JackClient::ShutDown(); +} + JackGraphManager* JackInternalClient::GetGraphManager() const { assert(fGraphManager); @@ -193,10 +201,12 @@ JackLoadableInternalClient2::JackLoadableInternalClient2(JackServer* server, Jac JackLoadableInternalClient::~JackLoadableInternalClient() { - if (fFinish != NULL) + if (fFinish != NULL) { fFinish(fProcessArg); - if (fHandle != NULL) + } + if (fHandle != NULL) { UnloadJackModule(fHandle); + } } int JackLoadableInternalClient1::Open(const char* server_name, const char* name, int uuid, jack_options_t options, jack_status_t* status) diff --git a/common/JackInternalClient.h b/common/JackInternalClient.h index 19885c8b..e47066cf 100644 --- a/common/JackInternalClient.h +++ b/common/JackInternalClient.h @@ -47,6 +47,7 @@ class JackInternalClient : public JackClient virtual ~JackInternalClient(); int Open(const char* server_name, const char* name, int uuid, jack_options_t options, jack_status_t* status); + void ShutDown(); JackGraphManager* GetGraphManager() const; JackEngineControl* GetEngineControl() const; @@ -63,7 +64,6 @@ class JackInternalClient : public JackClient typedef int (*InitializeCallback)(jack_client_t*, const char*); typedef int (*InternalInitializeCallback)(jack_client_t*, const JSList* params); typedef void (*FinishCallback)(void *); -typedef jack_driver_desc_t * (*JackDriverDescFunction) (); class JackLoadableInternalClient : public JackInternalClient { @@ -92,7 +92,7 @@ class JackLoadableInternalClient1 : public JackLoadableInternalClient InitializeCallback fInitialize; char fObjectData[JACK_LOAD_INIT_LIMIT]; - + public: JackLoadableInternalClient1(JackServer* server, JackSynchro* table, const char* object_data); @@ -111,7 +111,7 @@ class JackLoadableInternalClient2 : public JackLoadableInternalClient InternalInitializeCallback fInitialize; const JSList* fParameters; - + public: JackLoadableInternalClient2(JackServer* server, JackSynchro* table, const JSList* parameters); diff --git a/common/JackInternalClientChannel.h b/common/JackInternalClientChannel.h index e2ead4b7..ce0084c4 100644 --- a/common/JackInternalClientChannel.h +++ b/common/JackInternalClientChannel.h @@ -44,12 +44,6 @@ class JackInternalClientChannel : public detail::JackClientChannelInterface virtual ~JackInternalClientChannel() {} - // Open the Server/Client connection - virtual int Open(const char* name, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status) - { - return 0; - } - void ClientCheck(const char* name, int uuid, char* name_res, int protocol, int options, int* status, int* result, int open) { *result = fEngine->ClientCheck(name, uuid, name_res, protocol, options, status); @@ -148,8 +142,7 @@ class JackInternalClientChannel : public detail::JackClientChannelInterface { JackSessionNotifyResult* res; fEngine->SessionNotify(refnum, target, type, path, NULL, &res); - if (res == NULL) - { + if (res == NULL) { *result = NULL; return; } @@ -160,28 +153,27 @@ class JackInternalClientChannel : public detail::JackClientChannelInterface void SessionReply(int refnum, int* result) { - fEngine->SessionReply(refnum); - *result = 0; + *result = fEngine->SessionReply(refnum); } void GetUUIDForClientName(int refnum, const char* client_name, char* uuid_res, int* result) { - fEngine->GetUUIDForClientName(client_name, uuid_res, result); + *result = fEngine->GetUUIDForClientName(client_name, uuid_res); } void GetClientNameForUUID(int refnum, const char* uuid, char* name_res, int* result) { - fEngine->GetClientNameForUUID(uuid, name_res, result); + *result = fEngine->GetClientNameForUUID(uuid, name_res); } void ReserveClientName(int refnum, const char* client_name, const char *uuid, int* result) { - fEngine->ReserveClientName(client_name, uuid, result); + *result = fEngine->ReserveClientName(client_name, uuid); } void ClientHasSessionCallback(const char* client_name, int* result) { - fEngine->ClientHasSessionCallback(client_name, result); + *result = fEngine->ClientHasSessionCallback(client_name); } diff --git a/common/JackLibAPI.cpp b/common/JackLibAPI.cpp index 1b2fa589..83e8dc6a 100644 --- a/common/JackLibAPI.cpp +++ b/common/JackLibAPI.cpp @@ -166,9 +166,8 @@ static jack_client_t* jack_client_open_aux(const char* client_name, jack_options LIB_EXPORT jack_client_t* jack_client_open(const char* ext_client_name, jack_options_t options, jack_status_t* status, ...) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_client_open"); -#endif + try { assert(JackGlobals::fOpenMutex); JackGlobals::fOpenMutex->Lock(); @@ -189,9 +188,8 @@ LIB_EXPORT jack_client_t* jack_client_open(const char* ext_client_name, jack_opt LIB_EXPORT int jack_client_close(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_client_close"); -#endif + assert(JackGlobals::fOpenMutex); JackGlobals::fOpenMutex->Lock(); int res = -1; diff --git a/common/JackLibClient.cpp b/common/JackLibClient.cpp index 4ba58c9c..72b05642 100644 --- a/common/JackLibClient.cpp +++ b/common/JackLibClient.cpp @@ -55,6 +55,20 @@ JackSynchro* GetSynchroTable() // Client management //------------------- +/* +ShutDown is called: +- from the RT thread when Execute method fails +- possibly from a "closed" notification channel +(Not needed since the synch object used (Sema of Fifo will fails when server quits... see ShutDown)) +*/ + +void JackLibClient::ShutDown() +{ + jack_log("JackLibClient::ShutDown"); + JackGlobals::fServerRunning = false; + JackClient::ShutDown(); +} + JackLibClient::JackLibClient(JackSynchro* table): JackClient(table) { jack_log("JackLibClient::JackLibClient table = %x", table); diff --git a/common/JackLibClient.h b/common/JackLibClient.h index 000c9aa6..5e78b6f8 100644 --- a/common/JackLibClient.h +++ b/common/JackLibClient.h @@ -32,7 +32,7 @@ namespace Jack \brief Client on the library side. */ -class LIB_EXPORT JackLibClient : public JackClient +class JackLibClient : public JackClient { private: @@ -45,6 +45,7 @@ class LIB_EXPORT JackLibClient : public JackClient virtual ~JackLibClient(); int Open(const char* server_name, const char* name, int uuid, jack_options_t options, jack_status_t* status); + void ShutDown(); int ClientNotifyImp(int refnum, const char* name, int notify, int sync, const char* message, int value1, int value2); diff --git a/common/JackLibGlobals.h b/common/JackLibGlobals.h index be36cb47..6d77e469 100644 --- a/common/JackLibGlobals.h +++ b/common/JackLibGlobals.h @@ -50,7 +50,7 @@ class JackClient; \brief Global library static structure: singleton kind of pattern. */ -struct LIB_EXPORT JackLibGlobals +struct JackLibGlobals { JackShmReadWritePtr fGraphManager; /*! Shared memory Port manager */ JackShmReadWritePtr fEngineControl; /*! Shared engine control */ // transport engine has to be writable @@ -63,7 +63,9 @@ struct LIB_EXPORT JackLibGlobals JackLibGlobals() { jack_log("JackLibGlobals"); - JackMessageBuffer::Create(); + if (!JackMessageBuffer::Create()) { + jack_error("Cannot create message buffer"); + } fGraphManager = -1; fEngineControl = -1; @@ -127,6 +129,7 @@ struct LIB_EXPORT JackLibGlobals { if (--fClientCount == 0 && fGlobals) { jack_log("JackLibGlobals Destroy %x", fGlobals); + EndTime(); delete fGlobals; fGlobals = NULL; } diff --git a/common/JackLibSampleRateResampler.cpp b/common/JackLibSampleRateResampler.cpp index 27e36b5e..c23958af 100644 --- a/common/JackLibSampleRateResampler.cpp +++ b/common/JackLibSampleRateResampler.cpp @@ -18,6 +18,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "JackLibSampleRateResampler.h" +#include "JackError.h" namespace Jack { diff --git a/common/JackLockedEngine.h b/common/JackLockedEngine.h index bdb71ed0..99f1e359 100644 --- a/common/JackLockedEngine.h +++ b/common/JackLockedEngine.h @@ -103,6 +103,14 @@ class SERVER_EXPORT JackLockedEngine return fEngine.Close(); CATCH_EXCEPTION_RETURN } + + void ShutDown() + { + // No lock needed + TRY_CALL + fEngine.ShutDown(); + CATCH_EXCEPTION + } // Client management int ClientCheck(const char* name, int uuid, char* name_res, int protocol, int options, int* status) @@ -325,7 +333,7 @@ class SERVER_EXPORT JackLockedEngine CATCH_EXCEPTION } - void SessionNotify(int refnum, const char* target, jack_session_event_type_t type, const char *path, JackChannelTransaction *socket, JackSessionNotifyResult** result) + void SessionNotify(int refnum, const char* target, jack_session_event_type_t type, const char *path, detail::JackChannelTransactionInterface *socket, JackSessionNotifyResult** result) { TRY_CALL JackLock lock(&fEngine); @@ -333,42 +341,42 @@ class SERVER_EXPORT JackLockedEngine CATCH_EXCEPTION } - void SessionReply(int refnum) + int SessionReply(int refnum) { TRY_CALL JackLock lock(&fEngine); - fEngine.SessionReply(refnum); - CATCH_EXCEPTION + return fEngine.SessionReply(refnum); + CATCH_EXCEPTION_RETURN } - void GetUUIDForClientName(const char *client_name, char *uuid_res, int *result) + int GetUUIDForClientName(const char *client_name, char *uuid_res) { TRY_CALL JackLock lock(&fEngine); - fEngine.GetUUIDForClientName(client_name, uuid_res, result); - CATCH_EXCEPTION + return fEngine.GetUUIDForClientName(client_name, uuid_res); + CATCH_EXCEPTION_RETURN } - void GetClientNameForUUID(const char *uuid, char *name_res, int *result) + int GetClientNameForUUID(const char *uuid, char *name_res) { TRY_CALL JackLock lock(&fEngine); - fEngine.GetClientNameForUUID(uuid, name_res, result); - CATCH_EXCEPTION + return fEngine.GetClientNameForUUID(uuid, name_res); + CATCH_EXCEPTION_RETURN } - void ReserveClientName(const char *name, const char *uuid, int *result) + int ReserveClientName(const char *name, const char *uuid) { TRY_CALL JackLock lock(&fEngine); - fEngine.ReserveClientName(name, uuid, result); - CATCH_EXCEPTION + return fEngine.ReserveClientName(name, uuid); + CATCH_EXCEPTION_RETURN } - void ClientHasSessionCallback(const char *name, int *result) + int ClientHasSessionCallback(const char *name) { TRY_CALL JackLock lock(&fEngine); - fEngine.ClientHasSessionCallback(name, result); - CATCH_EXCEPTION + return fEngine.ClientHasSessionCallback(name); + CATCH_EXCEPTION_RETURN } }; diff --git a/common/JackLoopbackDriver.cpp b/common/JackLoopbackDriver.cpp index d24ba2db..ef449b03 100644 --- a/common/JackLoopbackDriver.cpp +++ b/common/JackLoopbackDriver.cpp @@ -41,6 +41,7 @@ int JackLoopbackDriver::ProcessReadSync() memcpy(GetInputBuffer(i), GetOutputBuffer(i), sizeof(jack_default_audio_sample_t) * fEngineControl->fBufferSize); } + // Resume connected clients in the graph if (ResumeRefNum() < 0) { jack_error("JackLoopbackDriver::ProcessReadSync - ResumeRefNum error"); res = -1; @@ -51,6 +52,7 @@ int JackLoopbackDriver::ProcessReadSync() int JackLoopbackDriver::ProcessWriteSync() { + // Suspend on connected clients in the graph if (SuspendRefNum() < 0) { jack_error("JackLoopbackDriver::ProcessWriteSync SuspendRefNum error"); return -1; @@ -67,6 +69,7 @@ int JackLoopbackDriver::ProcessReadAsync() memcpy(GetInputBuffer(i), GetOutputBuffer(i), sizeof(jack_default_audio_sample_t) * fEngineControl->fBufferSize); } + // Resume connected clients in the graph if (ResumeRefNum() < 0) { jack_error("JackLoopbackDriver::ProcessReadAsync - ResumeRefNum error"); res = -1; diff --git a/common/JackMessageBuffer.cpp b/common/JackMessageBuffer.cpp index 20fbb630..934442bb 100644 --- a/common/JackMessageBuffer.cpp +++ b/common/JackMessageBuffer.cpp @@ -22,6 +22,7 @@ #include "JackMessageBuffer.h" #include "JackGlobals.h" #include "JackError.h" +#include "JackTime.h" namespace Jack { @@ -29,19 +30,32 @@ namespace Jack JackMessageBuffer* JackMessageBuffer::fInstance = NULL; JackMessageBuffer::JackMessageBuffer() - :fInit(NULL),fInitArg(NULL),fThread(this),fInBuffer(0),fOutBuffer(0),fOverruns(0),fRunning(false) + :fInit(NULL), + fInitArg(NULL), + fThread(this), + fGuard(), + fInBuffer(0), + fOutBuffer(0), + fOverruns(0), + fRunning(false) {} JackMessageBuffer::~JackMessageBuffer() {} -void JackMessageBuffer::Start() +bool JackMessageBuffer::Start() { + // Before StartSync()... fRunning = true; - fThread.StartSync(); + if (fThread.StartSync() == 0) { + return true; + } else { + fRunning = false; + return false; + } } -void JackMessageBuffer::Stop() +bool JackMessageBuffer::Stop() { if (fOverruns > 0) { jack_error("WARNING: %d message buffer overruns!", fOverruns); @@ -59,6 +73,7 @@ void JackMessageBuffer::Stop() } Flush(); + return true; } void JackMessageBuffer::Flush() @@ -96,7 +111,7 @@ bool JackMessageBuffer::Execute() /* and we're done */ fGuard.Signal(); } - + /* releasing the mutex reduces contention */ fGuard.Unlock(); Flush(); @@ -110,20 +125,30 @@ bool JackMessageBuffer::Execute() return false; } -void JackMessageBuffer::Create() +bool JackMessageBuffer::Create() { if (fInstance == NULL) { fInstance = new JackMessageBuffer(); - fInstance->Start(); + if (!fInstance->Start()) { + jack_error("JackMessageBuffer::Create cannot start thread"); + delete fInstance; + fInstance = NULL; + return false; + } } + + return true; } -void JackMessageBuffer::Destroy() +bool JackMessageBuffer::Destroy() { if (fInstance != NULL) { fInstance->Stop(); delete fInstance; fInstance = NULL; + return true; + } else { + return false; } } @@ -137,21 +162,42 @@ void JackMessageBufferAdd(int level, const char *message) } } -void JackMessageBuffer::SetInitCallback(JackThreadInitCallback callback, void *arg) +int JackMessageBuffer::SetInitCallback(JackThreadInitCallback callback, void *arg) { - if (fGuard.Lock()) { + if (fInstance && callback && fRunning && fGuard.Lock()) { /* set up the callback */ fInitArg = arg; fInit = callback; - /* wake msg buffer thread */ + + #ifndef WIN32 + // wake msg buffer thread fGuard.Signal(); - /* wait for it to be done */ + // wait for it to be done fGuard.Wait(); - /* and we're done */ + // and we're done fGuard.Unlock(); - } else { - jack_error("JackMessageBuffer::SetInitCallback lock cannot be taken"); + #else + /* + The condition variable emulation code does not work reliably on Windows (lost signal). + So use a "hackish" way to signal/wait for the result. + Probaly better in the long term : use pthread-win32 (http://sourceware.org/pthreads-win32/` + */ + fGuard.Unlock(); + int count = 0; + while (fInit && ++count < 1000) { + /* wake msg buffer thread */ + fGuard.Signal(); + JackSleep(1000); + } + if (count == 1000) goto error; + #endif + + return 0; } + +error: + jack_error("JackMessageBuffer::SetInitCallback : callback cannot be executed"); + return -1; } }; diff --git a/common/JackMessageBuffer.h b/common/JackMessageBuffer.h index c64797e2..fc0d7177 100644 --- a/common/JackMessageBuffer.h +++ b/common/JackMessageBuffer.h @@ -57,7 +57,7 @@ class JackMessageBuffer : public JackRunnableInterface private: - JackThreadInitCallback fInit; + volatile JackThreadInitCallback fInit; void* fInitArg; JackMessage fBuffers[MB_BUFFERS]; JackThread fThread; @@ -69,8 +69,8 @@ class JackMessageBuffer : public JackRunnableInterface void Flush(); - void Start(); - void Stop(); + bool Start(); + bool Stop(); public: @@ -80,11 +80,11 @@ class JackMessageBuffer : public JackRunnableInterface // JackRunnableInterface interface bool Execute(); - void static Create(); - void static Destroy(); + bool static Create(); + bool static Destroy(); void AddMessage(int level, const char *message); - void SetInitCallback(JackThreadInitCallback callback, void *arg); + int SetInitCallback(JackThreadInitCallback callback, void *arg); static JackMessageBuffer* fInstance; }; diff --git a/common/JackMidiBufferReadQueue.cpp b/common/JackMidiBufferReadQueue.cpp index c53e596c..67d79b1f 100644 --- a/common/JackMidiBufferReadQueue.cpp +++ b/common/JackMidiBufferReadQueue.cpp @@ -19,6 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "JackMidiBufferReadQueue.h" #include "JackMidiUtil.h" +#include "JackError.h" using Jack::JackMidiBufferReadQueue; diff --git a/common/JackMidiBufferWriteQueue.cpp b/common/JackMidiBufferWriteQueue.cpp index 7e6ae67f..82788155 100644 --- a/common/JackMidiBufferWriteQueue.cpp +++ b/common/JackMidiBufferWriteQueue.cpp @@ -19,6 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "JackMidiBufferWriteQueue.h" #include "JackMidiUtil.h" +#include "JackError.h" using Jack::JackMidiBufferWriteQueue; diff --git a/common/JackMidiDriver.cpp b/common/JackMidiDriver.cpp index de5f295d..a9abfb98 100644 --- a/common/JackMidiDriver.cpp +++ b/common/JackMidiDriver.cpp @@ -136,6 +136,8 @@ int JackMidiDriver::SetBufferSize(jack_nframes_t buffer_size) int JackMidiDriver::ProcessReadSync() { int res = 0; + + jack_log("JackMidiDriver::ProcessReadSync"); // Read input buffers for the current cycle if (Read() < 0) { @@ -154,6 +156,8 @@ int JackMidiDriver::ProcessReadSync() int JackMidiDriver::ProcessWriteSync() { int res = 0; + + jack_log("JackMidiDriver::ProcessWriteSync"); if (SuspendRefNum() < 0) { jack_error("JackMidiDriver::ProcessWriteSync: SuspendRefNum error"); @@ -172,6 +176,8 @@ int JackMidiDriver::ProcessWriteSync() int JackMidiDriver::ProcessReadAsync() { int res = 0; + + jack_log("JackMidiDriver::ProcessReadAsync"); // Read input buffers for the current cycle if (Read() < 0) { @@ -195,6 +201,7 @@ int JackMidiDriver::ProcessReadAsync() int JackMidiDriver::ProcessWriteAsync() { + jack_log("JackMidiDriver::ProcessWriteAsync"); return 0; } diff --git a/common/JackMidiRawInputWriteQueue.cpp b/common/JackMidiRawInputWriteQueue.cpp index 63bc79b4..5c76f8b4 100644 --- a/common/JackMidiRawInputWriteQueue.cpp +++ b/common/JackMidiRawInputWriteQueue.cpp @@ -22,6 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "JackMidiRawInputWriteQueue.h" +#include "JackError.h" using Jack::JackMidiRawInputWriteQueue; diff --git a/common/JackMutex.h b/common/JackMutex.h index 2bdea991..20f82fd8 100644 --- a/common/JackMutex.h +++ b/common/JackMutex.h @@ -40,7 +40,8 @@ class JackLockAble JackMutex fMutex; - JackLockAble() + JackLockAble(const char* name = NULL) + :fMutex(name) {} ~JackLockAble() {} diff --git a/common/JackNetAPI.cpp b/common/JackNetAPI.cpp index 42f06137..cf670d7a 100644 --- a/common/JackNetAPI.cpp +++ b/common/JackNetAPI.cpp @@ -19,9 +19,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include + #include "JackNetInterface.h" -#include "JackError.h" -#include "JackException.h" #include "JackAudioAdapterInterface.h" #ifdef __cplusplus @@ -86,41 +85,48 @@ extern "C" typedef int (*JackNetSlaveSampleRateCallback) (jack_nframes_t nframes, void *arg); typedef void (*JackNetSlaveShutdownCallback) (void* data); - SERVER_EXPORT jack_net_slave_t* jack_net_slave_open(const char* ip, int port, const char* name, jack_slave_t* request, jack_master_t* result); - SERVER_EXPORT int jack_net_slave_close(jack_net_slave_t* net); + LIB_EXPORT jack_net_slave_t* jack_net_slave_open(const char* ip, int port, const char* name, jack_slave_t* request, jack_master_t* result); + LIB_EXPORT int jack_net_slave_close(jack_net_slave_t* net); - SERVER_EXPORT int jack_net_slave_activate(jack_net_slave_t* net); - SERVER_EXPORT int jack_net_slave_deactivate(jack_net_slave_t* net); + LIB_EXPORT int jack_net_slave_activate(jack_net_slave_t* net); + LIB_EXPORT int jack_net_slave_deactivate(jack_net_slave_t* net); - SERVER_EXPORT int jack_set_net_slave_process_callback(jack_net_slave_t* net, JackNetSlaveProcessCallback net_callback, void *arg); - SERVER_EXPORT int jack_set_net_slave_buffer_size_callback(jack_net_slave_t* net, JackNetSlaveBufferSizeCallback bufsize_callback, void *arg); - SERVER_EXPORT int jack_set_net_slave_sample_rate_callback(jack_net_slave_t* net, JackNetSlaveSampleRateCallback samplerate_callback, void *arg); - SERVER_EXPORT int jack_set_net_slave_shutdown_callback(jack_net_slave_t* net, JackNetSlaveShutdownCallback shutdown_callback, void *arg); + LIB_EXPORT int jack_set_net_slave_process_callback(jack_net_slave_t* net, JackNetSlaveProcessCallback net_callback, void *arg); + LIB_EXPORT int jack_set_net_slave_buffer_size_callback(jack_net_slave_t* net, JackNetSlaveBufferSizeCallback bufsize_callback, void *arg); + LIB_EXPORT int jack_set_net_slave_sample_rate_callback(jack_net_slave_t* net, JackNetSlaveSampleRateCallback samplerate_callback, void *arg); + LIB_EXPORT int jack_set_net_slave_shutdown_callback(jack_net_slave_t* net, JackNetSlaveShutdownCallback shutdown_callback, void *arg); // NetJack master API typedef struct _jack_net_master jack_net_master_t; - SERVER_EXPORT jack_net_master_t* jack_net_master_open(const char* ip, int port, const char* name, jack_master_t* request, jack_slave_t* result); - SERVER_EXPORT int jack_net_master_close(jack_net_master_t* net); + LIB_EXPORT jack_net_master_t* jack_net_master_open(const char* ip, int port, const char* name, jack_master_t* request, jack_slave_t* result); + LIB_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); - 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); + LIB_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); + LIB_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); // NetJack adapter API typedef struct _jack_adapter jack_adapter_t; - SERVER_EXPORT jack_adapter_t* jack_create_adapter(int input, int output, + LIB_EXPORT jack_adapter_t* jack_create_adapter(int input, int output, jack_nframes_t host_buffer_size, jack_nframes_t host_sample_rate, jack_nframes_t adapted_buffer_size, jack_nframes_t adapted_sample_rate); - SERVER_EXPORT int jack_destroy_adapter(jack_adapter_t* adapter); - SERVER_EXPORT void jack_flush_adapter(jack_adapter_t* adapter); + LIB_EXPORT int jack_destroy_adapter(jack_adapter_t* adapter); + LIB_EXPORT void jack_flush_adapter(jack_adapter_t* adapter); + + LIB_EXPORT int jack_adapter_push_and_pull(jack_adapter_t* adapter, float** input, float** output, unsigned int frames); + LIB_EXPORT int jack_adapter_pull_and_push(jack_adapter_t* adapter, float** input, float** output, unsigned int frames); - SERVER_EXPORT int jack_adapter_push_and_pull(jack_adapter_t* adapter, float** input, float** output, unsigned int frames); - SERVER_EXPORT int jack_adapter_pull_and_push(jack_adapter_t* adapter, float** input, float** output, unsigned int frames); + #define LOG_LEVEL_INFO 1 + #define LOG_LEVEL_ERROR 2 + + LIB_EXPORT void jack_error(const char *fmt, ...); + LIB_EXPORT void jack_info(const char *fmt, ...); + LIB_EXPORT void jack_log(const char *fmt, ...); #ifdef __cplusplus } @@ -151,6 +157,8 @@ struct JackNetExtMaster : public JackNetMasterInterface { fSocket.SetPort(port); fRequest.buffer_size = request->buffer_size; fRequest.sample_rate = request->sample_rate; + fRequest.audio_input = request->audio_input; + fRequest.audio_output = request->audio_output; fAudioCaptureBuffer = NULL; fAudioPlaybackBuffer = NULL; fMidiCaptureBuffer = NULL; @@ -215,11 +223,10 @@ struct JackNetExtMaster : public JackNetMasterInterface { } if (rx_bytes == sizeof(session_params_t )) { - switch (GetPacketType(&fParams)) { case SLAVE_AVAILABLE: - if (MasterInit() == 0) { + if (InitMaster(result) == 0) { SessionParamsDisplay(&fParams); fRunning = false; } else { @@ -238,8 +245,8 @@ struct JackNetExtMaster : public JackNetMasterInterface { } } while (fRunning); - - // Set result paramaters + + // Set result parameters result->audio_input = fParams.fSendAudioChannels; result->audio_output = fParams.fReturnAudioChannels; result->midi_input = fParams.fSendMidiChannels; @@ -253,7 +260,7 @@ struct JackNetExtMaster : public JackNetMasterInterface { return -1; } - int MasterInit() + int InitMaster(jack_slave_t* result) { // Check MASTER <==> SLAVE network protocol coherency if (fParams.fProtocolVersion != MASTER_PROTOCOL) { @@ -264,14 +271,45 @@ struct JackNetExtMaster : public JackNetMasterInterface { // Settings fSocket.GetName(fParams.fMasterNetName); fParams.fID = 1; - fParams.fSampleEncoder = JackFloatEncoder; fParams.fPeriodSize = fRequest.buffer_size; fParams.fSampleRate = fRequest.sample_rate; - + + if (fRequest.audio_input == -1) { + if (fParams.fSendAudioChannels == -1) { + jack_error("Error : master and slave use -1 for wanted inputs..."); + return -1; + } else { + result->audio_input = fParams.fSendAudioChannels; + jack_info("Takes slave %d inputs", fParams.fSendAudioChannels); + } + } else if (fParams.fSendAudioChannels == -1) { + fParams.fSendAudioChannels = fRequest.audio_input; + jack_info("Takes master %d inputs", fRequest.audio_input); + } else if (fParams.fSendAudioChannels != fRequest.audio_input) { + jack_error("Error : master wants %d inputs and slave wants %d inputs...", fRequest.audio_input, fParams.fSendAudioChannels); + return -1; + } + + if (fRequest.audio_output == -1) { + if (fParams.fReturnAudioChannels == -1) { + jack_error("Error : master and slave use -1 for wanted outputs..."); + return -1; + } else { + result->audio_output = fParams.fReturnAudioChannels; + jack_info("Takes slave %d outputs", fParams.fReturnAudioChannels); + } + } else if (fParams.fReturnAudioChannels == -1) { + fParams.fReturnAudioChannels = fRequest.audio_output; + jack_info("Takes master %d outputs", fRequest.audio_output); + } else if (fParams.fReturnAudioChannels != fRequest.audio_output) { + jack_error("Error : master wants %d outputs and slave wants %d outputs...", fRequest.audio_output, fParams.fReturnAudioChannels); + return -1; + } + // Close request socket fSocket.Close(); - // Network slave init + /// Network init if (!JackNetMasterInterface::Init()) { return -1; } @@ -361,7 +399,9 @@ struct JackNetExtMaster : public JackNetMasterInterface { int Read(int audio_input, float** audio_input_buffer, int midi_input, void** midi_input_buffer) { + try { + assert(audio_input == fParams.fReturnAudioChannels); for (int audio_port_index = 0; audio_port_index < audio_input; audio_port_index++) { @@ -371,11 +411,13 @@ struct JackNetExtMaster : public JackNetMasterInterface { for (int midi_port_index = 0; midi_port_index < midi_input; midi_port_index++) { fNetMidiPlaybackBuffer->SetBuffer(midi_port_index, ((JackMidiBuffer**)midi_input_buffer)[midi_port_index]); } - - if (SyncRecv() == SOCKET_ERROR) { - return 0; + + //receive sync + int res = SyncRecv(); + if ((res == 0) || (res == SOCKET_ERROR)) { + return res; } - + DecodeSyncPacket(); return DataRecv(); @@ -388,6 +430,7 @@ struct JackNetExtMaster : public JackNetMasterInterface { int Write(int audio_output, float** audio_output_buffer, int midi_output, void** midi_output_buffer) { try { + assert(audio_output == fParams.fSendAudioChannels); for (int audio_port_index = 0; audio_port_index < audio_output; audio_port_index++) { @@ -397,20 +440,32 @@ struct JackNetExtMaster : public JackNetMasterInterface { for (int midi_port_index = 0; midi_port_index < midi_output; midi_port_index++) { fNetMidiCaptureBuffer->SetBuffer(midi_port_index, ((JackMidiBuffer**)midi_output_buffer)[midi_port_index]); } + + + if (IsSynched()) { // only send if connection is "synched" + + EncodeSyncPacket(); + + if (SyncSend() == SOCKET_ERROR) { + return SOCKET_ERROR; + } - EncodeSyncPacket(); - - if (SyncSend() == SOCKET_ERROR) { - return SOCKET_ERROR; + //send data + if (DataSend() == SOCKET_ERROR) { + return SOCKET_ERROR; + } + + } else { + jack_info("Connection is not synched, skip cycle..."); } - - return DataSend(); + + return 0; } catch (JackNetException& e) { jack_error("Connection lost."); return -1; } - } + } // Transport void EncodeTransportData() @@ -490,6 +545,13 @@ struct JackNetExtSlave : public JackNetSlaveInterface, public JackRunnableInterf int Open(jack_master_t* result) { + // Check CELT encoder parameters + if ((fParams.fSampleEncoder == JackCeltEncoder) && (fParams.fKBps == 0)) { + jack_error("CELT encoder with 0 for kps..."); + return -1; + } + + // Check latency if (fParams.fNetworkLatency > NETWORK_MAX_LATENCY) { jack_error("Error : network latency is limited to %d", NETWORK_MAX_LATENCY); return -1; @@ -541,7 +603,7 @@ struct JackNetExtSlave : public JackNetSlaveInterface, public JackRunnableInterf return -1; } - // Finish connection... + // Finish connection if (!JackNetSlaveInterface::InitRendering()) { jack_error("Starting network fails..."); return -1; @@ -604,29 +666,33 @@ struct JackNetExtSlave : public JackNetSlaveInterface, public JackRunnableInterf void FreePorts() { if (fAudioCaptureBuffer) { - for (int audio_port_index = 0; audio_port_index < fParams.fSendAudioChannels; audio_port_index++) + for (int audio_port_index = 0; audio_port_index < fParams.fSendAudioChannels; audio_port_index++) { delete[] fAudioCaptureBuffer[audio_port_index]; + } delete[] fAudioCaptureBuffer; fAudioCaptureBuffer = NULL; } if (fMidiCaptureBuffer) { - for (int midi_port_index = 0; midi_port_index < fParams.fSendMidiChannels; midi_port_index++) + for (int midi_port_index = 0; midi_port_index < fParams.fSendMidiChannels; midi_port_index++) { delete[] (fMidiCaptureBuffer[midi_port_index]); + } delete[] fMidiCaptureBuffer; fMidiCaptureBuffer = NULL; } if (fAudioPlaybackBuffer) { - for (int audio_port_index = 0; audio_port_index < fParams.fReturnAudioChannels; audio_port_index++) + for (int audio_port_index = 0; audio_port_index < fParams.fReturnAudioChannels; audio_port_index++) { delete[] fAudioPlaybackBuffer[audio_port_index]; + } delete[] fAudioPlaybackBuffer; fAudioPlaybackBuffer = NULL; } if (fMidiPlaybackBuffer) { - for (int midi_port_index = 0; midi_port_index < fParams.fReturnMidiChannels; midi_port_index++) + for (int midi_port_index = 0; midi_port_index < fParams.fReturnMidiChannels; midi_port_index++) { delete[] fMidiPlaybackBuffer[midi_port_index]; + } delete[] fMidiPlaybackBuffer; fMidiPlaybackBuffer = NULL; } @@ -661,9 +727,9 @@ struct JackNetExtSlave : public JackNetSlaveInterface, public JackRunnableInterf } return false; } catch (JackNetException& e) { - // Otherwise just restart... e.PrintMessage(); + jack_info("NetSlave is restarted"); fThread.DropRealTime(); fThread.SetStatus(JackThread::kIniting); FreePorts(); @@ -855,7 +921,7 @@ struct JackNetAdapter : public JackAudioAdapterInterface { using namespace Jack; -SERVER_EXPORT jack_net_slave_t* jack_net_slave_open(const char* ip, int port, const char* name, jack_slave_t* request, jack_master_t* result) +LIB_EXPORT jack_net_slave_t* jack_net_slave_open(const char* ip, int port, const char* name, jack_slave_t* request, jack_master_t* result) { JackNetExtSlave* slave = new JackNetExtSlave(ip, port, name, request); if (slave->Open(result) == 0) { @@ -866,7 +932,7 @@ SERVER_EXPORT jack_net_slave_t* jack_net_slave_open(const char* ip, int port, co } } -SERVER_EXPORT int jack_net_slave_close(jack_net_slave_t* net) +LIB_EXPORT int jack_net_slave_close(jack_net_slave_t* net) { JackNetExtSlave* slave = (JackNetExtSlave*)net; slave->Close(); @@ -874,37 +940,37 @@ SERVER_EXPORT int jack_net_slave_close(jack_net_slave_t* net) return 0; } -SERVER_EXPORT int jack_set_net_slave_process_callback(jack_net_slave_t* net, JackNetSlaveProcessCallback net_callback, void *arg) +LIB_EXPORT int jack_set_net_slave_process_callback(jack_net_slave_t* net, JackNetSlaveProcessCallback net_callback, void *arg) { JackNetExtSlave* slave = (JackNetExtSlave*)net; return slave->SetProcessCallback(net_callback, arg); } -SERVER_EXPORT int jack_net_slave_activate(jack_net_slave_t* net) +LIB_EXPORT int jack_net_slave_activate(jack_net_slave_t* net) { JackNetExtSlave* slave = (JackNetExtSlave*)net; return slave->Start(); } -SERVER_EXPORT int jack_net_slave_deactivate(jack_net_slave_t* net) +LIB_EXPORT int jack_net_slave_deactivate(jack_net_slave_t* net) { JackNetExtSlave* slave = (JackNetExtSlave*)net; return slave->Stop(); } -SERVER_EXPORT int jack_set_net_slave_buffer_size_callback(jack_net_slave_t *net, JackNetSlaveBufferSizeCallback bufsize_callback, void *arg) +LIB_EXPORT int jack_set_net_slave_buffer_size_callback(jack_net_slave_t *net, JackNetSlaveBufferSizeCallback bufsize_callback, void *arg) { JackNetExtSlave* slave = (JackNetExtSlave*)net; return slave->SetBufferSizeCallback(bufsize_callback, arg); } -SERVER_EXPORT int jack_set_net_slave_sample_rate_callback(jack_net_slave_t *net, JackNetSlaveSampleRateCallback samplerate_callback, void *arg) +LIB_EXPORT int jack_set_net_slave_sample_rate_callback(jack_net_slave_t *net, JackNetSlaveSampleRateCallback samplerate_callback, void *arg) { JackNetExtSlave* slave = (JackNetExtSlave*)net; return slave->SetSampleRateCallback(samplerate_callback, arg); } -SERVER_EXPORT int jack_set_net_slave_shutdown_callback(jack_net_slave_t *net, JackNetSlaveShutdownCallback shutdown_callback, void *arg) +LIB_EXPORT int jack_set_net_slave_shutdown_callback(jack_net_slave_t *net, JackNetSlaveShutdownCallback shutdown_callback, void *arg) { JackNetExtSlave* slave = (JackNetExtSlave*)net; return slave->SetShutdownCallback(shutdown_callback, arg); @@ -912,7 +978,7 @@ SERVER_EXPORT int jack_set_net_slave_shutdown_callback(jack_net_slave_t *net, Ja // Master API -SERVER_EXPORT jack_net_master_t* jack_net_master_open(const char* ip, int port, const char* name, jack_master_t* request, jack_slave_t* result) +LIB_EXPORT jack_net_master_t* jack_net_master_open(const char* ip, int port, const char* name, jack_master_t* request, jack_slave_t* result) { JackNetExtMaster* master = new JackNetExtMaster(ip, port, name, request); if (master->Open(result) == 0) { @@ -923,20 +989,21 @@ SERVER_EXPORT jack_net_master_t* jack_net_master_open(const char* ip, int port, } } -SERVER_EXPORT int jack_net_master_close(jack_net_master_t* net) +LIB_EXPORT int jack_net_master_close(jack_net_master_t* net) { JackNetExtMaster* master = (JackNetExtMaster*)net; master->Close(); delete master; return 0; } -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) + +LIB_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* 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) +LIB_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* master = (JackNetExtMaster*)net; return master->Write(audio_output, audio_output_buffer, midi_output, midi_output_buffer); @@ -944,7 +1011,7 @@ SERVER_EXPORT int jack_net_master_send(jack_net_master_t* net, int audio_output, // Adapter API -SERVER_EXPORT jack_adapter_t* jack_create_adapter(int input, int output, +LIB_EXPORT jack_adapter_t* jack_create_adapter(int input, int output, jack_nframes_t host_buffer_size, jack_nframes_t host_sample_rate, jack_nframes_t adapted_buffer_size, @@ -957,52 +1024,53 @@ SERVER_EXPORT jack_adapter_t* jack_create_adapter(int input, int output, } } -SERVER_EXPORT int jack_destroy_adapter(jack_adapter_t* adapter) +LIB_EXPORT int jack_destroy_adapter(jack_adapter_t* adapter) { delete((JackNetAdapter*)adapter); return 0; } -SERVER_EXPORT void jack_flush_adapter(jack_adapter_t* adapter) +LIB_EXPORT void jack_flush_adapter(jack_adapter_t* adapter) { JackNetAdapter* slave = (JackNetAdapter*)adapter; slave->Flush(); } -SERVER_EXPORT int jack_adapter_push_and_pull(jack_adapter_t* adapter, float** input, float** output, unsigned int frames) +LIB_EXPORT int jack_adapter_push_and_pull(jack_adapter_t* adapter, float** input, float** output, unsigned int frames) { JackNetAdapter* slave = (JackNetAdapter*)adapter; return slave->PushAndPull(input, output, frames); } -SERVER_EXPORT int jack_adapter_pull_and_push(jack_adapter_t* adapter, float** input, float** output, unsigned int frames) +LIB_EXPORT int jack_adapter_pull_and_push(jack_adapter_t* adapter, float** input, float** output, unsigned int frames) { JackNetAdapter* slave = (JackNetAdapter*)adapter; return slave->PullAndPush(input, output, frames); } - -//#ifdef MY_TARGET_OS_IPHONE -#if 1 - static void jack_format_and_log(int level, const char *prefix, const char *fmt, va_list ap) { - char buffer[300]; - size_t len; + static const char* netjack_log = getenv("JACK_NETJACK_LOG"); + static bool is_netjack_log = (netjack_log) ? atoi(netjack_log) : 0; - if (prefix != NULL) { - len = strlen(prefix); - memcpy(buffer, prefix, len); - } else { - len = 0; - } + if (is_netjack_log) { + char buffer[300]; + size_t len; + + if (prefix != NULL) { + len = strlen(prefix); + memcpy(buffer, prefix, len); + } else { + len = 0; + } - vsnprintf(buffer + len, sizeof(buffer) - len, fmt, ap); - printf("%s", buffer); - printf("\n"); + vsnprintf(buffer + len, sizeof(buffer) - len, fmt, ap); + printf("%s", buffer); + printf("\n"); + } } -SERVER_EXPORT void jack_error(const char *fmt, ...) +LIB_EXPORT void jack_error(const char *fmt, ...) { va_list ap; va_start(ap, fmt); @@ -1010,7 +1078,7 @@ SERVER_EXPORT void jack_error(const char *fmt, ...) va_end(ap); } -SERVER_EXPORT void jack_info(const char *fmt, ...) +LIB_EXPORT void jack_info(const char *fmt, ...) { va_list ap; va_start(ap, fmt); @@ -1018,26 +1086,10 @@ SERVER_EXPORT void jack_info(const char *fmt, ...) va_end(ap); } -SERVER_EXPORT void jack_log(const char *fmt, ...) +LIB_EXPORT void jack_log(const char *fmt, ...) { va_list ap; va_start(ap, fmt); jack_format_and_log(LOG_LEVEL_INFO, "Jack: ", fmt, ap); va_end(ap); } - -#else - -// Empty code for now.. - -SERVER_EXPORT void jack_error(const char *fmt, ...) -{} - -SERVER_EXPORT void jack_info(const char *fmt, ...) -{} - -SERVER_EXPORT void jack_log(const char *fmt, ...) -{} - -#endif - diff --git a/common/JackNetAdapter.cpp b/common/JackNetAdapter.cpp index a41ada28..2f51d0f0 100644 --- a/common/JackNetAdapter.cpp +++ b/common/JackNetAdapter.cpp @@ -260,6 +260,7 @@ namespace Jack } return false; } catch (JackNetException& e) { + // Otherwise just restart... e.PrintMessage(); jack_info("NetAdapter is restarted"); Reset(); @@ -413,7 +414,7 @@ extern "C" value.i = 2; jack_driver_descriptor_add_parameter(desc, &filler, "input-ports", 'C', JackDriverParamInt, &value, NULL, "Number of audio input ports", NULL); - jack_driver_descriptor_add_parameter(desc, &filler, "output-ports", 'C', JackDriverParamInt, &value, NULL, "Number of audio output ports", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "output-ports", 'P', JackDriverParamInt, &value, NULL, "Number of audio output ports", NULL); #if HAVE_CELT value.i = -1; diff --git a/common/JackNetDriver.cpp b/common/JackNetDriver.cpp index 545eecdf..d6ef7934 100644 --- a/common/JackNetDriver.cpp +++ b/common/JackNetDriver.cpp @@ -16,6 +16,8 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include "JackCompilerDeps.h" +#include "driver_interface.h" #include "JackNetDriver.h" #include "JackEngineControl.h" #include "JackLockedEngine.h" @@ -509,7 +511,7 @@ namespace Jack DecodeSyncPacket(); #ifdef JACK_MONITOR - fNetTimeMon->Add((float(GetMicroSeconds() - fRcvSyncUst) / float(fEngineControl->fPeriodUsecs) * 100.f); + fNetTimeMon->Add(float(GetMicroSeconds() - fRcvSyncUst) / float(fEngineControl->fPeriodUsecs) * 100.f); #endif //audio, midi or sync if driver is late int res = DataRecv(); @@ -524,7 +526,7 @@ namespace Jack JackDriver::CycleTakeBeginTime(); #ifdef JACK_MONITOR - fNetTimeMon->Add((float(GetMicroSeconds() - fRcvSyncUst) / float(fEngineControl->fPeriodUsecs) * 100.f); + fNetTimeMon->Add(float(GetMicroSeconds() - fRcvSyncUst) / float(fEngineControl->fPeriodUsecs) * 100.f); #endif return 0; @@ -555,7 +557,7 @@ namespace Jack } #ifdef JACK_MONITOR - fNetTimeMon->AddLast((float(GetMicroSeconds() - fRcvSyncUst) / float(fEngineControl->fPeriodUsecs) * 100.f); + fNetTimeMon->AddLast(float(GetMicroSeconds() - fRcvSyncUst) / float(fEngineControl->fPeriodUsecs) * 100.f); #endif //sync @@ -588,6 +590,7 @@ namespace Jack extern "C" { #endif + SERVER_EXPORT jack_driver_desc_t* driver_get_descriptor() { jack_driver_desc_t * desc; @@ -620,8 +623,11 @@ namespace Jack strcpy(value.str, "'hostname'"); jack_driver_descriptor_add_parameter(desc, &filler, "client-name", 'n', JackDriverParamString, &value, NULL, "Name of the jack client", NULL); +/* +Deactivated for now.. value.ui = 0U; jack_driver_descriptor_add_parameter(desc, &filler, "transport-sync", 't', JackDriverParamUInt, &value, NULL, "Sync transport with master's", NULL); +*/ value.ui = 5U; jack_driver_descriptor_add_parameter(desc, &filler, "latency", 'l', JackDriverParamUInt, &value, NULL, "Network latency", NULL); @@ -696,9 +702,12 @@ namespace Jack case 'n' : strncpy(net_name, param->value.str, JACK_CLIENT_NAME_SIZE); break; + /* + Deactivated for now.. case 't' : transport_sync = param->value.ui; break; + */ case 'l' : network_latency = param->value.ui; if (network_latency > NETWORK_MAX_LATENCY) { diff --git a/common/JackNetInterface.cpp b/common/JackNetInterface.cpp index 7f81d069..4ad731c5 100644 --- a/common/JackNetInterface.cpp +++ b/common/JackNetInterface.cpp @@ -18,6 +18,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "JackNetInterface.h" #include "JackException.h" +#include "JackError.h" + #include using namespace std; @@ -52,6 +54,7 @@ namespace Jack void JackNetInterface::Initialize() { + fSetTimeOut = false; fTxBuffer = NULL; fRxBuffer = NULL; fNetAudioCaptureBuffer = NULL; @@ -196,6 +199,7 @@ namespace Jack fRxHeader.fCycle = rx_head->fCycle; fRxHeader.fIsLastPckt = rx_head->fIsLastPckt; buffer->RenderFromNetwork(rx_head->fSubCycle, rx_bytes - HEADER_SIZE); + // Last midi packet is received, so finish rendering... if (++recvd_midi_pckt == rx_head->fNumPacket) { buffer->RenderToJackPorts(); @@ -211,6 +215,7 @@ namespace Jack fRxHeader.fIsLastPckt = rx_head->fIsLastPckt; fRxHeader.fActivePorts = rx_head->fActivePorts; rx_bytes = buffer->RenderFromNetwork(rx_head->fCycle, rx_head->fSubCycle, fRxHeader.fActivePorts); + // Last audio packet is received, so finish rendering... if (fRxHeader.fIsLastPckt) { buffer->RenderToJackPorts(); @@ -220,7 +225,6 @@ namespace Jack int JackNetInterface::FinishRecv(NetAudioBuffer* buffer) { - // TODO : finish midi and audio rendering ? buffer->RenderToJackPorts(); return NET_PACKET_ERROR; } @@ -242,12 +246,23 @@ namespace Jack } return NULL; } + + void JackNetInterface::SetRcvTimeOut() + { + if (!fSetTimeOut) { + if (fSocket.SetTimeOut(PACKET_TIMEOUT) == SOCKET_ERROR) { + jack_error("Can't set rx timeout : %s", StrError(NET_ERROR_CODE)); + return; + } + fSetTimeOut = true; + } + } // JackNetMasterInterface ************************************************************************************ bool JackNetMasterInterface::Init() { - jack_log("JackNetMasterInterface::Init, ID %u", fParams.fID); + jack_log("JackNetMasterInterface::Init : ID %u", fParams.fID); session_params_t host_params; uint attempt = 0; @@ -260,8 +275,9 @@ namespace Jack } // timeout on receive (for init) - if (fSocket.SetTimeOut(MASTER_INIT_TIMEOUT) < 0) - jack_error("Can't set timeout : %s", StrError(NET_ERROR_CODE)); + if (fSocket.SetTimeOut(MASTER_INIT_TIMEOUT) < 0) { + jack_error("Can't set init timeout : %s", StrError(NET_ERROR_CODE)); + } // connect if (fSocket.Connect() == SOCKET_ERROR) { @@ -291,6 +307,7 @@ namespace Jack SessionParamsNToH(&net_params, &host_params); } while ((GetPacketType(&host_params) != START_MASTER) && (++attempt < SLAVE_SETUP_RETRY)); + if (attempt == SLAVE_SETUP_RETRY) { jack_error("Slave doesn't respond, exiting"); return false; @@ -299,13 +316,6 @@ namespace Jack return true; } - int JackNetMasterInterface::SetRxTimeout() - { - jack_log("JackNetMasterInterface::SetRxTimeout"); - float time = 3 * 1000000.f * (static_cast(fParams.fPeriodSize) / static_cast(fParams.fSampleRate)); - return fSocket.SetTimeOut(static_cast(time)); - } - bool JackNetMasterInterface::SetParams() { jack_log("JackNetMasterInterface::SetParams audio in = %d audio out = %d MIDI in = %d MIDI out = %d", @@ -346,14 +356,6 @@ namespace Jack return false; } - // set the new timeout for the socket - /* - if (SetRxTimeout() == SOCKET_ERROR) { - jack_error("Can't set rx timeout : %s", StrError(NET_ERROR_CODE)); - goto error; - } - */ - // set the new rx buffer size if (SetNetBufferSize() == SOCKET_ERROR) { jack_error("Can't set net buffer sizes : %s", StrError(NET_ERROR_CODE)); @@ -418,19 +420,6 @@ namespace Jack int rx_bytes; if (((rx_bytes = fSocket.Recv(fRxBuffer, size, flags)) == SOCKET_ERROR) && fRunning) { - - /* - net_error_t error = fSocket.GetError(); - // no data isn't really a network error, so just return 0 available read bytes - if (error == NET_NO_DATA) { - return 0; - } else if (error == NET_CONN_ERROR) { - FatalRecvError(); - } else { - jack_error("Error in master receive : %s", StrError(NET_ERROR_CODE)); - } - */ - FatalRecvError(); } @@ -446,14 +435,6 @@ namespace Jack PacketHeaderHToN(header, header); if (((tx_bytes = fSocket.Send(fTxBuffer, size, flags)) == SOCKET_ERROR) && fRunning) { - /* - net_error_t error = fSocket.GetError(); - if (error == NET_CONN_ERROR) { - FatalSendError(); - } else { - jack_error("Error in master send : %s", StrError(NET_ERROR_CODE)); - } - */ FatalSendError(); } return tx_bytes; @@ -466,6 +447,8 @@ namespace Jack int JackNetMasterInterface::SyncSend() { + SetRcvTimeOut(); + fTxHeader.fCycle++; fTxHeader.fSubCycle = 0; fTxHeader.fDataType = 's'; @@ -490,17 +473,6 @@ namespace Jack int rx_bytes = 0; packet_header_t* rx_head = reinterpret_cast(fRxBuffer); - /* - int rx_bytes = Recv(fParams.fMtu, MSG_PEEK); - - if ((rx_bytes == 0) || (rx_bytes == SOCKET_ERROR)) { - // 0 bytes considered an error (lost connection) - return SOCKET_ERROR; - } - - fCurrentCycleOffset = fTxHeader.fCycle - rx_head->fCycle; - */ - // receive sync (launch the cycle) do { rx_bytes = Recv(fParams.fMtu, MSG_PEEK); @@ -532,7 +504,7 @@ namespace Jack while (!fRxHeader.fIsLastPckt) { // how much data is queued on the rx buffer ? rx_bytes = Recv(fParams.fMtu, MSG_PEEK); - + // error here, problem with recv, just skip the cycle (return -1) if (rx_bytes == SOCKET_ERROR) { return rx_bytes; @@ -556,7 +528,7 @@ namespace Jack } } } - + return rx_bytes; } @@ -608,6 +580,17 @@ namespace Jack uint JackNetSlaveInterface::fSlaveCounter = 0; + void JackNetSlaveInterface::InitAPI() + { + // open Socket API with the first slave + if (fSlaveCounter++ == 0) { + if (SocketAPIInit() < 0) { + jack_error("Can't init Socket API, exiting..."); + throw std::bad_alloc(); + } + } + } + bool JackNetSlaveInterface::Init() { jack_log("JackNetSlaveInterface::Init()"); @@ -674,8 +657,9 @@ namespace Jack // then tell the master we are ready jack_info("Initializing connection with %s...", fParams.fMasterNetName); status = SendStartToMaster(); - if (status == NET_ERROR) + if (status == NET_ERROR) { return false; + } } while (status != NET_ROLLING); @@ -705,13 +689,15 @@ namespace Jack } } - // timeout on receive - if (fSocket.SetTimeOut(SLAVE_INIT_TIMEOUT) == SOCKET_ERROR) - jack_error("Can't set timeout : %s", StrError(NET_ERROR_CODE)); + // timeout on receive (for init) + if (fSocket.SetTimeOut(SLAVE_INIT_TIMEOUT) == SOCKET_ERROR) { + jack_error("Can't set init timeout : %s", StrError(NET_ERROR_CODE)); + } // disable local loop - if (fSocket.SetLocalLoop() == SOCKET_ERROR) + if (fSocket.SetLocalLoop() == SOCKET_ERROR) { jack_error("Can't disable multicast loop : %s", StrError(NET_ERROR_CODE)); + } // send 'AVAILABLE' until 'SLAVE_SETUP' received jack_info("Waiting for a master..."); @@ -720,8 +706,9 @@ namespace Jack session_params_t net_params; memset(&net_params, 0, sizeof(session_params_t)); SessionParamsHToN(&fParams, &net_params); - if (fSocket.SendTo(&net_params, sizeof(session_params_t), 0, fMulticastIP) == SOCKET_ERROR) + if (fSocket.SendTo(&net_params, sizeof(session_params_t), 0, fMulticastIP) == SOCKET_ERROR) { jack_error("Error in data send : %s", StrError(NET_ERROR_CODE)); + } // filter incoming packets : don't exit while no error is detected memset(&net_params, 0, sizeof(session_params_t)); @@ -833,20 +820,9 @@ namespace Jack int JackNetSlaveInterface::Recv(size_t size, int flags) { int rx_bytes = fSocket.Recv(fRxBuffer, size, flags); + // handle errors if (rx_bytes == SOCKET_ERROR) { - /* - net_error_t error = fSocket.GetError(); - // no data isn't really an error in realtime processing, so just return 0 - if (error == NET_NO_DATA) { - jack_error("No data, is the master still running ?"); - // if a network error occurs, this exception will restart the driver - } else if (error == NET_CONN_ERROR) { - FatalRecvError(); - } else { - jack_error("Fatal error in slave receive : %s", StrError(NET_ERROR_CODE)); - } - */ FatalRecvError(); } @@ -863,17 +839,9 @@ namespace Jack // handle errors if (tx_bytes == SOCKET_ERROR) { - /* - net_error_t error = fSocket.GetError(); - // if a network error occurs, this exception will restart the driver - if (error == NET_CONN_ERROR) { - FatalSendError(); - } else { - jack_error("Fatal error in slave send : %s", StrError(NET_ERROR_CODE)); - } - */ FatalSendError(); } + return tx_bytes; } @@ -881,7 +849,7 @@ namespace Jack { int rx_bytes = 0; packet_header_t* rx_head = reinterpret_cast(fRxBuffer); - + // receive sync (launch the cycle) do { rx_bytes = Recv(fParams.fMtu, 0); @@ -893,6 +861,8 @@ namespace Jack while ((strcmp(rx_head->fPacketType, "header") != 0) && (rx_head->fDataType != 's')); fRxHeader.fIsLastPckt = rx_head->fIsLastPckt; + + SetRcvTimeOut(); return rx_bytes; } diff --git a/common/JackNetInterface.h b/common/JackNetInterface.h index 25ec36f0..b20a4b89 100644 --- a/common/JackNetInterface.h +++ b/common/JackNetInterface.h @@ -21,6 +21,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #define __JackNetInterface__ #include "JackNetTool.h" +#include namespace Jack { @@ -31,9 +32,10 @@ namespace Jack #define SLAVE_SETUP_RETRY 5 -#define MANAGER_INIT_TIMEOUT 2000000 // in usec -#define MASTER_INIT_TIMEOUT 1000000 // in usec -#define SLAVE_INIT_TIMEOUT 1000000 // in usec +#define MANAGER_INIT_TIMEOUT 2000000 // in usec +#define MASTER_INIT_TIMEOUT 1000000 * 10 // in usec +#define SLAVE_INIT_TIMEOUT 1000000 * 10 // in usec +#define PACKET_TIMEOUT 500000 // in usec #define NETWORK_MAX_LATENCY 20 @@ -45,6 +47,8 @@ namespace Jack { protected: + + bool fSetTimeOut; void Initialize(); @@ -106,6 +110,8 @@ namespace Jack int AudioRecv(packet_header_t* rx_head, NetAudioBuffer* buffer); int FinishRecv(NetAudioBuffer* buffer); + + void SetRcvTimeOut(); NetAudioBuffer* AudioBufferFactory(int nports, char* buffer); @@ -129,13 +135,10 @@ namespace Jack protected: bool fRunning; - int fCurrentCycleOffset; int fMaxCycleOffset; - int fLastfCycleOffset; - + bool Init(); - int SetRxTimeout(); bool SetParams(); void Exit(); @@ -160,10 +163,10 @@ namespace Jack public: - JackNetMasterInterface() : JackNetInterface(), fRunning(false), fCurrentCycleOffset(0), fMaxCycleOffset(0), fLastfCycleOffset(0) + JackNetMasterInterface() : JackNetInterface(), fRunning(false), fCurrentCycleOffset(0), fMaxCycleOffset(0) {} JackNetMasterInterface(session_params_t& params, JackNetSocket& socket, const char* multicast_ip) - : JackNetInterface(params, socket, multicast_ip) + : JackNetInterface(params, socket, multicast_ip), fRunning(false), fCurrentCycleOffset(0), fMaxCycleOffset(0) {} virtual~JackNetMasterInterface() @@ -206,16 +209,7 @@ namespace Jack void FatalRecvError(); void FatalSendError(); - void InitAPI() - { - // open Socket API with the first slave - if (fSlaveCounter++ == 0) { - if (SocketAPIInit() < 0) { - jack_error("Can't init Socket API, exiting..."); - throw std::bad_alloc(); - } - } - } + void InitAPI(); public: diff --git a/common/JackNetManager.cpp b/common/JackNetManager.cpp index 3dd940b2..d8756e70 100644 --- a/common/JackNetManager.cpp +++ b/common/JackNetManager.cpp @@ -33,8 +33,8 @@ namespace Jack jack_log("JackNetMaster::JackNetMaster"); //settings - fClientName = const_cast(fParams.fName); - fJackClient = NULL; + fName = const_cast(fParams.fName); + fClient = NULL; fSendTransportData.fState = -1; fReturnTransportData.fState = -1; fLastTransportState = -1; @@ -91,10 +91,10 @@ namespace Jack { jack_log("JackNetMaster::~JackNetMaster ID = %u", fParams.fID); - if (fJackClient) { - jack_deactivate(fJackClient); + if (fClient) { + jack_deactivate(fClient); FreePorts(); - jack_client_close(fJackClient); + jack_client_close(fClient); } delete[] fAudioCapturePorts; delete[] fAudioPlaybackPorts; @@ -122,18 +122,24 @@ namespace Jack //jack client and process jack_status_t status; - if ((fJackClient = jack_client_open(fClientName, JackNullOption, &status, NULL)) == NULL) { + if ((fClient = jack_client_open(fName, JackNullOption, &status, NULL)) == NULL) { jack_error("Can't open a new JACK client"); return false; } - - if (jack_set_process_callback(fJackClient, SetProcess, this) < 0) { + + if (jack_set_process_callback(fClient, SetProcess, this) < 0) { goto fail; } - if (jack_set_buffer_size_callback(fJackClient, SetBufferSize, this) < 0) { + if (jack_set_buffer_size_callback(fClient, SetBufferSize, this) < 0) { + goto fail; + } + + /* + if (jack_set_port_connect_callback(fClient, SetConnectCallback, this) < 0) { goto fail; } + */ if (AllocPorts() != 0) { jack_error("Can't allocate JACK ports"); @@ -144,7 +150,7 @@ namespace Jack fRunning = true; //finally activate jack client - if (jack_activate(fJackClient) != 0) { + if (jack_activate(fClient) != 0) { jack_error("Can't activate JACK client"); goto fail; } @@ -157,8 +163,8 @@ namespace Jack fail: FreePorts(); - jack_client_close(fJackClient); - fJackClient = NULL; + jack_client_close(fClient); + fClient = NULL; return false; } @@ -167,7 +173,7 @@ namespace Jack { int i; char name[24]; - jack_nframes_t port_latency = jack_get_buffer_size(fJackClient); + jack_nframes_t port_latency = jack_get_buffer_size(fClient); jack_latency_range_t range; jack_log("JackNetMaster::AllocPorts"); @@ -175,7 +181,7 @@ namespace Jack //audio for (i = 0; i < fParams.fSendAudioChannels; i++) { snprintf(name, sizeof(name), "to_slave_%d", i+1); - if ((fAudioCapturePorts[i] = jack_port_register(fJackClient, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput | JackPortIsTerminal, 0)) == NULL) + if ((fAudioCapturePorts[i] = jack_port_register(fClient, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput | JackPortIsTerminal, 0)) == NULL) return -1; //port latency range.min = range.max = 0; @@ -184,7 +190,7 @@ namespace Jack for (i = 0; i < fParams.fReturnAudioChannels; i++) { snprintf(name, sizeof(name), "from_slave_%d", i+1); - if ((fAudioPlaybackPorts[i] = jack_port_register(fJackClient, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput | JackPortIsTerminal, 0)) == NULL) + if ((fAudioPlaybackPorts[i] = jack_port_register(fClient, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput | JackPortIsTerminal, 0)) == NULL) return -1; //port latency range.min = range.max = fParams.fNetworkLatency * port_latency + (fParams.fSlaveSyncMode) ? 0 : port_latency; @@ -194,7 +200,7 @@ namespace Jack //midi for (i = 0; i < fParams.fSendMidiChannels; i++) { snprintf(name, sizeof(name), "midi_to_slave_%d", i+1); - if ((fMidiCapturePorts[i] = jack_port_register(fJackClient, name, JACK_DEFAULT_MIDI_TYPE, JackPortIsInput | JackPortIsTerminal, 0)) == NULL) + if ((fMidiCapturePorts[i] = jack_port_register(fClient, name, JACK_DEFAULT_MIDI_TYPE, JackPortIsInput | JackPortIsTerminal, 0)) == NULL) return -1; //port latency range.min = range.max = 0; @@ -203,7 +209,7 @@ namespace Jack for (i = 0; i < fParams.fReturnMidiChannels; i++) { snprintf(name, sizeof(name), "midi_from_slave_%d", i+1); - if ((fMidiPlaybackPorts[i] = jack_port_register(fJackClient, name, JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput | JackPortIsTerminal, 0)) == NULL) + if ((fMidiPlaybackPorts[i] = jack_port_register(fClient, name, JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput | JackPortIsTerminal, 0)) == NULL) return -1; //port latency range.min = range.max = fParams.fNetworkLatency * port_latency + (fParams.fSlaveSyncMode) ? 0 : port_latency; @@ -216,18 +222,18 @@ namespace Jack { const char **ports; - ports = jack_get_ports(fJackClient, NULL, NULL, JackPortIsPhysical | JackPortIsOutput); + ports = jack_get_ports(fClient, NULL, NULL, JackPortIsPhysical | JackPortIsOutput); if (ports != NULL) { for (int i = 0; i < fParams.fSendAudioChannels && ports[i]; i++) { - jack_connect(fJackClient, ports[i], jack_port_name(fAudioCapturePorts[i])); + jack_connect(fClient, ports[i], jack_port_name(fAudioCapturePorts[i])); } free(ports); } - ports = jack_get_ports(fJackClient, NULL, NULL, JackPortIsPhysical | JackPortIsInput); + ports = jack_get_ports(fClient, NULL, NULL, JackPortIsPhysical | JackPortIsInput); if (ports != NULL) { for (int i = 0; i < fParams.fReturnAudioChannels && ports[i]; i++) { - jack_connect(fJackClient, jack_port_name(fAudioPlaybackPorts[i]), ports[i]); + jack_connect(fClient, jack_port_name(fAudioPlaybackPorts[i]), ports[i]); } free(ports); } @@ -240,22 +246,22 @@ namespace Jack int port_index; for (port_index = 0; port_index < fParams.fSendAudioChannels; port_index++) { if (fAudioCapturePorts[port_index]) { - jack_port_unregister(fJackClient, fAudioCapturePorts[port_index]); + jack_port_unregister(fClient, fAudioCapturePorts[port_index]); } } for (port_index = 0; port_index < fParams.fReturnAudioChannels; port_index++) { if (fAudioPlaybackPorts[port_index]) { - jack_port_unregister(fJackClient, fAudioPlaybackPorts[port_index]); + jack_port_unregister(fClient, fAudioPlaybackPorts[port_index]); } } for (port_index = 0; port_index < fParams.fSendMidiChannels; port_index++) { if (fMidiCapturePorts[port_index]) { - jack_port_unregister(fJackClient, fMidiCapturePorts[port_index]); + jack_port_unregister(fClient, fMidiCapturePorts[port_index]); } } for (port_index = 0; port_index < fParams.fReturnMidiChannels; port_index++) { if (fMidiPlaybackPorts[port_index]) { - jack_port_unregister(fJackClient, fMidiPlaybackPorts[port_index]); + jack_port_unregister(fClient, fMidiPlaybackPorts[port_index]); } } } @@ -268,7 +274,7 @@ namespace Jack fSendTransportData.fTimebaseMaster = NO_CHANGE; //update state and position - fSendTransportData.fState = static_cast(jack_transport_query(fJackClient, &fSendTransportData.fPosition)); + fSendTransportData.fState = static_cast(jack_transport_query(fClient, &fSendTransportData.fPosition)); //is it a new state ? fSendTransportData.fNewState = ((fSendTransportData.fState != fLastTransportState) && (fSendTransportData.fState != fReturnTransportData.fState)); @@ -287,7 +293,7 @@ namespace Jack switch (fReturnTransportData.fTimebaseMaster) { case RELEASE_TIMEBASEMASTER : - timebase = jack_release_timebase(fJackClient); + timebase = jack_release_timebase(fClient); if (timebase < 0) { jack_error("Can't release timebase master"); } else { @@ -296,7 +302,7 @@ namespace Jack break; case TIMEBASEMASTER : - timebase = jack_set_timebase_callback(fJackClient, 0, SetTimebaseCallback, this); + timebase = jack_set_timebase_callback(fClient, 0, SetTimebaseCallback, this); if (timebase < 0) { jack_error("Can't set a new timebase master"); } else { @@ -305,7 +311,7 @@ namespace Jack break; case CONDITIONAL_TIMEBASEMASTER : - timebase = jack_set_timebase_callback(fJackClient, 1, SetTimebaseCallback, this); + timebase = jack_set_timebase_callback(fClient, 1, SetTimebaseCallback, this); if (timebase != EBUSY) { if (timebase < 0) jack_error("Can't set a new timebase master"); @@ -317,19 +323,19 @@ namespace Jack } //is the slave in a new transport state and is this state different from master's ? - if (fReturnTransportData.fNewState && (fReturnTransportData.fState != jack_transport_query(fJackClient, NULL))) { + if (fReturnTransportData.fNewState && (fReturnTransportData.fState != jack_transport_query(fClient, NULL))) { switch (fReturnTransportData.fState) { case JackTransportStopped : - jack_transport_stop(fJackClient); + jack_transport_stop(fClient); jack_info("'%s' stops transport", fParams.fName); break; case JackTransportStarting : - if (jack_transport_reposition(fJackClient, &fReturnTransportData.fPosition) == EINVAL) + if (jack_transport_reposition(fClient, &fReturnTransportData.fPosition) == EINVAL) jack_error("Can't set new position"); - jack_transport_start(fJackClient); + jack_transport_start(fClient); jack_info("'%s' starts transport frame = %d", fParams.fName, fReturnTransportData.fPosition.frame); break; @@ -387,11 +393,22 @@ namespace Jack return 0; } } + + void JackNetMaster::SetConnectCallback(jack_port_id_t a, jack_port_id_t b, int connect, void* arg) + { + static_cast(arg)->ConnectCallback(a, b, connect); + } + + void JackNetMaster::ConnectCallback(jack_port_id_t a, jack_port_id_t b, int connect) + { + jack_info("JackNetMaster::ConnectCallback a = %d b = %d connect = %d", a, b, connect); + if (connect) { + jack_connect(fClient, jack_port_name(jack_port_by_id(fClient, a)), "system:playback_1"); + } + } int JackNetMaster::Process() { - int res; - if (!fRunning) { return 0; } @@ -474,35 +491,15 @@ namespace Jack #endif } else { - jack_error("Connection is not synched, skip cycle..."); + jack_info("Connection is not synched, skip cycle..."); } //receive sync - res = SyncRecv(); + int res = SyncRecv(); if ((res == 0) || (res == SOCKET_ERROR)) { return res; } - /* - switch (SyncRecv()) { - - case 0: - jack_error("Connection is not yet synched, skip cycle..."); - return 0; - - case SOCKET_ERROR: - jack_error("Connection is lost, quit master..."); - //ask to the manager to properly remove the master - Exit(); - //UGLY temporary way to be sure the thread does not call code possibly causing a deadlock in JackEngine. - ThreadExit(); - break; - - default: - break; - } - */ - #ifdef JACK_MONITOR fNetTimeMon->Add((((float)(GetMicroSeconds() - begin_time)) / (float) fPeriodUsecs) * 100.f); #endif @@ -519,26 +516,6 @@ namespace Jack JackServerGlobals::fInstance->GetEngine()->NotifyXRun(GetMicroSeconds(), 0); } - /* - switch (DataRecv()) { - - case 0: - jack_error("Connection is not yet synched, skip cycle..."); - return 0; - - case SOCKET_ERROR: - jack_error("Connection is lost, quit master..."); - //ask to the manager to properly remove the master - Exit(); - //UGLY temporary way to be sure the thread does not call code possibly causing a deadlock in JackEngine. - ThreadExit(); - break; - - default: - break; - } - */ - #ifdef JACK_MONITOR fNetTimeMon->AddLast((((float)(GetMicroSeconds() - begin_time)) / (float) fPeriodUsecs) * 100.f); #endif @@ -551,15 +528,17 @@ namespace Jack { jack_log("JackNetMasterManager::JackNetMasterManager"); - fManagerClient = client; - fManagerName = jack_get_client_name(fManagerClient); + fClient = client; + fName = jack_get_client_name(fClient); fGlobalID = 0; fRunning = true; fAutoConnect = false; const JSList* node; const jack_driver_param_t* param; - + + jack_on_shutdown(fClient, SetShutDown, this); + // Possibly use env variable const char* default_udp_port = getenv("JACK_NETJACK_PORT"); fSocket.SetPort((default_udp_port) ? atoi(default_udp_port) : DEFAULT_PORT); @@ -595,15 +574,15 @@ namespace Jack } //set sync callback - jack_set_sync_callback(fManagerClient, SetSyncCallback, this); + jack_set_sync_callback(fClient, SetSyncCallback, this); //activate the client (for sync callback) - if (jack_activate(fManagerClient) != 0) { + if (jack_activate(fClient) != 0) { jack_error("Can't activate the NetManager client, transport disabled"); } //launch the manager thread - if (jack_client_create_thread(fManagerClient, &fManagerThread, 0, 0, NetManagerThread, this)) { + if (jack_client_create_thread(fClient, &fThread, 0, 0, NetManagerThread, this)) { jack_error("Can't create the NetManager control thread"); } } @@ -611,15 +590,7 @@ namespace Jack JackNetMasterManager::~JackNetMasterManager() { jack_log("JackNetMasterManager::~JackNetMasterManager"); - jack_info("Exiting NetManager..."); - fRunning = false; - jack_client_kill_thread(fManagerClient, fManagerThread); - master_list_t::iterator it; - for (it = fMasterList.begin(); it != fMasterList.end(); it++) { - delete(*it); - } - fSocket.Close(); - SocketAPIEnd(); + ShutDown(); } int JackNetMasterManager::CountIO(int flags) @@ -628,10 +599,10 @@ namespace Jack int count = 0; jack_port_t* port; - ports = jack_get_ports(fManagerClient, NULL, NULL, flags); + ports = jack_get_ports(fClient, NULL, NULL, flags); if (ports != NULL) { while (ports[count] - && (port = jack_port_by_name(fManagerClient, ports[count])) + && (port = jack_port_by_name(fClient, ports[count])) && (strcmp(jack_port_type(port), JACK_DEFAULT_AUDIO_TYPE) == 0)) { count++; } @@ -639,6 +610,27 @@ namespace Jack } return count; } + + void JackNetMasterManager::SetShutDown(void* arg) + { + static_cast(arg)->ShutDown(); + } + + void JackNetMasterManager::ShutDown() + { + jack_log("JackNetMasterManager::ShutDown"); + if (fRunning) { + jack_client_kill_thread(fClient, fThread); + fRunning = false; + } + master_list_t::iterator it; + for (it = fMasterList.begin(); it != fMasterList.end(); it++) { + delete(*it); + } + fMasterList.clear(); + fSocket.Close(); + SocketAPIEnd(); + } int JackNetMasterManager::SetSyncCallback(jack_transport_state_t state, jack_position_t* pos, void* arg) { @@ -719,6 +711,7 @@ namespace Jack session_params_t net_params; rx_bytes = fSocket.CatchHost(&net_params, sizeof(session_params_t), 0); SessionParamsNToH(&net_params, &host_params); + if ((rx_bytes == SOCKET_ERROR) && (fSocket.GetError() != NET_NO_DATA)) { jack_error("Error in receive : %s", StrError(NET_ERROR_CODE)); if (++attempt == 10) { @@ -728,7 +721,7 @@ namespace Jack } if (rx_bytes == sizeof(session_params_t)) { - switch (GetPacketType (&host_params)) + switch (GetPacketType(&host_params)) { case SLAVE_AVAILABLE: if ((net_master = InitMaster(host_params))) { @@ -764,8 +757,8 @@ namespace Jack //settings fSocket.GetName(params.fMasterNetName); params.fID = ++fGlobalID; - params.fSampleRate = jack_get_sample_rate(fManagerClient); - params.fPeriodSize = jack_get_buffer_size(fManagerClient); + params.fSampleRate = jack_get_sample_rate(fClient); + params.fPeriodSize = jack_get_buffer_size(fClient); if (params.fSendAudioChannels == -1) { params.fSendAudioChannels = CountIO(JackPortIsPhysical | JackPortIsOutput); @@ -875,7 +868,7 @@ extern "C" SERVER_EXPORT void jack_finish(void* arg) { if (master_manager) { - jack_log ("Unloading Master Manager"); + jack_log("Unloading Master Manager"); delete master_manager; master_manager = NULL; } diff --git a/common/JackNetManager.h b/common/JackNetManager.h index 60d53b10..c88a09ba 100644 --- a/common/JackNetManager.h +++ b/common/JackNetManager.h @@ -39,14 +39,15 @@ namespace Jack friend class JackNetMasterManager; private: - + static int SetProcess(jack_nframes_t nframes, void* arg); static int SetBufferSize(jack_nframes_t nframes, void* arg); static void SetTimebaseCallback(jack_transport_state_t state, jack_nframes_t nframes, jack_position_t* pos, int new_pos, void* arg); + static void SetConnectCallback(jack_port_id_t a, jack_port_id_t b, int connect, void* arg); //jack client - jack_client_t* fJackClient; - const char* fClientName; + jack_client_t* fClient; + const char* fName; //jack ports jack_port_t** fAudioCapturePorts; @@ -74,6 +75,7 @@ namespace Jack int Process(); void TimebaseCallback(jack_position_t* pos); void ConnectPorts(); + void ConnectCallback(jack_port_id_t a, jack_port_id_t b, int connect); public: @@ -96,14 +98,15 @@ namespace Jack private: + static void SetShutDown(void* arg); static int SetSyncCallback(jack_transport_state_t state, jack_position_t* pos, void* arg); static void* NetManagerThread(void* arg); - jack_client_t* fManagerClient; - const char* fManagerName; + jack_client_t* fClient; + const char* fName; char fMulticastIP[32]; JackNetSocket fSocket; - jack_native_thread_t fManagerThread; + jack_native_thread_t fThread; master_list_t fMasterList; uint32_t fGlobalID; bool fRunning; @@ -115,6 +118,7 @@ namespace Jack int KillMaster(session_params_t* params); int SyncCallback(jack_transport_state_t state, jack_position_t* pos); int CountIO(int flags); + void ShutDown(); public: diff --git a/common/JackNetOneDriver.cpp b/common/JackNetOneDriver.cpp index ca012864..fd213bac 100644 --- a/common/JackNetOneDriver.cpp +++ b/common/JackNetOneDriver.cpp @@ -56,7 +56,7 @@ JackNetOneDriver::JackNetOneDriver(const char* name, const char* alias, JackLock #ifdef WIN32 WSADATA wsa; - int rc = WSAStartup(MAKEWORD(2, 0), &wsa); + WSAStartup(MAKEWORD(2, 0), &wsa); #endif netjack_init(& (this->netj), @@ -753,6 +753,7 @@ JackNetOneDriver::render_jack_ports_to_payload (int bitdepth, JSList *playback_p extern "C" { #endif + SERVER_EXPORT jack_driver_desc_t* driver_get_descriptor () { jack_driver_desc_t * desc; diff --git a/common/JackNetSocket.h b/common/JackNetSocket.h index 8df45c41..ea4f98c8 100644 --- a/common/JackNetSocket.h +++ b/common/JackNetSocket.h @@ -20,7 +20,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #ifndef __JackNetSocket__ #define __JackNetSocket__ -#include "JackError.h" +#include "JackCompilerDeps.h" + #include #include #include @@ -29,7 +30,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. namespace Jack { //get host name********************************* - SERVER_EXPORT int GetHostName ( char * name, int size ); + SERVER_EXPORT int GetHostName(char * name, int size); //net errors *********************************** enum _net_error diff --git a/common/JackNetTool.cpp b/common/JackNetTool.cpp index bd41449c..09b96954 100644 --- a/common/JackNetTool.cpp +++ b/common/JackNetTool.cpp @@ -18,6 +18,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "JackNetTool.h" +#include "JackError.h" #ifdef __APPLE__ @@ -274,7 +275,7 @@ namespace Jack *active_port_address = htonl(port_index); active_port_address++; active_ports++; - assert(active_ports < 256); + assert(active_ports < 256); } } @@ -306,7 +307,6 @@ namespace Jack // Count active ports int active_ports = 0; for (int port_index = 0; port_index < fNPorts; port_index++) { - if (fPortBuffer[port_index]) { active_ports++; } @@ -627,7 +627,7 @@ namespace Jack int NetCeltAudioBuffer::RenderFromJackPorts() { - float buffer[fPeriodSize]; + float buffer[BUFFER_SIZE_MAX]; for (int port_index = 0; port_index < fNPorts; port_index++) { if (fPortBuffer[port_index]) { diff --git a/common/JackPort.cpp b/common/JackPort.cpp index a556fef0..ae3dbc31 100644 --- a/common/JackPort.cpp +++ b/common/JackPort.cpp @@ -49,6 +49,8 @@ bool JackPort::Allocate(int refnum, const char* port_name, const char* port_type fPlaybackLatency.min = fPlaybackLatency.max = 0; fCaptureLatency.min = fCaptureLatency.max = 0; fTied = NO_PORT; + fAlias1[0] = '\0'; + fAlias2[0] = '\0'; // DB: At this point we do not know current buffer size in frames, // but every time buffer will be returned to any user, // it will be called with either ClearBuffer or MixBuffers diff --git a/common/JackPort.h b/common/JackPort.h index 687a5a2a..f7a601ed 100644 --- a/common/JackPort.h +++ b/common/JackPort.h @@ -58,7 +58,7 @@ class SERVER_EXPORT JackPort bool fInUse; jack_port_id_t fTied; // Locally tied source port - jack_default_audio_sample_t fBuffer[BUFFER_SIZE_MAX + 4]; + jack_default_audio_sample_t fBuffer[BUFFER_SIZE_MAX + 8]; bool IsUsed() const { @@ -108,7 +108,7 @@ class SERVER_EXPORT JackPort // Since we are in shared memory, the resulting pointer cannot be cached, so align it here... jack_default_audio_sample_t* GetBuffer() { - return (jack_default_audio_sample_t*)((uintptr_t)fBuffer & ~15L) + 4; + return (jack_default_audio_sample_t*)((uintptr_t)fBuffer & ~31L) + 8; } int GetRefNum() const; diff --git a/common/JackRequest.h b/common/JackRequest.h index aa65f602..206454a5 100644 --- a/common/JackRequest.h +++ b/common/JackRequest.h @@ -22,7 +22,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define __JackRequest__ #include "JackConstants.h" +#include "JackError.h" #include "JackPlatformPlug.h" +#include "JackChannel.h" #include "JackTime.h" #include "types.h" #include @@ -33,7 +35,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. namespace Jack { -#define CheckRes(exp) { if ((exp) < 0) return -1; } +#define CheckRes(exp) { if ((exp) < 0) { jack_error("CheckRes error"); return -1; } } +#define CheckSize() { CheckRes(trans->Read(&fSize, sizeof(int))); if (fSize != Size()) { jack_error("CheckSize error size = %d Size() = %d", fSize, Size()); return -1; } } /*! \brief Session API constants. @@ -90,25 +93,32 @@ struct JackRequest }; RequestType fType; + int fSize; - JackRequest(): fType((RequestType)0) + JackRequest(): fType((RequestType)0), fSize(0) {} - JackRequest(RequestType type): fType(type) + JackRequest(RequestType type): fType(type), fSize(0) {} virtual ~JackRequest() {} - virtual int Read(JackChannelTransaction* trans) + virtual int Read(detail::JackChannelTransactionInterface* trans) { return trans->Read(&fType, sizeof(RequestType)); } - virtual int Write(JackChannelTransaction* trans) + virtual int Write(detail::JackChannelTransactionInterface* trans) { return -1; } + + virtual int Write(detail::JackChannelTransactionInterface* trans, int size) { - return trans->Write(&fType, sizeof(RequestType)); + fSize = size; + CheckRes(trans->Write(&fType, sizeof(RequestType))); + return trans->Write(&fSize, sizeof(int)); } + + virtual int Size() { return 0; } }; @@ -128,12 +138,12 @@ struct JackResult virtual ~JackResult() {} - virtual int Read(JackChannelTransaction* trans) + virtual int Read(detail::JackChannelTransactionInterface* trans) { return trans->Read(&fResult, sizeof(int)); } - virtual int Write(JackChannelTransaction* trans) + virtual int Write(detail::JackChannelTransactionInterface* trans) { return trans->Write(&fResult, sizeof(int)); } @@ -161,8 +171,9 @@ struct JackClientCheckRequest : public JackRequest snprintf(fName, sizeof(fName), "%s", name); } - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); CheckRes(trans->Read(&fName, sizeof(fName))); CheckRes(trans->Read(&fProtocol, sizeof(int))); CheckRes(trans->Read(&fOptions, sizeof(int))); @@ -170,15 +181,17 @@ struct JackClientCheckRequest : public JackRequest return trans->Read(&fOpen, sizeof(int)); } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); CheckRes(trans->Write(&fName, sizeof(fName))); CheckRes(trans->Write(&fProtocol, sizeof(int))); CheckRes(trans->Write(&fOptions, sizeof(int))); CheckRes(trans->Write(&fUUID, sizeof(int))); return trans->Write(&fOpen, sizeof(int)); } + + int Size() { return sizeof(fName) + 4 * sizeof(int); } }; @@ -200,7 +213,7 @@ struct JackClientCheckResult : public JackResult snprintf(fName, sizeof(fName), "%s", name); } - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { CheckRes(JackResult::Read(trans)); CheckRes(trans->Read(&fName, sizeof(fName))); @@ -208,7 +221,7 @@ struct JackClientCheckResult : public JackResult return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { CheckRes(JackResult::Write(trans)); CheckRes(trans->Write(&fName, sizeof(fName))); @@ -238,21 +251,24 @@ struct JackClientOpenRequest : public JackRequest fUUID = uuid; } - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); CheckRes(trans->Read(&fPID, sizeof(int))); CheckRes(trans->Read(&fUUID, sizeof(int))); return trans->Read(&fName, sizeof(fName)); } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); CheckRes(trans->Write(&fPID, sizeof(int))); CheckRes(trans->Write(&fUUID, sizeof(int))); return trans->Write(&fName, sizeof(fName)); } + int Size() { return 2 * sizeof(int) + sizeof(fName); } + }; /*! @@ -273,7 +289,7 @@ struct JackClientOpenResult : public JackResult : JackResult(result), fSharedEngine(index1), fSharedClient(index2), fSharedGraph(index3) {} - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { CheckRes(JackResult::Read(trans)); CheckRes(trans->Read(&fSharedEngine, sizeof(int))); @@ -282,7 +298,7 @@ struct JackClientOpenResult : public JackResult return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { CheckRes(JackResult::Write(trans)); CheckRes(trans->Write(&fSharedEngine, sizeof(int))); @@ -307,17 +323,19 @@ struct JackClientCloseRequest : public JackRequest JackClientCloseRequest(int refnum): JackRequest(JackRequest::kClientClose), fRefNum(refnum) {} - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); return trans->Read(&fRefNum, sizeof(int)); } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); return trans->Write(&fRefNum, sizeof(int)); } + int Size() { return sizeof(int); } }; /*! @@ -336,19 +354,21 @@ struct JackActivateRequest : public JackRequest : JackRequest(JackRequest::kActivateClient), fRefNum(refnum), fIsRealTime(is_real_time) {} - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); CheckRes(trans->Read(&fRefNum, sizeof(int))); return trans->Read(&fIsRealTime, sizeof(int)); } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); CheckRes(trans->Write(&fRefNum, sizeof(int))); return trans->Write(&fIsRealTime, sizeof(int)); } + int Size() { return 2 * sizeof(int); } }; /*! @@ -365,17 +385,19 @@ struct JackDeactivateRequest : public JackRequest JackDeactivateRequest(int refnum): JackRequest(JackRequest::kDeactivateClient), fRefNum(refnum) {} - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); return trans->Read(&fRefNum, sizeof(int)); } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); return trans->Write(&fRefNum, sizeof(int)); } + int Size() { return sizeof(int); } }; /*! @@ -400,8 +422,9 @@ struct JackPortRegisterRequest : public JackRequest strcpy(fPortType, port_type); } - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fName, sizeof(fName))); CheckRes(trans->Read(&fPortType, sizeof(fPortType))); @@ -410,9 +433,9 @@ struct JackPortRegisterRequest : public JackRequest return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fName, sizeof(fName))); CheckRes(trans->Write(&fPortType, sizeof(fPortType))); @@ -420,6 +443,8 @@ struct JackPortRegisterRequest : public JackRequest CheckRes(trans->Write(&fBufferSize, sizeof(unsigned int))); return 0; } + + int Size() { return sizeof(int) + sizeof(fName) + sizeof(fPortType) + 2 * sizeof(unsigned int); } }; @@ -435,13 +460,13 @@ struct JackPortRegisterResult : public JackResult JackPortRegisterResult(): JackResult(), fPortIndex(NO_PORT) {} - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { CheckRes(JackResult::Read(trans)); return trans->Read(&fPortIndex, sizeof(jack_port_id_t)); } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { CheckRes(JackResult::Write(trans)); return trans->Write(&fPortIndex, sizeof(jack_port_id_t)); @@ -465,21 +490,23 @@ struct JackPortUnRegisterRequest : public JackRequest : JackRequest(JackRequest::kUnRegisterPort), fRefNum(refnum), fPortIndex(index) {} - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fPortIndex, sizeof(jack_port_id_t))); return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fPortIndex, sizeof(jack_port_id_t))); return 0; } + int Size() { return sizeof(int) + sizeof(jack_port_id_t); } }; /*! @@ -502,23 +529,25 @@ struct JackPortConnectNameRequest : public JackRequest strcpy(fDst, dst_name); } - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fSrc, sizeof(fSrc))); CheckRes(trans->Read(&fDst, sizeof(fDst))); return 0; - } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fSrc, sizeof(fSrc))); CheckRes(trans->Write(&fDst, sizeof(fDst))); return 0; } + + int Size() { return sizeof(int) + sizeof(fSrc) + sizeof(fDst); } }; @@ -542,23 +571,26 @@ struct JackPortDisconnectNameRequest : public JackRequest strcpy(fDst, dst_name); } - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fSrc, sizeof(fSrc))); CheckRes(trans->Read(&fDst, sizeof(fDst))); return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fSrc, sizeof(fSrc))); CheckRes(trans->Write(&fDst, sizeof(fDst))); return 0; } + int Size() { return sizeof(int) + sizeof(fSrc) + sizeof(fDst); } + }; /*! @@ -578,23 +610,25 @@ struct JackPortConnectRequest : public JackRequest : JackRequest(JackRequest::kConnectPorts), fRefNum(refnum), fSrc(src), fDst(dst) {} - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fSrc, sizeof(jack_port_id_t))); CheckRes(trans->Read(&fDst, sizeof(jack_port_id_t))); return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fSrc, sizeof(jack_port_id_t))); CheckRes(trans->Write(&fDst, sizeof(jack_port_id_t))); return 0; } + int Size() { return sizeof(int) + sizeof(jack_port_id_t) + sizeof(jack_port_id_t); } }; /*! @@ -614,23 +648,25 @@ struct JackPortDisconnectRequest : public JackRequest : JackRequest(JackRequest::kDisconnectPorts), fRefNum(refnum), fSrc(src), fDst(dst) {} - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fSrc, sizeof(jack_port_id_t))); CheckRes(trans->Read(&fDst, sizeof(jack_port_id_t))); return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fSrc, sizeof(jack_port_id_t))); CheckRes(trans->Write(&fDst, sizeof(jack_port_id_t))); return 0; } + int Size() { return sizeof(int) + sizeof(jack_port_id_t) + sizeof(jack_port_id_t); } }; /*! @@ -652,23 +688,25 @@ struct JackPortRenameRequest : public JackRequest strcpy(fName, name); } - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fPort, sizeof(jack_port_id_t))); CheckRes(trans->Read(&fName, sizeof(fName))); return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fPort, sizeof(jack_port_id_t))); CheckRes(trans->Write(&fName, sizeof(fName))); return 0; - } + + int Size() { return sizeof(int) + sizeof(jack_port_id_t) + sizeof(fName); } }; @@ -687,17 +725,19 @@ struct JackSetBufferSizeRequest : public JackRequest : JackRequest(JackRequest::kSetBufferSize), fBufferSize(buffer_size) {} - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); return trans->Read(&fBufferSize, sizeof(jack_nframes_t)); } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); return trans->Write(&fBufferSize, sizeof(jack_nframes_t)); } + int Size() { return sizeof(jack_nframes_t); } }; /*! @@ -715,16 +755,19 @@ struct JackSetFreeWheelRequest : public JackRequest : JackRequest(JackRequest::kSetFreeWheel), fOnOff(onoff) {} - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); return trans->Read(&fOnOff, sizeof(int)); } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); return trans->Write(&fOnOff, sizeof(int)); } + + int Size() { return sizeof(int); } }; @@ -739,17 +782,19 @@ struct JackComputeTotalLatenciesRequest : public JackRequest : JackRequest(JackRequest::kComputeTotalLatencies) {} - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); return 0; } + int Size() { return 0; } }; /*! @@ -767,16 +812,19 @@ struct JackReleaseTimebaseRequest : public JackRequest : JackRequest(JackRequest::kReleaseTimebase), fRefNum(refnum) {} - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); return trans->Read(&fRefNum, sizeof(int)); } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); return trans->Write(&fRefNum, sizeof(int)); } + + int Size() { return sizeof(int); } }; @@ -796,19 +844,21 @@ struct JackSetTimebaseCallbackRequest : public JackRequest : JackRequest(JackRequest::kSetTimebaseCallback), fRefNum(refnum), fConditionnal(conditional) {} - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); CheckRes(trans->Read(&fRefNum, sizeof(int))); return trans->Read(&fConditionnal, sizeof(int)); } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); CheckRes(trans->Write(&fRefNum, sizeof(int))); return trans->Write(&fConditionnal, sizeof(int)); } + int Size() { return sizeof(int) + sizeof(int); } }; /*! @@ -827,19 +877,21 @@ struct JackGetInternalClientNameRequest : public JackRequest : JackRequest(JackRequest::kGetInternalClientName), fRefNum(refnum), fIntRefNum(int_ref) {} - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); CheckRes(trans->Read(&fRefNum, sizeof(int))); return trans->Read(&fIntRefNum, sizeof(int)); } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); CheckRes(trans->Write(&fRefNum, sizeof(int))); return trans->Write(&fIntRefNum, sizeof(int)); } + int Size() { return sizeof(int) + sizeof(int); } }; /*! @@ -859,20 +911,21 @@ struct JackGetInternalClientNameResult : public JackResult snprintf(fName, sizeof(fName), "%s", name); } - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { CheckRes(JackResult::Read(trans)); CheckRes(trans->Read(&fName, sizeof(fName))); return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { CheckRes(JackResult::Write(trans)); CheckRes(trans->Write(&fName, sizeof(fName))); return 0; } + int Size() { return sizeof(fName); } }; /*! @@ -893,19 +946,21 @@ struct JackInternalClientHandleRequest : public JackRequest snprintf(fName, sizeof(fName), "%s", client_name); } - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); CheckRes(trans->Read(&fRefNum, sizeof(int))); return trans->Read(&fName, sizeof(fName)); } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); CheckRes(trans->Write(&fRefNum, sizeof(int))); return trans->Write(&fName, sizeof(fName)); } + int Size() { return sizeof(int) + sizeof(fName); } }; /*! @@ -924,7 +979,7 @@ struct JackInternalClientHandleResult : public JackResult : JackResult(result), fStatus(status), fIntRefNum(int_ref) {} - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { CheckRes(JackResult::Read(trans)); CheckRes(trans->Read(&fStatus, sizeof(int))); @@ -932,7 +987,7 @@ struct JackInternalClientHandleResult : public JackResult return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { CheckRes(JackResult::Write(trans)); CheckRes(trans->Write(&fStatus, sizeof(int))); @@ -940,6 +995,7 @@ struct JackInternalClientHandleResult : public JackResult return 0; } + int Size() { return sizeof(int) + sizeof(int); } }; /*! @@ -971,8 +1027,9 @@ struct JackInternalClientLoadRequest : public JackRequest snprintf(fLoadInitName, sizeof(fLoadInitName), "%s", objet_data); } - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fName, sizeof(fName))); CheckRes(trans->Read(&fDllName, sizeof(fDllName))); @@ -981,9 +1038,9 @@ struct JackInternalClientLoadRequest : public JackRequest return trans->Read(&fOptions, sizeof(int)); } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fName, sizeof(fName))); CheckRes(trans->Write(&fDllName, sizeof(fDllName))); @@ -992,6 +1049,7 @@ struct JackInternalClientLoadRequest : public JackRequest return trans->Write(&fOptions, sizeof(int)); } + int Size() { return sizeof(int) + sizeof(fName) + sizeof(fDllName) + sizeof(fLoadInitName) + 2 * sizeof(int); } }; /*! @@ -1010,7 +1068,7 @@ struct JackInternalClientLoadResult : public JackResult : JackResult(result), fStatus(status), fIntRefNum(int_ref) {} - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { CheckRes(JackResult::Read(trans)); CheckRes(trans->Read(&fStatus, sizeof(int))); @@ -1018,7 +1076,7 @@ struct JackInternalClientLoadResult : public JackResult return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { CheckRes(JackResult::Write(trans)); CheckRes(trans->Write(&fStatus, sizeof(int))); @@ -1026,6 +1084,7 @@ struct JackInternalClientLoadResult : public JackResult return 0; } + int Size() { return sizeof(int) + sizeof(int); } }; /*! @@ -1044,18 +1103,21 @@ struct JackInternalClientUnloadRequest : public JackRequest : JackRequest(JackRequest::kInternalClientUnload), fRefNum(refnum), fIntRefNum(int_ref) {} - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); CheckRes(trans->Read(&fRefNum, sizeof(int))); return trans->Read(&fIntRefNum, sizeof(int)); } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); CheckRes(trans->Write(&fRefNum, sizeof(int))); return trans->Write(&fIntRefNum, sizeof(int)); } + + int Size() { return sizeof(int) + sizeof(int); } }; /*! @@ -1073,20 +1135,21 @@ struct JackInternalClientUnloadResult : public JackResult : JackResult(result), fStatus(status) {} - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { CheckRes(JackResult::Read(trans)); CheckRes(trans->Read(&fStatus, sizeof(int))); return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { CheckRes(JackResult::Write(trans)); CheckRes(trans->Write(&fStatus, sizeof(int))); return 0; } + int Size() { return sizeof(int); } }; /*! @@ -1106,22 +1169,25 @@ struct JackClientNotificationRequest : public JackRequest : JackRequest(JackRequest::kNotification), fRefNum(refnum), fNotify(notify), fValue(value) {} - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fNotify, sizeof(int))); CheckRes(trans->Read(&fValue, sizeof(int))); return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fNotify, sizeof(int))); CheckRes(trans->Write(&fValue, sizeof(int))); return 0; } + + int Size() { return 3 * sizeof(int); } }; @@ -1156,7 +1222,7 @@ struct JackSessionNotifyResult : public JackResult : JackResult(result), fDone(false) {} - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { if (trans == NULL) { @@ -1183,7 +1249,7 @@ struct JackSessionNotifyResult : public JackResult return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { if (trans == NULL) { @@ -1257,8 +1323,9 @@ struct JackSessionNotifyRequest : public JackRequest } } - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); CheckRes(trans->Read(&fRefNum, sizeof(fRefNum))); CheckRes(trans->Read(&fPath, sizeof(fPath))); CheckRes(trans->Read(&fDst, sizeof(fDst))); @@ -1266,9 +1333,9 @@ struct JackSessionNotifyRequest : public JackRequest return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); CheckRes(trans->Write(&fRefNum, sizeof(fRefNum))); CheckRes(trans->Write(&fPath, sizeof(fPath))); CheckRes(trans->Write(&fDst, sizeof(fDst))); @@ -1276,6 +1343,7 @@ struct JackSessionNotifyRequest : public JackRequest return 0; } + int Size() { return sizeof(fRefNum) + sizeof(fPath) + sizeof(fDst) + sizeof(fEventType); } }; struct JackSessionReplyRequest : public JackRequest @@ -1289,19 +1357,22 @@ struct JackSessionReplyRequest : public JackRequest : JackRequest(JackRequest::kSessionReply), fRefNum(refnum) {} - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { - CheckRes(trans->Read(&fRefNum, sizeof(fRefNum))); + CheckSize(); + CheckRes(trans->Read(&fRefNum, sizeof(int))); return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); - CheckRes(trans->Write(&fRefNum, sizeof(fRefNum))); + CheckRes(JackRequest::Write(trans, Size())); + CheckRes(trans->Write(&fRefNum, sizeof(int))); return 0; } + int Size() { return sizeof(int); } + }; struct JackClientNameResult : public JackResult @@ -1316,20 +1387,20 @@ struct JackClientNameResult : public JackResult snprintf(fName, sizeof(fName), "%s", name); } - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { CheckRes(JackResult::Read(trans)); CheckRes(trans->Read(&fName, sizeof(fName))); return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { CheckRes(JackResult::Write(trans)); CheckRes(trans->Write(&fName, sizeof(fName))); return 0; } - + }; struct JackUUIDResult : public JackResult @@ -1344,14 +1415,14 @@ struct JackUUIDResult : public JackResult snprintf(fUUID, sizeof(fUUID), "%s", uuid); } - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { CheckRes(JackResult::Read(trans)); CheckRes(trans->Read(&fUUID, sizeof(fUUID))); return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { CheckRes(JackResult::Write(trans)); CheckRes(trans->Write(&fUUID, sizeof(fUUID))); @@ -1373,19 +1444,22 @@ struct JackGetUUIDRequest : public JackRequest strncpy(fName, client_name, sizeof(fName)); } - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); CheckRes(trans->Read(&fName, sizeof(fName))); return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); CheckRes(trans->Write(&fName, sizeof(fName))); return 0; } + int Size() { return sizeof(fName); } + }; struct JackGetClientNameRequest : public JackRequest @@ -1401,19 +1475,22 @@ struct JackGetClientNameRequest : public JackRequest strncpy(fUUID, uuid, sizeof(fUUID)); } - int Read(JackChannelTransaction* trans) - { + int Read(detail::JackChannelTransactionInterface* trans) + { + CheckSize(); CheckRes(trans->Read(&fUUID, sizeof(fUUID))); return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); CheckRes(trans->Write(&fUUID, sizeof(fUUID))); return 0; } + int Size() { return sizeof(fUUID); } + }; struct JackReserveNameRequest : public JackRequest @@ -1432,23 +1509,26 @@ struct JackReserveNameRequest : public JackRequest strncpy(fUUID, uuid, sizeof(fUUID)); } - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); CheckRes(trans->Read(&fUUID, sizeof(fUUID))); CheckRes(trans->Read(&fName, sizeof(fName))); CheckRes(trans->Read(&fRefNum, sizeof(fRefNum))); return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); CheckRes(trans->Write(&fUUID, sizeof(fUUID))); CheckRes(trans->Write(&fName, sizeof(fName))); CheckRes(trans->Write(&fRefNum, sizeof(fRefNum))); return 0; } + int Size() { return sizeof(fUUID) + sizeof(fName) + sizeof(fRefNum); } + }; struct JackClientHasSessionCallbackRequest : public JackRequest @@ -1464,19 +1544,22 @@ struct JackClientHasSessionCallbackRequest : public JackRequest strncpy(fName, name, sizeof(fName)); } - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); CheckRes(trans->Read(&fName, sizeof(fName))); return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { - CheckRes(JackRequest::Write(trans)); + CheckRes(JackRequest::Write(trans, Size())); CheckRes(trans->Write(&fName, sizeof(fName))); return 0; } + int Size() { return sizeof(fName); } + }; /*! @@ -1485,6 +1568,7 @@ struct JackClientHasSessionCallbackRequest : public JackRequest struct JackClientNotification { + int fSize; char fName[JACK_CLIENT_NAME_SIZE + 1]; int fRefNum; int fNotify; @@ -1500,10 +1584,12 @@ struct JackClientNotification { snprintf(fName, sizeof(fName), "%s", name); snprintf(fMessage, sizeof(fMessage), "%s", message); + fSize = Size(); } - int Read(JackChannelTransaction* trans) + int Read(detail::JackChannelTransactionInterface* trans) { + CheckSize(); CheckRes(trans->Read(&fName, sizeof(fName))); CheckRes(trans->Read(&fRefNum, sizeof(int))); CheckRes(trans->Read(&fNotify, sizeof(int))); @@ -1514,8 +1600,9 @@ struct JackClientNotification return 0; } - int Write(JackChannelTransaction* trans) + int Write(detail::JackChannelTransactionInterface* trans) { + CheckRes(trans->Write(&fSize, sizeof(int))); CheckRes(trans->Write(&fName, sizeof(fName))); CheckRes(trans->Write(&fRefNum, sizeof(int))); CheckRes(trans->Write(&fNotify, sizeof(int))); @@ -1525,6 +1612,8 @@ struct JackClientNotification CheckRes(trans->Write(&fMessage, sizeof(fMessage))); return 0; } + + int Size() { return sizeof(int) + sizeof(fName) + 5 * sizeof(int) + sizeof(fMessage); } }; diff --git a/common/JackRequestDecoder.cpp b/common/JackRequestDecoder.cpp new file mode 100644 index 00000000..884b9510 --- /dev/null +++ b/common/JackRequestDecoder.cpp @@ -0,0 +1,351 @@ +/* +Copyright (C) 2012 Grame + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#include "JackRequestDecoder.h" +#include "JackServer.h" +#include "JackLockedEngine.h" +#include "JackChannel.h" + +#include +#include + +using namespace std; + +namespace Jack +{ + +#define CheckRead(req, socket) { if (req.Read(socket) < 0) { jack_error("CheckRead error"); return -1; } } +#define CheckWriteName(error, socket) { if (res.Write(socket) < 0) { jack_error("%s write error name = %s", error, req.fName); } } +#define CheckWriteRefNum(error, socket) { if (res.Write(socket) < 0) { jack_error("%s write error ref = %d", error, req.fRefNum); } } +#define CheckWrite(error, socket) { if (res.Write(socket) < 0) { jack_error("%s write error", error); } } + +JackRequestDecoder::JackRequestDecoder(JackServer* server, JackClientHandlerInterface* handler) + :fServer(server), fHandler(handler) +{} + +JackRequestDecoder::~JackRequestDecoder() +{} + +int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* socket, int type_aux) +{ + JackRequest::RequestType type = (JackRequest::RequestType)type_aux; + + // Read data + switch (type) { + + case JackRequest::kClientCheck: { + jack_log("JackRequest::ClientCheck"); + JackClientCheckRequest req; + JackClientCheckResult res; + CheckRead(req, socket); + res.fResult = fServer->GetEngine()->ClientCheck(req.fName, req.fUUID, res.fName, req.fProtocol, req.fOptions, &res.fStatus); + CheckWriteName("JackRequest::ClientCheck", socket); + // Atomic ClientCheck followed by ClientOpen on same socket + if (req.fOpen) { + JackRequest header; + header.Read(socket); + return HandleRequest(socket, header.fType); + } + break; + } + + case JackRequest::kClientOpen: { + jack_log("JackRequest::ClientOpen"); + JackClientOpenRequest req; + JackClientOpenResult res; + CheckRead(req, socket); + fHandler->ClientAdd(socket, &req, &res); + CheckWriteName("JackRequest::ClientOpen", socket); + break; + } + + case JackRequest::kClientClose: { + jack_log("JackRequest::ClientClose"); + JackClientCloseRequest req; + JackResult res; + CheckRead(req, socket); + res.fResult = fServer->GetEngine()->ClientExternalClose(req.fRefNum); + CheckWriteRefNum("JackRequest::ClientClose", socket); + fHandler->ClientRemove(socket, req.fRefNum); + // Will cause the wrapping thread to stop + return -1; + } + + case JackRequest::kActivateClient: { + JackActivateRequest req; + JackResult res; + jack_log("JackRequest::ActivateClient"); + CheckRead(req, socket); + res.fResult = fServer->GetEngine()->ClientActivate(req.fRefNum, req.fIsRealTime); + CheckWriteRefNum("JackRequest::ActivateClient", socket); + break; + } + + case JackRequest::kDeactivateClient: { + jack_log("JackRequest::DeactivateClient"); + JackDeactivateRequest req; + JackResult res; + CheckRead(req, socket); + res.fResult = fServer->GetEngine()->ClientDeactivate(req.fRefNum); + CheckWriteRefNum("JackRequest::DeactivateClient", socket); + break; + } + + case JackRequest::kRegisterPort: { + jack_log("JackRequest::RegisterPort"); + JackPortRegisterRequest req; + JackPortRegisterResult res; + CheckRead(req, socket); + res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fPortType, req.fFlags, req.fBufferSize, &res.fPortIndex); + CheckWriteRefNum("JackRequest::RegisterPort", socket); + break; + } + + case JackRequest::kUnRegisterPort: { + jack_log("JackRequest::UnRegisterPort"); + JackPortUnRegisterRequest req; + JackResult res; + CheckRead(req, socket); + res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex); + CheckWriteRefNum("JackRequest::UnRegisterPort", socket); + break; + } + + case JackRequest::kConnectNamePorts: { + jack_log("JackRequest::ConnectNamePorts"); + JackPortConnectNameRequest req; + JackResult res; + CheckRead(req, socket); + res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); + CheckWriteRefNum("JackRequest::ConnectNamePorts", socket); + break; + } + + case JackRequest::kDisconnectNamePorts: { + jack_log("JackRequest::DisconnectNamePorts"); + JackPortDisconnectNameRequest req; + JackResult res; + CheckRead(req, socket); + res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); + CheckWriteRefNum("JackRequest::DisconnectNamePorts", socket); + break; + } + + case JackRequest::kConnectPorts: { + jack_log("JackRequest::ConnectPorts"); + JackPortConnectRequest req; + JackResult res; + CheckRead(req, socket); + res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); + CheckWriteRefNum("JackRequest::ConnectPorts", socket); + break; + } + + case JackRequest::kDisconnectPorts: { + jack_log("JackRequest::DisconnectPorts"); + JackPortDisconnectRequest req; + JackResult res; + CheckRead(req, socket); + res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); + CheckWriteRefNum("JackRequest::DisconnectPorts", socket); + break; + } + + case JackRequest::kPortRename: { + jack_log("JackRequest::PortRename"); + JackPortRenameRequest req; + JackResult res; + CheckRead(req, socket); + res.fResult = fServer->GetEngine()->PortRename(req.fRefNum, req.fPort, req.fName); + CheckWriteRefNum("JackRequest::PortRename", socket); + break; + } + + case JackRequest::kSetBufferSize: { + jack_log("JackRequest::SetBufferSize"); + JackSetBufferSizeRequest req; + JackResult res; + CheckRead(req, socket); + res.fResult = fServer->SetBufferSize(req.fBufferSize); + CheckWrite("JackRequest::SetBufferSize", socket); + break; + } + + case JackRequest::kSetFreeWheel: { + jack_log("JackRequest::SetFreeWheel"); + JackSetFreeWheelRequest req; + JackResult res; + CheckRead(req, socket); + res.fResult = fServer->SetFreewheel(req.fOnOff); + CheckWrite("JackRequest::SetFreeWheel", socket); + break; + } + + case JackRequest::kComputeTotalLatencies: { + jack_log("JackRequest::ComputeTotalLatencies"); + JackComputeTotalLatenciesRequest req; + JackResult res; + CheckRead(req, socket); + res.fResult = fServer->GetEngine()->ComputeTotalLatencies(); + CheckWrite("JackRequest::ComputeTotalLatencies", socket); + break; + } + + case JackRequest::kReleaseTimebase: { + jack_log("JackRequest::ReleaseTimebase"); + JackReleaseTimebaseRequest req; + JackResult res; + CheckRead(req, socket); + res.fResult = fServer->ReleaseTimebase(req.fRefNum); + CheckWriteRefNum("JackRequest::ReleaseTimebase", socket); + break; + } + + case JackRequest::kSetTimebaseCallback: { + jack_log("JackRequest::SetTimebaseCallback"); + JackSetTimebaseCallbackRequest req; + JackResult res; + CheckRead(req, socket); + res.fResult = fServer->SetTimebaseCallback(req.fRefNum, req.fConditionnal); + CheckWriteRefNum("JackRequest::SetTimebaseCallback", socket); + break; + } + + case JackRequest::kGetInternalClientName: { + jack_log("JackRequest::GetInternalClientName"); + JackGetInternalClientNameRequest req; + JackGetInternalClientNameResult res; + CheckRead(req, socket); + res.fResult = fServer->GetEngine()->GetInternalClientName(req.fIntRefNum, res.fName); + CheckWriteRefNum("JackRequest::GetInternalClientName", socket); + break; + } + + case JackRequest::kInternalClientHandle: { + jack_log("JackRequest::InternalClientHandle"); + JackInternalClientHandleRequest req; + JackInternalClientHandleResult res; + CheckRead(req, socket); + res.fResult = fServer->GetEngine()->InternalClientHandle(req.fName, &res.fStatus, &res.fIntRefNum); + CheckWriteRefNum("JackRequest::InternalClientHandle", socket); + break; + } + + case JackRequest::kInternalClientLoad: { + jack_log("JackRequest::InternalClientLoad"); + JackInternalClientLoadRequest req; + JackInternalClientLoadResult res; + CheckRead(req, socket); + res.fResult = fServer->InternalClientLoad1(req.fName, req.fDllName, req.fLoadInitName, req.fOptions, &res.fIntRefNum, req.fUUID, &res.fStatus); + CheckWriteName("JackRequest::InternalClientLoad", socket); + break; + } + + case JackRequest::kInternalClientUnload: { + jack_log("JackRequest::InternalClientUnload"); + JackInternalClientUnloadRequest req; + JackInternalClientUnloadResult res; + CheckRead(req, socket); + res.fResult = fServer->GetEngine()->InternalClientUnload(req.fIntRefNum, &res.fStatus); + CheckWriteRefNum("JackRequest::InternalClientUnload", socket); + break; + } + + case JackRequest::kNotification: { + jack_log("JackRequest::Notification"); + JackClientNotificationRequest req; + CheckRead(req, socket); + if (req.fNotify == kQUIT) { + jack_log("JackRequest::Notification kQUIT"); + throw JackQuitException(); + } else { + fServer->Notify(req.fRefNum, req.fNotify, req.fValue); + } + break; + } + + case JackRequest::kSessionNotify: { + jack_log("JackRequest::SessionNotify"); + JackSessionNotifyRequest req; + CheckRead(req, socket); + fServer->GetEngine()->SessionNotify(req.fRefNum, req.fDst, req.fEventType, req.fPath, socket, NULL); + break; + } + + case JackRequest::kSessionReply: { + jack_log("JackRequest::SessionReply"); + JackSessionReplyRequest req; + JackResult res; + CheckRead(req, socket); + res.fResult = fServer->GetEngine()->SessionReply(req.fRefNum); + CheckWrite("JackRequest::SessionReply", socket); + break; + } + + case JackRequest::kGetClientByUUID: { + jack_log("JackRequest::GetClientByUUID"); + JackGetClientNameRequest req; + JackClientNameResult res; + CheckRead(req, socket); + res.fResult = fServer->GetEngine()->GetClientNameForUUID(req.fUUID, res.fName); + CheckWrite("JackRequest::GetClientByUUID", socket); + break; + } + + case JackRequest::kGetUUIDByClient: { + jack_log("JackRequest::GetUUIDByClient"); + JackGetUUIDRequest req; + JackUUIDResult res; + CheckRead(req, socket); + res.fResult = fServer->GetEngine()->GetUUIDForClientName(req.fName, res.fUUID); + CheckWrite("JackRequest::GetUUIDByClient", socket); + break; + } + + case JackRequest::kReserveClientName: { + jack_log("JackRequest::ReserveClientName"); + JackReserveNameRequest req; + JackResult res; + CheckRead(req, socket); + res.fResult = fServer->GetEngine()->ReserveClientName(req.fName, req.fUUID); + CheckWrite("JackRequest::ReserveClientName", socket); + break; + } + + case JackRequest::kClientHasSessionCallback: { + jack_log("JackRequest::ClientHasSessionCallback"); + JackClientHasSessionCallbackRequest req; + JackResult res; + CheckRead(req, socket); + res.fResult = fServer->GetEngine()->ClientHasSessionCallback(req.fName); + CheckWrite("JackRequest::ClientHasSessionCallback", socket); + break; + } + + default: + jack_error("Unknown request %ld", type); + return -1; + } + + return 0; +} + +} // end of namespace + + diff --git a/common/JackRequestDecoder.h b/common/JackRequestDecoder.h new file mode 100644 index 00000000..f23caede --- /dev/null +++ b/common/JackRequestDecoder.h @@ -0,0 +1,63 @@ +/* +Copyright (C) 2012 Grame + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifndef __JackRequestDecoder__ +#define __JackRequestDecoder__ + +#include "JackChannel.h" + +namespace Jack +{ + +class JackServer; +struct JackClientOpenRequest; +struct JackClientOpenResult; + +struct JackClientHandlerInterface { + + virtual void ClientAdd(detail::JackChannelTransactionInterface* socket, JackClientOpenRequest* req, JackClientOpenResult* res) = 0; + virtual void ClientRemove(detail::JackChannelTransactionInterface* socket, int refnum) = 0; + + virtual ~JackClientHandlerInterface() + {} + +}; + +/*! +\brief Request decoder +*/ + +class JackRequestDecoder +{ + private: + + JackServer* fServer; + JackClientHandlerInterface* fHandler; + + public: + + JackRequestDecoder(JackServer* server, JackClientHandlerInterface* handler); + virtual ~JackRequestDecoder(); + + int HandleRequest(detail::JackChannelTransactionInterface* socket, int type); +}; + +} // end of namespace + +#endif diff --git a/common/JackResampler.cpp b/common/JackResampler.cpp index 4077de34..a9183c42 100644 --- a/common/JackResampler.cpp +++ b/common/JackResampler.cpp @@ -18,6 +18,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "JackResampler.h" +#include "JackError.h" #include namespace Jack diff --git a/common/JackResampler.h b/common/JackResampler.h index 89334c77..8dfbefce 100644 --- a/common/JackResampler.h +++ b/common/JackResampler.h @@ -22,7 +22,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "ringbuffer.h" #include "types.h" -#include "JackError.h" namespace Jack { diff --git a/common/JackServer.cpp b/common/JackServer.cpp index fb0dfea5..8b0cb056 100644 --- a/common/JackServer.cpp +++ b/common/JackServer.cpp @@ -78,7 +78,9 @@ JackServer::~JackServer() int JackServer::Open(jack_driver_desc_t* driver_desc, JSList* driver_params) { // TODO: move that in reworked JackServerGlobals::Init() - JackMessageBuffer::Create(); + if (!JackMessageBuffer::Create()) { + jack_error("Cannot create message buffer"); + } if ((fAudioDriver = fDriverInfo->Open(driver_desc, fEngine, GetSynchroTable(), driver_params)) == NULL) { jack_error("Cannot initialize driver"); @@ -140,6 +142,7 @@ int JackServer::Close() fEngine->Close(); // TODO: move that in reworked JackServerGlobals::Destroy() JackMessageBuffer::Destroy(); + EndTime(); return 0; } @@ -188,6 +191,8 @@ int JackServer::Stop() { jack_log("JackServer::Stop"); fChannel.Stop(); + + fEngine->ShutDown(); if (fFreewheel) { return fThreadedFreewheelDriver->Stop(); diff --git a/common/JackServer.h b/common/JackServer.h index bdbd8ea8..04032721 100644 --- a/common/JackServer.h +++ b/common/JackServer.h @@ -24,6 +24,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "JackCompilerDeps.h" #include "driver_interface.h" #include "JackDriverLoader.h" +#include "JackDriverInfo.h" #include "JackConnectionManager.h" #include "JackGlobals.h" #include "JackPlatformPlug.h" diff --git a/common/JackServerAPI.cpp b/common/JackServerAPI.cpp index 56ef70ae..9af1f9d5 100644 --- a/common/JackServerAPI.cpp +++ b/common/JackServerAPI.cpp @@ -47,10 +47,6 @@ extern "C" using namespace Jack; -static jack_client_t * jack_client_open_aux (const char *client_name, - jack_options_t options, - jack_status_t *status, va_list ap); - jack_client_t* jack_client_new_aux(const char* client_name, jack_options_t options, jack_status_t* status) { jack_varargs_t va; /* variable arguments */ @@ -155,9 +151,8 @@ jack_client_t* jack_client_open_aux(const char* client_name, jack_options_t opti SERVER_EXPORT jack_client_t* jack_client_open(const char* ext_client_name, jack_options_t options, jack_status_t* status, ...) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_client_open"); -#endif + try { assert(JackGlobals::fOpenMutex); JackGlobals::fOpenMutex->Lock(); @@ -178,9 +173,8 @@ SERVER_EXPORT jack_client_t* jack_client_open(const char* ext_client_name, jack_ SERVER_EXPORT int jack_client_close(jack_client_t* ext_client) { -#ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_client_close"); -#endif + assert(JackGlobals::fOpenMutex); JackGlobals::fOpenMutex->Lock(); int res = -1; diff --git a/common/JackShmMem.h b/common/JackShmMem.h index 397434fc..1905b321 100644 --- a/common/JackShmMem.h +++ b/common/JackShmMem.h @@ -33,11 +33,11 @@ namespace Jack { -SERVER_EXPORT void LockMemoryImp(void* ptr, size_t size); -SERVER_EXPORT void InitLockMemoryImp(void* ptr, size_t size); -SERVER_EXPORT void UnlockMemoryImp(void* ptr, size_t size); -SERVER_EXPORT void LockAllMemory(); -SERVER_EXPORT void UnlockAllMemory(); +void LockMemoryImp(void* ptr, size_t size); +void InitLockMemoryImp(void* ptr, size_t size); +void UnlockMemoryImp(void* ptr, size_t size); +void LockAllMemory(); +void UnlockAllMemory(); class JackMem { diff --git a/common/JackTime.h b/common/JackTime.h index 505903c6..7e4c96e8 100644 --- a/common/JackTime.h +++ b/common/JackTime.h @@ -30,10 +30,12 @@ extern "C" #endif SERVER_EXPORT void InitTime(); + SERVER_EXPORT void EndTime(); SERVER_EXPORT jack_time_t GetMicroSeconds(void); SERVER_EXPORT void JackSleep(long usec); - SERVER_EXPORT void SetClockSource(jack_timer_type_t source); - SERVER_EXPORT const char* ClockSourceName(jack_timer_type_t source); + + void SetClockSource(jack_timer_type_t source); + const char* ClockSourceName(jack_timer_type_t source); #ifdef __cplusplus } diff --git a/common/JackTools.cpp b/common/JackTools.cpp index b9cec837..58ca9b11 100644 --- a/common/JackTools.cpp +++ b/common/JackTools.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #ifdef WIN32 #include @@ -36,11 +37,7 @@ namespace Jack { void JackTools::KillServer() { -#ifdef WIN32 - exit(1); -#else - kill(GetPID(), SIGINT); -#endif + raise(SIGINT); } void JackTools::ThrowJackNetException() @@ -294,5 +291,6 @@ void BuildClientPath(char* path_to_so, int path_len, const char* so_name) #endif + } // end of namespace diff --git a/common/JackTools.h b/common/JackTools.h index 64be2e23..d7a2ab49 100644 --- a/common/JackTools.h +++ b/common/JackTools.h @@ -36,10 +36,8 @@ #endif #include "jslist.h" -#include "driver_interface.h" #include "JackCompilerDeps.h" #include "JackError.h" -#include "JackException.h" #include #include @@ -112,114 +110,115 @@ namespace Jack std::string fName; public: - JackGnuPlotMonitor ( uint32_t measure_cnt = 512, uint32_t measure_points = 5, std::string name = std::string ( "default" ) ) - { - jack_log ( "JackGnuPlotMonitor::JackGnuPlotMonitor %u measure points - %u measures", measure_points, measure_cnt ); - - fMeasureCnt = measure_cnt; - fMeasurePoints = measure_points; - fTablePos = 0; - fName = name; - fCurrentMeasure = new T[fMeasurePoints]; - fMeasureTable = new T*[fMeasureCnt]; - for ( uint32_t cnt = 0; cnt < fMeasureCnt; cnt++ ) - { - fMeasureTable[cnt] = new T[fMeasurePoints]; - fill_n ( fMeasureTable[cnt], fMeasurePoints, 0 ); - } - } - - ~JackGnuPlotMonitor() - { - jack_log ( "JackGnuPlotMonitor::~JackGnuPlotMonitor" ); - - for ( uint32_t cnt = 0; cnt < fMeasureCnt; cnt++ ) - delete[] fMeasureTable[cnt]; - delete[] fMeasureTable; - delete[] fCurrentMeasure; - } - - T AddNew ( T measure_point ) - { - fMeasureId = 0; - return fCurrentMeasure[fMeasureId++] = measure_point; - } - - uint32_t New() - { - return fMeasureId = 0; - } - - T Add ( T measure_point ) - { - return fCurrentMeasure[fMeasureId++] = measure_point; - } - - uint32_t AddLast ( T measure_point ) - { - fCurrentMeasure[fMeasureId] = measure_point; - fMeasureId = 0; - return Write(); - } - - uint32_t Write() - { - for ( uint32_t point = 0; point < fMeasurePoints; point++ ) - fMeasureTable[fTablePos][point] = fCurrentMeasure[point]; - if ( ++fTablePos == fMeasureCnt ) - fTablePos = 0; - return fTablePos; - } + JackGnuPlotMonitor(uint32_t measure_cnt, uint32_t measure_points, std::string name) + { + jack_log ( "JackGnuPlotMonitor::JackGnuPlotMonitor %u measure points - %u measures", measure_points, measure_cnt ); + + fMeasureCnt = measure_cnt; + fMeasurePoints = measure_points; + fTablePos = 0; + fName = name; + fCurrentMeasure = new T[fMeasurePoints]; + fMeasureTable = new T*[fMeasureCnt]; + for ( uint32_t cnt = 0; cnt < fMeasureCnt; cnt++ ) + { + fMeasureTable[cnt] = new T[fMeasurePoints]; + std::fill_n ( fMeasureTable[cnt], fMeasurePoints, 0 ); + } + } + + ~JackGnuPlotMonitor() + { + jack_log ( "JackGnuPlotMonitor::~JackGnuPlotMonitor" ); + + for ( uint32_t cnt = 0; cnt < fMeasureCnt; cnt++ ) + delete[] fMeasureTable[cnt]; + delete[] fMeasureTable; + delete[] fCurrentMeasure; + } + + T AddNew(T measure_point) + { + fMeasureId = 0; + return fCurrentMeasure[fMeasureId++] = measure_point; + } + + uint32_t New() + { + return fMeasureId = 0; + } + + T Add(T measure_point) + { + return fCurrentMeasure[fMeasureId++] = measure_point; + } + + uint32_t AddLast(T measure_point) + { + fCurrentMeasure[fMeasureId] = measure_point; + fMeasureId = 0; + return Write(); + } + + uint32_t Write() + { + for ( uint32_t point = 0; point < fMeasurePoints; point++ ) + fMeasureTable[fTablePos][point] = fCurrentMeasure[point]; + if ( ++fTablePos == fMeasureCnt ) + fTablePos = 0; + return fTablePos; + } + + int Save(std::string name = std::string ( "" )) + { + std::string filename = ( name.empty() ) ? fName : name; + filename += ".log"; + + jack_log ( "JackGnuPlotMonitor::Save filename %s", filename.c_str() ); + + std::ofstream file ( filename.c_str() ); + + for ( uint32_t cnt = 0; cnt < fMeasureCnt; cnt++ ) + { + for ( uint32_t point = 0; point < fMeasurePoints; point++ ) + file << fMeasureTable[cnt][point] << " \t"; + file << std::endl; + } + + file.close(); + return 0; + } + + int SetPlotFile(std::string* options_list, uint32_t options_number, + std::string* field_names, uint32_t field_number, + std::string name = std::string ( "" )) + { + std::string title = ( name.empty() ) ? fName : name; + std::string plot_filename = title + ".plt"; + std::string data_filename = title + ".log"; + + std::ofstream file ( plot_filename.c_str() ); + + file << "set multiplot" << std::endl; + file << "set grid" << std::endl; + file << "set title \"" << title << "\"" << std::endl; + + for ( uint32_t i = 0; i < options_number; i++ ) + file << options_list[i] << std::endl; + + file << "plot "; + for ( uint32_t row = 1; row <= field_number; row++ ) + { + file << "\"" << data_filename << "\" using " << row << " title \"" << field_names[row-1] << "\" with lines"; + file << ( ( row < field_number ) ? ", " : "\n" ); + } + + jack_log ( "JackGnuPlotMonitor::SetPlotFile - Save GnuPlot file to '%s'", plot_filename.c_str() ); + + file.close(); + return 0; + } - int Save ( std::string name = std::string ( "" ) ) - { - std::string filename = ( name.empty() ) ? fName : name; - filename += ".log"; - - jack_log ( "JackGnuPlotMonitor::Save filename %s", filename.c_str() ); - - std::ofstream file ( filename.c_str() ); - - for ( uint32_t cnt = 0; cnt < fMeasureCnt; cnt++ ) - { - for ( uint32_t point = 0; point < fMeasurePoints; point++ ) - file << fMeasureTable[cnt][point] << " \t"; - file << std::endl; - } - - file.close(); - return 0; - } - - int SetPlotFile ( std::string* options_list = NULL, uint32_t options_number = 0, - std::string* field_names = NULL, uint32_t field_number = 0, - std::string name = std::string ( "" ) ) - { - std::string title = ( name.empty() ) ? fName : name; - std::string plot_filename = title + ".plt"; - std::string data_filename = title + ".log"; - - std::ofstream file ( plot_filename.c_str() ); - - file << "set multiplot" << std::endl; - file << "set grid" << std::endl; - file << "set title \"" << title << "\"" << std::endl; - - for ( uint32_t i = 0; i < options_number; i++ ) - file << options_list[i] << std::endl; - - file << "plot "; - for ( uint32_t row = 1; row <= field_number; row++ ) - { - file << "\"" << data_filename << "\" using " << row << " title \"" << field_names[row-1] << "\" with lines"; - file << ( ( row < field_number ) ? ", " : "\n" ); - } - - jack_log ( "JackGnuPlotMonitor::SetPlotFile - Save GnuPlot file to '%s'", plot_filename.c_str() ); - - file.close(); - return 0; - } }; void BuildClientPath(char* path_to_so, int path_len, const char* so_name); diff --git a/common/JackWeakAPI.c b/common/JackWeakAPI.c index ab907e60..21ec03e9 100644 --- a/common/JackWeakAPI.c +++ b/common/JackWeakAPI.c @@ -44,8 +44,11 @@ static HMODULE libjack_handle = 0; #else static void *libjack_handle = 0; #endif - +#ifndef WIN32 static void __attribute__((constructor)) tryload_libjack() +#else +void tryload_libjack() +#endif { if (getenv("SKIP_LIBJACK") == 0) { // just in case libjack is causing troubles.. #ifdef __APPLE__ diff --git a/common/Jackdmp.cpp b/common/Jackdmp.cpp index 724cf249..befff521 100644 --- a/common/Jackdmp.cpp +++ b/common/Jackdmp.cpp @@ -30,8 +30,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "types.h" #include "jack.h" +#include "control.h" + #include "JackConstants.h" -#include "JackDriverLoader.h" +#include "JackPlatformPlug.h" #if defined(JACK_DBUS) && defined(__linux__) #include @@ -86,7 +88,7 @@ static void copyright(FILE* file) { fprintf(file, "jackdmp " VERSION "\n" "Copyright 2001-2005 Paul Davis and others.\n" - "Copyright 2004-2011 Grame.\n" + "Copyright 2004-2012 Grame.\n" "jackdmp comes with ABSOLUTELY NO WARRANTY\n" "This is free software, and you are welcome to redistribute it\n" "under certain conditions; see the file COPYING for details\n"); @@ -130,23 +132,15 @@ static void usage(FILE* file) " to display options for each master backend\n\n"); } -// To put in the control.h interface?? -static jackctl_driver_t * -jackctl_server_get_driver( - jackctl_server_t *server, - const char *driver_name) +// To put in the control.h interface ?? +static jackctl_driver_t * jackctl_server_get_driver(jackctl_server_t *server, const char *driver_name) { - const JSList * node_ptr; - - node_ptr = jackctl_server_get_drivers_list(server); + const JSList * node_ptr = jackctl_server_get_drivers_list(server); - while (node_ptr) - { - if (strcmp(jackctl_driver_get_name((jackctl_driver_t *)node_ptr->data), driver_name) == 0) - { + while (node_ptr) { + if (strcmp(jackctl_driver_get_name((jackctl_driver_t *)node_ptr->data), driver_name) == 0) { return (jackctl_driver_t *)node_ptr->data; } - node_ptr = jack_slist_next(node_ptr); } @@ -167,24 +161,21 @@ static jackctl_internal_t * jackctl_server_get_internal(jackctl_server_t *server return NULL; } -static jackctl_parameter_t * -jackctl_get_parameter( - const JSList * parameters_list, - const char * parameter_name) +static jackctl_parameter_t * jackctl_get_parameter(const JSList * parameters_list, const char * parameter_name) { - while (parameters_list) - { - if (strcmp(jackctl_parameter_get_name((jackctl_parameter_t *)parameters_list->data), parameter_name) == 0) - { + while (parameters_list) { + if (strcmp(jackctl_parameter_get_name((jackctl_parameter_t *)parameters_list->data), parameter_name) == 0) { return (jackctl_parameter_t *)parameters_list->data; } - parameters_list = jack_slist_next(parameters_list); } return NULL; } +// Prototype to be found in libjackserver +extern "C" void silent_jack_error_callback(const char *desc); + int main(int argc, char** argv) { jackctl_server_t * server_ctl; @@ -236,7 +227,7 @@ int main(int argc, char** argv) int do_unlock = 0; int loopback = 0; bool show_version = false; - sigset_t signals; + jackctl_sigmask_t * sigmask; jackctl_parameter_t* param; union jackctl_parameter_value value; @@ -454,12 +445,12 @@ int main(int argc, char** argv) master_driver_args[i] = argv[optind++]; } - if (jackctl_parse_driver_params(master_driver_ctl, master_driver_nargs, master_driver_args)) { + if (jackctl_driver_params_parse(master_driver_ctl, master_driver_nargs, master_driver_args)) { goto destroy_server; } // Setup signals - signals = jackctl_setup_signals(0); + sigmask = jackctl_setup_signals(0); // Open server if (! jackctl_server_open(server_ctl, master_driver_ctl)) { @@ -529,7 +520,7 @@ int main(int argc, char** argv) return_value = 0; // Waits for signal - jackctl_wait_signals(signals); + jackctl_wait_signals(sigmask); stop_server: if (!jackctl_server_stop(server_ctl)) { diff --git a/common/driver_interface.h b/common/driver_interface.h index b67a2546..87b6fae7 100644 --- a/common/driver_interface.h +++ b/common/driver_interface.h @@ -28,6 +28,7 @@ extern "C" #include #include "jslist.h" + #include "JackCompilerDeps.h" #include "JackSystemDeps.h" @@ -75,7 +76,6 @@ typedef struct { typedef struct { uint32_t flags; /**< JACK_CONSTRAINT_FLAG_XXX */ - union { struct { jack_driver_param_value_t min; @@ -124,28 +124,32 @@ typedef struct { } jack_driver_desc_filler_t; -SERVER_EXPORT int jack_parse_driver_params(jack_driver_desc_t * desc, int argc, char* argv[], JSList ** param_ptr); +int jack_parse_driver_params(jack_driver_desc_t * desc, int argc, char* argv[], JSList ** param_ptr); -SERVER_EXPORT jack_driver_desc_t * /* newlly allocated driver descriptor, NULL on failure */ +// To be used by drivers + +SERVER_EXPORT jack_driver_desc_t * /* Newly allocated driver descriptor, NULL on failure */ jack_driver_descriptor_construct( - const char * name, /* driver name */ - jack_driver_type_t type, /* driver type */ - const char * description, /* driver description */ + const char * name, /* Driver name */ + jack_driver_type_t type, /* Driver type */ + const char * description, /* Driver description */ jack_driver_desc_filler_t * filler); /* Pointer to stack var to be supplied to jack_driver_descriptor_add_parameter() as well. Can be NULL for drivers that have no parameters. */ SERVER_EXPORT int /* 0 on failure */ jack_driver_descriptor_add_parameter( - jack_driver_desc_t * driver_descr, /* pointer to driver descriptor as returned by jack_driver_descriptor_construct() */ + jack_driver_desc_t * driver_descr, /* Pointer to driver descriptor as returned by jack_driver_descriptor_construct() */ jack_driver_desc_filler_t * filler, /* Pointer to the stack var that was supplied to jack_driver_descriptor_add_parameter(). */ - const char * name, /* parameter's name */ - char character, /* parameter's character (for getopt, etc) */ + const char * name, /* Parameter's name */ + char character, /* Parameter's character (for getopt, etc) */ jack_driver_param_type_t type, /* The parameter's type */ const jack_driver_param_value_t * value_ptr, /* Pointer to parameter's (default) value */ jack_driver_param_constraint_desc_t * constraint, /* Pointer to parameter constraint descriptor. NULL if there is no constraint */ const char * short_desc, /* A short (~30 chars) description for the user */ const char * long_desc); /* A longer description for the user, if NULL short_desc will be used */ +typedef jack_driver_desc_t * (*JackDriverDescFunction) (); + #ifdef __cplusplus } #endif diff --git a/common/jack/control.h b/common/jack/control.h index 61b393de..33cd77b1 100644 --- a/common/jack/control.h +++ b/common/jack/control.h @@ -29,9 +29,10 @@ #ifndef JACKCTL_H__2EEDAD78_DF4C_4B26_83B7_4FF1A446A47E__INCLUDED #define JACKCTL_H__2EEDAD78_DF4C_4B26_83B7_4FF1A446A47E__INCLUDED +#include #include #include -#if !defined (__sun__) +#if !defined(sun) && !defined(__sun__) #include #endif @@ -81,6 +82,9 @@ typedef struct jackctl_internal jackctl_internal_t; /** opaque type for parameter object */ typedef struct jackctl_parameter jackctl_parameter_t; +/** opaque type for sigmask object */ +typedef struct jackctl_sigmask jackctl_sigmask_t; + #ifdef __cplusplus extern "C" { #endif @@ -102,7 +106,7 @@ extern "C" { * * @return the configurated signal set. */ -sigset_t +jackctl_sigmask_t * jackctl_setup_signals( unsigned int flags); @@ -113,7 +117,7 @@ jackctl_setup_signals( */ void jackctl_wait_signals( - sigset_t signals); + jackctl_sigmask_t * signals); /** * Call this function to create server object. @@ -330,6 +334,21 @@ const JSList * jackctl_driver_get_parameters( jackctl_driver_t * driver); +/** + * Call this function to parse parameters for a driver. + * + * @param driver driver object handle + * @param argc parameter list len + * @param argv parameter list, as an array of char* + * + * @return success status: true - success, false - fail + */ +int +jackctl_driver_params_parse( + jackctl_driver_t * driver, + int argc, + char* argv[]); + /** * Call this function to get name of internal client. * diff --git a/common/jack/jack.h b/common/jack/jack.h index 03d601b0..7efa7c1f 100644 --- a/common/jack/jack.h +++ b/common/jack/jack.h @@ -76,6 +76,11 @@ jack_get_version( const char * jack_get_version_string() JACK_OPTIONAL_WEAK_EXPORT; +/** + * @defgroup ClientFunctions Creating & manipulating clients + * @{ + */ + /** * Open an external client session with a JACK server. This interface * is more complex but more powerful than jack_client_new(). With it, @@ -170,7 +175,7 @@ int jack_internal_client_new (const char *client_name, /** * Remove an internal client from a JACK server. * - * @deprecated Please use jack_internal_client_load(). + * @deprecated Please use jack_internal_client_unload(). */ void jack_internal_client_close (const char *client_name) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT; @@ -198,9 +203,9 @@ int jack_get_client_pid (const char *name) JACK_OPTIONAL_WEAK_EXPORT; /** * @return the pthread ID of the thread running the JACK client side - * code. + * real-time code. */ -jack_native_thread_t jack_client_thread_id (jack_client_t *) JACK_OPTIONAL_WEAK_EXPORT; +jack_native_thread_t jack_client_thread_id (jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT; /*@}*/ @@ -224,7 +229,7 @@ int jack_is_realtime (jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT; * * @deprecated Please use jack_cycle_wait() and jack_cycle_signal() functions. */ -jack_nframes_t jack_thread_wait (jack_client_t*, int status) JACK_OPTIONAL_WEAK_EXPORT; +jack_nframes_t jack_thread_wait (jack_client_t *client, int status) JACK_OPTIONAL_WEAK_EXPORT; /** * Wait until this JACK client should process data. @@ -432,9 +437,9 @@ int jack_set_sample_rate_callback (jack_client_t *client, * * @return 0 on success, otherwise a non-zero error code */ -int jack_set_client_registration_callback (jack_client_t *, - JackClientRegistrationCallback - registration_callback, void *arg) JACK_OPTIONAL_WEAK_EXPORT; +int jack_set_client_registration_callback (jack_client_t *client, + JackClientRegistrationCallback + registration_callback, void *arg) JACK_OPTIONAL_WEAK_EXPORT; /** * Tell the JACK server to call @a registration_callback whenever a @@ -449,7 +454,7 @@ int jack_set_client_registration_callback (jack_client_t *, * * @return 0 on success, otherwise a non-zero error code */ - int jack_set_port_registration_callback (jack_client_t *, + int jack_set_port_registration_callback (jack_client_t *client, JackPortRegistrationCallback registration_callback, void *arg) JACK_OPTIONAL_WEAK_EXPORT; @@ -466,7 +471,7 @@ int jack_set_client_registration_callback (jack_client_t *, * * @return 0 on success, otherwise a non-zero error code */ -int jack_set_port_connect_callback (jack_client_t *, +int jack_set_port_connect_callback (jack_client_t *client, JackPortConnectCallback connect_callback, void *arg) JACK_OPTIONAL_WEAK_EXPORT; @@ -483,7 +488,7 @@ int jack_set_port_connect_callback (jack_client_t *, * * @return 0 on success, otherwise a non-zero error code */ -int jack_set_port_rename_callback (jack_client_t *, +int jack_set_port_rename_callback (jack_client_t *client, JackPortRenameCallback rename_callback, void *arg) JACK_OPTIONAL_WEAK_EXPORT; @@ -500,7 +505,7 @@ int jack_set_port_rename_callback (jack_client_t *, * * @return 0 on success, otherwise a non-zero error code */ -int jack_set_graph_order_callback (jack_client_t *, +int jack_set_graph_order_callback (jack_client_t *client, JackGraphOrderCallback graph_callback, void *) JACK_OPTIONAL_WEAK_EXPORT; @@ -517,7 +522,7 @@ int jack_set_graph_order_callback (jack_client_t *, * * @return 0 on success, otherwise a non-zero error code */ -int jack_set_xrun_callback (jack_client_t *, +int jack_set_xrun_callback (jack_client_t *client, JackXRunCallback xrun_callback, void *arg) JACK_OPTIONAL_WEAK_EXPORT; /*@}*/ @@ -575,7 +580,7 @@ int jack_set_xrun_callback (jack_client_t *, * * @return 0 on success, otherwise a non-zero error code */ -int jack_set_latency_callback (jack_client_t *, +int jack_set_latency_callback (jack_client_t *client, JackLatencyCallback latency_callback, void *) JACK_WEAK_EXPORT; /*@}*/ @@ -713,7 +718,7 @@ jack_port_t * jack_port_register (jack_client_t *client, * * @return 0 on success, otherwise a non-zero error code */ -int jack_port_unregister (jack_client_t *, jack_port_t *) JACK_OPTIONAL_WEAK_EXPORT; +int jack_port_unregister (jack_client_t *client, jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT; /** * This returns a pointer to the memory area associated with the @@ -734,7 +739,7 @@ int jack_port_unregister (jack_client_t *, jack_port_t *) JACK_OPTIONAL_WEAK_EXP * Caching output ports is DEPRECATED in Jack 2.0, due to some new optimization (like "pipelining"). * Port buffers have to be retrieved in each callback for proper functionning. */ -void * jack_port_get_buffer (jack_port_t *, jack_nframes_t) JACK_OPTIONAL_WEAK_EXPORT; +void * jack_port_get_buffer (jack_port_t *port, jack_nframes_t) JACK_OPTIONAL_WEAK_EXPORT; /** * @return the full name of the jack_port_t (including the @a @@ -771,7 +776,7 @@ jack_port_type_id_t jack_port_type_id (const jack_port_t *port) JACK_OPTIONAL_WE /** * @return TRUE if the jack_port_t belongs to the jack_client_t. */ -int jack_port_is_mine (const jack_client_t *, const jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT; +int jack_port_is_mine (const jack_client_t *client, const jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT; /** * @return number of connections to or from @a port. @@ -931,7 +936,7 @@ int jack_port_monitoring_input (jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT; * @return 0 on success, EEXIST if the connection is already made, * otherwise a non-zero error code */ -int jack_connect (jack_client_t *, +int jack_connect (jack_client_t *client, const char *source_port, const char *destination_port) JACK_OPTIONAL_WEAK_EXPORT; @@ -948,7 +953,7 @@ int jack_connect (jack_client_t *, * * @return 0 on success, otherwise a non-zero error code */ -int jack_disconnect (jack_client_t *, +int jack_disconnect (jack_client_t *client, const char *source_port, const char *destination_port) JACK_OPTIONAL_WEAK_EXPORT; @@ -961,7 +966,7 @@ int jack_disconnect (jack_client_t *, * while generic connection clients (e.g. patchbays) would use * jack_disconnect(). */ -int jack_port_disconnect (jack_client_t *, jack_port_t *) JACK_OPTIONAL_WEAK_EXPORT; +int jack_port_disconnect (jack_client_t *client, jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT; /** * @return the maximum number of characters in a full JACK port name @@ -1052,7 +1057,7 @@ size_t jack_port_type_get_buffer_size (jack_client_t *client, const char *port_t * be replaced by a latency callback that calls @ref * jack_port_set_latency_range(). */ -void jack_port_set_latency (jack_port_t *, jack_nframes_t) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT; +void jack_port_set_latency (jack_port_t *port, jack_nframes_t) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT; /** * return the latency range defined by @a mode for @@ -1147,7 +1152,7 @@ void jack_port_set_latency_range (jack_port_t *port, jack_latency_callback_mode_ * @return zero for successful execution of the request. non-zero * otherwise. */ -int jack_recompute_total_latencies (jack_client_t*) JACK_OPTIONAL_WEAK_EXPORT; +int jack_recompute_total_latencies (jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT; /** * @return the time (in frames) between data being available or @@ -1176,7 +1181,7 @@ jack_nframes_t jack_port_get_latency (jack_port_t *port) JACK_OPTIONAL_WEAK_DEPR * be replaced by jack_port_get_latency_range() in any existing * use cases. */ -jack_nframes_t jack_port_get_total_latency (jack_client_t *, +jack_nframes_t jack_port_get_total_latency (jack_client_t *client, jack_port_t *port) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT; /** @@ -1220,7 +1225,7 @@ int jack_recompute_total_latency (jack_client_t*, jack_port_t* port) JACK_OPTION * * @see jack_port_name_size(), jack_port_type_size() */ -const char ** jack_get_ports (jack_client_t *, +const char ** jack_get_ports (jack_client_t *client, const char *port_name_pattern, const char *type_name_pattern, unsigned long flags) JACK_OPTIONAL_WEAK_EXPORT; @@ -1230,7 +1235,7 @@ const char ** jack_get_ports (jack_client_t *, * * @see jack_port_name_size() */ -jack_port_t * jack_port_by_name (jack_client_t *, const char *port_name) JACK_OPTIONAL_WEAK_EXPORT; +jack_port_t * jack_port_by_name (jack_client_t *client, const char *port_name) JACK_OPTIONAL_WEAK_EXPORT; /** * @return address of the jack_port_t of a @a port_id. @@ -1279,6 +1284,55 @@ jack_nframes_t jack_frame_time (const jack_client_t *) JACK_OPTIONAL_WEAK_EXPORT */ jack_nframes_t jack_last_frame_time (const jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT; +/** + * This function may only be used from the process callback. + * It provides the internal cycle timing information as used by + * most of the other time related functions. This allows the + * caller to map between frame counts and microseconds with full + * precision (i.e. without rounding frame times to integers), + * and also provides e.g. the microseconds time of the start of + * the current cycle directly (it has to be computed otherwise). + * + * If the return value is zero, the following information is + * provided in the variables pointed to by the arguments: + * + * current_frames: the frame time counter at the start of the + * current cycle, same as jack_last_frame_time(). + * current_usecs: the microseconds time at the start of the + * current cycle. + * next_usecs: the microseconds time of the start of the next + * next cycle as computed by the DLL. + * period_usecs: the current best estimate of the period time in + * microseconds. + * + * NOTES: + * + * Because of the types used, all the returned values except period_usecs + * are unsigned. In computations mapping between frames and microseconds + * *signed* differences are required. The easiest way is to compute those + * separately and assign them to the appropriate signed variables, + * int32_t for frames and int64_t for usecs. See the implementation of + * jack_frames_to_time() and Jack_time_to_frames() for an example. + * + * Unless there was an xrun, skipped cycles, or the current cycle is the + * first after freewheeling or starting Jack, the value of current_usecs + * will always be the value of next_usecs of the previous cycle. + * + * The value of period_usecs will in general NOT be exactly equal to + * the difference of next_usecs and current_usecs. This is because to + * ensure stability of the DLL and continuity of the mapping, a fraction + * of the loop error must be included in next_usecs. For an accurate + * mapping between frames and microseconds, the difference of next_usecs + * and current_usecs should be used, and not period_usecs. + * + * @return zero if OK, non-zero otherwise. + */ +int jack_get_cycle_times(const jack_client_t *client, + jack_nframes_t *current_frames, + jack_time_t *current_usecs, + jack_time_t *next_usecs, + float *period_usecs) JACK_OPTIONAL_WEAK_EXPORT; + /** * @return the estimated time in microseconds of the specified frame time */ diff --git a/common/jack/net.h b/common/jack/net.h index 4c9a389b..4709b477 100644 --- a/common/jack/net.h +++ b/common/jack/net.h @@ -44,10 +44,10 @@ enum JackNetEncoder { typedef struct { - int audio_input; // from master or to slave (-1 for get master audio physical outputs) - int audio_output; // to master or from slave (-1 for get master audio physical inputs) - int midi_input; // from master or to slave (-1 for get master MIDI physical outputs) - int midi_output; // to master or from slave (-1 for get master MIDI physical inputs) + int audio_input; // from master or to slave (-1 to take master audio physical inputs) + int audio_output; // to master or from slave (-1 to take master audio physical outputs) + int midi_input; // from master or to slave (-1 to take master MIDI physical inputs) + int midi_output; // to master or from slave (-1 to take master MIDI physical outputs) int mtu; // network Maximum Transmission Unit int time_out; // in second, -1 means in infinite int encoder; // encoder type (one of JackNetEncoder) @@ -58,10 +58,10 @@ typedef struct { typedef struct { - int audio_input; // master audio physical outputs - int audio_output; // master audio physical inputs - int midi_input; // master MIDI physical outputs - int midi_output; // master MIDI physical inputs + int audio_input; // master audio physical outputs (-1 to take slave wanted audio inputs) + int audio_output; // master audio physical inputs (-1 to take slave wanted audio outputs) + int midi_input; // master MIDI physical outputs (-1 to take slave wanted MIDI inputs) + int midi_output; // master MIDI physical inputs (-1 to take slave wanted MIDI outputs) jack_nframes_t buffer_size; // mater buffer size jack_nframes_t sample_rate; // mater sample rate char master_name[MASTER_NAME_SIZE]; // master machine name diff --git a/common/jack/systemdeps.h b/common/jack/systemdeps.h index 6b1b8a7f..3c3c064f 100644 --- a/common/jack/systemdeps.h +++ b/common/jack/systemdeps.h @@ -1,5 +1,5 @@ /* -Copyright (C) 2004-2009 Grame +Copyright (C) 2004-2012 Grame This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -20,66 +20,104 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #ifndef __jack_systemdeps_h__ #define __jack_systemdeps_h__ -#if defined(WIN32) && !defined(__CYGWIN__) && !defined(GNU_WIN32) +#ifndef POST_PACKED_STRUCTURE + + #ifdef __GNUC__ + /* POST_PACKED_STRUCTURE needs to be a macro which + expands into a compiler directive. The directive must + tell the compiler to arrange the preceding structure + declaration so that it is packed on byte-boundaries rather + than use the natural alignment of the processor and/or + compiler. + */ + + #define PRE_PACKED_STRUCTURE + #define POST_PACKED_STRUCTURE __attribute__((__packed__)) + + #else + + #ifdef _MSC_VER + #define PRE_PACKED_STRUCTURE1 __pragma(pack(push,1)) + #define PRE_PACKED_STRUCTURE PRE_PACKED_STRUCTURE1 + /* PRE_PACKED_STRUCTURE needs to be a macro which + expands into a compiler directive. The directive must + tell the compiler to arrange the following structure + declaration so that it is packed on byte-boundaries rather + than use the natural alignment of the processor and/or + compiler. + */ + #define POST_PACKED_STRUCTURE ;__pragma(pack(pop)) + /* and POST_PACKED_STRUCTURE needs to be a macro which + restores the packing to its previous setting */ + #else + #define PRE_PACKED_STRUCTURE + #define POST_PACKED_STRUCTURE + #endif -#include - -#ifdef _MSC_VER /* Microsoft compiler */ - #define __inline__ inline - #if (!defined(int8_t) && !defined(_STDINT_H)) - #define __int8_t_defined - typedef char int8_t; - typedef unsigned char uint8_t; - typedef short int16_t; - typedef unsigned short uint16_t; - typedef long int32_t; - typedef unsigned long uint32_t; - typedef LONGLONG int64_t; - typedef ULONGLONG uint64_t; #endif -#elif __MINGW32__ /* MINGW */ - #include - #include -#else /* other compilers ...*/ - #include - #include - #include + #endif -#if !defined(_PTHREAD_H) && !defined(PTHREAD_WIN32) - /** - * to make jack API independent of different thread implementations, - * we define jack_native_thread_t to HANDLE here. - */ - typedef HANDLE jack_native_thread_t; -#else - #ifdef PTHREAD_WIN32 // Added by JE - 10-10-2011 - #include // Makes sure we #include the ptw32 version ! +#if defined(WIN32) && !defined(__CYGWIN__) && !defined(GNU_WIN32) + + #include + + #ifdef _MSC_VER /* Microsoft compiler */ + #define __inline__ inline + #if (!defined(int8_t) && !defined(_STDINT_H)) + #define __int8_t_defined + typedef char int8_t; + typedef unsigned char uint8_t; + typedef short int16_t; + typedef unsigned short uint16_t; + typedef long int32_t; + typedef unsigned long uint32_t; + typedef LONGLONG int64_t; + typedef ULONGLONG uint64_t; + #endif + #elif __MINGW32__ /* MINGW */ + #include + #include + #else /* other compilers ...*/ + #include + #include + #include + #endif + + #if !defined(_PTHREAD_H) && !defined(PTHREAD_WIN32) + /** + * to make jack API independent of different thread implementations, + * we define jack_native_thread_t to HANDLE here. + */ + typedef HANDLE jack_native_thread_t; + #else + #ifdef PTHREAD_WIN32 // Added by JE - 10-10-2011 + #include // Makes sure we #include the ptw32 version ! + #endif + /** + * to make jack API independent of different thread implementations, + * we define jack_native_thread_t to pthread_t here. + */ + typedef pthread_t jack_native_thread_t; #endif - /** - * to make jack API independent of different thread implementations, - * we define jack_native_thread_t to pthread_t here. - */ - typedef pthread_t jack_native_thread_t; -#endif #endif // WIN32 && !__CYGWIN__ && !GNU_WIN32 */ #if defined(__APPLE__) || defined(__linux__) || defined(__sun__) || defined(sun) || defined(__unix__) || defined(__CYGWIN__) || defined(GNU_WIN32) -#if defined(__CYGWIN__) || defined(GNU_WIN32) - #include -#endif - #include - #include - #include + #if defined(__CYGWIN__) || defined(GNU_WIN32) + #include + #endif + #include + #include + #include - /** - * to make jack API independent of different thread implementations, - * we define jack_native_thread_t to pthread_t here. - */ - typedef pthread_t jack_native_thread_t; + /** + * to make jack API independent of different thread implementations, + * we define jack_native_thread_t to pthread_t here. + */ + typedef pthread_t jack_native_thread_t; -#endif /* __APPLE__ || __linux__ || __sun__ || sun */ + #endif /* __APPLE__ || __linux__ || __sun__ || sun */ #endif diff --git a/common/jack/types.h b/common/jack/types.h index a7d06983..fa059159 100644 --- a/common/jack/types.h +++ b/common/jack/types.h @@ -259,6 +259,7 @@ typedef void (*JackLatencyCallback)(jack_latency_callback_mode_t mode, void *arg /** * the new latency API operates on Ranges. */ +PRE_PACKED_STRUCTURE struct _jack_latency_range { /** @@ -269,7 +270,7 @@ struct _jack_latency_range * maximum latency */ jack_nframes_t max; -}; +} POST_PACKED_STRUCTURE; typedef struct _jack_latency_range jack_latency_range_t; @@ -548,7 +549,8 @@ typedef enum { #define JACK_POSITION_MASK (JackPositionBBT|JackPositionTimecode) #define EXTENDED_TIME_INFO -typedef struct { +PRE_PACKED_STRUCTURE +struct _jack_position { /* these four cannot be set from clients: the server sets them */ jack_unique_t unique_1; /**< unique ID */ @@ -614,7 +616,9 @@ typedef struct { /* When (unique_1 == unique_2) the contents are consistent. */ jack_unique_t unique_2; /**< unique ID */ -} jack_position_t; +} POST_PACKED_STRUCTURE; + +typedef struct _jack_position jack_position_t; /** * Prototype for the @a sync_callback defined by slow-sync clients. diff --git a/common/jack/weakmacros.h b/common/jack/weakmacros.h index 9d4959e7..2db602e6 100644 --- a/common/jack/weakmacros.h +++ b/common/jack/weakmacros.h @@ -67,6 +67,10 @@ #endif #endif +#ifndef JACK_WEAK_EXPORT +#define JACK_WEAK_EXPORT +#endif + #ifndef JACK_OPTIONAL_WEAK_EXPORT #define JACK_OPTIONAL_WEAK_EXPORT #endif @@ -82,6 +86,11 @@ #endif #endif /* __GNUC__ */ + +#ifndef JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT +#define JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT +#endif + #endif #endif /* __weakmacros_h__ */ diff --git a/common/netjack.c b/common/netjack.c index 075b97cd..74cdc5df 100644 --- a/common/netjack.c +++ b/common/netjack.c @@ -47,7 +47,7 @@ $Id: net_driver.c,v 1.17 2006/04/16 20:16:10 torbenh Exp $ #include #endif -#ifdef __linux__ +#if defined(HAVE_CONFIG_H) #include "config.h" #endif diff --git a/common/netjack_packet.c b/common/netjack_packet.c index 9434985c..6061db1f 100644 --- a/common/netjack_packet.c +++ b/common/netjack_packet.c @@ -26,7 +26,7 @@ * */ -#ifdef __linux__ +#if defined(HAVE_CONFIG_H) #include "config.h" #endif @@ -75,7 +75,7 @@ #include "netjack_packet.h" #include "JackError.h" -#ifdef NO_JACK_ERROR +#ifdef NO_JACK_ERROR #define jack_error printf #endif @@ -505,11 +505,11 @@ packet_cache_drain_socket( packet_cache *pcache, int sockfd ) cache_packet *cpack; struct sockaddr_in sender_address; #ifdef WIN32 - size_t senderlen = sizeof( struct sockaddr_in ); + int senderlen = sizeof( struct sockaddr_in ); u_long parm = 1; ioctlsocket( sockfd, FIONBIO, &parm ); #else - socklen_t senderlen = sizeof( struct sockaddr_in ); + int senderlen = sizeof( struct sockaddr_in ); #endif while (1) { #ifdef WIN32 diff --git a/common/shm.h b/common/shm.h index 2a6d6096..2ee4e87e 100644 --- a/common/shm.h +++ b/common/shm.h @@ -117,20 +117,17 @@ extern "C" */ PRE_PACKED_STRUCTURE - typedef struct _jack_shm_info { + struct _jack_shm_info { jack_shm_registry_index_t index; /* offset into the registry */ uint32_t size; union { void *attached_at; /* address where attached */ char ptr_size[8]; } ptr; /* a "pointer" that has the same 8 bytes size when compling in 32 or 64 bits */ - } -#ifdef _MSC_VER - jack_shm_info_t; POST_PACKED_STRUCTURE -#else - POST_PACKED_STRUCTURE jack_shm_info_t; -#endif - + } POST_PACKED_STRUCTURE; + + typedef struct _jack_shm_info jack_shm_info_t; + /* utility functions used only within JACK */ void jack_shm_copy_from_registry (jack_shm_info_t*, diff --git a/common/wscript b/common/wscript index 0f98c444..807e5e25 100644 --- a/common/wscript +++ b/common/wscript @@ -15,13 +15,13 @@ def configure(conf): conf.env['BUILD_ADAPTER'] = conf.is_defined('HAVE_SAMPLERATE') def create_jack_process_obj(bld, target, sources, uselib = None): - process = bld.new_task_gen('cxx', 'shlib') - process.env['shlib_PATTERN'] = '%s.so' + process = bld(features = ['cxx', 'cxxshlib']) + process.env['cxxshlib_PATTERN'] = '%s.so' process.defines = ['HAVE_CONFIG_H','SERVER_SIDE'] if bld.env['IS_MACOSX']: env_includes = ['../macosx', '../posix', '../macosx/coreaudio'] if bld.env['IS_LINUX']: - env_includes = ['../linux', '../posix', '../linux/alsa'] + env_includes = ['../linux', '../posix', '../linux/alsa'] if bld.env['IS_SUN']: env_includes = ['../solaris', '../posix', '../solaris/oss'] process.includes = ['.'] + env_includes + ['jack', '..'] @@ -35,7 +35,7 @@ def create_jack_process_obj(bld, target, sources, uselib = None): #process.env.append_value("LINKFLAGS", "-arch i386 -arch ppc -arch x86_64") process.env.append_value("CPPFLAGS", "-fvisibility=hidden") process.install_path = '${ADDON_DIR}/' - process.uselib_local = uselib.name + process.use = [uselib.name] return process def build(bld): @@ -46,6 +46,7 @@ def build(bld): 'JackConnectionManager.cpp', 'ringbuffer.c', 'JackError.cpp', + 'JackException.cpp', 'JackFrameTimer.cpp', 'JackGraphManager.cpp', 'JackPort.cpp', @@ -55,6 +56,7 @@ def build(bld): 'JackMidiAPI.cpp', 'JackEngineControl.cpp', 'JackShmMem.cpp', + 'JackGenericClientChannel.cpp', 'shm.c', 'JackGlobals.cpp', 'JackDebugClient.cpp', @@ -72,8 +74,8 @@ def build(bld): common_libsources += [ '../posix/JackPosixThread.cpp', '../posix/JackPosixSemaphore.cpp', - '../posix/JackFifo.cpp', - '../posix/JackProcessSync.cpp', + '../posix/JackPosixProcessSync.cpp', + '../posix/JackPosixMutex.cpp', '../posix/JackSocket.cpp', '../linux/JackLinuxTime.c', ] @@ -85,7 +87,8 @@ def build(bld): common_libsources += [ '../posix/JackPosixThread.cpp', '../posix/JackFifo.cpp', - '../posix/JackProcessSync.cpp', + '../posix/JackPosixProcessSync.cpp', + '../posix/JackPosixMutex.cpp', '../posix/JackSocket.cpp', '../solaris/JackSolarisTime.c', ] @@ -94,7 +97,7 @@ def build(bld): if bld.env['IS_MACOSX']: common_libsources += [ - '../posix/JackProcessSync.cpp', + '../posix/JackPosixProcessSync.cpp', '../posix/JackPosixThread.cpp', '../macosx/JackMachThread.cpp', '../macosx/JackMachSemaphore.cpp', @@ -103,18 +106,17 @@ def build(bld): ] includes = ['../macosx', '../macosx/RPC', '../posix'] + includes - serverlib = bld.new_task_gen('cxx', 'shlib') - serverlib.features.append('cc') + serverlib = bld(features = ['c', 'cxx', 'cxxshlib', 'cshlib']) serverlib.defines = ['HAVE_CONFIG_H','SERVER_SIDE'] serverlib.includes = includes serverlib.name = 'serverlib' serverlib.target = 'jackserver' - serverlib.uselib = uselib + serverlib.use = uselib serverlib.install_path = '${LIBDIR}' serverlib.source = [] + common_libsources serverlib.source += [ 'JackAudioDriver.cpp', - 'JackTimedDriver.cpp', + 'JackTimedDriver.cpp', 'JackMidiDriver.cpp', 'JackDriver.cpp', 'JackEngine.cpp', @@ -132,6 +134,7 @@ def build(bld): 'JackNetTool.cpp', 'JackNetInterface.cpp', 'JackArgParser.cpp', + 'JackRequestDecoder.cpp', 'JackMidiAsyncQueue.cpp', 'JackMidiAsyncWaitQueue.cpp', 'JackMidiBufferReadQueue.cpp', @@ -185,22 +188,23 @@ def build(bld): serverlib.env.append_value("LINKFLAGS", "-lnsl -lsocket") if bld.env['BUILD_NETLIB'] == True: - netlib = bld.new_task_gen('cxx', 'shlib') - netlib.features.append('cc') + netlib = bld(features = ['c', 'cxx', 'cxxshlib', 'cshlib']) netlib.defines = ['HAVE_CONFIG_H','SERVER_SIDE'] netlib.includes = includes netlib.name = 'netlib' netlib.target = 'jacknet' - netlib.uselib = ['SAMPLERATE', 'CELT', 'PTHREAD' , 'RT'] + netlib.use = ['SAMPLERATE', 'CELT', 'PTHREAD' , 'RT'] netlib.install_path = '${LIBDIR}' netlib.source = [ 'JackNetAPI.cpp', 'JackNetInterface.cpp', 'JackNetTool.cpp', + 'JackException.cpp', 'JackAudioAdapterInterface.cpp', 'JackLibSampleRateResampler.cpp', 'JackResampler.cpp', 'JackGlobals.cpp', + '../posix/JackPosixMutex.cpp', 'ringbuffer.c'] if bld.env['IS_LINUX']: @@ -218,13 +222,12 @@ def build(bld): netlib.vnum = bld.env['JACK_API_VERSION'] - clientlib = bld.new_task_gen('cxx', 'shlib') - clientlib.features.append('cc') + clientlib = bld(features = ['c', 'cxx', 'cxxshlib', 'cshlib']) clientlib.defines = 'HAVE_CONFIG_H' - clientlib.uselib = uselib + clientlib.use = uselib clientlib.install_path = '${LIBDIR}' if bld.env['BUILD_JACKDBUS'] == True and bld.env['BUILD_JACKD'] == False: - clientlib.uselib.append('DBUS-1') + clientlib.use.append('DBUS-1') clientlib.includes = includes clientlib.name = 'clientlib' clientlib.target = 'jack' @@ -268,7 +271,7 @@ def build(bld): clientlib.env.append_value("LINKFLAGS", "-lnsl -lsocket") if bld.env['BUILD_WITH_32_64']: - print "create 32bit lib..." + print("create 32bit lib...") clientlib32bit = clientlib.clone('lib32') create_jack_process_obj(bld, 'netmanager', 'JackNetManager.cpp', serverlib) @@ -285,7 +288,7 @@ def build(bld): if bld.env['BUILD_ADAPTER'] == True: process = create_jack_process_obj(bld, 'netadapter', net_adapter_sources, serverlib) - process.uselib = 'SAMPLERATE' + process.use = 'SAMPLERATE' audio_adapter_sources = [ 'JackResampler.cpp', @@ -299,33 +302,29 @@ def build(bld): audio_adapter_sources += ['../macosx/coreaudio/JackCoreAudioAdapter.cpp'] process = create_jack_process_obj(bld, 'audioadapter', audio_adapter_sources, serverlib) process.env.append_value("LINKFLAGS", "-framework CoreAudio -framework AudioUnit -framework AudioToolbox -framework CoreServices") - process.uselib = 'SAMPLERATE' + process.use = 'SAMPLERATE' if bld.env['BUILD_ADAPTER'] and bld.env['IS_LINUX'] and bld.env['BUILD_DRIVER_ALSA']: audio_adapter_sources += ['../linux/alsa/JackAlsaAdapter.cpp'] process = create_jack_process_obj(bld, 'audioadapter', audio_adapter_sources, serverlib) - process.uselib = ['ALSA', 'SAMPLERATE'] + process.use = ['ALSA', 'SAMPLERATE'] if bld.env['BUILD_ADAPTER'] and bld.env['IS_SUN']: audio_adapter_sources += ['../solaris/oss/JackOSSAdapter.cpp', 'memops.c'] process = create_jack_process_obj(bld, 'audioadapter', audio_adapter_sources, serverlib) - process.uselib = 'SAMPLERATE' + process.use = 'SAMPLERATE' #audio_adapter_sources += ['../windows/JackPortAudioAdapter.cpp'] #process = create_jack_process_obj(bld, 'audioadapter', audio_adapter_sources, serverlib) - bld.install_files('${PREFIX}/include/jack', 'jack/*.h') + bld.install_files('${PREFIX}/include/jack', bld.path.ant_glob('jack/*.h')) # process jack.pc.in -> jack.pc - import misc - obj = bld.new_task_gen('subst') - obj.source = '../jack.pc.in' - obj.target = 'jack.pc' - obj.dict = {'PREFIX': bld.env['PREFIX'], - 'LIBDIR': bld.env['LIBDIR'], - 'INCLUDEDIR': os.path.normpath(bld.env['PREFIX'] + '/include'), - 'SERVERLIB': serverlib.target, - 'JACK_VERSION': bld.env['JACK_VERSION'], - } - obj.install_path = '${LIBDIR}/pkgconfig/' - obj.fun = misc.subst_func + obj = bld( + features = 'subst_pc', + source = '../jack.pc.in', + target = 'jack.pc', + install_path = '${LIBDIR}/pkgconfig/', + INCLUDEDIR = os.path.normpath(bld.env['PREFIX'] + '/include'), + SERVERLIB = serverlib.target, + ) diff --git a/dbus/audio_reserve.c b/dbus/audio_reserve.c index da811c83..aee00af9 100644 --- a/dbus/audio_reserve.c +++ b/dbus/audio_reserve.c @@ -26,7 +26,7 @@ #include "reserve.h" #include "audio_reserve.h" -#include "JackError.h" +#include "jack/control.h" #define DEVICE_MAX 2 diff --git a/dbus/controller_iface_patchbay.c b/dbus/controller_iface_patchbay.c index 5acee604..b0de0892 100644 --- a/dbus/controller_iface_patchbay.c +++ b/dbus/controller_iface_patchbay.c @@ -782,7 +782,7 @@ jack_controller_patchbay_disconnect( ret = jack_disconnect(controller_ptr->client, port1_name, port2_name); if (ret != 0) { - jack_dbus_error(dbus_call_ptr, JACK_DBUS_ERROR_GENERIC, "jack_connect() failed with %d", ret); + jack_dbus_error(dbus_call_ptr, JACK_DBUS_ERROR_GENERIC, "jack_disconnect() failed with %d", ret); return false; } diff --git a/dbus/controller_iface_session_manager.c b/dbus/controller_iface_session_manager.c index 1ea89593..d0341b5f 100644 --- a/dbus/controller_iface_session_manager.c +++ b/dbus/controller_iface_session_manager.c @@ -30,7 +30,7 @@ #include "jackdbus.h" #include "controller_internal.h" #include "jack/session.h" -#include "common/JackError.h" +#include "jack/control.h" #define JACK_DBUS_IFACE_NAME "org.jackaudio.SessionManager" diff --git a/dbus/sigsegv.c b/dbus/sigsegv.c index ea309547..ba4a1e4a 100644 --- a/dbus/sigsegv.c +++ b/dbus/sigsegv.c @@ -33,7 +33,7 @@ char * __cxa_demangle(const char * __mangled_name, char * __output_buffer, size_t * __length, int * __status); #endif -#include "JackError.h" +#include "jack/control.h" #if defined(REG_RIP) # define SIGSEGV_STACK_IA64 @@ -60,6 +60,7 @@ static void signal_segv(int signum, siginfo_t* info, void*ptr) { static const char *si_codes[3] = {"", "SEGV_MAPERR", "SEGV_ACCERR"}; size_t i; + const char *si_code_str; ucontext_t *ucontext = (ucontext_t*)ptr; #if defined(SIGSEGV_STACK_X86) || defined(SIGSEGV_STACK_IA64) @@ -94,9 +95,14 @@ static void signal_segv(int signum, siginfo_t* info, void*ptr) { jack_error("Unknown bad signal catched!"); } + if (info->si_code >= 0 && info->si_code < 3) + si_code_str = si_codes[info->si_code]; + else + si_code_str = "unknown"; + jack_error("info.si_signo = %d", signum); jack_error("info.si_errno = %d", info->si_errno); - jack_error("info.si_code = %d (%s)", info->si_code, si_codes[info->si_code]); + jack_error("info.si_code = %d (%s)", info->si_code, si_code_str); jack_error("info.si_addr = %p", info->si_addr); #if !defined(__alpha__) && !defined(__ia64__) && !defined(__FreeBSD_kernel__) && !defined(__arm__) && !defined(__hppa__) && !defined(__sh__) for(i = 0; i < NGREG; i++) @@ -171,7 +177,9 @@ int setup_sigsegv() { memset(&action, 0, sizeof(action)); action.sa_sigaction = signal_segv; +#ifdef SA_SIGINFO action.sa_flags = SA_SIGINFO; +#endif if(sigaction(SIGSEGV, &action, NULL) < 0) { jack_error("sigaction failed. errno is %d (%s)", errno, strerror(errno)); return 0; diff --git a/dbus/wscript b/dbus/wscript index 703c52c7..b572c1e9 100644 --- a/dbus/wscript +++ b/dbus/wscript @@ -6,19 +6,19 @@ import Options import re # subst_func import Logs -def set_options(opt): +def options(opt): opt.add_option('--enable-pkg-config-dbus-service-dir', action='store_true', default=False, help='force D-Bus service install dir to be one returned by pkg-config') def configure(conf): conf.env['BUILD_JACKDBUS'] = False if not conf.check_cfg(package='dbus-1', atleast_version='1.0.0', args='--cflags --libs') or not conf.is_defined('HAVE_DBUS_1'): - print Logs.colors.RED + 'WARNING !! jackdbus will not be built because libdbus-dev is missing' + Logs.colors.NORMAL + print(Logs.colors.RED + 'WARNING !! jackdbus will not be built because libdbus-dev is missing' + Logs.colors.NORMAL) return dbus_dir = conf.check_cfg(package='dbus-1', args='--variable=session_bus_services_dir') if not dbus_dir: - print Logs.colors.RED + 'WARNING !! jackdbus will not be built because service dir is unknown' + Logs.colors.NORMAL + print(Logs.colors.RED + 'WARNING !! jackdbus will not be built because service dir is unknown' + Logs.colors.NORMAL) return dbus_dir = dbus_dir.strip() @@ -29,20 +29,18 @@ def configure(conf): else: conf.env['DBUS_SERVICES_DIR'] = os.path.normpath(conf.env['PREFIX'] + '/share/dbus-1/services') - conf.check_tool('misc') - conf.check(header_name='expat.h', define_name="HAVE_EXPAT") if conf.is_defined('HAVE_EXPAT'): conf.env['LIB_EXPAT'] = ['expat'] else: - print Logs.colors.RED + 'WARNING !! jackdbus will not be built because of expat is missing' + Logs.colors.NORMAL + print(Logs.colors.RED + 'WARNING !! jackdbus will not be built because of expat is missing' + Logs.colors.NORMAL) return conf.env['BUILD_JACKDBUS'] = True def build(bld): - obj = bld.new_task_gen('cc', 'program') + obj = bld(features = ['c', 'cprogram'], idx=17) if bld.env['IS_LINUX']: sysdeps_dbus_include = ['../linux', '../posix'] if bld.env['IS_MACOSX']: @@ -65,20 +63,19 @@ def build(bld): #'xml_nop.c', 'xml_write_raw.c', 'sigsegv.c', - 'reserve.c', + 'reserve.c', ] + obj.use = ['serverlib'] if bld.env['IS_LINUX']: - obj.uselib = 'PTHREAD DL RT DBUS-1 EXPAT' + obj.use += ['PTHREAD', 'DL', 'RT', 'DBUS-1', 'EXPAT'] if bld.env['IS_MACOSX']: - obj.uselib = 'PTHREAD DL DBUS-1 EXPAT' - obj.uselib_local = 'serverlib' - obj.target = 'jackdbus' + obj.use += ['PTHREAD', 'DL', 'DBUS-1', 'EXPAT'] + obj.target = 'jackdbus' # process org.jackaudio.service.in -> org.jackaudio.service - import misc - obj = bld.new_task_gen('subst') - obj.source = 'org.jackaudio.service.in' - obj.target = 'org.jackaudio.service' - obj.dict = {'BINDIR': bld.env['PREFIX'] + '/bin'} - obj.install_path = '${DBUS_SERVICES_DIR}/' - obj.fun = misc.subst_func + obj = bld( + features = 'subst', + source = 'org.jackaudio.service.in', + target = 'org.jackaudio.service', + install_path = '${DBUS_SERVICES_DIR}/', + BINDIR = bld.env['PREFIX'] + '/bin') diff --git a/doxyfile b/doxyfile index 4c4d302e..ba2e12af 100644 --- a/doxyfile +++ b/doxyfile @@ -31,7 +31,7 @@ PROJECT_NAME = "Jack2" # This could be handy for archiving the generated documentation or # if some version control system is used. -PROJECT_NUMBER = 1.9.8 +PROJECT_NUMBER = 1.9.9 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. diff --git a/example-clients/connect.c b/example-clients/connect.c index 5ed112b0..0f4f8be5 100644 --- a/example-clients/connect.c +++ b/example-clients/connect.c @@ -128,7 +128,10 @@ main (int argc, char *argv[]) return 1; } - if (argc < 3) show_usage(my_name); + if (argc < 3) { + show_usage(my_name); + return 1; + } /* try to become a client of the JACK server */ diff --git a/example-clients/jack_control b/example-clients/jack_control index b90bfd5c..60a2d53a 100755 --- a/example-clients/jack_control +++ b/example-clients/jack_control @@ -116,17 +116,20 @@ def main(): print " dp - get parameters of currently selected driver" print " dpd - get long description for driver parameter" print " dps - set driver parameter" + print " dpr - reset driver parameter to its default value" print " asd - add slave driver" print " rsd - remove slave driver" print " il - get list of available internals" print " ip - get parameters of given internal" print " ipd - get long description for internal parameter" print " ips - set internal parameter" + print " ipr - reset internal parameter to its default value" print " iload - load internal" print " iunload - unload internal" print " ep - get engine parameters" print " epd - get long description for engine parameter" print " eps - set engine parameter" + print " epr - reset engine parameter to its default value" sys.exit(0) bus = dbus.SessionBus() @@ -213,6 +216,16 @@ def main(): type_char, name, short_descr, long_descr = configure_iface.GetParameterInfo(['driver', param]) configure_iface.SetParameterValue(['driver', param], python_type_to_jackdbus_type(value, type_char)) + elif arg == 'dpr': + if index >= len(sys.argv): + print "driver parameter reset command requires parameter name argument" + sys.exit() + + param = sys.argv[index] + index += 1 + + print "--- driver param reset \"%s\"" % param + configure_iface.ResetParameterValue(['driver', param]) elif arg == 'ep': print "--- get engine parameters (type:isset:default:value)" get_parameters(configure_iface, ['engine']) @@ -240,6 +253,18 @@ def main(): print "--- engine param set \"%s\" -> \"%s\"" % (param, value) + type_char, name, short_descr, long_descr = configure_iface.GetParameterInfo(['engine', param]) + configure_iface.SetParameterValue(['engine', param], python_type_to_jackdbus_type(value, type_char)) + elif arg == 'epr': + if index >= len(sys.argv): + print "engine parameter reset command requires parameter name" + sys.exit() + + param = sys.argv[index] + index += 1 + + print "--- engine param reset \"%s\"" % param + type_char, name, short_descr, long_descr = configure_iface.GetParameterInfo(['engine', param]) configure_iface.SetParameterValue(['engine', param], python_type_to_jackdbus_type(value, type_char)) elif arg == 'il': @@ -273,7 +298,7 @@ def main(): print long_descr elif arg == 'ips': if index + 2 >= len(sys.argv): - print "get internal parameter long description command requires internal, parameter name and value arguments" + print "internal parameter set command requires internal, parameter name and value arguments" sys.exit() internal_name = sys.argv[index] @@ -287,6 +312,19 @@ def main(): type_char, name, short_descr, long_descr = configure_iface.GetParameterInfo(['internals', internal_name, param]) configure_iface.SetParameterValue(['internals', internal_name, param], python_type_to_jackdbus_type(value, type_char)) + elif arg == 'ipr': + if index + 1 >= len(sys.argv): + print "reset internal parameter command requires internal and parameter name arguments" + sys.exit() + + internal_name = sys.argv[index] + index += 1 + param = sys.argv[index] + index += 1 + + print "--- internal param reset \"%s\"" % (param + + configure_iface.ResetParameterValue(['internals', internal_name, param]) elif arg == 'iload': print "--- load internal" diff --git a/example-clients/lsp.c b/example-clients/lsp.c index 81700cdc..a8990a58 100644 --- a/example-clients/lsp.c +++ b/example-clients/lsp.c @@ -241,6 +241,10 @@ main (int argc, char *argv[]) } error: + if (show_aliases) { + free(aliases[0]); + free(aliases[1]); + } if (ports) jack_free (ports); jack_client_close (client); diff --git a/example-clients/midi_latency_test.c b/example-clients/midi_latency_test.c index 19ef1bf3..39a36813 100644 --- a/example-clients/midi_latency_test.c +++ b/example-clients/midi_latency_test.c @@ -214,7 +214,7 @@ get_semaphore_error(void) if (! FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), semaphore_error_msg, 1024, NULL)) { - snprintf(semaphore_error_msg, 1023, "Unknown OS error code '%d'", + snprintf(semaphore_error_msg, 1023, "Unknown OS error code '%ld'", error); } return semaphore_error_msg; diff --git a/example-clients/midiseq.c b/example-clients/midiseq.c index 60b3e483..bc0591b0 100644 --- a/example-clients/midiseq.c +++ b/example-clients/midiseq.c @@ -102,7 +102,7 @@ int main(int narg, char **args) loop_index = 0; num_notes = (narg - 3)/3; note_frqs = malloc(num_notes*sizeof(unsigned char)); - note_starts = malloc(num_notes*sizeof(unsigned char)); + note_starts = malloc(num_notes*sizeof(jack_nframes_t)); note_lengths = malloc(num_notes*sizeof(jack_nframes_t)); loop_nsamp = atoi(args[2]); for(i=0; i #include #include +#include #include @@ -99,7 +100,8 @@ main (int argc, char *argv[]) } int i; - jack_master_t request = { -1, -1, -1, -1, buffer_size, sample_rate, "master" }; + jack_master_t request = { 4, 4, -1, -1, buffer_size, sample_rate, "master" }; + //jack_master_t request = { -1, -1, -1, -1, buffer_size, sample_rate, "master" }; jack_slave_t result; float** audio_input_buffer; float** audio_output_buffer; @@ -127,6 +129,7 @@ main (int argc, char *argv[]) #endif // Allocate buffers + audio_input_buffer = (float**)calloc(result.audio_input, sizeof(float*)); for (i = 0; i < result.audio_input; i++) { audio_input_buffer[i] = (float*)calloc(buffer_size, sizeof(float)); @@ -147,6 +150,7 @@ main (int argc, char *argv[]) while (1) { // Copy input to output + assert(result.audio_input == result.audio_output); for (i = 0; i < result.audio_input; i++) { memcpy(audio_output_buffer[i], audio_input_buffer[i], buffer_size * sizeof(float)); } diff --git a/example-clients/netsource.c b/example-clients/netsource.c index 8da4d4f3..e2b916e0 100644 --- a/example-clients/netsource.c +++ b/example-clients/netsource.c @@ -34,7 +34,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include #include -#ifdef __linux__ +#if defined(HAVE_CONFIG_H) #include "config.h" #endif diff --git a/example-clients/server_control.cpp b/example-clients/server_control.cpp index e131c73d..a03e0e26 100644 --- a/example-clients/server_control.cpp +++ b/example-clients/server_control.cpp @@ -144,7 +144,7 @@ int main(int argc, char *argv[]) const JSList * drivers; const JSList * internals; const JSList * node_ptr; - sigset_t signals; + jackctl_sigmask_t * sigmask; int opt, option_index; const char* driver_name = "dummy"; const char* client_name = "audioadapter"; @@ -234,8 +234,8 @@ int main(int argc, char *argv[]) */ - signals = jackctl_setup_signals(0); - jackctl_wait_signals(signals); + sigmask = jackctl_setup_signals(0); + jackctl_wait_signals(sigmask); jackctl_server_stop(server); jackctl_server_close(server); jackctl_server_destroy(server); diff --git a/example-clients/wscript b/example-clients/wscript index 989f1df9..0782bce0 100644 --- a/example-clients/wscript +++ b/example-clients/wscript @@ -42,14 +42,9 @@ def configure(conf): if conf.is_defined('HAVE_SNDFILE'): conf.env['LIB_SNDFILE'] = ['sndfile'] - conf.check_cfg(package='celt', atleast_version='0.5.0', args='--cflags --libs') + conf.check_cfg(package='celt', atleast_version='0.5.0', args='--cflags --libs', mandatory=False) - e = conf.check_cc(header_name='ncurses.h', define_name="HAVE_NCURSES") - - if conf.is_defined('HAVE_NCURSES'): - conf.env['LIB_NCURSES'] = ['ncurses'] - - e = conf.check_cc(lib='readline', define_name="HAVE_READLINE") + e = conf.check_cc(lib='readline', define_name="HAVE_READLINE", mandatory=False) # define_name="HAVE_READLINE" has no effect, LIB_READLINE is defined if readline is available #if conf.is_defined('HAVE_READLINE'): @@ -68,97 +63,94 @@ def build(bld): os_incdir = ['../macosx', '../posix'] if bld.env['IS_SUN']: os_incdir = ['../solaris', '../posix'] - for example_program, example_program_source in example_programs.items(): + for example_program, example_program_source in list(example_programs.items()): if example_program == 'jack_server_control': - uselib_local = 'serverlib' + use = ['serverlib'] elif example_program == 'jack_net_slave': if not bld.env['BUILD_NETLIB']: continue - uselib_local = 'netlib' + use = ['netlib'] elif example_program == 'jack_net_master': if not bld.env['BUILD_NETLIB']: continue - uselib_local = 'netlib' + use = ['netlib'] else: - uselib_local = 'clientlib' + use = ['clientlib'] - prog = bld.new_task_gen('cxx', 'program') - prog.features.append('cc') + prog = bld(features='c cprogram') prog.includes = os_incdir + ['../common/jack', '../common'] prog.source = example_program_source + prog.use = use if bld.env['IS_MACOSX']: prog.env.append_value("CPPFLAGS", "-mmacosx-version-min=10.4 -arch i386 -arch ppc -arch x86_64") #prog.env.append_value("LINKFLAGS", "-arch i386 -arch ppc -arch x86_64") prog.env.append_value("LINKFLAGS", "") if bld.env['IS_LINUX']: - prog.uselib = 'RT' + prog.use += ['RT'] + prog.env.append_value("LINKFLAGS", "-lm") if bld.env['IS_SUN']: prog.env.append_value("LINKFLAGS", "-lm") - prog.uselib_local = uselib_local - prog.target = example_program if bld.env['BUILD_EXAMPLE_CLIENT_TRANSPORT']: - prog = bld.new_task_gen('cc', 'program') + prog = bld(features = 'c cprogram') prog.includes = os_incdir + ['../common/jack', '../common'] prog.source = 'transport.c' + prog.use = ['clientlib'] if bld.env['IS_MACOSX']: prog.env.append_value("CPPFLAGS", "-mmacosx-version-min=10.4 -arch i386 -arch ppc -arch x86_64") #prog.env.append_value("LINKFLAGS", "-arch i386 -arch ppc -arch x86_64") prog.env.append_value("LINKFLAGS", "") if bld.env['IS_LINUX']: - prog.uselib = 'RT READLINE NCURSES' + prog.use += ['RT', 'READLINE', 'NCURSES'] if bld.env['IS_MACOSX']: - prog.uselib = 'READLINE NCURSES' - prog.uselib_local = 'clientlib' + prog.use += ['READLINE', 'NCURSES'] prog.target = 'jack_transport' if bld.env['BUILD_EXAMPLE_CLIENT_REC']: - prog = bld.new_task_gen('cc', 'program') + prog = bld(features = 'c cprogram') prog.includes = os_incdir + ['../common/jack', '../common'] prog.source = 'capture_client.c' + prog.use = ['clientlib'] if bld.env['IS_MACOSX']: prog.env.append_value("CPPFLAGS", "-mmacosx-version-min=10.4 -arch i386 -arch ppc -arch x86_64") #prog.env.append_value("LINKFLAGS", "-arch i386 -arch ppc -arch x86_64") prog.env.append_value("LINKFLAGS", "") - prog.uselib = 'SNDFILE' + prog.use += ['SNDFILE'] if bld.env['IS_LINUX']: - prog.uselib = 'RT SNDFILE' + prog.use += ['RT', 'SNDFILE'] if bld.env['IS_SUN']: - prog.uselib = 'RT SNDFILE' - prog.uselib_local = 'clientlib' + prog.use += ['RT', 'SNDFILE'] prog.target = 'jack_rec' if bld.env['IS_LINUX'] or bld.env['IS_MACOSX']: - prog = bld.new_task_gen('cc', 'program') + prog = bld(features = 'c cprogram') prog.includes = os_incdir + ['../common/jack', '../common'] prog.source = ['netsource.c', '../common/netjack_packet.c'] - prog.env.append_value("CCFLAGS", "-DNO_JACK_ERROR") - prog.uselib = 'CELT SAMPLERATE' - prog.uselib_local = 'clientlib' + prog.env.append_value("CFLAGS", "-DNO_JACK_ERROR") + prog.use = ['CELT', 'SAMPLERATE'] + prog.use = ['clientlib'] prog.target = 'jack_netsource' if bld.env['IS_LINUX'] and bld.env['BUILD_EXAMPLE_ALSA_IO']: - prog = bld.new_task_gen('cc', 'program') - prog.includes = os_incdir + ['../common/jack', '../common'] - prog.source = ['alsa_in.c', '../common/memops.c'] - prog.env.append_value("CCFLAGS", "-DNO_JACK_ERROR") - prog.uselib = 'ALSA SAMPLERATE' - prog.uselib_local = 'clientlib' - prog.target = 'alsa_in' - - prog = bld.new_task_gen('cc', 'program') - prog.includes = os_incdir + ['../common/jack', '../common'] - prog.source = ['alsa_out.c', '../common/memops.c'] - prog.env.append_value("CCFLAGS", "-DNO_JACK_ERROR") - prog.uselib = 'ALSA SAMPLERATE' - prog.uselib_local = 'clientlib' - prog.target = 'alsa_out' - - for example_lib, example_lib_source in example_libs.items(): - lib = bld.new_task_gen('cc', 'shlib') - lib.env['shlib_PATTERN'] = '%s.so' + prog = bld(features = 'c cprogram') + prog.includes = os_incdir + ['../common/jack', '../common'] + prog.source = ['alsa_in.c', '../common/memops.c'] + prog.env.append_value("CCFLAGS", "-DNO_JACK_ERROR") + prog.use = ['clientlib', 'ALSA', 'SAMPLERATE'] + prog.target = 'alsa_in' + + prog = bld(features = 'c cprogram') + prog.includes = os_incdir + ['../common/jack', '../common'] + prog.source = ['alsa_out.c', '../common/memops.c'] + prog.env.append_value("CCFLAGS", "-DNO_JACK_ERROR") + prog.use = ['clientlib', 'ALSA', 'SAMPLERATE'] + prog.target = 'alsa_out' + + for example_lib, example_lib_source in list(example_libs.items()): + lib = bld(features = 'c cshlib') + lib.env['cshlib_PATTERN'] = '%s.so' lib.includes = os_incdir + ['../common/jack', '../common'] lib.target = example_lib lib.source = example_lib_source @@ -167,10 +159,10 @@ def build(bld): #lib.env.append_value("LINKFLAGS", "-arch i386 -arch ppc -arch x86_64") lib.env.append_value("LINKFLAGS", "") if bld.env['IS_SUN']: - lib.env.append_value("LINKFLAGS", "-lm") - lib.uselib_local = 'serverlib' + lib.env.append_value("LINKFLAGS", "-lm") + lib.use = 'serverlib' lib.install_path = '${ADDON_DIR}/' bld.symlink_as('${PREFIX}/bin/jack_disconnect', 'jack_connect') - bld.install_files('${PREFIX}/bin', 'jack_control', chmod=0755) + bld.install_files('${PREFIX}/bin', 'jack_control', chmod=0o755) diff --git a/linux/JackLinuxTime.c b/linux/JackLinuxTime.c index 18e616eb..3c3a9c25 100644 --- a/linux/JackLinuxTime.c +++ b/linux/JackLinuxTime.c @@ -43,11 +43,11 @@ jack_time_t (*_jack_get_microseconds)(void) = 0; #if defined(__gnu_linux__) && (defined(__i386__) || defined(__x86_64__)) #define HPET_SUPPORT -#define HPET_MMAP_SIZE 1024 +#define HPET_MMAP_SIZE 1024 #define HPET_CAPS 0x000 #define HPET_PERIOD 0x004 -#define HPET_COUNTER 0x0f0 -#define HPET_CAPS_COUNTER_64BIT (1 << 13) +#define HPET_COUNTER 0x0f0 +#define HPET_CAPS_COUNTER_64BIT (1 << 13) #if defined(__x86_64__) typedef uint64_t hpet_counter_t; #else @@ -220,7 +220,10 @@ SERVER_EXPORT void InitTime() __jack_cpu_mhz = jack_get_mhz (); } -SERVER_EXPORT void SetClockSource(jack_timer_type_t source) +SERVER_EXPORT void EndTime() +{} + +void SetClockSource(jack_timer_type_t source) { jack_log("Clock source : %s", ClockSourceName(source)); @@ -245,7 +248,7 @@ SERVER_EXPORT void SetClockSource(jack_timer_type_t source) } } -SERVER_EXPORT const char* ClockSourceName(jack_timer_type_t source) +const char* ClockSourceName(jack_timer_type_t source) { switch (source) { case JACK_TIMER_CYCLE_COUNTER: diff --git a/linux/JackPlatformPlug_os.h b/linux/JackPlatformPlug_os.h index 5cabe8b5..b480f453 100644 --- a/linux/JackPlatformPlug_os.h +++ b/linux/JackPlatformPlug_os.h @@ -12,7 +12,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 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. */ @@ -28,7 +28,7 @@ namespace Jack { struct JackRequest; struct JackResult; - + class JackPosixMutex; class JackPosixThread; class JackFifo; @@ -58,14 +58,16 @@ namespace Jack { typedef JackFifo JackSynchro; } namespace Jack { typedef JackPosixSemaphore JackSynchro; } /* __JackPlatformChannelTransaction__ */ +/* #include "JackSocket.h" namespace Jack { typedef JackClientSocket JackChannelTransaction; } +*/ -#include "JackProcessSync.h" /* __JackPlatformProcessSync__ */ -/* Only on windows a special JackProcessSync is used. It is directly defined by including JackProcessSync.h here */ +#include "JackPosixProcessSync.h" +namespace Jack { typedef JackPosixProcessSync JackProcessSync; } -/* __JackPlatformServerChannel__ */ +/* __JackPlatformServerChannel__ */ #include "JackSocketServerChannel.h" namespace Jack { typedef JackSocketServerChannel JackServerChannel; } diff --git a/linux/alsarawmidi/JackALSARawMidiDriver.cpp b/linux/alsarawmidi/JackALSARawMidiDriver.cpp index 34b1a05b..b9288bd5 100644 --- a/linux/alsarawmidi/JackALSARawMidiDriver.cpp +++ b/linux/alsarawmidi/JackALSARawMidiDriver.cpp @@ -28,6 +28,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "JackEngineControl.h" #include "JackError.h" #include "JackMidiUtil.h" +#include "driver_interface.h" using Jack::JackALSARawMidiDriver; diff --git a/linux/alsarawmidi/JackALSARawMidiInputPort.cpp b/linux/alsarawmidi/JackALSARawMidiInputPort.cpp index aab449cb..441c9186 100644 --- a/linux/alsarawmidi/JackALSARawMidiInputPort.cpp +++ b/linux/alsarawmidi/JackALSARawMidiInputPort.cpp @@ -22,6 +22,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "JackALSARawMidiInputPort.h" #include "JackMidiUtil.h" +#include "JackError.h" using Jack::JackALSARawMidiInputPort; diff --git a/linux/alsarawmidi/JackALSARawMidiOutputPort.cpp b/linux/alsarawmidi/JackALSARawMidiOutputPort.cpp index 2da57fde..7d48a505 100644 --- a/linux/alsarawmidi/JackALSARawMidiOutputPort.cpp +++ b/linux/alsarawmidi/JackALSARawMidiOutputPort.cpp @@ -21,6 +21,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include #include "JackALSARawMidiOutputPort.h" +#include "JackError.h" using Jack::JackALSARawMidiOutputPort; diff --git a/linux/alsarawmidi/JackALSARawMidiSendQueue.cpp b/linux/alsarawmidi/JackALSARawMidiSendQueue.cpp index e234af89..00438dc9 100644 --- a/linux/alsarawmidi/JackALSARawMidiSendQueue.cpp +++ b/linux/alsarawmidi/JackALSARawMidiSendQueue.cpp @@ -21,6 +21,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "JackALSARawMidiSendQueue.h" #include "JackMidiUtil.h" +#include "JackError.h" using Jack::JackALSARawMidiSendQueue; diff --git a/linux/driver.h b/linux/driver.h index 4e353b4b..6e1466f4 100644 --- a/linux/driver.h +++ b/linux/driver.h @@ -231,8 +231,6 @@ typedef struct _jack_driver } jack_driver_t; -typedef jack_driver_desc_t * (*JackDriverDescFunction) (); - void jack_driver_init (jack_driver_t *); void jack_driver_release (jack_driver_t *); diff --git a/linux/firewire/JackFFADODriver.cpp b/linux/firewire/JackFFADODriver.cpp index 742005ef..91d999b5 100644 --- a/linux/firewire/JackFFADODriver.cpp +++ b/linux/firewire/JackFFADODriver.cpp @@ -3,6 +3,7 @@ Copyright (C) 2001 Paul Davis Copyright (C) 2004 Grame Copyright (C) 2007 Pieter Palmers Copyright (C) 2009 Devin Anderson +Copyright (C) 2012 Jonathan Woithe, Adrian Knoth This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -45,10 +46,20 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "JackCompilerDeps.h" #include "JackLockedEngine.h" +// FFADO_API_VERSION was first defined with API_VERSION 9, so all previous +// headers do not provide this define. +#ifndef FFADO_API_VERSION +extern "C" int ffado_streaming_set_period_size(ffado_device_t *dev, + unsigned int period) __attribute__((__weak__)); +#endif + namespace Jack { +// Basic functionality requires API version 8. If version 9 or later +// is present the buffers can be resized at runtime. #define FIREWIRE_REQUIRED_FFADO_API_VERSION 8 +#define FIREWIRE_REQUIRED_FFADO_API_VERSION_FOR_SETBUFSIZE 9 #define jack_get_microseconds GetMicroSeconds @@ -253,22 +264,96 @@ JackFFADODriver::ffado_driver_restart (ffado_driver_t *driver) return Start(); } +void +JackFFADODriver::UpdateLatencies(void) +{ + jack_latency_range_t range; + ffado_driver_t* driver = (ffado_driver_t*)fDriver; + + for (int i = 0; i < fCaptureChannels; i++) { + range.min = range.max = driver->period_size + driver->capture_frame_latency; + fGraphManager->GetPort(fCapturePortList[i])->SetLatencyRange(JackCaptureLatency, &range); + } + + for (int i = 0; i < fPlaybackChannels; i++) { + // Add one buffer more latency if "async" mode is used... + range.min = range.max = (driver->period_size * + (driver->device_options.nb_buffers - 1)) + + ((fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize) + driver->playback_frame_latency; + fGraphManager->GetPort(fPlaybackPortList[i])->SetLatencyRange(JackPlaybackLatency, &range); + // Monitor port + if (fWithMonitorPorts) { + range.min = range.max =driver->period_size; + fGraphManager->GetPort(fMonitorPortList[i])->SetLatencyRange(JackCaptureLatency, &range); + } + } +} + int JackFFADODriver::SetBufferSize (jack_nframes_t nframes) { - printError("Buffer size change requested but not supported!!!"); + ffado_driver_t* driver = (ffado_driver_t*)fDriver; + signed int chn; + + // The speed of this function isn't critical; we can afford the + // time to check the FFADO API version. + if (ffado_get_api_version() < FIREWIRE_REQUIRED_FFADO_API_VERSION_FOR_SETBUFSIZE || + ffado_streaming_set_period_size == NULL) { + printError("unsupported on current version of FFADO; please upgrade FFADO"); + return -1; + } - /* driver->period_size = nframes; driver->period_usecs = (jack_time_t) floor ((((float) nframes) / driver->sample_rate) * 1000000.0f); - */ + + + // Reallocate the null and scratch buffers. + driver->nullbuffer = (ffado_sample_t*) calloc(driver->period_size, sizeof(ffado_sample_t)); + if(driver->nullbuffer == NULL) { + printError("could not allocate memory for null buffer"); + return -1; + } + driver->scratchbuffer = (ffado_sample_t*) calloc(driver->period_size, sizeof(ffado_sample_t)); + if(driver->scratchbuffer == NULL) { + printError("could not allocate memory for scratch buffer"); + return -1; + } + + // MIDI buffers need reallocating + for (chn = 0; chn < driver->capture_nchannels; chn++) { + if(driver->capture_channels[chn].stream_type == ffado_stream_type_midi) { + // setup the midi buffer + if (driver->capture_channels[chn].midi_buffer != NULL) + free(driver->capture_channels[chn].midi_buffer); + driver->capture_channels[chn].midi_buffer = (ffado_sample_t*) calloc(driver->period_size, sizeof(uint32_t)); + } + } + for (chn = 0; chn < driver->playback_nchannels; chn++) { + if(driver->playback_channels[chn].stream_type == ffado_stream_type_midi) { + if (driver->playback_channels[chn].midi_buffer != NULL) + free(driver->playback_channels[chn].midi_buffer); + driver->playback_channels[chn].midi_buffer = (ffado_sample_t*) calloc(driver->period_size, sizeof(uint32_t)); + } + } + + // Notify FFADO of the period size change + if (ffado_streaming_set_period_size(driver->dev, nframes) != 0) { + printError("could not alter FFADO device period size"); + return -1; + } + + // This is needed to give the shadow variables a chance to + // properly update to the changes. + sleep(1); /* tell the engine to change its buffer size */ - //driver->engine->set_buffer_size (driver->engine, nframes); + JackAudioDriver::SetBufferSize(nframes); // Generic change, never fails - return -1; // unsupported + UpdateLatencies(); + + return 0; } typedef void (*JackDriverFinishFunction) (jack_driver_t *); @@ -281,7 +366,7 @@ JackFFADODriver::ffado_driver_new (const char *name, assert(params); - if (ffado_get_api_version() != FIREWIRE_REQUIRED_FFADO_API_VERSION) { + if (ffado_get_api_version() < FIREWIRE_REQUIRED_FFADO_API_VERSION) { printError("Incompatible libffado version! (%s)", ffado_get_version()); return NULL; } @@ -349,7 +434,6 @@ int JackFFADODriver::Attach() jack_port_id_t port_index; char buf[REAL_JACK_PORT_NAME_SIZE]; char portname[REAL_JACK_PORT_NAME_SIZE]; - jack_latency_range_t range; ffado_driver_t* driver = (ffado_driver_t*)fDriver; @@ -435,8 +519,6 @@ int JackFFADODriver::Attach() ffado_streaming_capture_stream_onoff(driver->dev, chn, 0); port = fGraphManager->GetPort(port_index); - range.min = range.max = driver->period_size + driver->capture_frame_latency; - port->SetLatencyRange(JackCaptureLatency, &range); // capture port aliases (jackd1 style port names) snprintf(buf, sizeof(buf), "%s:capture_%i", fClientControl.fName, (int) chn + 1); port->SetAlias(buf); @@ -466,9 +548,6 @@ int JackFFADODriver::Attach() // setup the midi buffer driver->capture_channels[chn].midi_buffer = (uint32_t *)calloc(driver->period_size, sizeof(uint32_t)); - port = fGraphManager->GetPort(port_index); - range.min = range.max = driver->period_size + driver->capture_frame_latency; - port->SetLatencyRange(JackCaptureLatency, &range); fCapturePortList[chn] = port_index; jack_log("JackFFADODriver::Attach fCapturePortList[i] %ld ", port_index); fCaptureChannels++; @@ -512,8 +591,6 @@ int JackFFADODriver::Attach() port = fGraphManager->GetPort(port_index); // Add one buffer more latency if "async" mode is used... - range.min = range.max = (driver->period_size * (driver->device_options.nb_buffers - 1)) + ((fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize) + driver->playback_frame_latency; - port->SetLatencyRange(JackPlaybackLatency, &range); // playback port aliases (jackd1 style port names) snprintf(buf, sizeof(buf), "%s:playback_%i", fClientControl.fName, (int) chn + 1); port->SetAlias(buf); @@ -548,9 +625,6 @@ int JackFFADODriver::Attach() driver->playback_channels[chn].midi_buffer = (uint32_t *)calloc(driver->period_size, sizeof(uint32_t)); - port = fGraphManager->GetPort(port_index); - range.min = range.max = (driver->period_size * (driver->device_options.nb_buffers - 1)) + ((fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize) + driver->playback_frame_latency; - port->SetLatencyRange(JackPlaybackLatency, &range); fPlaybackPortList[chn] = port_index; jack_log("JackFFADODriver::Attach fPlaybackPortList[i] %ld ", port_index); fPlaybackChannels++; @@ -559,6 +633,8 @@ int JackFFADODriver::Attach() } } + UpdateLatencies(); + assert(fCaptureChannels < DRIVER_PORT_NUM); assert(fPlaybackChannels < DRIVER_PORT_NUM); diff --git a/linux/firewire/JackFFADODriver.h b/linux/firewire/JackFFADODriver.h index 1dd401a6..790f4dd0 100644 --- a/linux/firewire/JackFFADODriver.h +++ b/linux/firewire/JackFFADODriver.h @@ -2,6 +2,7 @@ Copyright (C) 2001 Paul Davis Copyright (C) 2004 Grame Copyright (C) 2007 Pieter Palmers +Copyright (C) 2012 Adrian Knoth This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -59,6 +60,7 @@ class JackFFADODriver : public JackAudioDriver void jack_driver_init (jack_driver_t *driver); void jack_driver_nt_init (jack_driver_nt_t * driver); + void UpdateLatencies(); public: @@ -80,6 +82,12 @@ class JackFFADODriver : public JackAudioDriver int Read(); int Write(); + // BufferSize can be changed + bool IsFixedBufferSize() + { + return false; + } + int SetBufferSize(jack_nframes_t nframes); }; diff --git a/linux/firewire/JackFFADOMidiInputPort.cpp b/linux/firewire/JackFFADOMidiInputPort.cpp index 3923bbe0..080b269b 100644 --- a/linux/firewire/JackFFADOMidiInputPort.cpp +++ b/linux/firewire/JackFFADOMidiInputPort.cpp @@ -21,6 +21,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "JackFFADOMidiInputPort.h" #include "JackMidiUtil.h" +#include "JackError.h" using Jack::JackFFADOMidiInputPort; diff --git a/linux/firewire/JackFFADOMidiOutputPort.cpp b/linux/firewire/JackFFADOMidiOutputPort.cpp index b916c8c5..d4a0899d 100644 --- a/linux/firewire/JackFFADOMidiOutputPort.cpp +++ b/linux/firewire/JackFFADOMidiOutputPort.cpp @@ -21,6 +21,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "JackFFADOMidiOutputPort.h" #include "JackMidiUtil.h" +#include "JackError.h" using Jack::JackFFADOMidiOutputPort; diff --git a/linux/wscript b/linux/wscript index 79384737..2af5077a 100644 --- a/linux/wscript +++ b/linux/wscript @@ -2,46 +2,45 @@ # encoding: utf-8 def configure(conf): - conf.check_cfg(package='alsa', atleast_version='1.0.18', args='--cflags --libs') + conf.check_cfg(package='alsa', atleast_version='1.0.18', args='--cflags --libs', mandatory=False) conf.env['BUILD_DRIVER_ALSA'] = conf.is_defined('HAVE_ALSA') - conf. check_cfg(package='libfreebob', atleast_version='1.0.0', args='--cflags --libs') + conf. check_cfg(package='libfreebob', atleast_version='1.0.0', args='--cflags --libs', mandatory=False) conf.env['BUILD_DRIVER_FREEBOB'] = conf.is_defined('HAVE_LIBFREEBOB') - conf. check_cfg(package='libffado', atleast_version='1.999.17', args='--cflags --libs') + conf. check_cfg(package='libffado', atleast_version='1.999.17', args='--cflags --libs', mandatory=False) conf.env['BUILD_DRIVER_FFADO'] = conf.is_defined('HAVE_LIBFFADO') conf.define('HAVE_PPOLL', 1 ) def create_jack_driver_obj(bld, target, sources, uselib = None): - driver = bld.new_task_gen('cxx', 'shlib') - driver.features.append('cc') - driver.env['shlib_PATTERN'] = 'jack_%s.so' + driver = bld(features = ['c', 'cxx', 'cxxshlib', 'cshlib']) + driver.env['cxxshlib_PATTERN'] = 'jack_%s.so' #driver.defines = ['HAVE_CONFIG_H','SERVER_SIDE', 'HAVE_PPOLL'] driver.defines = ['HAVE_CONFIG_H','SERVER_SIDE', 'HAVE_PPOLL', 'HAVE_TIMERFD'] - driver.includes = ['.', '../linux', '../posix', '../common', '../common/jack', '../dbus'] + driver.includes = ['.', '../linux', '../posix', '../common', '../common/jack', '../dbus', '../'] driver.target = target driver.source = sources driver.install_path = '${ADDON_DIR}/' + driver.use = [] if uselib: - driver.uselib = uselib - driver.uselib_local = 'serverlib' + driver.use += uselib return driver def build(bld): if bld.env['BUILD_JACKD'] == True: - jackd = bld.new_task_gen('cxx', 'program') - jackd.includes = ['../linux', '../posix', '../common/jack', '../common', '../dbus'] + jackd = bld(features = ['cxx', 'cxxprogram']) + jackd.includes = ['../linux', '../posix', '../common/jack', '../common', '../dbus', '../'] jackd.defines = ['HAVE_CONFIG_H','SERVER_SIDE'] jackd.source = ['../common/Jackdmp.cpp'] - if bld.env['IS_LINUX'] and bld.env['BUILD_JACKDBUS']: + jackd.use = ['serverlib'] + if bld.env['IS_LINUX'] and bld.env['BUILD_JACKDBUS']: jackd.source += ['../dbus/reserve.c', '../dbus/audio_reserve.c'] - jackd.uselib = 'PTHREAD DL RT DBUS-1' - else: - jackd.uselib = 'PTHREAD DL RT' - jackd.uselib_local = 'serverlib' + jackd.use += ['PTHREAD', 'DL', 'RT', 'DBUS-1'] + else: + jackd.use += ['PTHREAD', 'DL', 'RT'] jackd.target = 'jackd' create_jack_driver_obj(bld, 'dummy', '../common/JackDummyDriver.cpp') @@ -54,7 +53,7 @@ def build(bld): '../common/memops.c', 'alsa/generic_hw.c', 'alsa/hdsp.c', - 'alsa/alsa_driver.c', + 'alsa/alsa_driver.c', 'alsa/hammerfall.c', 'alsa/ice1712.c' ] @@ -76,15 +75,15 @@ def build(bld): ] if bld.env['BUILD_DRIVER_ALSA'] == True: - create_jack_driver_obj(bld, 'alsa', alsa_driver_src, "ALSA") + create_jack_driver_obj(bld, 'alsa', alsa_driver_src, ["ALSA"]) create_jack_driver_obj(bld, 'alsarawmidi', alsarawmidi_driver_src, - "ALSA") + ["ALSA"]) if bld.env['BUILD_DRIVER_FREEBOB'] == True: - create_jack_driver_obj(bld, 'freebob', 'freebob/JackFreebobDriver.cpp', "LIBFREEBOB") + create_jack_driver_obj(bld, 'freebob', 'freebob/JackFreebobDriver.cpp', ["LIBFREEBOB"]) if bld.env['BUILD_DRIVER_FFADO'] == True: - create_jack_driver_obj(bld, 'firewire', ffado_driver_src, "LIBFFADO") + create_jack_driver_obj(bld, 'firewire', ffado_driver_src, ["LIBFFADO"]) create_jack_driver_obj(bld, 'net', '../common/JackNetDriver.cpp') @@ -92,5 +91,5 @@ def build(bld): create_jack_driver_obj(bld, 'netone', [ '../common/JackNetOneDriver.cpp', '../common/netjack.c', - '../common/netjack_packet.c' ], "SAMPLERATE CELT" ) + '../common/netjack_packet.c' ], ["SAMPLERATE", "CELT"]) diff --git a/macosx/Jack-Info.plist b/macosx/Jack-Info.plist index ef6c3bfa..d01dad25 100644 --- a/macosx/Jack-Info.plist +++ b/macosx/Jack-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable Jackservermp CFBundleGetInfoString - Jackdmp 1.9.8, @03-11 Paul Davis, Grame + Jackdmp 1.9.9, @03-11 Paul Davis, Grame CFBundleIdentifier com.grame.Jackmp CFBundleInfoDictionaryVersion @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.9.8 + 1.9.9 diff --git a/macosx/JackCompilerDeps_os.h b/macosx/JackCompilerDeps_os.h index 5bc2baa1..61a569d7 100644 --- a/macosx/JackCompilerDeps_os.h +++ b/macosx/JackCompilerDeps_os.h @@ -23,6 +23,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "JackConstants.h" #if __GNUC__ + #define PRE_PACKED_STRUCTURE #ifndef POST_PACKED_STRUCTURE @@ -33,11 +34,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. than use the natural alignment of the processor and/or compiler. */ - #if defined(JACK_32_64) - #define POST_PACKED_STRUCTURE __attribute__((__packed__)) - #else - #define POST_PACKED_STRUCTURE - #endif + #define POST_PACKED_STRUCTURE __attribute__((__packed__)) #endif #define MEM_ALIGN(x,y) x __attribute__((aligned(y))) #define LIB_EXPORT __attribute__((visibility("default"))) diff --git a/macosx/JackMachTime.c b/macosx/JackMachTime.c index c24ae313..70ec8edd 100644 --- a/macosx/JackMachTime.c +++ b/macosx/JackMachTime.c @@ -13,7 +13,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 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. */ @@ -26,7 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. static double __jack_time_ratio; -SERVER_EXPORT void JackSleep(long usec) +SERVER_EXPORT void JackSleep(long usec) { usleep(usec); } @@ -39,15 +39,18 @@ SERVER_EXPORT void InitTime() __jack_time_ratio = ((float)info.numer / info.denom) / 1000; } -SERVER_EXPORT jack_time_t GetMicroSeconds(void) +SERVER_EXPORT void EndTime() +{} + +SERVER_EXPORT jack_time_t GetMicroSeconds(void) { return (jack_time_t) (mach_absolute_time () * __jack_time_ratio); } -SERVER_EXPORT void SetClockSource(jack_timer_type_t source) +void SetClockSource(jack_timer_type_t source) {} -SERVER_EXPORT const char* ClockSourceName(jack_timer_type_t source) +const char* ClockSourceName(jack_timer_type_t source) { return ""; } diff --git a/macosx/JackPlatformPlug_os.h b/macosx/JackPlatformPlug_os.h index 97eece1e..059b16e5 100644 --- a/macosx/JackPlatformPlug_os.h +++ b/macosx/JackPlatformPlug_os.h @@ -64,15 +64,9 @@ namespace Jack { typedef JackMachThread JackThread; } namespace Jack { typedef JackMachSemaphore JackSynchro; } #endif -#include "JackSocket.h" -namespace Jack { typedef JackClientSocket JackChannelTransaction; } - -#include "JackSocket.h" -namespace Jack { typedef JackClientSocket JackChannelTransaction; } - /* __JackPlatformProcessSync__ */ -#include "JackProcessSync.h" -/* Only on windows a special JackProcessSync is used. It is directly defined by including JackProcessSync.h here */ +#include "JackPosixProcessSync.h" +namespace Jack { typedef JackPosixProcessSync JackProcessSync; } #ifndef MY_TARGET_OS_IPHONE /* __JackPlatformServerChannel__ */ diff --git a/macosx/Jackdmp.xcodeproj/project.pbxproj b/macosx/Jackdmp.xcodeproj/project.pbxproj index 2e2e87c4..2449f8e5 100644 --- a/macosx/Jackdmp.xcodeproj/project.pbxproj +++ b/macosx/Jackdmp.xcodeproj/project.pbxproj @@ -109,6 +109,18 @@ /* Begin PBXBuildFile section */ 4B0A28ED0D520852002EFF74 /* tw.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B0A28EC0D520852002EFF74 /* tw.c */; }; 4B0A29260D52108E002EFF74 /* tw.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B0A28EC0D520852002EFF74 /* tw.c */; }; + 4B1499F014BDA5B300A51A3C /* JackGenericClientChannel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1499EE14BDA5B300A51A3C /* JackGenericClientChannel.cpp */; }; + 4B1499F114BDA5B300A51A3C /* JackGenericClientChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B1499EF14BDA5B300A51A3C /* JackGenericClientChannel.h */; }; + 4B1499F214BDA5B300A51A3C /* JackGenericClientChannel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1499EE14BDA5B300A51A3C /* JackGenericClientChannel.cpp */; }; + 4B1499F314BDA5B300A51A3C /* JackGenericClientChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B1499EF14BDA5B300A51A3C /* JackGenericClientChannel.h */; }; + 4B1499F414BDA5B300A51A3C /* JackGenericClientChannel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1499EE14BDA5B300A51A3C /* JackGenericClientChannel.cpp */; }; + 4B1499F514BDA5B300A51A3C /* JackGenericClientChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B1499EF14BDA5B300A51A3C /* JackGenericClientChannel.h */; }; + 4B1499F614BDA5B300A51A3C /* JackGenericClientChannel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1499EE14BDA5B300A51A3C /* JackGenericClientChannel.cpp */; }; + 4B1499F714BDA5B300A51A3C /* JackGenericClientChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B1499EF14BDA5B300A51A3C /* JackGenericClientChannel.h */; }; + 4B1499F814BDA5B300A51A3C /* JackGenericClientChannel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1499EE14BDA5B300A51A3C /* JackGenericClientChannel.cpp */; }; + 4B1499F914BDA5B300A51A3C /* JackGenericClientChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B1499EF14BDA5B300A51A3C /* JackGenericClientChannel.h */; }; + 4B1499FA14BDA5B300A51A3C /* JackGenericClientChannel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1499EE14BDA5B300A51A3C /* JackGenericClientChannel.cpp */; }; + 4B1499FB14BDA5B300A51A3C /* JackGenericClientChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B1499EF14BDA5B300A51A3C /* JackGenericClientChannel.h */; }; 4B193991133F321500547810 /* JackFilters.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B193990133F321500547810 /* JackFilters.h */; }; 4B193992133F321500547810 /* JackFilters.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B193990133F321500547810 /* JackFilters.h */; }; 4B193993133F321500547810 /* JackFilters.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B193990133F321500547810 /* JackFilters.h */; }; @@ -159,6 +171,13 @@ 4B32257F10A3195900838A8E /* netjack_packet.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B3224EC10A315C400838A8E /* netjack_packet.c */; }; 4B32258010A3195A00838A8E /* netjack_packet.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B3224ED10A315C400838A8E /* netjack_packet.h */; }; 4B32258110A3195B00838A8E /* netsource.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B32256310A318E300838A8E /* netsource.c */; }; + 4B327BA714B4B50400976483 /* JackPosixMutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B327BA614B4B50400976483 /* JackPosixMutex.cpp */; }; + 4B327BA814B4B50400976483 /* JackPosixMutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B327BA614B4B50400976483 /* JackPosixMutex.cpp */; }; + 4B327BA914B4B50400976483 /* JackPosixMutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B327BA614B4B50400976483 /* JackPosixMutex.cpp */; }; + 4B327BAA14B4B50400976483 /* JackPosixMutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B327BA614B4B50400976483 /* JackPosixMutex.cpp */; }; + 4B327BAB14B4B50400976483 /* JackPosixMutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B327BA614B4B50400976483 /* JackPosixMutex.cpp */; }; + 4B327BAC14B4B50400976483 /* JackPosixMutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B327BA614B4B50400976483 /* JackPosixMutex.cpp */; }; + 4B327BD614B4B6E700976483 /* JackException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B67AB8C14B4B03800B4AA9A /* JackException.cpp */; }; 4B35C41E0D4731D1000DE7AE /* Jackdmp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF8D2250834F06A00C94B91 /* Jackdmp.cpp */; }; 4B35C42A0D4731D1000DE7AE /* JackError.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF8D1770834EE4800C94B91 /* JackError.h */; }; 4B35C42B0D4731D1000DE7AE /* JackTime.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF8D1830834EE5800C94B91 /* JackTime.h */; }; @@ -408,7 +427,6 @@ 4B47ACA810B5890100469C67 /* jslist.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B9A26000DBF8584006E9FBC /* jslist.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4B47ACA910B5890100469C67 /* JackMessageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B4F9C8B0DC20C0400706CB0 /* JackMessageBuffer.h */; }; 4B47ACAA10B5890100469C67 /* JackPosixThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6A30E703B2E0066E42F /* JackPosixThread.h */; }; - 4B47ACAB10B5890100469C67 /* JackProcessSync.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BECB2F40F4451C10091B70A /* JackProcessSync.h */; }; 4B47ACB110B5890100469C67 /* JackShmMem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF8D1880834EE7900C94B91 /* JackShmMem.cpp */; }; 4B47ACB210B5890100469C67 /* shm.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BF8D1900834EE8400C94B91 /* shm.c */; }; 4B47ACB310B5890100469C67 /* JackActivationCount.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF8D1A80834EEB400C94B91 /* JackActivationCount.cpp */; }; @@ -438,7 +456,6 @@ 4B47ACCC10B5890100469C67 /* JackPosixServerLaunch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF5FBBA0E878B9C003D2374 /* JackPosixServerLaunch.cpp */; }; 4B47ACCD10B5890100469C67 /* JackPosixThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6A20E703B2E0066E42F /* JackPosixThread.cpp */; }; 4B47ACCE10B5890100469C67 /* JackMachTime.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BF5FBC80E878D24003D2374 /* JackMachTime.c */; }; - 4B47ACCF10B5890100469C67 /* JackProcessSync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BECB2F30F4451C10091B70A /* JackProcessSync.cpp */; }; 4B47ACD210B5890100469C67 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BCC87950D57168300A7FEB1 /* Accelerate.framework */; }; 4B49D44214865F22003390F8 /* net.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B49D44014865F22003390F8 /* net.h */; }; 4B49D44314865F22003390F8 /* session.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B49D44114865F22003390F8 /* session.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -493,6 +510,9 @@ 4B60CE490AAABA31004956AA /* connect.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B60CE480AAABA31004956AA /* connect.c */; }; 4B60CE4A0AAABA31004956AA /* connect.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B60CE480AAABA31004956AA /* connect.c */; }; 4B6654FC127C350100753A79 /* server_control.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B6654FB127C350100753A79 /* server_control.cpp */; }; + 4B67AB8D14B4B03800B4AA9A /* JackException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B67AB8C14B4B03800B4AA9A /* JackException.cpp */; }; + 4B67AB8E14B4B03800B4AA9A /* JackException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B67AB8C14B4B03800B4AA9A /* JackException.cpp */; }; + 4B67AB8F14B4B03800B4AA9A /* JackException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B67AB8C14B4B03800B4AA9A /* JackException.cpp */; }; 4B699BAA097D421600A18468 /* Jackdmp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF8D2250834F06A00C94B91 /* Jackdmp.cpp */; }; 4B699C03097D421600A18468 /* JackError.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF8D1770834EE4800C94B91 /* JackError.h */; }; 4B699C04097D421600A18468 /* JackTime.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF8D1830834EE5800C94B91 /* JackTime.h */; }; @@ -687,6 +707,12 @@ 4B8A38F7117B82B200664E07 /* JackSocketClientChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6B00E703B8D0066E42F /* JackSocketClientChannel.h */; }; 4B8F16F51329161E0002AD73 /* midi_dump.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B8F16F41329161E0002AD73 /* midi_dump.c */; }; 4B8F16F61329161E0002AD73 /* midi_dump.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B8F16F41329161E0002AD73 /* midi_dump.c */; }; + 4B90669A14BEE6D20074CD40 /* JackRequestDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B90669814BEE6D20074CD40 /* JackRequestDecoder.cpp */; }; + 4B90669B14BEE6D20074CD40 /* JackRequestDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B90669914BEE6D20074CD40 /* JackRequestDecoder.h */; }; + 4B90669C14BEE6D20074CD40 /* JackRequestDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B90669814BEE6D20074CD40 /* JackRequestDecoder.cpp */; }; + 4B90669D14BEE6D20074CD40 /* JackRequestDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B90669914BEE6D20074CD40 /* JackRequestDecoder.h */; }; + 4B90669E14BEE6D20074CD40 /* JackRequestDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B90669814BEE6D20074CD40 /* JackRequestDecoder.cpp */; }; + 4B90669F14BEE6D20074CD40 /* JackRequestDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B90669914BEE6D20074CD40 /* JackRequestDecoder.h */; }; 4B93F1990E87992100E4ECCD /* JackPosixThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6A20E703B2E0066E42F /* JackPosixThread.cpp */; }; 4B93F19A0E87992200E4ECCD /* JackPosixThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6A30E703B2E0066E42F /* JackPosixThread.h */; }; 4B93F19C0E87998200E4ECCD /* JackPosixServerLaunch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF5FBBA0E878B9C003D2374 /* JackPosixServerLaunch.cpp */; }; @@ -794,7 +820,6 @@ 4BA3396910B2E36800190E3B /* JackControlAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B4E9AF90E5F1090000A3278 /* JackControlAPI.h */; }; 4BA3396A10B2E36800190E3B /* JackPosixThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6A30E703B2E0066E42F /* JackPosixThread.h */; }; 4BA3396B10B2E36800190E3B /* JackEngineProfiling.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BBAE40E0F42FA6100B8BD3F /* JackEngineProfiling.h */; }; - 4BA3396C10B2E36800190E3B /* JackProcessSync.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BECB2F40F4451C10091B70A /* JackProcessSync.h */; }; 4BA3396D10B2E36800190E3B /* JackMidiDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF339200F8B873E0080FB5B /* JackMidiDriver.h */; }; 4BA3396E10B2E36800190E3B /* JackWaitThreadedDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BBC93B90DF9736C002DF220 /* JackWaitThreadedDriver.h */; }; 4BA3396F10B2E36800190E3B /* JackArgParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF284170F31B4BC00B05BE3 /* JackArgParser.h */; }; @@ -839,7 +864,6 @@ 4BA3399E10B2E36800190E3B /* JackPosixThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6A20E703B2E0066E42F /* JackPosixThread.cpp */; }; 4BA3399F10B2E36800190E3B /* JackMachTime.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BF5FBC80E878D24003D2374 /* JackMachTime.c */; }; 4BA339A010B2E36800190E3B /* JackEngineProfiling.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BBAE40F0F42FA6100B8BD3F /* JackEngineProfiling.cpp */; }; - 4BA339A110B2E36800190E3B /* JackProcessSync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BECB2F30F4451C10091B70A /* JackProcessSync.cpp */; }; 4BA339A210B2E36800190E3B /* JackMidiDriver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF3391F0F8B873E0080FB5B /* JackMidiDriver.cpp */; }; 4BA339A310B2E36800190E3B /* JackWaitThreadedDriver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BBC93B80DF9736C002DF220 /* JackWaitThreadedDriver.cpp */; }; 4BA339A410B2E36800190E3B /* JackArgParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF284160F31B4BC00B05BE3 /* JackArgParser.cpp */; }; @@ -854,12 +878,34 @@ 4BA7BE240DC2350D00AA3457 /* Jackservermp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B35C4FC0D4731D1000DE7AE /* Jackservermp.framework */; }; 4BA7BE270DC2352A00AA3457 /* Jackservermp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B35C4FC0D4731D1000DE7AE /* Jackservermp.framework */; }; 4BA7FECA0D8E76650017FF73 /* control.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BA7FEC80D8E76650017FF73 /* control.c */; }; + 4BAA150314F04FB600402512 /* JackAC3Encoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BAA150114F04FB600402512 /* JackAC3Encoder.cpp */; }; + 4BAA150414F04FB600402512 /* JackAC3Encoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BAA150214F04FB600402512 /* JackAC3Encoder.h */; }; + 4BAA150514F04FB600402512 /* JackAC3Encoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BAA150114F04FB600402512 /* JackAC3Encoder.cpp */; }; + 4BAA150614F04FB600402512 /* JackAC3Encoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BAA150214F04FB600402512 /* JackAC3Encoder.h */; }; 4BAB95B80B9E20B800A0C723 /* JackPortType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BAB95B60B9E20B800A0C723 /* JackPortType.cpp */; }; 4BAB95B90B9E20B800A0C723 /* JackPortType.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BAB95B70B9E20B800A0C723 /* JackPortType.h */; }; 4BAB95BA0B9E20B800A0C723 /* JackPortType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BAB95B60B9E20B800A0C723 /* JackPortType.cpp */; }; 4BAB95BB0B9E20B800A0C723 /* JackPortType.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BAB95B70B9E20B800A0C723 /* JackPortType.h */; }; 4BAB95ED0B9E21A500A0C723 /* JackAudioPort.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BAB95EC0B9E21A500A0C723 /* JackAudioPort.cpp */; }; 4BAB95EE0B9E21A500A0C723 /* JackAudioPort.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BAB95EC0B9E21A500A0C723 /* JackAudioPort.cpp */; }; + 4BB4214B14D2C0A700A1CAE1 /* JackPosixMutex.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BB4214814D2C0A700A1CAE1 /* JackPosixMutex.h */; }; + 4BB4214C14D2C0A700A1CAE1 /* JackPosixProcessSync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BB4214914D2C0A700A1CAE1 /* JackPosixProcessSync.cpp */; }; + 4BB4214D14D2C0A700A1CAE1 /* JackPosixProcessSync.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BB4214A14D2C0A700A1CAE1 /* JackPosixProcessSync.h */; }; + 4BB4214E14D2C0A700A1CAE1 /* JackPosixMutex.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BB4214814D2C0A700A1CAE1 /* JackPosixMutex.h */; }; + 4BB4214F14D2C0A700A1CAE1 /* JackPosixProcessSync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BB4214914D2C0A700A1CAE1 /* JackPosixProcessSync.cpp */; }; + 4BB4215014D2C0A700A1CAE1 /* JackPosixProcessSync.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BB4214A14D2C0A700A1CAE1 /* JackPosixProcessSync.h */; }; + 4BB4215114D2C0A700A1CAE1 /* JackPosixMutex.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BB4214814D2C0A700A1CAE1 /* JackPosixMutex.h */; }; + 4BB4215214D2C0A700A1CAE1 /* JackPosixProcessSync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BB4214914D2C0A700A1CAE1 /* JackPosixProcessSync.cpp */; }; + 4BB4215314D2C0A700A1CAE1 /* JackPosixProcessSync.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BB4214A14D2C0A700A1CAE1 /* JackPosixProcessSync.h */; }; + 4BB4215414D2C0A700A1CAE1 /* JackPosixMutex.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BB4214814D2C0A700A1CAE1 /* JackPosixMutex.h */; }; + 4BB4215514D2C0A700A1CAE1 /* JackPosixProcessSync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BB4214914D2C0A700A1CAE1 /* JackPosixProcessSync.cpp */; }; + 4BB4215614D2C0A700A1CAE1 /* JackPosixProcessSync.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BB4214A14D2C0A700A1CAE1 /* JackPosixProcessSync.h */; }; + 4BB4215714D2C0A700A1CAE1 /* JackPosixMutex.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BB4214814D2C0A700A1CAE1 /* JackPosixMutex.h */; }; + 4BB4215814D2C0A700A1CAE1 /* JackPosixProcessSync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BB4214914D2C0A700A1CAE1 /* JackPosixProcessSync.cpp */; }; + 4BB4215914D2C0A700A1CAE1 /* JackPosixProcessSync.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BB4214A14D2C0A700A1CAE1 /* JackPosixProcessSync.h */; }; + 4BB4215A14D2C0A700A1CAE1 /* JackPosixMutex.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BB4214814D2C0A700A1CAE1 /* JackPosixMutex.h */; }; + 4BB4215B14D2C0A700A1CAE1 /* JackPosixProcessSync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BB4214914D2C0A700A1CAE1 /* JackPosixProcessSync.cpp */; }; + 4BB4215C14D2C0A700A1CAE1 /* JackPosixProcessSync.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BB4214A14D2C0A700A1CAE1 /* JackPosixProcessSync.h */; }; 4BB9D4B30E2610B300351653 /* JackTransportEngine.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BD4B4D409BACD9600750C0F /* JackTransportEngine.h */; }; 4BB9D4B40E2610B400351653 /* JackTransportEngine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BD4B4D509BACD9600750C0F /* JackTransportEngine.cpp */; }; 4BB9D4E40E26112900351653 /* JackEngineControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B6F7AEC0CD0CDBD00F48A9D /* JackEngineControl.cpp */; }; @@ -939,14 +985,8 @@ 4BE5FED10E725C320020B576 /* JackCoreAudioAdapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BE5FECF0E725C320020B576 /* JackCoreAudioAdapter.cpp */; }; 4BE5FED20E725C320020B576 /* JackCoreAudioAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BE5FED00E725C320020B576 /* JackCoreAudioAdapter.h */; }; 4BE6C6AD0A3E0A65005A203A /* test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BE6C6AC0A3E0A65005A203A /* test.cpp */; }; - 4BECB2F50F4451C10091B70A /* JackProcessSync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BECB2F30F4451C10091B70A /* JackProcessSync.cpp */; }; - 4BECB2F60F4451C10091B70A /* JackProcessSync.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BECB2F40F4451C10091B70A /* JackProcessSync.h */; }; - 4BECB2F70F4451C10091B70A /* JackProcessSync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BECB2F30F4451C10091B70A /* JackProcessSync.cpp */; }; - 4BECB2F80F4451C10091B70A /* JackProcessSync.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BECB2F40F4451C10091B70A /* JackProcessSync.h */; }; - 4BECB2F90F4451C10091B70A /* JackProcessSync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BECB2F30F4451C10091B70A /* JackProcessSync.cpp */; }; - 4BECB2FA0F4451C10091B70A /* JackProcessSync.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BECB2F40F4451C10091B70A /* JackProcessSync.h */; }; - 4BECB2FB0F4451C10091B70A /* JackProcessSync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BECB2F30F4451C10091B70A /* JackProcessSync.cpp */; }; - 4BECB2FC0F4451C10091B70A /* JackProcessSync.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BECB2F40F4451C10091B70A /* JackProcessSync.h */; }; + 4BF1007C15135D8200B88F80 /* JackPosixMutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B327BA614B4B50400976483 /* JackPosixMutex.cpp */; }; + 4BF1007D15135D8800B88F80 /* JackPosixMutex.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BB4214814D2C0A700A1CAE1 /* JackPosixMutex.h */; }; 4BF2841A0F31B4BC00B05BE3 /* JackArgParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF284160F31B4BC00B05BE3 /* JackArgParser.cpp */; }; 4BF2841B0F31B4BC00B05BE3 /* JackArgParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF284170F31B4BC00B05BE3 /* JackArgParser.h */; }; 4BF3391A0F8B86DC0080FB5B /* JackCoreMidiDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF339140F8B86DC0080FB5B /* JackCoreMidiDriver.h */; }; @@ -1367,6 +1407,13 @@ remoteGlobalIDString = 4BA7FEB90D8E76270017FF73; remoteInfo = "jack_control Universal"; }; + 4BAA1A7514CA08FE003269AD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4B35C61F0D4731D2000DE7AE; + remoteInfo = "jack_portaudio 64 bits"; + }; 4BB492A61372A393005F2601 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; @@ -1576,6 +1623,8 @@ 4B0A28E60D52073D002EFF74 /* jack_thread_wait */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_thread_wait; sourceTree = BUILT_PRODUCTS_DIR; }; 4B0A28EC0D520852002EFF74 /* tw.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tw.c; path = "../example-clients/tw.c"; sourceTree = SOURCE_ROOT; }; 4B0A292D0D52108E002EFF74 /* jack_thread_wait */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_thread_wait; sourceTree = BUILT_PRODUCTS_DIR; }; + 4B1499EE14BDA5B300A51A3C /* JackGenericClientChannel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackGenericClientChannel.cpp; path = ../common/JackGenericClientChannel.cpp; sourceTree = SOURCE_ROOT; }; + 4B1499EF14BDA5B300A51A3C /* JackGenericClientChannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackGenericClientChannel.h; path = ../common/JackGenericClientChannel.h; sourceTree = SOURCE_ROOT; }; 4B193931133F311400547810 /* JackMidiAsyncQueue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackMidiAsyncQueue.cpp; path = ../common/JackMidiAsyncQueue.cpp; sourceTree = SOURCE_ROOT; }; 4B193932133F311400547810 /* JackMidiAsyncQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackMidiAsyncQueue.h; path = ../common/JackMidiAsyncQueue.h; sourceTree = SOURCE_ROOT; }; 4B19393B133F313000547810 /* JackMidiAsyncWaitQueue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackMidiAsyncWaitQueue.cpp; path = ../common/JackMidiAsyncWaitQueue.cpp; sourceTree = SOURCE_ROOT; }; @@ -1620,6 +1669,7 @@ 4B32256110A3187800838A8E /* jack_netsource */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_netsource; sourceTree = BUILT_PRODUCTS_DIR; }; 4B32256310A318E300838A8E /* netsource.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = netsource.c; path = "../example-clients/netsource.c"; sourceTree = SOURCE_ROOT; }; 4B32257B10A3190C00838A8E /* jack_netsource */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_netsource; sourceTree = BUILT_PRODUCTS_DIR; }; + 4B327BA614B4B50400976483 /* JackPosixMutex.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackPosixMutex.cpp; path = ../posix/JackPosixMutex.cpp; sourceTree = SOURCE_ROOT; }; 4B349826133A6AF500D130AB /* JackALSARawMidiDriver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackALSARawMidiDriver.cpp; path = ../linux/alsarawmidi/JackALSARawMidiDriver.cpp; sourceTree = SOURCE_ROOT; }; 4B349827133A6AF500D130AB /* JackALSARawMidiDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackALSARawMidiDriver.h; path = ../linux/alsarawmidi/JackALSARawMidiDriver.h; sourceTree = SOURCE_ROOT; }; 4B349828133A6AF500D130AB /* JackALSARawMidiInputPort.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackALSARawMidiInputPort.cpp; path = ../linux/alsarawmidi/JackALSARawMidiInputPort.cpp; sourceTree = SOURCE_ROOT; }; @@ -1699,9 +1749,6 @@ 4B370A21133DD7E300237B68 /* JackCoreMidiVirtualInputPort.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackCoreMidiVirtualInputPort.h; path = ../../coremidi/JackCoreMidiVirtualInputPort.h; sourceTree = BUILT_PRODUCTS_DIR; }; 4B370A22133DD7E300237B68 /* JackCoreMidiVirtualOutputPort.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackCoreMidiVirtualOutputPort.cpp; path = ../../coremidi/JackCoreMidiVirtualOutputPort.cpp; sourceTree = BUILT_PRODUCTS_DIR; }; 4B370A23133DD7E300237B68 /* JackCoreMidiVirtualOutputPort.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackCoreMidiVirtualOutputPort.h; path = ../../coremidi/JackCoreMidiVirtualOutputPort.h; sourceTree = BUILT_PRODUCTS_DIR; }; - 4B37C20306DF1FBE0016E567 /* CALatencyLog.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = CALatencyLog.cpp; path = /Developer/Examples/CoreAudio/PublicUtility/CALatencyLog.cpp; sourceTree = ""; }; - 4B37C20406DF1FBE0016E567 /* CALatencyLog.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = CALatencyLog.h; path = /Developer/Examples/CoreAudio/PublicUtility/CALatencyLog.h; sourceTree = ""; }; - 4B37C20906DF1FE20016E567 /* latency.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = latency.c; path = /Developer/Examples/CoreAudio/PublicUtility/latency.c; sourceTree = ""; }; 4B38115F1326878E00C61B14 /* jack_latent_client */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_latent_client; sourceTree = BUILT_PRODUCTS_DIR; }; 4B3811971326884E00C61B14 /* jack_latent_client */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_latent_client; sourceTree = BUILT_PRODUCTS_DIR; }; 4B3811FA13269C8300C61B14 /* latent_client.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = latent_client.c; path = "../example-clients/latent_client.c"; sourceTree = SOURCE_ROOT; }; @@ -1777,6 +1824,7 @@ 4B6654F7127C34AE00753A79 /* jack_server_control */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_server_control; sourceTree = BUILT_PRODUCTS_DIR; }; 4B6654FB127C350100753A79 /* server_control.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = server_control.cpp; path = "../example-clients/server_control.cpp"; sourceTree = SOURCE_ROOT; }; 4B66A8580934964500A89560 /* JackConstants.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackConstants.h; path = ../common/JackConstants.h; sourceTree = SOURCE_ROOT; }; + 4B67AB8C14B4B03800B4AA9A /* JackException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackException.cpp; path = ../common/JackException.cpp; sourceTree = SOURCE_ROOT; }; 4B699BB1097D421600A18468 /* jackdmp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jackdmp; sourceTree = BUILT_PRODUCTS_DIR; }; 4B699C47097D421600A18468 /* Jackmp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Jackmp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4B699CAC097D421600A18468 /* Jackservermp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Jackservermp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1818,6 +1866,15 @@ 4B8F16E513290DC80002AD73 /* jack_midi_dump */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midi_dump; sourceTree = BUILT_PRODUCTS_DIR; }; 4B8F16F213290E0E0002AD73 /* jack_midi_dump */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_midi_dump; sourceTree = BUILT_PRODUCTS_DIR; }; 4B8F16F41329161E0002AD73 /* midi_dump.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = midi_dump.c; path = "../example-clients/midi_dump.c"; sourceTree = SOURCE_ROOT; }; + 4B90669814BEE6D20074CD40 /* JackRequestDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackRequestDecoder.cpp; path = ../common/JackRequestDecoder.cpp; sourceTree = SOURCE_ROOT; }; + 4B90669914BEE6D20074CD40 /* JackRequestDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackRequestDecoder.h; path = ../common/JackRequestDecoder.h; sourceTree = SOURCE_ROOT; }; + 4B90679914BEFB500074CD40 /* JackSolarisTime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = JackSolarisTime.c; path = ../solaris/JackSolarisTime.c; sourceTree = SOURCE_ROOT; }; + 4B90679A14BEFB5A0074CD40 /* JackBoomerDriver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackBoomerDriver.cpp; path = ../solaris/oss/JackBoomerDriver.cpp; sourceTree = SOURCE_ROOT; }; + 4B90679B14BEFB5A0074CD40 /* JackBoomerDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackBoomerDriver.h; path = ../solaris/oss/JackBoomerDriver.h; sourceTree = SOURCE_ROOT; }; + 4B90679C14BEFB5A0074CD40 /* JackOSSAdapter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackOSSAdapter.cpp; path = ../solaris/oss/JackOSSAdapter.cpp; sourceTree = SOURCE_ROOT; }; + 4B90679D14BEFB5A0074CD40 /* JackOSSAdapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackOSSAdapter.h; path = ../solaris/oss/JackOSSAdapter.h; sourceTree = SOURCE_ROOT; }; + 4B90679E14BEFB5A0074CD40 /* JackOSSDriver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackOSSDriver.cpp; path = ../solaris/oss/JackOSSDriver.cpp; sourceTree = SOURCE_ROOT; }; + 4B90679F14BEFB5A0074CD40 /* JackOSSDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackOSSDriver.h; path = ../solaris/oss/JackOSSDriver.h; sourceTree = SOURCE_ROOT; }; 4B940B9B06DDDE5B00D77F60 /* AudioHardware.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = AudioHardware.h; path = /System/Library/Frameworks/CoreAudio.framework/Versions/A/Headers/AudioHardware.h; sourceTree = ""; }; 4B94334910A5E666002A187F /* systemdeps.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = systemdeps.h; path = ../common/jack/systemdeps.h; sourceTree = SOURCE_ROOT; }; 4B95BCAD0D913073000F7695 /* control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = control.h; path = ../common/jack/control.h; sourceTree = SOURCE_ROOT; }; @@ -1836,10 +1893,15 @@ 4BA692D60CBE4CC600EAD520 /* ipunload.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = ipunload.c; path = "../example-clients/ipunload.c"; sourceTree = SOURCE_ROOT; }; 4BA7FEC30D8E76270017FF73 /* jack_server_control */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_server_control; sourceTree = BUILT_PRODUCTS_DIR; }; 4BA7FEC80D8E76650017FF73 /* control.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = control.c; path = "../example-clients/control.c"; sourceTree = SOURCE_ROOT; }; + 4BAA150114F04FB600402512 /* JackAC3Encoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackAC3Encoder.cpp; path = ../common/JackAC3Encoder.cpp; sourceTree = SOURCE_ROOT; }; + 4BAA150214F04FB600402512 /* JackAC3Encoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackAC3Encoder.h; path = ../common/JackAC3Encoder.h; sourceTree = SOURCE_ROOT; }; 4BAB95B60B9E20B800A0C723 /* JackPortType.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackPortType.cpp; path = ../common/JackPortType.cpp; sourceTree = SOURCE_ROOT; }; 4BAB95B70B9E20B800A0C723 /* JackPortType.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackPortType.h; path = ../common/JackPortType.h; sourceTree = SOURCE_ROOT; }; 4BAB95EC0B9E21A500A0C723 /* JackAudioPort.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackAudioPort.cpp; path = ../common/JackAudioPort.cpp; sourceTree = SOURCE_ROOT; }; 4BB371D40C1AD85A0050C1E4 /* JackNotification.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackNotification.h; path = ../common/JackNotification.h; sourceTree = SOURCE_ROOT; }; + 4BB4214814D2C0A700A1CAE1 /* JackPosixMutex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackPosixMutex.h; path = ../posix/JackPosixMutex.h; sourceTree = SOURCE_ROOT; }; + 4BB4214914D2C0A700A1CAE1 /* JackPosixProcessSync.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackPosixProcessSync.cpp; path = ../posix/JackPosixProcessSync.cpp; sourceTree = SOURCE_ROOT; }; + 4BB4214A14D2C0A700A1CAE1 /* JackPosixProcessSync.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackPosixProcessSync.h; path = ../posix/JackPosixProcessSync.h; sourceTree = SOURCE_ROOT; }; 4BBAE40E0F42FA6100B8BD3F /* JackEngineProfiling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackEngineProfiling.h; path = ../common/JackEngineProfiling.h; sourceTree = SOURCE_ROOT; }; 4BBAE40F0F42FA6100B8BD3F /* JackEngineProfiling.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackEngineProfiling.cpp; path = ../common/JackEngineProfiling.cpp; sourceTree = SOURCE_ROOT; }; 4BBB00CF0E72614F0018AB1B /* JackPortAudioDevices.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackPortAudioDevices.cpp; path = ../windows/portaudio/JackPortAudioDevices.cpp; sourceTree = SOURCE_ROOT; }; @@ -1890,8 +1952,6 @@ 4BE6C6A30A3E096F005A203A /* jack_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_test; sourceTree = BUILT_PRODUCTS_DIR; }; 4BE6C6AC0A3E0A65005A203A /* test.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = test.cpp; path = ../tests/test.cpp; sourceTree = SOURCE_ROOT; }; 4BE99D300AD7A04800C59091 /* jack_cpu */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_cpu; sourceTree = BUILT_PRODUCTS_DIR; }; - 4BECB2F30F4451C10091B70A /* JackProcessSync.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackProcessSync.cpp; path = ../posix/JackProcessSync.cpp; sourceTree = SOURCE_ROOT; }; - 4BECB2F40F4451C10091B70A /* JackProcessSync.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackProcessSync.h; path = ../posix/JackProcessSync.h; sourceTree = SOURCE_ROOT; }; 4BF284160F31B4BC00B05BE3 /* JackArgParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackArgParser.cpp; path = ../common/JackArgParser.cpp; sourceTree = SOURCE_ROOT; }; 4BF284170F31B4BC00B05BE3 /* JackArgParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackArgParser.h; path = ../common/JackArgParser.h; sourceTree = SOURCE_ROOT; }; 4BF3390C0F8B864B0080FB5B /* jack_coremidi.so */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = jack_coremidi.so; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -2927,6 +2987,7 @@ 4B05A09D0DF72C6000840F4C /* Additional */ = { isa = PBXGroup; children = ( + 4B90676814BEFB270074CD40 /* Solaris */, 4B05A08A0DF72BF600840F4C /* Windows */, 4B05A0420DF72B8500840F4C /* Linux */, ); @@ -2993,9 +3054,6 @@ 4B37C20006DF1F900016E567 /* Latency */ = { isa = PBXGroup; children = ( - 4B37C20906DF1FE20016E567 /* latency.c */, - 4B37C20306DF1FBE0016E567 /* CALatencyLog.cpp */, - 4B37C20406DF1FBE0016E567 /* CALatencyLog.h */, ); name = Latency; sourceTree = ""; @@ -3087,10 +3145,25 @@ name = Tools; sourceTree = ""; }; + 4B90676814BEFB270074CD40 /* Solaris */ = { + isa = PBXGroup; + children = ( + 4B90679914BEFB500074CD40 /* JackSolarisTime.c */, + 4B90679A14BEFB5A0074CD40 /* JackBoomerDriver.cpp */, + 4B90679B14BEFB5A0074CD40 /* JackBoomerDriver.h */, + 4B90679C14BEFB5A0074CD40 /* JackOSSAdapter.cpp */, + 4B90679D14BEFB5A0074CD40 /* JackOSSAdapter.h */, + 4B90679E14BEFB5A0074CD40 /* JackOSSDriver.cpp */, + 4B90679F14BEFB5A0074CD40 /* JackOSSDriver.h */, + ); + name = Solaris; + sourceTree = ""; + }; 4B9B627005E60A9E001E19AA /* Server */ = { isa = PBXGroup; children = ( 4B6C73780CC60A6D001AFFD4 /* jack */, + 4B67AB8C14B4B03800B4AA9A /* JackException.cpp */, 4BE4CC000CDA153400CCF5BB /* JackTools.h */, 4BE4CBFF0CDA153400CCF5BB /* JackTools.cpp */, 4B4E9AF80E5F1090000A3278 /* JackControlAPI.cpp */, @@ -3141,8 +3214,10 @@ 4BA3874007947A46008D8992 /* Synchro */ = { isa = PBXGroup; children = ( - 4BECB2F30F4451C10091B70A /* JackProcessSync.cpp */, - 4BECB2F40F4451C10091B70A /* JackProcessSync.h */, + 4BB4214914D2C0A700A1CAE1 /* JackPosixProcessSync.cpp */, + 4BB4214A14D2C0A700A1CAE1 /* JackPosixProcessSync.h */, + 4B327BA614B4B50400976483 /* JackPosixMutex.cpp */, + 4BB4214814D2C0A700A1CAE1 /* JackPosixMutex.h */, 4BC3B6B70E703BAA0066E42F /* JackPosixSemaphore.cpp */, 4BC3B6B80E703BAA0066E42F /* JackPosixSemaphore.h */, 4BD561C708EEB910006BBC2A /* JackSynchro.h */, @@ -3171,8 +3246,8 @@ 4B21794D13E2EEA60095B3E5 /* JackTimedDriver.cpp */, 4BF3390D0F8B86AF0080FB5B /* MIDI */, 4B19B3010E23629800DD4A82 /* Adapter */, - BA222AEA0DC88379001A17F4 /* Net */, 4BD56D8707968982006D44F9 /* Threaded */, + BA222AEA0DC88379001A17F4 /* Net */, 4BD56D8607968979006D44F9 /* Audio */, ); name = Driver; @@ -3231,9 +3306,13 @@ 4BA550FF05E2423600569492 /* Channels */ = { isa = PBXGroup; children = ( + 4B90669814BEE6D20074CD40 /* JackRequestDecoder.cpp */, + 4B90669914BEE6D20074CD40 /* JackRequestDecoder.h */, + 4B1499EE14BDA5B300A51A3C /* JackGenericClientChannel.cpp */, + 4B1499EF14BDA5B300A51A3C /* JackGenericClientChannel.h */, 4BF8D1AF0834EEC400C94B91 /* JackChannel.h */, - 4BB371D40C1AD85A0050C1E4 /* JackNotification.h */, 4BF8D1B30834EED500C94B91 /* JackInternalClientChannel.h */, + 4BB371D40C1AD85A0050C1E4 /* JackNotification.h */, 4BFB299908AF452300D450D4 /* Socket */, ); name = Channels; @@ -3282,6 +3361,8 @@ 4BD56D8607968979006D44F9 /* Audio */ = { isa = PBXGroup; children = ( + 4BAA150114F04FB600402512 /* JackAC3Encoder.cpp */, + 4BAA150214F04FB600402512 /* JackAC3Encoder.h */, 4BBB00CF0E72614F0018AB1B /* JackPortAudioDevices.cpp */, 4BBB00D00E72614F0018AB1B /* JackPortAudioDevices.h */, 4BBB00D10E72614F0018AB1B /* JackPortAudioDriver.cpp */, @@ -3530,7 +3611,6 @@ 4B9A26050DBF8584006E9FBC /* jslist.h in Headers */, 4B4F9C910DC20C0400706CB0 /* JackMessageBuffer.h in Headers */, 4B93F19E0E87998400E4ECCD /* JackPosixThread.h in Headers */, - 4BECB2FA0F4451C10091B70A /* JackProcessSync.h in Headers */, 4B88D03F11298BEE007A87C1 /* weakjack.h in Headers */, 4B88D04011298BEE007A87C1 /* weakmacros.h in Headers */, 4B8A38F0117B827900664E07 /* JackSocket.h in Headers */, @@ -3539,6 +3619,9 @@ 4B193993133F321500547810 /* JackFilters.h in Headers */, 4B49D44614865F22003390F8 /* net.h in Headers */, 4B49D44714865F22003390F8 /* session.h in Headers */, + 4B1499F714BDA5B300A51A3C /* JackGenericClientChannel.h in Headers */, + 4BB4215114D2C0A700A1CAE1 /* JackPosixMutex.h in Headers */, + 4BB4215314D2C0A700A1CAE1 /* JackPosixProcessSync.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3597,7 +3680,6 @@ 4B4E9AFD0E5F1090000A3278 /* JackControlAPI.h in Headers */, 4B93F19A0E87992200E4ECCD /* JackPosixThread.h in Headers */, 4BBAE4120F42FA6100B8BD3F /* JackEngineProfiling.h in Headers */, - 4BECB2FC0F4451C10091B70A /* JackProcessSync.h in Headers */, 4BF339220F8B873E0080FB5B /* JackMidiDriver.h in Headers */, 4BDCDBD21001FD0200B15929 /* JackWaitThreadedDriver.h in Headers */, 4BDCDC0A1001FDA800B15929 /* JackArgParser.h in Headers */, @@ -3623,6 +3705,10 @@ 4B21795213E2EEA60095B3E5 /* JackTimedDriver.h in Headers */, 4B49D44A14865F22003390F8 /* net.h in Headers */, 4B49D44B14865F22003390F8 /* session.h in Headers */, + 4B1499F114BDA5B300A51A3C /* JackGenericClientChannel.h in Headers */, + 4B90669B14BEE6D20074CD40 /* JackRequestDecoder.h in Headers */, + 4BB4215714D2C0A700A1CAE1 /* JackPosixMutex.h in Headers */, + 4BB4215914D2C0A700A1CAE1 /* JackPosixProcessSync.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3767,6 +3853,7 @@ buildActionMask = 2147483647; files = ( 4BA4ADB50E87AB2600F26C85 /* JackCoreAudioDriver.h in Headers */, + 4BAA150614F04FB600402512 /* JackAC3Encoder.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3914,13 +4001,15 @@ 4B47ACA810B5890100469C67 /* jslist.h in Headers */, 4B47ACA910B5890100469C67 /* JackMessageBuffer.h in Headers */, 4B47ACAA10B5890100469C67 /* JackPosixThread.h in Headers */, - 4B47ACAB10B5890100469C67 /* JackProcessSync.h in Headers */, 4B88D04111298BEE007A87C1 /* weakjack.h in Headers */, 4B88D04211298BEE007A87C1 /* weakmacros.h in Headers */, 4B5160A913215EBF00BB7DCB /* systemdeps.h in Headers */, 4B193994133F321500547810 /* JackFilters.h in Headers */, 4B49D44814865F22003390F8 /* net.h in Headers */, 4B49D44914865F22003390F8 /* session.h in Headers */, + 4B1499F914BDA5B300A51A3C /* JackGenericClientChannel.h in Headers */, + 4BB4215414D2C0A700A1CAE1 /* JackPosixMutex.h in Headers */, + 4BB4215614D2C0A700A1CAE1 /* JackPosixProcessSync.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4006,7 +4095,6 @@ 4B4F9C8F0DC20C0400706CB0 /* JackMessageBuffer.h in Headers */, 4BB9D4B30E2610B300351653 /* JackTransportEngine.h in Headers */, 4BC3B6A50E703B2E0066E42F /* JackPosixThread.h in Headers */, - 4BECB2F80F4451C10091B70A /* JackProcessSync.h in Headers */, 4B94334A10A5E666002A187F /* systemdeps.h in Headers */, 4B88D03B11298BEE007A87C1 /* weakjack.h in Headers */, 4B88D03C11298BEE007A87C1 /* weakmacros.h in Headers */, @@ -4015,6 +4103,9 @@ 4B193991133F321500547810 /* JackFilters.h in Headers */, 4B49D44414865F22003390F8 /* net.h in Headers */, 4B49D44514865F22003390F8 /* session.h in Headers */, + 4B1499F514BDA5B300A51A3C /* JackGenericClientChannel.h in Headers */, + 4BB4214B14D2C0A700A1CAE1 /* JackPosixMutex.h in Headers */, + 4BB4214D14D2C0A700A1CAE1 /* JackPosixProcessSync.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4078,7 +4169,6 @@ 4BC3B6A70E703B2E0066E42F /* JackPosixThread.h in Headers */, 4BF2841B0F31B4BC00B05BE3 /* JackArgParser.h in Headers */, 4BBAE4100F42FA6100B8BD3F /* JackEngineProfiling.h in Headers */, - 4BECB2F60F4451C10091B70A /* JackProcessSync.h in Headers */, 4BF339240F8B873E0080FB5B /* JackMidiDriver.h in Headers */, 4B94334B10A5E666002A187F /* systemdeps.h in Headers */, 4B88D03D11298BEE007A87C1 /* weakjack.h in Headers */, @@ -4102,6 +4192,10 @@ 4B21795013E2EEA60095B3E5 /* JackTimedDriver.h in Headers */, 4B49D44214865F22003390F8 /* net.h in Headers */, 4B49D44314865F22003390F8 /* session.h in Headers */, + 4B1499FB14BDA5B300A51A3C /* JackGenericClientChannel.h in Headers */, + 4B90669F14BEE6D20074CD40 /* JackRequestDecoder.h in Headers */, + 4BB4214E14D2C0A700A1CAE1 /* JackPosixMutex.h in Headers */, + 4BB4215014D2C0A700A1CAE1 /* JackPosixProcessSync.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4194,6 +4288,7 @@ buildActionMask = 2147483647; files = ( 4BE5FECE0E725C090020B576 /* JackCoreAudioDriver.h in Headers */, + 4BAA150414F04FB600402512 /* JackAC3Encoder.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4217,6 +4312,7 @@ 4B86934E1371DEBD00D2D11B /* JackLibSampleRateResampler.h in Headers */, 4B49D44E14865F22003390F8 /* net.h in Headers */, 4B49D44F14865F22003390F8 /* session.h in Headers */, + 4BF1007D15135D8800B88F80 /* JackPosixMutex.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4298,7 +4394,6 @@ 4BA3396910B2E36800190E3B /* JackControlAPI.h in Headers */, 4BA3396A10B2E36800190E3B /* JackPosixThread.h in Headers */, 4BA3396B10B2E36800190E3B /* JackEngineProfiling.h in Headers */, - 4BA3396C10B2E36800190E3B /* JackProcessSync.h in Headers */, 4BA3396D10B2E36800190E3B /* JackMidiDriver.h in Headers */, 4BA3396E10B2E36800190E3B /* JackWaitThreadedDriver.h in Headers */, 4BA3396F10B2E36800190E3B /* JackArgParser.h in Headers */, @@ -4324,6 +4419,10 @@ 4B21795413E2EEA60095B3E5 /* JackTimedDriver.h in Headers */, 4B49D44C14865F22003390F8 /* net.h in Headers */, 4B49D44D14865F22003390F8 /* session.h in Headers */, + 4B1499F314BDA5B300A51A3C /* JackGenericClientChannel.h in Headers */, + 4B90669D14BEE6D20074CD40 /* JackRequestDecoder.h in Headers */, + 4BB4215A14D2C0A700A1CAE1 /* JackPosixMutex.h in Headers */, + 4BB4215C14D2C0A700A1CAE1 /* JackPosixProcessSync.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -5090,6 +5189,7 @@ buildRules = ( ); dependencies = ( + 4BAA1A7614CA08FE003269AD /* PBXTargetDependency */, ); name = "jack_coreaudio 64 bits"; productName = jack_coreaudio; @@ -7054,9 +7154,11 @@ 4B93F19C0E87998200E4ECCD /* JackPosixServerLaunch.cpp in Sources */, 4B93F19D0E87998400E4ECCD /* JackPosixThread.cpp in Sources */, 4B93F1C00E87A35400E4ECCD /* JackMachTime.c in Sources */, - 4BECB2F90F4451C10091B70A /* JackProcessSync.cpp in Sources */, 4B8A38F1117B827E00664E07 /* JackSocketClientChannel.cpp in Sources */, 4B8A38F6117B82AB00664E07 /* JackSocket.cpp in Sources */, + 4B327BAB14B4B50400976483 /* JackPosixMutex.cpp in Sources */, + 4B1499F614BDA5B300A51A3C /* JackGenericClientChannel.cpp in Sources */, + 4BB4215214D2C0A700A1CAE1 /* JackPosixProcessSync.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7105,7 +7207,6 @@ 4B93F1990E87992100E4ECCD /* JackPosixThread.cpp in Sources */, 4B93F22B0E87A72500E4ECCD /* JackMachTime.c in Sources */, 4BBAE4130F42FA6100B8BD3F /* JackEngineProfiling.cpp in Sources */, - 4BECB2FB0F4451C10091B70A /* JackProcessSync.cpp in Sources */, 4BF339210F8B873E0080FB5B /* JackMidiDriver.cpp in Sources */, 4BDCDBD11001FD0100B15929 /* JackWaitThreadedDriver.cpp in Sources */, 4BDCDC091001FDA800B15929 /* JackArgParser.cpp in Sources */, @@ -7125,6 +7226,11 @@ 4B97B6791344B50F00794F57 /* JackMidiUtil.cpp in Sources */, 4B97B67B1344B51D00794F57 /* JackMidiWriteQueue.cpp in Sources */, 4B21795113E2EEA60095B3E5 /* JackTimedDriver.cpp in Sources */, + 4B67AB8E14B4B03800B4AA9A /* JackException.cpp in Sources */, + 4B327BA814B4B50400976483 /* JackPosixMutex.cpp in Sources */, + 4B1499F014BDA5B300A51A3C /* JackGenericClientChannel.cpp in Sources */, + 4B90669A14BEE6D20074CD40 /* JackRequestDecoder.cpp in Sources */, + 4BB4215814D2C0A700A1CAE1 /* JackPosixProcessSync.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7288,6 +7394,7 @@ buildActionMask = 2147483647; files = ( 4BA4ADB40E87AB2500F26C85 /* JackCoreAudioDriver.cpp in Sources */, + 4BAA150514F04FB600402512 /* JackAC3Encoder.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7435,7 +7542,9 @@ 4B47ACCC10B5890100469C67 /* JackPosixServerLaunch.cpp in Sources */, 4B47ACCD10B5890100469C67 /* JackPosixThread.cpp in Sources */, 4B47ACCE10B5890100469C67 /* JackMachTime.c in Sources */, - 4B47ACCF10B5890100469C67 /* JackProcessSync.cpp in Sources */, + 4B327BAC14B4B50400976483 /* JackPosixMutex.cpp in Sources */, + 4B1499F814BDA5B300A51A3C /* JackGenericClientChannel.cpp in Sources */, + 4BB4215514D2C0A700A1CAE1 /* JackPosixProcessSync.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7516,9 +7625,11 @@ 4BC3B6A40E703B2E0066E42F /* JackPosixThread.cpp in Sources */, 4BF5FBBC0E878B9C003D2374 /* JackPosixServerLaunch.cpp in Sources */, 4BF5FBCB0E878D24003D2374 /* JackMachTime.c in Sources */, - 4BECB2F70F4451C10091B70A /* JackProcessSync.cpp in Sources */, 4B2209EC12F6BC2100E5DC26 /* JackSocket.cpp in Sources */, 4B2209EE12F6BC2300E5DC26 /* JackSocketClientChannel.cpp in Sources */, + 4B327BAA14B4B50400976483 /* JackPosixMutex.cpp in Sources */, + 4B1499F414BDA5B300A51A3C /* JackGenericClientChannel.cpp in Sources */, + 4BB4214C14D2C0A700A1CAE1 /* JackPosixProcessSync.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7569,7 +7680,6 @@ 4BF5FBCA0E878D24003D2374 /* JackMachTime.c in Sources */, 4BF2841A0F31B4BC00B05BE3 /* JackArgParser.cpp in Sources */, 4BBAE4110F42FA6100B8BD3F /* JackEngineProfiling.cpp in Sources */, - 4BECB2F50F4451C10091B70A /* JackProcessSync.cpp in Sources */, 4BF339230F8B873E0080FB5B /* JackMidiDriver.cpp in Sources */, 4BC2CA55113C6C930076717C /* JackNetInterface.cpp in Sources */, 4BC2CA57113C6C9B0076717C /* JackNetUnixSocket.cpp in Sources */, @@ -7587,6 +7697,11 @@ 4B97B65C1344B45D00794F57 /* JackMidiUtil.cpp in Sources */, 4B97B65E1344B46B00794F57 /* JackMidiWriteQueue.cpp in Sources */, 4B21794F13E2EEA60095B3E5 /* JackTimedDriver.cpp in Sources */, + 4B67AB8D14B4B03800B4AA9A /* JackException.cpp in Sources */, + 4B327BA714B4B50400976483 /* JackPosixMutex.cpp in Sources */, + 4B1499FA14BDA5B300A51A3C /* JackGenericClientChannel.cpp in Sources */, + 4B90669E14BEE6D20074CD40 /* JackRequestDecoder.cpp in Sources */, + 4BB4214F14D2C0A700A1CAE1 /* JackPosixProcessSync.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7690,6 +7805,7 @@ buildActionMask = 2147483647; files = ( 4BE5FECD0E725C090020B576 /* JackCoreAudioDriver.cpp in Sources */, + 4BAA150314F04FB600402512 /* JackAC3Encoder.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7717,6 +7833,8 @@ 4B8693251371DD7E00D2D11B /* JackResampler.cpp in Sources */, 4B86932C1371DD9B00D2D11B /* ringbuffer.c in Sources */, 4B86934D1371DEBA00D2D11B /* JackLibSampleRateResampler.cpp in Sources */, + 4B327BD614B4B6E700976483 /* JackException.cpp in Sources */, + 4BF1007C15135D8200B88F80 /* JackPosixMutex.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7790,7 +7908,6 @@ 4BA3399E10B2E36800190E3B /* JackPosixThread.cpp in Sources */, 4BA3399F10B2E36800190E3B /* JackMachTime.c in Sources */, 4BA339A010B2E36800190E3B /* JackEngineProfiling.cpp in Sources */, - 4BA339A110B2E36800190E3B /* JackProcessSync.cpp in Sources */, 4BA339A210B2E36800190E3B /* JackMidiDriver.cpp in Sources */, 4BA339A310B2E36800190E3B /* JackWaitThreadedDriver.cpp in Sources */, 4BA339A410B2E36800190E3B /* JackArgParser.cpp in Sources */, @@ -7810,6 +7927,11 @@ 4B6FE16613DDAD8F00B4B943 /* JackMidiBufferReadQueue.cpp in Sources */, 4B6FE16813DDAD9F00B4B943 /* JackMidiAsyncWaitQueue.cpp in Sources */, 4B21795313E2EEA60095B3E5 /* JackTimedDriver.cpp in Sources */, + 4B67AB8F14B4B03800B4AA9A /* JackException.cpp in Sources */, + 4B327BA914B4B50400976483 /* JackPosixMutex.cpp in Sources */, + 4B1499F214BDA5B300A51A3C /* JackGenericClientChannel.cpp in Sources */, + 4B90669C14BEE6D20074CD40 /* JackRequestDecoder.cpp in Sources */, + 4BB4215B14D2C0A700A1CAE1 /* JackPosixProcessSync.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -8292,6 +8414,11 @@ target = 4BA7FEB90D8E76270017FF73 /* jack_server_control Universal */; targetProxy = 4BA7FECC0D8E76810017FF73 /* PBXContainerItemProxy */; }; + 4BAA1A7614CA08FE003269AD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4B35C61F0D4731D2000DE7AE /* jack_portaudio 64 bits */; + targetProxy = 4BAA1A7514CA08FE003269AD /* PBXContainerItemProxy */; + }; 4BB492A71372A393005F2601 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 4B8692821371DB4700D2D11B /* Jacknet.framework 64 bits */; @@ -9006,9 +9133,8 @@ INSTALL_PATH = /usr/local/lib; LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; - OTHER_CFLAGS = "-DJACK_32_64"; OTHER_CPLUSPLUSFLAGS = ( - "-DJACK_32_64", + "-DSERVER_SIDE", "-DHAVE_CELT", "-DHAVE_CELT_API_0_7", "-DMACH_RPC_MACH_SEMA", @@ -9056,13 +9182,11 @@ LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; MACOSX_DEPLOYMENT_TARGET = 10.4; - OTHER_CFLAGS = "-DJACK_32_64"; OTHER_CPLUSPLUSFLAGS = ( "-DSERVER_SIDE", "-DHAVE_CELT", "-DHAVE_CELT_API_0_7", "-DMACH_RPC_MACH_SEMA", - "-DJACK_32_64", ); OTHER_LDFLAGS = ( libcelt.a, @@ -9398,12 +9522,10 @@ OTHER_CFLAGS = ( "-DUSE_POSIX_SHM", "-D__SMP__", - "-DJACK_32_64", ); OTHER_CPLUSPLUSFLAGS = ( "-DMACH_RPC_MACH_SEMA", "-D__SMP__", - "-DJACK_32_64", ); OTHER_LDFLAGS = ( "-framework", @@ -9454,12 +9576,10 @@ OTHER_CFLAGS = ( "-DUSE_POSIX_SHM", "-D__SMP__", - "-DJACK_32_64", ); OTHER_CPLUSPLUSFLAGS = ( "-DMACH_RPC_MACH_SEMA", "-D__SMP__", - "-DJACK_32_64", ); OTHER_LDFLAGS = ( "-framework", @@ -9505,12 +9625,10 @@ OTHER_CFLAGS = ( "-DUSE_POSIX_SHM", "-D__SMP__", - "-DJACK_32_64", ); OTHER_CPLUSPLUSFLAGS = ( "-DMACH_RPC_MACH_SEMA", "-D__SMP__", - "-DJACK_32_64", ); OTHER_LDFLAGS = ( "-framework", @@ -9573,13 +9691,11 @@ LIBRARY_SEARCH_PATHS = /usr/lib/gcc/darwin/3.3; OTHER_CFLAGS = ( "-DUSE_POSIX_SHM", - "-DJACK_32_64", "-D__SMP__", ); OTHER_CPLUSPLUSFLAGS = ( "-DMACH_RPC_MACH_SEMA", "-D__SMP__", - "-DJACK_32_64", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_1)", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_2)", ); @@ -9639,12 +9755,10 @@ MACOSX_DEPLOYMENT_TARGET = 10.4; OTHER_CFLAGS = ( "-DUSE_POSIX_SHM", - "-DJACK_32_64", "-D__SMP__", ); OTHER_CPLUSPLUSFLAGS = ( "-DMACH_RPC_MACH_SEMA", - "-DJACK_32_64", "-D__SMP__", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_1)", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_2)", @@ -9695,12 +9809,10 @@ LIBRARY_SEARCH_PATHS = /usr/lib/gcc/darwin/3.3; OTHER_CFLAGS = ( "-DUSE_POSIX_SHM", - "-DJACK_32_64", "-D__SMP__", ); OTHER_CPLUSPLUSFLAGS = ( "-DMACH_RPC_MACH_SEMA", - "-DJACK_32_64", "-D__SMP__", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_1)", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_2)", @@ -9760,7 +9872,6 @@ LIBRARY_SEARCH_PATHS = /usr/lib/gcc/darwin/3.3; OTHER_CFLAGS = ( "-DSERVER_SIDE", - "-DJACK_32_64", "-D__SMP__", "-DUSE_POSIX_SHM", ); @@ -9768,7 +9879,6 @@ "-DHAVE_CELT_API_0_7", "-DHAVE_CELT", "-DSERVER_SIDE", - "-DJACK_32_64", "-D__SMP__", "-DMACH_RPC_MACH_SEMA", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_1)", @@ -9830,7 +9940,6 @@ MACOSX_DEPLOYMENT_TARGET = 10.4; OTHER_CFLAGS = ( "-DSERVER_SIDE", - "-DJACK_32_64", "-D__SMP__", "-DUSE_POSIX_SHM", ); @@ -9838,7 +9947,6 @@ "-DHAVE_CELT_API_0_7", "-DHAVE_CELT", "-DSERVER_SIDE", - "-DJACK_32_64", "-D__SMP__", "-DMACH_RPC_MACH_SEMA", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_1)", @@ -9891,12 +9999,10 @@ LIBRARY_SEARCH_PATHS = /usr/lib/gcc/darwin/3.3; OTHER_CFLAGS = ( "-D__SMP__", - "-DJACK_32_64", "-DUSE_POSIX_SHM", ); OTHER_CPLUSPLUSFLAGS = ( "-D__SMP__", - "-DJACK_32_64", "-DMACH_RPC_MACH_SEMA", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_1)", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_2)", @@ -11679,13 +11785,13 @@ INSTALL_PATH = /usr/local/lib; LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; - OTHER_CFLAGS = "-DJACK_32_64"; OTHER_CPLUSPLUSFLAGS = ( "-DSERVER_SIDE", "-DMACH_RPC_MACH_SEMA", - "-DJACK_32_64", ); OTHER_LDFLAGS = ( + libaften_static.a, + libaften_pcm.a, "-framework", Jackservermp, "-framework", @@ -11732,13 +11838,13 @@ LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; MACOSX_DEPLOYMENT_TARGET = 10.4; - OTHER_CFLAGS = "-DJACK_32_64"; OTHER_CPLUSPLUSFLAGS = ( "-DSERVER_SIDE", "-DMACH_RPC_MACH_SEMA", - "-DJACK_32_64", ); OTHER_LDFLAGS = ( + libaften_pcm.a, + libaften_static.a, "-framework", Jackservermp, "-framework", @@ -11871,11 +11977,7 @@ LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; MACOSX_DEPLOYMENT_TARGET = 10.4; - OTHER_CFLAGS = "-DJACK_32_64"; - OTHER_CPLUSPLUSFLAGS = ( - "-DMACH_RPC_MACH_SEMA", - "-DJACK_32_64", - ); + OTHER_CPLUSPLUSFLAGS = "-DMACH_RPC_MACH_SEMA"; OTHER_LDFLAGS = ( libportaudio.a, "-framework", @@ -11970,11 +12072,9 @@ INSTALL_PATH = /usr/local/lib; LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; - OTHER_CFLAGS = "-DJACK_32_64"; OTHER_CPLUSPLUSFLAGS = ( "-DSERVER_SIDE", "-DMACH_RPC_MACH_SEMA", - "-DJACK_32_64", ); OTHER_LDFLAGS = ( "-framework", @@ -12022,11 +12122,9 @@ LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; MACOSX_DEPLOYMENT_TARGET = 10.4; - OTHER_CFLAGS = "-DJACK_32_64"; OTHER_CPLUSPLUSFLAGS = ( "-DSERVER_SIDE", "-DMACH_RPC_MACH_SEMA", - "-DJACK_32_64", ); OTHER_LDFLAGS = ( "-framework", @@ -12152,7 +12250,6 @@ LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; MACOSX_DEPLOYMENT_TARGET = 10.4; - OTHER_CFLAGS = "-DJACK_32_64"; OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)"; OTHER_LDFLAGS = ( "-framework", @@ -12252,7 +12349,6 @@ buildSettings = { COPY_PHASE_STRIP = YES; GCC_ENABLE_FIX_AND_CONTINUE = NO; - OTHER_CFLAGS = "-DJACK_32_64"; OTHER_LDFLAGS = ""; OTHER_REZFLAGS = ""; PRODUCT_NAME = All; @@ -13373,11 +13469,9 @@ LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; MACOSX_DEPLOYMENT_TARGET = 10.4; - OTHER_CFLAGS = "-DJACK_32_64"; OTHER_CPLUSPLUSFLAGS = ( "-DSERVER_SIDE", "-DMACH_RPC_MACH_SEMA", - "-DJACK_32_64", ); OTHER_LDFLAGS = ( "-framework", @@ -13475,14 +13569,12 @@ LIBRARY_SEARCH_PATHS = /usr/lib/gcc/darwin/3.3; OTHER_CFLAGS = ( "-DUSE_POSIX_SHM", - "-DJACK_32_64", "-D__SMP__", ); OTHER_CPLUSPLUSFLAGS = ( "-D__CLIENTDEBUG__", "-DMACH_RPC_MACH_SEMA", "-D__SMP__", - "-DJACK_32_64", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_1)", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_2)", ); @@ -13542,13 +13634,11 @@ MACOSX_DEPLOYMENT_TARGET = 10.4; OTHER_CFLAGS = ( "-DUSE_POSIX_SHM", - "-DJACK_32_64", "-D__SMP__", ); OTHER_CPLUSPLUSFLAGS = ( "-D__CLIENTDEBUG__", "-DMACH_RPC_MACH_SEMA", - "-DJACK_32_64", "-D__SMP__", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_1)", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_2)", @@ -13599,12 +13689,10 @@ LIBRARY_SEARCH_PATHS = /usr/lib/gcc/darwin/3.3; OTHER_CFLAGS = ( "-DUSE_POSIX_SHM", - "-DJACK_32_64", "-D__SMP__", ); OTHER_CPLUSPLUSFLAGS = ( "-DMACH_RPC_MACH_SEMA", - "-DJACK_32_64", "-D__SMP__", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_1)", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_2)", @@ -15959,6 +16047,8 @@ OTHER_CFLAGS = ""; OTHER_CPLUSPLUSFLAGS = "-DMACH_RPC_MACH_SEMA"; OTHER_LDFLAGS = ( + libaften_static.a, + libaften_pcm.a, "-framework", Jackservermp, "-framework", @@ -16011,6 +16101,8 @@ OTHER_CFLAGS = ""; OTHER_CPLUSPLUSFLAGS = "-DMACH_RPC_MACH_SEMA"; OTHER_LDFLAGS = ( + libaften_static.a, + libaften_pcm.a, "-framework", Jackservermp, "-framework", @@ -16277,16 +16369,13 @@ ); OTHER_CFLAGS = ( "-DUSE_POSIX_SHM", - "-DJACK_32_64", "-D__SMP__", ); OTHER_CPLUSPLUSFLAGS = ( "-DHAVE_CELT_API_0_7", "-DHAVE_CELT", - "-DSERVER_SIDE", "-DMACH_RPC_MACH_SEMA", "-D__SMP__", - "-DJACK_32_64", ); OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_1 = "-DJACK_LOCATION=\\\"/usr/local/bin\\\""; OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_2 = "-DADDON_DIR=\\\"/usr/local/lib/jackmp\\\""; @@ -16350,15 +16439,12 @@ MACOSX_DEPLOYMENT_TARGET = 10.4; OTHER_CFLAGS = ( "-DUSE_POSIX_SHM", - "-DJACK_32_64", "-D__SMP__", ); OTHER_CPLUSPLUSFLAGS = ( "-DHAVE_CELT_API_0_7", "-DHAVE_CELT", - "-DSERVER_SIDE", "-DMACH_RPC_MACH_SEMA", - "-DJACK_32_64", "-D__SMP__", ); OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_1 = "-DADDON_DIR=\\\"/usr/local/lib/jackmp\\\""; @@ -16407,12 +16493,10 @@ LIBRARY_SEARCH_PATHS = /usr/lib/gcc/darwin/3.3; OTHER_CFLAGS = ( "-DUSE_POSIX_SHM", - "-DJACK_32_64", "-D__SMP__", ); OTHER_CPLUSPLUSFLAGS = ( "-DMACH_RPC_MACH_SEMA", - "-DJACK_32_64", "-D__SMP__", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_1)", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_2)", @@ -16807,7 +16891,6 @@ OTHER_CFLAGS = ( "-DJACK_MONITOR", "-DSERVER_SIDE", - "-DJACK_32_64", "-D__SMP__", "-DUSE_POSIX_SHM", ); @@ -16816,7 +16899,6 @@ "-DHAVE_CELT", "-DJACK_MONITOR", "-DSERVER_SIDE", - "-DJACK_32_64", "-D__SMP__", "-DMACH_RPC_MACH_SEMA", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_1)", @@ -16878,7 +16960,6 @@ OTHER_CFLAGS = ( "-DJACK_MONITOR", "-DSERVER_SIDE", - "-DJACK_32_64", "-D__SMP__", "-DUSE_POSIX_SHM", ); @@ -16887,7 +16968,6 @@ "-DHAVE_CELT", "-DJACK_MONITOR", "-DSERVER_SIDE", - "-DJACK_32_64", "-D__SMP__", "-DMACH_RPC_MACH_SEMA", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_1)", @@ -16940,12 +17020,10 @@ LIBRARY_SEARCH_PATHS = /usr/lib/gcc/darwin/3.3; OTHER_CFLAGS = ( "-D__SMP__", - "-DJACK_32_64", "-DUSE_POSIX_SHM", ); OTHER_CPLUSPLUSFLAGS = ( "-D__SMP__", - "-DJACK_32_64", "-DMACH_RPC_MACH_SEMA", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_1)", "$(OTHER_CPLUSPLUSFLAGS_QUOTED_FOR_TARGET_2)", @@ -17405,7 +17483,10 @@ LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; OTHER_CFLAGS = ""; - OTHER_CPLUSPLUSFLAGS = "-DMACH_RPC_MACH_SEMA"; + OTHER_CPLUSPLUSFLAGS = ( + "-DSERVER_SIDE", + "-DMACH_RPC_MACH_SEMA", + ); OTHER_LDFLAGS = ( "-framework", Jackservermp, @@ -17452,11 +17533,10 @@ LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; MACOSX_DEPLOYMENT_TARGET = 10.4; - OTHER_CFLAGS = "-DJACK_32_64"; + OTHER_CFLAGS = ""; OTHER_CPLUSPLUSFLAGS = ( "-DSERVER_SIDE", "-DMACH_RPC_MACH_SEMA", - "-DJACK_32_64", ); OTHER_LDFLAGS = ( "-framework", @@ -17551,6 +17631,7 @@ OTHER_CPLUSPLUSFLAGS = ( "-DHAVE_CELT_API_0_7", "-DHAVE_CELT", + "-DSERVER_SIDE", "-DMACH_RPC_MACH_SEMA", ); OTHER_LDFLAGS = ( @@ -17595,13 +17676,12 @@ LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; MACOSX_DEPLOYMENT_TARGET = 10.4; - OTHER_CFLAGS = "-DJACK_32_64"; + OTHER_CFLAGS = ""; OTHER_CPLUSPLUSFLAGS = ( "-DHAVE_CELT_API_0_7", "-DHAVE_CELT", "-DSERVER_SIDE", "-DMACH_RPC_MACH_SEMA", - "-DJACK_32_64", ); OTHER_LDFLAGS = ( "-framework", @@ -17737,7 +17817,6 @@ LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; MACOSX_DEPLOYMENT_TARGET = 10.4; - OTHER_CFLAGS = "-DJACK_32_64"; OTHER_CPLUSPLUSFLAGS = ( "-DSERVER_SIDE", "$(OTHER_CFLAGS)", @@ -17891,7 +17970,6 @@ LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; MACOSX_DEPLOYMENT_TARGET = 10.4; - OTHER_CFLAGS = "-DJACK_32_64"; OTHER_CPLUSPLUSFLAGS = ( "-DSERVER_SIDE", "$(OTHER_CFLAGS)", @@ -17993,9 +18071,7 @@ INSTALL_PATH = /usr/local/lib; LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; - OTHER_CFLAGS = "-DJACK_32_64"; OTHER_CPLUSPLUSFLAGS = ( - "-DJACK_32_64", "-DHAVE_CELT", "-DSERVER_SIDE", "-DMACH_RPC_MACH_SEMA", @@ -18051,9 +18127,7 @@ LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; MACOSX_DEPLOYMENT_TARGET = 10.4; - OTHER_CFLAGS = "-DJACK_32_64"; OTHER_CPLUSPLUSFLAGS = ( - "-DJACK_32_64", "-DHAVE_CELT", "-DSERVER_SIDE", "-DMACH_RPC_MACH_SEMA", diff --git a/macosx/coreaudio/JackCoreAudioDriver.cpp b/macosx/coreaudio/JackCoreAudioDriver.cpp index 6939b68e..4c2a3f2b 100644 --- a/macosx/coreaudio/JackCoreAudioDriver.cpp +++ b/macosx/coreaudio/JackCoreAudioDriver.cpp @@ -26,8 +26,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "JackDriverLoader.h" #include "JackGlobals.h" #include "JackTools.h" -#include "JackCompilerDeps.h" #include "JackLockedEngine.h" +#include "JackAC3Encoder.h" #include #include @@ -50,7 +50,7 @@ static void PrintStreamDesc(AudioStreamBasicDescription *inDesc) { jack_log("- - - - - - - - - - - - - - - - - - - -"); jack_log(" Sample Rate:%f", inDesc->mSampleRate); - jack_log(" Format ID:%.*s", (int) sizeof(inDesc->mFormatID), (char*)&inDesc->mFormatID); + jack_log(" Format ID:%.*s", (int)sizeof(inDesc->mFormatID), (char*)&inDesc->mFormatID); jack_log(" Format Flags:%lX", inDesc->mFormatFlags); jack_log(" Bytes per Packet:%ld", inDesc->mBytesPerPacket); jack_log(" Frames per Packet:%ld", inDesc->mFramesPerPacket); @@ -124,7 +124,7 @@ static void printError(OSStatus err) jack_log("error code : kAudioHardwareUnsupportedOperationError"); break; default: - Print4CharCode("error code : unknown", err); + Print4CharCode("error code : unknown ", err); break; } } @@ -192,7 +192,6 @@ static bool CheckAvailableDevice(AudioDeviceID device_id) if (device_id == devices[i]) { return true; } - } return false; @@ -288,7 +287,7 @@ OSStatus JackCoreAudioDriver::Render(void* inRefCon, // Setup threaded based log function et get RT thread parameters once... if (set_threaded_log_function()) { - jack_log("set_threaded_log_function"); + jack_log("JackCoreAudioDriver::Render : set_threaded_log_function"); JackMachThread::GetParams(pthread_self(), &driver->fEngineControl->fPeriod, &driver->fEngineControl->fComputation, &driver->fEngineControl->fConstraint); if (driver->fComputationGrain > 0) { @@ -303,8 +302,8 @@ OSStatus JackCoreAudioDriver::Render(void* inRefCon, driver->CycleTakeBeginTime(); if (driver->Process() < 0) { - jack_error("Process error, stopping driver."); - driver->NotifyFailure(JackBackendError, "Process error, stopping driver."); // Message length limited to JACK_MESSAGE_SIZE + jack_error("Process error, stopping driver"); + driver->NotifyFailure(JackBackendError, "Process error, stopping driver"); // Message length limited to JACK_MESSAGE_SIZE driver->Stop(); kill(JackTools::GetPID(), SIGINT); return kAudioHardwareUnsupportedOperationError; @@ -324,17 +323,37 @@ int JackCoreAudioDriver::Read() int JackCoreAudioDriver::Write() { - for (int i = 0; i < fPlaybackChannels; i++) { - if (fGraphManager->GetConnectionsNum(fPlaybackPortList[i]) > 0) { - jack_default_audio_sample_t* buffer = GetOutputBuffer(i); - int size = sizeof(jack_default_audio_sample_t) * fEngineControl->fBufferSize; - memcpy((jack_default_audio_sample_t*)fDriverOutputData->mBuffers[i].mData, buffer, size); - // Monitor ports - if (fWithMonitorPorts && fGraphManager->GetConnectionsNum(fMonitorPortList[i]) > 0) { - memcpy(GetMonitorBuffer(i), buffer, size); + if (fAC3Encoder) { + + // AC3 encoding and SPDIF write + jack_default_audio_sample_t* AC3_inputs[MAX_AC3_CHANNELS]; + jack_default_audio_sample_t* AC3_outputs[2]; + for (int i = 0; i < fPlaybackChannels; i++) { + AC3_inputs[i] = GetOutputBuffer(i); + // If not connected, clear the buffer + if (fGraphManager->GetConnectionsNum(fPlaybackPortList[i]) == 0) { + memset(AC3_inputs[i], 0, sizeof(jack_default_audio_sample_t) * fEngineControl->fBufferSize); + } + } + AC3_outputs[0] = (jack_default_audio_sample_t*)fDriverOutputData->mBuffers[0].mData; + AC3_outputs[1] = (jack_default_audio_sample_t*)fDriverOutputData->mBuffers[1].mData; + fAC3Encoder->Process(AC3_inputs, AC3_outputs, fEngineControl->fBufferSize); + + } else { + + // Standard write + for (int i = 0; i < fPlaybackChannels; i++) { + if (fGraphManager->GetConnectionsNum(fPlaybackPortList[i]) > 0) { + jack_default_audio_sample_t* buffer = GetOutputBuffer(i); + int size = sizeof(jack_default_audio_sample_t) * fEngineControl->fBufferSize; + memcpy((jack_default_audio_sample_t*)fDriverOutputData->mBuffers[i].mData, buffer, size); + // Monitor ports + if (fWithMonitorPorts && fGraphManager->GetConnectionsNum(fMonitorPortList[i]) > 0) { + memcpy(GetMonitorBuffer(i), buffer, size); + } + } else { + memset((jack_default_audio_sample_t*)fDriverOutputData->mBuffers[i].mData, 0, sizeof(jack_default_audio_sample_t) * fEngineControl->fBufferSize); } - } else { - memset((jack_default_audio_sample_t*)fDriverOutputData->mBuffers[i].mData, 0, sizeof(jack_default_audio_sample_t) * fEngineControl->fBufferSize); } } return 0; @@ -354,13 +373,13 @@ OSStatus JackCoreAudioDriver::SRNotificationCallback(AudioDeviceID inDevice, jack_log("JackCoreAudioDriver::SRNotificationCallback kAudioDevicePropertyNominalSampleRate"); // Check new sample rate Float64 tmp_sample_rate; - UInt32 outSize = sizeof(Float64); + UInt32 outSize = sizeof(Float64); OSStatus err = AudioDeviceGetProperty(inDevice, 0, kAudioDeviceSectionGlobal, kAudioDevicePropertyNominalSampleRate, &outSize, &tmp_sample_rate); if (err != noErr) { jack_error("Cannot get current sample rate"); printError(err); } else { - jack_log("SRNotificationCallback : checked sample rate = %f", tmp_sample_rate); + jack_log("JackCoreAudioDriver::SRNotificationCallback : checked sample rate = %f", tmp_sample_rate); } driver->fState = true; break; @@ -372,7 +391,7 @@ OSStatus JackCoreAudioDriver::SRNotificationCallback(AudioDeviceID inDevice, OSStatus JackCoreAudioDriver::BSNotificationCallback(AudioDeviceID inDevice, UInt32 inChannel, - Boolean isInput, + Boolean isInput, AudioDevicePropertyID inPropertyID, void* inClientData) { @@ -384,13 +403,13 @@ OSStatus JackCoreAudioDriver::BSNotificationCallback(AudioDeviceID inDevice, jack_log("JackCoreAudioDriver::BSNotificationCallback kAudioDevicePropertyBufferFrameSize"); // Check new buffer size UInt32 tmp_buffer_size; - UInt32 outSize = sizeof(UInt32); + UInt32 outSize = sizeof(UInt32); OSStatus err = AudioDeviceGetProperty(inDevice, 0, kAudioDeviceSectionGlobal, kAudioDevicePropertyBufferFrameSize, &outSize, &tmp_buffer_size); if (err != noErr) { jack_error("Cannot get current buffer size"); printError(err); } else { - jack_log("BSNotificationCallback : checked buffer size = %d", tmp_buffer_size); + jack_log("JackCoreAudioDriver::BSNotificationCallback : checked buffer size = %d", tmp_buffer_size); } driver->fState = true; break; @@ -407,18 +426,17 @@ OSStatus JackCoreAudioDriver::AudioHardwareNotificationCallback(AudioHardwarePro switch (inPropertyID) { - case kAudioHardwarePropertyDevices: { - jack_log("JackCoreAudioDriver::AudioHardwareNotificationCallback kAudioHardwarePropertyDevices"); - DisplayDeviceNames(); - AudioDeviceID captureID, playbackID; - if (CheckAvailableDevice(driver->fDeviceID) || - (CheckAvailableDeviceName(driver->fCaptureUID, &captureID) - && CheckAvailableDeviceName(driver->fPlaybackUID, &playbackID))) { + case kAudioHardwarePropertyDevices: { + jack_log("JackCoreAudioDriver::AudioHardwareNotificationCallback kAudioHardwarePropertyDevices"); + DisplayDeviceNames(); + AudioDeviceID captureID, playbackID; + if (CheckAvailableDevice(driver->fDeviceID) || + (CheckAvailableDeviceName(driver->fCaptureUID, &captureID) + && CheckAvailableDeviceName(driver->fPlaybackUID, &playbackID))) { - } - break; } - + break; + } } return noErr; @@ -462,7 +480,7 @@ OSStatus JackCoreAudioDriver::DeviceNotificationCallback(AudioDeviceID inDevice, } case kAudioDeviceProcessorOverload: { - jack_error("JackCoreAudioDriver::DeviceNotificationCallback kAudioDeviceProcessorOverload"); + jack_error("DeviceNotificationCallback kAudioDeviceProcessorOverload"); jack_time_t cur_time = GetMicroSeconds(); driver->NotifyXRun(cur_time, float(cur_time - driver->fBeginDateUst)); // Better this value than nothing... break; @@ -470,7 +488,7 @@ OSStatus JackCoreAudioDriver::DeviceNotificationCallback(AudioDeviceID inDevice, case kAudioDevicePropertyStreamConfiguration: { jack_error("Cannot handle kAudioDevicePropertyStreamConfiguration : server will quit..."); - driver->NotifyFailure(JackBackendError, "Another application has changed the device configuration."); // Message length limited to JACK_MESSAGE_SIZE + driver->NotifyFailure(JackBackendError, "Another application has changed the device configuration"); // Message length limited to JACK_MESSAGE_SIZE driver->CloseAUHAL(); kill(JackTools::GetPID(), SIGINT); return kAudioHardwareUnsupportedOperationError; @@ -493,7 +511,7 @@ OSStatus JackCoreAudioDriver::DeviceNotificationCallback(AudioDeviceID inDevice, // Digidesign hardware, so "special" code : change the SR again here if (strncmp(device_name, digidesign_name, 10) == 0) { - jack_log("Digidesign HW = %s", device_name); + jack_log("JackCoreAudioDriver::DeviceNotificationCallback Digidesign HW = %s", device_name); // Set sample rate again... sample_rate = driver->fEngineControl->fSampleRate; @@ -502,7 +520,7 @@ OSStatus JackCoreAudioDriver::DeviceNotificationCallback(AudioDeviceID inDevice, jack_error("Cannot set sample rate = %f", sample_rate); printError(err); } else { - jack_log("Set sample rate = %f", sample_rate); + jack_log("JackCoreAudioDriver::DeviceNotificationCallback : set sample rate = %f", sample_rate); } // Check new sample rate again... @@ -512,12 +530,12 @@ OSStatus JackCoreAudioDriver::DeviceNotificationCallback(AudioDeviceID inDevice, jack_error("Cannot get current sample rate"); printError(err); } else { - jack_log("Checked sample rate = %f", sample_rate); + jack_log("JackCoreAudioDriver::DeviceNotificationCallback : checked sample rate = %f", sample_rate); } return noErr; } else { - driver->NotifyFailure(JackBackendError, "Another application has changed the sample rate."); // Message length limited to JACK_MESSAGE_SIZE + driver->NotifyFailure(JackBackendError, "Another application has changed the sample rate"); // Message length limited to JACK_MESSAGE_SIZE driver->CloseAUHAL(); kill(JackTools::GetPID(), SIGINT); return kAudioHardwareUnsupportedOperationError; @@ -540,7 +558,7 @@ OSStatus JackCoreAudioDriver::GetDeviceIDFromUID(const char* UID, AudioDeviceID* } else { OSStatus res = AudioHardwareGetProperty(kAudioHardwarePropertyDeviceForUID, &size, &value); CFRelease(inIUD); - jack_log("GetDeviceIDFromUID %s %ld", UID, *id); + jack_log("JackCoreAudioDriver::GetDeviceIDFromUID %s %ld", UID, *id); return (*id == kAudioDeviceUnknown) ? kAudioHardwareBadDeviceError : res; } } @@ -560,7 +578,7 @@ OSStatus JackCoreAudioDriver::GetDefaultDevice(AudioDeviceID* id) return res; } - jack_log("GetDefaultDevice: input = %ld output = %ld", inDefault, outDefault); + jack_log("JackCoreAudioDriver::GetDefaultDevice : input = %ld output = %ld", inDefault, outDefault); // Get the device only if default input and output are the same if (inDefault != outDefault) { @@ -586,10 +604,10 @@ OSStatus JackCoreAudioDriver::GetDefaultInputDevice(AudioDeviceID* id) } if (inDefault == 0) { - jack_error("Error: default input device is 0, please select a correct one !!"); + jack_error("Error default input device is 0, please select a correct one !!"); return -1; } - jack_log("GetDefaultInputDevice: input = %ld ", inDefault); + jack_log("JackCoreAudioDriver::GetDefaultInputDevice : input = %ld ", inDefault); *id = inDefault; return noErr; } @@ -605,10 +623,10 @@ OSStatus JackCoreAudioDriver::GetDefaultOutputDevice(AudioDeviceID* id) } if (outDefault == 0) { - jack_error("Error: default output device is 0, please select a correct one !!"); + jack_error("Error default output device is 0, please select a correct one !!"); return -1; } - jack_log("GetDefaultOutputDevice: output = %ld", outDefault); + jack_log("JackCoreAudioDriver::GetDefaultOutputDevice : output = %ld", outDefault); *id = outDefault; return noErr; } @@ -629,12 +647,13 @@ OSStatus JackCoreAudioDriver::GetTotalChannels(AudioDeviceID device, int& channe err = AudioDeviceGetPropertyInfo(device, 0, isInput, kAudioDevicePropertyStreamConfiguration, &outSize, &outWritable); if (err == noErr) { int stream_count = outSize / sizeof(AudioBufferList); + jack_log("JackCoreAudioDriver::GetTotalChannels stream_count = %d", stream_count); AudioBufferList bufferList[stream_count]; err = AudioDeviceGetProperty(device, 0, isInput, kAudioDevicePropertyStreamConfiguration, &outSize, bufferList); if (err == noErr) { for (uint i = 0; i < bufferList->mNumberBuffers; i++) { channelCount += bufferList->mBuffers[i].mNumberChannels; - //jack_info("GetTotalChannels stream = %d channels = %d", i, bufferList->mBuffers[i].mNumberChannels); + jack_log("JackCoreAudioDriver::GetTotalChannels stream = %d channels = %d", i, bufferList->mBuffers[i].mNumberChannels); } } } @@ -687,8 +706,77 @@ OSStatus JackCoreAudioDriver::GetStreamLatencies(AudioDeviceID device, bool isIn return err; } +bool JackCoreAudioDriver::IsDigitalDevice(AudioDeviceID device) +{ + OSStatus err = noErr; + UInt32 outSize1; + bool is_digital = false; + + /* Get a list of all the streams on this device */ + AudioObjectPropertyAddress streamsAddress = { kAudioDevicePropertyStreams, kAudioDevicePropertyScopeOutput, kAudioObjectPropertyElementMaster }; + err = AudioObjectGetPropertyDataSize(device, &streamsAddress, 0, NULL, &outSize1); + if (err != noErr) { + jack_error("IsDigitalDevice kAudioDevicePropertyStreams err = %d", err); + return false; + } + + int stream_count = outSize1 / sizeof(AudioStreamID); + AudioStreamID streamIDs[stream_count]; + + err = AudioObjectGetPropertyData(device, &streamsAddress, 0, NULL, &outSize1, streamIDs); + + if (err != noErr) { + jack_error("IsDigitalDevice kAudioDevicePropertyStreams list err = %d", err); + return false; + } + + AudioObjectPropertyAddress physicalFormatsAddress = { kAudioStreamPropertyAvailablePhysicalFormats, kAudioObjectPropertyScopeGlobal, 0 }; + + for (int i = 0; i < stream_count ; i++) { + + /* Find a stream with a cac3 stream */ + int format_num = 0; + + /* Retrieve all the stream formats supported by each output stream */ + err = AudioObjectGetPropertyDataSize(streamIDs[i], &physicalFormatsAddress, 0, NULL, &outSize1); + + if (err != noErr) { + jack_error("IsDigitalDevice kAudioStreamPropertyAvailablePhysicalFormats err = %d", err); + return false; + } + + format_num = outSize1 / sizeof(AudioStreamRangedDescription); + AudioStreamRangedDescription format_list[format_num]; + + err = AudioObjectGetPropertyData(streamIDs[i], &physicalFormatsAddress, 0, NULL, &outSize1, format_list); + + if (err != noErr) { + jack_error("IsDigitalDevice could not get the list of streamformats err = %d", err); + return false; + } + + /* Check if one of the supported formats is a digital format */ + for (int j = 0; j < format_num; j++) { + + PrintStreamDesc(&format_list[j].mFormat); + + if (format_list[j].mFormat.mFormatID == 'IAC3' || + format_list[j].mFormat.mFormatID == 'iac3' || + format_list[j].mFormat.mFormatID == kAudioFormat60958AC3 || + format_list[j].mFormat.mFormatID == kAudioFormatAC3) + { + is_digital = true; + break; + } + } + } + + return is_digital; +} + JackCoreAudioDriver::JackCoreAudioDriver(const char* name, const char* alias, JackLockedEngine* engine, JackSynchro* table) : JackAudioDriver(name, alias, engine, table), + fAC3Encoder(NULL), fJackInputData(NULL), fDriverOutputData(NULL), fPluginID(0), @@ -696,11 +784,14 @@ JackCoreAudioDriver::JackCoreAudioDriver(const char* name, const char* alias, Ja fHogged(false), fIOUsage(1.f), fComputationGrain(-1.f), - fClockDriftCompensate(false) + fClockDriftCompensate(false), + fDigitalPlayback(false) {} JackCoreAudioDriver::~JackCoreAudioDriver() -{} +{ + delete fAC3Encoder; +} OSStatus JackCoreAudioDriver::DestroyAggregateDevice() { @@ -715,14 +806,14 @@ OSStatus JackCoreAudioDriver::DestroyAggregateDevice() osErr = AudioObjectGetPropertyDataSize(fPluginID, &pluginAOPA, 0, NULL, &outDataSize); if (osErr != noErr) { - jack_error("JackCoreAudioDriver::DestroyAggregateDevice : AudioObjectGetPropertyDataSize error"); + jack_error("DestroyAggregateDevice : AudioObjectGetPropertyDataSize error"); printError(osErr); return osErr; } osErr = AudioObjectGetPropertyData(fPluginID, &pluginAOPA, 0, NULL, &outDataSize, &fDeviceID); if (osErr != noErr) { - jack_error("JackCoreAudioDriver::DestroyAggregateDevice : AudioObjectGetPropertyData error"); + jack_error("DestroyAggregateDevice : AudioObjectGetPropertyData error"); printError(osErr); return osErr; } @@ -742,11 +833,11 @@ OSStatus JackCoreAudioDriver::CreateAggregateDevice(AudioDeviceID captureDeviceI vector captureDeviceIDArray; if (err != noErr) { - jack_log("Input device does not have subdevices"); + jack_log("JackCoreAudioDriver::CreateAggregateDevice : input device does not have subdevices"); captureDeviceIDArray.push_back(captureDeviceID); } else { int num_devices = outSize / sizeof(AudioObjectID); - jack_log("Input device has %d subdevices", num_devices); + jack_log("JackCoreAudioDriver::CreateAggregateDevice :Input device has %d subdevices", num_devices); for (int i = 0; i < num_devices; i++) { captureDeviceIDArray.push_back(sub_device[i]); } @@ -756,11 +847,11 @@ OSStatus JackCoreAudioDriver::CreateAggregateDevice(AudioDeviceID captureDeviceI vector playbackDeviceIDArray; if (err != noErr) { - jack_log("Output device does not have subdevices"); + jack_log("JackCoreAudioDriver::CreateAggregateDevice : output device does not have subdevices"); playbackDeviceIDArray.push_back(playbackDeviceID); } else { int num_devices = outSize / sizeof(AudioObjectID); - jack_log("Output device has %d subdevices", num_devices); + jack_log("JackCoreAudioDriver::CreateAggregateDevice : output device has %d subdevices", num_devices); for (int i = 0; i < num_devices; i++) { playbackDeviceIDArray.push_back(sub_device[i]); } @@ -794,18 +885,18 @@ OSStatus JackCoreAudioDriver::CreateAggregateDeviceAux(vector cap for (UInt32 i = 0; i < captureDeviceID.size(); i++) { if (SetupSampleRateAux(captureDeviceID[i], samplerate) < 0) { - jack_error("JackCoreAudioDriver::CreateAggregateDevice : cannot set SR of input device"); + jack_error("CreateAggregateDevice : cannot set SR of input device"); } else { // Check clock domain osErr = AudioDeviceGetProperty(captureDeviceID[i], 0, kAudioDeviceSectionGlobal, kAudioDevicePropertyClockDomain, &outSize, &clockdomain); if (osErr != 0) { - jack_error("JackCoreAudioDriver::CreateAggregateDevice : kAudioDevicePropertyClockDomain error"); + jack_error("CreateAggregateDevice : kAudioDevicePropertyClockDomain error"); printError(osErr); } else { keptclockdomain = (keptclockdomain == 0) ? clockdomain : keptclockdomain; jack_log("JackCoreAudioDriver::CreateAggregateDevice : input clockdomain = %d", clockdomain); if (clockdomain != 0 && clockdomain != keptclockdomain) { - jack_error("JackCoreAudioDriver::CreateAggregateDevice : devices do not share the same clock!! clock drift compensation would be needed..."); + jack_error("CreateAggregateDevice : devices do not share the same clock!! clock drift compensation would be needed..."); need_clock_drift_compensation = true; } } @@ -814,18 +905,18 @@ OSStatus JackCoreAudioDriver::CreateAggregateDeviceAux(vector cap for (UInt32 i = 0; i < playbackDeviceID.size(); i++) { if (SetupSampleRateAux(playbackDeviceID[i], samplerate) < 0) { - jack_error("JackCoreAudioDriver::CreateAggregateDevice : cannot set SR of output device"); + jack_error("CreateAggregateDevice : cannot set SR of output device"); } else { // Check clock domain osErr = AudioDeviceGetProperty(playbackDeviceID[i], 0, kAudioDeviceSectionGlobal, kAudioDevicePropertyClockDomain, &outSize, &clockdomain); if (osErr != 0) { - jack_error("JackCoreAudioDriver::CreateAggregateDevice : kAudioDevicePropertyClockDomain error"); + jack_error("CreateAggregateDevice : kAudioDevicePropertyClockDomain error"); printError(osErr); } else { keptclockdomain = (keptclockdomain == 0) ? clockdomain : keptclockdomain; jack_log("JackCoreAudioDriver::CreateAggregateDevice : output clockdomain = %d", clockdomain); if (clockdomain != 0 && clockdomain != keptclockdomain) { - jack_error("JackCoreAudioDriver::CreateAggregateDevice : devices do not share the same clock!! clock drift compensation would be needed..."); + jack_error("CreateAggregateDevice : devices do not share the same clock!! clock drift compensation would be needed..."); need_clock_drift_compensation = true; } } @@ -854,7 +945,7 @@ OSStatus JackCoreAudioDriver::CreateAggregateDeviceAux(vector cap osErr = AudioHardwareGetPropertyInfo(kAudioHardwarePropertyPlugInForBundleID, &outSize, &outWritable); if (osErr != noErr) { - jack_error("JackCoreAudioDriver::CreateAggregateDevice : AudioHardwareGetPropertyInfo kAudioHardwarePropertyPlugInForBundleID error"); + jack_error("CreateAggregateDevice : AudioHardwareGetPropertyInfo kAudioHardwarePropertyPlugInForBundleID error"); printError(osErr); return osErr; } @@ -870,7 +961,7 @@ OSStatus JackCoreAudioDriver::CreateAggregateDeviceAux(vector cap osErr = AudioHardwareGetProperty(kAudioHardwarePropertyPlugInForBundleID, &outSize, &pluginAVT); if (osErr != noErr) { - jack_error("JackCoreAudioDriver::CreateAggregateDevice : AudioHardwareGetProperty kAudioHardwarePropertyPlugInForBundleID error"); + jack_error("CreateAggregateDevice : AudioHardwareGetProperty kAudioHardwarePropertyPlugInForBundleID error"); printError(osErr); return osErr; } @@ -987,14 +1078,14 @@ OSStatus JackCoreAudioDriver::CreateAggregateDeviceAux(vector cap osErr = AudioObjectGetPropertyDataSize(fPluginID, &pluginAOPA, 0, NULL, &outDataSize); if (osErr != noErr) { - jack_error("JackCoreAudioDriver::CreateAggregateDevice : AudioObjectGetPropertyDataSize error"); + jack_error("CreateAggregateDevice : AudioObjectGetPropertyDataSize error"); printError(osErr); goto error; } osErr = AudioObjectGetPropertyData(fPluginID, &pluginAOPA, sizeof(aggDeviceDict), &aggDeviceDict, &outDataSize, outAggregateDevice); if (osErr != noErr) { - jack_error("JackCoreAudioDriver::CreateAggregateDevice : AudioObjectGetPropertyData error"); + jack_error("CreateAggregateDevice : AudioObjectGetPropertyData error"); printError(osErr); goto error; } @@ -1013,7 +1104,7 @@ OSStatus JackCoreAudioDriver::CreateAggregateDeviceAux(vector cap outDataSize = sizeof(CFMutableArrayRef); osErr = AudioObjectSetPropertyData(*outAggregateDevice, &pluginAOPA, 0, NULL, outDataSize, &subDevicesArray); if (osErr != noErr) { - jack_error("JackCoreAudioDriver::CreateAggregateDevice : AudioObjectSetPropertyData for sub-device list error"); + jack_error("CreateAggregateDevice : AudioObjectSetPropertyData for sub-device list error"); printError(osErr); goto error; } @@ -1033,7 +1124,7 @@ OSStatus JackCoreAudioDriver::CreateAggregateDeviceAux(vector cap outDataSize = sizeof(CFStringRef); osErr = AudioObjectSetPropertyData(*outAggregateDevice, &pluginAOPA, 0, NULL, outDataSize, &captureDeviceUID[0]); // First apture is master... if (osErr != noErr) { - jack_error("JackCoreAudioDriver::CreateAggregateDevice : AudioObjectSetPropertyData for master device error"); + jack_error("CreateAggregateDevice : AudioObjectSetPropertyData for master device error"); printError(osErr); goto error; } @@ -1051,7 +1142,7 @@ OSStatus JackCoreAudioDriver::CreateAggregateDeviceAux(vector cap // Get the property data size osErr = AudioObjectGetPropertyDataSize(*outAggregateDevice, &theAddressOwned, theQualifierDataSize, theQualifierData, &outSize); if (osErr != noErr) { - jack_error("JackCoreAudioDriver::CreateAggregateDevice kAudioObjectPropertyOwnedObjects error"); + jack_error("CreateAggregateDevice kAudioObjectPropertyOwnedObjects error"); printError(osErr); } @@ -1063,7 +1154,7 @@ OSStatus JackCoreAudioDriver::CreateAggregateDeviceAux(vector cap osErr = AudioObjectGetPropertyData(*outAggregateDevice, &theAddressOwned, theQualifierDataSize, theQualifierData, &outSize, subDevices); if (osErr != noErr) { - jack_error("JackCoreAudioDriver::CreateAggregateDevice kAudioObjectPropertyOwnedObjects error"); + jack_error("CreateAggregateDevice kAudioObjectPropertyOwnedObjects error"); printError(osErr); } @@ -1072,7 +1163,7 @@ OSStatus JackCoreAudioDriver::CreateAggregateDeviceAux(vector cap UInt32 theDriftCompensationValue = 1; osErr = AudioObjectSetPropertyData(subDevices[index], &theAddressDrift, 0, NULL, sizeof(UInt32), &theDriftCompensationValue); if (osErr != noErr) { - jack_error("JackCoreAudioDriver::CreateAggregateDevice kAudioSubDevicePropertyDriftCompensation error"); + jack_error("CreateAggregateDevice kAudioSubDevicePropertyDriftCompensation error"); printError(osErr); } } @@ -1108,7 +1199,7 @@ OSStatus JackCoreAudioDriver::CreateAggregateDeviceAux(vector cap CFRelease(playbackDeviceUID[i]); } - jack_log("New aggregate device %ld", *outAggregateDevice); + jack_log("JackCoreAudioDriver::CreateAggregateDeviceAux : new aggregate device %ld", *outAggregateDevice); return noErr; error: @@ -1120,20 +1211,21 @@ int JackCoreAudioDriver::SetupDevices(const char* capture_driver_uid, const char* playback_driver_uid, char* capture_driver_name, char* playback_driver_name, - jack_nframes_t samplerate) + jack_nframes_t samplerate, + bool ac3_encoding) { capture_driver_name[0] = 0; playback_driver_name[0] = 0; // Duplex if (strcmp(capture_driver_uid, "") != 0 && strcmp(playback_driver_uid, "") != 0) { - jack_log("JackCoreAudioDriver::Open duplex"); + jack_log("JackCoreAudioDriver::SetupDevices : duplex"); // Same device for capture and playback... if (strcmp(capture_driver_uid, playback_driver_uid) == 0) { if (GetDeviceIDFromUID(playback_driver_uid, &fDeviceID) != noErr) { - jack_log("Will take default in/out"); + jack_log("JackCoreAudioDriver::SetupDevices : will take default in/out"); if (GetDefaultDevice(&fDeviceID) != noErr) { jack_error("Cannot open default device"); return -1; @@ -1143,14 +1235,24 @@ int JackCoreAudioDriver::SetupDevices(const char* capture_driver_uid, jack_error("Cannot get device name from device ID"); return -1; } + + if (fHogged) { + if (!TakeHogAux(fDeviceID, false)) { + jack_error("Cannot take hog mode"); + } + if (ac3_encoding) { + fDigitalPlayback = IsDigitalDevice(fDeviceID); + } + } } else { // Creates aggregate device - AudioDeviceID captureID, playbackID; - + AudioDeviceID captureID = -1; + AudioDeviceID playbackID = -1; + if (GetDeviceIDFromUID(capture_driver_uid, &captureID) != noErr) { - jack_log("Will take default input"); + jack_log("JackCoreAudioDriver::SetupDevices : will take default input"); if (GetDefaultInputDevice(&captureID) != noErr) { jack_error("Cannot open default input device"); return -1; @@ -1158,7 +1260,7 @@ int JackCoreAudioDriver::SetupDevices(const char* capture_driver_uid, } if (GetDeviceIDFromUID(playback_driver_uid, &playbackID) != noErr) { - jack_log("Will take default output"); + jack_log("JackCoreAudioDriver::SetupDevices : will take default output"); if (GetDefaultOutputDevice(&playbackID) != noErr) { jack_error("Cannot open default output device"); return -1; @@ -1171,13 +1273,26 @@ int JackCoreAudioDriver::SetupDevices(const char* capture_driver_uid, GetDeviceNameFromID(captureID, fCaptureUID); GetDeviceNameFromID(playbackID, fPlaybackUID); - } + + if (fHogged) { + if (!TakeHogAux(captureID, true)) { + jack_error("Cannot take hog mode for capture device"); + } + if (!TakeHogAux(playbackID, false)) { + jack_error("Cannot take hog mode for playback device"); + } + if (ac3_encoding) { + fDigitalPlayback = IsDigitalDevice(playbackID); + } + } + + } // Capture only } else if (strcmp(capture_driver_uid, "") != 0) { - jack_log("JackCoreAudioDriver::Open capture only"); + jack_log("JackCoreAudioDriver::SetupDevices : capture only"); if (GetDeviceIDFromUID(capture_driver_uid, &fDeviceID) != noErr) { - jack_log("Will take default input"); + jack_log("JackCoreAudioDriver::SetupDevices : will take default input"); if (GetDefaultInputDevice(&fDeviceID) != noErr) { jack_error("Cannot open default input device"); return -1; @@ -1187,12 +1302,18 @@ int JackCoreAudioDriver::SetupDevices(const char* capture_driver_uid, jack_error("Cannot get device name from device ID"); return -1; } + + if (fHogged) { + if (!TakeHogAux(fDeviceID, true)) { + jack_error("Cannot take hog mode for capture device"); + } + } // Playback only } else if (strcmp(playback_driver_uid, "") != 0) { - jack_log("JackCoreAudioDriver::Open playback only"); + jack_log("JackCoreAudioDriver::SetupDevices : playback only"); if (GetDeviceIDFromUID(playback_driver_uid, &fDeviceID) != noErr) { - jack_log("Will take default output"); + jack_log("JackCoreAudioDriver::SetupDevices : will take default output"); if (GetDefaultOutputDevice(&fDeviceID) != noErr) { jack_error("Cannot open default output device"); return -1; @@ -1202,18 +1323,28 @@ int JackCoreAudioDriver::SetupDevices(const char* capture_driver_uid, jack_error("Cannot get device name from device ID"); return -1; } + + if (fHogged) { + if (!TakeHogAux(fDeviceID, false)) { + jack_error("Cannot take hog mode for playback device"); + } + if (ac3_encoding) { + fDigitalPlayback = IsDigitalDevice(fDeviceID); + } + } // Use default driver in duplex mode } else { - jack_log("JackCoreAudioDriver::Open default driver"); + jack_log("JackCoreAudioDriver::SetupDevices : default driver"); if (GetDefaultDevice(&fDeviceID) != noErr) { jack_error("Cannot open default device in duplex mode, so aggregate default input and default output"); // Creates aggregate device - AudioDeviceID captureID, playbackID; - + AudioDeviceID captureID = -1; + AudioDeviceID playbackID = -1; + if (GetDeviceIDFromUID(capture_driver_uid, &captureID) != noErr) { - jack_log("Will take default input"); + jack_log("JackCoreAudioDriver::SetupDevices : will take default input"); if (GetDefaultInputDevice(&captureID) != noErr) { jack_error("Cannot open default input device"); return -1; @@ -1221,7 +1352,7 @@ int JackCoreAudioDriver::SetupDevices(const char* capture_driver_uid, } if (GetDeviceIDFromUID(playback_driver_uid, &playbackID) != noErr) { - jack_log("Will take default output"); + jack_log("JackCoreAudioDriver::SetupDevices : will take default output"); if (GetDefaultOutputDevice(&playbackID) != noErr) { jack_error("Cannot open default output device"); return -1; @@ -1234,15 +1365,21 @@ int JackCoreAudioDriver::SetupDevices(const char* capture_driver_uid, GetDeviceNameFromID(captureID, fCaptureUID); GetDeviceNameFromID(playbackID, fPlaybackUID); + + if (fHogged) { + if (!TakeHogAux(captureID, true)) { + jack_error("Cannot take hog mode for capture device"); + } + if (!TakeHogAux(playbackID, false)) { + jack_error("Cannot take hog mode for playback device"); + } + if (ac3_encoding) { + fDigitalPlayback = IsDigitalDevice(playbackID); + } + } } } - - if (fHogged) { - if (TakeHog()) { - jack_info("Device = %ld has been hogged", fDeviceID); - } - } - + return 0; } @@ -1256,11 +1393,11 @@ int JackCoreAudioDriver::SetupChannels(bool capturing, bool playing, int& inchan if (capturing) { err = GetTotalChannels(fDeviceID, in_nChannels, true); if (err != noErr) { - jack_error("Cannot get input channel number"); + jack_error("SetupChannels : cannot get input channel number"); printError(err); return -1; } else { - jack_log("Max input channels : %d", in_nChannels); + jack_log("JackCoreAudioDriver::SetupChannels : max input channels : %d", in_nChannels); } } @@ -1271,7 +1408,7 @@ int JackCoreAudioDriver::SetupChannels(bool capturing, bool playing, int& inchan printError(err); return -1; } else { - jack_log("Max output channels : %d", out_nChannels); + jack_log("JackCoreAudioDriver::SetupChannels : max output channels : %d", out_nChannels); } } @@ -1290,12 +1427,12 @@ int JackCoreAudioDriver::SetupChannels(bool capturing, bool playing, int& inchan } if (inchannels == -1) { - jack_log("Setup max in channels = %d", in_nChannels); + jack_log("JackCoreAudioDriver::SetupChannels : setup max in channels = %d", in_nChannels); inchannels = in_nChannels; } if (outchannels == -1) { - jack_log("Setup max out channels = %d", out_nChannels); + jack_log("JackCoreAudioDriver::SetupChannels : setup max out channels = %d", out_nChannels); outchannels = out_nChannels; } @@ -1315,7 +1452,7 @@ int JackCoreAudioDriver::SetupBufferSize(jack_nframes_t buffer_size) printError(err); return -1; } else { - jack_log("Current buffer size = %ld", tmp_buffer_size); + jack_log("JackCoreAudioDriver::SetupBufferSize : current buffer size = %ld", tmp_buffer_size); } // If needed, set new buffer size @@ -1336,14 +1473,14 @@ int JackCoreAudioDriver::SetupBufferSize(jack_nframes_t buffer_size) err = AudioDeviceSetProperty(fDeviceID, NULL, 0, kAudioDeviceSectionGlobal, kAudioDevicePropertyBufferFrameSize, outSize, &tmp_buffer_size); if (err != noErr) { - jack_error("Cannot set buffer size = %ld", tmp_buffer_size); + jack_error("SetupBufferSize : cannot set buffer size = %ld", tmp_buffer_size); printError(err); goto error; } while (!fState && count++ < WAIT_NOTIFICATION_COUNTER) { usleep(100000); - jack_log("Wait count = %d", count); + jack_log("JackCoreAudioDriver::SetupBufferSize : wait count = %d", count); } if (count >= WAIT_NOTIFICATION_COUNTER) { @@ -1352,13 +1489,13 @@ int JackCoreAudioDriver::SetupBufferSize(jack_nframes_t buffer_size) } // Check new buffer size - outSize = sizeof(UInt32); + outSize = sizeof(UInt32); err = AudioDeviceGetProperty(fDeviceID, 0, kAudioDeviceSectionGlobal, kAudioDevicePropertyBufferFrameSize, &outSize, &tmp_buffer_size); if (err != noErr) { jack_error("Cannot get current buffer size"); printError(err); } else { - jack_log("Checked buffer size = %ld", tmp_buffer_size); + jack_log("JackCoreAudioDriver::SetupBufferSize : checked buffer size = %ld", tmp_buffer_size); } // Remove BS change notification @@ -1369,7 +1506,7 @@ int JackCoreAudioDriver::SetupBufferSize(jack_nframes_t buffer_size) error: - // Remove SR change notification + // Remove BS change notification AudioDeviceRemovePropertyListener(fDeviceID, 0, true, kAudioDevicePropertyBufferFrameSize, BSNotificationCallback); return -1; @@ -1394,7 +1531,7 @@ int JackCoreAudioDriver::SetupSampleRateAux(AudioDeviceID inDevice, jack_nframes printError(err); return -1; } else { - jack_log("Current sample rate = %f", tmp_sample_rate); + jack_log("JackCoreAudioDriver::SetupSampleRateAux : current sample rate = %f", tmp_sample_rate); } // If needed, set new sample rate @@ -1422,7 +1559,7 @@ int JackCoreAudioDriver::SetupSampleRateAux(AudioDeviceID inDevice, jack_nframes while (!fState && count++ < WAIT_NOTIFICATION_COUNTER) { usleep(100000); - jack_log("Wait count = %d", count); + jack_log("JackCoreAudioDriver::SetupSampleRateAux : wait count = %d", count); } if (count >= WAIT_NOTIFICATION_COUNTER) { @@ -1431,13 +1568,13 @@ int JackCoreAudioDriver::SetupSampleRateAux(AudioDeviceID inDevice, jack_nframes } // Check new sample rate - outSize = sizeof(Float64); + outSize = sizeof(Float64); err = AudioDeviceGetProperty(inDevice, 0, kAudioDeviceSectionGlobal, kAudioDevicePropertyNominalSampleRate, &outSize, &tmp_sample_rate); if (err != noErr) { jack_error("Cannot get current sample rate"); printError(err); } else { - jack_log("Checked sample rate = %f", tmp_sample_rate); + jack_log("JackCoreAudioDriver::SetupSampleRateAux : checked sample rate = %f", tmp_sample_rate); } // Remove SR change notification @@ -1470,7 +1607,7 @@ int JackCoreAudioDriver::OpenAUHAL(bool capturing, AudioDeviceID currAudioDeviceID; UInt32 size; - jack_log("OpenAUHAL capturing = %d playing = %d inchannels = %d outchannels = %d in_nChannels = %d out_nChannels = %d chan_in_list = %d chan_out_list = %d", + jack_log("JackCoreAudioDriver::OpenAUHAL : capturing = %d playing = %d inchannels = %d outchannels = %d in_nChannels = %d out_nChannels = %d chan_in_list = %d chan_out_list = %d", capturing, playing, inchannels, outchannels, in_nChannels, out_nChannels, chan_in_list.size(), chan_out_list.size()); if (inchannels == 0 && outchannels == 0) { @@ -1495,14 +1632,14 @@ int JackCoreAudioDriver::OpenAUHAL(bool capturing, printError(err1); goto error; } - + // Start I/O if (capturing && inchannels > 0) { enableIO = 1; - jack_log("Setup AUHAL input on"); + jack_log("JackCoreAudioDriver::OpenAUHAL : setup AUHAL input on"); } else { enableIO = 0; - jack_log("Setup AUHAL input off"); + jack_log("JackCoreAudioDriver::OpenAUHAL : setup AUHAL input off"); } err1 = AudioUnitSetProperty(fAUHAL, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &enableIO, sizeof(enableIO)); @@ -1514,10 +1651,10 @@ int JackCoreAudioDriver::OpenAUHAL(bool capturing, if (playing && outchannels > 0) { enableIO = 1; - jack_log("Setup AUHAL output on"); + jack_log("JackCoreAudioDriver::OpenAUHAL : setup AUHAL output on"); } else { enableIO = 0; - jack_log("Setup AUHAL output off"); + jack_log("JackCoreAudioDriver::OpenAUHAL : setup AUHAL output off"); } err1 = AudioUnitSetProperty(fAUHAL, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 0, &enableIO, sizeof(enableIO)); @@ -1534,7 +1671,7 @@ int JackCoreAudioDriver::OpenAUHAL(bool capturing, printError(err1); goto error; } else { - jack_log("AudioUnitGetPropertyCurrentDevice = %d", currAudioDeviceID); + jack_log("JackCoreAudioDriver::OpenAUHAL : AudioUnitGetPropertyCurrentDevice = %d", currAudioDeviceID); } // Setup up choosen device, in both input and output cases @@ -1644,7 +1781,7 @@ int JackCoreAudioDriver::OpenAUHAL(bool capturing, } PrintStreamDesc(&srcFormat); - jack_log("Setup AUHAL input stream converter SR = %ld", sample_rate); + jack_log("JackCoreAudioDriver::OpenAUHAL : setup AUHAL input stream converter SR = %ld", sample_rate); srcFormat.mSampleRate = sample_rate; srcFormat.mFormatID = kAudioFormatLinearPCM; srcFormat.mFormatFlags = kAudioFormatFlagsNativeFloatPacked | kLinearPCMFormatFlagIsNonInterleaved; @@ -1674,7 +1811,7 @@ int JackCoreAudioDriver::OpenAUHAL(bool capturing, } PrintStreamDesc(&dstFormat); - jack_log("Setup AUHAL output stream converter SR = %ld", sample_rate); + jack_log("JackCoreAudioDriver::OpenAUHAL : setup AUHAL output stream converter SR = %ld", sample_rate); dstFormat.mSampleRate = sample_rate; dstFormat.mFormatID = kAudioFormatLinearPCM; dstFormat.mFormatFlags = kAudioFormatFlagsNativeFloatPacked | kLinearPCMFormatFlagIsNonInterleaved; @@ -1851,7 +1988,10 @@ int JackCoreAudioDriver::Open(jack_nframes_t buffer_size, int async_output_latency, int computation_grain, bool hogged, - bool clock_drift) + bool clock_drift, + bool ac3_encoding, + int ac3_bitrate, + bool ac3_lfe) { int in_nChannels = 0; int out_nChannels = 0; @@ -1891,12 +2031,12 @@ int JackCoreAudioDriver::Open(jack_nframes_t buffer_size, AudioObjectPropertyAddress theAddress = { kAudioHardwarePropertyRunLoop, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; OSStatus osErr = AudioObjectSetPropertyData (kAudioObjectSystemObject, &theAddress, 0, NULL, sizeof(CFRunLoopRef), &theRunLoop); if (osErr != noErr) { - jack_error("JackCoreAudioDriver::Open kAudioHardwarePropertyRunLoop error"); + jack_error("Open kAudioHardwarePropertyRunLoop error"); printError(osErr); } } - - if (SetupDevices(capture_driver_uid, playback_driver_uid, capture_driver_name, playback_driver_name, sample_rate) < 0) { + + if (SetupDevices(capture_driver_uid, playback_driver_uid, capture_driver_name, playback_driver_name, sample_rate, ac3_encoding) < 0) { goto error; } @@ -1912,7 +2052,7 @@ int JackCoreAudioDriver::Open(jack_nframes_t buffer_size, goto error; } - if (SetupChannels(capturing, playing, inchannels, outchannels, in_nChannels, out_nChannels, true) < 0) { + if (SetupChannels(capturing, playing, inchannels, outchannels, in_nChannels, out_nChannels, !ac3_encoding) < 0) { goto error; } @@ -1923,6 +2063,47 @@ int JackCoreAudioDriver::Open(jack_nframes_t buffer_size, if (SetupSampleRate(sample_rate) < 0) { goto error; } + + if (ac3_encoding) { + + if (!fDigitalPlayback) { + jack_error("AC3 encoding can only be used with a digital device"); + goto error; + } + + JackAC3EncoderParams params; + memset(¶ms, 0, sizeof(JackAC3EncoderParams)); + params.bitrate = ac3_bitrate; + params.channels = outchannels; + params.sample_rate = sample_rate; + params.lfe = ac3_lfe; + fAC3Encoder = new JackAC3Encoder(params); + + if (!fAC3Encoder || !fAC3Encoder->Init(sample_rate)) { + jack_error("Cannot allocate or init AC3 encoder"); + goto error; + } + + // Setup AC3 channel number + fPlaybackChannels = outchannels; + if (ac3_lfe) { + fPlaybackChannels++; + } + + if (fPlaybackChannels < 2 || fPlaybackChannels > 6) { + jack_error("AC3 encoder channels must be between 2 and 6"); + goto error; + } + + // Force real output channel number to 2 + outchannels = out_nChannels = 2; + + } else { + fPlaybackChannels = outchannels; + } + + // Core driver may have changed the in/out values + fCaptureChannels = inchannels; if (OpenAUHAL(capturing, playing, inchannels, outchannels, in_nChannels, out_nChannels, parsed_chan_in_list, parsed_chan_out_list, buffer_size, sample_rate) < 0) { goto error; @@ -1937,10 +2118,7 @@ int JackCoreAudioDriver::Open(jack_nframes_t buffer_size, if (AddListeners() < 0) { goto error; } - - // Core driver may have changed the in/out values - fCaptureChannels = inchannels; - fPlaybackChannels = outchannels; + return noErr; error: @@ -2044,18 +2222,18 @@ int JackCoreAudioDriver::Attach() char name[REAL_JACK_PORT_NAME_SIZE]; char alias[REAL_JACK_PORT_NAME_SIZE]; - jack_log("JackCoreAudioDriver::Attach fBufferSize %ld fSampleRate %ld", fEngineControl->fBufferSize, fEngineControl->fSampleRate); + jack_log("JackCoreAudioDriver::Attach : fBufferSize %ld fSampleRate %ld", fEngineControl->fBufferSize, fEngineControl->fSampleRate); for (int i = 0; i < fCaptureChannels; i++) { err = AudioDeviceGetPropertyInfo(fDeviceID, i + 1, true, kAudioDevicePropertyChannelName, &size, &isWritable); if (err != noErr) { - jack_log("AudioDeviceGetPropertyInfo kAudioDevicePropertyChannelName error"); + jack_log("JackCoreAudioDriver::Attach : AudioDeviceGetPropertyInfo kAudioDevicePropertyChannelName error"); } if (err == noErr && size > 0) { err = AudioDeviceGetProperty(fDeviceID, i + 1, true, kAudioDevicePropertyChannelName, &size, channel_name); if (err != noErr) { - jack_log("AudioDeviceGetProperty kAudioDevicePropertyChannelName error"); + jack_log("JackCoreAudioDriver::Attach : AudioDeviceGetProperty kAudioDevicePropertyChannelName error"); } snprintf(alias, sizeof(alias), "%s:%s:out_%s%u", fAliasName, fCaptureDriverName, channel_name, i + 1); } else { @@ -2078,12 +2256,12 @@ int JackCoreAudioDriver::Attach() err = AudioDeviceGetPropertyInfo(fDeviceID, i + 1, false, kAudioDevicePropertyChannelName, &size, &isWritable); if (err != noErr) { - jack_log("AudioDeviceGetPropertyInfo kAudioDevicePropertyChannelName error"); + jack_log("JackCoreAudioDriver::Attach : AudioDeviceGetPropertyInfo kAudioDevicePropertyChannelName error"); } if (err == noErr && size > 0) { err = AudioDeviceGetProperty(fDeviceID, i + 1, false, kAudioDevicePropertyChannelName, &size, channel_name); if (err != noErr) { - jack_log("AudioDeviceGetProperty kAudioDevicePropertyChannelName error"); + jack_log("JackCoreAudioDriver::Attach : AudioDeviceGetProperty kAudioDevicePropertyChannelName error"); } snprintf(alias, sizeof(alias), "%s:%s:in_%s%u", fAliasName, fPlaybackDriverName, channel_name, i + 1); } else { @@ -2103,7 +2281,7 @@ int JackCoreAudioDriver::Attach() // Monitor ports if (fWithMonitorPorts) { - jack_log("Create monitor port"); + jack_log("JackCoreAudioDriver::Attach : create monitor port"); snprintf(name, sizeof(name), "%s:monitor_%u", fClientControl.fName, i + 1); if (fEngine->PortRegister(fClientControl.fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, MonitorDriverFlags, fEngineControl->fBufferSize, &port_index) < 0) { jack_error("Cannot register monitor port for %s", name); @@ -2113,6 +2291,15 @@ int JackCoreAudioDriver::Attach() } } } + + if (fAC3Encoder) { + // Setup specific AC3 channels names + for (int i = 0; i < fPlaybackChannels; i++) { + fAC3Encoder->GetChannelName("coreaudio", "", alias, i); + port = fGraphManager->GetPort(fPlaybackPortList[i]); + port->SetAlias(alias); + } + } UpdateLatencies(); @@ -2138,7 +2325,7 @@ int JackCoreAudioDriver::Start() while (!fState && count++ < WAIT_COUNTER) { usleep(100000); - jack_log("JackCoreAudioDriver::Start wait count = %d", count); + jack_log("JackCoreAudioDriver::Start : wait count = %d", count); } if (count < WAIT_COUNTER) { @@ -2195,6 +2382,8 @@ bool JackCoreAudioDriver::TakeHogAux(AudioDeviceID deviceID, bool isInput) jack_error("Cannot read hog state..."); printError(err); } + + jack_log("JackCoreAudioDriver::TakeHogAux : deviceID = %d", deviceID); if (hog_pid != getpid()) { hog_pid = getpid(); @@ -2216,11 +2405,11 @@ bool JackCoreAudioDriver::TakeHog() err = AudioDeviceGetProperty(fDeviceID, 0, kAudioDeviceSectionGlobal, kAudioAggregateDevicePropertyActiveSubDeviceList, &outSize, sub_device); if (err != noErr) { - jack_log("Device does not have subdevices"); + jack_log("JackCoreAudioDriver::TakeHog : device does not have subdevices"); return TakeHogAux(fDeviceID, true); } else { int num_devices = outSize / sizeof(AudioObjectID); - jack_log("Device does has %d subdevices", num_devices); + jack_log("JackCoreAudioDriver::TakeHog : device does has %d subdevices", num_devices); for (int i = 0; i < num_devices; i++) { if (!TakeHogAux(sub_device[i], true)) { return false; @@ -2275,7 +2464,17 @@ extern "C" value.i = 0; jack_driver_descriptor_add_parameter(desc, &filler, "monitor", 'm', JackDriverParamBool, &value, NULL, "Provide monitor ports for the output", NULL); - + +#ifndef __ppc__ + value.i = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "AC3-encoding", 'a', JackDriverParamBool, &value, NULL, "AC3 multi-channels encoding", NULL); + + value.i = 448; + jack_driver_descriptor_add_parameter(desc, &filler, "AC3-bitrate", 'b', JackDriverParamUInt, &value, NULL, "AC3 bitrate", NULL); + + value.i = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "AC3-LFE", 'f', JackDriverParamBool, &value, NULL, "AC3 LFE channel", NULL); +#endif value.i = TRUE; jack_driver_descriptor_add_parameter(desc, &filler, "duplex", 'D', JackDriverParamBool, &value, NULL, "Provide both capture and playback ports", NULL); @@ -2331,6 +2530,9 @@ extern "C" int computation_grain = -1; bool hogged = false; bool clock_drift = false; + bool ac3_encoding = false; + int ac3_bitrate = 448; + bool ac3_lfe = false; for (node = params; node; node = jack_slist_next(node)) { param = (const jack_driver_param_t *) node->data; @@ -2384,6 +2586,20 @@ extern "C" case 'm': monitor = param->value.i; break; + + #ifndef __ppc__ + case 'a': + ac3_encoding = param->value.i; + break; + + case 'b': + ac3_bitrate = param->value.i; + break; + + case 'f': + ac3_lfe = param->value.i; + break; + #endif case 'r': srate = param->value.ui; @@ -2403,6 +2619,7 @@ extern "C" case 'l': Jack::DisplayDeviceNames(); + // Stops the server in this case return NULL; case 'H': @@ -2449,7 +2666,8 @@ extern "C" systemic_output_latency, async_output_latency, computation_grain, - hogged, clock_drift) == 0) { + hogged, clock_drift, + ac3_encoding, ac3_bitrate, ac3_lfe) == 0) { return driver; } else { delete driver; diff --git a/macosx/coreaudio/JackCoreAudioDriver.h b/macosx/coreaudio/JackCoreAudioDriver.h index bc5ddb11..5e70efb8 100644 --- a/macosx/coreaudio/JackCoreAudioDriver.h +++ b/macosx/coreaudio/JackCoreAudioDriver.h @@ -50,10 +50,14 @@ typedef UInt8 CAAudioHardwareDeviceSectionID; \todo hardware monitoring */ +class JackAC3Encoder; + class JackCoreAudioDriver : public JackAudioDriver { private: + + JackAC3Encoder* fAC3Encoder; AudioUnit fAUHAL; @@ -75,8 +79,8 @@ class JackCoreAudioDriver : public JackAudioDriver float fIOUsage; float fComputationGrain; bool fClockDriftCompensate; + bool fDigitalPlayback; - static OSStatus Render(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, @@ -122,7 +126,8 @@ class JackCoreAudioDriver : public JackAudioDriver const char* playback_driver_uid, char* capture_driver_name, char* playback_driver_name, - jack_nframes_t samplerate); + jack_nframes_t samplerate, + bool ac3_encoding); int SetupChannels(bool capturing, bool playing, @@ -158,6 +163,8 @@ class JackCoreAudioDriver : public JackAudioDriver bool TakeHog(); void UpdateLatencies(); + + bool IsDigitalDevice(AudioDeviceID device); public: @@ -180,7 +187,10 @@ class JackCoreAudioDriver : public JackAudioDriver int async_output_latency, int computation_grain, bool hogged, - bool clock_drift); + bool clock_drift, + bool ac3_encoding, + int ac3_bitrate, + bool ac3_lfe); int Close(); int Attach(); diff --git a/macosx/coremidi/JackCoreMidiDriver.cpp b/macosx/coremidi/JackCoreMidiDriver.cpp index f6c44f2c..df8bd065 100644 --- a/macosx/coremidi/JackCoreMidiDriver.cpp +++ b/macosx/coremidi/JackCoreMidiDriver.cpp @@ -18,13 +18,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include - -#include - +#include "JackCompilerDeps.h" #include "JackCoreMidiDriver.h" #include "JackCoreMidiUtil.h" #include "JackEngineControl.h" +#include "driver_interface.h" + +#include +#include using Jack::JackCoreMidiDriver; diff --git a/macosx/coremidi/JackCoreMidiInputPort.cpp b/macosx/coremidi/JackCoreMidiInputPort.cpp index c7d8a869..e0a53e6f 100644 --- a/macosx/coremidi/JackCoreMidiInputPort.cpp +++ b/macosx/coremidi/JackCoreMidiInputPort.cpp @@ -22,6 +22,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "JackCoreMidiInputPort.h" #include "JackMidiUtil.h" +#include "JackError.h" using Jack::JackCoreMidiInputPort; diff --git a/macosx/coremidi/JackCoreMidiOutputPort.cpp b/macosx/coremidi/JackCoreMidiOutputPort.cpp index c6409afa..a5266dee 100644 --- a/macosx/coremidi/JackCoreMidiOutputPort.cpp +++ b/macosx/coremidi/JackCoreMidiOutputPort.cpp @@ -26,6 +26,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "JackCoreMidiOutputPort.h" #include "JackMidiUtil.h" #include "JackTime.h" +#include "JackError.h" using Jack::JackCoreMidiOutputPort; diff --git a/macosx/iphone/freeverb.mm b/macosx/iphone/freeverb.mm index 1d1517d7..9df8c398 100644 --- a/macosx/iphone/freeverb.mm +++ b/macosx/iphone/freeverb.mm @@ -66,8 +66,8 @@ struct Meta : map #define max(x,y) (((x)>(y)) ? (x) : (y)) #define min(x,y) (((x)<(y)) ? (x) : (y)) -inline int lsr (int x, int n) { return int(((unsigned int)x) >> n); } -inline int int2pow2 (int x) { int r=0; while ((1<> n); } +inline int int2pow2 (int x) { int r = 0; while ((1< { - void declare (const char* key, const char* value) { (*this)[key]=value; } + void declare (const char* key, const char* value) { (*this)[key] = value; } }; //inline void *aligned_calloc(size_t nmemb, size_t size) { return (void*)((unsigned)(calloc((nmemb*size)+15,sizeof(char)))+15 & 0xfffffff0); } @@ -191,15 +191,15 @@ public: // -- passive widgets - virtual void addNumDisplay(const char* label, float* zone, int precision) {} + virtual void addNumDisplay(const char* label, float* zone, int precision) {} virtual void addTextDisplay(const char* label, float* zone, char* names[], float min, float max) {} virtual void addHorizontalBargraph(const char* label, float* zone, float min, float max) {} - virtual void addVerticalBargraph(const char* label, float* zone, float min, float max) {} + virtual void addVerticalBargraph(const char* label, float* zone, float min, float max) {} virtual void openFrameBox(const char* label) { openAnyBox(label); } - virtual void openTabBox(const char* label) { openAnyBox(label); } + virtual void openTabBox(const char* label) { openAnyBox(label); } virtual void openHorizontalBox(const char* label) { openAnyBox(label); } - virtual void openVerticalBox(const char* label) { openAnyBox(label); } + virtual void openVerticalBox(const char* label) { openAnyBox(label); } virtual void closeBox() { fPrefix.pop(); } @@ -2612,8 +2612,6 @@ class mydsp : public dsp{ } } }; - - mydsp DSP; diff --git a/macosx/libaften_pcm.a b/macosx/libaften_pcm.a new file mode 100644 index 00000000..9fb3da30 Binary files /dev/null and b/macosx/libaften_pcm.a differ diff --git a/macosx/libaften_static.a b/macosx/libaften_static.a new file mode 100644 index 00000000..b5769919 Binary files /dev/null and b/macosx/libaften_static.a differ diff --git a/man/wscript b/man/wscript index 31bd60f3..b71455b0 100644 --- a/man/wscript +++ b/man/wscript @@ -4,10 +4,9 @@ import Build import re import os -import misc def build(bld): bld.exec_command("cd man ; sh fill_template %s" % bld.env['JACK_VERSION']) - bld.install_files(bld.env['MANDIR'], '*.1') + bld.install_files(bld.env['MANDIR'], bld.path.ant_glob('*.1')) diff --git a/posix/JackCompilerDeps_os.h b/posix/JackCompilerDeps_os.h index fba2a43c..c1c17cda 100644 --- a/posix/JackCompilerDeps_os.h +++ b/posix/JackCompilerDeps_os.h @@ -33,14 +33,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. than use the natural alignment of the processor and/or compiler. */ - #if (__GNUC__< 4) /* Does not seem to work with GCC 3.XX serie */ - #define POST_PACKED_STRUCTURE - #elif defined(JACK_32_64) - #define POST_PACKED_STRUCTURE __attribute__((__packed__)) - #else - #define POST_PACKED_STRUCTURE - #endif + #define POST_PACKED_STRUCTURE __attribute__((__packed__)) #endif + #define MEM_ALIGN(x,y) x __attribute__((aligned(y))) #define LIB_EXPORT __attribute__((visibility("default"))) #ifdef SERVER_SIDE @@ -52,11 +47,15 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #else #define SERVER_EXPORT __attribute__((visibility("hidden"))) #endif + #else #define MEM_ALIGN(x,y) x #define LIB_EXPORT #define SERVER_EXPORT + /* Add other things here for non-gcc platforms for PRE and POST_PACKED_STRUCTURE */ + #define PRE_PACKED_STRUCTURE + #define POST_PACKED_STRUCTURE #endif #endif diff --git a/posix/JackNetUnixSocket.cpp b/posix/JackNetUnixSocket.cpp index e71b81d8..f4a1b942 100644 --- a/posix/JackNetUnixSocket.cpp +++ b/posix/JackNetUnixSocket.cpp @@ -18,6 +18,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "JackNetUnixSocket.h" +#include "JackError.h" + #include #include @@ -331,10 +333,6 @@ namespace Jack int JackNetUnixSocket::SetTimeOut(int us) { jack_log("JackNetUnixSocket::SetTimeout %d usecs", us); - - //negative timeout, or exceding 10s, return - if ((us < 0) ||(us > 10000000)) - return SOCKET_ERROR; struct timeval timeout; //less than 1sec @@ -343,10 +341,10 @@ namespace Jack timeout.tv_usec = us; } else { //more than 1sec - float sec = static_cast(us) / 1000000.f; - timeout.tv_sec =(int) sec; - float usec = (sec - static_cast(timeout.tv_sec)) * 1000000; - timeout.tv_usec =(int) usec; + float sec = float(us) / 1000000.f; + timeout.tv_sec = (int)sec; + float usec = (sec - float(timeout.tv_sec)) * 1000000; + timeout.tv_usec =(int)usec; } return SetOption(SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); } diff --git a/posix/JackPosixMutex.cpp b/posix/JackPosixMutex.cpp new file mode 100644 index 00000000..12f76f5e --- /dev/null +++ b/posix/JackPosixMutex.cpp @@ -0,0 +1,137 @@ +/* + Copyright (C) 2006 Grame + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Grame Research Laboratory, 9 rue du Garet, 69001 Lyon - France + grame@grame.fr +*/ + +#include "JackPosixMutex.h" +#include "JackError.h" + +namespace Jack +{ + + JackBasePosixMutex::JackBasePosixMutex(const char* name) + :fOwner(0) + { + int res = pthread_mutex_init(&fMutex, NULL); + ThrowIf(res != 0, JackException("JackBasePosixMutex: could not init the mutex")); + } + + JackBasePosixMutex::~JackBasePosixMutex() + { + pthread_mutex_destroy(&fMutex); + } + + bool JackBasePosixMutex::Lock() + { + pthread_t current_thread = pthread_self(); + + if (!pthread_equal(current_thread, fOwner)) { + int res = pthread_mutex_lock(&fMutex); + if (res == 0) { + fOwner = current_thread; + return true; + } else { + jack_error("JackBasePosixMutex::Lock res = %d", res); + return false; + } + } else { + jack_error("JackBasePosixMutex::Lock mutex already locked by thread = %d", current_thread); + return false; + } + } + + bool JackBasePosixMutex::Trylock() + { + pthread_t current_thread = pthread_self(); + + if (!pthread_equal(current_thread, fOwner)) { + int res = pthread_mutex_trylock(&fMutex); + if (res == 0) { + fOwner = current_thread; + return true; + } else { + return false; + } + } else { + jack_error("JackBasePosixMutex::Trylock mutex already locked by thread = %d", current_thread); + return false; + } + } + + bool JackBasePosixMutex::Unlock() + { + if (pthread_equal(pthread_self(), fOwner)) { + fOwner = 0; + int res = pthread_mutex_unlock(&fMutex); + if (res == 0) { + return true; + } else { + jack_error("JackBasePosixMutex::Unlock res = %d", res); + return false; + } + } else { + jack_error("JackBasePosixMutex::Unlock mutex not locked by thread = %d owner %d", pthread_self(), fOwner); + return false; + } + } + + JackPosixMutex::JackPosixMutex(const char* name) + { + // Use recursive mutex + pthread_mutexattr_t mutex_attr; + int res; + res = pthread_mutexattr_init(&mutex_attr); + ThrowIf(res != 0, JackException("JackBasePosixMutex: could not init the mutex attribute")); + res = pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE); + ThrowIf(res != 0, JackException("JackBasePosixMutex: could not settype the mutex")); + res = pthread_mutex_init(&fMutex, &mutex_attr); + ThrowIf(res != 0, JackException("JackBasePosixMutex: could not init the mutex")); + pthread_mutexattr_destroy(&mutex_attr); + } + + JackPosixMutex::~JackPosixMutex() + { + pthread_mutex_destroy(&fMutex); + } + + bool JackPosixMutex::Lock() + { + int res = pthread_mutex_lock(&fMutex); + if (res != 0) { + jack_log("JackPosixMutex::Lock res = %d", res); + } + return (res == 0); + } + + bool JackPosixMutex::Trylock() + { + return (pthread_mutex_trylock(&fMutex) == 0); + } + + bool JackPosixMutex::Unlock() + { + int res = pthread_mutex_unlock(&fMutex); + if (res != 0) { + jack_log("JackPosixMutex::Unlock res = %d", res); + } + return (res == 0); + } + + +} // namespace diff --git a/posix/JackPosixMutex.h b/posix/JackPosixMutex.h index 12d98036..65af725a 100644 --- a/posix/JackPosixMutex.h +++ b/posix/JackPosixMutex.h @@ -22,8 +22,9 @@ #ifndef __JackPosixMutex__ #define __JackPosixMutex__ -#include "JackError.h" #include "JackException.h" +#include "JackCompilerDeps.h" + #include #include #include @@ -34,7 +35,7 @@ namespace Jack \brief Mutex abstraction. */ -class JackBasePosixMutex +class SERVER_EXPORT JackBasePosixMutex { protected: @@ -44,74 +45,16 @@ class JackBasePosixMutex public: - JackBasePosixMutex():fOwner(0) - { - int res = pthread_mutex_init(&fMutex, NULL); - ThrowIf(res != 0, JackException("JackBasePosixMutex: could not init the mutex")); - } - - virtual ~JackBasePosixMutex() - { - pthread_mutex_destroy(&fMutex); - } - - bool Lock() - { - pthread_t current_thread = pthread_self(); - - if (!pthread_equal(current_thread, fOwner)) { - int res = pthread_mutex_lock(&fMutex); - if (res == 0) { - fOwner = current_thread; - return true; - } else { - jack_error("JackBasePosixMutex::Lock res = %d", res); - return false; - } - } else { - jack_error("JackBasePosixMutex::Lock mutex already locked by thread = %d", current_thread); - return false; - } - } - - bool Trylock() - { - pthread_t current_thread = pthread_self(); - - if (!pthread_equal(current_thread, fOwner)) { - int res = pthread_mutex_trylock(&fMutex); - if (res == 0) { - fOwner = current_thread; - return true; - } else { - return false; - } - } else { - jack_error("JackBasePosixMutex::Trylock mutex already locked by thread = %d", current_thread); - return false; - } - } - - bool Unlock() - { - if (pthread_equal(pthread_self(), fOwner)) { - fOwner = 0; - int res = pthread_mutex_unlock(&fMutex); - if (res == 0) { - return true; - } else { - jack_error("JackBasePosixMutex::Unlock res = %d", res); - return false; - } - } else { - jack_error("JackBasePosixMutex::Unlock mutex not locked by thread = %d owner %d", pthread_self(), fOwner); - return false; - } - } + JackBasePosixMutex(const char* name = NULL); + virtual ~JackBasePosixMutex(); + + bool Lock(); + bool Trylock(); + bool Unlock(); }; -class JackPosixMutex +class SERVER_EXPORT JackPosixMutex { protected: @@ -119,51 +62,14 @@ class JackPosixMutex public: - JackPosixMutex() - { - // Use recursive mutex - pthread_mutexattr_t mutex_attr; - int res; - res = pthread_mutexattr_init(&mutex_attr); - ThrowIf(res != 0, JackException("JackBasePosixMutex: could not init the mutex attribute")); - res = pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE); - ThrowIf(res != 0, JackException("JackBasePosixMutex: could not settype the mutex")); - res = pthread_mutex_init(&fMutex, &mutex_attr); - ThrowIf(res != 0, JackException("JackBasePosixMutex: could not init the mutex")); - pthread_mutexattr_destroy(&mutex_attr); - } - - virtual ~JackPosixMutex() - { - pthread_mutex_destroy(&fMutex); - } - - bool Lock() - { - int res = pthread_mutex_lock(&fMutex); - if (res != 0) { - jack_log("JackPosixMutex::Lock res = %d", res); - } - return (res == 0); - } - - bool Trylock() - { - return (pthread_mutex_trylock(&fMutex) == 0); - } - - bool Unlock() - { - int res = pthread_mutex_unlock(&fMutex); - if (res != 0) { - jack_log("JackPosixMutex::Unlock res = %d", res); - } - return (res == 0); - } + JackPosixMutex(const char* name = NULL); + virtual ~JackPosixMutex(); + bool Lock(); + bool Trylock(); + bool Unlock(); }; - } // namespace #endif diff --git a/posix/JackProcessSync.cpp b/posix/JackPosixProcessSync.cpp similarity index 53% rename from posix/JackProcessSync.cpp rename to posix/JackPosixProcessSync.cpp index 54554b4d..04c8785f 100644 --- a/posix/JackProcessSync.cpp +++ b/posix/JackPosixProcessSync.cpp @@ -1,4 +1,4 @@ -/* + /* Copyright (C) 2004-2008 Grame This program is free software; you can redistribute it and/or modify @@ -17,84 +17,95 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include "JackProcessSync.h" +#include "JackPosixProcessSync.h" #include "JackError.h" namespace Jack { -void JackProcessSync::Signal() +void JackPosixProcessSync::Signal() { int res = pthread_cond_signal(&fCond); - if (res != 0) - jack_error("JackProcessSync::Signal error err = %s", strerror(res)); + if (res != 0) { + jack_error("JackPosixProcessSync::Signal error err = %s", strerror(res)); + } } // TO DO : check thread consistency? -void JackProcessSync::LockedSignal() +void JackPosixProcessSync::LockedSignal() { int res = pthread_mutex_lock(&fMutex); - if (res != 0) - jack_error("JackProcessSync::LockedSignal error err = %s", strerror(res)); + if (res != 0) { + jack_error("JackPosixProcessSync::LockedSignal error err = %s", strerror(res)); + } res = pthread_cond_signal(&fCond); - if (res != 0) - jack_error("JackProcessSync::LockedSignal error err = %s", strerror(res)); + if (res != 0) { + jack_error("JackPosixProcessSync::LockedSignal error err = %s", strerror(res)); + } res = pthread_mutex_unlock(&fMutex); - if (res != 0) - jack_error("JackProcessSync::LockedSignal error err = %s", strerror(res)); + if (res != 0) { + jack_error("JackPosixProcessSync::LockedSignal error err = %s", strerror(res)); + } } -void JackProcessSync::SignalAll() +void JackPosixProcessSync::SignalAll() { int res = pthread_cond_broadcast(&fCond); - if (res != 0) - jack_error("JackProcessSync::SignalAll error err = %s", strerror(res)); + if (res != 0) { + jack_error("JackPosixProcessSync::SignalAll error err = %s", strerror(res)); + } } // TO DO : check thread consistency? -void JackProcessSync::LockedSignalAll() +void JackPosixProcessSync::LockedSignalAll() { int res = pthread_mutex_lock(&fMutex); - if (res != 0) - jack_error("JackProcessSync::LockedSignalAll error err = %s", strerror(res)); + if (res != 0) { + jack_error("JackPosixProcessSync::LockedSignalAll error err = %s", strerror(res)); + } res = pthread_cond_broadcast(&fCond); - if (res != 0) - jack_error("JackProcessSync::LockedSignalAll error err = %s", strerror(res)); + if (res != 0) { + jack_error("JackPosixProcessSync::LockedSignalAll error err = %s", strerror(res)); + } res = pthread_mutex_unlock(&fMutex); - if (res != 0) - jack_error("JackProcessSync::LockedSignalAll error err = %s", strerror(res)); + if (res != 0) { + jack_error("JackPosixProcessSync::LockedSignalAll error err = %s", strerror(res)); + } } -void JackProcessSync::Wait() +void JackPosixProcessSync::Wait() { - ThrowIf(!pthread_equal(pthread_self(), fOwner), JackException("JackProcessSync::Wait: a thread has to have locked a mutex before it can wait")); + ThrowIf(!pthread_equal(pthread_self(), fOwner), JackException("JackPosixProcessSync::Wait: a thread has to have locked a mutex before it can wait")); fOwner = 0; int res = pthread_cond_wait(&fCond, &fMutex); if (res != 0) { - jack_error("JackProcessSync::Wait error err = %s", strerror(res)); + jack_error("JackPosixProcessSync::Wait error err = %s", strerror(res)); } else { fOwner = pthread_self(); } } // TO DO : check thread consistency? -void JackProcessSync::LockedWait() +void JackPosixProcessSync::LockedWait() { int res; res = pthread_mutex_lock(&fMutex); - if (res != 0) - jack_error("JackProcessSync::LockedWait error err = %s", strerror(res)); - if ((res = pthread_cond_wait(&fCond, &fMutex)) != 0) - jack_error("JackProcessSync::LockedWait error err = %s", strerror(res)); + if (res != 0) { + jack_error("JackPosixProcessSync::LockedWait error err = %s", strerror(res)); + } + if ((res = pthread_cond_wait(&fCond, &fMutex)) != 0) { + jack_error("JackPosixProcessSync::LockedWait error err = %s", strerror(res)); + } res = pthread_mutex_unlock(&fMutex); - if (res != 0) - jack_error("JackProcessSync::LockedWait error err = %s", strerror(res)); + if (res != 0) { + jack_error("JackPosixProcessSync::LockedWait error err = %s", strerror(res)); + } } -bool JackProcessSync::TimedWait(long usec) +bool JackPosixProcessSync::TimedWait(long usec) { - ThrowIf(!pthread_equal(pthread_self(), fOwner), JackException("JackProcessSync::TimedWait: a thread has to have locked a mutex before it can wait")); + ThrowIf(!pthread_equal(pthread_self(), fOwner), JackException("JackPosixProcessSync::TimedWait: a thread has to have locked a mutex before it can wait")); fOwner = 0; struct timeval T0, T1; @@ -102,7 +113,7 @@ bool JackProcessSync::TimedWait(long usec) struct timeval now; int res; - jack_log("JackProcessSync::TimedWait time out = %ld", usec); + jack_log("JackPosixProcessSync::TimedWait time out = %ld", usec); gettimeofday(&T0, 0); gettimeofday(&now, 0); @@ -112,20 +123,20 @@ bool JackProcessSync::TimedWait(long usec) res = pthread_cond_timedwait(&fCond, &fMutex, &time); if (res != 0) { - jack_error("JackProcessSync::TimedWait error usec = %ld err = %s", usec, strerror(res)); + jack_error("JackPosixProcessSync::TimedWait error usec = %ld err = %s", usec, strerror(res)); } else { fOwner = pthread_self(); } gettimeofday(&T1, 0); - jack_log("JackProcessSync::TimedWait finished delta = %5.1lf", + jack_log("JackPosixProcessSync::TimedWait finished delta = %5.1lf", (1e6 * T1.tv_sec - 1e6 * T0.tv_sec + T1.tv_usec - T0.tv_usec)); return (res == 0); } // TO DO : check thread consistency? -bool JackProcessSync::LockedTimedWait(long usec) +bool JackPosixProcessSync::LockedTimedWait(long usec) { struct timeval T0, T1; timespec time; @@ -133,10 +144,11 @@ bool JackProcessSync::LockedTimedWait(long usec) int res1, res2; res1 = pthread_mutex_lock(&fMutex); - if (res1 != 0) - jack_error("JackProcessSync::LockedTimedWait error err = %s", usec, strerror(res1)); + if (res1 != 0) { + jack_error("JackPosixProcessSync::LockedTimedWait error err = %s", usec, strerror(res1)); + } - jack_log("JackProcessSync::TimedWait time out = %ld", usec); + jack_log("JackPosixProcessSync::TimedWait time out = %ld", usec); gettimeofday(&T0, 0); gettimeofday(&now, 0); @@ -144,15 +156,17 @@ bool JackProcessSync::LockedTimedWait(long usec) time.tv_sec = now.tv_sec + (next_date_usec / 1000000); time.tv_nsec = (next_date_usec % 1000000) * 1000; res2 = pthread_cond_timedwait(&fCond, &fMutex, &time); - if (res2 != 0) - jack_error("JackProcessSync::LockedTimedWait error usec = %ld err = %s", usec, strerror(res2)); + if (res2 != 0) { + jack_error("JackPosixProcessSync::LockedTimedWait error usec = %ld err = %s", usec, strerror(res2)); + } gettimeofday(&T1, 0); res1 = pthread_mutex_unlock(&fMutex); - if (res1 != 0) - jack_error("JackProcessSync::LockedTimedWait error err = %s", usec, strerror(res1)); + if (res1 != 0) { + jack_error("JackPosixProcessSync::LockedTimedWait error err = %s", usec, strerror(res1)); + } - jack_log("JackProcessSync::TimedWait finished delta = %5.1lf", + jack_log("JackPosixProcessSync::TimedWait finished delta = %5.1lf", (1e6 * T1.tv_sec - 1e6 * T0.tv_sec + T1.tv_usec - T0.tv_usec)); return (res2 == 0); diff --git a/posix/JackProcessSync.h b/posix/JackPosixProcessSync.h similarity index 82% rename from posix/JackProcessSync.h rename to posix/JackPosixProcessSync.h index 54ad6187..956d39c3 100644 --- a/posix/JackProcessSync.h +++ b/posix/JackPosixProcessSync.h @@ -17,10 +17,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef __JackProcessSync__ -#define __JackProcessSync__ +#ifndef __JackPosixProcessSync__ +#define __JackPosixProcessSync__ -#include "JackPlatformPlug.h" #include "JackPosixMutex.h" #include "JackException.h" #include @@ -30,10 +29,10 @@ namespace Jack { /*! -\brief A synchronization primitive built using a condition variable. +\brief A synchronization primitive built using a condition variable. */ -class JackProcessSync : public JackBasePosixMutex +class JackPosixProcessSync : public JackBasePosixMutex { private: @@ -42,13 +41,13 @@ class JackProcessSync : public JackBasePosixMutex public: - JackProcessSync():JackBasePosixMutex() + JackPosixProcessSync(const char* name = NULL):JackBasePosixMutex() { int res = pthread_cond_init(&fCond, NULL); ThrowIf(res != 0, JackException("JackBasePosixMutex: could not init the cond variable")); } - virtual ~JackProcessSync() + virtual ~JackPosixProcessSync() { pthread_cond_destroy(&fCond); } diff --git a/posix/JackPosixSemaphore.cpp b/posix/JackPosixSemaphore.cpp index 2c3377ad..63e0e8f2 100644 --- a/posix/JackPosixSemaphore.cpp +++ b/posix/JackPosixSemaphore.cpp @@ -120,8 +120,8 @@ bool JackPosixSemaphore::TimedWait(long usec) while ((res = sem_timedwait(fSemaphore, &time)) < 0) { jack_error("JackPosixSemaphore::TimedWait err = %s", strerror(errno)); - jack_log("now %ld %ld ", now.tv_sec, now.tv_usec); - jack_log("next %ld %ld ", time.tv_sec, time.tv_nsec/1000); + jack_log("JackPosixSemaphore::TimedWait now : %ld %ld ", now.tv_sec, now.tv_usec); + jack_log("JackPosixSemaphore::TimedWait next : %ld %ld ", time.tv_sec, time.tv_nsec/1000); if (errno != EINTR) break; } diff --git a/posix/JackPosixThread.cpp b/posix/JackPosixThread.cpp index cae2c493..e11358cb 100644 --- a/posix/JackPosixThread.cpp +++ b/posix/JackPosixThread.cpp @@ -42,7 +42,7 @@ void* JackPosixThread::ThreadHandler(void* arg) } // Signal creation thread when started with StartSync - jack_log("ThreadHandler: start"); + jack_log("JackPosixThread::ThreadHandler : start"); obj->fStatus = kIniting; // Call Init method @@ -59,7 +59,7 @@ void* JackPosixThread::ThreadHandler(void* arg) res = runnable->Execute(); } - jack_log("ThreadHandler: exit"); + jack_log("JackPosixThread::ThreadHandler : exit"); pthread_exit(0); return 0; // never reached } @@ -112,7 +112,7 @@ int JackPosixThread::StartImp(jack_native_thread_t* thread, int priority, int re if (realtime) { - jack_log("Create RT thread"); + jack_log("JackPosixThread::StartImp : create RT thread"); if ((res = pthread_attr_setinheritsched(&attributes, PTHREAD_EXPLICIT_SCHED))) { jack_error("Cannot request explicit scheduling for RT thread res = %d", res); @@ -133,7 +133,7 @@ int JackPosixThread::StartImp(jack_native_thread_t* thread, int priority, int re } } else { - jack_log("Create non RT thread"); + jack_log("JackPosixThread::StartImp : create non RT thread"); } if ((res = pthread_attr_setstacksize(&attributes, THREAD_STACK))) { diff --git a/posix/JackSocket.cpp b/posix/JackSocket.cpp index 2157a455..1f50bbef 100644 --- a/posix/JackSocket.cpp +++ b/posix/JackSocket.cpp @@ -36,7 +36,7 @@ static void BuildName(const char* client_name, char* res, const char* dir, int w 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): JackClientRequestInterface(), fSocket(socket),fTimeOut(0) {} #if defined(__sun__) || defined(sun) @@ -120,7 +120,7 @@ int JackClientSocket::Connect(const char* dir, const char* name, int which) // A addr.sun_family = AF_UNIX; BuildName(name, addr.sun_path, dir, which); - jack_log("Connect: addr.sun_path %s", addr.sun_path); + jack_log("JackClientSocket::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)); @@ -186,7 +186,8 @@ int JackClientSocket::Read(void* data, int len) return 0; // For a non blocking socket, a read failure is not considered as an error } else if (res != 0) { jack_error("Cannot read socket fd = %d err = %s", fSocket, strerror(errno)); - return 0; + //return 0; + return -1; } else { jack_error("Cannot read socket fd = %d err = %s", fSocket, strerror(errno)); return -1; @@ -231,7 +232,8 @@ int JackClientSocket::Write(void* data, int len) return 0; // For a non blocking socket, a write failure is not considered as an error } else if (res != 0) { jack_error("Cannot write socket fd = %ld err = %s", fSocket, strerror(errno)); - return 0; + //return 0; + return -1; } else { jack_error("Cannot write socket fd = %ld err = %s", fSocket, strerror(errno)); return -1; @@ -254,7 +256,7 @@ int JackServerSocket::Bind(const char* dir, const char* name, int which) // A re BuildName(name, fName, dir, which); strncpy(addr.sun_path, fName, sizeof(addr.sun_path) - 1); - jack_log("Bind: addr.sun_path %s", addr.sun_path); + jack_log("JackServerSocket::Bind : addr.sun_path %s", addr.sun_path); unlink(fName); // Security... if (bind(fSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) { diff --git a/posix/JackSocket.h b/posix/JackSocket.h index 01e49539..8568025b 100644 --- a/posix/JackSocket.h +++ b/posix/JackSocket.h @@ -12,7 +12,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 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. */ @@ -23,12 +23,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include -#include +#include #include #include #include #include +#include "JackChannel.h" + namespace Jack { @@ -36,17 +38,17 @@ namespace Jack \brief Client socket. */ -class JackClientSocket +class JackClientSocket : public detail::JackClientRequestInterface { private: int fSocket; int fTimeOut; - + public: - JackClientSocket(): fSocket( -1),fTimeOut(0) + JackClientSocket():JackClientRequestInterface(), fSocket(-1), fTimeOut(0) {} JackClientSocket(int socket); @@ -60,7 +62,7 @@ class JackClientSocket } void SetReadTimeOut(long sec); void SetWriteTimeOut(long sec); - + void SetNonBlocking(bool onoff); }; diff --git a/posix/JackSocketClientChannel.cpp b/posix/JackSocketClientChannel.cpp index e39c61d1..08dbaa76 100644 --- a/posix/JackSocketClientChannel.cpp +++ b/posix/JackSocketClientChannel.cpp @@ -21,42 +21,30 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "JackRequest.h" #include "JackClient.h" #include "JackGlobals.h" +#include "JackError.h" namespace Jack { -JackSocketClientChannel::JackSocketClientChannel(): - fThread(this) +JackSocketClientChannel::JackSocketClientChannel() + :JackGenericClientChannel(), fThread(this) { + fRequest = new JackClientSocket(); fNotificationSocket = NULL; - fClient = NULL; } JackSocketClientChannel::~JackSocketClientChannel() { + delete fRequest; delete fNotificationSocket; } -int JackSocketClientChannel::ServerCheck(const char* server_name) -{ - jack_log("JackSocketClientChannel::ServerCheck = %s", server_name); - - // Connect to server - if (fRequestSocket.Connect(jack_server_dir, server_name, 0) < 0) { - jack_error("Cannot connect to server socket"); - fRequestSocket.Close(); - return -1; - } else { - return 0; - } -} - int JackSocketClientChannel::Open(const char* server_name, const char* name, int uuid, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status) { int result = 0; jack_log("JackSocketClientChannel::Open name = %s", name); - if (fRequestSocket.Connect(jack_server_dir, server_name, 0) < 0) { + if (fRequest->Connect(jack_server_dir, server_name, 0) < 0) { jack_error("Cannot connect to server socket"); goto error; } @@ -82,14 +70,14 @@ int JackSocketClientChannel::Open(const char* server_name, const char* name, int return 0; error: - fRequestSocket.Close(); + fRequest->Close(); fNotificationListenSocket.Close(); return -1; } void JackSocketClientChannel::Close() { - fRequestSocket.Close(); + fRequest->Close(); fNotificationListenSocket.Close(); if (fNotificationSocket) fNotificationSocket->Close(); @@ -115,244 +103,18 @@ void JackSocketClientChannel::Stop() fThread.Kill(); } -void JackSocketClientChannel::ServerSyncCall(JackRequest* req, JackResult* res, int* result) -{ - if (req->Write(&fRequestSocket) < 0) { - jack_error("Could not write request type = %ld", req->fType); - *result = -1; - return; - } - - if (res->Read(&fRequestSocket) < 0) { - jack_error("Could not read result type = %ld", req->fType); - *result = -1; - return; - } - - *result = res->fResult; -} - -void JackSocketClientChannel::ServerAsyncCall(JackRequest* req, JackResult* res, int* result) -{ - if (req->Write(&fRequestSocket) < 0) { - jack_error("Could not write request type = %ld", req->fType); - *result = -1; - } else { - *result = 0; - } -} - -void JackSocketClientChannel::ClientCheck(const char* name, int uuid, char* name_res, int protocol, int options, int* status, int* result, int open) -{ - JackClientCheckRequest req(name, protocol, options, uuid, open); - JackClientCheckResult res; - ServerSyncCall(&req, &res, result); - *status = res.fStatus; - strcpy(name_res, res.fName); -} - -void JackSocketClientChannel::ClientOpen(const char* name, int pid, int uuid, int* shared_engine, int* shared_client, int* shared_graph, int* result) -{ - JackClientOpenRequest req(name, pid, uuid); - JackClientOpenResult res; - ServerSyncCall(&req, &res, result); - *shared_engine = res.fSharedEngine; - *shared_client = res.fSharedClient; - *shared_graph = res.fSharedGraph; -} - -void JackSocketClientChannel::ClientClose(int refnum, int* result) -{ - JackClientCloseRequest req(refnum); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackSocketClientChannel::ClientActivate(int refnum, int is_real_time, int* result) -{ - JackActivateRequest req(refnum, is_real_time); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackSocketClientChannel::ClientDeactivate(int refnum, int* result) -{ - JackDeactivateRequest req(refnum); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackSocketClientChannel::PortRegister(int refnum, const char* name, const char* type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result) -{ - JackPortRegisterRequest req(refnum, name, type, flags, buffer_size); - JackPortRegisterResult res; - ServerSyncCall(&req, &res, result); - *port_index = res.fPortIndex; -} - -void JackSocketClientChannel::PortUnRegister(int refnum, jack_port_id_t port_index, int* result) -{ - JackPortUnRegisterRequest req(refnum, port_index); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackSocketClientChannel::PortConnect(int refnum, const char* src, const char* dst, int* result) -{ - JackPortConnectNameRequest req(refnum, src, dst); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackSocketClientChannel::PortDisconnect(int refnum, const char* src, const char* dst, int* result) -{ - JackPortDisconnectNameRequest req(refnum, src, dst); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackSocketClientChannel::PortConnect(int refnum, jack_port_id_t src, jack_port_id_t dst, int* result) -{ - JackPortConnectRequest req(refnum, src, dst); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackSocketClientChannel::PortDisconnect(int refnum, jack_port_id_t src, jack_port_id_t dst, int* result) -{ - JackPortDisconnectRequest req(refnum, src, dst); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackSocketClientChannel::PortRename(int refnum, jack_port_id_t port, const char* name, int* result) -{ - JackPortRenameRequest req(refnum, port, name); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackSocketClientChannel::SetBufferSize(jack_nframes_t buffer_size, int* result) -{ - JackSetBufferSizeRequest req(buffer_size); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackSocketClientChannel::SetFreewheel(int onoff, int* result) -{ - JackSetFreeWheelRequest req(onoff); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackSocketClientChannel::ComputeTotalLatencies(int* result) -{ - JackComputeTotalLatenciesRequest req; - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackSocketClientChannel::SessionNotify(int refnum, const char* target, jack_session_event_type_t type, const char* path, jack_session_command_t** result) -{ - JackSessionNotifyRequest req(refnum, path, type, target); - JackSessionNotifyResult res; - int intresult; - ServerSyncCall(&req, &res, &intresult); - *result = res.GetCommands(); -} - -void JackSocketClientChannel::SessionReply(int refnum, int* result) -{ - JackSessionReplyRequest req(refnum); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackSocketClientChannel::GetUUIDForClientName(int refnum, const char* client_name, char* uuid_res, int* result) -{ - JackGetUUIDRequest req(client_name); - JackUUIDResult res; - ServerSyncCall(&req, &res, result); - strncpy(uuid_res, res.fUUID, JACK_UUID_SIZE); -} - -void JackSocketClientChannel::GetClientNameForUUID(int refnum, const char* uuid, char* name_res, int* result) -{ - JackGetClientNameRequest req(uuid); - JackClientNameResult res; - ServerSyncCall(&req, &res, result); - strncpy(name_res, res.fName, JACK_CLIENT_NAME_SIZE); -} - -void JackSocketClientChannel::ClientHasSessionCallback(const char* client_name, int* result) -{ - JackClientHasSessionCallbackRequest req(client_name); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackSocketClientChannel::ReserveClientName(int refnum, const char* client_name, const char* uuid, int* result) -{ - JackReserveNameRequest req(refnum, client_name, uuid); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackSocketClientChannel::ReleaseTimebase(int refnum, int* result) -{ - JackReleaseTimebaseRequest req(refnum); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackSocketClientChannel::SetTimebaseCallback(int refnum, int conditional, int* result) -{ - JackSetTimebaseCallbackRequest req(refnum, conditional); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackSocketClientChannel::GetInternalClientName(int refnum, int int_ref, char* name_res, int* result) -{ - JackGetInternalClientNameRequest req(refnum, int_ref); - JackGetInternalClientNameResult res; - ServerSyncCall(&req, &res, result); - strcpy(name_res, res.fName); -} - -void JackSocketClientChannel::InternalClientHandle(int refnum, const char* client_name, int* status, int* int_ref, int* result) -{ - JackInternalClientHandleRequest req(refnum, client_name); - JackInternalClientHandleResult res; - ServerSyncCall(&req, &res, result); - *int_ref = res.fIntRefNum; - *status = res.fStatus; -} - -void JackSocketClientChannel::InternalClientLoad(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int* status, int* int_ref, int uuid, int* result) -{ - JackInternalClientLoadRequest req(refnum, client_name, so_name, objet_data, options, uuid); - JackInternalClientLoadResult res; - ServerSyncCall(&req, &res, result); - *int_ref = res.fIntRefNum; - *status = res.fStatus; -} - -void JackSocketClientChannel::InternalClientUnload(int refnum, int int_ref, int* status, int* result) -{ - JackInternalClientUnloadRequest req(refnum, int_ref); - JackInternalClientUnloadResult res; - ServerSyncCall(&req, &res, result); - *status = res.fStatus; -} - bool JackSocketClientChannel::Init() { jack_log("JackSocketClientChannel::Init"); fNotificationSocket = fNotificationListenSocket.Accept(); + // No more needed fNotificationListenSocket.Close(); + + // Setup context + if (!jack_tls_set(JackGlobals::fNotificationThread, this)) { + jack_error("Failed to set thread notification key"); + } if (!fNotificationSocket) { jack_error("JackSocketClientChannel: cannot establish notication socket"); diff --git a/posix/JackSocketClientChannel.h b/posix/JackSocketClientChannel.h index 50da7de7..a96684d0 100644 --- a/posix/JackSocketClientChannel.h +++ b/posix/JackSocketClientChannel.h @@ -20,33 +20,30 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef __JackSocketClientChannel__ #define __JackSocketClientChannel__ -#include "JackChannel.h" +#include "JackGenericClientChannel.h" #include "JackSocket.h" #include "JackPlatformPlug.h" -#include "JackRequest.h" -#include "JackError.h" +#include "JackThread.h" namespace Jack { +class JackClient; + /*! \brief JackClientChannel using sockets. */ -class JackSocketClientChannel : public detail::JackClientChannelInterface, public JackRunnableInterface +class JackSocketClientChannel : public JackGenericClientChannel, public JackRunnableInterface { private: - JackClientSocket fRequestSocket; // Socket to communicate with the server JackServerSocket fNotificationListenSocket; // Socket listener for server notification JackClientSocket* fNotificationSocket; // Socket for server notification JackThread fThread; // Thread to execute the event loop JackClient* fClient; - void ServerSyncCall(JackRequest* req, JackResult* res, int* result); - void ServerAsyncCall(JackRequest* req, JackResult* res, int* result); - public: JackSocketClientChannel(); @@ -58,49 +55,6 @@ class JackSocketClientChannel : public detail::JackClientChannelInterface, publi int Start(); void Stop(); - int ServerCheck(const char* server_name); - - void ClientCheck(const char* name, int uuid, char* name_res, int protocol, int options, int* status, int* result, int open); - void ClientOpen(const char* name, int pid, int uuid, int* shared_engine, int* shared_client, int* shared_graph, int* result); - void ClientOpen(const char* name, int* ref, int uuid, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, int* result) - {} - void ClientClose(int refnum, int* result); - - void ClientActivate(int refnum, int is_real_time, int* result); - void ClientDeactivate(int refnum, int* result); - - void PortRegister(int refnum, const char* name, const char* type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result); - void PortUnRegister(int refnum, jack_port_id_t port_index, int* result); - - void PortConnect(int refnum, const char* src, const char* dst, int* result); - void PortDisconnect(int refnum, const char* src, const char* dst, int* result); - - void PortConnect(int refnum, jack_port_id_t src, jack_port_id_t dst, int* result); - void PortDisconnect(int refnum, jack_port_id_t src, jack_port_id_t dst, int* result); - - void PortRename(int refnum, jack_port_id_t port, const char* name, int* result); - - void SetBufferSize(jack_nframes_t buffer_size, int* result); - void SetFreewheel(int onoff, int* result); - - void ComputeTotalLatencies(int* result); - - void ReleaseTimebase(int refnum, int* result); - void SetTimebaseCallback(int refnum, int conditional, int* result); - - void GetInternalClientName(int refnum, int int_ref, char* name_res, int* result); - void InternalClientHandle(int refnum, const char* client_name, int* status, int* int_ref, int* result); - void InternalClientLoad(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int* status, int* int_ref, int uuid, int* result); - void InternalClientUnload(int refnum, int int_ref, int* status, int* result); - - // Session API - void SessionNotify(int refnum, const char* target, jack_session_event_type_t type, const char* path, jack_session_command_t** result); - void SessionReply(int refnum, int* result); - void GetUUIDForClientName(int refnum, const char* client_name, char* uuid_res, int* result); - void GetClientNameForUUID(int refnum, const char* uuid, char* name_res, int* result); - void ReserveClientName(int refnum, const char* client_name, const char *uuid, int* result); - void ClientHasSessionCallback(const char* client_name, int* result); - // JackRunnableInterface interface bool Init(); bool Execute(); diff --git a/posix/JackSocketNotifyChannel.cpp b/posix/JackSocketNotifyChannel.cpp index 35737b0d..ac71d514 100644 --- a/posix/JackSocketNotifyChannel.cpp +++ b/posix/JackSocketNotifyChannel.cpp @@ -55,7 +55,6 @@ void JackSocketNotifyChannel::ClientNotify(int refnum, const char* name, int not // Send notification if (event.Write(&fNotifySocket) < 0) { jack_error("Could not write notification"); - fNotifySocket.Close(); *result = -1; return; } @@ -64,8 +63,7 @@ void JackSocketNotifyChannel::ClientNotify(int refnum, const char* name, int not if (sync) { // Get result : use a time out if (res.Read(&fNotifySocket) < 0) { - jack_error("Could not read result"); - fNotifySocket.Close(); + jack_error("Could not read notification result"); *result = -1; } else { *result = res.fResult; diff --git a/posix/JackSocketServerChannel.cpp b/posix/JackSocketServerChannel.cpp index 0f9c98ed..195c41c4 100644 --- a/posix/JackSocketServerChannel.cpp +++ b/posix/JackSocketServerChannel.cpp @@ -37,7 +37,7 @@ namespace Jack { JackSocketServerChannel::JackSocketServerChannel(): - fThread(this) + fThread(this), fDecoder(NULL) { fPollTable = NULL; fRebuild = true; @@ -51,7 +51,7 @@ JackSocketServerChannel::~JackSocketServerChannel() int JackSocketServerChannel::Open(const char* server_name, JackServer* server) { jack_log("JackSocketServerChannel::Open"); - + // Prepare request socket if (fRequestListenSocket.Bind(jack_server_dir, server_name, 0) < 0) { jack_log("JackSocketServerChannel::Open : cannot create result listen socket"); @@ -60,6 +60,8 @@ int JackSocketServerChannel::Open(const char* server_name, JackServer* server) // Prepare for poll BuildPoolTable(); + + fDecoder = new JackRequestDecoder(server, this); fServer = server; return 0; } @@ -70,6 +72,7 @@ void JackSocketServerChannel::Close() // Close remaining client sockets std::map >::iterator it; + for (it = fSocketTable.begin(); it != fSocketTable.end(); it++) { pair elem = (*it).second; JackClientSocket* socket = elem.second; @@ -77,6 +80,9 @@ void JackSocketServerChannel::Close() socket->Close(); delete socket; } + + delete fDecoder; + fDecoder = NULL; } int JackSocketServerChannel::Start() @@ -99,25 +105,43 @@ void JackSocketServerChannel::ClientCreate() jack_log("JackSocketServerChannel::ClientCreate socket"); JackClientSocket* socket = fRequestListenSocket.Accept(); if (socket) { - fSocketTable[socket->GetFd()] = make_pair( -1, socket); + fSocketTable[socket->GetFd()] = make_pair(-1, socket); fRebuild = true; } else { jack_error("Client socket cannot be created"); } } -void JackSocketServerChannel::ClientAdd(int fd, char* name, int pid, int uuid, int* shared_engine, int* shared_client, int* shared_graph, int* result) +int JackSocketServerChannel::GetFd(JackClientSocket* socket_aux) +{ + std::map >::iterator it; + + for (it = fSocketTable.begin(); it != fSocketTable.end(); it++) { + pair elem = (*it).second; + JackClientSocket* socket = elem.second; + if (socket_aux == socket) { + return (*it).first; + } + } + return -1; +} + +void JackSocketServerChannel::ClientAdd(detail::JackChannelTransactionInterface* socket_aux, JackClientOpenRequest* req, JackClientOpenResult *res) { - jack_log("JackSocketServerChannel::ClientAdd"); int refnum = -1; - *result = fServer->GetEngine()->ClientExternalOpen(name, pid, uuid, &refnum, shared_engine, shared_client, shared_graph); - if (*result == 0) { + res->fResult = fServer->GetEngine()->ClientExternalOpen(req->fName, req->fPID, req->fUUID, &refnum, &res->fSharedEngine, &res->fSharedClient, &res->fSharedGraph); + if (res->fResult == 0) { + JackClientSocket* socket = dynamic_cast(socket_aux); + assert(socket); + int fd = GetFd(socket); + assert(fd >= 0); fSocketTable[fd].first = refnum; fRebuild = true; + jack_log("JackSocketServerChannel::ClientAdd ref = %d fd = %d", refnum, fd); #ifdef __APPLE__ int on = 1; if (setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, (const char*)&on, sizeof(on)) < 0) { - jack_log("setsockopt SO_NOSIGPIPE fd = %ld err = %s", fd, strerror(errno)); + jack_log("JackSocketServerChannel::ClientAdd : setsockopt SO_NOSIGPIPE fd = %ld err = %s", fd, strerror(errno)); } #endif } else { @@ -125,12 +149,14 @@ void JackSocketServerChannel::ClientAdd(int fd, char* name, int pid, int uuid, i } } -void JackSocketServerChannel::ClientRemove(int fd, int refnum) +void JackSocketServerChannel::ClientRemove(detail::JackChannelTransactionInterface* socket_aux, int refnum) { - pair elem = fSocketTable[fd]; - JackClientSocket* socket = elem.second; + JackClientSocket* socket = dynamic_cast(socket_aux); assert(socket); - jack_log("JackSocketServerChannel::ClientRemove ref = %d", refnum); + int fd = GetFd(socket); + assert(fd >= 0); + + jack_log("JackSocketServerChannel::ClientRemove ref = %d fd = %d", refnum, fd); fSocketTable.erase(fd); socket->Close(); delete socket; @@ -142,372 +168,21 @@ void JackSocketServerChannel::ClientKill(int fd) pair elem = fSocketTable[fd]; JackClientSocket* socket = elem.second; int refnum = elem.first; - assert(socket); - jack_log("JackSocketServerChannel::ClientKill ref = %d", refnum); - + if (refnum == -1) { // Should never happen... correspond to a client that started the socket but never opened... jack_log("Client was not opened : probably correspond to server_check"); } else { fServer->ClientKill(refnum); } + jack_log("JackSocketServerChannel::ClientKill ref = %d fd = %d", refnum, fd); fSocketTable.erase(fd); socket->Close(); delete socket; fRebuild = true; } -bool JackSocketServerChannel::HandleRequest(int fd) -{ - pair elem = fSocketTable[fd]; - JackClientSocket* socket = elem.second; - assert(socket); - - // Read header - JackRequest header; - if (header.Read(socket) < 0) { - jack_log("HandleRequest: cannot read header"); - ClientKill(fd); - return false; - } - - if (fd == JackServerGlobals::fRTNotificationSocket && header.fType != JackRequest::kNotification) { - jack_error("fRTNotificationSocket = %d", JackServerGlobals::fRTNotificationSocket); - jack_error("JackSocketServerChannel::HandleRequest : incorrect notification !!"); - return true; - } - - // Read data - switch (header.fType) { - - case JackRequest::kClientCheck: { - jack_log("JackRequest::ClientCheck"); - JackClientCheckRequest req; - JackClientCheckResult res; - if (req.Read(socket) == 0) - res.fResult = fServer->GetEngine()->ClientCheck(req.fName, req.fUUID, res.fName, req.fProtocol, req.fOptions, &res.fStatus); - if (res.Write(socket) < 0) - jack_error("JackRequest::ClientCheck write error name = %s", req.fName); - // Atomic ClientCheck followed by ClientOpen on same socket - if (req.fOpen) - HandleRequest(fd); - break; - } - - case JackRequest::kClientOpen: { - jack_log("JackRequest::ClientOpen"); - JackClientOpenRequest req; - JackClientOpenResult res; - if (req.Read(socket) == 0) - ClientAdd(fd, req.fName, req.fPID, req.fUUID, &res.fSharedEngine, &res.fSharedClient, &res.fSharedGraph, &res.fResult); - if (res.Write(socket) < 0) - jack_error("JackRequest::ClientOpen write error name = %s", req.fName); - break; - } - - case JackRequest::kClientClose: { - jack_log("JackRequest::ClientClose"); - JackClientCloseRequest req; - JackResult res; - if (req.Read(socket) == 0) - res.fResult = fServer->GetEngine()->ClientExternalClose(req.fRefNum); - if (res.Write(socket) < 0) - jack_error("JackRequest::ClientClose write error ref = %d", req.fRefNum); - ClientRemove(fd, req.fRefNum); - break; - } - - case JackRequest::kActivateClient: { - JackActivateRequest req; - JackResult res; - jack_log("JackRequest::ActivateClient"); - if (req.Read(socket) == 0) - res.fResult = fServer->GetEngine()->ClientActivate(req.fRefNum, req.fIsRealTime); - if (res.Write(socket) < 0) - jack_error("JackRequest::ActivateClient write error ref = %d", req.fRefNum); - break; - } - - case JackRequest::kDeactivateClient: { - jack_log("JackRequest::DeactivateClient"); - JackDeactivateRequest req; - JackResult res; - if (req.Read(socket) == 0) - res.fResult = fServer->GetEngine()->ClientDeactivate(req.fRefNum); - if (res.Write(socket) < 0) - jack_error("JackRequest::DeactivateClient write error ref = %d", req.fRefNum); - break; - } - - case JackRequest::kRegisterPort: { - jack_log("JackRequest::RegisterPort"); - JackPortRegisterRequest req; - JackPortRegisterResult res; - if (req.Read(socket) == 0) - res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fPortType, req.fFlags, req.fBufferSize, &res.fPortIndex); - if (res.Write(socket) < 0) - jack_error("JackRequest::RegisterPort write error ref = %d", req.fRefNum); - break; - } - - case JackRequest::kUnRegisterPort: { - jack_log("JackRequest::UnRegisterPort"); - JackPortUnRegisterRequest req; - JackResult res; - if (req.Read(socket) == 0) - res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex); - if (res.Write(socket) < 0) - jack_error("JackRequest::UnRegisterPort write error ref = %d", req.fRefNum); - break; - } - - case JackRequest::kConnectNamePorts: { - jack_log("JackRequest::ConnectNamePorts"); - JackPortConnectNameRequest req; - JackResult res; - if (req.Read(socket) == 0) - res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); - if (res.Write(socket) < 0) - jack_error("JackRequest::ConnectNamePorts write error ref = %d", req.fRefNum); - break; - } - - case JackRequest::kDisconnectNamePorts: { - jack_log("JackRequest::DisconnectNamePorts"); - JackPortDisconnectNameRequest req; - JackResult res; - if (req.Read(socket) == 0) - res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); - if (res.Write(socket) < 0) - jack_error("JackRequest::DisconnectNamePorts write error ref = %d", req.fRefNum); - break; - } - - case JackRequest::kConnectPorts: { - jack_log("JackRequest::ConnectPorts"); - JackPortConnectRequest req; - JackResult res; - if (req.Read(socket) == 0) - res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); - if (res.Write(socket) < 0) - jack_error("JackRequest::ConnectPorts write error ref = %d", req.fRefNum); - break; - } - - case JackRequest::kDisconnectPorts: { - jack_log("JackRequest::DisconnectPorts"); - JackPortDisconnectRequest req; - JackResult res; - if (req.Read(socket) == 0) - res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); - if (res.Write(socket) < 0) - jack_error("JackRequest::DisconnectPorts write error ref = %d", req.fRefNum); - break; - } - - case JackRequest::kPortRename: { - jack_log("JackRequest::PortRename"); - JackPortRenameRequest req; - JackResult res; - if (req.Read(socket) == 0) - res.fResult = fServer->GetEngine()->PortRename(req.fRefNum, req.fPort, req.fName); - if (res.Write(socket) < 0) - jack_error("JackRequest::PortRename write error ref = %d", req.fRefNum); - break; - } - - case JackRequest::kSetBufferSize: { - jack_log("JackRequest::SetBufferSize"); - JackSetBufferSizeRequest req; - JackResult res; - if (req.Read(socket) == 0) - res.fResult = fServer->SetBufferSize(req.fBufferSize); - if (res.Write(socket) < 0) - jack_error("JackRequest::SetBufferSize write error"); - break; - } - - case JackRequest::kSetFreeWheel: { - jack_log("JackRequest::SetFreeWheel"); - JackSetFreeWheelRequest req; - JackResult res; - if (req.Read(socket) == 0) - res.fResult = fServer->SetFreewheel(req.fOnOff); - if (res.Write(socket) < 0) - jack_error("JackRequest::SetFreeWheel write error"); - break; - } - - case JackRequest::kComputeTotalLatencies: { - jack_log("JackRequest::ComputeTotalLatencies"); - JackComputeTotalLatenciesRequest req; - JackResult res; - if (req.Read(socket) == 0) - res.fResult = fServer->GetEngine()->ComputeTotalLatencies(); - if (res.Write(socket) < 0) - jack_error("JackRequest::ComputeTotalLatencies write error"); - break; - } - - case JackRequest::kReleaseTimebase: { - jack_log("JackRequest::ReleaseTimebase"); - JackReleaseTimebaseRequest req; - JackResult res; - if (req.Read(socket) == 0) - res.fResult = fServer->ReleaseTimebase(req.fRefNum); - if (res.Write(socket) < 0) - jack_error("JackRequest::ReleaseTimebase write error ref = %d", req.fRefNum); - break; - } - - case JackRequest::kSetTimebaseCallback: { - jack_log("JackRequest::SetTimebaseCallback"); - JackSetTimebaseCallbackRequest req; - JackResult res; - if (req.Read(socket) == 0) - res.fResult = fServer->SetTimebaseCallback(req.fRefNum, req.fConditionnal); - if (res.Write(socket) < 0) - jack_error("JackRequest::SetTimebaseCallback write error ref = %d", req.fRefNum); - break; - } - - case JackRequest::kGetInternalClientName: { - jack_log("JackRequest::GetInternalClientName"); - JackGetInternalClientNameRequest req; - JackGetInternalClientNameResult res; - if (req.Read(socket) == 0) - res.fResult = fServer->GetEngine()->GetInternalClientName(req.fIntRefNum, res.fName); - if (res.Write(socket) < 0) - jack_error("JackRequest::GetInternalClientName write error ref = %d", req.fRefNum); - break; - } - - case JackRequest::kInternalClientHandle: { - jack_log("JackRequest::InternalClientHandle"); - JackInternalClientHandleRequest req; - JackInternalClientHandleResult res; - if (req.Read(socket) == 0) - res.fResult = fServer->GetEngine()->InternalClientHandle(req.fName, &res.fStatus, &res.fIntRefNum); - if (res.Write(socket) < 0) - jack_error("JackRequest::InternalClientHandle write error ref = %d", req.fRefNum); - break; - } - - case JackRequest::kInternalClientLoad: { - jack_log("JackRequest::InternalClientLoad"); - JackInternalClientLoadRequest req; - JackInternalClientLoadResult res; - if (req.Read(socket) == 0) - res.fResult = fServer->InternalClientLoad1(req.fName, req.fDllName, req.fLoadInitName, req.fOptions, &res.fIntRefNum, req.fUUID, &res.fStatus); - if (res.Write(socket) < 0) - jack_error("JackRequest::InternalClientLoad write error name = %s", req.fName); - break; - } - - case JackRequest::kInternalClientUnload: { - jack_log("JackRequest::InternalClientUnload"); - JackInternalClientUnloadRequest req; - JackInternalClientUnloadResult res; - if (req.Read(socket) == 0) - res.fResult = fServer->GetEngine()->InternalClientUnload(req.fIntRefNum, &res.fStatus); - if (res.Write(socket) < 0) - jack_error("JackRequest::InternalClientUnload write error ref = %d", req.fRefNum); - break; - } - - case JackRequest::kNotification: { - jack_log("JackRequest::Notification"); - JackClientNotificationRequest req; - if (req.Read(socket) == 0) { - if (req.fNotify == kQUIT) { - jack_log("JackRequest::Notification kQUIT"); - throw JackQuitException(); - } else { - fServer->Notify(req.fRefNum, req.fNotify, req.fValue); - } - } - break; - } - - case JackRequest::kSessionNotify: { - jack_log("JackRequest::SessionNotify"); - JackSessionNotifyRequest req; - if (req.Read(socket) == 0) { - fServer->GetEngine()->SessionNotify(req.fRefNum, req.fDst, req.fEventType, req.fPath, socket, NULL); - } - break; - } - - case JackRequest::kSessionReply: { - jack_log("JackRequest::SessionReply"); - JackSessionReplyRequest req; - JackResult res; - if (req.Read(socket) == 0) { - fServer->GetEngine()->SessionReply(req.fRefNum); - res.fResult = 0; - } - if (res.Write(socket) < 0) - jack_error("JackRequest::SessionReply write error"); - break; - } - - case JackRequest::kGetClientByUUID: { - jack_log("JackRequest::GetClientByUUID"); - JackGetClientNameRequest req; - JackClientNameResult res; - if (req.Read(socket) == 0) { - fServer->GetEngine()->GetClientNameForUUID(req.fUUID, res.fName, &res.fResult); - } - if (res.Write(socket) < 0) - jack_error("JackRequest::GetClientByUUID write error"); - break; - } - - case JackRequest::kGetUUIDByClient: { - jack_log("JackRequest::GetUUIDByClient"); - JackGetUUIDRequest req; - JackUUIDResult res; - if (req.Read(socket) == 0) { - fServer->GetEngine()->GetUUIDForClientName(req.fName, res.fUUID, &res.fResult); - } - if (res.Write(socket) < 0) - jack_error("JackRequest::GetUUIDByClient write error"); - break; - } - - case JackRequest::kReserveClientName: { - jack_log("JackRequest::ReserveClientName"); - JackReserveNameRequest req; - JackResult res; - if (req.Read(socket) == 0) { - fServer->GetEngine()->ReserveClientName(req.fName, req.fUUID, &res.fResult); - } - if (res.Write(socket) < 0) - jack_error("JackRequest::ReserveClientName write error"); - break; - } - - case JackRequest::kClientHasSessionCallback: { - jack_log("JackRequest::ClientHasSessionCallback"); - JackClientHasSessionCallbackRequest req; - JackResult res; - if (req.Read(socket) == 0) { - fServer->GetEngine()->ClientHasSessionCallback(req.fName, &res.fResult); - } - if (res.Write(socket) < 0) - jack_error("JackRequest::ClientHasSessionCallback write error"); - break; - } - - default: - jack_error("Unknown request %ld", header.fType); - break; - } - - return true; -} - void JackSocketServerChannel::BuildPoolTable() { if (fRebuild) { @@ -526,7 +201,7 @@ void JackSocketServerChannel::BuildPoolTable() int i; for (i = 1, it = fSocketTable.begin(); it != fSocketTable.end(); it++, i++) { - jack_log("fSocketTable i = %ld fd = %ld", i, it->first); + jack_log("JackSocketServerChannel::BuildPoolTable fSocketTable i = %ld fd = %ld", i, it->first); fPollTable[i].fd = it->first; fPollTable[i].events = POLLIN | POLLPRI | POLLERR | POLLHUP | POLLNVAL; } @@ -548,36 +223,47 @@ bool JackSocketServerChannel::Execute() // Global poll if ((poll(fPollTable, fSocketTable.size() + 1, 10000) < 0) && (errno != EINTR)) { - jack_error("Engine poll failed err = %s request thread quits...", strerror(errno)); + jack_error("JackSocketServerChannel::Execute : engine poll failed err = %s request thread quits...", strerror(errno)); return false; } else { // Poll all clients for (unsigned int i = 1; i < fSocketTable.size() + 1; i++) { int fd = fPollTable[i].fd; - jack_log("fPollTable i = %ld fd = %ld", i, fd); + jack_log("JackSocketServerChannel::Execute : fPollTable i = %ld fd = %ld", i, fd); if (fPollTable[i].revents & ~POLLIN) { - jack_log("Poll client error err = %s", strerror(errno)); + jack_log("JackSocketServerChannel::Execute : poll client error err = %s", strerror(errno)); ClientKill(fd); } else if (fPollTable[i].revents & POLLIN) { - if (!HandleRequest(fd)) - jack_log("Could not handle external client request"); + JackClientSocket* socket = fSocketTable[fd].second; + // Decode header + JackRequest header; + if (header.Read(socket) < 0) { + jack_log("JackSocketServerChannel::Execute : cannot decode header"); + ClientKill(fd); + // Decode request + } else { + // Result is not needed here + fDecoder->HandleRequest(socket, header.fType); + } } } // Check the server request socket */ - if (fPollTable[0].revents & POLLERR) + if (fPollTable[0].revents & POLLERR) { jack_error("Error on server request socket err = %s", strerror(errno)); + } - if (fPollTable[0].revents & POLLIN) + if (fPollTable[0].revents & POLLIN) { ClientCreate(); + } } BuildPoolTable(); return true; } catch (JackQuitException& e) { - jack_log("JackSocketServerChannel::Execute JackQuitException"); + jack_log("JackSocketServerChannel::Execute : JackQuitException"); return false; } } diff --git a/posix/JackSocketServerChannel.h b/posix/JackSocketServerChannel.h index 5929c175..78cb57e9 100644 --- a/posix/JackSocketServerChannel.h +++ b/posix/JackSocketServerChannel.h @@ -22,6 +22,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "JackSocket.h" #include "JackPlatformPlug.h" +#include "JackRequestDecoder.h" + #include #include @@ -34,25 +36,29 @@ class JackServer; \brief JackServerChannel using sockets. */ -class JackSocketServerChannel : public JackRunnableInterface +class JackSocketServerChannel : public JackRunnableInterface, public JackClientHandlerInterface { private: JackServerSocket fRequestListenSocket; // Socket to create request socket for the client JackThread fThread; // Thread to execute the event loop + JackRequestDecoder* fDecoder; JackServer* fServer; + pollfd* fPollTable; bool fRebuild; std::map > fSocketTable; - bool HandleRequest(int fd); void BuildPoolTable(); void ClientCreate(); - void ClientAdd(int fd, char* name, int pid, int uuid, int* shared_engine, int* shared_client, int* shared_graph, int* result); - void ClientRemove(int fd, int refnum); void ClientKill(int fd); + + void ClientAdd(detail::JackChannelTransactionInterface* socket, JackClientOpenRequest* req, JackClientOpenResult *res); + void ClientRemove(detail::JackChannelTransactionInterface* socket, int refnum); + + int GetFd(JackClientSocket* socket); public: diff --git a/posix/JackSocketServerNotifyChannel.cpp b/posix/JackSocketServerNotifyChannel.cpp index c9d25509..5f4b6032 100644 --- a/posix/JackSocketServerNotifyChannel.cpp +++ b/posix/JackSocketServerNotifyChannel.cpp @@ -54,19 +54,15 @@ void JackSocketServerNotifyChannel::Notify(int refnum, int notify, int value) { JackClientNotificationRequest req(refnum, notify, value); if (req.Write(&fRequestSocket) < 0) { - jack_error("Could not write request ref = %d notify = %d", refnum, notify); + jack_error("Could not write notification ref = %d notify = %d", refnum, notify); } } void JackSocketServerNotifyChannel::NotifyQuit() { - JackClientNotificationRequest req(-1, kQUIT, 0); - if (req.Write(&fRequestSocket) < 0) { - jack_error("Could not write request ref = %d notify = %d", -1, kQUIT); - } + Notify(-1, kQUIT, 0); } - } // end of namespace diff --git a/solaris/JackPlatformPlug_os.h b/solaris/JackPlatformPlug_os.h index e3a03d34..9909ece2 100644 --- a/solaris/JackPlatformPlug_os.h +++ b/solaris/JackPlatformPlug_os.h @@ -57,9 +57,9 @@ namespace Jack { typedef JackFifo JackSynchro; } #include "JackSocket.h" namespace Jack { typedef JackClientSocket JackChannelTransaction; } -#include "JackProcessSync.h" /* __JackPlatformProcessSync__ */ -/* Only on windows a special JackProcessSync is used. It is directly defined by including JackProcessSync.h here */ +#include "JackPosixProcessSync.h" +namespace Jack { typedef JackPosixProcessSync JackProcessSync; } /* __JackPlatformServerChannel__ */ #include "JackSocketServerChannel.h" diff --git a/solaris/JackSolarisTime.c b/solaris/JackSolarisTime.c index 46fa0fcf..a4d207b0 100644 --- a/solaris/JackSolarisTime.c +++ b/solaris/JackSolarisTime.c @@ -13,7 +13,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 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. */ @@ -23,23 +23,26 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include -SERVER_EXPORT void JackSleep(long usec) +SERVER_EXPORT void JackSleep(long usec) { usleep(usec); } SERVER_EXPORT void InitTime() {} - -SERVER_EXPORT jack_time_t GetMicroSeconds(void) + +SERVER_EXPORT void EndTime() +{} + +SERVER_EXPORT jack_time_t GetMicroSeconds(void) { return (jack_time_t)(gethrtime() / 1000); } -SERVER_EXPORT void SetClockSource(jack_timer_type_t source) +void SetClockSource(jack_timer_type_t source) {} -SERVER_EXPORT const char* ClockSourceName(jack_timer_type_t source) +const char* ClockSourceName(jack_timer_type_t source) { return ""; } diff --git a/solaris/oss/JackBoomerDriver.cpp b/solaris/oss/JackBoomerDriver.cpp index 4353ffc8..5f07bc57 100644 --- a/solaris/oss/JackBoomerDriver.cpp +++ b/solaris/oss/JackBoomerDriver.cpp @@ -859,7 +859,7 @@ SERVER_EXPORT jack_driver_desc_t* driver_get_descriptor() return desc; } -EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLockedEngine* engine, Jack::JackSynchro* table, const JSList* params) +SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLockedEngine* engine, Jack::JackSynchro* table, const JSList* params) { int bits = OSS_DRIVER_DEF_BITS; jack_nframes_t srate = OSS_DRIVER_DEF_FS; diff --git a/solaris/oss/JackOSSDriver.cpp b/solaris/oss/JackOSSDriver.cpp index 931cd809..77ca6e00 100644 --- a/solaris/oss/JackOSSDriver.cpp +++ b/solaris/oss/JackOSSDriver.cpp @@ -776,7 +776,7 @@ SERVER_EXPORT jack_driver_desc_t* driver_get_descriptor() return desc; } -EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLockedEngine* engine, Jack::JackSynchro* table, const JSList* params) +SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLockedEngine* engine, Jack::JackSynchro* table, const JSList* params) { int bits = OSS_DRIVER_DEF_BITS; jack_nframes_t srate = OSS_DRIVER_DEF_FS; diff --git a/tests/test.cpp b/tests/test.cpp index a48a5036..ceb0b897 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -163,7 +163,11 @@ void Collect(FrameTimeCollector* TheFrame) void Jack_Thread_Init_Callback(void *arg) { - Log("Init callback has been successfully called. (msg from callback)\n"); +#ifdef WIN32 + Log("Init callback has been successfully called from thread = %x. (msg from callback)\n", GetCurrentThread()); +#else + Log("Init callback has been successfully called from thread = %x. (msg from callback)\n", pthread_self()); +#endif init_clbk = 1; } @@ -440,7 +444,7 @@ static void* jack_thread(void *arg) jack_nframes_t last_thread_time = jack_frame_time(client); while (1) { - jack_nframes_t frames = jack_cycle_wait (client); + jack_nframes_t frames = jack_cycle_wait(client); jack_nframes_t current_thread_time = jack_frame_time(client); jack_nframes_t delta_time = current_thread_time - last_thread_time; Log("jack_thread : delta_time = %ld\n", delta_time); @@ -477,14 +481,44 @@ int process4(jack_nframes_t nframes, void *arg) jack_nframes_t delta_time = cur_time - last_time; Log("calling process4 callback : jack_frame_time = %ld delta_time = %ld\n", cur_time, delta_time); - if (delta_time > 0 && (unsigned int)abs(delta_time - cur_buffer_size) > tolerance) { - printf("!!! ERROR !!! jack_frame_time seems to return incorrect values cur_buffer_size = %d, delta_time = %d\n", cur_buffer_size, delta_time); + if (delta_time > 0 && (jack_nframes_t)abs(delta_time - cur_buffer_size) > tolerance) { + printf("!!! ERROR !!! jack_frame_time seems to return incorrect values cur_buffer_size = %d, delta_time = %d tolerance %d\n", cur_buffer_size, delta_time, tolerance); } last_time = cur_time; return 0; } +int process5(jack_nframes_t nframes, void *arg) +{ + jack_client_t* client = (jack_client_t*) arg; + + static jack_nframes_t first_current_frames; + static jack_time_t first_current_usecs; + static jack_time_t first_next_usecs; + static float first_period_usecs; + static int res1 = jack_get_cycle_times(client, &first_current_frames, &first_current_usecs, &first_next_usecs, &first_period_usecs); + + jack_nframes_t current_frames; + jack_time_t current_usecs; + jack_time_t next_usecs; + float period_usecs; + + int res = jack_get_cycle_times(client, ¤t_frames, ¤t_usecs, &next_usecs, &period_usecs); + if (res != 0) { + printf("!!! ERROR !!! jack_get_cycle_times fails...\n"); + return 0; + } + + Log("calling process5 callback : jack_get_cycle_times delta current_frames = %ld delta current_usecs = %ld delta next_usecs = %ld period_usecs = %f\n", + current_frames - first_current_frames, current_usecs - first_current_usecs, next_usecs - first_next_usecs, period_usecs); + + first_current_frames = current_frames; + first_current_usecs = current_usecs; + first_next_usecs = next_usecs; + return 0; +} + static void display_transport_state() { jack_transport_state_t ts; @@ -553,6 +587,8 @@ int main (int argc, char *argv[]) client_name1 = "jack_test"; time_to_run = 1; + //verbose_mode = 1; + //RT = 1; while ((opt = getopt_long (argc, argv, options, long_options, &option_index)) != EOF) { switch (opt) { case 'k': @@ -1201,8 +1237,8 @@ int main (int argc, char *argv[]) * (as mentionned in the doc of jack_get_ports) * */ - free(inports); - free(outports); + jack_free(inports); + jack_free(outports); /** * Try to "reactivate" the client whereas it's already activated... @@ -1241,7 +1277,7 @@ int main (int argc, char *argv[]) printf("!!! ERROR !!! %i ports have been created, and %i callback reg ports have been received !\n", j, port_callback_reg); } - free(inports); // free array of ports (as mentionned in the doc of jack_get_ports) + jack_free(inports); // free array of ports (as mentionned in the doc of jack_get_ports) /** *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* @@ -1405,7 +1441,7 @@ int main (int argc, char *argv[]) connexions2 = jack_port_get_all_connections(client1, jack_port_by_name(client1, inports[0])); } - free (inports); + jack_free (inports); if (connexions1 == NULL) { Log("checking jack_port_get_connections() for external client... ok\n"); } else { @@ -1648,7 +1684,7 @@ int main (int argc, char *argv[]) } else { Log("Checking renaming of an unregistered port... ok\n"); } - free (inports); + jack_free (inports); /** @@ -1664,6 +1700,7 @@ int main (int argc, char *argv[]) Log("Checking about latency functions...\n"); t_error = 0; jack_recompute_total_latencies(client1); + Log("jack_recompute_total_latencies...\n"); if ((jack_port_get_latency (output_port1) != 0) || (jack_port_get_total_latency(client1, output_port1) != 0) ) { t_error = 1; @@ -1753,8 +1790,8 @@ int main (int argc, char *argv[]) jack_sleep(1000); - free(inports); - free(outports); + jack_free(inports); + jack_free(outports); /** * Checking transport API. @@ -1960,7 +1997,16 @@ int main (int argc, char *argv[]) jack_set_process_callback(client1, process4, client1); jack_activate(client1); jack_sleep(2 * 1000); - + + /** + * Checking jack_get_cycle_times. + */ + Log("Testing jack_get_cycle_times...\n"); + jack_deactivate(client1); + jack_set_process_callback(client1, process5, client1); + jack_activate(client1); + jack_sleep(3 * 1000); + /** * Checking alternate thread model diff --git a/tests/wscript b/tests/wscript index c52907b8..70d48f0f 100644 --- a/tests/wscript +++ b/tests/wscript @@ -14,9 +14,8 @@ test_programs = { } def build(bld): - for test_program, test_program_sources in test_programs.items(): - prog = bld.new_task_gen('cxx', 'program') - prog.features.append('cc') + for test_program, test_program_sources in list(test_programs.items()): + prog = bld(features = 'cxx cxxprogram') if bld.env['IS_MACOSX']: prog.includes = ['..','../macosx', '../posix', '../common/jack', '../common'] if bld.env['IS_LINUX']: @@ -29,6 +28,5 @@ def build(bld): if bld.env['IS_MACOSX']: prog.env.append_value("CPPFLAGS", "-mmacosx-version-min=10.4 -arch i386 -arch ppc -arch x86_64") #prog.env.append_value("LINKFLAGS", "-arch i386 -arch ppc -arch x86_64") - prog.env.append_value("LINKFLAGS", "") - prog.uselib_local = 'clientlib' + prog.use = 'clientlib' prog.target = test_program diff --git a/waf b/waf index f0f7f632..e1e34d43 100755 Binary files a/waf and b/waf differ diff --git a/windows/JackCompilerDeps_os.h b/windows/JackCompilerDeps_os.h index 685fc48c..ca7b7a38 100644 --- a/windows/JackCompilerDeps_os.h +++ b/windows/JackCompilerDeps_os.h @@ -21,9 +21,19 @@ #ifndef __JackCompilerDeps_WIN32__ #define __JackCompilerDeps_WIN32__ +#define LIB_EXPORT __declspec(dllexport) + +#ifdef SERVER_SIDE + #define SERVER_EXPORT __declspec(dllexport) +#else + #define SERVER_EXPORT +#endif + #if __GNUC__ - #define PRE_PACKED_STRUCTURE + #define MEM_ALIGN(x,y) x __attribute__((aligned(y))) + + #define PRE_PACKED_STRUCTURE #ifndef POST_PACKED_STRUCTURE /* POST_PACKED_STRUCTURE needs to be a macro which expands into a compiler directive. The directive must @@ -32,53 +42,36 @@ than use the natural alignment of the processor and/or compiler. */ - #if (__GNUC__< 4) /* Does not seem to work with GCC 3.XX serie */ - #define POST_PACKED_STRUCTURE - #elif defined(JACK_32_64) - #define POST_PACKED_STRUCTURE __attribute__((__packed__)) - #else - #define POST_PACKED_STRUCTURE - #endif - #endif - #define MEM_ALIGN(x,y) x __attribute__((aligned(y))) - #define LIB_EXPORT __declspec(dllexport) - #ifdef SERVER_SIDE - #define SERVER_EXPORT __declspec(dllexport) - #else - #define SERVER_EXPORT + #define POST_PACKED_STRUCTURE __attribute__((__packed__)) #endif + #else - #define MEM_ALIGN(x,y) x - #define LIB_EXPORT __declspec(dllexport) - #ifdef SERVER_SIDE - #define SERVER_EXPORT __declspec(dllexport) - #else - #define SERVER_EXPORT - #endif + #define MEM_ALIGN(x,y) x + #ifdef _MSC_VER - #if defined(JACK_32_64) - #define PRE_PACKED_STRUCTURE1 __pragma(pack(push,1)) - #define PRE_PACKED_STRUCTURE PRE_PACKED_STRUCTURE1 - /* PRE_PACKED_STRUCTURE needs to be a macro which - expands into a compiler directive. The directive must - tell the compiler to arrange the following structure - declaration so that it is packed on byte-boundaries rather - than use the natural alignment of the processor and/or - compiler. - */ - #define POST_PACKED_STRUCTURE ;__pragma(pack(pop)) - /* and POST_PACKED_STRUCTURE needs to be a macro which - restores the packing to its previous setting */ - #else - #define PRE_PACKED_STRUCTURE - #define POST_PACKED_STRUCTURE - #endif + #define PRE_PACKED_STRUCTURE1 __pragma(pack(push,1)) + #define PRE_PACKED_STRUCTURE PRE_PACKED_STRUCTURE1 + /* PRE_PACKED_STRUCTURE needs to be a macro which + expands into a compiler directive. The directive must + tell the compiler to arrange the following structure + declaration so that it is packed on byte-boundaries rather + than use the natural alignment of the processor and/or + compiler. + */ + #define POST_PACKED_STRUCTURE ;__pragma(pack(pop)) + /* and POST_PACKED_STRUCTURE needs to be a macro which + restores the packing to its previous setting */ #else /* Other Windows compilers to go here */ #define PRE_PACKED_STRUCTURE #define POST_PACKED_STRUCTURE #endif + +#endif + +#if defined(_MSC_VER) /* Added by JE - 31-01-2012 */ +#define snprintf _snprintf #endif #endif diff --git a/windows/JackNetWinSocket.cpp b/windows/JackNetWinSocket.cpp index fbbab3bd..de7580c2 100644 --- a/windows/JackNetWinSocket.cpp +++ b/windows/JackNetWinSocket.cpp @@ -17,7 +17,7 @@ */ - +#include "JackError.h" #include "JackNetWinSocket.h" namespace Jack @@ -296,12 +296,8 @@ namespace Jack int JackNetWinSocket::SetTimeOut(int usec) { jack_log("JackNetWinSocket::SetTimeout %d usec", usec); - - //negative timeout, or exceeding 10s, return - if (( usec < 0) || (usec > 10000000)) - return SOCKET_ERROR; - int time = usec / 1000; - return SetOption(SOL_SOCKET, SO_RCVTIMEO, &time, sizeof(time)); + int millisec = usec / 1000; + return SetOption(SOL_SOCKET, SO_RCVTIMEO, &millisec, sizeof(millisec)); } //local loop********************************************************************************************************* diff --git a/windows/JackRouter/JackRouter.cpp b/windows/JackRouter/JackRouter.cpp index 84086f95..121bd830 100644 --- a/windows/JackRouter/JackRouter.cpp +++ b/windows/JackRouter/JackRouter.cpp @@ -40,6 +40,7 @@ 09/27/2007 SL : Add AUDO_CONNECT property in JackRouter.ini file. 10/10/2007 SL : Use ASIOSTInt32LSB instead of ASIOSTInt16LSB. 12/04/2011 SL : Compilation on Windows 64. + 12/04/2011 SL : Dynamic port allocation. Correct JACK port naming. */ //------------------------------------------------------------------------------------------ @@ -68,6 +69,13 @@ static const double twoRaisedTo32Reciprocal = 1. / twoRaisedTo32; using namespace std; +//#define JACK_LOG 1 + +#ifdef JACK_LOG +#include +static std::ofstream* fStream; +#endif + // class id. // {838FE50A-C1AB-4b77-B9B6-0A40788B53F3} CLSID IID_ASIO_DRIVER = { 0x838fe50a, 0xc1ab, 0x4b77, { 0xb9, 0xb6, 0xa, 0x40, 0x78, 0x8b, 0x53, 0xf3 } }; @@ -138,9 +146,7 @@ HRESULT _stdcall DllUnregisterServer() } // Globals - list > JackRouter::fConnections; -bool JackRouter::fFirstActivate = true; //------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------ @@ -157,32 +163,27 @@ JackRouter::JackRouter() : AsioDriver() #endif { long i; - fSamplePosition = 0; - fActive = false; - fStarted = false; + fRunning = false; fTimeInfoMode = false; fTcRead = false; fClient = NULL; fAutoConnectIn = true; fAutoConnectOut = true; - - for (i = 0; i < kNumInputs; i++) { - fInputBuffers[i] = 0; - fInputPorts[i] = 0; - fInMap[i] = 0; - } - for (i = 0; i < kNumOutputs; i++) { - fOutputBuffers[i] = 0; - fOutputPorts[i] = 0; - fOutMap[i] = 0; - } fCallbacks = 0; fActiveInputs = fActiveOutputs = 0; fToggle = 0; fBufferSize = 512; fSampleRate = 44100; - printf("Constructor\n"); + fFloatSample = true; // float by default + fFirstActivate = true; + +#ifdef JACK_LOG + fStream = new ofstream(name_log, ios_base::ate); + *fStream << "======================" << std::endl; + *fStream << "JackRouter::JackRouter" << std::endl; + *fStream << "======================" << std::endl; +#endif // Use "jackrouter.ini" parameters if available HMODULE handle = LoadLibrary(JACK_ROUTER); @@ -206,21 +207,64 @@ JackRouter::JackRouter() : AsioDriver() fAutoConnectIn = get_private_profile_int("AUTO_CONNECT", "input", 1, confPath.c_str()); fAutoConnectOut = get_private_profile_int("AUTO_CONNECT", "output", 1, confPath.c_str()); + + fFloatSample = get_private_profile_int("IO", "float-sample", 0, confPath.c_str()); + fAliasSystem = get_private_profile_int("AUTO_CONNECT", "alias", 0, confPath.c_str()); FreeLibrary(handle); - + } else { - printf("LoadLibrary error\n"); + #ifdef JACK_LOG + *fStream << "JackRouter::JackRouter : loadLibrary error" << std::endl; + #endif + } + + if (!fFloatSample) { + fInputBuffers = (void**)new long*[kNumInputs]; + fOutputBuffers = (void**)new long*[kNumOutputs]; + } else { + fInputBuffers = (void**)new float*[kNumInputs]; + fOutputBuffers = (void**)new float*[kNumOutputs]; + } + + fInMap = new long[kNumInputs]; + fOutMap = new long[kNumOutputs]; + + fInputPorts = new jack_port_t*[kNumInputs]; + fOutputPorts = new jack_port_t*[kNumOutputs]; + + for (i = 0; i < kNumInputs; i++) { + fInputBuffers[i] = 0; + fInputPorts[i] = 0; + fInMap[i] = 0; + } + for (i = 0; i < kNumOutputs; i++) { + fOutputBuffers[i] = 0; + fOutputPorts[i] = 0; + fOutMap[i] = 0; } } //------------------------------------------------------------------------------------------ JackRouter::~JackRouter() { - stop (); - disposeBuffers (); +#ifdef JACK_LOG + *fStream << "=======================" << std::endl; + *fStream << "JackRouter::~JackRouter" << std::endl; + *fStream << "=======================" << std::endl; +#endif + stop(); + disposeBuffers(); jack_client_close(fClient); - printf("Destructor\n"); + delete[] fInputBuffers; + delete[] fOutputBuffers; + delete[] fInputPorts; + delete[] fOutputPorts; + delete[] fInMap; + delete[] fOutMap; +#ifdef JACK_LOG + delete fStream; +#endif } //------------------------------------------------------------------------------------------ @@ -276,13 +320,17 @@ static inline jack_default_audio_sample_t ClipFloat(jack_default_audio_sample_t } //------------------------------------------------------------------------------------------ -void JackRouter::shutdown(void* arg) +void JackRouter::connectCallback(jack_port_id_t a, jack_port_id_t b, int connect, void* arg) +{ + JackRouter* driver = (JackRouter*)arg; +} + +//------------------------------------------------------------------------------------------ +void JackRouter::shutdownCallback(void* arg) { JackRouter* driver = (JackRouter*)arg; /* - //exit(1); char errstr[128]; - memset(errstr,0,128); sprintf(errstr,"JACK server has quitted"); MessageBox(0,(LPCTSTR)errstr,(LPCTSTR)"JackRouter",MB_OK); @@ -290,53 +338,58 @@ void JackRouter::shutdown(void* arg) } //------------------------------------------------------------------------------------------ -int JackRouter::process(jack_nframes_t nframes, void* arg) -{ - JackRouter* driver = (JackRouter*)arg; - int i,j; - int pos = (driver->fToggle) ? 0 : driver->fBufferSize ; - - for (i = 0; i < driver->fActiveInputs; i++) { - -#ifdef LONG_SAMPLE - jack_default_audio_sample_t* buffer = (jack_default_audio_sample_t*)jack_port_get_buffer(driver->fInputPorts[i], nframes); - long* in = driver->fInputBuffers[i] + pos; - for (j = 0; j < nframes; j++) { - in[j] = buffer[j] * jack_default_audio_sample_t(0x7fffffff); - } -#else - memcpy(driver->fInputBuffers[i] + pos, - jack_port_get_buffer(driver->fInputPorts[i], nframes), - nframes * sizeof(jack_default_audio_sample_t)); -#endif - - } - - driver->bufferSwitch(); - - for (i = 0; i < driver->fActiveOutputs; i++) { +void JackRouter::processInputs() +{ + int pos = (fToggle) ? 0 : fBufferSize; + + for (int i = 0; i < fActiveInputs; i++) { + if (!fFloatSample) { + jack_default_audio_sample_t* buffer = (jack_default_audio_sample_t*)jack_port_get_buffer(fInputPorts[i], fBufferSize); + long* in = (long*)fInputBuffers[i] + pos; + for (int j = 0; j < fBufferSize; j++) { + in[j] = buffer[j] * jack_default_audio_sample_t(0x7fffffff); + } + } else { + memcpy((float*)fInputBuffers[i] + pos, + jack_port_get_buffer(fInputPorts[i], fBufferSize), + fBufferSize * sizeof(jack_default_audio_sample_t)); + } + } +} -#ifdef LONG_SAMPLE - jack_default_audio_sample_t* buffer = (jack_default_audio_sample_t*)jack_port_get_buffer(driver->fOutputPorts[i], nframes); - long* out = driver->fOutputBuffers[i] + pos; - jack_default_audio_sample_t gain = jack_default_audio_sample_t(1)/jack_default_audio_sample_t(0x7fffffff); - for (j = 0; j < nframes; j++) { - buffer[j] = out[j] * gain; - } -#else - memcpy(jack_port_get_buffer(driver->fOutputPorts[i], nframes), - driver->fOutputBuffers[i] + pos, - nframes * sizeof(jack_default_audio_sample_t)); -#endif - } +//------------------------------------------------------------------------------------------ +void JackRouter::processOutputs() +{ + int pos = (fToggle) ? 0 : fBufferSize; + + for (int i = 0; i < fActiveOutputs; i++) { + if (!fFloatSample) { + jack_default_audio_sample_t* buffer = (jack_default_audio_sample_t*)jack_port_get_buffer(fOutputPorts[i], fBufferSize); + long* out = (long*)fOutputBuffers[i] + pos; + jack_default_audio_sample_t gain = jack_default_audio_sample_t(1)/jack_default_audio_sample_t(0x7fffffff); + for (int j = 0; j < fBufferSize; j++) { + buffer[j] = out[j] * gain; + } + } else { + memcpy(jack_port_get_buffer(fOutputPorts[i], fBufferSize), + (float*)fOutputBuffers[i] + pos, + fBufferSize * sizeof(jack_default_audio_sample_t)); + } + } +} +//------------------------------------------------------------------------------------------ +int JackRouter::processCallback(jack_nframes_t nframes, void* arg) +{ + JackRouter* driver = (JackRouter*)arg; + driver->bufferSwitch(); return 0; } //------------------------------------------------------------------------------------------ void JackRouter::getDriverName(char *name) { - strcpy (name, "JackRouter"); + strcpy(name, "JackRouter"); } //------------------------------------------------------------------------------------------ @@ -355,10 +408,15 @@ void JackRouter::getErrorMessage(char *string) ASIOBool JackRouter::init(void* sysRef) { char name[MAX_PATH]; + char name_log[MAX_PATH]; sysRef = sysRef; - if (fActive) + if (fClient) { + #ifdef JACK_LOG + *fStream << "JackRouter::init : JACK client still present..." << std::endl; + #endif return true; + } HANDLE win = (HANDLE)sysRef; int my_pid = _getpid(); @@ -367,22 +425,21 @@ ASIOBool JackRouter::init(void* sysRef) _snprintf(name, sizeof(name) - 1, "JackRouter_%d", my_pid); } - if (fClient) { - printf("Error: jack client still present...\n"); - return true; - } + _snprintf(name_log, sizeof(name_log) - 1, "JackRouter_%s.log", name); fClient = jack_client_open(name, JackNullOption, NULL); if (fClient == NULL) { - strcpy (fErrorMessage, "Open error: is jack server running?"); - printf("Open error: is jack server running?\n"); + strcpy(fErrorMessage, "Open error: is JACK server running?"); + printf("Open error: is JACK server running?\n"); return false; } fBufferSize = jack_get_buffer_size(fClient); fSampleRate = jack_get_sample_rate(fClient); - jack_set_process_callback(fClient, process, this); - jack_on_shutdown(fClient, shutdown, this); + + jack_set_process_callback(fClient, processCallback, this); + jack_on_shutdown(fClient, shutdownCallback, this); + jack_set_port_connect_callback(fClient, connectCallback, this); fInputLatency = fBufferSize; // typically fOutputLatency = fBufferSize * 2; @@ -391,8 +448,9 @@ ASIOBool JackRouter::init(void* sysRef) // Typically fBufferSize * 2; try to get 1 by offering direct buffer // access, and using asioPostOutput for lower latency - printf("Init ASIO Jack\n"); - fActive = true; +#ifdef JACK_LOG + *fStream << "JackRouter::init" << std::endl; +#endif return true; } @@ -403,18 +461,21 @@ ASIOError JackRouter::start() fSamplePosition = 0; fTheSystemTime.lo = fTheSystemTime.hi = 0; fToggle = 0; - fStarted = true; - printf("Start ASIO Jack\n"); + + #ifdef JACK_LOG + *fStream << "JackRouter::start" << std::endl; + #endif if (jack_activate(fClient) == 0) { if (fFirstActivate) { - AutoConnect(); + autoConnect(); fFirstActivate = false; } else { - RestoreConnections(); + restoreConnections(); } + fRunning = true; return ASE_OK; } else { @@ -428,10 +489,14 @@ ASIOError JackRouter::start() //------------------------------------------------------------------------------------------ ASIOError JackRouter::stop() { - fStarted = false; - printf("Stop ASIO Jack\n"); - SaveConnections(); - jack_deactivate(fClient); +#ifdef JACK_LOG + *fStream << "JackRouter::stop" << std::endl; +#endif + fRunning = false; + saveConnections(); + if (jack_deactivate(fClient) == 0) { + fFirstActivate = true; + } return ASE_OK; } @@ -454,7 +519,7 @@ ASIOError JackRouter::getLatencies(long *_inputLatency, long *_outputLatency) //------------------------------------------------------------------------------------------ ASIOError JackRouter::getBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity) { - *minSize = *maxSize = *preferredSize = fBufferSize; // allow this size only + *minSize = *maxSize = *preferredSize = fBufferSize; // Allows this size only *granularity = 0; return ASE_OK; } @@ -525,44 +590,90 @@ ASIOError JackRouter::getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp //------------------------------------------------------------------------------------------ ASIOError JackRouter::getChannelInfo(ASIOChannelInfo *info) { - if (info->channel < 0 || (info->isInput ? info->channel >= kNumInputs : info->channel >= kNumOutputs)) + if (info->channel < 0 || (info->isInput ? info->channel >= kNumInputs : info->channel >= kNumOutputs)) { return ASE_InvalidParameter; -#ifdef LONG_SAMPLE - info->type = ASIOSTInt32LSB; -#else - info->type = ASIOSTFloat32LSB; + } + + if (!fFloatSample) { + info->type = ASIOSTInt32LSB; + } else { + info->type = ASIOSTFloat32LSB; + } + +#ifdef JACK_LOG + *fStream << "==========================" << std::endl; + *fStream << "JackRouter::getChannelInfo" << std::endl; + *fStream << "==========================" << std::endl; #endif info->channelGroup = 0; info->isActive = ASIOFalse; long i; char buf[32]; + const char** ports; + + char* aliases[2]; + aliases[0] = (char*)malloc(jack_port_name_size()); + aliases[1] = (char*)malloc(jack_port_name_size()); + + if (!aliases[0] || !aliases[1]) { + return ASE_NoMemory; + } if (info->isInput) { for (i = 0; i < fActiveInputs; i++) { if (fInMap[i] == info->channel) { info->isActive = ASIOTrue; - //_snprintf(buf, sizeof(buf) - 1, "Jack::In%d ", info->channel); - //strcpy(info->name, buf); - //strcpy(info->name, jack_port_name(fInputPorts[i])); break; } } - _snprintf(buf, sizeof(buf) - 1, "In%d ", info->channel); - strcpy(info->name, buf); + + // A alias on system is wanted + if (fAliasSystem && fAutoConnectIn && (ports = jack_get_ports(fClient, NULL, NULL, JackPortIsPhysical | JackPortIsOutput))) { + jack_port_t* port = jack_port_by_name(fClient, ports[info->channel]); + if (port) { + if (jack_port_get_aliases(port, aliases) == 2) { + strncpy(info->name, aliases[1], 32); + #ifdef JACK_LOG + *fStream << "Input " << "fActiveInputs = " << i << " ASIO_channel = " << info->channel << std::endl; + #endif + goto end; + } + } + } + + _snprintf(buf, sizeof(buf) - 1, "In%d", info->channel + 1); + strcpy(info->name, buf); + } else { for (i = 0; i < fActiveOutputs; i++) { - if (fOutMap[i] == info->channel) { //NOT USED !! + if (fOutMap[i] == info->channel) { info->isActive = ASIOTrue; - //_snprintf(buf, sizeof(buf) - 1, "Jack::Out%d ", info->channel); - //strcpy(info->name, buf); - //strcpy(info->name, jack_port_name(fOutputPorts[i])); break; } } - _snprintf(buf, sizeof(buf) - 1, "Out%d ", info->channel); - strcpy(info->name, buf); - } + + // A alias on system is wanted + if (fAliasSystem && fAutoConnectOut && (ports = jack_get_ports(fClient, NULL, NULL, JackPortIsPhysical | JackPortIsInput))) { + jack_port_t* port = jack_port_by_name(fClient, ports[info->channel]); + if (port) { + if (jack_port_get_aliases(port, aliases) == 2) { + strncpy(info->name, aliases[1], 32); + #ifdef JACK_LOG + *fStream << "Output " << "fActiveOutputs = " << i << " ASIO_channel = " << info->channel << std::endl; + #endif + goto end; + } + } + } + _snprintf(buf, sizeof(buf) - 1, "Out%d", info->channel + 1); + strcpy(info->name, buf); + } + +end: + + free(aliases[0]); + free(aliases[1]); return ASE_OK; } @@ -577,29 +688,42 @@ ASIOError JackRouter::createBuffers(ASIOBufferInfo *bufferInfos, long numChannel fActiveInputs = 0; fActiveOutputs = 0; +#ifdef JACK_LOG + *fStream << "==========================" << std::endl; + *fStream << "JackRouter::createBuffers" << std::endl; + *fStream << "==========================" << std::endl; +#endif + for (i = 0; i < numChannels; i++, info++) { if (info->isInput) { - if (info->channelNum < 0 || info->channelNum >= kNumInputs) + + if (info->channelNum < 0 || info->channelNum >= kNumInputs) { goto error; + } fInMap[fActiveInputs] = info->channelNum; - #ifdef LONG_SAMPLE - fInputBuffers[fActiveInputs] = new long[fBufferSize * 2]; // double buffer - #else - fInputBuffers[fActiveInputs] = new jack_default_audio_sample_t[fBufferSize * 2]; // double buffer - #endif + + if (!fFloatSample) { + fInputBuffers[fActiveInputs] = new long[fBufferSize * 2]; // double buffer + } else { + fInputBuffers[fActiveInputs] = new jack_default_audio_sample_t[fBufferSize * 2]; // double buffer + } + if (fInputBuffers[fActiveInputs]) { info->buffers[0] = fInputBuffers[fActiveInputs]; - info->buffers[1] = fInputBuffers[fActiveInputs] + fBufferSize; + info->buffers[1] = (fFloatSample) ? (void*)((float*)fInputBuffers[fActiveInputs] + fBufferSize) : (void*)((long*)fInputBuffers[fActiveInputs] + fBufferSize); } else { info->buffers[0] = info->buffers[1] = 0; notEnoughMem = true; } - - _snprintf(buf, sizeof(buf) - 1, "in%d", fActiveInputs + 1); + #ifdef JACK_LOG + *fStream << "Input " << "fActiveInputs = " << i << " ASIO_channel = " << info->channelNum << std::endl; + #endif + _snprintf(buf, sizeof(buf) - 1, "in%d", info->channelNum + 1); fInputPorts[fActiveInputs] = jack_port_register(fClient, buf, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput,0); - if (fInputPorts[fActiveInputs] == NULL) + if (fInputPorts[fActiveInputs] == NULL) { goto error; + } fActiveInputs++; if (fActiveInputs > kNumInputs) { @@ -607,30 +731,35 @@ error: disposeBuffers(); return ASE_InvalidParameter; } - } else { // output - if (info->channelNum < 0 || info->channelNum >= kNumOutputs) + } else { + + if (info->channelNum < 0 || info->channelNum >= kNumOutputs) { goto error; + } fOutMap[fActiveOutputs] = info->channelNum; - #ifdef LONG_SAMPLE - fOutputBuffers[fActiveOutputs] = new long[fBufferSize * 2]; // double buffer - #else - fOutputBuffers[fActiveOutputs] = new jack_default_audio_sample_t[fBufferSize * 2]; // double buffer - #endif + if (!fFloatSample) { + fOutputBuffers[fActiveOutputs] = new long[fBufferSize * 2]; // double buffer + } else { + fOutputBuffers[fActiveOutputs] = new jack_default_audio_sample_t[fBufferSize * 2]; // double buffer + } if (fOutputBuffers[fActiveOutputs]) { info->buffers[0] = fOutputBuffers[fActiveOutputs]; - info->buffers[1] = fOutputBuffers[fActiveOutputs] + fBufferSize; + info->buffers[1] = (fFloatSample) ? (void*)((float*)fOutputBuffers[fActiveOutputs] + fBufferSize) : (void*)((long*)fOutputBuffers[fActiveOutputs] + fBufferSize); } else { info->buffers[0] = info->buffers[1] = 0; notEnoughMem = true; } - - _snprintf(buf, sizeof(buf) - 1, "out%d", fActiveOutputs + 1); + #ifdef JACK_LOG + *fStream << "Input " << "fActiveOutputs = " << i << " ASIO_channel = " << info->channelNum << std::endl; + #endif + _snprintf(buf, sizeof(buf) - 1, "out%d", info->channelNum + 1); fOutputPorts[fActiveOutputs] = jack_port_register(fClient, buf, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput,0); - if (fOutputPorts[fActiveOutputs] == NULL) + if (fOutputPorts[fActiveOutputs] == NULL) { goto error; + } fActiveOutputs++; if (fActiveOutputs > kNumOutputs) { @@ -654,7 +783,6 @@ error: fAsioTime.timeInfo.samplePosition.hi = fAsioTime.timeInfo.samplePosition.lo = 0; fAsioTime.timeInfo.sampleRate = fSampleRate; fAsioTime.timeInfo.flags = kSystemTimeValid | kSamplePositionValid | kSampleRateValid; - fAsioTime.timeCode.speed = 1.; fAsioTime.timeCode.timeCodeSamples.lo = fAsioTime.timeCode.timeCodeSamples.hi = 0; fAsioTime.timeCode.flags = kTcValid | kTcRunning ; @@ -662,6 +790,9 @@ error: fTimeInfoMode = false; } + if (fRunning) { + autoConnect(); + } return ASE_OK; } @@ -698,8 +829,8 @@ ASIOError JackRouter::controlPanel() ASIOError JackRouter::future(long selector, void* opt) // !!! check properties { ASIOTransportParameters* tp = (ASIOTransportParameters*)opt; - switch (selector) - { + + switch (selector) { case kAsioEnableTimeCodeRead: fTcRead = true; return ASE_SUCCESS; case kAsioDisableTimeCodeRead: fTcRead = false; return ASE_SUCCESS; case kAsioSetInputMonitor: return ASE_SUCCESS; // for testing!!! @@ -707,6 +838,7 @@ ASIOError JackRouter::future(long selector, void* opt) // !!! check properties case kAsioCanTimeInfo: return ASE_SUCCESS; case kAsioCanTimeCode: return ASE_SUCCESS; } + return ASE_NotPresent; } @@ -717,13 +849,15 @@ ASIOError JackRouter::future(long selector, void* opt) // !!! check properties //--------------------------------------------------------------------------------------------- void JackRouter::bufferSwitch() { - if (fStarted && fCallbacks) { + if (fRunning && fCallbacks) { getNanoSeconds(&fTheSystemTime); // latch system time + processInputs(); + processOutputs(); fSamplePosition += fBufferSize; if (fTimeInfoMode) { - bufferSwitchX (); + bufferSwitchX(); } else { - fCallbacks->bufferSwitch (fToggle, ASIOFalse); + fCallbacks->bufferSwitch(fToggle, ASIOFalse); } fToggle = fToggle ? 0 : 1; } @@ -731,7 +865,7 @@ void JackRouter::bufferSwitch() //--------------------------------------------------------------------------------------------- // asio2 buffer switch -void JackRouter::bufferSwitchX () +void JackRouter::bufferSwitchX() { getSamplePosition (&fAsioTime.timeInfo.samplePosition, &fAsioTime.timeInfo.systemTime); long offset = fToggle ? fBufferSize : 0; @@ -741,7 +875,7 @@ void JackRouter::bufferSwitchX () fAsioTime.timeCode.timeCodeSamples.lo = fAsioTime.timeInfo.samplePosition.lo + 600.0 * fSampleRate; fAsioTime.timeCode.timeCodeSamples.hi = 0; } - fCallbacks->bufferSwitchTimeInfo (&fAsioTime, fToggle, ASIOFalse); + fCallbacks->bufferSwitchTimeInfo(&fAsioTime, fToggle, ASIOFalse); fAsioTime.timeInfo.flags &= ~(kSampleRateChanged | kClockSourceChanged); } @@ -755,8 +889,9 @@ ASIOError JackRouter::outputReady() double AsioSamples2double(ASIOSamples* samples) { double a = (double)(samples->lo); - if (samples->hi) + if (samples->hi) { a += (double)(samples->hi) * twoRaisedTo32; + } return a; } @@ -769,7 +904,7 @@ void getNanoSeconds(ASIOTimeStamp* ts) } //------------------------------------------------------------------------ -void JackRouter::SaveConnections() +void JackRouter::saveConnections() { const char** connections; int i; @@ -794,7 +929,7 @@ void JackRouter::SaveConnections() } //------------------------------------------------------------------------ -void JackRouter::RestoreConnections() +void JackRouter::restoreConnections() { list >::const_iterator it; @@ -806,38 +941,59 @@ void JackRouter::RestoreConnections() fConnections.clear(); } + //------------------------------------------------------------------------------------------ -void JackRouter::AutoConnect() +void JackRouter::autoConnect() { const char** ports; +#ifdef JACK_LOG + *fStream << "=======================" << std::endl; + *fStream << "JackRouter::autoConnect" << std::endl; + *fStream << "=======================" << std::endl; +#endif + if ((ports = jack_get_ports(fClient, NULL, NULL, JackPortIsPhysical | JackPortIsOutput)) == NULL) { - printf("Cannot find any physical capture ports\n"); + #ifdef JACK_LOG + *fStream << "JackRouter::autoConnect : cannot find any physical capture ports" << std::endl; + #endif } else { if (fAutoConnectIn) { - for (int i = 0; i < fActiveInputs; i++) { - if (!ports[i]) { - printf("source port is null i = %ld\n", i); + for (int i = 0; i < fActiveInputs; i++) { + long ASIO_channel = fInMap[i]; + if (!ports[ASIO_channel]) { + printf("source port is null ASIO_channel = %ld\n", ASIO_channel); break; - } else if (jack_connect(fClient, ports[i], jack_port_name(fInputPorts[i])) != 0) { + } else if (jack_connect(fClient, ports[ASIO_channel], jack_port_name(fInputPorts[i])) != 0) { printf("Cannot connect input ports\n"); - } + } else { + #ifdef JACK_LOG + *fStream << "Input " << "fActiveInputs = " << i << " ASIO_channel = " << ASIO_channel << std::endl; + #endif + } } } jack_free(ports); } if ((ports = jack_get_ports(fClient, NULL, NULL, JackPortIsPhysical | JackPortIsInput)) == NULL) { - printf("Cannot find any physical playback ports"); + #ifdef JACK_LOG + *fStream << "JackRouter::autoConnect : cannot find any physical playback ports" << std::endl; + #endif } else { if (fAutoConnectOut) { for (int i = 0; i < fActiveOutputs; i++) { - if (!ports[i]){ - printf("destination port is null i = %ld\n", i); + long ASIO_channel = fOutMap[i]; + if (!ports[ASIO_channel]) { + printf("destination port is null ASIO_channel = %ld\n", ASIO_channel); break; - } else if (jack_connect(fClient, jack_port_name(fOutputPorts[i]), ports[i]) != 0) { + } else if (jack_connect(fClient, jack_port_name(fOutputPorts[i]), ports[ASIO_channel]) != 0) { printf("Cannot connect output ports\n"); - } + } else { + #ifdef JACK_LOG + *fStream << "Output " << "fActiveOutputs = " << i << " ASIO_channel = " << ASIO_channel << std::endl; + #endif + } } } jack_free(ports); diff --git a/windows/JackRouter/JackRouter.h b/windows/JackRouter/JackRouter.h index 154acfd2..a50e11a8 100644 --- a/windows/JackRouter/JackRouter.h +++ b/windows/JackRouter/JackRouter.h @@ -46,8 +46,6 @@ static int kNumOutputs = 4; #include "combase.h" #include "iasiodrv.h" -#define MAX_PORTS 32 -#define LONG_SAMPLE 1 #define PATH_SEP "\\" #include @@ -86,8 +84,9 @@ public: ~JackRouter(); #endif - static int process(jack_nframes_t nframes, void* arg); - static void shutdown(void* arg); + static int processCallback(jack_nframes_t nframes, void* arg); + static void connectCallback(jack_port_id_t a, jack_port_id_t b, int connect, void* arg); + static void shutdownCallback(void* arg); ASIOBool init(void* sysRef); void getDriverName(char *name); // max 32 bytes incl. terminating zero @@ -122,7 +121,6 @@ public: void bufferSwitch(); long getMilliSeconds() {return fMilliSeconds;} - static bool fFirstActivate; static std::list > fConnections; // Connections list private: @@ -134,15 +132,11 @@ private: ASIOTime fAsioTime; ASIOTimeStamp fTheSystemTime; -#ifdef LONG_SAMPLE - long* fInputBuffers[MAX_PORTS * 2]; - long* fOutputBuffers[MAX_PORTS * 2]; -#else - float* fInputBuffers[MAX_PORTS * 2]; - float* fOutputBuffers[MAX_PORTS * 2]; -#endif - long fInMap[MAX_PORTS]; - long fOutMap[MAX_PORTS]; + void** fInputBuffers; + void** fOutputBuffers; + + long* fInMap; + long* fOutMap; long fInputLatency; long fOutputLatency; @@ -150,7 +144,10 @@ private: long fActiveOutputs; long fToggle; long fMilliSeconds; - bool fActive, fStarted; + bool fRunning; + bool fFirstActivate; + bool fFloatSample; + bool fAliasSystem; bool fTimeInfoMode, fTcRead; char fErrorMessage[128]; @@ -159,14 +156,17 @@ private: // Jack part jack_client_t* fClient; - jack_port_t* fInputPorts[MAX_PORTS]; - jack_port_t* fOutputPorts[MAX_PORTS]; + jack_port_t** fInputPorts; + jack_port_t** fOutputPorts; long fBufferSize; ASIOSampleRate fSampleRate; - void AutoConnect(); - void SaveConnections(); - void RestoreConnections(); + void autoConnect(); + void saveConnections(); + void restoreConnections(); + + void processInputs(); + void processOutputs(); }; diff --git a/windows/JackWinMutex.cpp b/windows/JackWinMutex.cpp new file mode 100644 index 00000000..30f3fa05 --- /dev/null +++ b/windows/JackWinMutex.cpp @@ -0,0 +1,126 @@ +/* + Copyright (C) 2004-2008 Grame + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + +#include "JackWinMutex.h" +#include "JackError.h" + +namespace Jack +{ + + bool JackBaseWinMutex::Lock() + { + if (fOwner != GetCurrentThreadId()) { + DWORD res = WaitForSingleObject(fMutex, INFINITE); + if (res == WAIT_OBJECT_0) { + fOwner = GetCurrentThreadId(); + return true; + } else { + jack_log("JackBaseWinMutex::Lock res = %d", res); + return false; + } + } else { + jack_error("JackBaseWinMutex::Lock mutex already locked by thread = %d", GetCurrentThreadId()); + return false; + } + } + + bool JackBaseWinMutex::Trylock() + { + if (fOwner != GetCurrentThreadId()) { + DWORD res = WaitForSingleObject(fMutex, 0); + if (res == WAIT_OBJECT_0) { + fOwner = GetCurrentThreadId(); + return true; + } else { + jack_log("JackBaseWinMutex::Trylock res = %d", res); + return false; + } + } else { + jack_error("JackBaseWinMutex::Trylock mutex already locked by thread = %d", GetCurrentThreadId()); + return false; + } + } + + bool JackBaseWinMutex::Unlock() + { + if (fOwner == GetCurrentThreadId()) { + fOwner = 0; + int res = ReleaseMutex(fMutex); + if (res != 0) { + return true; + } else { + jack_log("JackBaseWinMutex::Unlock res = %d", res); + return false; + } + } else { + jack_error("JackBaseWinMutex::Unlock mutex not locked by thread = %d", GetCurrentThreadId()); + return false; + } + } + + bool JackWinMutex::Lock() + { + if (WAIT_OBJECT_0 == WaitForSingleObject(fMutex, INFINITE)) { + return true; + } else { + jack_log("JackWinProcessSync::Lock WaitForSingleObject err = %d", GetLastError()); + return false; + } + } + + bool JackWinMutex::Trylock() + { + if (WAIT_OBJECT_0 == WaitForSingleObject(fMutex, 0)) { + return true; + } else { + jack_log("JackWinProcessSync::Trylock WaitForSingleObject err = %d", GetLastError()); + return false; + } + } + + bool JackWinMutex::Unlock() + { + if (!ReleaseMutex(fMutex)) { + jack_log("JackWinProcessSync::Unlock ReleaseMutex err = %d", GetLastError()); + return false; + } else { + return true; + } + } + + bool JackWinCriticalSection::Lock() + { + EnterCriticalSection(&fSection); + return true; + } + + bool JackWinCriticalSection::Trylock() + { + return (TryEnterCriticalSection(&fSection)); + } + + bool JackWinCriticalSection::Unlock() + { + LeaveCriticalSection(&fSection); + return true; + } + +} // namespace + + diff --git a/windows/JackWinMutex.h b/windows/JackWinMutex.h index 47d2d86a..acab453d 100644 --- a/windows/JackWinMutex.h +++ b/windows/JackWinMutex.h @@ -20,17 +20,19 @@ #ifndef __JackWinMutex__ #define __JackWinMutex__ - -#include "JackError.h" + +#include "JackCompilerDeps.h" #include "JackException.h" #include +#include namespace Jack { + /*! \brief Mutex abstraction. */ -class JackBaseWinMutex +class SERVER_EXPORT JackBaseWinMutex { protected: @@ -43,8 +45,8 @@ class JackBaseWinMutex JackBaseWinMutex():fOwner(0) { // In recursive mode by default - fMutex = (HANDLE)CreateMutex(0, FALSE, 0); - ThrowIf(fMutex == 0, JackException("JackWinMutex: could not init the mutex")); + fMutex = CreateMutex(NULL, FALSE, NULL); + ThrowIf((fMutex == 0), JackException("JackBaseWinMutex: could not init the mutex")); } virtual ~JackBaseWinMutex() @@ -52,60 +54,13 @@ class JackBaseWinMutex CloseHandle(fMutex); } - bool Lock() - { - if (fOwner != GetCurrentThreadId()) { - DWORD res = WaitForSingleObject(fMutex, INFINITE); - if (res == WAIT_OBJECT_0) { - fOwner = GetCurrentThreadId(); - return true; - } else { - jack_log("JackWinMutex::Lock res = %d", res); - return false; - } - } else { - jack_error("JackWinMutex::Lock mutex already locked by thread = %d", GetCurrentThreadId()); - return false; - } - } - - bool Trylock() - { - if (fOwner != GetCurrentThreadId()) { - DWORD res = WaitForSingleObject(fMutex, 0); - if (res == WAIT_OBJECT_0) { - fOwner = GetCurrentThreadId(); - return true; - } else { - jack_log("JackWinMutex::Trylock res = %d", res); - return false; - } - } else { - jack_error("JackWinMutex::Trylock mutex already locked by thread = %d", GetCurrentThreadId()); - return false; - } - } - - bool Unlock() - { - if (fOwner == GetCurrentThreadId()) { - fOwner = 0; - int res = ReleaseMutex(fMutex); - if (res != 0) { - return true; - } else { - jack_log("JackWinMutex::Unlock res = %d", res); - return false; - } - } else { - jack_error("JackWinMutex::Unlock mutex not locked by thread = %d", GetCurrentThreadId()); - return false; - } - } + bool Lock(); + bool Trylock(); + bool Unlock(); }; -class JackWinMutex +class SERVER_EXPORT JackWinMutex { protected: @@ -114,10 +69,18 @@ class JackWinMutex public: - JackWinMutex() + JackWinMutex(const char* name = NULL) { - // In recursive mode by default - fMutex = (HANDLE)CreateMutex(0, FALSE, 0); + // In recursive mode by default + if (name) { + char buffer[MAX_PATH]; + snprintf(buffer, sizeof(buffer), "%s_%s", "JackWinMutex", name); + fMutex = CreateMutex(NULL, FALSE, buffer); + } else { + fMutex = CreateMutex(NULL, FALSE, NULL); + } + + ThrowIf((fMutex == 0), JackException("JackWinMutex: could not init the mutex")); } virtual ~JackWinMutex() @@ -125,24 +88,39 @@ class JackWinMutex CloseHandle(fMutex); } - bool Lock() - { - return (WAIT_OBJECT_0 == WaitForSingleObject(fMutex, INFINITE)); - } + bool Lock(); + bool Trylock(); + bool Unlock(); + +}; + +class SERVER_EXPORT JackWinCriticalSection +{ - bool Trylock() + protected: + + CRITICAL_SECTION fSection; + + public: + + JackWinCriticalSection(const char* name = NULL) { - return (WAIT_OBJECT_0 == WaitForSingleObject(fMutex, 0)); + InitializeCriticalSection(&fSection); } - bool Unlock() + virtual ~JackWinCriticalSection() { - return(ReleaseMutex(fMutex) != 0); + DeleteCriticalSection(&fSection); } + bool Lock(); + bool Trylock(); + bool Unlock(); + }; } // namespace #endif + diff --git a/windows/JackWinNamedPipe.cpp b/windows/JackWinNamedPipe.cpp index 8d277673..de12c112 100644 --- a/windows/JackWinNamedPipe.cpp +++ b/windows/JackWinNamedPipe.cpp @@ -28,26 +28,26 @@ namespace Jack { -int JackWinNamedPipe::Read(void* data, int len) +int JackWinNamedPipeAux::ReadAux(void* data, int len) { DWORD read; BOOL res = ReadFile(fNamedPipe, data, len, &read, NULL); if (res && read == (DWORD)len) { return 0; } else { - jack_error("Cannot read named pipe name = %s err = %ld", fName, GetLastError()); + jack_log("Cannot read named pipe name = %s err = %ld", fName, GetLastError()); return -1; } } -int JackWinNamedPipe::Write(void* data, int len) +int JackWinNamedPipeAux::WriteAux(void* data, int len) { DWORD written; BOOL res = WriteFile(fNamedPipe, data, len, &written, NULL); if (res && written == (DWORD)len) { return 0; } else { - jack_error("Cannot write named pipe name = %s err = %ld", fName, GetLastError()); + jack_log("Cannot write named pipe name = %s err = %ld", fName, GetLastError()); return -1; } } @@ -81,7 +81,7 @@ int JackWinNamedPipeClient::ConnectAux() int JackWinNamedPipeClient::ConnectAux() { - jack_log("Connect: fName %s", fName); + jack_log("JackWinNamedPipeClient::ConnectAux : fName %s", fName); while (true) { @@ -99,15 +99,15 @@ int JackWinNamedPipeClient::ConnectAux() return 0; } - // Exit if an error other than ERROR_PIPE_BUSY occurs. - if (GetLastError() != ERROR_PIPE_BUSY) { + // Exit if an error other than ERROR_PIPE_BUSY or ERROR_FILE_NOT_FOUND occurs. + if ((GetLastError() != ERROR_PIPE_BUSY) && (GetLastError() != ERROR_FILE_NOT_FOUND)) { jack_error("Cannot connect to named pipe = %s err = %ld", fName, GetLastError()); return -1; } // All pipe instances are busy, so wait for 2 seconds. if (!WaitNamedPipe(fName, 2000)) { - jack_error("Cannot connect to named pipe = %s err = %ld", fName, GetLastError()); + jack_error("Cannot connect to named pipe after wait = %s err = %ld", fName, GetLastError()); return -1; } } @@ -137,9 +137,31 @@ int JackWinNamedPipeClient::Close() } void JackWinNamedPipeClient::SetReadTimeOut(long sec) -{} +{ + /* + COMMTIMEOUTS timeout; + if (GetCommTimeouts(fNamedPipe, &timeout)) { + jack_info("JackWinNamedPipeClient::SetReadTimeOut ReadIntervalTimeout = %d", timeout.ReadIntervalTimeout); + jack_info("JackWinNamedPipeClient::SetReadTimeOut ReadTotalTimeoutMultiplier = %d", timeout.ReadTotalTimeoutMultiplier); + jack_info("JackWinNamedPipeClient::SetReadTimeOut ReadTotalTimeoutConstant = %d", timeout.ReadTotalTimeoutConstant); + } else { + jack_error("JackWinNamedPipeClient::SetReadTimeOut err %d", GetLastError()); + } + */ +} void JackWinNamedPipeClient::SetWriteTimeOut(long sec) +{ + /* + COMMTIMEOUTS timeout; + if (GetCommTimeouts(fNamedPipe, &timeout)) { + jack_info("JackWinNamedPipeClient::SetWriteTimeOut WriteTotalTimeoutMultiplier = %d", timeout.WriteTotalTimeoutMultiplier); + jack_info("JackWinNamedPipeClient::SetWriteTimeOut WriteTotalTimeoutConstant = %d", timeout.WriteTotalTimeoutConstant); + } + */ +} + +void JackWinNamedPipeClient::SetNonBlocking(bool onoff) {} JackWinAsyncNamedPipeClient::JackWinAsyncNamedPipeClient() @@ -254,7 +276,7 @@ int JackWinAsyncNamedPipeClient::Write(void* data, int len) // Server side int JackWinNamedPipeServer::BindAux() { - jack_log("Bind: fName %s", fName); + jack_log("JackWinNamedPipeServer::BindAux : fName %s", fName); if ((fNamedPipe = CreateNamedPipe(fName, PIPE_ACCESS_DUPLEX, // read/write access @@ -290,9 +312,9 @@ bool JackWinNamedPipeServer::Accept() if (ConnectNamedPipe(fNamedPipe, NULL)) { return true; } else { - jack_error("Cannot bind server pipe name = %s err = %ld", fName, GetLastError()); + jack_error("Cannot connect server pipe name = %s err = %ld", fName, GetLastError()); if (GetLastError() == ERROR_PIPE_CONNECTED) { - jack_error("pipe already connnected = %s ", fName); + jack_error("Pipe already connnected = %s", fName); return true; } else { return false; @@ -316,7 +338,6 @@ JackWinNamedPipeClient* JackWinNamedPipeServer::AcceptClient() default: jack_error("Cannot connect server pipe name = %s err = %ld", fName, GetLastError()); return NULL; - break; } } } @@ -339,7 +360,7 @@ int JackWinNamedPipeServer::Close() int JackWinAsyncNamedPipeServer::BindAux() { - jack_log("Bind: fName %s", fName); + jack_log("JackWinAsyncNamedPipeServer::BindAux : fName %s", fName); if ((fNamedPipe = CreateNamedPipe(fName, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, // read/write access diff --git a/windows/JackWinNamedPipe.h b/windows/JackWinNamedPipe.h index 2a4fc730..01e971a4 100644 --- a/windows/JackWinNamedPipe.h +++ b/windows/JackWinNamedPipe.h @@ -23,10 +23,12 @@ #include +#include "JackChannel.h" + namespace Jack { -class JackWinNamedPipe +class JackWinNamedPipeAux { protected: @@ -34,35 +36,59 @@ class JackWinNamedPipe HANDLE fNamedPipe; char fName[256]; + int ReadAux(void* data, int len); + int WriteAux(void* data, int len); + + public: + + JackWinNamedPipeAux(): fNamedPipe(INVALID_HANDLE_VALUE) + {} + JackWinNamedPipeAux(HANDLE pipe): fNamedPipe(pipe) + {} + virtual ~JackWinNamedPipeAux() + {} + +}; + + +class JackWinNamedPipe : public JackWinNamedPipeAux, public detail::JackChannelTransactionInterface +{ + public: - JackWinNamedPipe(): fNamedPipe(INVALID_HANDLE_VALUE) + JackWinNamedPipe():JackWinNamedPipeAux() {} - JackWinNamedPipe(HANDLE pipe): fNamedPipe(pipe) + JackWinNamedPipe(HANDLE pipe):JackWinNamedPipeAux(pipe) {} virtual ~JackWinNamedPipe() {} - virtual int Read(void* data, int len); - virtual int Write(void* data, int len); + virtual int Read(void* data, int len) + { + return ReadAux(data, len); + } + virtual int Write(void* data, int len) + { + return WriteAux(data, len); + } }; /*! \brief Client named pipe. */ -class JackWinNamedPipeClient : public JackWinNamedPipe +class JackWinNamedPipeClient : public JackWinNamedPipeAux, public detail::JackClientRequestInterface { - private: + protected: int ConnectAux(); public: - JackWinNamedPipeClient(): JackWinNamedPipe() + JackWinNamedPipeClient():JackWinNamedPipeAux() {} - JackWinNamedPipeClient(HANDLE pipe, const char* name): JackWinNamedPipe(pipe) + JackWinNamedPipeClient(HANDLE pipe, const char* name):JackWinNamedPipeAux(pipe) { strcpy(fName, name); } @@ -73,8 +99,20 @@ class JackWinNamedPipeClient : public JackWinNamedPipe virtual int Connect(const char* dir, int which); virtual int Connect(const char* dir, const char* name, int which); virtual int Close(); + + virtual int Read(void* data, int len) + { + return ReadAux(data, len); + } + virtual int Write(void* data, int len) + { + return WriteAux(data, len); + } + virtual void SetReadTimeOut(long sec); virtual void SetWriteTimeOut(long sec); + + virtual void SetNonBlocking(bool onoff); }; class JackWinAsyncNamedPipeClient : public JackWinNamedPipeClient diff --git a/windows/JackWinNamedPipeClientChannel.cpp b/windows/JackWinNamedPipeClientChannel.cpp index 56481531..74b64339 100644 --- a/windows/JackWinNamedPipeClientChannel.cpp +++ b/windows/JackWinNamedPipeClientChannel.cpp @@ -27,25 +27,15 @@ namespace Jack { -JackWinNamedPipeClientChannel::JackWinNamedPipeClientChannel():fThread(this) +JackWinNamedPipeClientChannel::JackWinNamedPipeClientChannel() + :JackGenericClientChannel(),fThread(this) { - fClient = NULL; + fRequest = new JackWinNamedPipeClient(); } JackWinNamedPipeClientChannel::~JackWinNamedPipeClientChannel() -{} - -int JackWinNamedPipeClientChannel::ServerCheck(const char* server_name) { - jack_log("JackWinNamedPipeClientChannel::ServerCheck = %s", server_name); - - // Connect to server - if (fRequestPipe.Connect(jack_server_dir, server_name, 0) < 0) { - jack_error("Cannot connect to server pipe"); - return -1; - } else { - return 0; - } + delete fRequest; } int JackWinNamedPipeClientChannel::Open(const char* server_name, const char* name, int uuid, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status) @@ -54,14 +44,14 @@ int JackWinNamedPipeClientChannel::Open(const char* server_name, const char* nam jack_log("JackWinNamedPipeClientChannel::Open name = %s", name); /* - 16/08/07: was called before doing "fRequestPipe.Connect" .... still necessary? + 16/08/07: was called before doing "fRequest->Connect" .... still necessary? if (fNotificationListenPipe.Bind(jack_client_dir, name, 0) < 0) { jack_error("Cannot bind pipe"); goto error; } */ - if (fRequestPipe.Connect(jack_server_dir, server_name, 0) < 0) { + if (fRequest->Connect(jack_server_dir, server_name, 0) < 0) { jack_error("Cannot connect to server pipe"); goto error; } @@ -86,14 +76,14 @@ int JackWinNamedPipeClientChannel::Open(const char* server_name, const char* nam return 0; error: - fRequestPipe.Close(); + fRequest->Close(); fNotificationListenPipe.Close(); return -1; } void JackWinNamedPipeClientChannel::Close() { - fRequestPipe.Close(); + fRequest->Close(); fNotificationListenPipe.Close(); // Here the thread will correctly stop when the pipe are closed fThread.Stop(); @@ -119,241 +109,14 @@ void JackWinNamedPipeClientChannel::Stop() fThread.Kill(); // Unsafe on WIN32... TODO : solve WIN32 thread Kill issue } -void JackWinNamedPipeClientChannel::ServerSyncCall(JackRequest* req, JackResult* res, int* result) -{ - if (req->Write(&fRequestPipe) < 0) { - jack_error("Could not write request type = %ld", req->fType); - *result = -1; - return ; - } - - if (res->Read(&fRequestPipe) < 0) { - jack_error("Could not read result type = %ld", req->fType); - *result = -1; - return ; - } - - *result = res->fResult; -} - -void JackWinNamedPipeClientChannel::ServerAsyncCall(JackRequest* req, JackResult* res, int* result) -{ - if (req->Write(&fRequestPipe) < 0) { - jack_error("Could not write request type = %ld", req->fType); - *result = -1; - } else { - *result = 0; - } -} - -void JackWinNamedPipeClientChannel::ClientCheck(const char* name, int uuid, char* name_res, int protocol, int options, int* status, int* result, int open) -{ - JackClientCheckRequest req(name, protocol, options, uuid, open); - JackClientCheckResult res; - ServerSyncCall(&req, &res, result); - *status = res.fStatus; - strcpy(name_res, res.fName); -} - -void JackWinNamedPipeClientChannel::ClientOpen(const char* name, int pid, int uuid, int* shared_engine, int* shared_client, int* shared_graph, int* result) -{ - JackClientOpenRequest req(name, pid, uuid); - JackClientOpenResult res; - ServerSyncCall(&req, &res, result); - *shared_engine = res.fSharedEngine; - *shared_client = res.fSharedClient; - *shared_graph = res.fSharedGraph; -} - -void JackWinNamedPipeClientChannel::ClientClose(int refnum, int* result) -{ - JackClientCloseRequest req(refnum); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackWinNamedPipeClientChannel::ClientActivate(int refnum, int is_real_time, int* result) -{ - JackActivateRequest req(refnum, is_real_time); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackWinNamedPipeClientChannel::ClientDeactivate(int refnum, int* result) -{ - JackDeactivateRequest req(refnum); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackWinNamedPipeClientChannel::PortRegister(int refnum, const char* name, const char* type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result) -{ - JackPortRegisterRequest req(refnum, name, type, flags, buffer_size); - JackPortRegisterResult res; - ServerSyncCall(&req, &res, result); - *port_index = res.fPortIndex; -} - -void JackWinNamedPipeClientChannel::PortUnRegister(int refnum, jack_port_id_t port_index, int* result) -{ - JackPortUnRegisterRequest req(refnum, port_index); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackWinNamedPipeClientChannel::PortConnect(int refnum, const char* src, const char* dst, int* result) -{ - JackPortConnectNameRequest req(refnum, src, dst); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackWinNamedPipeClientChannel::PortDisconnect(int refnum, const char* src, const char* dst, int* result) -{ - JackPortDisconnectNameRequest req(refnum, src, dst); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackWinNamedPipeClientChannel::PortConnect(int refnum, jack_port_id_t src, jack_port_id_t dst, int* result) -{ - JackPortConnectRequest req(refnum, src, dst); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackWinNamedPipeClientChannel::PortDisconnect(int refnum, jack_port_id_t src, jack_port_id_t dst, int* result) -{ - JackPortDisconnectRequest req(refnum, src, dst); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackWinNamedPipeClientChannel::PortRename(int refnum, jack_port_id_t port, const char* name, int* result) -{ - JackPortRenameRequest req(refnum, port, name); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackWinNamedPipeClientChannel::SetBufferSize(jack_nframes_t buffer_size, int* result) -{ - JackSetBufferSizeRequest req(buffer_size); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackWinNamedPipeClientChannel::SetFreewheel(int onoff, int* result) -{ - JackSetFreeWheelRequest req(onoff); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackWinNamedPipeClientChannel::ComputeTotalLatencies(int* result) -{ - JackComputeTotalLatenciesRequest req; - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackWinNamedPipeClientChannel::SessionNotify(int refnum, const char* target, jack_session_event_type_t type, const char* path, jack_session_command_t** result) -{ - JackSessionNotifyRequest req(refnum, path, type, target); - JackSessionNotifyResult res; - int intresult; - ServerSyncCall(&req, &res, &intresult); - *result = res.GetCommands(); -} - -void JackWinNamedPipeClientChannel::SessionReply(int refnum, int* result) -{ - JackSessionReplyRequest req(refnum); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackWinNamedPipeClientChannel::GetUUIDForClientName(int refnum, const char* client_name, char* uuid_res, int* result) -{ - JackGetUUIDRequest req(client_name); - JackUUIDResult res; - ServerSyncCall(&req, &res, result); - strncpy(uuid_res, res.fUUID, JACK_UUID_SIZE); -} - -void JackWinNamedPipeClientChannel::GetClientNameForUUID(int refnum, const char* uuid, char* name_res, int* result) -{ - JackGetClientNameRequest req(uuid); - JackClientNameResult res; - ServerSyncCall(&req, &res, result); - strncpy(name_res, res.fName, JACK_CLIENT_NAME_SIZE); -} - -void JackWinNamedPipeClientChannel::ClientHasSessionCallback(const char* client_name, int* result) -{ - JackClientHasSessionCallbackRequest req(client_name); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackWinNamedPipeClientChannel::ReserveClientName(int refnum, const char* client_name, const char* uuid, int* result) -{ - JackReserveNameRequest req(refnum, client_name, uuid); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackWinNamedPipeClientChannel::ReleaseTimebase(int refnum, int* result) -{ - JackReleaseTimebaseRequest req(refnum); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackWinNamedPipeClientChannel::SetTimebaseCallback(int refnum, int conditional, int* result) -{ - JackSetTimebaseCallbackRequest req(refnum, conditional); - JackResult res; - ServerSyncCall(&req, &res, result); -} - -void JackWinNamedPipeClientChannel::GetInternalClientName(int refnum, int int_ref, char* name_res, int* result) -{ - JackGetInternalClientNameRequest req(refnum, int_ref); - JackGetInternalClientNameResult res; - ServerSyncCall(&req, &res, result); - strcpy(name_res, res.fName); -} - -void JackWinNamedPipeClientChannel::InternalClientHandle(int refnum, const char* client_name, int* status, int* int_ref, int* result) -{ - JackInternalClientHandleRequest req(refnum, client_name); - JackInternalClientHandleResult res; - ServerSyncCall(&req, &res, result); - *int_ref = res.fIntRefNum; - *status = res.fStatus; -} - -void JackWinNamedPipeClientChannel::InternalClientLoad(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int* status, int* int_ref, int uuid, int* result) -{ - JackInternalClientLoadRequest req(refnum, client_name, so_name, objet_data, options, uuid); - JackInternalClientLoadResult res; - ServerSyncCall(&req, &res, result); - *int_ref = res.fIntRefNum; - *status = res.fStatus; -} - -void JackWinNamedPipeClientChannel::InternalClientUnload(int refnum, int int_ref, int* status, int* result) -{ - JackInternalClientUnloadRequest req(refnum, int_ref); - JackInternalClientUnloadResult res; - ServerSyncCall(&req, &res, result); - *status = res.fStatus; -} - bool JackWinNamedPipeClientChannel::Init() { jack_log("JackWinNamedPipeClientChannel::Init"); + + // Setup context + if (!jack_tls_set(JackGlobals::fNotificationThread, this)) { + jack_error("Failed to set thread notification key"); + } if (!fNotificationListenPipe.Accept()) { jack_error("JackWinNamedPipeClientChannel: cannot establish notification pipe"); @@ -386,7 +149,7 @@ bool JackWinNamedPipeClientChannel::Execute() error: // Close the pipes, server wont be able to create them otherwise. fNotificationListenPipe.Close(); - fRequestPipe.Close(); + fRequest->Close(); fClient->ShutDown(); return false; } diff --git a/windows/JackWinNamedPipeClientChannel.h b/windows/JackWinNamedPipeClientChannel.h index 7b84eba8..8660029b 100644 --- a/windows/JackWinNamedPipeClientChannel.h +++ b/windows/JackWinNamedPipeClientChannel.h @@ -21,30 +21,28 @@ #ifndef __JackWinNamedPipeClientChannel__ #define __JackWinNamedPipeClientChannel__ -#include "JackChannel.h" +#include "JackGenericClientChannel.h" #include "JackWinNamedPipe.h" #include "JackPlatformPlug.h" -#include "JackRequest.h" +#include "JackThread.h" namespace Jack { +class JackClient; + /*! \brief JackClientChannel using pipes. */ -class JackWinNamedPipeClientChannel : public detail::JackClientChannelInterface, public JackRunnableInterface +class JackWinNamedPipeClientChannel : public JackGenericClientChannel, public JackRunnableInterface { private: - JackWinNamedPipeClient fRequestPipe; // Pipe to communicate with the server JackWinNamedPipeServer fNotificationListenPipe; // Pipe listener for server notification JackThread fThread; // Thread to execute the event loop - JackClient* fClient; - - void ServerSyncCall(JackRequest* req, JackResult* res, int* result); - void ServerAsyncCall(JackRequest* req, JackResult* res, int* result); + JackClient* fClient; public: @@ -57,47 +55,6 @@ class JackWinNamedPipeClientChannel : public detail::JackClientChannelInterface, int Start(); void Stop(); - int ServerCheck(const char* server_name); - - void ClientCheck(const char* name, int uuid, char* name_res, int protocol, int options, int* status, int* result, int open); - void ClientOpen(const char* name, int pid, int uuid, int* shared_engine, int* shared_client, int* shared_graph, int* result); - void ClientOpen(const char* name, int* ref, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, int* result) - {} - void ClientClose(int refnum, int* result); - - void ClientActivate(int refnum, int is_real_time, int* result); - void ClientDeactivate(int refnum, int* result); - - void PortRegister(int refnum, const char* name, const char* type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result); - void PortUnRegister(int refnum, jack_port_id_t port_index, int* result); - - void PortConnect(int refnum, const char* src, const char* dst, int* result); - void PortDisconnect(int refnum, const char* src, const char* dst, int* result); - - void PortConnect(int refnum, jack_port_id_t src, jack_port_id_t dst, int* result); - void PortDisconnect(int refnum, jack_port_id_t src, jack_port_id_t dst, int* result); - - void PortRename(int refnum, jack_port_id_t port, const char* name, int* result); - - void SetBufferSize(jack_nframes_t buffer_size, int* result); - void SetFreewheel(int onoff, int* result); - void ComputeTotalLatencies(int* result); - - void ReleaseTimebase(int refnum, int* result); - void SetTimebaseCallback(int refnum, int conditional, int* result); - - void GetInternalClientName(int refnum, int int_ref, char* name_res, int* result); - void InternalClientHandle(int refnum, const char* client_name, int* status, int* int_ref, int* result); - void InternalClientLoad(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int* status, int* int_ref, int uuid, int* result); - void InternalClientUnload(int refnum, int int_ref, int* status, int* result); - - void SessionNotify(int refnum, const char* target, jack_session_event_type_t type, const char* path, jack_session_command_t** result); - void SessionReply(int refnum, int* result); - void GetUUIDForClientName(int refnum, const char* client_name, char* uuid_res, int* result); - void GetClientNameForUUID(int refnum, const char* uuid, char* name_res, int* result); - void ReserveClientName(int refnum, const char* client_name, const char *uuid, int* result); - void ClientHasSessionCallback(const char* client_name, int* result); - // JackRunnableInterface interface bool Init(); bool Execute(); diff --git a/windows/JackWinNamedPipeNotifyChannel.cpp b/windows/JackWinNamedPipeNotifyChannel.cpp index 1c559d87..4312f5b1 100644 --- a/windows/JackWinNamedPipeNotifyChannel.cpp +++ b/windows/JackWinNamedPipeNotifyChannel.cpp @@ -55,7 +55,6 @@ void JackWinNamedPipeNotifyChannel::ClientNotify(int refnum, const char* name, i // Send notification if (event.Write(&fNotifyPipe) < 0) { jack_error("Could not write notification"); - fNotifyPipe.Close(); *result = -1; return; } @@ -65,7 +64,6 @@ void JackWinNamedPipeNotifyChannel::ClientNotify(int refnum, const char* name, i // Get result : use a time out if (res.Read(&fNotifyPipe) < 0) { jack_error("Could not read result"); - fNotifyPipe.Close(); *result = -1; } else { *result = res.fResult; diff --git a/windows/JackWinNamedPipeServerChannel.cpp b/windows/JackWinNamedPipeServerChannel.cpp index cf95b36b..da2500ef 100644 --- a/windows/JackWinNamedPipeServerChannel.cpp +++ b/windows/JackWinNamedPipeServerChannel.cpp @@ -39,7 +39,7 @@ HANDLE JackClientPipeThread::fMutex = NULL; // Never released.... // fRefNum = -1 correspond to already removed client JackClientPipeThread::JackClientPipeThread(JackWinNamedPipeClient* pipe) - :fPipe(pipe), fServer(NULL), fThread(this), fRefNum(0) + :fPipe(pipe), fDecoder(NULL), fServer(NULL), fThread(this), fRefNum(0) { // First one allocated the static fMutex if (fMutex == NULL) { @@ -59,378 +59,72 @@ int JackClientPipeThread::Open(JackServer* server) // Open the Server/Clien if (fThread.Start() != 0) { jack_error("Cannot start Jack server listener\n"); return -1; + } else { + fDecoder = new JackRequestDecoder(server, this); + fServer = server; + return 0; } - - fServer = server; - return 0; } void JackClientPipeThread::Close() // Close the Server/Client connection { - jack_log("JackClientPipeThread::Close %x %ld", this, fRefNum); - /* - TODO : solve WIN32 thread Kill issue - This would hang.. since Close will be followed by a delete, - all ressources will be deallocated at the end. - */ + jack_log("JackClientPipeThread::Close 0 %x %ld", this, fRefNum); - fThread.Kill(); + //fThread.Kill(); fPipe->Close(); fRefNum = -1; + + delete fDecoder; + fDecoder = NULL; } bool JackClientPipeThread::Execute() { - try{ - jack_log("JackClientPipeThread::Execute"); - return (HandleRequest()); - } catch (JackQuitException& e) { - jack_log("JackClientPipeThread::Execute JackQuitException"); - return false; - } -} + try { -bool JackClientPipeThread::HandleRequest() -{ - // Read header - JackRequest header; - int res = header.Read(fPipe); - bool ret = true; - - // Lock the global mutex - if (WaitForSingleObject(fMutex, INFINITE) == WAIT_FAILED) { - jack_error("JackClientPipeThread::HandleRequest: mutex wait error"); - } + jack_log("JackClientPipeThread::Execute %x", this); + JackRequest header; + int res = header.Read(fPipe); + bool ret = true; - if (res < 0) { - jack_error("HandleRequest: cannot read header"); - ClientKill(); - ret = false; - } else { + // Lock the global mutex + if (WaitForSingleObject(fMutex, INFINITE) == WAIT_FAILED) { + jack_error("JackClientPipeThread::Execute : mutex wait error"); + } - // Read data - switch (header.fType) { - - case JackRequest::kClientCheck: { - jack_log("JackRequest::ClientCheck"); - JackClientCheckRequest req; - JackClientCheckResult res; - if (req.Read(fPipe) == 0) - res.fResult = fServer->GetEngine()->ClientCheck(req.fName, req.fUUID, res.fName, req.fProtocol, req.fOptions, &res.fStatus); - res.Write(fPipe); - // Atomic ClientCheck followed by ClientOpen on same pipe - if (req.fOpen) - HandleRequest(); - break; - } - - case JackRequest::kClientOpen: { - jack_log("JackRequest::ClientOpen"); - JackClientOpenRequest req; - JackClientOpenResult res; - if (req.Read(fPipe) == 0) - ClientAdd(req.fName, req.fPID, req.fUUID, &res.fSharedEngine, &res.fSharedClient, &res.fSharedGraph, &res.fResult); - res.Write(fPipe); - break; - } - - case JackRequest::kClientClose: { - jack_log("JackRequest::ClientClose"); - JackClientCloseRequest req; - JackResult res; - if (req.Read(fPipe) == 0) - res.fResult = fServer->GetEngine()->ClientExternalClose(req.fRefNum); - res.Write(fPipe); - ClientRemove(); - ret = false; - break; - } - - case JackRequest::kActivateClient: { - JackActivateRequest req; - JackResult res; - jack_log("JackRequest::ActivateClient"); - if (req.Read(fPipe) == 0) - res.fResult = fServer->GetEngine()->ClientActivate(req.fRefNum, req.fIsRealTime); - res.Write(fPipe); - break; - } - - case JackRequest::kDeactivateClient: { - jack_log("JackRequest::DeactivateClient"); - JackDeactivateRequest req; - JackResult res; - if (req.Read(fPipe) == 0) - res.fResult = fServer->GetEngine()->ClientDeactivate(req.fRefNum); - res.Write(fPipe); - break; - } - - case JackRequest::kRegisterPort: { - jack_log("JackRequest::RegisterPort"); - JackPortRegisterRequest req; - JackPortRegisterResult res; - if (req.Read(fPipe) == 0) - res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fPortType, req.fFlags, req.fBufferSize, &res.fPortIndex); - res.Write(fPipe); - break; - } - - case JackRequest::kUnRegisterPort: { - jack_log("JackRequest::UnRegisterPort"); - JackPortUnRegisterRequest req; - JackResult res; - if (req.Read(fPipe) == 0) - res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex); - res.Write(fPipe); - break; - } - - case JackRequest::kConnectNamePorts: { - jack_log("JackRequest::ConnectNamePorts"); - JackPortConnectNameRequest req; - JackResult res; - if (req.Read(fPipe) == 0) - res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); - res.Write(fPipe); - break; - } - - case JackRequest::kDisconnectNamePorts: { - jack_log("JackRequest::DisconnectNamePorts"); - JackPortDisconnectNameRequest req; - JackResult res; - if (req.Read(fPipe) == 0) - res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); - res.Write(fPipe); - break; - } - - case JackRequest::kConnectPorts: { - jack_log("JackRequest::ConnectPorts"); - JackPortConnectRequest req; - JackResult res; - if (req.Read(fPipe) == 0) - res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); - res.Write(fPipe); - break; - } - - case JackRequest::kDisconnectPorts: { - jack_log("JackRequest::DisconnectPorts"); - JackPortDisconnectRequest req; - JackResult res; - if (req.Read(fPipe) == 0) - res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); - res.Write(fPipe); - break; - } - - case JackRequest::kPortRename: { - jack_log("JackRequest::PortRename"); - JackPortRenameRequest req; - JackResult res; - if (req.Read(fPipe) == 0) - res.fResult = fServer->GetEngine()->PortRename(req.fRefNum, req.fPort, req.fName); - res.Write(fPipe); - break; - } - - case JackRequest::kSetBufferSize: { - jack_log("JackRequest::SetBufferSize"); - JackSetBufferSizeRequest req; - JackResult res; - if (req.Read(fPipe) == 0) - res.fResult = fServer->SetBufferSize(req.fBufferSize); - res.Write(fPipe); - break; - } - - case JackRequest::kSetFreeWheel: { - jack_log("JackRequest::SetFreeWheel"); - JackSetFreeWheelRequest req; - JackResult res; - if (req.Read(fPipe) == 0) - res.fResult = fServer->SetFreewheel(req.fOnOff); - res.Write(fPipe); - break; - } - - case JackRequest::kComputeTotalLatencies: { - jack_log("JackRequest::ComputeTotalLatencies"); - JackComputeTotalLatenciesRequest req; - JackResult res; - if (req.Read(fPipe) == 0) - res.fResult = fServer->GetEngine()->ComputeTotalLatencies(); - res.Write(fPipe); - break; - } - - case JackRequest::kReleaseTimebase: { - jack_log("JackRequest::ReleaseTimebase"); - JackReleaseTimebaseRequest req; - JackResult res; - if (req.Read(fPipe) == 0) - res.fResult = fServer->ReleaseTimebase(req.fRefNum); - res.Write(fPipe); - break; - } - - case JackRequest::kSetTimebaseCallback: { - jack_log("JackRequest::SetTimebaseCallback"); - JackSetTimebaseCallbackRequest req; - JackResult res; - if (req.Read(fPipe) == 0) - res.fResult = fServer->SetTimebaseCallback(req.fRefNum, req.fConditionnal); - res.Write(fPipe); - break; - } - - case JackRequest::kGetInternalClientName: { - jack_log("JackRequest::GetInternalClientName"); - JackGetInternalClientNameRequest req; - JackGetInternalClientNameResult res; - if (req.Read(fPipe) == 0) - res.fResult = fServer->GetEngine()->GetInternalClientName(req.fIntRefNum, res.fName); - res.Write(fPipe); - break; - } - - case JackRequest::kInternalClientHandle: { - jack_log("JackRequest::InternalClientHandle"); - JackInternalClientHandleRequest req; - JackInternalClientHandleResult res; - if (req.Read(fPipe) == 0) - res.fResult = fServer->GetEngine()->InternalClientHandle(req.fName, &res.fStatus, &res.fIntRefNum); - res.Write(fPipe); - break; - } - - case JackRequest::kInternalClientLoad: { - jack_log("JackRequest::InternalClientLoad"); - JackInternalClientLoadRequest req; - JackInternalClientLoadResult res; - if (req.Read(fPipe) == 0) - res.fResult = fServer->InternalClientLoad1(req.fName, req.fDllName, req.fLoadInitName, req.fOptions, &res.fIntRefNum, req.fUUID, &res.fStatus); - res.Write(fPipe); - break; - } - - case JackRequest::kInternalClientUnload: { - jack_log("JackRequest::InternalClientUnload"); - JackInternalClientUnloadRequest req; - JackInternalClientUnloadResult res; - if (req.Read(fPipe) == 0) - res.fResult = fServer->GetEngine()->InternalClientUnload(req.fIntRefNum, &res.fStatus); - res.Write(fPipe); - break; - } - - case JackRequest::kNotification: { - jack_log("JackRequest::Notification"); - JackClientNotificationRequest req; - if (req.Read(fPipe) == 0) { - if (req.fNotify == kQUIT) { - jack_log("JackRequest::Notification kQUIT"); - throw JackQuitException(); - } else { - fServer->Notify(req.fRefNum, req.fNotify, req.fValue); - } - } - break; - } - - case JackRequest::kSessionNotify: { - jack_log("JackRequest::SessionNotify"); - JackSessionNotifyRequest req; - if (req.Read(fPipe) == 0) { - fServer->GetEngine()->SessionNotify(req.fRefNum, req.fDst, req.fEventType, req.fPath, fPipe, NULL); - } - break; - } - - case JackRequest::kSessionReply: { - jack_log("JackRequest::SessionReply"); - JackSessionReplyRequest req; - JackResult res; - if (req.Read(fPipe) == 0) { - fServer->GetEngine()->SessionReply(req.fRefNum); - res.fResult = 0; - } - res.Write(fPipe); - break; - } - - case JackRequest::kGetClientByUUID: { - jack_log("JackRequest::GetClientByUUID"); - JackGetClientNameRequest req; - JackClientNameResult res; - if (req.Read(fPipe) == 0) { - fServer->GetEngine()->GetClientNameForUUID(req.fUUID, res.fName, &res.fResult); - } - res.Write(fPipe); - break; - } - - case JackRequest::kGetUUIDByClient: { - jack_log("JackRequest::GetUUIDByClient"); - JackGetUUIDRequest req; - JackUUIDResult res; - if (req.Read(fPipe) == 0) { - fServer->GetEngine()->GetUUIDForClientName(req.fName, res.fUUID, &res.fResult); - } - res.Write(fPipe); - break; - } - - case JackRequest::kReserveClientName: { - jack_log("JackRequest::ReserveClientName"); - JackReserveNameRequest req; - JackResult res; - if (req.Read(fPipe) == 0) { - fServer->GetEngine()->ReserveClientName(req.fName, req.fUUID, &res.fResult); - } - res.Write(fPipe); - break; - } - - case JackRequest::kClientHasSessionCallback: { - jack_log("JackRequest::ClientHasSessionCallback"); - JackClientHasSessionCallbackRequest req; - JackResult res; - if (req.Read(fPipe) == 0) { - fServer->GetEngine()->ClientHasSessionCallback(req.fName, &res.fResult); - } - res.Write(fPipe); - break; - } - - default: - jack_log("Unknown request %ld", header.fType); - break; + // Decode header + if (res < 0) { + jack_log("JackClientPipeThread::Execute : cannot decode header"); + ClientKill(); + ret = false; + // Decode request + } else if (fDecoder->HandleRequest(fPipe, header.fType) < 0) { + ret = false; } - } - // Unlock the global mutex - ReleaseMutex(fMutex); - return ret; + // Unlock the global mutex + if (!ReleaseMutex(fMutex)) { + jack_error("JackClientPipeThread::Execute : mutex release error"); + } + return ret; + + } catch (JackQuitException& e) { + jack_log("JackClientPipeThread::Execute : JackQuitException"); + return false; + } } -void JackClientPipeThread::ClientAdd(char* name, int pid, int uuid, int* shared_engine, int* shared_client, int* shared_graph, int* result) +void JackClientPipeThread::ClientAdd(detail::JackChannelTransactionInterface* socket, JackClientOpenRequest* req, JackClientOpenResult *res) { - jack_log("JackClientPipeThread::ClientAdd %s", name); + jack_log("JackClientPipeThread::ClientAdd %x %s", this, req->fName); fRefNum = -1; - *result = fServer->GetEngine()->ClientExternalOpen(name, pid, uuid, &fRefNum, shared_engine, shared_client, shared_graph); + res->fResult = fServer->GetEngine()->ClientExternalOpen(req->fName, req->fPID, req->fUUID, &fRefNum, &res->fSharedEngine, &res->fSharedClient, &res->fSharedGraph); } -void JackClientPipeThread::ClientRemove() +void JackClientPipeThread::ClientRemove(detail::JackChannelTransactionInterface* socket_aux, int refnum) { - jack_log("JackClientPipeThread::ClientRemove ref = %d", fRefNum); - /* TODO : solve WIN32 thread Kill issue + jack_log("JackClientPipeThread::ClientRemove ref = %d", refnum); Close(); - */ - fRefNum = -1; - fPipe->Close(); } void JackClientPipeThread::ClientKill() @@ -438,9 +132,9 @@ void JackClientPipeThread::ClientKill() jack_log("JackClientPipeThread::ClientKill ref = %d", fRefNum); if (fRefNum == -1) { // Correspond to an already removed client. - jack_log("Kill a closed client"); + jack_log("Kill a closed client %x", this); } else if (fRefNum == 0) { // Correspond to a still not opened client. - jack_log("Kill a not opened client"); + jack_log("Kill a not opened client %x", this); } else { fServer->ClientKill(fRefNum); } @@ -464,17 +158,17 @@ JackWinNamedPipeServerChannel::~JackWinNamedPipeServerChannel() int JackWinNamedPipeServerChannel::Open(const char* server_name, JackServer* server) { - jack_log("JackWinNamedPipeServerChannel::Open "); + jack_log("JackWinNamedPipeServerChannel::Open"); snprintf(fServerName, sizeof(fServerName), server_name); // Needed for internal connection from JackWinNamedPipeServerNotifyChannel object - if (fRequestListenPipe.Bind(jack_server_dir, server_name, 0) < 0) { + if (ClientListen()) { + fServer = server; + return 0; + } else { jack_error("JackWinNamedPipeServerChannel::Open : cannot create result listen pipe"); return -1; } - - fServer = server; - return 0; } void JackWinNamedPipeServerChannel::Close() @@ -507,35 +201,41 @@ void JackWinNamedPipeServerChannel::Stop() bool JackWinNamedPipeServerChannel::Init() { - jack_log("JackWinNamedPipeServerChannel::Init "); - JackWinNamedPipeClient* pipe; - + jack_log("JackWinNamedPipeServerChannel::Init"); // Accept first client, that is the JackWinNamedPipeServerNotifyChannel object - if ((pipe = fRequestListenPipe.AcceptClient()) == NULL) { - jack_error("JackWinNamedPipeServerChannel::Init : cannot connect pipe"); + return ClientAccept(); +} + +bool JackWinNamedPipeServerChannel::ClientListen() +{ + if (fRequestListenPipe.Bind(jack_server_dir, fServerName, 0) < 0) { + jack_error("JackWinNamedPipeServerChannel::ClientListen : cannot create result listen pipe"); return false; } else { - ClientAdd(pipe); return true; } } -bool JackWinNamedPipeServerChannel::Execute() +bool JackWinNamedPipeServerChannel::ClientAccept() { - JackWinNamedPipeClient* pipe; + JackWinNamedPipeClient* pipe; - if (fRequestListenPipe.Bind(jack_server_dir, fServerName, 0) < 0) { - jack_error("JackWinNamedPipeServerChannel::Open : cannot create result listen pipe"); + if ((pipe = fRequestListenPipe.AcceptClient()) == NULL) { + jack_error("JackWinNamedPipeServerChannel::ClientAccept : cannot connect pipe"); return false; + } else { + ClientAdd(pipe); + return true; } +} - if ((pipe = fRequestListenPipe.AcceptClient()) == NULL) { - jack_error("JackWinNamedPipeServerChannel::Open : cannot connect pipe"); - return false; +bool JackWinNamedPipeServerChannel::Execute() +{ + if (!ClientListen()) { + return false; } - ClientAdd(pipe); - return true; + return ClientAccept(); } void JackWinNamedPipeServerChannel::ClientAdd(JackWinNamedPipeClient* pipe) @@ -544,11 +244,10 @@ void JackWinNamedPipeServerChannel::ClientAdd(JackWinNamedPipeClient* pipe) std::list::iterator it = fClientList.begin(); JackClientPipeThread* client; - jack_log("ClientAdd size %ld", fClientList.size()); + jack_log("JackWinNamedPipeServerChannel::ClientAdd size %ld", fClientList.size()); while (it != fClientList.end()) { client = *it; - jack_log("Remove dead client = %x running = %ld", client, client->IsRunning()); if (client->IsRunning()) { it++; } else { @@ -559,6 +258,7 @@ void JackWinNamedPipeServerChannel::ClientAdd(JackWinNamedPipeClient* pipe) client = new JackClientPipeThread(pipe); client->Open(fServer); + // Here we are sure that the client is running (because it's thread is in "running" state). fClientList.push_back(client); } diff --git a/windows/JackWinNamedPipeServerChannel.h b/windows/JackWinNamedPipeServerChannel.h index c798ed0b..0cc14129 100644 --- a/windows/JackWinNamedPipeServerChannel.h +++ b/windows/JackWinNamedPipeServerChannel.h @@ -24,6 +24,9 @@ #include "JackWinNamedPipe.h" #include "JackPlatformPlug.h" #include "JackConstants.h" + +#include "JackRequestDecoder.h" + #include namespace Jack @@ -31,18 +34,20 @@ namespace Jack class JackServer; -class JackClientPipeThread : public JackRunnableInterface +class JackClientPipeThread : public JackRunnableInterface, public JackClientHandlerInterface { private: JackWinNamedPipeClient* fPipe; + JackRequestDecoder* fDecoder; JackServer* fServer; JackThread fThread; int fRefNum; - void ClientAdd(char* name, int pid, int uuid, int* shared_engine, int* shared_client, int* shared_graph, int* result); - void ClientRemove(); + void ClientAdd(detail::JackChannelTransactionInterface* socket, JackClientOpenRequest* req, JackClientOpenResult *res); + void ClientRemove(detail::JackChannelTransactionInterface* socket, int refnum); + void ClientKill(); static HANDLE fMutex; @@ -55,8 +60,6 @@ class JackClientPipeThread : public JackRunnableInterface int Open(JackServer* server); // Open the Server/Client connection void Close(); // Close the Server/Client connection - bool HandleRequest(); - // JackRunnableInterface interface bool Execute(); @@ -65,6 +68,7 @@ class JackClientPipeThread : public JackRunnableInterface { return (fRefNum >= 0); } + }; /*! @@ -85,6 +89,9 @@ class JackWinNamedPipeServerChannel : public JackRunnableInterface void ClientAdd(JackWinNamedPipeClient* pipe); + bool ClientListen(); + bool ClientAccept(); + public: JackWinNamedPipeServerChannel(); diff --git a/windows/JackWinNamedPipeServerNotifyChannel.cpp b/windows/JackWinNamedPipeServerNotifyChannel.cpp index 8036d81f..52f34d5c 100644 --- a/windows/JackWinNamedPipeServerNotifyChannel.cpp +++ b/windows/JackWinNamedPipeServerNotifyChannel.cpp @@ -51,16 +51,13 @@ void JackWinNamedPipeServerNotifyChannel::Notify(int refnum, int notify, int val { JackClientNotificationRequest req(refnum, notify, value); if (req.Write(&fRequestPipe) < 0) { - jack_error("Could not write request ref = %d notify = %d", refnum, notify); + jack_error("Could not write notification ref = %d notify = %d", refnum, notify); } } void JackWinNamedPipeServerNotifyChannel::NotifyQuit() { - JackClientNotificationRequest req(-1, kQUIT, 0); - if (req.Write(&fRequestPipe) < 0) { - jack_error("Could not write request ref = %d notify = %d", -1, kQUIT); - } + Notify(-1, kQUIT, 0); } } // end of namespace diff --git a/windows/JackWinProcessSync.cpp b/windows/JackWinProcessSync.cpp index 5f3fa2fd..02fe7b54 100644 --- a/windows/JackWinProcessSync.cpp +++ b/windows/JackWinProcessSync.cpp @@ -17,7 +17,6 @@ */ - #include "JackWinProcessSync.h" #include "JackError.h" @@ -26,97 +25,233 @@ namespace Jack void JackWinProcessSync::Signal() { - SetEvent(fEvent); + if (!SetEvent(fEvent)) { + jack_error("JackWinProcessSync::Signal SetEvent err = %d", GetLastError()); + } } void JackWinProcessSync::LockedSignal() { - WaitForSingleObject(fMutex, INFINITE); - SetEvent(fEvent); - ReleaseMutex(fMutex); + DWORD res = WaitForSingleObject(fMutex, INFINITE); + if (res != WAIT_OBJECT_0) { + jack_error("JackWinProcessSync::LockedSignal WaitForSingleObject err = %d", GetLastError()); + } + if (!SetEvent(fEvent)) { + jack_error("JackWinProcessSync::LockedSignal SetEvent err = %d", GetLastError()); + } + if (!ReleaseMutex(fMutex)) { + jack_error("JackWinProcessSync::LockedSignal ReleaseMutex err = %d", GetLastError()); + } } void JackWinProcessSync::SignalAll() { - SetEvent(fEvent); + Signal(); } void JackWinProcessSync::LockedSignalAll() { - WaitForSingleObject(fMutex, INFINITE); - SetEvent(fEvent); - ReleaseMutex(fMutex); + LockedSignal(); } +/* void JackWinProcessSync::Wait() { - ReleaseMutex(fMutex); - WaitForSingleObject(fEvent, INFINITE); + if (!ReleaseMutex(fMutex)) { + jack_error("JackWinProcessSync::Wait ReleaseMutex err = %d", GetLastError()); + } + DWORD res = WaitForSingleObject(fEvent, INFINITE); + if (res != WAIT_OBJECT_0) { + jack_error("JackWinProcessSync::Wait WaitForSingleObject err = %d", GetLastError()); + } } +*/ void JackWinProcessSync::LockedWait() { - /* Does it make sense on Windows, use non-locked version for now... */ + // Does it make sense on Windows, use non-locked version for now... Wait(); } +/* bool JackWinProcessSync::TimedWait(long usec) { - ReleaseMutex(fMutex); + if (!ReleaseMutex(fMutex)) { + jack_error("JackWinProcessSync::TimedWait ReleaseMutex err = %d", GetLastError()); + } + DWORD res = WaitForSingleObject(fEvent, usec / 1000); + if (res != WAIT_OBJECT_0) { + jack_error("JackWinProcessSync::TimedWait WaitForSingleObject err = %d", GetLastError()); + } + return (res == WAIT_OBJECT_0); } - +*/ bool JackWinProcessSync::LockedTimedWait(long usec) { - /* Does it make sense on Windows, use non-locked version for now...*/ + // Does it make sense on Windows, use non-locked version for now... return TimedWait(usec); } +void JackWinProcessSync::Wait() +{ + // In case Wait is called in a "locked" context + if (ReleaseMutex(fMutex)) { + HANDLE handles[] = { fMutex, fEvent }; + DWORD res = WaitForMultipleObjects(2, handles, true, INFINITE); + if (res != WAIT_OBJECT_0) { + jack_error("JackWinProcessSync::Wait WaitForMultipleObjects err = %d", GetLastError()); + } + // In case Wait is called in a "non-locked" context + } else { + jack_error("JackWinProcessSync::Wait ReleaseMutex err = %d", GetLastError()); + DWORD res = WaitForSingleObject(fEvent, INFINITE); + if (res != WAIT_OBJECT_0) { + jack_error("JackWinProcessSync::Wait WaitForSingleObject err = %d", GetLastError()); + } + } + + if (!ResetEvent(fEvent)) { + jack_error("JackWinProcessSync::Wait ResetEvent err = %d", GetLastError()); + } +} + +bool JackWinProcessSync::TimedWait(long usec) +{ + DWORD res = 0; + + // In case TimedWait is called in a "locked" context + if (ReleaseMutex(fMutex)) { + HANDLE handles[] = { fMutex, fEvent }; + res = WaitForMultipleObjects(2, handles, true, usec / 1000); + if ((res != WAIT_OBJECT_0) && (res != WAIT_TIMEOUT)) { + jack_error("JackWinProcessSync::TimedWait WaitForMultipleObjects err = %d", GetLastError()); + } + // In case TimedWait is called in a "non-locked" context + } else { + jack_error("JackWinProcessSync::TimedWait ReleaseMutex err = %d", GetLastError()); + res = WaitForSingleObject(fEvent, usec / 1000); + if (res != WAIT_OBJECT_0) { + jack_error("JackWinProcessSync::TimedWait WaitForSingleObject err = %d", GetLastError()); + } + } + + if (!ResetEvent(fEvent)) { + jack_error("JackWinProcessSync::TimedWait ResetEvent err = %d", GetLastError()); + } + + return (res == WAIT_OBJECT_0); +} + /* -Code from APPLE CAGuard.cpp : does not seem to work as expected... +// Code from APPLE CAGuard.cpp : does not seem to work as expected... void JackWinProcessSync::Wait() { - ReleaseMutex(fMutex); - HANDLE handles[] = { fMutex, fEvent }; - DWORD res = WaitForMultipleObjects(2, handles, true, INFINITE); - if ((res != WAIT_OBJECT_0) && (res != WAIT_TIMEOUT)) - jack_error("Wait error err = %d", GetLastError()); - ResetEvent(fEvent); + if (!ReleaseMutex(fMutex)) { + jack_error("JackWinProcessSync::Wait ReleaseMutex err = %d", GetLastError()); + } + DWORD res = WaitForSingleObject(fEvent, INFINITE); + if (res != WAIT_OBJECT_0) { + jack_error("JackWinProcessSync::Wait WaitForSingleObject err = %d", GetLastError()); + } +} + +// Variant that behaves differently depending of the mutex state +void JackWinProcessSync::Wait() +{ + if (ReleaseMutex(fMutex)) { + HANDLE handles[] = { fMutex, fEvent }; + DWORD res = WaitForMultipleObjects(2, handles, true, INFINITE); + if (res != WAIT_OBJECT_0) { + jack_error("JackWinProcessSync::LockedWait WaitForMultipleObjects err = %d", GetLastError()); + } + } else { + jack_error("JackWinProcessSync::Wait ReleaseMutex err = %d", GetLastError()); + DWORD res = WaitForSingleObject(fEvent, INFINITE); + if (res != WAIT_OBJECT_0) { + jack_error("JackWinProcessSync::Wait WaitForSingleObject err = %d", GetLastError()); + } + } + + if (!ResetEvent(fEvent)) { + jack_error("JackWinProcessSync::LockedWait ResetEvent err = %d", GetLastError()); + } } void JackWinProcessSync::LockedWait() { - WaitForSingleObject(fMutex, INFINITE); - ReleaseMutex(fMutex); + if (!ReleaseMutex(fMutex)) { + jack_error("JackWinProcessSync::LockedWait ReleaseMutex err = %d", GetLastError()); + } + HANDLE handles[] = { fMutex, fEvent }; DWORD res = WaitForMultipleObjects(2, handles, true, INFINITE); - if ((res != WAIT_OBJECT_0) && (res != WAIT_TIMEOUT)) - jack_error("LockedWait error err = %d", GetLastError()); - ResetEvent(fEvent); + if (res != WAIT_OBJECT_0) { + jack_error("JackWinProcessSync::LockedWait WaitForMultipleObjects err = %d", GetLastError()); + } + + if (!ResetEvent(fEvent)) { + jack_error("JackWinProcessSync::LockedWait ResetEvent err = %d", GetLastError()); + } } bool JackWinProcessSync::TimedWait(long usec) { - ReleaseMutex(fMutex); - HANDLE handles[] = { fMutex, fEvent }; - DWORD res = WaitForMultipleObjects(2, handles, true, usec / 1000); - if ((res != WAIT_OBJECT_0) && (res != WAIT_TIMEOUT)) - jack_error("Wait error err = %d", GetLastError()); - ResetEvent(fEvent); + if (!ReleaseMutex(fMutex)) { + jack_error("JackWinProcessSync::TimedWait ReleaseMutex err = %d", GetLastError()); + } + + DWORD res = WaitForSingleObject(fEvent, usec / 1000); + if (res != WAIT_OBJECT_0) { + jack_error("JackWinProcessSync::TimedWait WaitForSingleObject err = %d", GetLastError()); + } + + return (res == WAIT_OBJECT_0); +} + +// Variant that behaves differently depending of the mutex state +bool JackWinProcessSync::TimedWait(long usec) +{ + if (ReleaseMutex(fMutex)) { + HANDLE handles[] = { fMutex, fEvent }; + DWORD res = WaitForMultipleObjects(2, handles, true, usec / 1000); + if ((res != WAIT_OBJECT_0) && (res != WAIT_TIMEOUT)) { + jack_error("JackWinProcessSync::LockedTimedWait WaitForMultipleObjects err = %d", GetLastError()); + } + } else { + jack_error("JackWinProcessSync::TimedWait ReleaseMutex err = %d", GetLastError()); + DWORD res = WaitForSingleObject(fEvent, usec / 1000); + if (res != WAIT_OBJECT_0) { + jack_error("JackWinProcessSync::TimedWait WaitForSingleObject err = %d", GetLastError()); + } + } + + if (!ResetEvent(fEvent)) { + jack_error("JackWinProcessSync::LockedTimedWait ResetEvent err = %d", GetLastError()); + } + + return (res == WAIT_OBJECT_0); } bool JackWinProcessSync::LockedTimedWait(long usec) { - WaitForSingleObject(fMutex, INFINITE); - ReleaseMutex(fMutex); - HANDLE handles[] = { fMutex, fEvent }; + if (!ReleaseMutex(fMutex)) { + jack_error("JackWinProcessSync::LockedTimedWait ReleaseMutex err = %d", GetLastError()); + } + + HANDLE handles[] = { fMutex, fEvent }; DWORD res = WaitForMultipleObjects(2, handles, true, usec / 1000); - if ((res != WAIT_OBJECT_0) && (res != WAIT_TIMEOUT)) - jack_error("LockedTimedWait error err = %d", GetLastError()); - ResetEvent(fEvent); - return (res == WAIT_OBJECT_0); + if ((res != WAIT_OBJECT_0) && (res != WAIT_TIMEOUT)) { + jack_error("JackWinProcessSync::LockedTimedWait WaitForMultipleObjects err = %d", GetLastError()); + } + + if (!ResetEvent(fEvent)) { + jack_error("JackWinProcessSync::LockedTimedWait ResetEvent err = %d", GetLastError()); + } + + return (res == WAIT_OBJECT_0); } */ diff --git a/windows/JackWinProcessSync.h b/windows/JackWinProcessSync.h index fd6d3d7c..7f829363 100644 --- a/windows/JackWinProcessSync.h +++ b/windows/JackWinProcessSync.h @@ -1,22 +1,21 @@ /* Copyright (C) 2004-2008 Grame - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - + You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - */ +*/ #ifndef __JackWinProcessSync__ #define __JackWinProcessSync__ @@ -27,7 +26,7 @@ namespace Jack { /*! -\brief A synchronization primitive built using a condition variable. +\brief A synchronization primitive built using a condition variable. */ class JackWinProcessSync : public JackWinMutex @@ -39,24 +38,34 @@ class JackWinProcessSync : public JackWinMutex public: - JackWinProcessSync():JackWinMutex() + JackWinProcessSync(const char* name = NULL):JackWinMutex(name) { - fEvent = (HANDLE)CreateEvent(NULL, FALSE, FALSE, NULL); + if (name) { + char buffer[MAX_PATH]; + snprintf(buffer, sizeof(buffer), "%s_%s", "JackWinProcessSync", name); + fEvent = CreateEvent(NULL, TRUE, FALSE, buffer); // Needs ResetEvent + //fEvent = CreateEvent(NULL, FALSE, FALSE, buffer); // Auto-reset event + } else { + fEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // Needs ResetEvent + //fEvent = CreateEvent(NULL, FALSE, FALSE, NULL); // Auto-reset event + } + + ThrowIf((fEvent == 0), JackException("JackWinProcessSync: could not init the event")); } - ~JackWinProcessSync() + virtual ~JackWinProcessSync() { CloseHandle(fEvent); } - + bool TimedWait(long usec); bool LockedTimedWait(long usec); - + void Wait(); void LockedWait(); - + void Signal(); void LockedSignal(); - + void SignalAll(); void LockedSignalAll(); }; diff --git a/windows/JackWinServerLaunch.cpp b/windows/JackWinServerLaunch.cpp index d90674ad..3c4893ff 100644 --- a/windows/JackWinServerLaunch.cpp +++ b/windows/JackWinServerLaunch.cpp @@ -38,7 +38,6 @@ static char* find_path_to_jackdrc(char *path_to_jackdrc) { char user_jackdrc[1024]; - char *ptr = NULL; char *ret = NULL; user_jackdrc[0] = user_jackdrc[1] = 0; // Initialise @@ -103,7 +102,6 @@ static int start_server_aux(const char* server_name) char buffer [MAX_PATH]; char filename [MAX_PATH]; char curr_wd [MAX_PATH]; - char temp_wd [MAX_PATH]; curr_wd[0] = '\0'; if (find_path_to_jackdrc(filename)) @@ -121,13 +119,13 @@ static int start_server_aux(const char* server_name) fgets(filename, MAX_PATH, fp); _strlwr(filename); - if (p = strstr(filename, ".exe")) { + if ((p = strstr(filename, ".exe"))) { p += 4; *p = '\0'; pos = (size_t)(p - filename); fseek(fp, 0, SEEK_SET); - if (command = (char*)malloc(pos+1)) + if ((command = (char*)malloc(pos+1))) ret = fread(command, 1, pos, fp); if (ret && !ferror(fp)) { @@ -285,9 +283,12 @@ static int server_connect(const char* server_name) { JackClientChannel channel; int res = channel.ServerCheck(server_name); - channel.Close(); + channel.Close(); + /* JackSleep(2000); // Added by JE - 02-01-2009 (gives - // the channel some time to close) + // the channel some time to close) + */ + JackSleep(500); return res; } diff --git a/windows/JackWinThread.cpp b/windows/JackWinThread.cpp index 668ca868..7122fd02 100644 --- a/windows/JackWinThread.cpp +++ b/windows/JackWinThread.cpp @@ -32,7 +32,7 @@ DWORD WINAPI JackWinThread::ThreadHandler(void* arg) JackRunnableInterface* runnable = obj->fRunnable; // Signal creation thread when started with StartSync - jack_log("ThreadHandler: start"); + jack_log("JackWinThread::ThreadHandler : start"); obj->fStatus = kIniting; // Call Init method @@ -50,7 +50,7 @@ DWORD WINAPI JackWinThread::ThreadHandler(void* arg) } SetEvent(obj->fEvent); - jack_log("ThreadHandler: exit"); + jack_log("JackWinThread::ThreadHandler : exit"); return 0; } @@ -109,14 +109,14 @@ int JackWinThread::StartImp(jack_native_thread_t* thread, int priority, int real if (realtime) { - jack_log("Create RT thread"); + jack_log("JackWinThread::StartImp : create RT thread"); if (!SetThreadPriority(*thread, THREAD_PRIORITY_TIME_CRITICAL)) { jack_error("Cannot set priority class = %d", GetLastError()); return -1; } } else { - jack_log("Create non RT thread"); + jack_log("JackWinThread::StartImp : create non RT thread"); } return 0; diff --git a/windows/JackWinTime.c b/windows/JackWinTime.c index 065ea9f9..c307939b 100644 --- a/windows/JackWinTime.c +++ b/windows/JackWinTime.c @@ -1,26 +1,28 @@ /* Copyright (C) 2004-2008 Grame - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - + You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - + */ #include "JackTime.h" +#include "JackError.h" static LARGE_INTEGER _jack_freq; +static UINT gPeriod = 0; SERVER_EXPORT void JackSleep(long usec) { @@ -30,6 +32,25 @@ SERVER_EXPORT void JackSleep(long usec) SERVER_EXPORT void InitTime() { QueryPerformanceFrequency(&_jack_freq); + TIMECAPS caps; + if (timeGetDevCaps(&caps, sizeof(TIMECAPS)) != TIMERR_NOERROR) { + jack_error("InitTime : could not get timer device"); + } else { + gPeriod = caps.wPeriodMin; + if (timeBeginPeriod(gPeriod) != TIMERR_NOERROR) { + jack_error("InitTime : could not set minimum timer"); + gPeriod = 0; + } else { + jack_info("InitTime : multimedia timer resolution set to %d milliseconds", gPeriod); + } + } +} + +SERVER_EXPORT void EndTime() +{ + if (gPeriod > 0) { + timeEndPeriod(gPeriod); + } } SERVER_EXPORT jack_time_t GetMicroSeconds(void) @@ -39,10 +60,10 @@ SERVER_EXPORT jack_time_t GetMicroSeconds(void) return (jack_time_t)(((double)t1.QuadPart) / ((double)_jack_freq.QuadPart) * 1000000.0); } -SERVER_EXPORT void SetClockSource(jack_timer_type_t source) +void SetClockSource(jack_timer_type_t source) {} -SERVER_EXPORT const char* ClockSourceName(jack_timer_type_t source) +const char* ClockSourceName(jack_timer_type_t source) { return ""; } diff --git a/windows/README b/windows/README index 9653665c..49f2ca43 100644 --- a/windows/README +++ b/windows/README @@ -5,15 +5,15 @@ JACK2 on Windows This folder contains all the windows specific sources. You will also find two sets of files : - VisualC++6 workspace and project files, in order to compile JACK with MSVC -- Code::Blocks (8.02) workspace and project files, in order to compile JACK with MingW +- Code::Blocks (10.05) workspace and project files, in order to compile JACK with MingW The built binaries will be located in '/Release/bin' (or '/Debug/bin' if you build the Debug target). Once compiled, you'll find there everything you need : -- the two 'libjackmp.dll' and 'libjackservermp.dll', client and server jack libraries -- the 'jackdmp.exe', main application : the JACK server +- the two 'libjack.dll' and 'libjackserver.dll', client and server jack libraries. +- the 'jackd.exe', main application : the JACK server - the 'jack_xxx.exe' utilities and examples -- in the jackmp directory, you'll find the driver's DLL's ('jack_portaudio.dll' and 'jack_netdriver.dll') and some tools ('netmanager.dll', 'audioadapter.dll', 'netadapter.dll' for example) +- in the jack directory, you'll find the driver's DLL's ('jack_portaudio.dll', 'jack_dummy.dll', 'jack_winmme.dll', 'jack_net.dll' and 'jack_netone.dll') and some tools ('netmanager.dll', 'audioadapter.dll', 'netadapter.dll' for example) -In Code::Blocks all the projects are automatically built in a correct order (dll's then apps) by doing 'build->build workspace'. +In Code::Blocks all the projects are automatically built in a correct order (DLL's then apps) by doing 'build->build workspace'. In VC6, you'll have to build the projects one by one. The needed regexp library TRE can be found here http://laurikari.net/tre/. Unzip and place the "tre-0.8.0" folder into the "windows" folder. @@ -24,8 +24,7 @@ Notes about VC and GCC versions ------------------------------- The Visual Studio workspace is limited to VC6. JACK will not compile on most recent MSVC's. The fact is recent compilers (MSVC7, 8 or 9) don't agree with some of the JACK sources. -But now you can compile JACK using GCC, with MingW. -The project is actually organized in a Code::Blocks workspace. This is a simple and efficient way to compile the whole project. +But now you can compile JACK using GCC, with MingW. The project is actually organized in a Code::Blocks workspace. This is a simple and efficient way to compile the whole project. But for some reasons, you need to compile JACK using a SJLJ version of G++ (available on MingW website). Current GCC/G++ version (3.4.5) doesn't includes SJLJ so you'll have to use another one. @@ -33,16 +32,16 @@ JACK needs the use of SJLJ exceptions instead of DW2 because exceptions are exch The ressources files has been created with ResEdit (ANSI build). VisualStudio uses 'ressource.rc' and 'ressource_vc.h'. The other files are used by MingW. -You can make a small installer ('setup.exe') with CreateInstallFree, a little freeware. For this you have the little script 'jack.ci'.The installer contains everything jack needs to be intagreted in windows (including register entries and shortcuts). -A binary version of qjackctl is also included. +You can make a small installer ('setup.exe') with CreateInstallFree, a little freeware. For this you have the little script 'jack.ci' for 32 bits version and 'jack64.c' for mixed 64/32 bits version. The installer contains everything jack needs to be integrated in windows (including register entries and shortcuts). +A binary version of QJAckCtl is also included. ------------------------------- Running JACK on Windows ------------------------------- You can use two drivers : PortAudio and NetDriver. -The PortAudio backend allow the use of many soundcards, using ASIO, DirectSound or WMME drivers (any ASIO driver can be seen by PortAudio). -The NetDriver allow you to use NetJack2 on windows. Thus you can easily exchange midi and audio streams bitween computers (Linux, MacOSX or Windows). +The PortAudio backend allows the use of many soundcards, using ASIO, DirectSound or WMME drivers (any ASIO driver can be seen by PortAudio). +The NetDriver allows you to use NetJack2 on windows. Thus you can easily exchange midi and audio streams between computers (Linux, MacOSX or Windows). In both cases, you have to use the minimalist : 'jackd -R -d ...' command. With PortAudio, you can have a list of supported drivers with : 'jackd -R -S -d portaudio -l' diff --git a/windows/Release/bin/libportaudio_x86.a b/windows/Release/bin/libportaudio_x86.a new file mode 100644 index 00000000..1cfa1e55 Binary files /dev/null and b/windows/Release/bin/libportaudio_x86.a differ diff --git a/windows/Release/bin/libsamplerate_x86.dll b/windows/Release/bin/libsamplerate_x86.a similarity index 98% rename from windows/Release/bin/libsamplerate_x86.dll rename to windows/Release/bin/libsamplerate_x86.a index 0eb2f104..df7e0a87 100644 Binary files a/windows/Release/bin/libsamplerate_x86.dll and b/windows/Release/bin/libsamplerate_x86.a differ diff --git a/windows/Release/bin/portaudio_x86.dll b/windows/Release/bin/portaudio_x86.dll deleted file mode 100644 index 531c8520..00000000 Binary files a/windows/Release/bin/portaudio_x86.dll and /dev/null differ diff --git a/windows/Release64/bin/libportaudio_x86_64.a b/windows/Release64/bin/libportaudio_x86_64.a new file mode 100644 index 00000000..44f8b90c Binary files /dev/null and b/windows/Release64/bin/libportaudio_x86_64.a differ diff --git a/windows/Release64/bin/libsamplerate_x86_64.dll b/windows/Release64/bin/libsamplerate_x86_64.a similarity index 98% rename from windows/Release64/bin/libsamplerate_x86_64.dll rename to windows/Release64/bin/libsamplerate_x86_64.a index 099bed58..20154d16 100644 Binary files a/windows/Release64/bin/libsamplerate_x86_64.dll and b/windows/Release64/bin/libsamplerate_x86_64.a differ diff --git a/windows/Release64/bin/portaudio_x86_64.dll b/windows/Release64/bin/portaudio_x86_64.dll deleted file mode 100644 index a439d9e1..00000000 Binary files a/windows/Release64/bin/portaudio_x86_64.dll and /dev/null differ diff --git a/windows/Setup/JackRouter.ini b/windows/Setup/JackRouter.ini deleted file mode 100644 index 8a62b6a7..00000000 --- a/windows/Setup/JackRouter.ini +++ /dev/null @@ -1,7 +0,0 @@ -[IO] -input=4 -output=4 - -[AUTO_CONNECT] -input=1 -output=1 diff --git a/windows/Setup/jack.ci b/windows/Setup/jack.ci index 545b9950..8d4dcfd9 100644 --- a/windows/Setup/jack.ci +++ b/windows/Setup/jack.ci @@ -1,7 +1,7 @@ <*project version = 4 civer = "Free v4.14.5" winver = "2.6/5.1.2600" > . - Jack_v1.9.8_32_setup.exe + Jack_v1.9.9_32_setup.exe Jack @@ -69,42 +69,42 @@ <_>..\Release\bin\jackd.exeinstovernewer0 <_>..\Release\bin\libjack.dllsysovernewer0 <_>..\Release\bin\libjackserver.dllsysovernewer0 -<_>..\Release\bin\libsamplerate_x86.dllinstovernewer0 -<_>..\Release\bin\portaudio_x86.dllsysovernewer0 -<_>..\Release\bin\jack\jack_net.dllinstjackovernewer0 -<_>..\Release\bin\jack\jack_netone.dllinstjackovernewer0 +<_>..\Release\bin\jack\jack_net.dllsysjackovernewer0 +<_>..\Release\bin\jack\jack_netone.dllsysjackovernewer0 <_>..\Release\bin\jack_netsource.exeinstovernewer0 -<_>..\Release\bin\jack\jack_dummy.dllinstjackovernewer0 -<_>..\Release\bin\jack\jack_loopback.dllinstjackovernewer0 -<_>..\Release\bin\jack\jack_winmme.dllinstjackovernewer0 -<_>..\Release\bin\jack\jack_portaudio.dllinstjackovernewer0 -<_>..\Release\bin\jack\netmanager.dllinstjackovernewer0 -<_>..\Release\bin\jack\audioadapter.dllinstjackovernewer0 -<_>..\Release\bin\jack\netadapter.dllinstjackovernewer0 -<_>..\Release\bin\jack_midi_dump.exeinstovernewer0 +<_>..\Release\bin\jack\jack_dummy.dllsysjackovernewer0 +<_>..\Release\bin\jack\jack_loopback.dllsysjackovernewer0 +<_>..\Release\bin\jack\jack_winmme.dllsysjackovernewer0 +<_>..\Release\bin\jack\jack_portaudio.dllsysjackovernewer0 +<_>..\Release\bin\jack\netmanager.dllsysjackovernewer0 +<_>..\Release\bin\jack\audioadapter.dllsysjackovernewer0 +<_>..\Release\bin\jack\netadapter.dllsysjackovernewer0 +<_>..\Release\bin\jack_midi_dump.exeinstovernewer0 +<_>..\Release\bin\portaudio_x86.dllinstovernewer0 <_>..\..\common\jack\control.hinstincludes\jackovernewer0 <_>..\..\common\jack\intclient.hinstincludes\jackovernewer0 <_>..\..\common\jack\jack.hinstincludes\jackovernewer0 <_>..\..\common\jack\jslist.hinstincludes\jackovernewer0 -<_>..\..\common\jack\midiport.hinstincludes\jackovernewer0 -<_>..\..\common\jack\ringbuffer.hinstincludes\jackovernewer0 -<_>..\..\common\jack\statistics.hinstincludes\jackovernewer0 +<_>..\..\common\jack\midiport.hinstincludes\jackovernewer0 +<_>..\..\common\jack\ringbuffer.hinstincludes\jackovernewer0 +<_>..\..\common\jack\session.hinstincludes\jackovernewer0 +<_>..\..\common\jack\statistics.hinstincludes\jackovernewer0 +<_>..\..\common\jack\systemdeps.hinstincludes\jackovernewer1 <_>..\..\common\jack\thread.hinstincludes\jackovernewer0 <_>..\..\common\jack\transport.hinstincludes\jackovernewer0 <_>..\..\common\jack\types.hinstincludes\jackovernewer0 -<_>..\..\common\jack\systemdeps.hinstincludes\jackovernewer1 <_>..\..\common\jack\weakjack.hinstincludes\jackovernewer1 <_>..\..\common\jack\weakmacros.hinstincludes\jackovernewer1 <_>.\src\32bits\JackRouter.dllinst32bitsovernewer0 <_>.\src\32bits\JackRouter.iniinst32bitsovernewer0 <_>.\src\32bits\msvcr100.dllinst32bitsovernewer0 <_>.\src\32bits\msvcp100.dllinst32bitsovernewer0 -<_>.\src\32bits\portaudio_x86.libinstlibovernewer0 <_>.\qjackctl\mingwm10.dllinstovernewer0 <_>.\qjackctl\qjackctl.exeinstovernewer0 <_>.\qjackctl\QtCore4.dllinstovernewer0 <_>.\qjackctl\QtGui4.dllinstovernewer0 <_>.\qjackctl\QtXml4.dllinstovernewer0 +<_>.\qjackctl\libgcc_s_dw2-1.dllinstovernewer0 <_>.\src\COPYINGinstovernewer0 <_>.\src\READMEinstovernewer0 diff --git a/windows/Setup/jack64.ci b/windows/Setup/jack64.ci index 702f6c0c..6ae683de 100644 --- a/windows/Setup/jack64.ci +++ b/windows/Setup/jack64.ci @@ -1,7 +1,7 @@ <*project version = 4 civer = "Free v4.14.5" winver = "2.8/6.1.7600" > . - Jack_v1.9.8_64_setup.exe + Jack_v1.9.9_64_setup.exe Jack @@ -68,7 +68,7 @@ <_>..\Release\bin\libjackserver.ainstlibovernewer0 <_>..\Release\bin\libjackserver.libinstlibovernewer0 <_>..\Release\bin\libjackserver.definstlibovernewer0 -<_>..\Release\bin\libjackserver.dllsysovernewer0 +<_>..\Release\bin\libjackserver.dllsysovernewer0 <_>..\Release\bin\portaudio_x86.dllinstovernewer0 <_>..\Release64\bin\jack_connect.exeinstovernewer0 <_>..\Release64\bin\jack_disconnect.exeinstovernewer0 @@ -78,30 +78,29 @@ <_>..\Release64\bin\jack_unload.exeinstovernewer0 <_>..\Release64\bin\jack_midi_latency_test.exeinstovernewer0 <_>..\Release64\bin\jackd.exeinstovernewer0 -<_>..\Release64\bin\libsamplerate_x86_64.dllinstovernewer0 -<_>..\Release64\bin\portaudio_x86_64.dllwinovernewer0 -<_>..\Release64\bin\jack\jack_net.dllinstjackovernewer0 -<_>..\Release64\bin\jack\jack_netone.dllinstjackovernewer0 +<_>..\Release64\bin\jack\jack_net.dllwinjackovernewer0 +<_>..\Release64\bin\jack\jack_netone.dllwinjackovernewer0 <_>..\Release64\bin\jack_netsource.exeinstovernewer0 -<_>..\Release64\bin\jack\jack_dummy.dllinstjackovernewer0 -<_>..\Release64\bin\jack\jack_loopback.dllinstjackovernewer0 -<_>..\Release64\bin\jack\jack_winmme.dllinstjackovernewer0 -<_>..\Release64\bin\jack\jack_portaudio.dllinstjackovernewer0 -<_>..\Release64\bin\jack\netmanager.dllinstjackovernewer0 -<_>..\Release64\bin\jack\audioadapter.dllinstjackovernewer0 -<_>..\Release64\bin\jack\netadapter.dllinstjackovernewer0 +<_>..\Release64\bin\jack\jack_dummy.dllwinjackovernewer0 +<_>..\Release64\bin\jack\jack_loopback.dllwinjackovernewer0 +<_>..\Release64\bin\jack\jack_winmme.dllwinjackovernewer0 +<_>..\Release64\bin\jack\jack_portaudio.dllwinjackovernewer0 +<_>..\Release64\bin\jack\netmanager.dllwinjackovernewer0 +<_>..\Release64\bin\jack\audioadapter.dllwinjackovernewer0 +<_>..\Release64\bin\jack\netadapter.dllwinjackovernewer0 <_>..\Release64\bin\jack_midi_dump.exeinstovernewer0 <_>..\..\common\jack\control.hinstincludes\jackovernewer0 <_>..\..\common\jack\intclient.hinstincludes\jackovernewer0 <_>..\..\common\jack\jack.hinstincludes\jackovernewer0 <_>..\..\common\jack\jslist.hinstincludes\jackovernewer0 -<_>..\..\common\jack\midiport.hinstincludes\jackovernewer0 -<_>..\..\common\jack\ringbuffer.hinstincludes\jackovernewer0 -<_>..\..\common\jack\statistics.hinstincludes\jackovernewer0 +<_>..\..\common\jack\midiport.hinstincludes\jackovernewer0 +<_>..\..\common\jack\ringbuffer.hinstincludes\jackovernewer0 +<_>..\..\common\jack\session.hinstincludes\jackovernewer0 +<_>..\..\common\jack\statistics.hinstincludes\jackovernewer0 +<_>..\..\common\jack\systemdeps.hinstincludes\jackovernewer1 <_>..\..\common\jack\thread.hinstincludes\jackovernewer0 <_>..\..\common\jack\transport.hinstincludes\jackovernewer0 <_>..\..\common\jack\types.hinstincludes\jackovernewer0 -<_>..\..\common\jack\systemdeps.hinstincludes\jackovernewer1 <_>..\..\common\jack\weakjack.hinstincludes\jackovernewer1 <_>..\..\common\jack\weakmacros.hinstincludes\jackovernewer1 <_>.\src\32bits\JackRouter.dllinst32bitsovernewer0 @@ -112,12 +111,12 @@ <_>.\src\64bits\JackRouter.iniinst64bitsovernewer0 <_>.\src\64bits\msvcr100.dllinst64bitsovernewer0 <_>.\src\64bits\msvcp100.dllinst64bitsovernewer0 -<_>.\src\64bits\portaudio_x86_64.libinstlibovernewer0 <_>.\qjackctl\mingwm10.dllinstovernewer0 <_>.\qjackctl\qjackctl.exeinstovernewer0 <_>.\qjackctl\QtCore4.dllinstovernewer0 <_>.\qjackctl\QtGui4.dllinstovernewer0 <_>.\qjackctl\QtXml4.dllinstovernewer0 +<_>.\qjackctl\libgcc_s_dw2-1.dllinstovernewer0 <_>.\src\COPYINGinstovernewer0 <_>.\src\READMEinstovernewer0 diff --git a/windows/Setup/src/32bits/JackRouter.dll b/windows/Setup/src/32bits/JackRouter.dll index df19cb84..f6776062 100644 Binary files a/windows/Setup/src/32bits/JackRouter.dll and b/windows/Setup/src/32bits/JackRouter.dll differ diff --git a/windows/Setup/src/32bits/JackRouter.ini b/windows/Setup/src/32bits/JackRouter.ini index 8a62b6a7..0131071a 100644 --- a/windows/Setup/src/32bits/JackRouter.ini +++ b/windows/Setup/src/32bits/JackRouter.ini @@ -1,7 +1,9 @@ [IO] input=4 output=4 +float-sample=0 [AUTO_CONNECT] input=1 output=1 +alias=0 \ No newline at end of file diff --git a/windows/Setup/src/64bits/JackRouter.dll b/windows/Setup/src/64bits/JackRouter.dll index 39d9cafe..8d7b8627 100644 Binary files a/windows/Setup/src/64bits/JackRouter.dll and b/windows/Setup/src/64bits/JackRouter.dll differ diff --git a/windows/Setup/src/64bits/JackRouter.ini b/windows/Setup/src/64bits/JackRouter.ini index 8a62b6a7..1bed0b89 100644 --- a/windows/Setup/src/64bits/JackRouter.ini +++ b/windows/Setup/src/64bits/JackRouter.ini @@ -1,7 +1,9 @@ [IO] input=4 output=4 +float-sample=0 [AUTO_CONNECT] input=1 output=1 +alias=0 diff --git a/windows/Setup/src/README b/windows/Setup/src/README index a33ec512..74205ee5 100644 --- a/windows/Setup/src/README +++ b/windows/Setup/src/README @@ -49,9 +49,14 @@ JackRouter JACK/ASIO driver JackRouter is an ASIO driver that allows any ASIO compatible application to become a JACK client, thus exchange audio with any other "native" or "Jackified" application. This driver is registered in the system by the installer and becomes available in the list of ASIO drivers when the JACK server is running. A "JackRouter.ini" configuration file allows the application to configure how the JackRouter driver behaves. - - [IO]: the application can obtain any number if JACK input/output ports (not necessarily equal to the audio card input/output number). [Note that some applications force their input/output channel number]. - - - [AUTO_CONNECT] : when 1, the application JACK port will automatically be connected to the machine input/output JACK ports. + - [IO]: + - input/output : the application can obtain any number if JACK input/output ports (not necessarily equal to the audio card input/output number). [Note that some applications force their input/output channel number]. + - float-sample : be default the JackRouter will present audio samples in integer format for the application. Use float-sample=1 so that audio samples are presented in float format for the application (thus saving float/integer conversion time). + + + - [AUTO_CONNECT] : + - input/output : when 1, the application JACK port will automatically be connected to the machine input/output JACK ports. + - alias : with ASIO drivers, real channels names will be associated to the JACK port as aliases and will be returned when the application request channels names. ============================================= diff --git a/windows/jack_audioadapter.cbp b/windows/jack_audioadapter.cbp index be22e0fd..50862351 100644 --- a/windows/jack_audioadapter.cbp +++ b/windows/jack_audioadapter.cbp @@ -17,16 +17,17 @@ - - - + + + + @@ -41,16 +42,17 @@ - - - + + + + @@ -66,16 +68,17 @@ - - - + + + + @@ -91,7 +94,6 @@ - @@ -99,9 +101,11 @@ - - + + + + @@ -120,7 +124,6 @@ - @@ -128,9 +131,11 @@ - - + + + + @@ -150,7 +155,6 @@ - @@ -158,9 +162,11 @@ - - + + + + diff --git a/windows/jack_connect.cbp b/windows/jack_connect.cbp index 177bfca0..39fdcb27 100644 --- a/windows/jack_connect.cbp +++ b/windows/jack_connect.cbp @@ -38,7 +38,7 @@ - + diff --git a/windows/jack_connect.dsp b/windows/jack_connect.dsp deleted file mode 100644 index 50ecdb68..00000000 --- a/windows/jack_connect.dsp +++ /dev/null @@ -1,110 +0,0 @@ -# Microsoft Developer Studio Project File - Name="jack_connect" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=jack_connect - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "jack_connect.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "jack_connect.mak" CFG="jack_connect - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "jack_connect - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "jack_connect - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "jack_connect - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "./Release" -# PROP Intermediate_Dir "./Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "../common/" /I "." /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x40c /d "NDEBUG" -# ADD RSC /l 0x40c /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /libpath:"./Release" /libpath:"./Release/bin" - -!ELSEIF "$(CFG)" == "jack_connect - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "./Debug" -# PROP Intermediate_Dir "./Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "../common/" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /GZ /c -# ADD BASE RSC /l 0x40c /d "_DEBUG" -# ADD RSC /l 0x40c /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"./Debug/bin/jack_connect.exe" /pdbtype:sept /libpath:"./Debug" /libpath:"./Debug/bin" - -!ENDIF - -# Begin Target - -# Name "jack_connect - Win32 Release" -# Name "jack_connect - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE="..\example-clients\connect.c" -# End Source File -# Begin Source File - -SOURCE=.\getopt.c -# End Source File -# Begin Source File - -SOURCE=.\getopt1.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/windows/jack_dummy.cbp b/windows/jack_dummy.cbp index 584c25d8..28342652 100644 --- a/windows/jack_dummy.cbp +++ b/windows/jack_dummy.cbp @@ -16,7 +16,6 @@ - @@ -36,7 +35,6 @@ - @@ -57,7 +55,6 @@ - @@ -78,7 +75,6 @@ - @@ -103,7 +99,6 @@ - @@ -129,7 +124,6 @@ - diff --git a/windows/jack_freeverb.dsp b/windows/jack_freeverb.dsp deleted file mode 100644 index a5cf577b..00000000 --- a/windows/jack_freeverb.dsp +++ /dev/null @@ -1,102 +0,0 @@ -# Microsoft Developer Studio Project File - Name="jack_freeverb" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=jack_freeverb - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "jack_freeverb.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "jack_freeverb.mak" CFG="jack_freeverb - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "jack_freeverb - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "jack_freeverb - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "jack_freeverb - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "./Release" -# PROP Intermediate_Dir "./Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /I "../common/" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /c -# ADD BASE RSC /l 0x40c /d "NDEBUG" -# ADD RSC /l 0x40c /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libjackmp.lib /nologo /subsystem:console /machine:I386 /out:"./Release/bin/jack_freeverb.exe" /libpath:"./Release" /libpath:"./Release/bin" - -!ELSEIF "$(CFG)" == "jack_freeverb - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "./Debug" -# PROP Intermediate_Dir "./Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "../common" /I "." /I "../common/" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD BASE RSC /l 0x40c /d "_DEBUG" -# ADD RSC /l 0x40c /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libjackmp.lib /nologo /subsystem:console /debug /machine:I386 /out:"./Debug/bin/jack_freeverb.exe" /pdbtype:sept /libpath:"./Debug" /libpath:"./Debug/bin" - -!ENDIF - -# Begin Target - -# Name "jack_freeverb - Win32 Release" -# Name "jack_freeverb - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE="..\example-clients\freeverb.cpp" -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/windows/jack_latent_client.cbp b/windows/jack_latent_client.cbp index d0130313..1f7e55cb 100644 --- a/windows/jack_latent_client.cbp +++ b/windows/jack_latent_client.cbp @@ -37,7 +37,7 @@ - + diff --git a/windows/jack_load.dsp b/windows/jack_load.dsp deleted file mode 100644 index 9a9d0218..00000000 --- a/windows/jack_load.dsp +++ /dev/null @@ -1,110 +0,0 @@ -# Microsoft Developer Studio Project File - Name="jack_load" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=jack_load - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "jack_load.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "jack_load.mak" CFG="jack_load - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "jack_load - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "jack_load - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "jack_load - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "jack_load___Win32_Release" -# PROP BASE Intermediate_Dir "jack_load___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "./Release" -# PROP Intermediate_Dir "./Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /I "../common" /I "../common/jack" /I "../example-clients" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /c -# ADD BASE RSC /l 0x40c /d "NDEBUG" -# ADD RSC /l 0x40c /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libjackmp.lib /nologo /subsystem:console /machine:I386 /out:"./Release/bin/jack_load.exe" /libpath:"./Release" /libpath:"./Release/bin" - -!ELSEIF "$(CFG)" == "jack_load - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "jack_load___Win32_Debug" -# PROP BASE Intermediate_Dir "jack_load___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "./Debug" -# PROP Intermediate_Dir "./Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "../common" /I "../common/jack" /I "../example-clients" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD BASE RSC /l 0x40c /d "_DEBUG" -# ADD RSC /l 0x40c /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libjackmp.lib /nologo /subsystem:console /debug /machine:I386 /out:"./Debug/bin/jack_load.exe" /pdbtype:sept /libpath:"./Debug" /libpath:"./Debug/bin" - -!ENDIF - -# Begin Target - -# Name "jack_load - Win32 Release" -# Name "jack_load - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\getopt.c -# End Source File -# Begin Source File - -SOURCE=.\getopt1.c -# End Source File -# Begin Source File - -SOURCE="..\example-clients\ipload.c" -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/windows/jack_loopback.cbp b/windows/jack_loopback.cbp index a34089f9..b797daf9 100644 --- a/windows/jack_loopback.cbp +++ b/windows/jack_loopback.cbp @@ -16,8 +16,7 @@ - - + @@ -36,8 +35,7 @@ - - + @@ -57,8 +55,7 @@ - - + @@ -75,11 +72,10 @@ - + - - + @@ -100,11 +96,10 @@ - + - - + @@ -125,12 +120,11 @@ - + - - + diff --git a/windows/jack_lsp.dsp b/windows/jack_lsp.dsp deleted file mode 100644 index 4a84c5cd..00000000 --- a/windows/jack_lsp.dsp +++ /dev/null @@ -1,110 +0,0 @@ -# Microsoft Developer Studio Project File - Name="jack_lsp" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=jack_lsp - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "jack_lsp.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "jack_lsp.mak" CFG="jack_lsp - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "jack_lsp - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "jack_lsp - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "jack_lsp - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "./Release" -# PROP Intermediate_Dir "./Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /I "../common/" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /c -# ADD BASE RSC /l 0x40c /d "NDEBUG" -# ADD RSC /l 0x40c /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libjackmp.lib /nologo /subsystem:console /machine:I386 /out:"./Release/bin/jack_lsp.exe" /libpath:"./Release" /libpath:"./Release/bin" - -!ELSEIF "$(CFG)" == "jack_lsp - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "./Debug" -# PROP Intermediate_Dir "./Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "../common/" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD BASE RSC /l 0x40c /d "_DEBUG" -# ADD RSC /l 0x40c /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libjackmp.lib /nologo /subsystem:console /debug /machine:I386 /out:"./Debug/bin/jack_lsp.exe" /pdbtype:sept /libpath:"./Debug" /libpath:"./Debug/bin" - -!ENDIF - -# Begin Target - -# Name "jack_lsp - Win32 Release" -# Name "jack_lsp - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\getopt.c -# End Source File -# Begin Source File - -SOURCE=.\getopt1.c -# End Source File -# Begin Source File - -SOURCE="..\example-clients\lsp.c" -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/windows/jack_metro.dsp b/windows/jack_metro.dsp deleted file mode 100644 index 6b01acd2..00000000 --- a/windows/jack_metro.dsp +++ /dev/null @@ -1,110 +0,0 @@ -# Microsoft Developer Studio Project File - Name="jack_metro" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=jack_metro - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "jack_metro.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "jack_metro.mak" CFG="jack_metro - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "jack_metro - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "jack_metro - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "jack_metro - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "./Release" -# PROP Intermediate_Dir "./Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /I "../common/" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x40c /d "NDEBUG" -# ADD RSC /l 0x40c /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libjackmp.lib /nologo /subsystem:console /machine:I386 /out:"./Release/bin/jack_metro.exe" /libpath:"./Release" /libpath:"./Release/bin" - -!ELSEIF "$(CFG)" == "jack_metro - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "./Debug" -# PROP Intermediate_Dir "./Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "../common/" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /GZ /c -# ADD BASE RSC /l 0x40c /d "_DEBUG" -# ADD RSC /l 0x40c /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libjackmp.lib /nologo /subsystem:console /debug /machine:I386 /out:"./Debug/bin/jack_metro.exe" /pdbtype:sept /libpath:"./Debug" /libpath:"./Debug/bin" - -!ENDIF - -# Begin Target - -# Name "jack_metro - Win32 Release" -# Name "jack_metro - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\getopt.c -# End Source File -# Begin Source File - -SOURCE=.\getopt1.c -# End Source File -# Begin Source File - -SOURCE="..\example-clients\metro.c" -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/windows/jack_netadapter.cbp b/windows/jack_netadapter.cbp index 35558b61..b41b31ec 100644 --- a/windows/jack_netadapter.cbp +++ b/windows/jack_netadapter.cbp @@ -16,14 +16,13 @@ - - + - + @@ -37,14 +36,13 @@ - - + - + @@ -59,14 +57,13 @@ - - + - + @@ -81,15 +78,14 @@ - - + - + @@ -107,15 +103,14 @@ - - + - + @@ -134,15 +129,14 @@ - - + - + diff --git a/windows/jack_netdriver.cbp b/windows/jack_netdriver.cbp index 58b853d9..b3d0c0bc 100644 --- a/windows/jack_netdriver.cbp +++ b/windows/jack_netdriver.cbp @@ -16,7 +16,6 @@ - @@ -36,7 +35,6 @@ - @@ -57,7 +55,6 @@ - @@ -78,7 +75,6 @@ - @@ -103,7 +99,6 @@ - @@ -129,7 +124,6 @@ - diff --git a/windows/jack_netdriver.dsp b/windows/jack_netdriver.dsp deleted file mode 100644 index dac81a35..00000000 --- a/windows/jack_netdriver.dsp +++ /dev/null @@ -1,107 +0,0 @@ -# Microsoft Developer Studio Project File - Name="jack_netdriver" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=jack_netdriver - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "jack_netdriver.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "jack_netdriver.mak" CFG="jack_netdriver - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "jack_netdriver - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "jack_netdriver - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "jack_netdriver - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "jack_netdriver___Win32_Release" -# PROP BASE Intermediate_Dir "jack_netdriver___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "./Release" -# PROP Intermediate_Dir "./Release" -# PROP Ignore_Export_Lib 1 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JACK_NETDRIVER_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /I "../common" /I "../common/jack" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JACK_NETDRIVER_EXPORTS" /YX /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x40c /d "NDEBUG" -# ADD RSC /l 0x40c /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libjackservermp.lib ws2_32.lib /nologo /dll /machine:I386 /out:"./Release/bin/jackmp/jack_net.dll" /libpath:"./Release" /libpath:"./Release/bin" - -!ELSEIF "$(CFG)" == "jack_netdriver - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "jack_netdriver___Win32_Debug" -# PROP BASE Intermediate_Dir "jack_netdriver___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "./Debug" -# PROP Intermediate_Dir "./Debug" -# PROP Ignore_Export_Lib 1 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JACK_NETDRIVER_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "../common" /I "../common/jack" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JACK_NETDRIVER_EXPORTS" /YX /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x40c /d "_DEBUG" -# ADD RSC /l 0x40c /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libjackservermp.lib ws2_32.lib /nologo /dll /debug /machine:I386 /out:"./Debug/bin/jackmp/jack_net.dll" /pdbtype:sept /libpath:"./Debug" /libpath:"./Debug/bin" - -!ENDIF - -# Begin Target - -# Name "jack_netdriver - Win32 Release" -# Name "jack_netdriver - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\common\JackNetDriver.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/windows/jack_netmanager.cbp b/windows/jack_netmanager.cbp index 12fc83e2..4be11f28 100644 --- a/windows/jack_netmanager.cbp +++ b/windows/jack_netmanager.cbp @@ -15,8 +15,7 @@ - - + @@ -34,8 +33,7 @@ - - + @@ -54,8 +52,7 @@ - - + @@ -72,10 +69,9 @@ - + - - + @@ -96,10 +92,9 @@ - + - - + @@ -120,11 +115,10 @@ - + - - + diff --git a/windows/jack_netmanager.dsp b/windows/jack_netmanager.dsp deleted file mode 100644 index 48e48126..00000000 --- a/windows/jack_netmanager.dsp +++ /dev/null @@ -1,107 +0,0 @@ -# Microsoft Developer Studio Project File - Name="jack_netmanager" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=jack_netmanager - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "jack_netmanager.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "jack_netmanager.mak" CFG="jack_netmanager - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "jack_netmanager - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "jack_netmanager - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "jack_netmanager - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "jack_netmanager___Win32_Release" -# PROP BASE Intermediate_Dir "jack_netmanager___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "./Release" -# PROP Intermediate_Dir "./Release" -# PROP Ignore_Export_Lib 1 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JACK_NETMANAGER_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /I "../common" /I "../common/jack" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JACK_NETMANAGER_EXPORTS" /YX /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x40c /d "NDEBUG" -# ADD RSC /l 0x40c /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libjackservermp.lib ws2_32.lib /nologo /dll /machine:I386 /out:"./Release/bin/jackmp/netmanager.dll" /libpath:"./Release" /libpath:"./Release/bin" - -!ELSEIF "$(CFG)" == "jack_netmanager - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "jack_netmanager___Win32_Debug" -# PROP BASE Intermediate_Dir "jack_netmanager___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "./Deubg" -# PROP Intermediate_Dir "./Debug" -# PROP Ignore_Export_Lib 1 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JACK_NETMANAGER_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "../common" /I "../common/jack" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JACK_NETMANAGER_EXPORTS" /YX /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x40c /d "_DEBUG" -# ADD RSC /l 0x40c /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libjackservermp.lib ws2_32.lib /nologo /dll /debug /machine:I386 /out:"./Debug/bin/jackmp/netmanager.dll" /pdbtype:sept /libpath:"./Debug" /libpath:"./Debug/bin" - -!ENDIF - -# Begin Target - -# Name "jack_netmanager - Win32 Release" -# Name "jack_netmanager - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\common\JackNetManager.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/windows/jack_netonedriver.cbp b/windows/jack_netonedriver.cbp index 4168ca01..0a4e7186 100644 --- a/windows/jack_netonedriver.cbp +++ b/windows/jack_netonedriver.cbp @@ -16,7 +16,6 @@ - @@ -36,7 +35,6 @@ - @@ -57,7 +55,6 @@ - @@ -78,7 +75,6 @@ - @@ -103,7 +99,6 @@ - @@ -129,7 +124,6 @@ - diff --git a/windows/jack_netsource.cbp b/windows/jack_netsource.cbp index e4dd05bc..30203452 100644 --- a/windows/jack_netsource.cbp +++ b/windows/jack_netsource.cbp @@ -8,12 +8,13 @@ @@ -54,11 +54,11 @@ + - - + @@ -85,15 +85,15 @@ - + + + - - @@ -104,16 +104,16 @@ - + + + - - diff --git a/windows/jack_unload.dsp b/windows/jack_unload.dsp deleted file mode 100644 index 982075d5..00000000 --- a/windows/jack_unload.dsp +++ /dev/null @@ -1,102 +0,0 @@ -# Microsoft Developer Studio Project File - Name="jack_unload" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=jack_unload - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "jack_unload.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "jack_unload.mak" CFG="jack_unload - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "jack_unload - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "jack_unload - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "jack_unload - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "jack_unload___Win32_Release" -# PROP BASE Intermediate_Dir "jack_unload___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "./Release" -# PROP Intermediate_Dir "./Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /I "../common" /I "../common/jack" /I "../example-clients" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x40c /d "NDEBUG" -# ADD RSC /l 0x40c /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libjackmp.lib /nologo /subsystem:console /machine:I386 /out:"./Release/bin/jack_unload.exe" /libpath:"./Release" /libpath:"./Release/bin" - -!ELSEIF "$(CFG)" == "jack_unload - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "jack_unload___Win32_Debug" -# PROP BASE Intermediate_Dir "jack_unload___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "./Debug" -# PROP Intermediate_Dir "./Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "../common" /I "../common/jack" /I "../example-clients" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD BASE RSC /l 0x40c /d "_DEBUG" -# ADD RSC /l 0x40c /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libjackmp.lib /nologo /subsystem:console /debug /machine:I386 /out:"./Debug/bin/jack_unload.exe" /pdbtype:sept /libpath:"./Debug" /libpath:"./Debug/bin" - -!ENDIF - -# Begin Target - -# Name "jack_unload - Win32 Release" -# Name "jack_unload - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE="..\example-clients\ipunload.c" -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/windows/jack_winmme.cbp b/windows/jack_winmme.cbp index c2ac74c3..91fa8e04 100644 --- a/windows/jack_winmme.cbp +++ b/windows/jack_winmme.cbp @@ -20,8 +20,7 @@ - - + @@ -47,8 +46,7 @@ - - + @@ -75,8 +73,7 @@ - - + @@ -96,15 +93,14 @@ - + - - + @@ -128,15 +124,14 @@ - + - - + @@ -160,7 +155,7 @@ - + @@ -168,8 +163,7 @@ - - + diff --git a/windows/jackaudioadapter.rc b/windows/jackaudioadapter.rc index 2c29dee7..c0ebbb78 100644 --- a/windows/jackaudioadapter.rc +++ b/windows/jackaudioadapter.rc @@ -11,8 +11,8 @@ // LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT 1 VERSIONINFO - FILEVERSION 1,9,8,0 - PRODUCTVERSION 1,9,8,0 + FILEVERSION 1,9,9,3 + PRODUCTVERSION 1,9,9,3 FILEOS VOS_UNKNOWN FILETYPE VFT_DLL BEGIN @@ -23,14 +23,14 @@ BEGIN VALUE "Comments", "\0" VALUE "CompanyName", "Grame\0" VALUE "FileDescription", "Jackmp Audio Adapter for Windows\0" - VALUE "FileVersion", "1, 9, 8, 0\0" + VALUE "FileVersion", "1, 9, 9, 3\0" VALUE "InternalName", "audioadapter\0" - VALUE "LegalCopyright", "Copyright Grame © 2006-2011\0" + VALUE "LegalCopyright", "Copyright Grame © 2006-2012\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "audioadapter.dll\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "audioadapter\0" - VALUE "ProductVersion", "1, 9, 8, 0\0" + VALUE "ProductVersion", "1, 9, 9, 3\0" VALUE "SpecialBuild", "\0" END END diff --git a/windows/jackd.cbp b/windows/jackd.cbp index 3a8ca8e5..71bc5985 100644 --- a/windows/jackd.cbp +++ b/windows/jackd.cbp @@ -21,6 +21,7 @@ + @@ -44,6 +45,7 @@ + @@ -69,6 +71,7 @@ + @@ -95,6 +98,7 @@ + @@ -123,6 +127,7 @@ + @@ -153,6 +158,7 @@ + diff --git a/windows/jackd.rc b/windows/jackd.rc index 0af38293..ba8488bd 100644 --- a/windows/jackd.rc +++ b/windows/jackd.rc @@ -11,8 +11,8 @@ // LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT 1 VERSIONINFO - FILEVERSION 1,9,8,0 - PRODUCTVERSION 1,9,8,0 + FILEVERSION 1,9,9,3 + PRODUCTVERSION 1,9,9,3 FILEOS VOS_UNKNOWN FILETYPE VFT_APP BEGIN @@ -23,14 +23,14 @@ BEGIN VALUE "Comments", "\0" VALUE "CompanyName", "Grame\0" VALUE "FileDescription", "Jack server for Windows\0" - VALUE "FileVersion", "1, 9, 8, 0\0" + VALUE "FileVersion", "1, 9, 9, 3\0" VALUE "InternalName", "jackd\0" - VALUE "LegalCopyright", "Copyright Grame © 2006-2011\0" + VALUE "LegalCopyright", "Copyright Grame © 2006-2012\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "jackd.exe\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "jackd\0" - VALUE "ProductVersion", "1, 9, 8, 0\0" + VALUE "ProductVersion", "1, 9, 9, 3\0" VALUE "SpecialBuild", "\0" END END diff --git a/windows/jackd.workspace b/windows/jackd.workspace index 66fab896..dc5bb4c0 100644 --- a/windows/jackd.workspace +++ b/windows/jackd.workspace @@ -1,14 +1,15 @@ + + - + - @@ -22,9 +23,8 @@ - + - diff --git a/windows/jackdmp.dsp b/windows/jackdmp.dsp deleted file mode 100644 index 755f175f..00000000 --- a/windows/jackdmp.dsp +++ /dev/null @@ -1,110 +0,0 @@ -# Microsoft Developer Studio Project File - Name="jackdmp" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=jackdmp - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "jackdmp.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "jackdmp.mak" CFG="jackdmp - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "jackdmp - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "jackdmp - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "jackdmp - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "./Release" -# PROP Intermediate_Dir "./Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /I "../common" /I "../common/jack" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "__STDC__" /YX /FD /c -# ADD BASE RSC /l 0x40c /d "NDEBUG" -# ADD RSC /l 0x40c /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libjackservermp.lib /nologo /subsystem:console /machine:I386 /out:"./Release/bin/jackdmp.exe" /libpath:"./Release" /libpath:"./Release/bin" - -!ELSEIF "$(CFG)" == "jackdmp - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "./Debug" -# PROP Intermediate_Dir "./Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "../common" /I "../common/jack" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "__STDC__" /YX /FD /GZ /c -# ADD BASE RSC /l 0x40c /d "_DEBUG" -# ADD RSC /l 0x40c /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"./Debug/bin/jackdmp.exe" /pdbtype:sept /libpath:"./Debug" /libpath:"./Debug/bin" - -!ENDIF - -# Begin Target - -# Name "jackdmp - Win32 Release" -# Name "jackdmp - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\getopt.c -# End Source File -# Begin Source File - -SOURCE=.\getopt1.c -# End Source File -# Begin Source File - -SOURCE=..\common\Jackdmp.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/windows/jackdmp.dsw b/windows/jackdmp.dsw deleted file mode 100644 index d51b5f5f..00000000 --- a/windows/jackdmp.dsw +++ /dev/null @@ -1,272 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "jack_connect"=".\jack_connect.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libjackmp - End Project Dependency -}}} - -############################################################################### - -Project: "jack_freeverb"=".\jack_freeverb.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libjackmp - End Project Dependency -}}} - -############################################################################### - -Project: "jack_load"=".\jack_load.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libjackmp - End Project Dependency -}}} - -############################################################################### - -Project: "jack_lsp"=".\jack_lsp.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libjackmp - End Project Dependency -}}} - -############################################################################### - -Project: "jack_metro"=".\jack_metro.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libjackmp - End Project Dependency -}}} - -############################################################################### - -Project: "jack_netdriver"=".\jack_netdriver.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libjackservermp - End Project Dependency -}}} - -############################################################################### - -Project: "jack_netmanager"=".\jack_netmanager.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libjackservermp - End Project Dependency -}}} - -############################################################################### - -Project: "jack_portaudio"=".\jack_portaudio.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libjackservermp - End Project Dependency -}}} - -############################################################################### - -Project: "jack_simple_client"=".\jack_simple_client.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libjackmp - End Project Dependency -}}} - -############################################################################### - -Project: "jack_test"=".\jack_test.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libjackmp - End Project Dependency -}}} - -############################################################################### - -Project: "jack_unload"=".\jack_unload.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libjackmp - End Project Dependency -}}} - -############################################################################### - -Project: "jackdmp"=".\jackdmp.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libjackservermp - End Project Dependency -}}} - -############################################################################### - -Project: "jdelay"=".\jdelay.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libjackmp - End Project Dependency -}}} - -############################################################################### - -Project: "libjackmp"=".\libjackmp.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "libjackservermp"=".\libjackservermp.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "testSynchoServerClient"=".\testSynchoServerClient.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "testSynchroClient"=".\testSynchroClient.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "testSynchroServer"=".\testSynchroServer.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/windows/jackdummydriver.rc b/windows/jackdummydriver.rc index 881a3811..fca510a1 100644 --- a/windows/jackdummydriver.rc +++ b/windows/jackdummydriver.rc @@ -11,8 +11,8 @@ // LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT 1 VERSIONINFO - FILEVERSION 1,9,8,0 - PRODUCTVERSION 1,9,8,0 + FILEVERSION 1,9,9,3 + PRODUCTVERSION 1,9,9,3 FILEOS VOS_UNKNOWN FILETYPE VFT_DLL BEGIN @@ -23,14 +23,14 @@ BEGIN VALUE "Comments", "\0" VALUE "CompanyName", "Grame\0" VALUE "FileDescription", "Jackmp Dummy Driver for Windows\0" - VALUE "FileVersion", "1, 9, 8, 0\0" + VALUE "FileVersion", "1, 9, 9, 3\0" VALUE "InternalName", "jack_dummy\0" - VALUE "LegalCopyright", "Copyright Grame © 2006-2011\0" + VALUE "LegalCopyright", "Copyright Grame © 2006-2012\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "jack_dummy.dll\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "jack_dummy\0" - VALUE "ProductVersion", "1, 9, 8, 0\0" + VALUE "ProductVersion", "1, 9, 9, 3\0" VALUE "SpecialBuild", "\0" END END diff --git a/windows/jackloopbackdriver.rc b/windows/jackloopbackdriver.rc index 878605cc..042633a0 100644 --- a/windows/jackloopbackdriver.rc +++ b/windows/jackloopbackdriver.rc @@ -11,8 +11,8 @@ // LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT 1 VERSIONINFO - FILEVERSION 1,9,8,0 - PRODUCTVERSION 1,9,8,0 + FILEVERSION 1,9,9,3 + PRODUCTVERSION 1,9,9,3 FILEOS VOS_UNKNOWN FILETYPE VFT_DLL BEGIN @@ -23,14 +23,14 @@ BEGIN VALUE "Comments", "\0" VALUE "CompanyName", "Grame\0" VALUE "FileDescription", "Jackmp Loopback Driver for Windows\0" - VALUE "FileVersion", "1, 9, 8, 0\0" + VALUE "FileVersion", "1, 9, 9, 3\0" VALUE "InternalName", "jack_loopback\0" - VALUE "LegalCopyright", "Copyright Grame © 2006-2011\0" + VALUE "LegalCopyright", "Copyright Grame © 2006-2012\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "jack_loopback.dll\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "jack_loopback\0" - VALUE "ProductVersion", "1, 9, 8, 0\0" + VALUE "ProductVersion", "1, 9, 9, 3\0" VALUE "SpecialBuild", "\0" END END diff --git a/windows/jacknetadapter.rc b/windows/jacknetadapter.rc index ba5c2ae8..18e051ce 100644 --- a/windows/jacknetadapter.rc +++ b/windows/jacknetadapter.rc @@ -11,8 +11,8 @@ // LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT 1 VERSIONINFO - FILEVERSION 1,9,8,0 - PRODUCTVERSION 1,9,8,0 + FILEVERSION 1,9,9,3 + PRODUCTVERSION 1,9,9,3 FILEOS VOS_UNKNOWN FILETYPE VFT_DLL BEGIN @@ -23,14 +23,14 @@ BEGIN VALUE "Comments", "\0" VALUE "CompanyName", "Grame\0" VALUE "FileDescription", "Jackmp Net Adapter for Windows\0" - VALUE "FileVersion", "1, 9, 8, 0\0" + VALUE "FileVersion", "1, 9, 9, 3\0" VALUE "InternalName", "netadapter\0" - VALUE "LegalCopyright", "Copyright Grame © 2006-2011\0" + VALUE "LegalCopyright", "Copyright Grame © 2006-2012\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "netadapter.dll\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "netadapter\0" - VALUE "ProductVersion", "1, 9, 8, 0\0" + VALUE "ProductVersion", "1, 9, 9, 3\0" VALUE "SpecialBuild", "\0" END END diff --git a/windows/jacknetdriver.rc b/windows/jacknetdriver.rc index 9df605a3..32e58f44 100644 --- a/windows/jacknetdriver.rc +++ b/windows/jacknetdriver.rc @@ -11,8 +11,8 @@ // LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT 1 VERSIONINFO - FILEVERSION 1,9,8,0 - PRODUCTVERSION 1,9,8,0 + FILEVERSION 1,9,9,3 + PRODUCTVERSION 1,9,9,3 FILEOS VOS_UNKNOWN FILETYPE VFT_DLL BEGIN @@ -23,14 +23,14 @@ BEGIN VALUE "Comments", "\0" VALUE "CompanyName", "Grame\0" VALUE "FileDescription", "Jackmp Net Driver for Windows\0" - VALUE "FileVersion", "1, 9, 8, 0\0" + VALUE "FileVersion", "1, 9, 9, 3\0" VALUE "InternalName", "jack_netdriver\0" - VALUE "LegalCopyright", "Copyright Grame © 2006-2011\0" + VALUE "LegalCopyright", "Copyright Grame © 2006-2012\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "jack_netdriver.dll\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "jack_netdriver\0" - VALUE "ProductVersion", "1, 9, 8, 0\0" + VALUE "ProductVersion", "1, 9, 9, 3\0" VALUE "SpecialBuild", "\0" END END diff --git a/windows/jacknetmanager.rc b/windows/jacknetmanager.rc index 2691e8fe..bd8b8c93 100644 --- a/windows/jacknetmanager.rc +++ b/windows/jacknetmanager.rc @@ -11,8 +11,8 @@ // LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT 1 VERSIONINFO - FILEVERSION 1,9,8,0 - PRODUCTVERSION 1,9,8,0 + FILEVERSION 1,9,9,3 + PRODUCTVERSION 1,9,9,3 FILEOS VOS_UNKNOWN FILETYPE VFT_DLL BEGIN @@ -23,14 +23,14 @@ BEGIN VALUE "Comments", "\0" VALUE "CompanyName", "Grame\0" VALUE "FileDescription", "Jackmp Net Manager for Windows\0" - VALUE "FileVersion", "1, 9, 8, 0\0" + VALUE "FileVersion", "1, 9, 9, 3\0" VALUE "InternalName", "netmanager\0" - VALUE "LegalCopyright", "Copyright Grame © 2006-2011\0" + VALUE "LegalCopyright", "Copyright Grame © 2006-2012\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "netmanager.dll\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "netmanager\0" - VALUE "ProductVersion", "1, 9, 8, 0\0" + VALUE "ProductVersion", "1, 9, 9, 3\0" VALUE "SpecialBuild", "\0" END END diff --git a/windows/jacknetonedriver.rc b/windows/jacknetonedriver.rc index 6c57a212..774b7da1 100644 --- a/windows/jacknetonedriver.rc +++ b/windows/jacknetonedriver.rc @@ -11,8 +11,8 @@ // LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT 1 VERSIONINFO - FILEVERSION 1,9,8,0 - PRODUCTVERSION 1,9,8,0 + FILEVERSION 1,9,9,3 + PRODUCTVERSION 1,9,9,3 FILEOS VOS_UNKNOWN FILETYPE VFT_DLL BEGIN @@ -23,14 +23,14 @@ BEGIN VALUE "Comments", "\0" VALUE "CompanyName", "Grame\0" VALUE "FileDescription", "Jackmp NetOne Driver for Windows\0" - VALUE "FileVersion", "1, 9, 8, 0\0" + VALUE "FileVersion", "1, 9, 9, 3\0" VALUE "InternalName", "jack_netonedriver\0" - VALUE "LegalCopyright", "Copyright Grame © 2006-2011\0" + VALUE "LegalCopyright", "Copyright Grame © 2006-2012\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "jack_netonedriver.dll\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "jack_netonedriver\0" - VALUE "ProductVersion", "1, 9, 8, 0\0" + VALUE "ProductVersion", "1, 9, 9, 3\0" VALUE "SpecialBuild", "\0" END END diff --git a/windows/jackportaudio.rc b/windows/jackportaudio.rc index 991c4bd8..031d2058 100644 --- a/windows/jackportaudio.rc +++ b/windows/jackportaudio.rc @@ -11,8 +11,8 @@ // LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT 1 VERSIONINFO - FILEVERSION 1,9,8,0 - PRODUCTVERSION 1,9,8,0 + FILEVERSION 1,9,9,3 + PRODUCTVERSION 1,9,9,3 FILEOS VOS_UNKNOWN FILETYPE VFT_DLL BEGIN @@ -23,14 +23,14 @@ BEGIN VALUE "Comments", "\0" VALUE "CompanyName", "Grame\0" VALUE "FileDescription", "Jackmp PortAudio Driver for Windows\0" - VALUE "FileVersion", "1, 9, 8, 0\0" + VALUE "FileVersion", "1, 9, 9, 3\0" VALUE "InternalName", "jack_portaudio\0" - VALUE "LegalCopyright", "Copyright Grame © 2006-2011\0" + VALUE "LegalCopyright", "Copyright Grame © 2006-2012\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "jack_portaudio.dll\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "jack_portaudio\0" - VALUE "ProductVersion", "1, 9, 8, 0\0" + VALUE "ProductVersion", "1, 9, 9, 3\0" VALUE "SpecialBuild", "\0" END END diff --git a/windows/jackwinmme.rc b/windows/jackwinmme.rc index 8ee884b7..52ca1179 100644 --- a/windows/jackwinmme.rc +++ b/windows/jackwinmme.rc @@ -11,8 +11,8 @@ // LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT 1 VERSIONINFO - FILEVERSION 1,9,8,0 - PRODUCTVERSION 1,9,8,0 + FILEVERSION 1,9,9,3 + PRODUCTVERSION 1,9,9,3 FILEOS VOS_UNKNOWN FILETYPE VFT_DLL BEGIN @@ -23,14 +23,14 @@ BEGIN VALUE "Comments", "\0" VALUE "CompanyName", "Grame\0" VALUE "FileDescription", "Jackmp WinMME Driver for Windows\0" - VALUE "FileVersion", "1, 9, 8, 0\0" + VALUE "FileVersion", "1, 9, 9, 3\0" VALUE "InternalName", "jack_portaudio\0" - VALUE "LegalCopyright", "Copyright Grame © 2006-2011\0" + VALUE "LegalCopyright", "Copyright Grame © 2006-2012\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "jack_winmme.dll\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "jack_winmme\0" - VALUE "ProductVersion", "1, 9, 8, 0\0" + VALUE "ProductVersion", "1, 9, 9, 3\0" VALUE "SpecialBuild", "\0" END END diff --git a/windows/jdelay.dsp b/windows/jdelay.dsp deleted file mode 100644 index ceb0815b..00000000 --- a/windows/jdelay.dsp +++ /dev/null @@ -1,102 +0,0 @@ -# Microsoft Developer Studio Project File - Name="jdelay" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=jdelay - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "jdelay.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "jdelay.mak" CFG="jdelay - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "jdelay - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "jdelay - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "jdelay - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "./Release" -# PROP Intermediate_Dir "./Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "../common" /I "." /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x40c /d "NDEBUG" -# ADD RSC /l 0x40c /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libjackmp.lib /nologo /subsystem:console /machine:I386 /out:"./Release/bin/jdelay.exe" /libpath:"./Release" /libpath:"./Release/bin" - -!ELSEIF "$(CFG)" == "jdelay - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "./Debug" -# PROP Intermediate_Dir "./Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "../common" /I "." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD BASE RSC /l 0x40c /d "_DEBUG" -# ADD RSC /l 0x40c /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"./Debug/bin/jdelay.exe" /pdbtype:sept /libpath:"./Debug" /libpath:"./Debug/bin" - -!ENDIF - -# Begin Target - -# Name "jdelay - Win32 Release" -# Name "jdelay - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\tests\jdelay.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/windows/libjack.cbp b/windows/libjack.cbp index d3a1cd1b..874f214e 100644 --- a/windows/libjack.cbp +++ b/windows/libjack.cbp @@ -8,7 +8,7 @@ @@ -304,18 +292,25 @@ + + + + + @@ -335,6 +330,7 @@ + diff --git a/windows/libjack.rc b/windows/libjack.rc index 753aeb8e..8e555811 100644 --- a/windows/libjack.rc +++ b/windows/libjack.rc @@ -11,8 +11,8 @@ // LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT 1 VERSIONINFO - FILEVERSION 1,9,8,0 - PRODUCTVERSION 1,9,8,0 + FILEVERSION 1,9,9,3 + PRODUCTVERSION 1,9,9,3 FILEOS VOS_UNKNOWN FILETYPE VFT_DLL BEGIN @@ -23,14 +23,14 @@ BEGIN VALUE "Comments", "\0" VALUE "CompanyName", "Grame\0" VALUE "FileDescription", "Jack client library for Windows\0" - VALUE "FileVersion", "1, 9, 8, 0\0" + VALUE "FileVersion", "1, 9, 9, 3\0" VALUE "InternalName", "libjack\0" - VALUE "LegalCopyright", "Copyright Grame © 2006-2011\0" + VALUE "LegalCopyright", "Copyright Grame © 2006-2012\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "libjack.dll\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "libjack\0" - VALUE "ProductVersion", "1, 9, 8, 0\0" + VALUE "ProductVersion", "1, 9, 9, 3\0" VALUE "SpecialBuild", "\0" END END diff --git a/windows/libjackmp.dsp b/windows/libjackmp.dsp deleted file mode 100644 index 43db3fd0..00000000 --- a/windows/libjackmp.dsp +++ /dev/null @@ -1,219 +0,0 @@ -# Microsoft Developer Studio Project File - Name="libjackmp" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=libjackmp - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "libjackmp.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "libjackmp.mak" CFG="libjackmp - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "libjackmp - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "libjackmp - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "libjackmp - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "./Release" -# PROP Intermediate_Dir "./Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBJACKMP_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GR /GX /O2 /I "." /I "../common" /I "../common/jack" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBJACKMP_EXPORTS" /D "__STDC__" /D "REGEX_MALLOC" /D "STDC_HEADERS" /D "__SMP__" /FR /YX /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x40c /d "NDEBUG" -# ADD RSC /l 0x40c /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /entry:"DllEntryPoint" /dll /machine:I386 /out:"./Release/bin/libjackmp.dll" /libpath:"./Release" /libpath:"./Release/bin" - -!ELSEIF "$(CFG)" == "libjackmp - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "./Debug" -# PROP Intermediate_Dir "./Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBJACKMP_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /I "." /I "../common" /I "../common/jack" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBJACKMP_EXPORTS" /D "__STDC__" /D "REGEX_MALLOC" /D "STDC_HEADERS" /D "__SMP__" /FR /YX /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x40c /d "_DEBUG" -# ADD RSC /l 0x40c /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"./Debug/bin/libjackmp.dll" /pdbtype:sept /libpath:"./Debug" /libpath:"./Debug/bin" - -!ENDIF - -# Begin Target - -# Name "libjackmp - Win32 Release" -# Name "libjackmp - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\common\JackActivationCount.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackAPI.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackAudioPort.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackClient.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackConnectionManager.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackEngineControl.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackError.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackFrameTimer.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackGlobals.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackGraphManager.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackLibAPI.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackLibClient.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackMessageBuffer.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackMidiAPI.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackMidiPort.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackPort.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackPortType.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackShmMem.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackTime.c -# End Source File -# Begin Source File - -SOURCE=..\common\JackTools.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackTransportEngine.cpp -# End Source File -# Begin Source File - -SOURCE=.\JackWinNamedPipe.cpp -# End Source File -# Begin Source File - -SOURCE=.\JackWinNamedPipeClientChannel.cpp -# End Source File -# Begin Source File - -SOURCE=.\JackWinProcessSync.cpp -# End Source File -# Begin Source File - -SOURCE=.\JackWinSemaphore.cpp -# End Source File -# Begin Source File - -SOURCE=.\JackWinThread.cpp -# End Source File -# Begin Source File - -SOURCE=.\regex.c -# End Source File -# Begin Source File - -SOURCE=.\resource.rc -# End Source File -# Begin Source File - -SOURCE=..\common\shm.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/windows/libjacknet.cbp b/windows/libjacknet.cbp index 762880f6..f77a3b42 100644 --- a/windows/libjacknet.cbp +++ b/windows/libjacknet.cbp @@ -8,7 +8,7 @@ - + - + - + @@ -230,8 +218,10 @@ + + diff --git a/windows/libjacknet.rc b/windows/libjacknet.rc index 7431af9b..110f026a 100644 --- a/windows/libjacknet.rc +++ b/windows/libjacknet.rc @@ -11,8 +11,8 @@ // LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT 1 VERSIONINFO - FILEVERSION 1,9,8,0 - PRODUCTVERSION 1,9,8,0 + FILEVERSION 1,9,9,3 + PRODUCTVERSION 1,9,9,3 FILEOS VOS_UNKNOWN FILETYPE VFT_DLL BEGIN @@ -23,14 +23,14 @@ BEGIN VALUE "Comments", "\0" VALUE "CompanyName", "Grame\0" VALUE "FileDescription", "Jack Net library for Windows\0" - VALUE "FileVersion", "1, 9, 8, 0\0" + VALUE "FileVersion", "1, 9, 9, 3\0" VALUE "InternalName", "libjacknet\0" - VALUE "LegalCopyright", "Copyright Grame © 2006-2011\0" + VALUE "LegalCopyright", "Copyright Grame © 2006-2012\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "libjacknet.dll\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "libjacknet\0" - VALUE "ProductVersion", "1, 9, 8, 0\0" + VALUE "ProductVersion", "1, 9, 9, 3\0" VALUE "SpecialBuild", "\0" END END diff --git a/windows/libjackserver.cbp b/windows/libjackserver.cbp index 11289a3d..bd7f5708 100644 --- a/windows/libjackserver.cbp +++ b/windows/libjackserver.cbp @@ -8,7 +8,7 @@ @@ -248,6 +236,7 @@ + @@ -257,6 +246,10 @@ + + @@ -265,9 +258,11 @@ + + @@ -286,6 +281,7 @@ + @@ -304,6 +300,7 @@ + diff --git a/windows/libjackserver.rc b/windows/libjackserver.rc index b930ccc7..13202670 100644 --- a/windows/libjackserver.rc +++ b/windows/libjackserver.rc @@ -11,8 +11,8 @@ // LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT 1 VERSIONINFO - FILEVERSION 1,9,8,0 - PRODUCTVERSION 1,9,8,0 + FILEVERSION 1,9,9,3 + PRODUCTVERSION 1,9,9,3 FILEOS VOS_UNKNOWN FILETYPE VFT_DLL BEGIN @@ -23,14 +23,14 @@ BEGIN VALUE "Comments", "\0" VALUE "CompanyName", "Grame\0" VALUE "FileDescription", "Jack server library for Windows\0" - VALUE "FileVersion", "1, 9, 8, 0\0" + VALUE "FileVersion", "1, 9, 9, 3\0" VALUE "InternalName", "libjackserver\0" - VALUE "LegalCopyright", "Copyright Grame © 2006-2011\0" + VALUE "LegalCopyright", "Copyright Grame © 2006-2012\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "libjackserver.dll\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "libjackserver\0" - VALUE "ProductVersion", "1, 9, 8, 0\0" + VALUE "ProductVersion", "1, 9, 9, 3\0" VALUE "SpecialBuild", "\0" END END diff --git a/windows/libjackservermp.dsp b/windows/libjackservermp.dsp deleted file mode 100644 index 94018300..00000000 --- a/windows/libjackservermp.dsp +++ /dev/null @@ -1,303 +0,0 @@ -# Microsoft Developer Studio Project File - Name="libjackservermp" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=libjackservermp - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "libjackservermp.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "libjackservermp.mak" CFG="libjackservermp - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "libjackservermp - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "libjackservermp - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "libjackservermp - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "./Release" -# PROP Intermediate_Dir "./Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBJACKDMP_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GR /GX /O2 /I "." /I "../common" /I "../common/jack" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBJACKDMP_EXPORTS" /D "__STDC__" /D "REGEX_MALLOC" /D "STDC_HEADERS" /D "__SMP__" /FR /YX /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x40c /d "NDEBUG" -# ADD RSC /l 0x40c /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib /nologo /entry:"DllEntryPoint" /dll /machine:I386 /out:"./Release/bin/libjackservermp.dll" /libpath:"./Release" /libpath:"./Release/bin" - -!ELSEIF "$(CFG)" == "libjackservermp - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "./Debug" -# PROP Intermediate_Dir "./Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBJACKDMP_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /I "." /I "../common" /I "../common/jack" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBJACKDMP_EXPORTS" /D "__STDC__" /D "REGEX_MALLOC" /D "STDC_HEADERS" /D "__SMP__" /FR /YX /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x40c /d "_DEBUG" -# ADD RSC /l 0x40c /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib /nologo /dll /debug /machine:I386 /out:"./Debug/bin/libjackservermp.dll" /pdbtype:sept /libpath:"./Debug" /libpath:"./Debug/bin" - -!ENDIF - -# Begin Target - -# Name "libjackservermp - Win32 Release" -# Name "libjackservermp - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\getopt.c -# End Source File -# Begin Source File - -SOURCE=.\getopt1.c -# End Source File -# Begin Source File - -SOURCE=..\common\JackActivationCount.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackAPI.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackAudioDriver.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackAudioPort.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackClient.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackConnectionManager.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackControl.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackDriver.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackDriverLoader.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackEngine.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackEngineControl.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackError.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackExternalClient.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackFrameTimer.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackFreewheelDriver.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackGlobals.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackGraphManager.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackInternalClient.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackLoopbackDriver.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackMessageBuffer.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackMidiAPI.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackMidiPort.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackNetTool.cpp -# End Source File -# Begin Source File - -SOURCE=.\JackNetWinSocket.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackPort.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackPortType.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackRestartThreadedDriver.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackServer.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackServerAPI.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackServerGlobals.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackShmMem.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackThreadedDriver.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackTime.c -# End Source File -# Begin Source File - -SOURCE=..\common\JackTools.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackTransportEngine.cpp -# End Source File -# Begin Source File - -SOURCE=..\common\JackWaitThreadedDriver.cpp -# End Source File -# Begin Source File - -SOURCE=.\JackWinNamedPipe.cpp -# End Source File -# Begin Source File - -SOURCE=.\JackWinNamedPipeClientChannel.cpp -# End Source File -# Begin Source File - -SOURCE=.\JackWinNamedPipeNotifyChannel.cpp -# End Source File -# Begin Source File - -SOURCE=.\JackWinNamedPipeServerChannel.cpp -# End Source File -# Begin Source File - -SOURCE=.\JackWinNamedPipeServerNotifyChannel.cpp -# End Source File -# Begin Source File - -SOURCE=.\JackWinProcessSync.cpp -# End Source File -# Begin Source File - -SOURCE=.\JackWinSemaphore.cpp -# End Source File -# Begin Source File - -SOURCE=.\JackWinThread.cpp -# End Source File -# Begin Source File - -SOURCE=.\regex.c -# End Source File -# Begin Source File - -SOURCE=.\resource.rc -# End Source File -# Begin Source File - -SOURCE=..\common\shm.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\common\JackMidiPort.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/windows/portaudio/JackPortAudioAdapter.cpp b/windows/portaudio/JackPortAudioAdapter.cpp index 9775b874..99942e07 100644 --- a/windows/portaudio/JackPortAudioAdapter.cpp +++ b/windows/portaudio/JackPortAudioAdapter.cpp @@ -215,10 +215,8 @@ extern "C" jack_driver_descriptor_add_parameter(desc, &filler, "in-channels", 'i', JackDriverParamInt, &value, NULL, "Maximum number of input channels", NULL); jack_driver_descriptor_add_parameter(desc, &filler, "out-channels", 'o', JackDriverParamInt, &value, NULL, "Maximum number of output channels", NULL); - strcpy(value.str, "default input device"); jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamString, &value, NULL, "Provide capture ports. Optionally set PortAudio device name", NULL); - strcpy(value.str, "default output device"); jack_driver_descriptor_add_parameter(desc, &filler, "playback", 'P', JackDriverParamString, &value, NULL, "Provide playback ports. Optionally set PortAudio device name", NULL); value.ui = 44100U; @@ -227,7 +225,6 @@ extern "C" value.ui = 512U; jack_driver_descriptor_add_parameter(desc, &filler, "periodsize", 'p', JackDriverParamUInt, &value, NULL, "Period size", NULL); - strcpy(value.str, "default device"); jack_driver_descriptor_add_parameter(desc, &filler, "device", 'd', JackDriverParamString, &value, NULL, "PortAudio device name", NULL); value.i = true; diff --git a/windows/portaudio/JackPortAudioAdapter.h b/windows/portaudio/JackPortAudioAdapter.h index 60e38d37..3d67978b 100644 --- a/windows/portaudio/JackPortAudioAdapter.h +++ b/windows/portaudio/JackPortAudioAdapter.h @@ -41,23 +41,23 @@ namespace Jack PaDeviceIndex fInputDevice; PaDeviceIndex fOutputDevice; - static int Render ( const void* inputBuffer, void* outputBuffer, + static int Render(const void* inputBuffer, void* outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags, - void* userData ); + void* userData); public: - JackPortAudioAdapter ( jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params ); + JackPortAudioAdapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params); ~JackPortAudioAdapter() {} int Open(); int Close(); - int SetSampleRate ( jack_nframes_t sample_rate ); - int SetBufferSize ( jack_nframes_t buffer_size ); + int SetSampleRate(jack_nframes_t sample_rate); + int SetBufferSize(jack_nframes_t buffer_size); }; diff --git a/windows/portaudio/JackPortAudioDevices.cpp b/windows/portaudio/JackPortAudioDevices.cpp index b9f44751..e98dfc7c 100644 --- a/windows/portaudio/JackPortAudioDevices.cpp +++ b/windows/portaudio/JackPortAudioDevices.cpp @@ -46,8 +46,7 @@ PortAudioDevices::PortAudioDevices() PortAudioDevices::~PortAudioDevices() { - // Desactivate for now: crash the server.. - //Pa_Terminate(); + Pa_Terminate(); delete[] fDeviceInfo; delete[] fHostName; @@ -106,10 +105,12 @@ PaDeviceInfo* PortAudioDevices::GetDeviceFromFullName (string fullname, PaDevice return NULL; } //first get host and device names from fullname - string::size_type separator = fullname.find ("::", 0); - if (separator == 0) { + string::size_type separator = fullname.find("::", 0); + + if (separator == string::npos) { return NULL; } + char* hostname = (char*)malloc(separator + 9); fill_n (hostname, separator + 9, 0); fullname.copy (hostname, separator); @@ -168,7 +169,7 @@ void PortAudioDevices::PrintSupportedStandardSampleRates(const PaStreamParameter int PortAudioDevices::GetInputDeviceFromName(const char* devicename, PaDeviceIndex& id, int& max_input) { - string fullname = string (devicename); + string fullname = string(devicename); PaDeviceInfo* device = GetDeviceFromFullName (fullname, id, true); if (device) { max_input = device->maxInputChannels; @@ -187,7 +188,7 @@ int PortAudioDevices::GetInputDeviceFromName(const char* devicename, PaDeviceInd int PortAudioDevices::GetOutputDeviceFromName(const char* devicename, PaDeviceIndex& id, int& max_output) { - string fullname = string (devicename); + string fullname = string(devicename); PaDeviceInfo* device = GetDeviceFromFullName (fullname, id, false); if (device) { max_output = device->maxOutputChannels; @@ -228,7 +229,7 @@ void PortAudioDevices::DisplayDevicesNames() } /* print device info fields */ - jack_info ("Name = %s", GetFullName (id).c_str()); + jack_info ("Name = %s", GetFullName(id).c_str()); jack_info ("Max inputs = %d", fDeviceInfo[id]->maxInputChannels); jack_info ("Max outputs = %d", fDeviceInfo[id]->maxOutputChannels); @@ -237,7 +238,7 @@ void PortAudioDevices::DisplayDevicesNames() if (Pa_GetHostApiInfo(fDeviceInfo[id]->hostApi)->type == paASIO) { long minLatency, maxLatency, preferredLatency, granularity; - PaAsio_GetAvailableLatencyValues (id, &minLatency, &maxLatency, &preferredLatency, &granularity); + PaAsio_GetAvailableBufferSizes (id, &minLatency, &maxLatency, &preferredLatency, &granularity); jack_info ("ASIO minimum buffer size = %ld", minLatency); jack_info ("ASIO maximum buffer size = %ld", maxLatency); @@ -269,7 +270,7 @@ void PortAudioDevices::DisplayDevicesNames() jack_info("**************************** End of list ****************************"); } -bool PortAudioDevices::IsDuplex (PaDeviceIndex id) +bool PortAudioDevices::IsDuplex(PaDeviceIndex id) { //does the device has in and out facilities if (fDeviceInfo[id]->maxInputChannels && fDeviceInfo[id]->maxOutputChannels) { @@ -277,7 +278,7 @@ bool PortAudioDevices::IsDuplex (PaDeviceIndex id) } //else is another complementary device ? (search in devices with the same name) for (PaDeviceIndex i = 0; i < fNumDevice; i++) { - if ((i != id) && (GetDeviceName (i) == GetDeviceName (id))) { + if ((i != id) && (GetDeviceName(i) == GetDeviceName(id))) { if ((fDeviceInfo[i]->maxInputChannels && fDeviceInfo[id]->maxOutputChannels) || (fDeviceInfo[i]->maxOutputChannels && fDeviceInfo[id]->maxInputChannels)) { return true; diff --git a/windows/portaudio/JackPortAudioDriver.cpp b/windows/portaudio/JackPortAudioDriver.cpp index 9b79b71b..f97c4787 100644 --- a/windows/portaudio/JackPortAudioDriver.cpp +++ b/windows/portaudio/JackPortAudioDriver.cpp @@ -44,7 +44,7 @@ int JackPortAudioDriver::Render(const void* inputBuffer, void* outputBuffer, driver->fInputBuffer = (jack_default_audio_sample_t**)inputBuffer; driver->fOutputBuffer = (jack_default_audio_sample_t**)outputBuffer; - MMCSSAcquireRealTime(GetCurrentThread()); + //MMCSSAcquireRealTime(GetCurrentThread()); if (statusFlags) { if (statusFlags & paOutputUnderflow) @@ -91,6 +91,8 @@ PaError JackPortAudioDriver::OpenStream(jack_nframes_t buffer_size) PaStreamParameters inputParameters; PaStreamParameters outputParameters; + jack_log("JackPortAudioDriver::OpenStream buffer_size = %d", buffer_size); + // Update parameters inputParameters.device = fInputDevice; inputParameters.channelCount = fCaptureChannels; @@ -248,6 +250,39 @@ int JackPortAudioDriver::Close() return res; } +int JackPortAudioDriver::Attach() +{ + if (JackAudioDriver::Attach() == 0) { + + const char* alias; + + if (fInputDevice != paNoDevice && fPaDevices->GetHostFromDevice(fInputDevice) == "ASIO") { + for (int i = 0; i < fCaptureChannels; i++) { + PaError err = PaAsio_GetInputChannelName(fInputDevice, i, &alias); + if (err == paNoError) { + JackPort* port = fGraphManager->GetPort(fCapturePortList[i]); + port->SetAlias(alias); + } + } + } + + if (fOutputDevice != paNoDevice && fPaDevices->GetHostFromDevice(fOutputDevice) == "ASIO") { + for (int i = 0; i < fPlaybackChannels; i++) { + PaError err = PaAsio_GetInputChannelName(fOutputDevice, i, &alias); + if (err == paNoError) { + JackPort* port = fGraphManager->GetPort(fPlaybackPortList[i]); + port->SetAlias(alias); + } + } + } + + return 0; + + } else { + return -1; + } +} + int JackPortAudioDriver::Start() { jack_log("JackPortAudioDriver::Start"); @@ -313,10 +348,8 @@ extern "C" jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamUInt, &value, NULL, "Maximum number of input channels", NULL); jack_driver_descriptor_add_parameter(desc, &filler, "outchannels", 'o', JackDriverParamUInt, &value, NULL, "Maximum number of output channels", NULL); - strcpy(value.str, "will take default PortAudio input device"); jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamString, &value, NULL, "Provide capture ports. Optionally set PortAudio device name", NULL); - strcpy(value.str, "will take default PortAudio output device"); jack_driver_descriptor_add_parameter(desc, &filler, "playback", 'P', JackDriverParamString, &value, NULL, "Provide playback ports. Optionally set PortAudio device name", NULL); value.i = 0; @@ -331,7 +364,6 @@ extern "C" value.ui = 512U; jack_driver_descriptor_add_parameter(desc, &filler, "period", 'p', JackDriverParamUInt, &value, NULL, "Frames per period", NULL); - strcpy(value.str, "will take default PortAudio device name"); jack_driver_descriptor_add_parameter(desc, &filler, "device", 'd', JackDriverParamString, &value, NULL, "PortAudio device name", NULL); value.ui = 0; @@ -425,7 +457,8 @@ extern "C" case 'l': pa_devices->DisplayDevicesNames(); - break; + // Stops the server in this case + return NULL; } } diff --git a/windows/portaudio/JackPortAudioDriver.h b/windows/portaudio/JackPortAudioDriver.h index c40810d6..ca745a4e 100644 --- a/windows/portaudio/JackPortAudioDriver.h +++ b/windows/portaudio/JackPortAudioDriver.h @@ -80,6 +80,8 @@ class JackPortAudioDriver : public JackMMCSS, public JackAudioDriver int Close(); + int Attach(); + int Start(); int Stop(); diff --git a/windows/portaudio/pa_asio.h b/windows/portaudio/pa_asio.h index 64e075b6..8f4624e6 100644 --- a/windows/portaudio/pa_asio.h +++ b/windows/portaudio/pa_asio.h @@ -1,7 +1,7 @@ #ifndef PA_ASIO_H #define PA_ASIO_H /* - * $Id: pa_asio.h,v 1.1.2.2 2006/06/20 14:44:48 letz Exp $ + * $Id: pa_asio.h 1667 2011-05-02 15:49:20Z rossb $ * PortAudio Portable Real-Time Audio Library * ASIO specific extensions * @@ -18,10 +18,6 @@ * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * - * Any person wishing to distribute modifications to the Software is - * requested to send the modifications to the original developer so that - * they can be incorporated into the canonical version. - * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. @@ -29,14 +25,25 @@ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. */ + /** @file + @ingroup public_header @brief ASIO-specific PortAudio API extension header file. */ - #include "portaudio.h" #ifdef __cplusplus @@ -45,75 +52,95 @@ extern "C" #endif /* __cplusplus */ - /** Retrieve legal latency settings for the specificed device, in samples. - - @param device The global index of the device about which the query is being made. - @param minLatency A pointer to the location which will recieve the minimum latency value. - @param maxLatency A pointer to the location which will recieve the maximum latency value. - @param preferredLatency A pointer to the location which will recieve the preferred latency value. - @param granularity A pointer to the location which will recieve the granularity. This value - determines which values between minLatency and maxLatency are available. ie the step size, - if granularity is -1 then available latency settings are powers of two. - - @see ASIOGetBufferSize in the ASIO SDK. - - @todo This function should have a better name, any suggestions? - */ - PaError PaAsio_GetAvailableLatencyValues( PaDeviceIndex device, - long *minLatency, long *maxLatency, long *preferredLatency, long *granularity ); +/** Retrieve legal native buffer sizes for the specificed device, in sample frames. + @param device The global index of the device about which the query is being made. + @param minBufferSizeFrames A pointer to the location which will receive the minimum buffer size value. + @param maxBufferSizeFrames A pointer to the location which will receive the maximum buffer size value. + @param preferredBufferSizeFrames A pointer to the location which will receive the preferred buffer size value. + @param granularity A pointer to the location which will receive the "granularity". This value determines + the step size used to compute the legal values between minBufferSizeFrames and maxBufferSizeFrames. + If granularity is -1 then available buffer size values are powers of two. - /** Display the ASIO control panel for the specified device. - - @param device The global index of the device whose control panel is to be displayed. - @param systemSpecific On Windows, the calling application's main window handle, - on Macintosh this value should be zero. - */ - PaError PaAsio_ShowControlPanel( PaDeviceIndex device, void* systemSpecific ); + @see ASIOGetBufferSize in the ASIO SDK. + @note: this function used to be called PaAsio_GetAvailableLatencyValues. There is a + #define that maps PaAsio_GetAvailableLatencyValues to this function for backwards compatibility. +*/ +PaError PaAsio_GetAvailableBufferSizes( PaDeviceIndex device, + long *minBufferSizeFrames, long *maxBufferSizeFrames, long *preferredBufferSizeFrames, long *granularity ); +/** Backwards compatibility alias for PaAsio_GetAvailableBufferSizes - /** Retrieve a pointer to a string containing the name of the specified - input channel. The string is valid until Pa_Terminate is called. - - The string will be no longer than 32 characters including the null terminator. - */ - PaError PaAsio_GetInputChannelName( PaDeviceIndex device, int channelIndex, - const char** channelName ); + @see PaAsio_GetAvailableBufferSizes +*/ +#define PaAsio_GetAvailableLatencyValues PaAsio_GetAvailableBufferSizes - /** Retrieve a pointer to a string containing the name of the specified - input channel. The string is valid until Pa_Terminate is called. - - The string will be no longer than 32 characters including the null terminator. - */ - PaError PaAsio_GetOutputChannelName( PaDeviceIndex device, int channelIndex, - const char** channelName ); +/** Display the ASIO control panel for the specified device. + + @param device The global index of the device whose control panel is to be displayed. + @param systemSpecific On Windows, the calling application's main window handle, + on Macintosh this value should be zero. +*/ +PaError PaAsio_ShowControlPanel( PaDeviceIndex device, void* systemSpecific ); + + + + +/** Retrieve a pointer to a string containing the name of the specified + input channel. The string is valid until Pa_Terminate is called. + + The string will be no longer than 32 characters including the null terminator. +*/ +PaError PaAsio_GetInputChannelName( PaDeviceIndex device, int channelIndex, + const char** channelName ); + + +/** Retrieve a pointer to a string containing the name of the specified + input channel. The string is valid until Pa_Terminate is called. + + The string will be no longer than 32 characters including the null terminator. +*/ +PaError PaAsio_GetOutputChannelName( PaDeviceIndex device, int channelIndex, + const char** channelName ); + + +/** Set the sample rate of an open paASIO stream. + + @param stream The stream to operate on. + @param sampleRate The new sample rate. + + Note that this function may fail if the stream is alredy running and the + ASIO driver does not support switching the sample rate of a running stream. + + Returns paIncompatibleStreamHostApi if stream is not a paASIO stream. +*/ +PaError PaAsio_SetStreamSampleRate( PaStream* stream, double sampleRate ); #define paAsioUseChannelSelectors (0x01) - typedef struct PaAsioStreamInfo { - unsigned long size; /**< sizeof(PaAsioStreamInfo) */ - PaHostApiTypeId hostApiType; /**< paASIO */ - unsigned long version; /**< 1 */ - - unsigned long flags; - - /* Support for opening only specific channels of an ASIO device. - If the paAsioUseChannelSelectors flag is set, channelSelectors is a - pointer to an array of integers specifying the device channels to use. - When used, the length of the channelSelectors array must match the - corresponding channelCount parameter to Pa_OpenStream() otherwise a - crash may result. - The values in the selectors array must specify channels within the - range of supported channels for the device or paInvalidChannelCount will - result. - */ - int *channelSelectors; - } - PaAsioStreamInfo; +typedef struct PaAsioStreamInfo{ + unsigned long size; /**< sizeof(PaAsioStreamInfo) */ + PaHostApiTypeId hostApiType; /**< paASIO */ + unsigned long version; /**< 1 */ + + unsigned long flags; + + /* Support for opening only specific channels of an ASIO device. + If the paAsioUseChannelSelectors flag is set, channelSelectors is a + pointer to an array of integers specifying the device channels to use. + When used, the length of the channelSelectors array must match the + corresponding channelCount parameter to Pa_OpenStream() otherwise a + crash may result. + The values in the selectors array must specify channels within the + range of supported channels for the device or paInvalidChannelCount will + result. + */ + int *channelSelectors; +}PaAsioStreamInfo; #ifdef __cplusplus diff --git a/windows/resource.rc b/windows/resource.rc deleted file mode 100644 index 902ea5ee..00000000 --- a/windows/resource.rc +++ /dev/null @@ -1,76 +0,0 @@ -8 -#include "resource_vc.h" - -#define APSTUDIO_READONLY_SYMBOLS -#include "afxres.h" -#undef APSTUDIO_READONLY_SYMBOLS - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA) - -#ifdef _WIN32 -LANGUAGE LANG_FRENCH, SUBLANG_FRENCH -#pragma code_page(1252) -#endif - -#ifndef _MAC -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,9,8,0 - PRODUCTVERSION 1,9,8,0 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x40004L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040c04b0" - BEGIN - VALUE "Comments", "\0" - VALUE "CompanyName", "Grame\0" - VALUE "FileDescription", "Jackmp for Windows\0" - VALUE "FileVersion", "1, 9, 8, 0\0" - VALUE "InternalName", "libjackmp\0" - VALUE "LegalCopyright", "Copyright Grame © 2006-2011\0" - VALUE "LegalTrademarks", "\0" - VALUE "OriginalFilename", "libjackmp.dll\0" - VALUE "PrivateBuild", "\0" - VALUE "ProductName", "libjackmp\0" - VALUE "ProductVersion", "1, 9, 8, 0\0" - VALUE "SpecialBuild", "\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x40c, 1200 - END -END -#endif - -#ifdef APSTUDIO_INVOKED -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource_vc.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END -#endif - -#endif - -#ifndef APSTUDIO_INVOKED -#endif diff --git a/windows/testSynchoServerClient.dsp b/windows/testSynchoServerClient.dsp deleted file mode 100644 index 6da9e927..00000000 --- a/windows/testSynchoServerClient.dsp +++ /dev/null @@ -1,114 +0,0 @@ -# Microsoft Developer Studio Project File - Name="testSynchoServerClient" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=testSynchoServerClient - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "testSynchoServerClient.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "testSynchoServerClient.mak" CFG="testSynchoServerClient - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "testSynchoServerClient - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "testSynchoServerClient - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "testSynchoServerClient - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "./Release" -# PROP Intermediate_Dir "./Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /I "../common" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x40c /d "NDEBUG" -# ADD RSC /l 0x40c /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"./Release/bin/testSynchoServerClient.exe" /libpath:"./Release" /libpath:"./Release/bin" - -!ELSEIF "$(CFG)" == "testSynchoServerClient - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "./Debug" -# PROP Intermediate_Dir "./Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "../common" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD BASE RSC /l 0x40c /d "_DEBUG" -# ADD RSC /l 0x40c /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"./Debug/bin/testSynchoServerClient.exe" /pdbtype:sept /libpath:"./Debug" /libpath:"./Debug/bin" - -!ENDIF - -# Begin Target - -# Name "testSynchoServerClient - Win32 Release" -# Name "testSynchoServerClient - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\common\JackError.c -# End Source File -# Begin Source File - -SOURCE=.\JackWinEvent.cpp -# End Source File -# Begin Source File - -SOURCE=.\JackWinThread.cpp -# End Source File -# Begin Source File - -SOURCE=..\tests\testSynchroServerClient.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/windows/testSynchroClient.dsp b/windows/testSynchroClient.dsp deleted file mode 100644 index cf824d11..00000000 --- a/windows/testSynchroClient.dsp +++ /dev/null @@ -1,150 +0,0 @@ -# Microsoft Developer Studio Project File - Name="testSynchroClient" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=testSynchroClient - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "testSynchroClient.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "testSynchroClient.mak" CFG="testSynchroClient - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "testSynchroClient - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "testSynchroClient - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "testSynchroClient - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "./Release" -# PROP Intermediate_Dir "./Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /I "../common" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x40c /d "NDEBUG" -# ADD RSC /l 0x40c /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"./Release/bin/testSynchroClient.exe" /libpath:"./Release" /libpath:"./Release/bin" - -!ELSEIF "$(CFG)" == "testSynchroClient - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "./Debug" -# PROP Intermediate_Dir "./Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "../common" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD BASE RSC /l 0x40c /d "_DEBUG" -# ADD RSC /l 0x40c /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"./Debug/bin/testSynchroClient.exe" /pdbtype:sept /libpath:"./Debug" /libpath:"./Debug/bin" - -!ENDIF - -# Begin Target - -# Name "testSynchroClient - Win32 Release" -# Name "testSynchroClient - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\common\JackError.c - -!IF "$(CFG)" == "testSynchroClient - Win32 Release" - -!ELSEIF "$(CFG)" == "testSynchroClient - Win32 Debug" - -# ADD CPP /U "." /U "../common" - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=.\JackWinEvent.cpp - -!IF "$(CFG)" == "testSynchroClient - Win32 Release" - -!ELSEIF "$(CFG)" == "testSynchroClient - Win32 Debug" - -# ADD CPP /U "." /U "../common" - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=.\JackWinThread.cpp - -!IF "$(CFG)" == "testSynchroClient - Win32 Release" - -!ELSEIF "$(CFG)" == "testSynchroClient - Win32 Debug" - -# ADD CPP /U "." /U "../common" - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\tests\testSynchroClient.cpp - -!IF "$(CFG)" == "testSynchroClient - Win32 Release" - -!ELSEIF "$(CFG)" == "testSynchroClient - Win32 Debug" - -# ADD CPP /U "." /U "../common" - -!ENDIF - -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/windows/testSynchroServer.dsp b/windows/testSynchroServer.dsp deleted file mode 100644 index fb8d266e..00000000 --- a/windows/testSynchroServer.dsp +++ /dev/null @@ -1,114 +0,0 @@ -# Microsoft Developer Studio Project File - Name="testSynchroServer" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=testSynchroServer - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "testSynchroServer.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "testSynchroServer.mak" CFG="testSynchroServer - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "testSynchroServer - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "testSynchroServer - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "testSynchroServer - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "./Release" -# PROP Intermediate_Dir "./Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /I "../common" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x40c /d "NDEBUG" -# ADD RSC /l 0x40c /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"./Release/bin/testSynchroServer.exe" /libpath:"./Release" /libpath:"./Release/bin" - -!ELSEIF "$(CFG)" == "testSynchroServer - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "./Debug" -# PROP Intermediate_Dir "./Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "../common" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /GZ /c -# ADD BASE RSC /l 0x40c /d "_DEBUG" -# ADD RSC /l 0x40c /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"./Debug/bin/testSynchroServer.exe" /pdbtype:sept /libpath:"./Debug" /libpath:"./Debug/bin" - -!ENDIF - -# Begin Target - -# Name "testSynchroServer - Win32 Release" -# Name "testSynchroServer - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\common\JackError.c -# End Source File -# Begin Source File - -SOURCE=.\JackWinEvent.cpp -# End Source File -# Begin Source File - -SOURCE=.\JackWinThread.cpp -# End Source File -# Begin Source File - -SOURCE=..\tests\testSynchroServer.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/windows/winmme/JackWinMMEDriver.cpp b/windows/winmme/JackWinMMEDriver.cpp index ce00e97d..eaa70859 100644 --- a/windows/winmme/JackWinMMEDriver.cpp +++ b/windows/winmme/JackWinMMEDriver.cpp @@ -21,7 +21,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include #include "JackEngineControl.h" -#include "JackWinMMEDriver.h" +#include "JackWinMMEDriver.h" +#include "driver_interface.h" using Jack::JackWinMMEDriver; @@ -362,8 +363,6 @@ extern "C" SERVER_EXPORT jack_driver_desc_t * driver_get_descriptor() { - jack_driver_desc_t * desc; - return jack_driver_descriptor_construct("winmme", JackDriverSlave, "WinMME API based MIDI backend", NULL); } diff --git a/windows/winmme/JackWinMMEInputPort.cpp b/windows/winmme/JackWinMMEInputPort.cpp index 2f712189..18009b19 100644 --- a/windows/winmme/JackWinMMEInputPort.cpp +++ b/windows/winmme/JackWinMMEInputPort.cpp @@ -191,7 +191,9 @@ JackWinMMEInputPort::ProcessJack(JackMidiBuffer *port_buffer, "event.", jack_event->size); // Fallthrough on purpose case JackMidiWriteQueue::OK: - continue; + continue; + default: + break; } break; } diff --git a/windows/winmme/JackWinMMEPort.cpp b/windows/winmme/JackWinMMEPort.cpp index 13ec2302..6dac4a7b 100644 --- a/windows/winmme/JackWinMMEPort.cpp +++ b/windows/winmme/JackWinMMEPort.cpp @@ -55,7 +55,7 @@ JackWinMMEPort::GetOSErrorString(LPTSTR text) if (! FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), text, MAXERRORLENGTH, NULL)) { - snprintf(text, MAXERRORLENGTH, "Unknown OS error code '%d'", error); + snprintf(text, MAXERRORLENGTH, "Unknown OS error code '%ld'", error); } } diff --git a/wscript b/wscript index 2b41fc06..e8d9a8bd 100644 --- a/wscript +++ b/wscript @@ -1,33 +1,35 @@ #! /usr/bin/env python # encoding: utf-8 +from __future__ import print_function import os import Utils import Options -import commands +import subprocess g_maxlen = 40 import shutil import Task import re import Logs +import sys -VERSION='1.9.8' +VERSION='1.9.9' APPNAME='jack' JACK_API_VERSION = '0.1.0' # these variables are mandatory ('/' are converted automatically) -srcdir = '.' -blddir = 'build' +top = '.' +out = 'build' def display_msg(msg, status = None, color = None): sr = msg global g_maxlen g_maxlen = max(g_maxlen, len(msg)) if status: - print "%s :" % msg.ljust(g_maxlen), - Utils.pprint(color, status) + Logs.pprint('NORMAL', "%s :" % msg.ljust(g_maxlen), sep=' ') + Logs.pprint(color, status) else: - print "%s" % msg.ljust(g_maxlen) + print("%s" % msg.ljust(g_maxlen)) def display_feature(msg, build): if build: @@ -36,26 +38,26 @@ def display_feature(msg, build): display_msg(msg, "no", 'YELLOW') def create_svnversion_task(bld, header='svnversion.h', define=None): - import Constants, Build - cmd = '../svnversion_regenerate.sh ${TGT}' if define: cmd += " " + define - cls = Task.simple_task_type('svnversion', cmd, color='BLUE', before='cc') - cls.runnable_status = lambda self: Constants.RUN_ME - def post_run(self): sg = Utils.h_file(self.outputs[0].abspath(self.env)) #print sg.encode('hex') Build.bld.node_sigs[self.env.variant()][self.outputs[0].id] = sg - cls.post_run = post_run - - tsk = cls(bld.env.copy()) - tsk.inputs = [] - tsk.outputs = [bld.path.find_or_declare(header)] -def set_options(opt): + bld( + rule = cmd, + name = 'svnversion', + runnable_status = Task.RUN_ME, + before = 'c', + color = 'BLUE', + post_run = post_run, + target = [bld.path.find_or_declare(header)] + ) + +def options(opt): # options provided by the modules opt.tool_options('compiler_cxx') opt.tool_options('compiler_cc') @@ -77,19 +79,24 @@ def set_options(opt): opt.sub_options('dbus') def configure(conf): - platform = Utils.detect_platform() + conf.load('compiler_cxx') + conf.load('compiler_cc') + platform = sys.platform conf.env['IS_MACOSX'] = platform == 'darwin' - conf.env['IS_LINUX'] = platform == 'linux' or platform == 'posix' + conf.env['IS_LINUX'] = platform == 'linux' or platform == 'linux2' or platform == 'posix' conf.env['IS_SUN'] = platform == 'sunos' + # GNU/kFreeBSD and GNU/Hurd are treated as Linux + if platform.startswith('gnu0') or platform.startswith('gnukfreebsd'): + conf.env['IS_LINUX'] = True if conf.env['IS_LINUX']: - Utils.pprint('CYAN', "Linux detected") + Logs.pprint('CYAN', "Linux detected") if conf.env['IS_MACOSX']: - Utils.pprint('CYAN', "MacOS X detected") + Logs.pprint('CYAN', "MacOS X detected") if conf.env['IS_SUN']: - Utils.pprint('CYAN', "SunOS detected") + Logs.pprint('CYAN', "SunOS detected") if conf.env['IS_LINUX']: conf.check_tool('compiler_cxx') @@ -135,25 +142,25 @@ def configure(conf): conf.sub_config('example-clients') - if conf.check_cfg(package='celt', atleast_version='0.11.0', args='--cflags --libs'): + if conf.check_cfg(package='celt', atleast_version='0.11.0', args='--cflags --libs', mandatory=False): conf.define('HAVE_CELT', 1) conf.define('HAVE_CELT_API_0_11', 1) conf.define('HAVE_CELT_API_0_8', 0) conf.define('HAVE_CELT_API_0_7', 0) conf.define('HAVE_CELT_API_0_5', 0) - elif conf.check_cfg(package='celt', atleast_version='0.8.0', args='--cflags --libs'): + elif conf.check_cfg(package='celt', atleast_version='0.8.0', args='--cflags --libs', mandatory=False): conf.define('HAVE_CELT', 1) conf.define('HAVE_CELT_API_0_11', 0) conf.define('HAVE_CELT_API_0_8', 1) conf.define('HAVE_CELT_API_0_7', 0) conf.define('HAVE_CELT_API_0_5', 0) - elif conf.check_cfg(package='celt', atleast_version='0.7.0', args='--cflags --libs'): + elif conf.check_cfg(package='celt', atleast_version='0.7.0', args='--cflags --libs', mandatory=False): conf.define('HAVE_CELT', 1) conf.define('HAVE_CELT_API_0_11', 0) conf.define('HAVE_CELT_API_0_8', 0) conf.define('HAVE_CELT_API_0_7', 1) conf.define('HAVE_CELT_API_0_5', 0) - elif conf.check_cfg(package='celt', atleast_version='0.5.0', args='--cflags --libs', required=True): + elif conf.check_cfg(package='celt', atleast_version='0.5.0', args='--cflags --libs', mandatory=False): conf.define('HAVE_CELT', 1) conf.define('HAVE_CELT_API_0_11', 0) conf.define('HAVE_CELT_API_0_8', 0) @@ -184,12 +191,12 @@ def configure(conf): conf.env['BUILD_JACKD'] = True if Options.options.libdir: - conf.env['LIBDIR'] = conf.env['PREFIX'] + Options.options.libdir + conf.env['LIBDIR'] = Options.options.libdir else: conf.env['LIBDIR'] = conf.env['PREFIX'] + '/lib' if Options.options.mandir: - conf.env['MANDIR'] = conf.env['PREFIX'] + Options.options.mandir + conf.env['MANDIR'] = Options.options.mandir else: conf.env['MANDIR'] = conf.env['PREFIX'] + '/share/man/man1' @@ -201,7 +208,8 @@ def configure(conf): conf.define('CLIENT_NUM', Options.options.clients) conf.define('PORT_NUM_FOR_CLIENT', Options.options.application_ports) - conf.define('ADDON_DIR', os.path.normpath(os.path.join(conf.env['LIBDIR'], 'jack'))) + conf.env['ADDON_DIR'] = os.path.normpath(os.path.join(conf.env['LIBDIR'], 'jack')) + conf.define('ADDON_DIR', conf.env['ADDON_DIR']) conf.define('JACK_LOCATION', os.path.normpath(os.path.join(conf.env['PREFIX'], 'bin'))) conf.define('USE_POSIX_SHM', 1) conf.define('JACKMP', 1) @@ -211,8 +219,6 @@ def configure(conf): conf.define('USE_LIBDBUS_AUTOLAUNCH', 1) if conf.env['BUILD_WITH_PROFILE'] == True: conf.define('JACK_MONITOR', 1) - if conf.env['BUILD_WITH_32_64'] == True: - conf.define('JACK_32_64', 1) conf.write_config_header('config.h') svnrev = None @@ -222,7 +228,7 @@ def configure(conf): if m != None: svnrev = m.group(1) - conf.env.append_unique('LINKFLAGS', '-lm -lstdc++') + conf.env.append_unique('LINKFLAGS', ['-lm', '-lstdc++']) if Options.options.mixed == True: env_variant2 = conf.env.copy() @@ -233,22 +239,22 @@ def configure(conf): conf.env.append_unique('CCFLAGS', '-m32') conf.env.append_unique('LINKFLAGS', '-m32') if Options.options.libdir32: - conf.env['LIBDIR'] = conf.env['PREFIX'] + Options.options.libdir32 + conf.env['LIBDIR'] = Options.options.libdir32 else: conf.env['LIBDIR'] = conf.env['PREFIX'] + '/lib32' conf.write_config_header('config.h') - print + print() display_msg("==================") version_msg = "JACK " + VERSION if svnrev: version_msg += " exported from r" + svnrev else: version_msg += " svn revision will checked and eventually updated during build" - print version_msg + print(version_msg) - print "Build with a maximum of %d JACK clients" % conf.env['CLIENT_NUM'] - print "Build with a maximum of %d ports per application" % conf.env['PORT_NUM_FOR_CLIENT'] + print("Build with a maximum of %d JACK clients" % Options.options.clients) + print("Build with a maximum of %d ports per application" % Options.options.application_ports) display_msg("Install prefix", conf.env['PREFIX'], 'CYAN') display_msg("Library directory", conf.env['LIBDIR'], 'CYAN') @@ -265,8 +271,8 @@ def configure(conf): display_feature('Build D-Bus JACK (jackdbus)', conf.env['BUILD_JACKDBUS']) if conf.env['BUILD_JACKDBUS'] and conf.env['BUILD_JACKD']: - print Logs.colors.RED + 'WARNING !! mixing both jackd and jackdbus may cause issues:' + Logs.colors.NORMAL - print Logs.colors.RED + 'WARNING !! jackdbus does not use .jackdrc nor qjackctl settings' + Logs.colors.NORMAL + print(Logs.colors.RED + 'WARNING !! mixing both jackd and jackdbus may cause issues:' + Logs.colors.NORMAL) + print(Logs.colors.RED + 'WARNING !! jackdbus does not use .jackdrc nor qjackctl settings' + Logs.colors.NORMAL) if conf.env['IS_LINUX']: display_feature('Build with ALSA support', conf.env['BUILD_DRIVER_ALSA'] == True) @@ -278,21 +284,21 @@ def configure(conf): #display_msg('Settings persistence', xxx) if conf.env['DBUS_SERVICES_DIR'] != conf.env['DBUS_SERVICES_DIR_REAL']: - print - print Logs.colors.RED + "WARNING: D-Bus session services directory as reported by pkg-config is" - print Logs.colors.RED + "WARNING:", - print Logs.colors.CYAN + conf.env['DBUS_SERVICES_DIR_REAL'] - print Logs.colors.RED + 'WARNING: but service file will be installed in' - print Logs.colors.RED + "WARNING:", - print Logs.colors.CYAN + conf.env['DBUS_SERVICES_DIR'] - print Logs.colors.RED + 'WARNING: You may need to adjust your D-Bus configuration after installing jackdbus' - print 'WARNING: You can override dbus service install directory' - print 'WARNING: with --enable-pkg-config-dbus-service-dir option to this script' - print Logs.colors.NORMAL, - print + print() + print(Logs.colors.RED + "WARNING: D-Bus session services directory as reported by pkg-config is") + print(Logs.colors.RED + "WARNING:", end=' ') + print(Logs.colors.CYAN + conf.env['DBUS_SERVICES_DIR_REAL']) + print(Logs.colors.RED + 'WARNING: but service file will be installed in') + print(Logs.colors.RED + "WARNING:", end=' ') + print(Logs.colors.CYAN + conf.env['DBUS_SERVICES_DIR']) + print(Logs.colors.RED + 'WARNING: You may need to adjust your D-Bus configuration after installing jackdbus') + print('WARNING: You can override dbus service install directory') + print('WARNING: with --enable-pkg-config-dbus-service-dir option to this script') + print(Logs.colors.NORMAL, end=' ') + print() def build(bld): - print ("make[1]: Entering directory `" + os.getcwd() + "/" + blddir + "'" ) + print("make[1]: Entering directory `" + os.getcwd() + "/" + out + "'") if not os.access('svnversion.h', os.R_OK): create_svnversion_task(bld) @@ -326,27 +332,27 @@ def build(bld): html_docs_install_dir = share_dir + '/reference/html/' if Options.commands['install']: if os.path.isdir(html_docs_install_dir): - Utils.pprint('CYAN', "Removing old doxygen documentation installation...") + Logs.pprint('CYAN', "Removing old doxygen documentation installation...") shutil.rmtree(html_docs_install_dir) - Utils.pprint('CYAN', "Removing old doxygen documentation installation done.") - Utils.pprint('CYAN', "Installing doxygen documentation...") + Logs.pprint('CYAN', "Removing old doxygen documentation installation done.") + Logs.pprint('CYAN', "Installing doxygen documentation...") shutil.copytree(html_docs_source_dir, html_docs_install_dir) - Utils.pprint('CYAN', "Installing doxygen documentation done.") + Logs.pprint('CYAN', "Installing doxygen documentation done.") elif Options.commands['uninstall']: - Utils.pprint('CYAN', "Uninstalling doxygen documentation...") + Logs.pprint('CYAN', "Uninstalling doxygen documentation...") if os.path.isdir(share_dir): shutil.rmtree(share_dir) - Utils.pprint('CYAN', "Uninstalling doxygen documentation done.") + Logs.pprint('CYAN', "Uninstalling doxygen documentation done.") elif Options.commands['clean']: if os.access(html_docs_source_dir, os.R_OK): - Utils.pprint('CYAN', "Removing doxygen generated documentation...") + Logs.pprint('CYAN', "Removing doxygen generated documentation...") shutil.rmtree(html_docs_source_dir) - Utils.pprint('CYAN', "Removing doxygen generated documentation done.") + Logs.pprint('CYAN', "Removing doxygen generated documentation done.") elif Options.commands['build']: if not os.access(html_docs_source_dir, os.R_OK): os.popen("doxygen").read() else: - Utils.pprint('CYAN', "doxygen documentation already built.") + Logs.pprint('CYAN', "doxygen documentation already built.") def dist_hook(): os.remove('svnversion_regenerate.sh')